From 813898ec73a90f979d2ee7f3b594de87b3d9811e Mon Sep 17 00:00:00 2001 From: qqeasonchen Date: Fri, 7 Aug 2020 16:39:19 +0800 Subject: [PATCH 01/26] update eventmesh discriptions --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3f9392134..fc593f5c17 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh) [![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master) ## What is Event Mesh? -This figure shows the positioning of the event grid relative to other similar technologies (such as service grid) in the application framework +This figure shows the positioning of the event mesh relative to other similar technologies (such as service mesh) in the application framework ![architecture1](docs/images/eventmesh-define.png) Event grid is a dynamic plug-in basic service layer used to distribute events among decoupled applications, cloud services and devices. It enables the communication of events to be supervised and governed, and the communication of events is flexible, reliable and fast. From c5ed6534552137e44572bee822eeeb56e9407e84 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Wed, 12 Aug 2020 17:41:02 +0800 Subject: [PATCH 02/26] fix security leak --- build.gradle | 4 ++-- eventmesh-common/build.gradle | 10 +++++----- eventmesh-emesher/build.gradle | 12 ++++++------ eventmesh-sdk-java/build.gradle | 16 ++++++---------- eventmesh-store/build.gradle | 4 ++-- 5 files changed, 21 insertions(+), 25 deletions(-) diff --git a/build.gradle b/build.gradle index ce030234c6..6850993d8e 100644 --- a/build.gradle +++ b/build.gradle @@ -178,11 +178,11 @@ subprojects { ] List logback = [ - "org.slf4j:slf4j-api:1.7.25" + "org.slf4j:slf4j-api:1.7.30" ] List guava = [ - "com.google.guava:guava:20.0" + "com.google.guava:guava:29.0-jre" ] List fastjson = [ diff --git a/eventmesh-common/build.gradle b/eventmesh-common/build.gradle index 568c6941db..e24499d431 100644 --- a/eventmesh-common/build.gradle +++ b/eventmesh-common/build.gradle @@ -42,13 +42,13 @@ repositories { } List fastjson = [ - "com.alibaba:fastjson:1.2.68" + "com.alibaba:fastjson:1.2.71" ] List jackson = [ - 'com.fasterxml.jackson.core:jackson-databind:2.10.0', - 'com.fasterxml.jackson.core:jackson-core:2.10.0', - 'com.fasterxml.jackson.core:jackson-annotations:2.10.0' + 'com.fasterxml.jackson.core:jackson-databind:2.11.0', + 'com.fasterxml.jackson.core:jackson-core:2.11.0', + 'com.fasterxml.jackson.core:jackson-annotations:2.11.0' ] List apache_commons = [ @@ -65,7 +65,7 @@ List guava = [ ] List netty = [ - "io.netty:netty-all:4.1.44.Final" + "io.netty:netty-all:4.1.49.Final" ] List defibus = [ diff --git a/eventmesh-emesher/build.gradle b/eventmesh-emesher/build.gradle index eaf76e54e2..79c8434fbc 100644 --- a/eventmesh-emesher/build.gradle +++ b/eventmesh-emesher/build.gradle @@ -47,15 +47,15 @@ List junit = [ ] List log4j2 = [ - "org.apache.logging.log4j:log4j-api:2.8.2", - "org.apache.logging.log4j:log4j-core:2.8.2", - "org.apache.logging.log4j:log4j-slf4j-impl:2.8.2", - "org.apache.logging.log4j:log4j-web:2.8.2", - "com.lmax:disruptor:3.2.0" + "org.apache.logging.log4j:log4j-api:2.13.3", + "org.apache.logging.log4j:log4j-core:2.13.3", + "org.apache.logging.log4j:log4j-slf4j-impl:2.13.3", + "org.apache.logging.log4j:log4j-web:2.13.3", + "com.lmax:disruptor:3.4.2" ] List sl4j = [ - "org.slf4j:slf4j-api:1.7.25" + "org.slf4j:slf4j-api:1.7.30" ] List metrics = [ diff --git a/eventmesh-sdk-java/build.gradle b/eventmesh-sdk-java/build.gradle index 36c3164440..ec83be00a1 100644 --- a/eventmesh-sdk-java/build.gradle +++ b/eventmesh-sdk-java/build.gradle @@ -41,20 +41,16 @@ repositories { mavenCentral() } -List proxy_common = [ - "cn.webank.proxy:defibus-proxy-common:$proxy_common_version" -] - List log4j2 = [ - "org.apache.logging.log4j:log4j-api:2.8.2", - "org.apache.logging.log4j:log4j-core:2.8.2", - "org.apache.logging.log4j:log4j-slf4j-impl:2.8.2", - "org.apache.logging.log4j:log4j-web:2.8.2", - "com.lmax:disruptor:3.2.0" + "org.apache.logging.log4j:log4j-api:2.13.3", + "org.apache.logging.log4j:log4j-core:2.13.3", + "org.apache.logging.log4j:log4j-slf4j-impl:2.13.3", + "org.apache.logging.log4j:log4j-web:2.13.3", + "com.lmax:disruptor:3.4.2" ] List sl4j = [ - "org.slf4j:slf4j-api:1.7.25" + "org.slf4j:slf4j-api:1.7.30" ] dependencies { diff --git a/eventmesh-store/build.gradle b/eventmesh-store/build.gradle index 7e77dddb37..c8cba24ed0 100644 --- a/eventmesh-store/build.gradle +++ b/eventmesh-store/build.gradle @@ -178,11 +178,11 @@ subprojects { ] List logback = [ - "org.slf4j:slf4j-api:1.7.25" + "org.slf4j:slf4j-api:1.7.30" ] List guava = [ - "com.google.guava:guava:20.0" + "com.google.guava:guava:29.0-jre" ] List fastjson = [ From 566700c51121bf8c9d6dbe5a7c6602810aefd8fd Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Wed, 12 Aug 2020 20:59:33 +0800 Subject: [PATCH 03/26] delete code about log trace --- .../common/protocol/http/body/Body.java | 3 - .../body/message/RMBTraceLogRequestBody.java | 164 ------------- .../body/message/RMBTraceLogResponseBody.java | 86 ------- .../protocol/http/common/RequestCode.java | 2 - .../common/protocol/http/header/Header.java | 3 - .../message/RMBTraceLogRequestHeader.java | 220 ------------------ .../message/RMBTraceLogResponseHeader.java | 147 ------------ .../webank/emesher/boot/ProxyHTTPServer.java | 11 - 8 files changed, 636 deletions(-) delete mode 100644 eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/RMBTraceLogRequestBody.java delete mode 100644 eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/RMBTraceLogResponseBody.java delete mode 100644 eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/RMBTraceLogRequestHeader.java delete mode 100644 eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/RMBTraceLogResponseHeader.java diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/Body.java b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/Body.java index dad0c74ed7..e03c078044 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/Body.java +++ b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/Body.java @@ -23,7 +23,6 @@ import cn.webank.eventmesh.common.protocol.http.common.RequestCode; import cn.webank.eventmesh.common.protocol.http.body.client.RegRequestBody; import cn.webank.eventmesh.common.protocol.http.body.message.PushMessageRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.RMBTraceLogRequestBody; import cn.webank.eventmesh.common.protocol.http.body.message.ReplyMessageRequestBody; import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchRequestBody; import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchV2RequestBody; @@ -58,8 +57,6 @@ public static Body buildBody(String requestCode, Map originalMap return ReplyMessageRequestBody.buildBody(originalMap); } else if (String.valueOf(RequestCode.ADMIN_SHUTDOWN.getRequestCode()).equals(requestCode)) { return BaseRequestBody.buildBody(originalMap); - } else if (String.valueOf(RequestCode.MSG_TRACE_LOG.getRequestCode()).equals(requestCode)) { - return RMBTraceLogRequestBody.buildBody(originalMap); } else { throw new Exception(); } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/RMBTraceLogRequestBody.java b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/RMBTraceLogRequestBody.java deleted file mode 100644 index cb6b890614..0000000000 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/RMBTraceLogRequestBody.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.eventmesh.common.protocol.http.body.message; - -import cn.webank.eventmesh.common.protocol.http.body.Body; -import com.alibaba.fastjson.JSONObject; -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; - -import java.util.HashMap; -import java.util.Map; - -public class RMBTraceLogRequestBody extends Body { - - /////////////////////////////////RMB-TRACE//////////////////////////// - public static final String LOG_LEVEL = "level"; - public static final String LOG_POINT = "logPoint"; - public static final String LOG_MESSAGE = "message"; - public static final String LOG_MODEL = "model"; - public static final String LOG_RETCODE = "retCode"; - public static final String LOG_RETMSG = "retMsg"; - public static final String LOG_LANG = "lang"; - public static final String LOG_EXTFIELDS = "extFields"; - - private String level; - - private String logPoint; - - private String message; - - private String model; - - private String retCode; - - private String retMsg; - - private String lang; - - private HashMap extFields = new HashMap(); - - public String getLevel() { - return level; - } - - public void setLevel(String level) { - this.level = level; - } - - public String getLogPoint() { - return logPoint; - } - - public void setLogPoint(String logPoint) { - this.logPoint = logPoint; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public String getRetCode() { - return retCode; - } - - public void setRetCode(String retCode) { - this.retCode = retCode; - } - - public String getRetMsg() { - return retMsg; - } - - public void setRetMsg(String retMsg) { - this.retMsg = retMsg; - } - - public String getLang() { - return lang; - } - - public void setLang(String lang) { - this.lang = lang; - } - - public HashMap getExtFields() { - return extFields; - } - - public void setExtFields(HashMap extFields) { - this.extFields = extFields; - } - - public static RMBTraceLogRequestBody buildBody(Map bodyParam) { - RMBTraceLogRequestBody body = new RMBTraceLogRequestBody(); - body.setLang(MapUtils.getString(bodyParam, LOG_LANG)); - body.setLevel(MapUtils.getString(bodyParam, LOG_LEVEL)); - body.setLogPoint(MapUtils.getString(bodyParam, LOG_POINT)); - body.setMessage(MapUtils.getString(bodyParam, LOG_MESSAGE)); - body.setModel(MapUtils.getString(bodyParam, LOG_MODEL)); - body.setRetCode(MapUtils.getString(bodyParam, LOG_RETCODE)); - body.setRetMsg(MapUtils.getString(bodyParam, LOG_RETMSG)); - String extFields = MapUtils.getString(bodyParam, LOG_EXTFIELDS); - if (StringUtils.isNotBlank(extFields)) { - body.setExtFields(JSONObject.parseObject(extFields, HashMap.class)); - } - return body; - } - - @Override - public Map toMap() { - Map map = new HashMap(); - map.put(LOG_EXTFIELDS, extFields); - map.put(LOG_LANG, lang); - map.put(LOG_LEVEL, level); - map.put(LOG_MESSAGE, message); - map.put(LOG_RETMSG, retMsg); - map.put(LOG_MODEL, model); - map.put(LOG_POINT, logPoint); - map.put(LOG_RETCODE, retCode); - return map; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("RMBTraceLogRequestBody={") - .append("level=").append(level).append(",") - .append("logPoint=").append(logPoint).append(",") - .append("message=").append(message).append(",") - .append("model=").append(model).append(",") - .append("retCode=").append(retCode).append(",") - .append("retMsg=").append(retMsg).append(",") - .append("lang=").append(lang).append(",") - .append("extFields=").append(extFields).append("}"); - return sb.toString(); - } -} diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/RMBTraceLogResponseBody.java b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/RMBTraceLogResponseBody.java deleted file mode 100644 index 64c4696114..0000000000 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/RMBTraceLogResponseBody.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.eventmesh.common.protocol.http.body.message; - -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.Body; -import org.apache.commons.lang3.time.DateFormatUtils; - -import java.util.HashMap; -import java.util.Map; - -public class RMBTraceLogResponseBody extends Body { - - private Integer retCode; - - private String retMsg; - - private long resTime = System.currentTimeMillis(); - - public Integer getRetCode() { - return retCode; - } - - public void setRetCode(Integer retCode) { - this.retCode = retCode; - } - - public String getRetMsg() { - return retMsg; - } - - public void setRetMsg(String retMsg) { - this.retMsg = retMsg; - } - - public long getResTime() { - return resTime; - } - - public void setResTime(long resTime) { - this.resTime = resTime; - } - - public static RMBTraceLogResponseBody buildBody(Integer retCode, String retMsg) { - RMBTraceLogResponseBody rmbTraceLogResponseBody = new RMBTraceLogResponseBody(); - rmbTraceLogResponseBody.setRetMsg(retMsg); - rmbTraceLogResponseBody.setResTime(System.currentTimeMillis()); - rmbTraceLogResponseBody.setRetCode(retCode); - return rmbTraceLogResponseBody; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("rmbTraceLogResponseBody={") - .append("retCode=").append(retCode).append(",") - .append("retMsg=").append(retMsg).append(",") - .append("resTime=").append(DateFormatUtils.format(resTime, Constants.DATE_FORMAT)).append("}"); - return sb.toString(); - } - - @Override - public Map toMap() { - Map map = new HashMap<>(); - map.put(ProtocolKey.RETCODE, retCode); - map.put(ProtocolKey.RETMSG, retMsg); - map.put(ProtocolKey.RESTIME, resTime); - return map; - } -} diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/RequestCode.java b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/RequestCode.java index aab26ea407..e65369f452 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/RequestCode.java +++ b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/RequestCode.java @@ -27,8 +27,6 @@ public enum RequestCode { MSG_SEND_ASYNC(104, "单条发送异步消息"), - MSG_TRACE_LOG(103, "日志上报"), - HTTP_PUSH_CLIENT_ASYNC(105, "PUSH CLIENT BY HTTP POST"), HTTP_PUSH_CLIENT_SYNC(106, "PUSH CLIENT BY HTTP POST"), diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/Header.java b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/Header.java index 44c4ba725f..33edb5e05f 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/Header.java +++ b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/Header.java @@ -25,7 +25,6 @@ import cn.webank.eventmesh.common.protocol.http.header.message.PushMessageRequestHeader; import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchV2RequestHeader; import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.RMBTraceLogRequestHeader; import cn.webank.eventmesh.common.protocol.http.header.message.ReplyMessageRequestHeader; import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchRequestHeader; @@ -58,8 +57,6 @@ public static Header buildHeader(String requestCode, Map origina return ReplyMessageRequestHeader.buildHeader(originalMap); } else if (String.valueOf(RequestCode.ADMIN_SHUTDOWN.getRequestCode()).equals(requestCode)) { return BaseRequestHeader.buildHeader(originalMap); - } else if(String.valueOf(RequestCode.MSG_TRACE_LOG.getRequestCode()).equals(requestCode)) { - return RMBTraceLogRequestHeader.buildHeader(originalMap); } else { throw new Exception(); } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/RMBTraceLogRequestHeader.java b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/RMBTraceLogRequestHeader.java deleted file mode 100644 index 17431a422e..0000000000 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/RMBTraceLogRequestHeader.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.eventmesh.common.protocol.http.header.message; - - -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; - -import java.util.HashMap; -import java.util.Map; - -public class RMBTraceLogRequestHeader extends Header { - - //请求码 - private String code; - - //请求方语言描述 - private String language; - - //请求方采用的协议版本, 默认1.0 - private ProtocolVersion version; - - //请求方所在环境编号 - private String env; - - //请求方所在区域编码 - private String region; - - //请求方所在IDC - private String idc; - - //请求方所在DCN - private String dcn; - - //请求方的子系统 - private String sys; - - //请求方的进程号 - private String pid; - - //请求方的IP - private String ip; - - //请求方的USERNAME - private String username = "username"; - - //请求方的PASSWD - private String passwd = "user@123"; - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getLanguage() { - return language; - } - - public void setLanguage(String language) { - this.language = language; - } - - public ProtocolVersion getVersion() { - return version; - } - - public void setVersion(ProtocolVersion version) { - this.version = version; - } - - public String getEnv() { - return env; - } - - public void setEnv(String env) { - this.env = env; - } - - public String getRegion() { - return region; - } - - public void setRegion(String region) { - this.region = region; - } - - public String getIdc() { - return idc; - } - - public void setIdc(String idc) { - this.idc = idc; - } - - public String getDcn() { - return dcn; - } - - public void setDcn(String dcn) { - this.dcn = dcn; - } - - public String getSys() { - return sys; - } - - public void setSys(String sys) { - this.sys = sys; - } - - public String getPid() { - return pid; - } - - public void setPid(String pid) { - this.pid = pid; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPasswd() { - return passwd; - } - - public void setPasswd(String passwd) { - this.passwd = passwd; - } - - @Override - public Map toMap() { - Map map = new HashMap(); - map.put(ProtocolKey.REQUEST_CODE, code); - map.put(ProtocolKey.LANGUAGE, language); - map.put(ProtocolKey.VERSION, version); - map.put(ProtocolKey.ClientInstanceKey.ENV, env); - map.put(ProtocolKey.ClientInstanceKey.REGION, region); - map.put(ProtocolKey.ClientInstanceKey.IDC, idc); - map.put(ProtocolKey.ClientInstanceKey.DCN, dcn); - map.put(ProtocolKey.ClientInstanceKey.SYS, sys); - map.put(ProtocolKey.ClientInstanceKey.PID, pid); - map.put(ProtocolKey.ClientInstanceKey.IP, ip); - map.put(ProtocolKey.ClientInstanceKey.USERNAME, username); - map.put(ProtocolKey.ClientInstanceKey.PASSWD, passwd); - return map; - } - - public static RMBTraceLogRequestHeader buildHeader(Map headerParam) { - RMBTraceLogRequestHeader header = new RMBTraceLogRequestHeader(); - header.setCode(MapUtils.getString(headerParam, ProtocolKey.REQUEST_CODE)); - header.setVersion(ProtocolVersion.get(MapUtils.getString(headerParam, ProtocolKey.VERSION))); - String lan = StringUtils.isBlank(MapUtils.getString(headerParam, ProtocolKey.LANGUAGE)) - ? Constants.LANGUAGE_JAVA : MapUtils.getString(headerParam, ProtocolKey.LANGUAGE); - header.setLanguage(lan); - header.setEnv(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.ENV)); - header.setRegion(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.REGION)); - header.setIdc(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IDC)); - header.setDcn(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.DCN)); - header.setSys(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.SYS)); - header.setPid(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PID)); - header.setIp(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.IP)); - header.setUsername(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.USERNAME)); - header.setPasswd(MapUtils.getString(headerParam, ProtocolKey.ClientInstanceKey.PASSWD)); - return header; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("RMBTraceLogRequestHeader={") - .append("code=").append(code).append(",") - .append("language=").append(language).append(",") - .append("version=").append(version).append(",") - .append("env=").append(env).append(",") - .append("region=").append(region).append(",") - .append("idc=").append(idc).append(",") - .append("dcn=").append(dcn).append(",") - .append("sys=").append(sys).append(",") - .append("pid=").append(pid).append(",") - .append("ip=").append(ip).append(",") - .append("username=").append(username).append(",") - .append("passwd=").append(passwd).append("}"); - return sb.toString(); - } -} diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/RMBTraceLogResponseHeader.java b/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/RMBTraceLogResponseHeader.java deleted file mode 100644 index 2904c792a8..0000000000 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/RMBTraceLogResponseHeader.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.eventmesh.common.protocol.http.header.message; - - -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.header.Header; - -import java.util.HashMap; -import java.util.Map; - -public class RMBTraceLogResponseHeader extends Header { - - //响应码, 与对应Request的code一致 - private int code; - - //处理该次Request请求的proxy的集群名 - private String proxyCluster; - - //处理该次Request请求的proxy的IP - private String proxyIp; - - //处理该次Request请求的proxy所在的环境编号 - private String proxyEnv; - - //处理该次Request请求的proxy所在区域 - private String proxyRegion; - - //处理该次Request请求的proxy所在IDC - private String proxyIdc; - - //处理该次Request请求的proxy所在DCN - private String proxyDcn; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getProxyCluster() { - return proxyCluster; - } - - public void setProxyCluster(String proxyCluster) { - this.proxyCluster = proxyCluster; - } - - public String getProxyIp() { - return proxyIp; - } - - public void setProxyIp(String proxyIp) { - this.proxyIp = proxyIp; - } - - public String getProxyEnv() { - return proxyEnv; - } - - public void setProxyEnv(String proxyEnv) { - this.proxyEnv = proxyEnv; - } - - public String getProxyRegion() { - return proxyRegion; - } - - public void setProxyRegion(String proxyRegion) { - this.proxyRegion = proxyRegion; - } - - public String getProxyIdc() { - return proxyIdc; - } - - public void setProxyIdc(String proxyIdc) { - this.proxyIdc = proxyIdc; - } - - public String getProxyDcn() { - return proxyDcn; - } - - public void setProxyDcn(String proxyDcn) { - this.proxyDcn = proxyDcn; - } - - @Override - public Map toMap() { - Map map = new HashMap(); - map.put(ProtocolKey.REQUEST_CODE, code); - map.put(ProtocolKey.ProxyInstanceKey.PROXYCLUSTER, proxyCluster); - map.put(ProtocolKey.ProxyInstanceKey.PROXYIP, proxyIp); - map.put(ProtocolKey.ProxyInstanceKey.PROXYENV, proxyEnv); - map.put(ProtocolKey.ProxyInstanceKey.PROXYREGION, proxyRegion); - map.put(ProtocolKey.ProxyInstanceKey.PROXYIDC, proxyIdc); - map.put(ProtocolKey.ProxyInstanceKey.PROXYDCN, proxyDcn); - return map; - } - - public static RMBTraceLogResponseHeader buildHeader(Integer requestCode, String proxyCluster, - String proxyIp, String proxyEnv, String proxyRegion, - String proxyDcn, String proxyIDC) { - RMBTraceLogResponseHeader rmbTraceLogResponseHeader = new RMBTraceLogResponseHeader(); - rmbTraceLogResponseHeader.setCode(requestCode); - rmbTraceLogResponseHeader.setProxyCluster(proxyCluster); - rmbTraceLogResponseHeader.setProxyDcn(proxyDcn); - rmbTraceLogResponseHeader.setProxyIp(proxyIp); - rmbTraceLogResponseHeader.setProxyEnv(proxyEnv); - rmbTraceLogResponseHeader.setProxyRegion(proxyRegion); - rmbTraceLogResponseHeader.setProxyIdc(proxyIDC); - return rmbTraceLogResponseHeader; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("rmbTraceLogResponseHeader={") - .append("code=").append(code).append(",") - .append("proxyEnv=").append(proxyEnv).append(",") - .append("proxyRegion=").append(proxyRegion).append(",") - .append("proxyIdc=").append(proxyIdc).append(",") - .append("proxyDcn=").append(proxyDcn).append(",") - .append("proxyCluster=").append(proxyCluster).append(",") - .append("proxyIp=").append(proxyIp).append("}"); - return sb.toString(); - } - -} diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyHTTPServer.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyHTTPServer.java index 49e9e4b702..f3d3a5aaaa 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyHTTPServer.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyHTTPServer.java @@ -77,13 +77,10 @@ public ProxyServer getProxyServer() { public ThreadPoolExecutor clientManageExecutor; - public ThreadPoolExecutor rmbTraceUploader; - public ThreadPoolExecutor adminExecutor; public void shutdownThreadPool() throws Exception { batchMsgExecutor.shutdown(); - rmbTraceUploader.shutdown(); adminExecutor.shutdown(); clientManageExecutor.shutdown(); sendMsgExecutor.shutdown(); @@ -113,10 +110,6 @@ public void initThreadPool() throws Exception { adminExecutor = ThreadPoolFactory.createThreadPoolExecutor(proxyConfiguration.proxyServerAdminThreadNum, proxyConfiguration.proxyServerAdminThreadNum, adminThreadPoolQueue, "proxy-admin-",true); - BlockingQueue rmbTraceLogThreadPoolQueue = new LinkedBlockingQueue(50); - rmbTraceUploader = ThreadPoolFactory.createThreadPoolExecutor(proxyConfiguration.proxyServerAdminThreadNum, - proxyConfiguration.proxyServerAdminThreadNum, rmbTraceLogThreadPoolQueue, "proxy-tracelog-",true); - BlockingQueue replyMessageThreadPoolQueue = new LinkedBlockingQueue(100); replyMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(proxyConfiguration.proxyServerReplyMsgThreadNum, proxyConfiguration.proxyServerReplyMsgThreadNum, replyMessageThreadPoolQueue, "proxy-replymsg-",true); @@ -249,8 +242,4 @@ public EventBus getEventBus() { public HttpRetryer getHttpRetryer() { return httpRetryer; } - - public ThreadPoolExecutor getRmbTraceUploader() { - return rmbTraceUploader; - } } From 8743cb23cc8809a763d0a5a797c7b2193e6e2548 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Mon, 17 Aug 2020 20:53:34 +0800 Subject: [PATCH 04/26] abandon empty project --- README.md | 8 +- .../eventmesh-emesher-quickstart.md | 3 +- .../eventmesh-store-quickstart.md | 47 -- docs/en/instructions/quickstart.md | 39 +- eventmesh-acl/build.gradle | 14 - eventmesh-governance/build.gradle | 14 - eventmesh-store/build.gradle | 314 ------------ eventmesh-store/conf/broker.properties | 25 - eventmesh-store/conf/logback_broker.xml | 353 -------------- eventmesh-store/conf/logback_filtersrv.xml | 98 ---- eventmesh-store/conf/logback_namesrv.xml | 122 ----- eventmesh-store/conf/logback_tools.xml | 104 ---- eventmesh-store/conf/namesrv.properties | 17 - eventmesh-store/defibus-broker/.gitignore | 21 - eventmesh-store/defibus-broker/build.gradle | 30 -- .../defibus-broker/conf/checkstyle.xml | 329 ------------- .../defibus/broker/DeFiBrokerController.java | 324 ------------- .../broker/DeFiBrokerPathConfigHelper.java | 42 -- .../defibus/broker/DeFiBusBrokerStartup.java | 257 ---------- .../broker/client/AdjustQueueNumStrategy.java | 346 ------------- .../broker/client/DeFiConsumerGroupInfo.java | 142 ------ .../broker/client/DeFiConsumerManager.java | 198 -------- .../broker/client/DeFiProducerManager.java | 103 ---- .../ClientRebalanceResultManager.java | 66 --- .../consumequeue/ConsumeQueueManager.java | 382 --------------- .../consumequeue/ConsumeQueueWaterMark.java | 115 ----- .../consumequeue/MessageRedirectManager.java | 233 --------- .../broker/monitor/QueueListeningMonitor.java | 196 -------- .../broker/net/DeFiBusBroker2Client.java | 75 --- .../broker/plugin/DeFiPluginMessageStore.java | 106 ---- .../broker/plugin/PluginStoreStatService.java | 136 ------ .../processor/DeFiAdminBrokerProcessor.java | 284 ----------- .../processor/DeFiClientManageProcessor.java | 116 ----- .../processor/DeFiPullMessageProcessor.java | 86 ---- .../processor/DeFiReplyMessageProcessor.java | 432 ----------------- .../processor/DeFiSendMessageProcessor.java | 153 ------ .../broker/topic/DeFiTopicConfigManager.java | 229 --------- .../webank/defibus/broker/BrokerFuseTest.java | 178 ------- .../broker/DeFiBrokerControllerTest.java | 50 -- .../broker/DeFiBusBrokerStartupTest.java | 41 -- .../client/AdjustQueueNumStrategyTest.java | 64 --- .../client/DeFiConsumerManagerTest.java | 105 ---- .../client/DeFiProducerManagerTest.java | 91 ---- .../consumequeue/ConsumeQueueManagerTest.java | 118 ----- .../MessageRedirectManagerTest.java | 79 --- .../monitor/QueueListeningMonitorTest.java | 69 --- .../plugin/DeFiPluginMessageStoreTest.java | 81 ---- .../plugin/PluginStoreStatServiceTest.java | 44 -- .../DeFiAdminBrokerProcessorTest.java | 155 ------ .../DeFiClientManageProcessorTest.java | 151 ------ .../DeFiPullMessageProcessorTest.java | 129 ----- .../DeFiReplyMessageProcessorTest.java | 138 ------ .../DeFiSendMessageProcessorTest.java | 131 ----- eventmesh-store/defibus-client/.gitignore | 22 - eventmesh-store/defibus-client/build.gradle | 27 -- .../defibus-client/conf/checkstyle.xml | 329 ------------- .../defibus/client/DeFiBusClientManager.java | 73 --- .../client/common/DeFiBusClientConfig.java | 315 ------------ .../client/common/DeFiBusClientUtil.java | 52 -- .../client/impl/DeFiBusClientAPIImpl.java | 341 ------------- .../impl/DeFiBusClientRemotingProcessor.java | 153 ------ .../consumer/DeFiBusPullMessageService.java | 165 ------- .../impl/factory/DeFiBusClientInstance.java | 184 ------- .../impl/hook/DeFiBusClientHookFactory.java | 42 -- .../impl/producer/DeFiBusProducerImpl.java | 456 ------------------ .../producer/HealthyMessageQueueSelector.java | 220 --------- .../producer/MessageQueueHealthManager.java | 62 --- .../client/impl/producer/RRCallback.java | 26 - .../impl/producer/RRResponseFuture.java | 66 --- .../client/impl/producer/ResponseTable.java | 28 -- .../rebalance/AllocateMessageQueueByIDC.java | 208 -------- .../DeFiBusMessageListenerConcurrently.java | 88 ---- ...eFiBusMessageListenerConcurrentlyOnce.java | 87 ---- ...sMessageListenerConcurrentlyWithReply.java | 105 ---- .../defibus/consumer/DeFiBusPushConsumer.java | 201 -------- .../defibus/producer/DeFiBusProducer.java | 198 -------- .../client/common/DeFiBusCLientUtilTest.java | 56 --- ...usMessageListenerConcurrentlyOnceTest.java | 220 --------- ...eFiBusMessageListenerConcurrentlyTest.java | 215 --------- .../consumer/DeFiBusPushConsumerTest.java | 39 -- .../client/impl/DeFiBusClientAPIImplTest.java | 197 -------- .../client/impl/DeFiBusClientManagerTest.java | 43 -- .../DeFiBusPullMessageServiceTest.java | 21 - .../factory/DeFiBusClientInstanceTest.java | 103 ---- .../hook/DeFiBusClientHookFactoryTest.java | 52 -- .../MessageQueueHealthManagerTest.java | 50 -- .../impl/producer/RRResponseFutureTest.java | 98 ---- .../AllocateMessageQueueByIDCTest.java | 209 -------- .../client/producer/ClientFuseTest.java | 173 ------- .../client/producer/DeFiBusProducerTest.java | 302 ------------ .../HealthyMessageQueueSelectorTest.java | 261 ---------- .../src/test/resources/log4j.xml | 66 --- eventmesh-store/defibus-common/.gitignore | 22 - eventmesh-store/defibus-common/build.gradle | 21 - .../defibus-common/conf/checkstyle.xml | 329 ------------- .../defibus/common/DeFiBusBrokerConfig.java | 178 ------- .../defibus/common/DeFiBusConstant.java | 66 --- .../defibus/common/DeFiBusErrorCode.java | 22 - .../webank/defibus/common/DeFiBusVersion.java | 97 ---- .../common/admin/DeFiBusConsumeStats.java | 58 --- .../common/admin/DeFiBusOffsetWrapper.java | 32 -- .../common/exception/DeFiBusException.java | 52 -- .../exception/DeFiBusRuntimeException.java | 28 -- .../common/message/DeFiBusMessageConst.java | 23 - .../common/protocol/DeFiBusRequestCode.java | 27 -- .../common/protocol/DeFiBusResponseCode.java | 23 - .../common/protocol/DeFiBusTopicConfig.java | 110 ----- .../DeFiBusTopicConfigSerializeWrapper.java | 45 -- ...nsumerListByGroupAndTopicResponseBody.java | 33 -- ...sumerListByGroupAndTopicRequestHeader.java | 50 -- ...umerListByGroupAndTopicResponseHeader.java | 29 -- .../NotifyTopicChangedRequestHeader.java | 40 -- .../header/ReplyMessageRequestHeader.java | 172 ------- .../common/util/DeFiBusRequestIDUtil.java | 33 -- .../defibus/common/util/ReflectUtil.java | 126 ----- .../common/DeFiBusBrokerConfigTest.java | 37 -- .../common/admin/DeFiBusConsumeStatsTest.java | 53 -- .../protocol/DeFiBusTopicConfigTest.java | 43 -- .../common/util/DeFiBusRequestIDUtilTest.java | 39 -- .../src/test/resources/logback.xml | 48 -- eventmesh-store/defibus-examples/build.gradle | 30 -- .../defibus-examples/conf/checkstyle.xml | 329 ------------- .../defibus/examples/rpc/RequestProducer.java | 66 --- .../examples/rpc/ResponseConsumer.java | 96 ---- .../rpc/ResponseConsumerAutoReply.java | 71 --- .../defibus/examples/simple/PubProducer.java | 51 -- .../defibus/examples/simple/SubConsumer.java | 73 --- .../src/main/resources/log4j.xml | 66 --- eventmesh-store/defibus-namesrv/.gitignore | 22 - eventmesh-store/defibus-namesrv/build.gradle | 30 -- .../defibus-namesrv/conf/checkstyle.xml | 329 ------------- .../namesrv/DeFiBusNamesrvStartup.java | 40 -- eventmesh-store/defibus-tools/.gitignore | 21 - eventmesh-store/defibus-tools/build.gradle | 32 -- .../defibus-tools/conf/checkstyle.xml | 329 ------------- .../defibus/tools/admin/DeFiBusAdminExt.java | 27 -- .../tools/command/DeFiBusAdminStartup.java | 241 --------- .../topic/UpdateTopicPermSubCommand.java | 207 -------- eventmesh-store/gradle.properties | 24 - eventmesh-store/releasenotes.txt | 9 - eventmesh-store/script/broker_watchdog.sh | 32 -- eventmesh-store/script/namesrv_watchdog.sh | 25 - eventmesh-store/script/runadmin.cmd | 32 -- eventmesh-store/script/runadmin.sh | 112 ----- eventmesh-store/script/runbroker.cmd | 37 -- eventmesh-store/script/runbroker.sh | 106 ---- eventmesh-store/script/runbroker_cloud.sh | 105 ---- eventmesh-store/script/runnamesrv.cmd | 37 -- eventmesh-store/script/runnamesrv.sh | 87 ---- eventmesh-store/script/stop.cmd | 35 -- eventmesh-store/script/stop.sh | 67 --- eventmesh-store/settings.gradle | 26 - settings.gradle | 3 - 153 files changed, 7 insertions(+), 17362 deletions(-) delete mode 100644 docs/en/instructions/eventmesh-store-quickstart.md delete mode 100644 eventmesh-acl/build.gradle delete mode 100644 eventmesh-governance/build.gradle delete mode 100644 eventmesh-store/build.gradle delete mode 100644 eventmesh-store/conf/broker.properties delete mode 100644 eventmesh-store/conf/logback_broker.xml delete mode 100644 eventmesh-store/conf/logback_filtersrv.xml delete mode 100644 eventmesh-store/conf/logback_namesrv.xml delete mode 100644 eventmesh-store/conf/logback_tools.xml delete mode 100644 eventmesh-store/conf/namesrv.properties delete mode 100644 eventmesh-store/defibus-broker/.gitignore delete mode 100644 eventmesh-store/defibus-broker/build.gradle delete mode 100644 eventmesh-store/defibus-broker/conf/checkstyle.xml delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBrokerController.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBrokerPathConfigHelper.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBusBrokerStartup.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/AdjustQueueNumStrategy.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiConsumerGroupInfo.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiConsumerManager.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiProducerManager.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ClientRebalanceResultManager.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueManager.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueWaterMark.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/MessageRedirectManager.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/monitor/QueueListeningMonitor.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/net/DeFiBusBroker2Client.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/plugin/DeFiPluginMessageStore.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/plugin/PluginStoreStatService.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiAdminBrokerProcessor.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiClientManageProcessor.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiPullMessageProcessor.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiReplyMessageProcessor.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiSendMessageProcessor.java delete mode 100644 eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/topic/DeFiTopicConfigManager.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/BrokerFuseTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/DeFiBrokerControllerTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/DeFiBusBrokerStartupTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/AdjustQueueNumStrategyTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/DeFiConsumerManagerTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/DeFiProducerManagerTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueManagerTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/consumequeue/MessageRedirectManagerTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/monitor/QueueListeningMonitorTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/plugin/DeFiPluginMessageStoreTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/plugin/PluginStoreStatServiceTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiAdminBrokerProcessorTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiClientManageProcessorTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiPullMessageProcessorTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiReplyMessageProcessorTest.java delete mode 100644 eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiSendMessageProcessorTest.java delete mode 100644 eventmesh-store/defibus-client/.gitignore delete mode 100644 eventmesh-store/defibus-client/build.gradle delete mode 100644 eventmesh-store/defibus-client/conf/checkstyle.xml delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/DeFiBusClientManager.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/common/DeFiBusClientConfig.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/common/DeFiBusClientUtil.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/DeFiBusClientAPIImpl.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/DeFiBusClientRemotingProcessor.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/consumer/DeFiBusPullMessageService.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstance.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/hook/DeFiBusClientHookFactory.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/DeFiBusProducerImpl.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/HealthyMessageQueueSelector.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/MessageQueueHealthManager.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/RRCallback.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/RRResponseFuture.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/ResponseTable.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/rebalance/AllocateMessageQueueByIDC.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrently.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrentlyOnce.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrentlyWithReply.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusPushConsumer.java delete mode 100644 eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/producer/DeFiBusProducer.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/common/DeFiBusCLientUtilTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusMessageListenerConcurrentlyOnceTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusMessageListenerConcurrentlyTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusPushConsumerTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/DeFiBusClientAPIImplTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/DeFiBusClientManagerTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/consumer/DeFiBusPullMessageServiceTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstanceTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/hook/DeFiBusClientHookFactoryTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/producer/MessageQueueHealthManagerTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/producer/RRResponseFutureTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/rebalance/AllocateMessageQueueByIDCTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/ClientFuseTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/DeFiBusProducerTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/HealthyMessageQueueSelectorTest.java delete mode 100644 eventmesh-store/defibus-client/src/test/resources/log4j.xml delete mode 100644 eventmesh-store/defibus-common/.gitignore delete mode 100644 eventmesh-store/defibus-common/build.gradle delete mode 100644 eventmesh-store/defibus-common/conf/checkstyle.xml delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusBrokerConfig.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusConstant.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusErrorCode.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusVersion.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/admin/DeFiBusConsumeStats.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/admin/DeFiBusOffsetWrapper.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/exception/DeFiBusException.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/exception/DeFiBusRuntimeException.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/message/DeFiBusMessageConst.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusRequestCode.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusResponseCode.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusTopicConfig.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/body/DeFiBusTopicConfigSerializeWrapper.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/body/GetConsumerListByGroupAndTopicResponseBody.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/GetConsumerListByGroupAndTopicRequestHeader.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/GetConsumerListByGroupAndTopicResponseHeader.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/NotifyTopicChangedRequestHeader.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/ReplyMessageRequestHeader.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/util/DeFiBusRequestIDUtil.java delete mode 100644 eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/util/ReflectUtil.java delete mode 100644 eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/DeFiBusBrokerConfigTest.java delete mode 100644 eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/admin/DeFiBusConsumeStatsTest.java delete mode 100644 eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/protocol/DeFiBusTopicConfigTest.java delete mode 100644 eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/util/DeFiBusRequestIDUtilTest.java delete mode 100644 eventmesh-store/defibus-common/src/test/resources/logback.xml delete mode 100644 eventmesh-store/defibus-examples/build.gradle delete mode 100644 eventmesh-store/defibus-examples/conf/checkstyle.xml delete mode 100644 eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/RequestProducer.java delete mode 100644 eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/ResponseConsumer.java delete mode 100644 eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/ResponseConsumerAutoReply.java delete mode 100644 eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/simple/PubProducer.java delete mode 100644 eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/simple/SubConsumer.java delete mode 100644 eventmesh-store/defibus-examples/src/main/resources/log4j.xml delete mode 100644 eventmesh-store/defibus-namesrv/.gitignore delete mode 100644 eventmesh-store/defibus-namesrv/build.gradle delete mode 100644 eventmesh-store/defibus-namesrv/conf/checkstyle.xml delete mode 100644 eventmesh-store/defibus-namesrv/src/main/java/cn/webank/defibus/namesrv/DeFiBusNamesrvStartup.java delete mode 100644 eventmesh-store/defibus-tools/.gitignore delete mode 100644 eventmesh-store/defibus-tools/build.gradle delete mode 100644 eventmesh-store/defibus-tools/conf/checkstyle.xml delete mode 100644 eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/admin/DeFiBusAdminExt.java delete mode 100644 eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/command/DeFiBusAdminStartup.java delete mode 100644 eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/command/topic/UpdateTopicPermSubCommand.java delete mode 100644 eventmesh-store/gradle.properties delete mode 100644 eventmesh-store/releasenotes.txt delete mode 100644 eventmesh-store/script/broker_watchdog.sh delete mode 100644 eventmesh-store/script/namesrv_watchdog.sh delete mode 100644 eventmesh-store/script/runadmin.cmd delete mode 100644 eventmesh-store/script/runadmin.sh delete mode 100644 eventmesh-store/script/runbroker.cmd delete mode 100644 eventmesh-store/script/runbroker.sh delete mode 100644 eventmesh-store/script/runbroker_cloud.sh delete mode 100644 eventmesh-store/script/runnamesrv.cmd delete mode 100644 eventmesh-store/script/runnamesrv.sh delete mode 100644 eventmesh-store/script/stop.cmd delete mode 100644 eventmesh-store/script/stop.sh delete mode 100644 eventmesh-store/settings.gradle diff --git a/README.md b/README.md index 1d2de7a5e7..61bda75926 100644 --- a/README.md +++ b/README.md @@ -22,14 +22,10 @@ Key components: * eventmesh-emesher : an middleware to transmit events between event producers and consumers, support cloud native apps and microservices * eventmesh-sdk-java : support for popular open standard protocols and APIs, including REST/HTTP, AMQP, MQTT, Websocket and JMS, gRPC etc. * eventmesh-registry : automatically routes events between applications and services connected to seperate event meshers -* eventmesh-governance : governace layer for event producers and consumers -* eventmesh-acl : security at various level of authentication, authorization and topic/channel access control -* eventmesh-store : the store layer of Event-Mesh which implemented with [DeFiBus](https://github.com/WeBankFinTech/DeFiBus)(based on RocketMQ in financial scenario) or RocketMQ by default. We wish the store layeris a general solution and can use any store implement such as kafka, redis ,blockchain etc. ## Quick Start -1. Build and deploy eventmesh-store, see instruction ['eventmesh-store quickstart'](docs/en/instructions/eventmesh-store-quickstart.md) . -2. Build and deploy eventmesh-emesher, see instruction ['eventmesh-emesher quickstart'](docs/en/instructions/eventmesh-emesher-quickstart.md). -3. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](docs/en/instructions/eventmesh-sdk-java-quickstart.md). +1. Build and deploy eventmesh-emesher, see instruction ['eventmesh-emesher quickstart'](docs/en/instructions/eventmesh-emesher-quickstart.md). +2. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](docs/en/instructions/eventmesh-sdk-java-quickstart.md). ## Contributing Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines. diff --git a/docs/en/instructions/eventmesh-emesher-quickstart.md b/docs/en/instructions/eventmesh-emesher-quickstart.md index 93da4f1b09..0e1ea2fc9c 100644 --- a/docs/en/instructions/eventmesh-emesher-quickstart.md +++ b/docs/en/instructions/eventmesh-emesher-quickstart.md @@ -5,7 +5,6 @@ 64bit OS, Linux/Unix is recommended; 64bit JDK 1.8+; Gradle at least 5.6; -4g+ free disk for eventmesh-store server ``` ### download and build with sources @@ -25,7 +24,7 @@ You will get **eventmesh-emesher_1.0.0.tar.gz** in directory /* YOUR DEPLOY PATH ### Deployment - deploy eventmesn-emesher -**NOTICE**: To setup an emesher, you need to deploy eventmesh-store firstly. +**NOTICE**: To setup an emesher, you need to deploy firstly. ```$xslt upload eventmesh-emesher_1.0.0.tar.gz tar -zxvf eventmesh-emesher_1.0.0.tar.gz diff --git a/docs/en/instructions/eventmesh-store-quickstart.md b/docs/en/instructions/eventmesh-store-quickstart.md deleted file mode 100644 index 952cce1f7b..0000000000 --- a/docs/en/instructions/eventmesh-store-quickstart.md +++ /dev/null @@ -1,47 +0,0 @@ -# Eventmesh-store Quick start Instruction - -### dependencies -``` -64bit OS, Linux/Unix is recommended; -64bit JDK 1.8+; -Gradle at least 5.6; -4g+ free disk for eventmesh-store server -``` - -### download and build with sources - -download source code from [https://github.com/WeBankFinTech/EventMesh](https://github.com/WeBankFinTech/EventMesh) -You will get 'EventMesh-master.zip' - -**build eventmesh-store** -The eventmesh-store takes DeFiBus for example at the follwing parts, because eventmesh depends on defibus as store layer by default, other implements such as Rocketmq etc. is coming soon. - -``` -unzip EventMesh-master.zip -cd /*YOUR DEPLOY PATH*/EventMesh-master/eventmesh-store -gradle clean dist tar -x test -``` -You will get **eventmesh-store_1.0.0.tar.gz** in directory /* YOUR DEPLOY PATH */EventMesh-master/eventmesh-store/build - -### Deployment - -- deploy DeFiBusNamesrv -``` -upload eventmesh-store_1.0.0.tar.gz -tar -zxvf eventmesh-store_1.0.0.tar.gz -cd bin -sh runnamesrv.sh -``` -If you see "Thre Name Server boot success" in ../logs/namesrv.log, you setup DeFiBus Namesrv successfully. - -- deploy DeFiBusBroker -``` -upload eventmesh-store_1.0.0.tar.gz -tar -zxvf eventmesh-store_1.0.0.tar.gz -cd conf -config your broker.properties -cd ../bin -sh runbroker.sh -``` -If you see "The broker \[YOUR-BROKER-NAME, IP:PORT\] boot success." in ../logs/broker.log, you setup eventmesh-store successfully. - diff --git a/docs/en/instructions/quickstart.md b/docs/en/instructions/quickstart.md index 30309b82d9..f0e54f1e40 100644 --- a/docs/en/instructions/quickstart.md +++ b/docs/en/instructions/quickstart.md @@ -5,26 +5,17 @@ 64bit OS, Linux/Unix is recommended; 64bit JDK 1.8+; Gradle at least 5.6; -4g+ free disk for eventmesh-store server ``` ### download and build with sources download source code from [https://github.com/WeBankFinTech/EventMesh](https://github.com/WeBankFinTech/EventMesh) You will get 'EventMesh-master.zip' -To setup an eventmesh, you need to deploy the following components at least: eventmesh-store, eventmesh-emesher. +To setup an eventmesh, you need to deploy the following components at least: eventmesh-emesher. -**build eventmesh-store** -The eventmesh-store takes DeFiBus for example at the follwing parts, other implements such as Rocketmq etc. is coming soon. +**Step 1.** prepare the rocketmq/defibus runtime -``` -unzip EventMesh-master.zip -cd /*YOUR DEPLOY PATH*/EventMesh-master/eventmesh-store -gradle clean dist tar -x test -``` -You will get **eventmesh-store_1.0.0.tar.gz** in directory /* YOUR DEPLOY PATH */EventMesh-master/eventmesh-store/build - -**build eventmesh-emesher** +**Step 2.** build eventmesh-emesher ```$xslt cd /*YOUR DEPLOY PATH*/EventMesh-master/eventmesh-emesher gradle clean tar -x test @@ -32,29 +23,7 @@ gradle clean tar -x test You will get **eventmesh-emesher_1.0.0.tar.gz** in directory /* YOUR DEPLOY PATH */EventMesh-master/eventmesh-emesher/dist ### Deployment - -**Step 1.** deploy eventmesh-store -- deploy DeFiBusNamesrv -``` -upload eventmesh-store_1.0.0.tar.gz -tar -zxvf eventmesh-store_1.0.0.tar.gz -cd bin -sh runnamesrv.sh -``` -If you see "Thre Name Server boot success" in ../logs/namesrv.log, you setup DeFiBus Namesrv successfully. - -- deploy DeFiBusBroker -``` -upload eventmesh-store_1.0.0.tar.gz -tar -zxvf eventmesh-store_1.0.0.tar.gz -cd conf -fill up broker.properties -cd ../bin -sh runbroker.sh -``` -If you see "The broker \[YOUR-BROKER-NAME, IP:PORT\] boot success." in ../logs/broker.log, you setup eventmesh-store successfully. - -**Step 2.** deploy eventmesn-emesher +**Step 3.** deploy eventmesn-emesher ```$xslt upload eventmesh-emesher_1.0.0.tar.gz tar -zxvf eventmesh-emesher_1.0.0.tar.gz diff --git a/eventmesh-acl/build.gradle b/eventmesh-acl/build.gradle deleted file mode 100644 index 11bbc47bf2..0000000000 --- a/eventmesh-acl/build.gradle +++ /dev/null @@ -1,14 +0,0 @@ -plugins { - id 'java' -} - -group 'cn.webank.defibus' -version '1.0.0' - -repositories { - mavenCentral() -} - -dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' -} diff --git a/eventmesh-governance/build.gradle b/eventmesh-governance/build.gradle deleted file mode 100644 index 11bbc47bf2..0000000000 --- a/eventmesh-governance/build.gradle +++ /dev/null @@ -1,14 +0,0 @@ -plugins { - id 'java' -} - -group 'cn.webank.defibus' -version '1.0.0' - -repositories { - mavenCentral() -} - -dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' -} diff --git a/eventmesh-store/build.gradle b/eventmesh-store/build.gradle deleted file mode 100644 index c8cba24ed0..0000000000 --- a/eventmesh-store/build.gradle +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.concurrent.TimeUnit - -buildscript { - repositories { - maven { - url "https://maven.aliyun.com/repository/public" - } - - maven { - url "https://plugins.gradle.org/m2/" - } - - } - - dependencies { - //classpath("net.sourceforge.pmd:pmd-java:5.4.1") - //classpath("com.puppycrawl.tools:checkstyle:6.16.1") - classpath("gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.0.7") - classpath('com.github.spotbugs:spotbugs:4.0.0') - } -} - -allprojects { - apply plugin: 'java' - - - clean.doFirst { - delete 'build' - delete 'dist' - } - - if (project.findProperty("snapshot") instanceof String) { - if (project.property("snapshot").toBoolean()) - version = version + "-SNAPSHOT" - } -} - -task tar(type: Tar) { - extension = 'tar.gz' - compression = Compression.GZIP - archiveName = project.name + '_' + project.version + '.' + extension - destinationDir = new File(projectDir, 'build') - into('/') { - from 'dist' - } -} - -task zip(type: Zip) { - extension = 'zip' - archiveName = project.name + '.' + project.version + '.' + extension - destinationDir = new File(projectDir, 'build') - into('/') { - from 'dist' - } -} - -subprojects { - - - apply plugin: "maven" - apply plugin: "eclipse" - apply plugin: "idea" - apply plugin: "project-reports" - apply plugin: "jacoco" - apply plugin: "checkstyle" - apply plugin: "pmd" - apply plugin: 'com.github.spotbugs' - - [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' - - compileJava.options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" - - jacoco { - toolVersion = "0.8.5" - reportsDir = file("$buildDir/reports/jacoco") - } - - jacocoTestReport { -// sourceSets sourceSets.main -// executionData files("$buildDir/jacoco/jacocoTest.exec") - - reports { - xml.enabled false - csv.enabled false - html.destination file("${buildDir}/reports/jacoco") - } - } - - checkstyle { - toolVersion = "8.32" - ignoreFailures = true - sourceSets = [sourceSets.main] - configFile = 'conf/checkstyle.xml' as File - showViolations true - } - - tasks.withType(Checkstyle) { - reports { - xml.enabled false - html.enabled true - } - } - - spotbugs { - toolVersion = '4.0.2' - ignoreFailures = true - effort = "default" - reportLevel = "default" - showProgress = true - } - -// tasks.withType(com.github.spotbugs.SpotBugsTask) { -// sourceDirs = [sourceSets.main] -// reports { -// xml.enabled = false -// html.enabled = true -// } -// } - spotbugsMain { - reports { - xml.enabled = false - html.enabled = true - } - } - - spotbugsTest { - reports { - xml.enabled = false - html.enabled = true - } - } - - tasks.withType(Pmd) { - reports { - xml.enabled = false - html.enabled = true - } - } - - - pmd { - consoleOutput = true - toolVersion = "6.23.0" - rulePriority = 5 - ruleSets = ["category/java/errorprone.xml", "category/java/bestpractices.xml"] - ignoreFailures = true - } - - - - List junit = [ - "junit:junit:4.12" - ] - - List apache_commons = [ - "org.apache.commons:commons-collections4:4.1", - "commons-beanutils:commons-beanutils:1.9.3", - "org.apache.commons:commons-lang3:3.6", - "commons-codec:commons-codec:1.10" - - ] - - List logback = [ - "org.slf4j:slf4j-api:1.7.30" - ] - - List guava = [ - "com.google.guava:guava:29.0-jre" - ] - - List fastjson = [ - "com.alibaba:fastjson:1.2.71" - ] - - List common_io = [ - "commons-io:commons-io:2.4" - ] - - List assertj = [ - "org.assertj:assertj-core:2.6.0" - ] - - List mock = [ -// "org.mockito:mockito-core:1.10.19", -"org.mockito:mockito-core:2.23.0", -"org.powermock:powermock-module-junit4:2.0.2", -"org.powermock:powermock-api-mockito2:2.0.2", - ] - - dependencies { - compile apache_commons, guava, logback, fastjson, common_io - testCompile apache_commons, guava, logback, fastjson, common_io, junit, assertj, mock - runtime apache_commons, guava, logback, fastjson, common_io - } - - jar { - manifest { - attributes("Specification-Version": project.version, - "Specification-Vendor": "WeBank, Inc.", - "Specification-Title": project.name, - "Implementation-Version": project.version, - "Implementation-Vendor": "WeBank, Inc.", - "Implementation-Title": project.name, - "Build-Jdk": project.findProperty("jdk") - ) - } - } - - task dist(dependsOn: ['jar']) { - doFirst { - new File(projectDir, '../dist/bin').mkdirs() - new File(projectDir, '../dist/apps').mkdirs() - new File(projectDir, '../dist/conf').mkdirs() - new File(projectDir, '../dist/lib').mkdirs() - } - - doLast { - copy { - into('../dist/apps/') - from project.jar.getArchivePath() - } - copy { - into '../dist/lib' - from project.configurations.runtime - exclude '**/*.properties*' - exclude '**/*testng*.jar' - exclude '**/*powermock*.jar' - exclude '**/*mockito*.jar' - exclude '**/*junit*.jar' - exclude '**/*jacoco*.jar' - exclude '**/*log4j2.xml*' - exclude '**/spring-boot-devtools*.jar' - exclude '**/mumble-sdk-test*.jar' - exclude '**/defibus*.jar' - exclude '*log4j*.jar' - exclude 'commons-collections-3.2.2.jar' - } - - copy { - into '../dist/bin' - from '../script' - } - - copy { - into '../dist/conf' - from '../conf/' - } - } - } - - javadoc { - source = sourceSets.main.java - classpath = configurations.compile - destinationDir = reporting.file("javadoc") - } - - task packageJavadoc(type: Jar, dependsOn: ['javadoc']) { - from project.javadoc.destinationDir - classifier = 'javadoc' - } - - task packageSources(type: Jar) { - from project.sourceSets.main.allSource - classifier = 'sources' // either here or in artifacts block - } - - artifacts { - archives jar - archives packageJavadoc - archives packageSources - } - - repositories { - maven { url "https://maven.aliyun.com/repository/public" } - mavenCentral() - } - - configurations.all { - resolutionStrategy.cacheChangingModulesFor 0, TimeUnit.SECONDS - resolutionStrategy.cacheDynamicVersionsFor 0, TimeUnit.SECONDS - } - - uploadArchives { - repositories { - mavenDeployer { - snapshotRepository(url: 'file://D:\\LocalRepo') { - authentication(userName: 'Your user name', password: 'Your password') - } - repository(url: 'file://D:\\LocalRepo') { - authentication(userName: 'Your user name', password: 'Your password') - } - } - } - } - -} - diff --git a/eventmesh-store/conf/broker.properties b/eventmesh-store/conf/broker.properties deleted file mode 100644 index c527776dd1..0000000000 --- a/eventmesh-store/conf/broker.properties +++ /dev/null @@ -1,25 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -namesrvAddr= -brokerClusterName= -brokerName= -brokerId=0 -brokerRole=ASYNC_MASTER -autoCreateTopicEnable=false -useReentrantLockWhenPutMessage=true -storePathRootDir=/dev/shm/store -storePathCommitLog=/dev/shm/store/commitlog diff --git a/eventmesh-store/conf/logback_broker.xml b/eventmesh-store/conf/logback_broker.xml deleted file mode 100644 index 1dee3ed454..0000000000 --- a/eventmesh-store/conf/logback_broker.xml +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - ../logs/broker_default.log - true - - ../logs/otherdays/broker_default-%d{yyyy-MM-dd}.%i.log - - 128MB - 24 - 3GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - 10 - 256 - - - - - - ../logs/broker.log - true - - ../logs/otherdays/broker-%d{yyyy-MM-dd}.%i.log - - 128MB - 24 - 3GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - ../logs/protection.log - true - - ../logs/otherdays/protection-%d{yyyy-MM-dd}.%i.log - - 16MB - 24 - 1GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - ../logs/watermark.log - true - - ../logs/otherdays/watermark-%d{yyyy-MM-dd}.%i.log - - 32MB - 24 - 1GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %t %p %c - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - ../logs/store.log - true - - ../logs/otherdays/store-%d{yyyy-MM-dd}.%i.log - - 128MB - 24 - 3GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - ../logs/remoting.log - true - - ../logs/otherdays/remoting-%d{yyyy-MM-dd}.%i.log - - 64MB - 24 - 1GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - ../logs/storeerror.log - true - - ../logs/otherdays/storeerror-%d{yyyy-MM-dd}.%i.log - - 64MB - 24 - 1GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - - ../logs/transaction.log - true - - ../logs/otherdays/transaction-%d{yyyy-MM-dd}.%i.log - - 16MB - 24 - 1GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - - ../logs/lock.log - true - - ../logs/otherdays/lock-%d{yyyy-MM-dd}.%i.log - - 64MB - 24 - 1GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - 10 - 256 - - - - - ../logs/stats.log - true - - ../logs/otherdays/stats-%d{yyyy-MM-dd}.%i.log - - 500MB - 24 - 12GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - ../logs/commercial.log - true - - ../logs/otherdays/commercial-%d{yyyy-MM-dd}.%i.log - - 500MB - 24 - 12GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - - true - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/conf/logback_filtersrv.xml b/eventmesh-store/conf/logback_filtersrv.xml deleted file mode 100644 index ca85a5a09c..0000000000 --- a/eventmesh-store/conf/logback_filtersrv.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - ../logs/filtersrv_default.log - true - - ../logs/otherdays/filtersrv_default-%d{yyyy-MM-dd}.%i.log - - 128MB - 24 - 3GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - 10 - 256 - - - - - ../logs/filtersrv.log - true - - ../logs/otherdays/filtersrv.%i.log - - 1 - 5 - - - 100MB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - true - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/conf/logback_namesrv.xml b/eventmesh-store/conf/logback_namesrv.xml deleted file mode 100644 index 0eb2b615d0..0000000000 --- a/eventmesh-store/conf/logback_namesrv.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - ../logs/namesrv_default.log - true - - ../logs/otherdays/namesrv_default-%d{yyyy-MM-dd}.%i.log - - 128MB - 24 - 3GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - 10 - 256 - - - - - ../logs/namesrv.log - true - - ../logs/otherdays/namesrv-%d{yyyy-MM-dd}.%i.log - - 128MB - 24 - 3GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - ../logs/watermark.log - true - - ../logs/otherdays/watermark-%d{yyyy-MM-dd}.%i.log - - 32MB - 24 - 1GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - 10 - 256 - - - - - true - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/conf/logback_tools.xml b/eventmesh-store/conf/logback_tools.xml deleted file mode 100644 index 885098ac26..0000000000 --- a/eventmesh-store/conf/logback_tools.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - ../logs/tools_default.log - true - - ../logs/otherdays/tools_default-%d{yyyy-MM-dd}.%i.log - - 128MB - 24 - 3GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - 10 - 256 - - - - - - ../logs/tools.log - true - - ../logs/otherdays/tools-%d{yyyy-MM-dd}.%i.log - - 128MB - 24 - 3GB - - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - - - 10 - 256 - - - - - - true - - %d{yyy-MM-dd HH:mm:ss:SSS,GMT+8} %p %t - %m%n - UTF-8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/conf/namesrv.properties b/eventmesh-store/conf/namesrv.properties deleted file mode 100644 index 26d255fc6c..0000000000 --- a/eventmesh-store/conf/namesrv.properties +++ /dev/null @@ -1,17 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -listenPort=9876 \ No newline at end of file diff --git a/eventmesh-store/defibus-broker/.gitignore b/eventmesh-store/defibus-broker/.gitignore deleted file mode 100644 index 7272bbaaef..0000000000 --- a/eventmesh-store/defibus-broker/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -/bin/ -/.git/ -/.gradle/ -/.settings/ -/logs -.DS_Store -.*.swp -*.ipr -*.iml -*.iws -*.class -*.log -.idea -build -.classpath -.project -/test-output/ -/dist -/.pmd -/classes -/logs \ No newline at end of file diff --git a/eventmesh-store/defibus-broker/build.gradle b/eventmesh-store/defibus-broker/build.gradle deleted file mode 100644 index cb95bb0549..0000000000 --- a/eventmesh-store/defibus-broker/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -List Log = [ - "org.slf4j:slf4j-log4j12:1.7.12", - "log4j:log4j:1.2.17" -] - -dependencies { - compile project(":defibus-common") - testCompile project(":defibus-common") - compile "org.apache.rocketmq:rocketmq-broker:$project.rocketmqVersion" - compile "ch.qos.logback:logback-core:1.2.3" - compile "ch.qos.logback:logback-classic:1.2.3" - testCompile Log -} \ No newline at end of file diff --git a/eventmesh-store/defibus-broker/conf/checkstyle.xml b/eventmesh-store/defibus-broker/conf/checkstyle.xml deleted file mode 100644 index 3d024111bc..0000000000 --- a/eventmesh-store/defibus-broker/conf/checkstyle.xml +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBrokerController.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBrokerController.java deleted file mode 100644 index 76eb754205..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBrokerController.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker; - -import cn.webank.defibus.broker.client.AdjustQueueNumStrategy; -import cn.webank.defibus.broker.client.DeFiConsumerManager; -import cn.webank.defibus.broker.client.DeFiProducerManager; -import cn.webank.defibus.broker.consumequeue.ClientRebalanceResultManager; -import cn.webank.defibus.broker.consumequeue.ConsumeQueueManager; -import cn.webank.defibus.broker.consumequeue.MessageRedirectManager; -import cn.webank.defibus.broker.monitor.QueueListeningMonitor; -import cn.webank.defibus.broker.net.DeFiBusBroker2Client; -import cn.webank.defibus.broker.processor.DeFiAdminBrokerProcessor; -import cn.webank.defibus.broker.processor.DeFiClientManageProcessor; -import cn.webank.defibus.broker.processor.DeFiPullMessageProcessor; -import cn.webank.defibus.broker.processor.DeFiReplyMessageProcessor; -import cn.webank.defibus.broker.processor.DeFiSendMessageProcessor; -import cn.webank.defibus.broker.topic.DeFiTopicConfigManager; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.defibus.common.util.ReflectUtil; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import org.apache.commons.lang3.Validate; -import org.apache.rocketmq.broker.BrokerController; -import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener; -import org.apache.rocketmq.broker.out.BrokerOuterAPI; -import org.apache.rocketmq.broker.processor.PullMessageProcessor; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.ThreadFactoryImpl; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.constant.PermName; -import org.apache.rocketmq.common.namesrv.TopAddressing; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.remoting.RemotingServer; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBrokerController extends BrokerController { - private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - private static final Logger LOG_WATER_MARK = LoggerFactory.getLogger(LoggerName.WATER_MARK_LOGGER_NAME); - - private final DeFiProducerManager producerManager; - private final DeFiConsumerManager consumerManager; - private final DeFiBusBroker2Client deFiBusBroker2Client; - private final ExecutorService deFiManageExecutor; - private final ExecutorService sendReplyMessageExecutor; - private final ExecutorService pushReplyMessageExecutor; - private final BlockingQueue sendReplyThreadPoolQueue; - private final BlockingQueue pushReplyThreadPoolQueue; - private final ScheduledExecutorService deFiScheduledExecutorService; - private final ScheduledThreadPoolExecutor sendReplyScheduledExecutorService; - - private RemotingServer fastRemotingServer = null; - private final ConsumeQueueManager consumeQueueManager; - private final DeFiBusBrokerConfig deFiBusBrokerConfig; - private final DeFiTopicConfigManager extTopicConfigManager; - private final QueueListeningMonitor queueListeningMonitor; - - private DeFiPullMessageProcessor deFiPullMessageProcessor; - private MessageRedirectManager messageRedirectManager; - private ClientRebalanceResultManager clientRebalanceResultManager; - - public DeFiBrokerController(BrokerConfig brokerConfig, NettyServerConfig nettyServerConfig, - NettyClientConfig nettyClientConfig, MessageStoreConfig messageStoreConfig, - DeFiBusBrokerConfig deFiBusBrokerConfig) { - super(brokerConfig, nettyServerConfig, nettyClientConfig, messageStoreConfig); - producerManager = new DeFiProducerManager(); - - ConsumerIdsChangeListener consumerIdsChangeListener = (ConsumerIdsChangeListener) ReflectUtil.getSimpleProperty(BrokerController.class, this, "consumerIdsChangeListener"); - AdjustQueueNumStrategy adjustQueueNumStrategy = new AdjustQueueNumStrategy(this); - consumerManager = new DeFiConsumerManager(consumerIdsChangeListener, adjustQueueNumStrategy); - - this.deFiManageExecutor = - Executors.newFixedThreadPool(brokerConfig.getClientManageThreadPoolNums(), new ThreadFactoryImpl( - "ClientManageThread_")); - deFiBusBroker2Client = new DeFiBusBroker2Client(this); - this.sendReplyThreadPoolQueue = new LinkedBlockingQueue(deFiBusBrokerConfig.getSendReplyThreadPoolQueueCapacity()); - this.pushReplyThreadPoolQueue = new LinkedBlockingQueue(deFiBusBrokerConfig.getPushReplyThreadPoolQueueCapacity()); - - this.sendReplyMessageExecutor = new ThreadPoolExecutor(// - deFiBusBrokerConfig.getSendReplyMessageThreadPoolNums(),// - deFiBusBrokerConfig.getSendReplyMessageThreadPoolNums(),// - 1000 * 60,// - TimeUnit.MILLISECONDS,// - this.sendReplyThreadPoolQueue,// - new ThreadFactoryImpl("sendReplyMessageThread_")); - this.pushReplyMessageExecutor = new ThreadPoolExecutor(// - deFiBusBrokerConfig.getPushReplyMessageThreadPoolNums(),// - deFiBusBrokerConfig.getPushReplyMessageThreadPoolNums(),// - 1000 * 60,// - TimeUnit.MILLISECONDS,// - this.pushReplyThreadPoolQueue,// - new ThreadFactoryImpl("pushReplyMessageThread_")); - - this.consumeQueueManager = ConsumeQueueManager.onlyInstance(); - consumeQueueManager.setBrokerController(this); - extTopicConfigManager = new DeFiTopicConfigManager(this); - - BrokerOuterAPI brokerOuterAPI = super.getBrokerOuterAPI(); - ReflectUtil.setSimpleProperty(BrokerController.class, this, "brokerOuterAPI", brokerOuterAPI); - - String wsAddr = deFiBusBrokerConfig.getRmqAddressServerDomain() + "/" + deFiBusBrokerConfig.getRmqAddressServerSubGroup(); - TopAddressing topAddressing = (TopAddressing) ReflectUtil.getSimpleProperty(BrokerOuterAPI.class, brokerOuterAPI, "topAddressing"); - ReflectUtil.setSimpleProperty(TopAddressing.class, topAddressing, "wsAddr", wsAddr); - - if (this.getBrokerConfig().getNamesrvAddr() != null) { - brokerOuterAPI.updateNameServerAddressList(this.getBrokerConfig().getNamesrvAddr()); - LOG.info("user specfied name server address: {}", this.getBrokerConfig().getNamesrvAddr()); - } - - deFiScheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r, "brokerControllerScheduledThread"); - t.setDaemon(true); - return t; - } - }); - - sendReplyScheduledExecutorService = new ScheduledThreadPoolExecutor(1, new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r, "sendReplyScheduledThread"); - t.setDaemon(true); - return t; - } - }); - - this.deFiBusBrokerConfig = deFiBusBrokerConfig; - this.getConfiguration().registerConfig(deFiBusBrokerConfig); - this.messageRedirectManager = new MessageRedirectManager(this); - this.clientRebalanceResultManager = new ClientRebalanceResultManager(this); - this.queueListeningMonitor = new QueueListeningMonitor(this); - DeFiBusBrokerStartup.setDeFiBrokerController(this); - } - - @Override - public boolean initialize() throws CloneNotSupportedException { - boolean result = super.initialize(); - - result = result && this.extTopicConfigManager.load(); - - //reset the lastDeliverOffsetTable as offsetTable of consumer - consumeQueueManager.load(); - - String rrTopic = this.getBrokerConfig().getBrokerClusterName() + "-" + DeFiBusConstant.RR_REPLY_TOPIC; - if (getTopicConfigManager().selectTopicConfig(rrTopic) == null) { - TopicConfig topicConfig = new TopicConfig(rrTopic); - topicConfig.setWriteQueueNums(1); - topicConfig.setReadQueueNums(1); - topicConfig.setPerm(PermName.PERM_INHERIT | PermName.PERM_READ | PermName.PERM_WRITE); - this.getTopicConfigManager().updateTopicConfig(topicConfig); - } - this.getTopicConfigManager().getSystemTopic().add(rrTopic); - - return result; - } - - public DeFiTopicConfigManager getExtTopicConfigManager() { - return DeFiBrokerController.this.extTopicConfigManager; - } - - public void start() throws Exception { - super.start(); - deFiScheduledExecutorService.scheduleAtFixedRate(() -> { - this.getConsumerOffsetManager().scanUnsubscribedTopic(); - this.getConsumeQueueManager().scanUnsubscribedTopic(); - }, 3600 * 1000, 3600 * 1000, TimeUnit.MILLISECONDS); - this.queueListeningMonitor.start(); - } - - public void scheduleTask(Runnable task, long delay) { - deFiScheduledExecutorService.schedule(task, delay, TimeUnit.MILLISECONDS); - } - - public void scheduleTaskAtFixedRate(Runnable task, long delay, long period) { - deFiScheduledExecutorService.scheduleAtFixedRate(task, delay, period, TimeUnit.MILLISECONDS); - } - - public void shutdown() { - deFiManageExecutor.shutdown(); - sendReplyMessageExecutor.shutdown(); - pushReplyMessageExecutor.shutdown(); - - deFiScheduledExecutorService.shutdown(); - sendReplyScheduledExecutorService.shutdown(); - - messageRedirectManager.shutdown(); - this.queueListeningMonitor.shutdown(); - - super.shutdown(); - } - - public void registerProcessor() { - super.registerProcessor(); - fastRemotingServer = (RemotingServer) ReflectUtil.getSimpleProperty(BrokerController.class, this, "fastRemotingServer"); - Validate.notNull(fastRemotingServer, "fastRemotingServer is null"); - - DeFiReplyMessageProcessor sendDirectMessageProcessor = new DeFiReplyMessageProcessor(this); - super.getRemotingServer().registerProcessor(DeFiBusRequestCode.SEND_DIRECT_MESSAGE, sendDirectMessageProcessor, this.sendReplyMessageExecutor); - super.getRemotingServer().registerProcessor(DeFiBusRequestCode.SEND_DIRECT_MESSAGE_V2, sendDirectMessageProcessor, this.sendReplyMessageExecutor); - fastRemotingServer.registerProcessor(DeFiBusRequestCode.SEND_DIRECT_MESSAGE, sendDirectMessageProcessor, this.sendReplyMessageExecutor); - fastRemotingServer.registerProcessor(DeFiBusRequestCode.SEND_DIRECT_MESSAGE_V2, sendDirectMessageProcessor, this.sendReplyMessageExecutor); - - DeFiAdminBrokerProcessor extAdminBrokerProcessor = new DeFiAdminBrokerProcessor(this); - ExecutorService adminBrokerExecutor = (ExecutorService) ReflectUtil.getSimpleProperty(BrokerController.class, - this, "adminBrokerExecutor"); - super.getRemotingServer().registerProcessor(DeFiBusRequestCode.GET_CONSUME_STATS_V2, extAdminBrokerProcessor, adminBrokerExecutor); - super.getRemotingServer().registerProcessor(RequestCode.GET_BROKER_RUNTIME_INFO, extAdminBrokerProcessor, adminBrokerExecutor); - fastRemotingServer.registerProcessor(DeFiBusRequestCode.GET_CONSUME_STATS_V2, extAdminBrokerProcessor, adminBrokerExecutor); - fastRemotingServer.registerProcessor(RequestCode.GET_BROKER_RUNTIME_INFO, extAdminBrokerProcessor, adminBrokerExecutor); - super.getRemotingServer().registerProcessor(RequestCode.UPDATE_AND_CREATE_TOPIC, extAdminBrokerProcessor, adminBrokerExecutor); - fastRemotingServer.registerProcessor(RequestCode.UPDATE_AND_CREATE_TOPIC, extAdminBrokerProcessor, adminBrokerExecutor); - - DeFiSendMessageProcessor deFiSendMessageProcessor = new DeFiSendMessageProcessor(this); - ExecutorService sendMessageExecutor = (ExecutorService) ReflectUtil.getSimpleProperty(BrokerController.class, - this, "sendMessageExecutor"); - super.getRemotingServer().registerProcessor(RequestCode.SEND_MESSAGE, deFiSendMessageProcessor, sendMessageExecutor); - super.getRemotingServer().registerProcessor(RequestCode.SEND_MESSAGE_V2, deFiSendMessageProcessor, sendMessageExecutor); - super.getRemotingServer().registerProcessor(RequestCode.SEND_BATCH_MESSAGE, deFiSendMessageProcessor, sendMessageExecutor); - super.getRemotingServer().registerProcessor(RequestCode.CONSUMER_SEND_MSG_BACK, deFiSendMessageProcessor, sendMessageExecutor); - this.fastRemotingServer.registerProcessor(RequestCode.SEND_MESSAGE, deFiSendMessageProcessor, sendMessageExecutor); - this.fastRemotingServer.registerProcessor(RequestCode.SEND_MESSAGE_V2, deFiSendMessageProcessor, sendMessageExecutor); - this.fastRemotingServer.registerProcessor(RequestCode.SEND_BATCH_MESSAGE, deFiSendMessageProcessor, sendMessageExecutor); - this.fastRemotingServer.registerProcessor(RequestCode.CONSUMER_SEND_MSG_BACK, deFiSendMessageProcessor, sendMessageExecutor); - - deFiPullMessageProcessor = new DeFiPullMessageProcessor(this); - ExecutorService pullMessageExecutor = (ExecutorService) ReflectUtil.getSimpleProperty(BrokerController.class, - this, "pullMessageExecutor"); - super.getRemotingServer().registerProcessor(RequestCode.PULL_MESSAGE, deFiPullMessageProcessor, pullMessageExecutor); - this.fastRemotingServer.registerProcessor(RequestCode.PULL_MESSAGE, deFiPullMessageProcessor, pullMessageExecutor); - - DeFiClientManageProcessor deFiClientManageProcessor = new DeFiClientManageProcessor(this); - super.getRemotingServer().registerProcessor(DeFiBusRequestCode.GET_CONSUMER_LIST_BY_GROUP_AND_TOPIC, deFiClientManageProcessor, deFiManageExecutor); - fastRemotingServer.registerProcessor(DeFiBusRequestCode.GET_CONSUMER_LIST_BY_GROUP_AND_TOPIC, deFiClientManageProcessor, deFiManageExecutor); - - } - - public DeFiBusBroker2Client getDeFiBusBroker2Client() { - return deFiBusBroker2Client; - } - - @Override - public DeFiProducerManager getProducerManager() { - return producerManager; - } - - @Override - public void printWaterMark() { - LOG_WATER_MARK.info("{\"SendQueueSize\":\"{}\",\"PullQueueSize\":\"{}\",\"GotQueueSize\":\"{}\",\"PushQueueSize\":\"{}\",\"SendSlowTimeMills\":\"{}\",\"PullSlowTimeMills\":\"{}\",\"HeartbeatQueueSize\":\"{}\"}", - this.getSendThreadPoolQueue().size(), - this.getPullThreadPoolQueue().size(), - this.sendReplyThreadPoolQueue.size(), - this.pushReplyThreadPoolQueue.size(), - this.headSlowTimeMills4SendThreadPoolQueue(), - this.headSlowTimeMills4PullThreadPoolQueue(), - this.getHeartbeatThreadPoolQueue().size()); - } - - public DeFiBusBrokerConfig getDeFiBusBrokerConfig() { - return deFiBusBrokerConfig; - } - - public ExecutorService getPushReplyMessageExecutor() { - return pushReplyMessageExecutor; - } - - public ExecutorService getSendReplyMessageExecutor() { - return sendReplyMessageExecutor; - } - - public ScheduledThreadPoolExecutor getSendReplyScheduledExecutorService() { - return sendReplyScheduledExecutorService; - } - - public ConsumeQueueManager getConsumeQueueManager() { - return consumeQueueManager; - } - - public PullMessageProcessor getPullMessageProcessor() { - return deFiPullMessageProcessor; - } - - @Override - public DeFiConsumerManager getConsumerManager() { - return this.consumerManager; - } - - public MessageRedirectManager getMessageRedirectManager() { - return messageRedirectManager; - } - - public ClientRebalanceResultManager getClientRebalanceResultManager() { - return clientRebalanceResultManager; - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBrokerPathConfigHelper.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBrokerPathConfigHelper.java deleted file mode 100644 index ceb5a273a2..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBrokerPathConfigHelper.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker; - -import java.io.File; -import org.apache.rocketmq.broker.BrokerPathConfigHelper; - -public class DeFiBrokerPathConfigHelper extends BrokerPathConfigHelper { - private static String topicConfigPath = System.getProperty("user.home") + File.separator + "topicConfig"; - private static String brokerConfigPath = System.getProperty("user.home") + File.separator + "brokerConfig"; - - public static String getTopicConfigPath() { - return topicConfigPath; - } - - public static void setTopicConfigPath(String topicConfigPath) { - DeFiBrokerPathConfigHelper.topicConfigPath = topicConfigPath; - } - - public static String getBrokerConfigPath() { - return brokerConfigPath; - } - - public static void setBrokerConfigPath(String brokerConfigPath) { - DeFiBrokerPathConfigHelper.brokerConfigPath = brokerConfigPath; - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBusBrokerStartup.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBusBrokerStartup.java deleted file mode 100644 index 8c59ffcaba..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/DeFiBusBrokerStartup.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker; - -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.joran.JoranConfigurator; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import cn.webank.defibus.common.DeFiBusConstant; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.util.Properties; -import java.util.concurrent.atomic.AtomicInteger; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.PosixParser; -import org.apache.rocketmq.broker.BrokerPathConfigHelper; -import org.apache.rocketmq.broker.BrokerStartup; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.MQVersion; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.logging.InternalLoggerFactory; -import org.apache.rocketmq.remoting.common.RemotingUtil; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.remoting.netty.NettySystemConfig; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.srvutil.ServerUtil; -import org.apache.rocketmq.store.config.BrokerRole; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.slf4j.LoggerFactory; - -public class DeFiBusBrokerStartup extends BrokerStartup { - private static DeFiBrokerController deFiBrokerController; - - public static void main(String[] args) { - createBrokerController(args); - BrokerStartup.start(deFiBrokerController); - } - - public static DeFiBrokerController createBrokerController(String[] args) { - System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION)); - if (null == System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_SNDBUF_SIZE)) { - NettySystemConfig.socketSndbufSize = 131072; - } - if (null == System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_RCVBUF_SIZE)) { - NettySystemConfig.socketRcvbufSize = 131072; - } - - try { - Options options = ServerUtil.buildCommandlineOptions(new Options()); - commandLine = - ServerUtil.parseCmdLine("mqbroker", args, buildCommandlineOptions(options), - new PosixParser()); - if (null == commandLine) { - System.exit(-1); - return null; - } - - final BrokerConfig brokerConfig = new BrokerConfig(); - final NettyServerConfig nettyServerConfig = new NettyServerConfig(); - final NettyClientConfig nettyClientConfig = new NettyClientConfig(); - nettyServerConfig.setListenPort(10911); - final MessageStoreConfig messageStoreConfig = new MessageStoreConfig(); - final DeFiBusBrokerConfig deFiBusBrokerConfig = new DeFiBusBrokerConfig(); - - if (BrokerRole.SLAVE == messageStoreConfig.getBrokerRole()) { - int ratio = messageStoreConfig.getAccessMessageInMemoryMaxRatio() - 10; - messageStoreConfig.setAccessMessageInMemoryMaxRatio(ratio); - } - - if (commandLine.hasOption('p')) { - MixAll.printObjectProperties(null, brokerConfig); - MixAll.printObjectProperties(null, nettyServerConfig); - MixAll.printObjectProperties(null, nettyClientConfig); - MixAll.printObjectProperties(null, messageStoreConfig); - System.exit(0); - } else if (commandLine.hasOption('m')) { - MixAll.printObjectProperties(null, brokerConfig, true); - MixAll.printObjectProperties(null, nettyServerConfig, true); - MixAll.printObjectProperties(null, nettyClientConfig, true); - MixAll.printObjectProperties(null, messageStoreConfig, true); - System.exit(0); - } - - if (commandLine.hasOption('c')) { - String file = commandLine.getOptionValue('c'); - if (file != null) { - configFile = file; - InputStream in = new BufferedInputStream(new FileInputStream(file)); - properties = new Properties(); - properties.load(in); - - parsePropertie2SystemEnv(properties); - MixAll.properties2Object(properties, brokerConfig); - MixAll.properties2Object(properties, nettyServerConfig); - MixAll.properties2Object(properties, nettyClientConfig); - MixAll.properties2Object(properties, messageStoreConfig); - MixAll.properties2Object(properties, deFiBusBrokerConfig); - BrokerPathConfigHelper.setBrokerConfigPath(file); - DeFiBrokerPathConfigHelper.setBrokerConfigPath(file); - String path = new File(file).getParent(); - DeFiBrokerPathConfigHelper.setTopicConfigPath(path); - DeFiBrokerPathConfigHelper.setBrokerConfigPath(path); - - System.out.println("load config properties file OK, " + file); - in.close(); - } - } - - MixAll.properties2Object(ServerUtil.commandLine2Properties(commandLine), brokerConfig); - - if (null == brokerConfig.getRocketmqHome()) { - System.out.println("Please set the " + MixAll.ROCKETMQ_HOME_ENV - + " variable in your environment to match the location of the RocketMQ installation"); - System.exit(-2); - } - - String namesrvAddr = brokerConfig.getNamesrvAddr(); - if (null != namesrvAddr) { - try { - String[] addrArray = namesrvAddr.split(";"); - if (addrArray != null) { - for (String addr : addrArray) { - RemotingUtil.string2SocketAddress(addr); - } - } - } catch (Exception e) { - System.out.printf( - "The Name Server Address[%s] illegal, please set it as follows, \"127.0.0.1:9876;192.168.0.1:9876\"%n", - namesrvAddr); - System.exit(-3); - } - } - - switch (messageStoreConfig.getBrokerRole()) { - case ASYNC_MASTER: - case SYNC_MASTER: - brokerConfig.setBrokerId(MixAll.MASTER_ID); - break; - case SLAVE: - if (brokerConfig.getBrokerId() <= 0) { - System.out.println("Slave's brokerId must be > 0"); - System.exit(-3); - } - - break; - default: - break; - } - - messageStoreConfig.setHaListenPort(nettyServerConfig.getListenPort() + 1); - - LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - JoranConfigurator configurator = new JoranConfigurator(); - configurator.setContext(lc); - lc.reset(); - configurator.doConfigure(brokerConfig.getRocketmqHome() + "/conf/logback_broker.xml"); - log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - - MixAll.printObjectProperties(log, brokerConfig); - MixAll.printObjectProperties(log, nettyServerConfig); - MixAll.printObjectProperties(log, nettyClientConfig); - MixAll.printObjectProperties(log, messageStoreConfig); - - brokerConfig.setMessageStorePlugIn(DeFiBusConstant.PLUGIN_CLASS_NAME); - final DeFiBrokerController deFiBrokerController = new DeFiBrokerController(// - brokerConfig, // - nettyServerConfig, // - nettyClientConfig, // - messageStoreConfig, - deFiBusBrokerConfig); - boolean initResult = deFiBrokerController.initialize(); - if (!initResult) { - deFiBrokerController.shutdown(); - System.exit(-3); - } - - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - private volatile boolean hasShutdown = false; - private AtomicInteger shutdownTimes = new AtomicInteger(0); - - @Override - public void run() { - synchronized (this) { - log.info("shutdown hook was invoked, " + this.shutdownTimes.incrementAndGet()); - if (!this.hasShutdown) { - this.hasShutdown = true; - long begineTime = System.currentTimeMillis(); - deFiBrokerController.shutdown(); - long consumingTimeTotal = System.currentTimeMillis() - begineTime; - log.info("shutdown hook over, consuming time total(ms): " + consumingTimeTotal); - } - } - } - }, "ShutdownHook")); - - return deFiBrokerController; - } catch (Throwable e) { - e.printStackTrace(); - System.exit(-1); - } - - return null; - } - - private static void parsePropertie2SystemEnv(Properties properties) { - if (properties == null) { - return; - } - String rmqAddressServerDomain = properties.getProperty("rmqAddressServerDomain", "jmenv.tbsite.net"); - String rmqAddressServerSubGroup = properties.getProperty("rmqAddressServerSubGroup", "nsaddr"); - System.setProperty("rocketmq.namesrv.domain", rmqAddressServerDomain); - System.setProperty("rocketmq.namesrv.domain.subgroup", rmqAddressServerSubGroup); - } - - public static DeFiBrokerController getDeFiBrokerController() { - return deFiBrokerController; - } - - public static void setDeFiBrokerController(DeFiBrokerController deFiBrokerController) { - DeFiBusBrokerStartup.deFiBrokerController = deFiBrokerController; - } - - private static Options buildCommandlineOptions(final Options options) { - Option opt = new Option("c", "configFile", true, "Broker config properties file"); - opt.setRequired(false); - options.addOption(opt); - - opt = new Option("p", "printConfigItem", false, "Print all config item"); - opt.setRequired(false); - options.addOption(opt); - - opt = new Option("m", "printImportantConfig", false, "Print important config item"); - opt.setRequired(false); - options.addOption(opt); - - return options; - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/AdjustQueueNumStrategy.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/AdjustQueueNumStrategy.java deleted file mode 100644 index ed89963dda..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/AdjustQueueNumStrategy.java +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.client; - -import java.util.List; -import java.util.Set; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Predicate; - -import io.netty.channel.Channel; - -import org.apache.rocketmq.broker.client.ConsumerGroupInfo; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.apache.rocketmq.store.config.BrokerRole; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusConstant; - -public class AdjustQueueNumStrategy { - private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - private final DeFiBrokerController deFiBrokerController; - private final ScheduledThreadPoolExecutor autoScaleQueueSizeExecutorService; - - public AdjustQueueNumStrategy(final DeFiBrokerController deFiBrokerController) { - this.deFiBrokerController = deFiBrokerController; - - autoScaleQueueSizeExecutorService = new ScheduledThreadPoolExecutor(3, new ThreadFactory() { - AtomicInteger threadNo = new AtomicInteger(0); - - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r, "AdjustQueueNumScheduledThread_" + threadNo.incrementAndGet()); - t.setDaemon(true); - return t; - } - }); - } - - public void increaseQueueNum(String topic) { - adjustQueueNumByConsumerCount(topic, AdjustType.INCREASE_QUEUE_NUM); - } - - public void decreaseQueueNum(String topic) { - adjustQueueNumByConsumerCount(topic, AdjustType.DECREASE_QUEUE_NUM); - } - - private void adjustQueueNumByConsumerCount(String topic, AdjustType scaleType) { - if (BrokerRole.SLAVE == this.deFiBrokerController.getMessageStoreConfig().getBrokerRole()) { - log.info("skip adjust queue num in slave."); - return; - } - if (topic.startsWith(MixAll.DLQ_GROUP_TOPIC_PREFIX) || topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)) { - log.info("skip adjust queue num for topic [{}]", topic); - return; - } - switch (scaleType) { - case INCREASE_QUEUE_NUM: - adjustReadQueueNumByConsumerCount(topic, 0, scaleType); - adjustWriteQueueNumByConsumerCount(topic, 10 * 1000, scaleType); - break; - - case DECREASE_QUEUE_NUM: - adjustWriteQueueNumByConsumerCount(topic, 0, scaleType); - long delayTimeMinutes = Math.min(deFiBrokerController.getDeFiBusBrokerConfig().getScaleQueueSizeDelayTimeMinute(), 10); - long delayTimeMillis = delayTimeMinutes * 60 * 1000; - adjustReadQueueNumByConsumerCount(topic, delayTimeMillis, scaleType); - break; - } - } - - private void adjustReadQueueNumByConsumerCount(String topic, long delayMills, AdjustType mode) { - Runnable scaleQueueTask = new Runnable() { - private int alreadyRetryTimes = 0; - - @Override - public void run() { - TopicConfig topicConfig = deFiBrokerController.getTopicConfigManager().getTopicConfigTable().get(topic); - if (topicConfig != null) { - synchronized (topicConfig) { - - //query again to ensure it's newest - topicConfig = deFiBrokerController.getTopicConfigManager().getTopicConfigTable().get(topic); - int adjustReadQueueSize = adjustQueueSizeByMaxConsumerCount(topic); - - if (AdjustType.INCREASE_QUEUE_NUM == mode && adjustReadQueueSize < topicConfig.getReadQueueNums()) { - log.info("can not decrease read queue size to {} for [{}], prev: {}, {}", adjustReadQueueSize, topic, topicConfig.getReadQueueNums(), mode); - return; - } - if (AdjustType.DECREASE_QUEUE_NUM == mode && adjustReadQueueSize > topicConfig.getReadQueueNums()) { - log.info("can not increase read queue size to {} for [{}], prev: {}, {}", adjustReadQueueSize, topic, topicConfig.getReadQueueNums(), mode); - return; - } - - if (adjustReadQueueSize != topicConfig.getReadQueueNums()) { - log.info("try adjust read queue size to {} for [{}], prev: {}, {}", adjustReadQueueSize, topic, topicConfig.getReadQueueNums(), mode); - if (adjustReadQueueSize < topicConfig.getWriteQueueNums()) { - log.info("adjust read queues to {} for [{}] fail. read queue size can't less than write queue size[{}]. {}", - adjustReadQueueSize, topic, topicConfig.getWriteQueueNums(), mode); - return; - } - boolean canAdjustReadQueueSize = isCanAdjustReadQueueSize(topic, adjustReadQueueSize); - if (canAdjustReadQueueSize) { - if (adjustReadQueueSize >= topicConfig.getWriteQueueNums() && adjustReadQueueSize < 1024) { - if (mode == AdjustType.INCREASE_QUEUE_NUM && adjustReadQueueSize > 4) { - log.warn("[NOTIFY]auto adjust queues more than 4 for [{}]. {}", topic, mode); - } - TopicConfig topicConfigNew = generateNewTopicConfig(topicConfig, topicConfig.getWriteQueueNums(), adjustReadQueueSize); - deFiBrokerController.getTopicConfigManager().updateTopicConfig(topicConfigNew); - deFiBrokerController.registerBrokerAll(true, false, true); - notifyWhenTopicConfigChange(topic); - } else if (adjustReadQueueSize >= 1024) { - log.warn("[NOTIFY]auto adjust queue num is limited to 1024 for [{}]. {}", topic, mode); - } - } else { - if (this.alreadyRetryTimes < deFiBrokerController.getDeFiBusBrokerConfig().getScaleQueueRetryTimesMax()) { - log.info("try adjust read queue size to {} for [{}] fail. retry times: [{}]. {}", adjustReadQueueSize, topic, this.alreadyRetryTimes, mode); - this.alreadyRetryTimes++; - scheduleAdjustQueueSizeTask(this, delayMills, topic, mode); - log.info("adjustQueueSizeScheduleExecutor queued: {}", autoScaleQueueSizeExecutorService.getQueue().size()); - } else { - log.warn("try adjust read queue size to {} for [{}] fail. ignore after retry {} times. {}", adjustReadQueueSize, topic, this.alreadyRetryTimes, mode); - } - } - } else { - log.info("no need to adjust read queue size for [{}]. now [w:{}/r:{}]. {}", topic, topicConfig.getWriteQueueNums(), topicConfig.getReadQueueNums(), mode); - } - } - } else { - log.info("skip adjust read queue size for [{}]. topicConfig is null.", topic); - } - } - }; - this.scheduleAdjustQueueSizeTask(scaleQueueTask, delayMills, topic, mode); - } - - private void adjustWriteQueueNumByConsumerCount(String topic, long delayMills, AdjustType mode) { - Runnable scaleTask = new Runnable() { - @Override - public void run() { - TopicConfig topicConfig = deFiBrokerController.getTopicConfigManager().getTopicConfigTable().get(topic); - if (topicConfig != null) { - synchronized (topicConfig) { - - //query again to ensure it's newest - topicConfig = deFiBrokerController.getTopicConfigManager().getTopicConfigTable().get(topic); - int adjustWriteQueueSize = adjustQueueSizeByMaxConsumerCount(topic); - - if (AdjustType.INCREASE_QUEUE_NUM == mode && adjustWriteQueueSize < topicConfig.getWriteQueueNums()) { - log.info("can not decrease write queue size to {} for [{}], prev: {}, {}", adjustWriteQueueSize, topic, topicConfig.getWriteQueueNums(), mode); - return; - } - if (AdjustType.DECREASE_QUEUE_NUM == mode && adjustWriteQueueSize > topicConfig.getWriteQueueNums()) { - log.info("can not increase write queue size to {} for [{}], prev: {}, {}", adjustWriteQueueSize, topic, topicConfig.getWriteQueueNums(), mode); - return; - } - - if (adjustWriteQueueSize != topicConfig.getWriteQueueNums()) { - log.info("try adjust write queue size to {} for [{}], prev: {}. {}", adjustWriteQueueSize, topic, topicConfig.getWriteQueueNums(), mode); - if (adjustWriteQueueSize >= 0 && adjustWriteQueueSize <= topicConfig.getReadQueueNums()) { - TopicConfig topicConfigNew = generateNewTopicConfig(topicConfig, adjustWriteQueueSize, topicConfig.getReadQueueNums()); - deFiBrokerController.getTopicConfigManager().updateTopicConfig(topicConfigNew); - deFiBrokerController.registerBrokerAll(true, false, true); - notifyWhenTopicConfigChange(topic); - } else { - log.info("adjust write queues to {} for [{}] fail. target write queue size can't less than 0 or greater than read queue size[{}]. mode: {}", - adjustWriteQueueSize, topic, topicConfig.getReadQueueNums(), mode); - } - } else { - log.info("no need to adjust write queue size for [{}]. now [w:{}/r:{}]. {}", topic, topicConfig.getWriteQueueNums(), topicConfig.getReadQueueNums(), mode); - } - } - } else { - log.info("skip adjust write queue size for [{}]. topicConfig is null.", topic); - } - } - }; - this.scheduleAdjustQueueSizeTask(scaleTask, delayMills, topic, mode); - } - - private void scheduleAdjustQueueSizeTask(Runnable task, long delay, String topic, AdjustType mode) { - int queueSize = autoScaleQueueSizeExecutorService.getQueue().size(); - if (queueSize < this.deFiBrokerController.getDeFiBusBrokerConfig().getScaleQueueThreadPoolQueueCapacity()) { - autoScaleQueueSizeExecutorService.schedule(task, delay, TimeUnit.MILLISECONDS); - } else { - log.warn("schedule adjust queue size reject. thread pool queue is full. capacity: {} topic: {}, {}", queueSize, topic, mode); - } - } - - private int adjustQueueSizeByMaxConsumerCount(String topic) { - int queueSize = this.deFiBrokerController.getDeFiBusBrokerConfig().getMinQueueNum(); - Set maxCidList = null; - Set topicConsumeByWho = this.deFiBrokerController.getConsumerManager().queryTopicConsumeByWho(topic); - for (String group : topicConsumeByWho) { - DeFiConsumerGroupInfo consumerGroupInfo = (DeFiConsumerGroupInfo) this.deFiBrokerController.getConsumerManager().getConsumerGroupInfo(group); - if (consumerGroupInfo != null && consumerGroupInfo.getMessageModel() == MessageModel.CLUSTERING) { - Set cidList = consumerGroupInfo.getClientIdBySubscription(topic); - if (cidList != null) { - int scaleSize = this.scaleQueueSize(cidList); - if (scaleSize >= queueSize) { - queueSize = scaleSize; - maxCidList = cidList; - } - } - } - } - log.info("calculate queue size by max consumer count, result: {} cidList: {}", queueSize, maxCidList); - return queueSize; - } - - private int scaleQueueSize(Set cidList) { - int scaleQueueSize = 0; - long nearbyClients = nearbyClients(cidList); - if (nearbyClients != 0) { - scaleQueueSize = new Long(nearbyClients).intValue(); - } else if (isAllClientsHaveNotIDCSurffix(cidList)) { - scaleQueueSize = cidList.size(); - } - return scaleQueueSize; - } - - private long nearbyClients(Set cidList) { - long locClient = cidList.stream().filter(new Predicate() { - @Override - public boolean test(String cid) { - String[] cidArr = cid.split(DeFiBusConstant.INSTANCE_NAME_SEPERATER); - if (cidArr.length > 2) { - String idc = cidArr[cidArr.length - 1]; - String clusterName = deFiBrokerController.getBrokerConfig().getBrokerClusterName(); - if (clusterName.toUpperCase().startsWith(idc) || - idc.startsWith(clusterName.toUpperCase())) { - return true; - } - } - return false; - } - }).count(); - return locClient; - } - - private boolean isAllClientsHaveNotIDCSurffix(Set cidList) { - long suffixClients = cidList.stream().filter(new Predicate() { - @Override - public boolean test(String cid) { - String[] cidArr = cid.split(DeFiBusConstant.INSTANCE_NAME_SEPERATER); - if (cidArr.length > 2) { - return true; - } - return false; - } - }).count(); - return suffixClients == 0; - } - - public void notifyWhenTopicConfigChange(String topic) { - Set topicConsumeByWho = this.deFiBrokerController.getConsumerManager().queryTopicConsumeByWho(topic); - for (String group : topicConsumeByWho) { - ConsumerGroupInfo consumerGroupInfo = this.deFiBrokerController.getConsumerManager().getConsumerGroupInfo(group); - if (consumerGroupInfo != null) { - List channelList = consumerGroupInfo.getAllChannel(); - for (Channel channel : channelList) { - this.deFiBrokerController.getDeFiBusBroker2Client().notifyWhenTopicConfigChange(channel, topic); - } - } - } - } - - private TopicConfig generateNewTopicConfig(TopicConfig topicConfigOld, int writeQueueSize, int readQueueSize) { - TopicConfig topicConfigNew = new TopicConfig(); - topicConfigNew.setPerm(topicConfigOld.getPerm()); - topicConfigNew.setTopicName(topicConfigOld.getTopicName()); - topicConfigNew.setWriteQueueNums(writeQueueSize); - topicConfigNew.setReadQueueNums(readQueueSize); - topicConfigNew.setOrder(topicConfigOld.isOrder()); - topicConfigNew.setTopicFilterType(topicConfigOld.getTopicFilterType()); - topicConfigNew.setTopicSysFlag(topicConfigOld.getTopicSysFlag()); - return topicConfigNew; - } - - public boolean isCanAdjustReadQueueSize(String topic, int scaleQueueSize) { - TopicConfig topicConfig = deFiBrokerController.getTopicConfigManager().getTopicConfigTable().get(topic); - if (topicConfig != null) { - for (int qId = scaleQueueSize; qId < topicConfig.getReadQueueNums(); qId++) { - long maxOffsetInConsumeQueue = deFiBrokerController.getMessageStore().getMaxOffsetInQueue(topic, qId); - long lastMsgTime = deFiBrokerController.getMessageStore().getMessageStoreTimeStamp(topic, qId, maxOffsetInConsumeQueue - 1); - long diff = System.currentTimeMillis() - lastMsgTime; - if (diff < 60 * 1000) { - log.info("adjust queue num, still new message in within {} ms, default threshold 60000 ms", System.currentTimeMillis() - lastMsgTime); - return false; - } - - Set topicConsumeByWho = this.deFiBrokerController.getConsumerManager().queryTopicConsumeByWho(topic); - Set groupInOffset = this.deFiBrokerController.getConsumerOffsetManager().whichGroupByTopic(topic); - if (groupInOffset != null && !groupInOffset.isEmpty()) { - topicConsumeByWho.addAll(groupInOffset); - } - boolean allConsumed = isAllMessageConsumed(topic, topicConsumeByWho, qId); - if (!allConsumed) { - return false; - } - } - return true; - } - return false; - } - - private boolean isAllMessageConsumed(String topic, Set groups, int queueId) { - for (String group : groups) { - long maxOffset = deFiBrokerController.getMessageStore().getMaxOffsetInQueue(topic, queueId); - long ackOffset = deFiBrokerController.getConsumeQueueManager().queryOffset(group, topic, queueId); - if (ackOffset < maxOffset) { - log.info("not finish consume message for topic: {} by group : {}, queueId: {}, ackOffset: {}, maxOffset: {}", - topic, group, queueId, ackOffset, maxOffset); - return false; - } - } - return true; - } - - public enum AdjustType { - INCREASE_QUEUE_NUM, - DECREASE_QUEUE_NUM - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiConsumerGroupInfo.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiConsumerGroupInfo.java deleted file mode 100644 index c76e492395..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiConsumerGroupInfo.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.client; - -import io.netty.channel.Channel; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArraySet; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.client.ConsumerGroupInfo; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiConsumerGroupInfo extends ConsumerGroupInfo { - private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - private final ConcurrentHashMap/*clientId*/> clientIdMap = new ConcurrentHashMap<>(); - - public DeFiConsumerGroupInfo(String groupName, ConsumeType consumeType, MessageModel messageModel, - ConsumeFromWhere consumeFromWhere) { - super(groupName, consumeType, messageModel, consumeFromWhere); - } - - public boolean registerClientId(final Set subList, final String clientId) { - boolean update = false; - - HashSet subTopicSet = new HashSet<>(); - for (SubscriptionData sub : subList) { - subTopicSet.add(sub.getTopic()); - if (clientIdMap.get(sub.getTopic()) == null) { - update = true; - CopyOnWriteArraySet clientIdSet = new CopyOnWriteArraySet<>(); - clientIdSet.add(clientId); - clientIdMap.put(sub.getTopic(), clientIdSet); - log.info("add clientId {} into {}", clientId, sub.getTopic()); - } else { - if (!clientIdMap.get(sub.getTopic()).contains(clientId)) { - update = true; - clientIdMap.get(sub.getTopic()).add(clientId); - log.info("add clientId {} into {}", clientId, sub.getTopic()); - } - } - } - - Iterator>> it = clientIdMap.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry> entry = it.next(); - String topic = entry.getKey(); - if (entry.getValue().contains(clientId)) { - if (!subTopicSet.contains(topic)) { - entry.getValue().remove(clientId); - update = true; - log.info("remove clientId {} from {}", clientId, topic); - if (entry.getValue().isEmpty()) { - it.remove(); - log.info("remove clientId, clientId set of {} is empty, remove it.", topic); - } - } - } - } - - return update; - } - - public Set unregisterClientId(final ClientChannelInfo clientChannelInfo) { - Set whichTopic = new HashSet<>(); - if (clientChannelInfo != null) { - String clientId = clientChannelInfo.getClientId(); - Iterator>> it = clientIdMap.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry> entry = it.next(); - if (entry.getValue().contains(clientId)) { - log.info("unregister clientId {} from {}", clientId, entry.getKey()); - entry.getValue().remove(clientId); - whichTopic.add(entry.getKey()); - if (entry.getValue().isEmpty()) { - log.info("unregister clientId, clientId set of {} is empty, remove it.", entry.getKey()); - it.remove(); - } - } - } - } - return whichTopic; - } - - @Override - public boolean doChannelCloseEvent(final String remoteAddr, final Channel channel) { - try { - final ClientChannelInfo channelInfo = getChannelInfoTable().get(channel); - if (channelInfo != null) { - unregisterClientId(channelInfo); - } - super.doChannelCloseEvent(remoteAddr, channel); - return true; - } catch (Exception ex) { - log.warn("doChannelCloseEvent fail.", ex); - return false; - } - } - - public Set findSubscribedTopicByClientId(final String clientId) { - Set result = new HashSet<>(); - Iterator>> it = clientIdMap.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry> entry = it.next(); - String topic = entry.getKey(); - if (entry.getValue().contains(clientId)) { - result.add(topic); - } - } - return result; - } - - public Set getClientIdBySubscription(String topic) { - if (topic != null) { - return clientIdMap.get(topic); - } - return new HashSet<>(); - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiConsumerManager.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiConsumerManager.java deleted file mode 100644 index 4da50e9a21..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiConsumerManager.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.client; - -import cn.webank.defibus.common.util.ReflectUtil; -import io.netty.channel.Channel; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.client.ConsumerGroupEvent; -import org.apache.rocketmq.broker.client.ConsumerGroupInfo; -import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener; -import org.apache.rocketmq.broker.client.ConsumerManager; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; -import org.apache.rocketmq.remoting.common.RemotingHelper; -import org.apache.rocketmq.remoting.common.RemotingUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiConsumerManager extends ConsumerManager { - private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - private static final long CHANNEL_EXPIRED_TIMEOUT = 1000 * 120; - private ConcurrentHashMap consumerTable = - new ConcurrentHashMap(1024); - private final ConsumerIdsChangeListener consumerIdsChangeListener; - private final AdjustQueueNumStrategy adjustQueueNumStrategy; - - public DeFiConsumerManager(final ConsumerIdsChangeListener consumerIdsChangeListener, - final AdjustQueueNumStrategy strategy) { - super(consumerIdsChangeListener); - this.consumerIdsChangeListener = consumerIdsChangeListener; - this.adjustQueueNumStrategy = strategy; - - try { - this.consumerTable = (ConcurrentHashMap) ReflectUtil.getSimpleProperty(ConsumerManager.class, this, "consumerTable"); - } catch (Exception ex) { - log.warn("init DeFiConsumerManager err.", ex); - } - } - - @Override - public boolean registerConsumer(final String group, final ClientChannelInfo clientChannelInfo, - ConsumeType consumeType, MessageModel messageModel, ConsumeFromWhere consumeFromWhere, - final Set subList, boolean isNotifyConsumerIdsChangedEnable) { - ConsumerGroupInfo consumerGroupInfo = this.consumerTable.get(group); - if (null == consumerGroupInfo) { - ConsumerGroupInfo tmp = new DeFiConsumerGroupInfo(group, consumeType, messageModel, consumeFromWhere); - ConsumerGroupInfo prev = this.consumerTable.putIfAbsent(group, tmp); - consumerGroupInfo = prev != null ? prev : tmp; - } - DeFiConsumerGroupInfo deFiConsumerGroupInfo = (DeFiConsumerGroupInfo) consumerGroupInfo; - - Set oldSub = deFiConsumerGroupInfo.findSubscribedTopicByClientId(clientChannelInfo.getClientId()); - boolean r1 = super.registerConsumer(group, clientChannelInfo, consumeType, messageModel, consumeFromWhere, subList, isNotifyConsumerIdsChangedEnable); - boolean r2 = deFiConsumerGroupInfo.registerClientId(subList, clientChannelInfo.getClientId()); - - if (r1 || r2) { - adjustQueueNum(oldSub, subList); - if (isNotifyConsumerIdsChangedEnable) { - this.consumerIdsChangeListener.handle(ConsumerGroupEvent.CHANGE, group, consumerGroupInfo.getAllChannel()); - } - } - - this.consumerIdsChangeListener.handle(ConsumerGroupEvent.REGISTER, group, subList); - return r1 || r2; - } - - @Override - public void unregisterConsumer(final String group, final ClientChannelInfo clientChannelInfo, - boolean isNotifyConsumerIdsChangedEnable) { - ConsumerGroupInfo consumerGroupInfo = this.consumerTable.get(group); - Set subscribeTopics = null; - if (null != consumerGroupInfo) { - DeFiConsumerGroupInfo deFiConsumerGroupInfo = (DeFiConsumerGroupInfo) consumerGroupInfo; - subscribeTopics = deFiConsumerGroupInfo.unregisterClientId(clientChannelInfo); - } - super.unregisterConsumer(group, clientChannelInfo, isNotifyConsumerIdsChangedEnable); - - if (subscribeTopics != null) { - for (String topic : subscribeTopics) { - adjustQueueNumStrategy.decreaseQueueNum(topic); - } - } - } - - @Override - public void doChannelCloseEvent(final String remoteAddr, final Channel channel) { - Set subscribeTopics = null; - Iterator> it = this.consumerTable.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry next = it.next(); - ConsumerGroupInfo info = next.getValue(); - if (info.getChannelInfoTable().get(channel) != null) { - ClientChannelInfo clientChannelInfo = info.getChannelInfoTable().get(channel); - DeFiConsumerGroupInfo deFiConsumerGroupInfo = (DeFiConsumerGroupInfo) info; - subscribeTopics = deFiConsumerGroupInfo.findSubscribedTopicByClientId(clientChannelInfo.getClientId()); - } - } - super.doChannelCloseEvent(remoteAddr, channel); - - if (subscribeTopics != null) { - for (String topic : subscribeTopics) { - adjustQueueNumStrategy.decreaseQueueNum(topic); - } - } - } - - @Override - public void scanNotActiveChannel() { - Iterator> it = this.consumerTable.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry next = it.next(); - String group = next.getKey(); - DeFiConsumerGroupInfo consumerGroupInfo = (DeFiConsumerGroupInfo) next.getValue(); - ConcurrentMap channelInfoTable = - consumerGroupInfo.getChannelInfoTable(); - - Iterator> itChannel = channelInfoTable.entrySet().iterator(); - while (itChannel.hasNext()) { - Map.Entry nextChannel = itChannel.next(); - ClientChannelInfo clientChannelInfo = nextChannel.getValue(); - long diff = System.currentTimeMillis() - clientChannelInfo.getLastUpdateTimestamp(); - if (diff > CHANNEL_EXPIRED_TIMEOUT) { - log.warn( - "SCAN: remove expired channel from ConsumerManager consumerTable. channel={}, consumerGroup={}", - RemotingHelper.parseChannelRemoteAddr(clientChannelInfo.getChannel()), group); - RemotingUtil.closeChannel(clientChannelInfo.getChannel()); - itChannel.remove(); - Set subscribeTopics = consumerGroupInfo.unregisterClientId(clientChannelInfo); - if (subscribeTopics != null) { - for (String topic : subscribeTopics) { - adjustQueueNumStrategy.decreaseQueueNum(topic); - } - } - } - } - - if (channelInfoTable.isEmpty()) { - log.warn( - "SCAN: remove expired channel from ConsumerManager consumerTable, all clear, consumerGroup={}", - group); - it.remove(); - } - } - } - - private void adjustQueueNum(final Set oldSub, final Set subList) { - for (SubscriptionData subscriptionData : subList) { - if (!oldSub.contains(subscriptionData.getTopic())) { - //new sub topic, increase queue num - adjustQueueNumStrategy.increaseQueueNum(subscriptionData.getTopic()); - } - } - for (String topic : oldSub) { - boolean stillSub = false; - for (SubscriptionData subscriptionData : subList) { - if (topic.equals(subscriptionData.getTopic())) { - stillSub = true; - break; - } - } - if (!stillSub) { - //no sub anymore, decrease queue num - adjustQueueNumStrategy.decreaseQueueNum(topic); - } - } - } - - public void notifyWhenTopicConfigChange(String topic) { - adjustQueueNumStrategy.notifyWhenTopicConfigChange(topic); - } - - public ConcurrentHashMap getConsumerTable() { - return this.consumerTable; - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiProducerManager.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiProducerManager.java deleted file mode 100644 index dcd681258d..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/client/DeFiProducerManager.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.client; - -import io.netty.channel.Channel; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.client.ProducerManager; -import org.apache.rocketmq.common.constant.LoggerName; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiProducerManager extends ProducerManager { - private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - - private final ConcurrentHashMap producerChannelTable - = new ConcurrentHashMap(); - private final Lock deleteChannelLock = new ReentrantLock(); - private static final long LockTimeoutMillis = 3000; - - @SuppressWarnings("unchecked") - public DeFiProducerManager() { - super(); - } - - @Override - public void scanNotActiveChannel() { - super.scanNotActiveChannel(); - } - - @Override - public void doChannelCloseEvent(final String remoteAddr, final Channel channel) { - super.doChannelCloseEvent(remoteAddr, channel); - if (channel == null) { - return; - } - String cid = null; - try { - try { - if (this.deleteChannelLock.tryLock(LockTimeoutMillis, TimeUnit.MILLISECONDS)) { - for (Map.Entry entry : producerChannelTable.entrySet()) { - Channel producerChannel = entry.getValue().getChannel(); - if (producerChannel.equals(channel)) { - cid = entry.getKey(); - break; - } - } - if (cid != null) { - producerChannelTable.remove(cid); - } - } - } finally { - this.deleteChannelLock.unlock(); - } - } catch (Exception e) { - LOG.warn("ProducerManager do delete client channel map lock timeout"); - } - } - - @Override - public void registerProducer(final String group, final ClientChannelInfo clientChannelInfo) { - super.registerProducer(group, clientChannelInfo); - producerChannelTable.put(clientChannelInfo.getClientId(), clientChannelInfo); - } - - @Override - public void unregisterProducer(final String group, final ClientChannelInfo clientChannelInfo) { - super.unregisterProducer(group, clientChannelInfo); - producerChannelTable.remove(clientChannelInfo.getClientId()); - } - - public ClientChannelInfo getClientChannel(String clientId) { - return producerChannelTable.get(clientId); - } - - public HashMap> getGroupChannelTable() { - return super.getGroupChannelTable(); - } - - public ConcurrentHashMap getProducerChannelTable() { - return producerChannelTable; - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ClientRebalanceResultManager.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ClientRebalanceResultManager.java deleted file mode 100644 index 7edd4f7954..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ClientRebalanceResultManager.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.consumequeue; - -import cn.webank.defibus.broker.DeFiBrokerController; -import java.util.HashMap; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.rocketmq.common.constant.LoggerName; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ClientRebalanceResultManager { - private final DeFiBrokerController deFiBrokerController; - private static final Logger log = LoggerFactory.getLogger(LoggerName.REBALANCE_LOCK_LOGGER_NAME); - - private final ConcurrentHashMap>> clientListenMap - = new ConcurrentHashMap<>(); - - public ClientRebalanceResultManager(DeFiBrokerController deFiBrokerController) { - this.deFiBrokerController = deFiBrokerController; - } - - public void updateListenMap(String group, String topic, int queueId, String clientId) { - ConcurrentHashMap> groupMap = clientListenMap.get(group); - if (groupMap == null) { - groupMap = new ConcurrentHashMap>(); - clientListenMap.put(group, groupMap); - } - ConcurrentHashMap topicMap = groupMap.get(topic); - if (topicMap == null) { - topicMap = new ConcurrentHashMap<>(); - groupMap.put(topic, topicMap); - } - String old = topicMap.put(queueId, clientId); - if (!clientId.equals(old)) { - log.info("update client listen map. new: {} old: {} {} {} {}", - clientId, old, group, topic, queueId); - } - } - - public HashMap getTopicListenMap(String group, String topic) { - HashMap listenMap = new HashMap<>(); - if (clientListenMap.get(group) != null && clientListenMap.get(group).get(topic) != null) { - ConcurrentHashMap queueMap = clientListenMap.get(group).get(topic); - for (Integer queueId : queueMap.keySet()) { - listenMap.put(queueId, queueMap.get(queueId)); - } - } - return listenMap; - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueManager.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueManager.java deleted file mode 100644 index dda111388d..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueManager.java +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.consumequeue; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.broker.client.DeFiConsumerGroupInfo; -import cn.webank.defibus.broker.client.DeFiConsumerManager; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.protocol.DeFiBusTopicConfig; -import io.netty.channel.Channel; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.client.ConsumerGroupInfo; -import org.apache.rocketmq.common.MQVersion; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.common.protocol.body.ResetOffsetBody; -import org.apache.rocketmq.common.protocol.header.ResetOffsetRequestHeader; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ConsumeQueueManager { - private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - - private ConcurrentMap tqMaxAccumulated = new ConcurrentHashMap<>();//accumulated depth for each queue - private static ConsumeQueueManager deFiQueueManager = new ConsumeQueueManager(); - private static final String TOPIC_GROUP_SEPARATOR = "@"; - private ConcurrentMap> lastDeliverOffsetTable = - new ConcurrentHashMap>(512); - private static final double MIN_CLEAN_THRESHOLD = 0.7; - private static final double RESERVE_PERCENT = 0.65; - - private DeFiBrokerController deFiBrokerController; - - private ConsumeQueueManager() { - } - - public void scanUnsubscribedTopic() { - try { - ConcurrentMap> offsetTable = - this.getBrokerController().getConsumerOffsetManager().getOffsetTable(); - Iterator>> it = this.lastDeliverOffsetTable.entrySet().iterator(); - - while (it.hasNext()) { - Map.Entry> next = it.next(); - String topicAtGroup = next.getKey(); - - if (offsetTable.get(topicAtGroup) == null) { - it.remove(); - LOG.warn("scanUnsubscribedTopic remove topic lastDeliverOffsetTable, {}", topicAtGroup); - } - } - } catch (Exception ex) { - LOG.info("scanUnsubscribedTopic fail.", ex); - } - } - - public DeFiBrokerController getBrokerController() { - return deFiBrokerController; - } - - public static ConsumeQueueManager onlyInstance() { - return deFiQueueManager; - } - - public void recordLastDeliverOffset(final String group, final String topic, final int queueId, final long offset) { - String key = topic + TOPIC_GROUP_SEPARATOR + group; - this.lastDeliverOffsetTable.putIfAbsent(key, new ConcurrentHashMap(32)); - ConcurrentMap map = this.lastDeliverOffsetTable.get(key); - map.put(queueId, offset); - } - - public long queryDeliverOffset(final String group, final String topic, final int queueId) { - String key = topic + TOPIC_GROUP_SEPARATOR + group; - ConcurrentMap map = this.lastDeliverOffsetTable.get(key); - if (null != map) { - Long ackOffset = this.getBrokerController().getConsumerOffsetManager().queryOffset(group, topic, queueId); - Long lastDeliverOffset = map.get(queueId); - if (ackOffset == null || lastDeliverOffset == null) - return -1; - - if (lastDeliverOffset < ackOffset) { - map.put(queueId, ackOffset); - } - return map.get(queueId); - } - return -1; - } - - public long getMaxQueueDepth(String topic) { - return this.deFiBrokerController.getExtTopicConfigManager().selectExtTopicConfig(topic).getMaxQueueDepth(); - } - - public void setBrokerController(DeFiBrokerController brokerController) { - this.deFiBrokerController = brokerController; - } - - //update accumulated depth - public void load() { - deFiBrokerController.scheduleTaskAtFixedRate(() -> { - LOG.debug("start to scheduleTask query ConsumeQueueWaterMark"); - Iterator> iterator = tqMaxAccumulated.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - TopicQueue tq = entry.getKey(); - try { - TopicConfig topicConfig = this.getBrokerController().getTopicConfigManager().selectTopicConfig(tq.topic); - if (topicConfig == null) { - iterator.remove(); - LOG.info("scan queue depth. topicConfig is null, remove {}", entry.getValue()); - } else if (tq.queueId >= topicConfig.getReadQueueNums()) { - iterator.remove(); - LOG.info("scan queue depth. qId is invalid, topicConfig.ReadQueueNums={}, remove {}", topicConfig.getReadQueueNums(), entry.getValue()); - } else { - ConsumeQueueWaterMark consumeQueueWaterMark = ConsumeQueueManager.this.calculateMinAccumulated(tq.topic, tq.queueId); - if (consumeQueueWaterMark != null) { - ConsumeQueueWaterMark oldCqWm = tqMaxAccumulated.put(tq, consumeQueueWaterMark); - if (LOG.isDebugEnabled()) { - if (!consumeQueueWaterMark.equals(oldCqWm)) { - LOG.debug("[UPDATE ConsumeQueueWaterMark] Updated for {}, -> {}", tq, consumeQueueWaterMark); - } else { - LOG.debug("[UPDATE ConsumeQueueWaterMark] Does not changed for {}, {}, {} ", tq, oldCqWm, consumeQueueWaterMark); - } - } - } else { - LOG.warn("ConsumeQueueWaterMark is null for {} , remove it from tqMaxAccumulated", tq); - } - } - } catch (Exception e) { - LOG.error("unknow error when update ConsumeQueueWaterMark for " + tq, e); - } - } - }, 1000, deFiBrokerController.getDeFiBusBrokerConfig().getDepthCheckInterval()); - } - - public ConsumeQueueWaterMark getMinAccumulated(String topic, int queueId) { - TopicQueue tq = new TopicQueue(topic, queueId); - //calculate the accumulated depth for the first time, or get the value in other case - if (!tqMaxAccumulated.containsKey(tq)) { - ConsumeQueueWaterMark consumeQueueWaterMark = calculateMinAccumulated(topic, queueId); - if (consumeQueueWaterMark != null) { - tqMaxAccumulated.putIfAbsent(tq, consumeQueueWaterMark); - LOG.debug("ConsumeQueueWaterMark is put first time : {}", consumeQueueWaterMark); - } else { - LOG.warn("[BUG]calculateMaxAccumulated returns null for {}-{}", topic, queueId); - } - } - - return tqMaxAccumulated.get(tq); - } - - //use as key in tqMaxAccumulated - private static class TopicQueue { - private final String topic; - private final int queueId; - - private TopicQueue(String topic, int queueId) { - this.topic = topic; - this.queueId = queueId; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (!(o instanceof TopicQueue)) - return false; - - TopicQueue that = (TopicQueue) o; - - if (queueId != that.queueId) - return false; - return topic.equals(that.topic); - } - - @Override - public int hashCode() { - int result = topic.hashCode(); - result = 31 * result + queueId; - return result; - } - - @Override - public String toString() { - return "TopicQueue{" + - "topic='" + topic + '\'' + - ", queueId=" + queueId + - '}'; - } - } - - public ConsumeQueueWaterMark calculateMinAccumulated(String topic, int queueId) { - Set subscribedGroups = deFiBrokerController.getConsumerOffsetManager().whichGroupByTopic(topic); - Set checkGroups = new HashSet(); - DeFiBusTopicConfig deFiBusTopicConfig = this.getBrokerController().getExtTopicConfigManager().selectExtTopicConfig(topic); - long maxDepth = deFiBusTopicConfig != null ? deFiBusTopicConfig.getMaxQueueDepth() : DeFiBusTopicConfig.DEFAULT_QUEUE_LENGTH; - double highWatermark = deFiQueueManager.getBrokerController().getDeFiBusBrokerConfig().getQueueDepthHighWatermark(); - ConsumeQueueWaterMark minDepth = null; - long maxOffset = this.deFiBrokerController.getMessageStore().getMaxOffsetInQueue(topic, queueId); - LOG.debug("calculateMinAccumulated topic:{},queueID:{},subscribedGroups{}", topic, queueId, subscribedGroups); - - //calculate accumulated depth for each consumer group - for (String consumerGroup : subscribedGroups) { - if (topic.startsWith(MixAll.DLQ_GROUP_TOPIC_PREFIX) || topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX) || consumerGroup.startsWith(DeFiBusConstant.EXT_CONSUMER_GROUP)) { - continue; - } - - DeFiConsumerManager consumerManager = (DeFiConsumerManager) this.deFiBrokerController.getConsumerManager(); - DeFiConsumerGroupInfo deFiConsumerGroupInfo = (DeFiConsumerGroupInfo) consumerManager.getConsumerGroupInfo(consumerGroup); - - //ignore offline consumer group - if (deFiConsumerGroupInfo == null || deFiConsumerGroupInfo.getClientIdBySubscription(topic) == null - || deFiConsumerGroupInfo.getClientIdBySubscription(topic).isEmpty()) { - continue; - } - long ackOffset = queryOffset(consumerGroup, topic, queueId); - long thisDepth = maxOffset - ackOffset; - long lastDeliverOffset = queryDeliverOffset(consumerGroup, topic, queueId); - - if (lastDeliverOffset >= 0) { - thisDepth = maxOffset - lastDeliverOffset; - } - - checkGroups.add(consumerGroup); - ConsumeQueueWaterMark depthOfThisGroup = new ConsumeQueueWaterMark(consumerGroup, topic, queueId, lastDeliverOffset, thisDepth); - if (minDepth == null) { - minDepth = depthOfThisGroup; - } else if (depthOfThisGroup.getAccumulated() < minDepth.getAccumulated()) { - minDepth = depthOfThisGroup; - } - - LOG.debug("topic:{},queueID:{},depthOfThisGroup:{} ,minDepth:{}", topic, queueId, depthOfThisGroup, minDepth); - - if (depthOfThisGroup.getAccumulated() > maxDepth) { - LOG.error("Quota exceed 100% for topic:{},queueID:{},depthOfThisGroup:{} ,maxDepth:{} maxOffset: {} ackOffset: {}" - , topic, queueId, depthOfThisGroup, maxDepth, maxOffset, ackOffset); - } else if (depthOfThisGroup.getAccumulated() > maxDepth * highWatermark) { - LOG.error("Quota exceed {}% for topic:{}, queueID:{}, depthOfThisGroup:{}, maxDepth:{} maxOffset: {} ackOffset: {}" - , highWatermark * 100, topic, queueId, depthOfThisGroup, maxDepth, maxOffset, ackOffset); - } - } - - if (checkGroups.isEmpty()) { - minDepth = new ConsumeQueueWaterMark("NO_ONLINE_GROUP", topic, queueId, maxOffset, 0); - } - - for (String consumerGroup : checkGroups) { - long thisDepth = maxOffset - queryOffset(consumerGroup, topic, queueId); - long lastDeliverOffset = queryDeliverOffset(consumerGroup, topic, queueId); - - if (lastDeliverOffset >= 0) { - thisDepth = maxOffset - lastDeliverOffset; - } - - if (thisDepth > maxDepth) { - if (checkGroups.size() > 1 && minDepth.getAccumulated() < maxDepth * MIN_CLEAN_THRESHOLD) { - autoUpdateDepth(consumerGroup, topic, queueId, maxDepth, maxOffset); - } - } - } - return minDepth; - } - - private void autoUpdateDepth(String consumerGroup, String topic, int queueId, long maxDepth, long maxOffset) { - if (!this.deFiBrokerController.getDeFiBusBrokerConfig().isAutoUpdateDepth()) { - return; - } - - DeFiConsumerManager consumerManager = this.deFiBrokerController.getConsumerManager(); - DeFiConsumerGroupInfo deFiConsumerGroupInfo = (DeFiConsumerGroupInfo) consumerManager.getConsumerGroupInfo(consumerGroup); - - //ignore offline consumer group - if (deFiConsumerGroupInfo == null || deFiConsumerGroupInfo.getClientIdBySubscription(topic) == null - || deFiConsumerGroupInfo.getClientIdBySubscription(topic).isEmpty()) { - return; - } - - long lastDeliverOffset = queryDeliverOffset(consumerGroup, topic, queueId); - long nowDeliverOffset = maxOffset - (long) (maxDepth * RESERVE_PERCENT); - - this.deFiBrokerController.getConsumeQueueManager().recordLastDeliverOffset(consumerGroup, topic, queueId, nowDeliverOffset); - LOG.warn("autoUpdateDepth for {}, topic: {}, queueId: {}, maxOffset:{}, lastDeliverOffset: {}, maxQueueDepth:{}, nowDeliverOffset: {}" - , consumerGroup, topic, queueId, maxOffset, lastDeliverOffset, maxDepth, nowDeliverOffset); - - if (this.deFiBrokerController.getConsumerOffsetManager().queryOffset(consumerGroup, topic, queueId) != -1) { - this.deFiBrokerController.getConsumerOffsetManager().commitOffset("resetByBroker", consumerGroup, topic, queueId, nowDeliverOffset); - } else { - LOG.warn("no consumerOffset in consumerOffsetManager, skip reset consumerOffset. group={}, topic={}, queueId={}", consumerGroup, topic, queueId); - } - - resetOffsetOnClient(consumerGroup, topic, queueId, maxDepth, maxOffset); - } - - public long queryOffset(final String group, final String topic, final int queueId) { - String key = topic + TOPIC_GROUP_SEPARATOR + group; - ConcurrentMap map = this.deFiBrokerController.getConsumerOffsetManager().getOffsetTable().get(key); - if (null != map) { - Long offset = map.get(queueId); - if (offset != null) - return offset; - } - - return -1; - } - - public void resetOffsetOnClient(String consumerGroup, String topic, int queueId, long maxDepth, long maxOffset) { - long nowDeliverOffset = maxOffset - (long) (maxDepth * RESERVE_PERCENT); - Map offsetTable = new HashMap(); - TopicConfig topicConfig = deFiBrokerController.getTopicConfigManager().selectTopicConfig(topic); - - if (queueId < topicConfig.getWriteQueueNums()) { - MessageQueue mq = new MessageQueue(topic, deFiBrokerController.getBrokerConfig().getBrokerName(), queueId); - offsetTable.put(mq, nowDeliverOffset); - } - - ResetOffsetRequestHeader requestHeader = new ResetOffsetRequestHeader(); - requestHeader.setTopic(topic); - requestHeader.setGroup(consumerGroup); - requestHeader.setTimestamp(0); - RemotingCommand request = - RemotingCommand.createRequestCommand(RequestCode.RESET_CONSUMER_CLIENT_OFFSET, requestHeader); - - ResetOffsetBody body = new ResetOffsetBody(); - body.setOffsetTable(offsetTable); - request.setBody(body.encode()); - - ConsumerGroupInfo consumerGroupInfo = - this.deFiBrokerController.getConsumerManager().getConsumerGroupInfo(consumerGroup); - - if (consumerGroupInfo != null && !consumerGroupInfo.getAllChannel().isEmpty()) { - ConcurrentMap channelInfoTable = - consumerGroupInfo.getChannelInfoTable(); - for (Map.Entry entry : channelInfoTable.entrySet()) { - int version = entry.getValue().getVersion(); - if (version >= MQVersion.Version.V3_0_7_SNAPSHOT.ordinal()) { - try { - this.deFiBrokerController.getRemotingServer().invokeOneway(entry.getKey(), request, 5000); - LOG.info("[reset-offset] reset offset success. topic={}, group={}, clientId={}", - topic, consumerGroup, entry.getValue().getClientId()); - } catch (Exception e) { - LOG.warn("[reset-offset] reset offset failed. topic={}, group={}", - new Object[] {topic, consumerGroup}, e); - } - } - } - } else { - String errorInfo = - String.format("Consumer not online, so can not reset offset, Group: %s Topic: %s Timestamp: %d", - requestHeader.getGroup(), - requestHeader.getTopic(), - requestHeader.getTimestamp()); - LOG.info(errorInfo); - return; - } - } -} - diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueWaterMark.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueWaterMark.java deleted file mode 100644 index 93afb47d0b..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueWaterMark.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.consumequeue; - -public class ConsumeQueueWaterMark { - private String consumerGroup; - private final String topic; - private final int queueId; - private long lastDeliverOffset; - private long accumulated; - - public ConsumeQueueWaterMark(String consumerGroup, String topic, int queueId, long lastDeliverOffset, - long accumulated) { - this.consumerGroup = consumerGroup; - this.topic = topic; - this.queueId = queueId; - this.lastDeliverOffset = lastDeliverOffset; - this.accumulated = accumulated; - } - - public ConsumeQueueWaterMark(String consumerGroup, String topic, int queueId) { - this.consumerGroup = consumerGroup; - this.topic = topic; - this.queueId = queueId; - } - - public ConsumeQueueWaterMark(String topic, int queueId) { - this.topic = topic; - this.queueId = queueId; - } - - public void setLastDeliverOffset(long lastDeliverOffset) { - this.lastDeliverOffset = lastDeliverOffset; - } - - public void setAccumulated(long accumulated) { - this.accumulated = accumulated; - } - - public long getAccumulated() { - return accumulated; - } - - public String getConsumerGroup() { - return consumerGroup; - } - - public String getTopic() { - return topic; - } - - public int getQueueId() { - return queueId; - } - - public long getLastDeliverOffset() { - return lastDeliverOffset; - } - - @Override - public String toString() { - return "ConsumeQueueWaterMark{" + - "consumerGroup='" + consumerGroup + '\'' + - ", topic='" + topic + '\'' + - ", queueId=" + queueId + - ", lastDeliverOffset=" + lastDeliverOffset + - ", accumulated=" + accumulated + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (!(o instanceof ConsumeQueueWaterMark)) - return false; - - ConsumeQueueWaterMark that = (ConsumeQueueWaterMark) o; - - if (queueId != that.queueId) - return false; - if (lastDeliverOffset != that.lastDeliverOffset) - return false; - if (accumulated != that.accumulated) - return false; - if (!consumerGroup.equals(that.consumerGroup)) - return false; - return topic.equals(that.topic); - } - - @Override - public int hashCode() { - int result = consumerGroup.hashCode(); - result = 31 * result + topic.hashCode(); - result = 31 * result + queueId; - result = 31 * result + (int) (lastDeliverOffset ^ (lastDeliverOffset >>> 32)); - result = 31 * result + (int) (accumulated ^ (accumulated >>> 32)); - return result; - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/MessageRedirectManager.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/MessageRedirectManager.java deleted file mode 100644 index 092c988c6c..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/consumequeue/MessageRedirectManager.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.consumequeue; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.broker.DeFiBrokerPathConfigHelper; -import com.alibaba.fastjson.JSON; -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.common.ConfigManager; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MessageRedirectManager { - private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - private final ConcurrentHashMap> redirectMap = new ConcurrentHashMap<>(); - private final DeFiBrokerController deFiBrokerController; - private Random random = new Random(); - RedirectConfigManager configManager; - - public MessageRedirectManager(DeFiBrokerController deFiBrokerController) { - this.deFiBrokerController = deFiBrokerController; - configManager = new RedirectConfigManager(); - configManager.load(); - } - - public void shutdown() { - if (configManager != null) { - configManager.persist(); - } - } - - public RedirectResult redirectMessageToWhichQueue(SendMessageRequestHeader requestHeader, String flag) { - if (hasRedirectConfig(flag, requestHeader.getTopic())) { - ArrayList grayQueueId = findCandidateQueueId(flag, requestHeader.getTopic()); - if (grayQueueId.size() > 0) { - int redirectQueueId = grayQueueId.get(Math.abs(random.nextInt()) % grayQueueId.size()); - return new RedirectResult(RedirectStates.REDIRECT_OK, redirectQueueId); - } else { - return new RedirectResult(RedirectStates.NO_INSTANCE_FOUND, -1); - } - } else { - return new RedirectResult(RedirectStates.NO_REDIRECT_CONFIG, -1); - } - } - - private boolean hasRedirectConfig(String flag, String topic) { - if (flag != null && topic != null) { - return redirectMap.get(topic) != null - && redirectMap.get(topic).get(flag) != null - && redirectMap.get(topic).get(flag).getIps().size() > 0; - } - return false; - } - - private ArrayList findCandidateQueueId(String flag, String topic) { - ArrayList candidateQueueId = new ArrayList<>(); - if (flag != null) { - ConcurrentHashMap flagMap = redirectMap.get(topic); - if (flagMap != null) { - RedirectConfItem confItems = flagMap.get(flag); - if (confItems != null) { - String groupName = confItems.getConsumerGroup(); - HashMap cidMap = deFiBrokerController.getClientRebalanceResultManager().getTopicListenMap(groupName, topic); - for (Integer qId : cidMap.keySet()) { - String cid = cidMap.get(qId); - if (StringUtils.isNotEmpty(cid)) { - String ip = StringUtils.split(cid, "@")[0]; - if (confItems.getIps().contains(ip)) { - candidateQueueId.add(qId); - } - } - } - } - } - } - return candidateQueueId; - } - - public void updateConfigs(List list) { - List old = getConfigList(); - for (RedirectConfItem item : list) { - ConcurrentHashMap flagMap = redirectMap.get(item.getTopic()); - if (flagMap == null) { - flagMap = new ConcurrentHashMap<>(); - redirectMap.put(item.getTopic(), flagMap); - } - RedirectConfItem oldItem = flagMap.put(item.getRedirectFlag(), item); - if (oldItem != null && !oldItem.equals(item)) { - log.info("update redirect message config, old: {} new: {}", oldItem, item); - } - } - } - - public List getConfigList() { - List list = new ArrayList<>(); - for (String topic : redirectMap.keySet()) { - for (String flag : redirectMap.get(topic).keySet()) { - list.add(redirectMap.get(topic).get(flag)); - } - } - return list; - } - - public static class RedirectConfItem { - String topic; - String consumerGroup; - String redirectFlag; - Set ips = new HashSet<>(); - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } - - public String getConsumerGroup() { - return consumerGroup; - } - - public void setConsumerGroup(String consumerGroup) { - this.consumerGroup = consumerGroup; - } - - public String getRedirectFlag() { - return redirectFlag; - } - - public void setRedirectFlag(String redirectFlag) { - this.redirectFlag = redirectFlag; - } - - public Set getIps() { - return ips; - } - - public void setIps(Set ips) { - this.ips = ips; - } - - public boolean equals(RedirectConfItem obj) { - return obj != null && this.topic.equals(obj.getTopic()) - && this.redirectFlag.equals(obj.getRedirectFlag()) - && this.consumerGroup.equals(obj.getConsumerGroup()) - && this.ips.equals(obj.getIps()); - } - - @Override public String toString() { - return "RedirectConfItem{" + - "topic='" + topic + '\'' + - ", consumerGroup='" + consumerGroup + '\'' + - ", redirectFlag='" + redirectFlag + '\'' + - ", ips=" + ips + - '}'; - } - } - - public class RedirectResult { - RedirectStates states; - int redirectQueueId; - - public RedirectResult(RedirectStates states, int redirectQueueId) { - this.states = states; - this.redirectQueueId = redirectQueueId; - } - - public RedirectStates getStates() { - return states; - } - - public int getRedirectQueueId() { - return redirectQueueId; - } - } - - public enum RedirectStates { - REDIRECT_OK, - NO_REDIRECT_CONFIG, - NO_INSTANCE_FOUND - } - - public class RedirectConfigManager extends ConfigManager { - private List configList = new ArrayList<>(); - - @Override public String encode() { - return encode(false); - } - - @Override public String configFilePath() { - String rootDir = DeFiBrokerPathConfigHelper.getBrokerConfigPath(); - return rootDir + File.separator + "messageRedirectConfig.json"; - } - - @Override public void decode(String jsonString) { - if (jsonString != null) { - List list = JSON.parseArray(jsonString, RedirectConfItem.class); - if (list != null) { - updateConfigs(list); - } - } - } - - @Override public String encode(boolean prettyFormat) { - return JSON.toJSONString(getConfigList(), prettyFormat); - } - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/monitor/QueueListeningMonitor.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/monitor/QueueListeningMonitor.java deleted file mode 100644 index 9ed0702f2e..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/monitor/QueueListeningMonitor.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.monitor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import io.netty.channel.Channel; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.client.ConsumerGroupInfo; -import org.apache.rocketmq.common.MQVersion; -import org.apache.rocketmq.common.ThreadFactoryImpl; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.body.ConsumerRunningInfo; -import org.apache.rocketmq.common.protocol.header.GetConsumerRunningInfoRequestHeader; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; -import org.apache.rocketmq.remoting.common.RemotingHelper; -import org.apache.rocketmq.remoting.exception.RemotingTimeoutException; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class QueueListeningMonitor { - private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - private final DeFiBrokerController deFiBrokerController; - private final ScheduledExecutorService scheduledExecutorService; - - public QueueListeningMonitor(DeFiBrokerController deFiBrokerController) { - this.deFiBrokerController = deFiBrokerController; - scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl( - "ScanQueueListeningScheduledThread")); - } - - public void start() { - scheduledExecutorService.scheduleAtFixedRate( - () -> { - try { - scanQueueMissListening(); - } catch (Throwable e) { - log.warn("scan queue miss listening : ", e); - } - }, - deFiBrokerController.getDeFiBusBrokerConfig().getCheckQueueListeningPeriod(), - deFiBrokerController.getDeFiBusBrokerConfig().getCheckQueueListeningPeriod(), - TimeUnit.MINUTES); - } - - public void shutdown() { - scheduledExecutorService.shutdown(); - } - - private void scanQueueMissListening() { - if (!deFiBrokerController.getDeFiBusBrokerConfig().isCheckQueueListening()) { - return; - } - - for (Map.Entry entry : deFiBrokerController.getConsumerManager().getConsumerTable().entrySet()) { - String groupName = entry.getKey(); - ConsumerGroupInfo groupInfo = entry.getValue(); - if (groupInfo.getMessageModel().equals(MessageModel.BROADCASTING)) { - continue; - } - - boolean rebalanceRecently = false; - - Map listenQueueCountMap = new HashMap<>(); - - groupLoop: - for (Channel channel : groupInfo.getChannelInfoTable().keySet()) { - ClientChannelInfo clientChannelInfo = groupInfo.getChannelInfoTable().get(channel); - - if (clientChannelInfo.getVersion() < MQVersion.Version.V3_1_8_SNAPSHOT.ordinal()) { - log.warn("The Consumer <{}> Version <{}> too low to finish, please upgrade it to V3_1_8_SNAPSHOT", - clientChannelInfo.getClientId(), - MQVersion.getVersionDesc(clientChannelInfo.getVersion())); - continue; - } - - ConsumerRunningInfo runningInfo = callConsumer(groupName, clientChannelInfo); - - if (runningInfo == null) { - log.warn("[MISS LISTENING] clientId <{}> group <{}>, runningInfo is null", clientChannelInfo.getClientId(), groupName); - continue; - } - - for (SubscriptionData subscriptionData : runningInfo.getSubscriptionSet()) { - if (System.currentTimeMillis() - subscriptionData.getSubVersion() < 2 * 60 * 1000) { - rebalanceRecently = true; - break groupLoop; - } - } - - //miss listening when subscribing a topic but not listening any queue - if (runningInfo.getSubscriptionSet() != null && !runningInfo.getSubscriptionSet().isEmpty() && runningInfo.getMqTable().isEmpty()) { - log.warn("[MISS LISTENING] clientId <{}> group <{}>, listening none queue", clientChannelInfo.getClientId(), groupName); - continue; - } - - String analyzeProcessQueue = ConsumerRunningInfo.analyzeProcessQueue(clientChannelInfo.getClientId(), runningInfo); - if (StringUtils.isNotEmpty(analyzeProcessQueue)) { - log.warn("[BLOCKED SUBSCRIBER] " + analyzeProcessQueue); - } - - Set mqSet = runningInfo.getMqTable().keySet(); - for (MessageQueue mq : mqSet) { - if (!mq.getBrokerName().equals(this.deFiBrokerController.getBrokerConfig().getBrokerName())) { - continue; - } - Integer listenQueueNum = listenQueueCountMap.get(mq.getTopic()); - if (listenQueueNum == null) - listenQueueNum = 0; - - listenQueueCountMap.put(mq.getTopic(), listenQueueNum + 1); - } - } - - //skip if do rebalance in 2 min - if (!rebalanceRecently) { - for (String topic : listenQueueCountMap.keySet()) { - TopicConfig topicConfig = this.deFiBrokerController.getTopicConfigManager().selectTopicConfig(topic); - if (null == topicConfig) { - continue; - } - int queueNum = topicConfig.getReadQueueNums(); - int listeningNum = listenQueueCountMap.get(topic); - if (queueNum != listeningNum) { - log.warn("[MISS LISTENING] group <{}>, topic={}, queueNum={}, listeningNum={}", groupName, topic, queueNum, listeningNum); - } - } - } - - } - } - - private ConsumerRunningInfo callConsumer(String groupName, ClientChannelInfo clientChannelInfo) { - - String clientId = clientChannelInfo.getClientId(); - - GetConsumerRunningInfoRequestHeader requestHeader = new GetConsumerRunningInfoRequestHeader(); - requestHeader.setConsumerGroup(groupName); - requestHeader.setClientId(clientId); - requestHeader.setJstackEnable(false); - - try { - - RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_CONSUMER_RUNNING_INFO, requestHeader); - - RemotingCommand response = this.deFiBrokerController.getBroker2Client().callClient(clientChannelInfo.getChannel(), request); - assert response != null; - switch (response.getCode()) { - case ResponseCode.SUCCESS: { - byte[] body = response.getBody(); - if (body != null) { - return ConsumerRunningInfo.decode(body, ConsumerRunningInfo.class); - } - } - default: - break; - } - - } catch (RemotingTimeoutException e) { - log.warn("consumer <{}> <{}> Timeout: {}", groupName, clientId, RemotingHelper.exceptionSimpleDesc(e)); - } catch (Exception e) { - log.warn("invoke consumer <{}> <{}> Exception: {}", groupName, clientId, RemotingHelper.exceptionSimpleDesc(e)); - } - - log.warn("consumer <{}> <{}> running info result null", groupName, clientId); - return null; - } - -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/net/DeFiBusBroker2Client.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/net/DeFiBusBroker2Client.java deleted file mode 100644 index 37827d84b5..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/net/DeFiBusBroker2Client.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.net; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.defibus.common.protocol.header.NotifyTopicChangedRequestHeader; -import cn.webank.defibus.common.protocol.header.ReplyMessageRequestHeader; -import io.netty.channel.Channel; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.message.MessageExt; -import org.apache.rocketmq.remoting.exception.RemotingTimeoutException; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusBroker2Client { - private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - private final DeFiBrokerController deFiBrokerController; - - public DeFiBusBroker2Client(DeFiBrokerController deFiBrokerController) { - this.deFiBrokerController = deFiBrokerController; - } - - public boolean pushRRReplyMessageToClient(final Channel channel, - ReplyMessageRequestHeader replyMessageRequestHeader, MessageExt msgInner) { - replyMessageRequestHeader.setSysFlag(msgInner.getSysFlag()); - RemotingCommand request = RemotingCommand.createRequestCommand(DeFiBusRequestCode.PUSH_RR_REPLY_MSG_TO_CLIENT, replyMessageRequestHeader); - request.markOnewayRPC(); - request.setBody(msgInner.getBody()); - try { - this.deFiBrokerController.getRemotingServer().invokeOneway(channel, request, 3000); - } catch (RemotingTimeoutException e) { - LOG.warn("push reply message to client failed ", e); - try { - this.deFiBrokerController.getRemotingServer().invokeOneway(channel, request, 3000); - } catch (Exception sube) { - LOG.warn("push reply message to client failed again ", sube); - return false; - } - } catch (Exception e) { - LOG.warn("push reply message to client failed ", e); - return false; - } - - return true; - } - - public void notifyWhenTopicConfigChange(final Channel channel, String topic) { - NotifyTopicChangedRequestHeader notifyTopicChangedRequestHeader = new NotifyTopicChangedRequestHeader(); - notifyTopicChangedRequestHeader.setTopic(topic); - RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(DeFiBusRequestCode.NOTIFY_WHEN_TOPIC_CONFIG_CHANGE, notifyTopicChangedRequestHeader); - remotingCommand.markOnewayRPC(); - try { - this.deFiBrokerController.getRemotingServer().invokeOneway(channel, remotingCommand, 500); - } catch (Exception e) { - LOG.warn("notify consumer <" + channel + "> topic config change fail.", e); - } - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/plugin/DeFiPluginMessageStore.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/plugin/DeFiPluginMessageStore.java deleted file mode 100644 index fee67360c0..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/plugin/DeFiPluginMessageStore.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.plugin; - -import cn.webank.defibus.broker.consumequeue.ConsumeQueueManager; -import cn.webank.defibus.common.DeFiBusConstant; -import org.apache.rocketmq.broker.plugin.AbstractPluginMessageStore; -import org.apache.rocketmq.broker.plugin.MessageStorePluginContext; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.message.MessageAccessor; -import org.apache.rocketmq.common.message.MessageDecoder; -import org.apache.rocketmq.common.message.MessageExtBatch; -import org.apache.rocketmq.store.GetMessageResult; -import org.apache.rocketmq.store.GetMessageStatus; -import org.apache.rocketmq.store.MessageExtBrokerInner; -import org.apache.rocketmq.store.MessageFilter; -import org.apache.rocketmq.store.MessageStore; -import org.apache.rocketmq.store.PutMessageResult; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiPluginMessageStore extends AbstractPluginMessageStore { - private final static Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - protected MessageStore next = null; - protected MessageStorePluginContext context; - private ConsumeQueueManager deFiQueueManager = ConsumeQueueManager.onlyInstance(); - private final PluginStoreStatService pluginStoreStatService = new PluginStoreStatService(); - private final String clusterName = deFiQueueManager.getBrokerController().getBrokerConfig().getBrokerClusterName(); - private final String brokerName = deFiQueueManager.getBrokerController().getBrokerConfig().getBrokerName(); - - public DeFiPluginMessageStore(MessageStorePluginContext context, MessageStore next) { - super(context, next); - this.next = next; - this.context = context; - } - - @Override - public void start() throws Exception { - pluginStoreStatService.start(); - next.start(); - } - - @Override - public void shutdown() { - next.shutdown(); - pluginStoreStatService.shutdown(); - } - - @Override - public PutMessageResult putMessage(MessageExtBrokerInner msg) { - long startTime = System.nanoTime(); - MessageAccessor.putProperty(msg, DeFiBusConstant.PROPERTY_MESSAGE_CLUSTER, clusterName); - MessageAccessor.putProperty(msg, DeFiBusConstant.PROPERTY_MESSAGE_BROKER, brokerName); - msg.setPropertiesString(MessageDecoder.messageProperties2String(msg.getProperties())); - - PutMessageResult result = next.putMessage(msg); - long eclipseNanoTime = System.nanoTime() - startTime; - pluginStoreStatService.recordPutTime(eclipseNanoTime); - return result; - } - - @Override - public PutMessageResult putMessages(MessageExtBatch messageExtBatch) { - long startTime = System.nanoTime(); - PutMessageResult result = next.putMessages(messageExtBatch); - long eclipseNanoTime = System.nanoTime() - startTime; - pluginStoreStatService.recordPutTime(eclipseNanoTime); - return result; - } - - @Override - public GetMessageResult getMessage(String group, String topic, int queueId, long offset, - int maxMsgNums, final MessageFilter messageFilter) { - long startTime = System.nanoTime(); - GetMessageResult getMessageResult - = next.getMessage(group, topic, queueId, offset, maxMsgNums, messageFilter); - - if (getMessageResult.getStatus().equals(GetMessageStatus.FOUND)) { - this.deFiQueueManager.recordLastDeliverOffset(group, topic, queueId, getMessageResult.getNextBeginOffset()); - } - - long eclipseNanoTime = System.nanoTime() - startTime; - pluginStoreStatService.recordGetTime(eclipseNanoTime); - - return getMessageResult; - } - - public MessageStore getDefaultMessageStore() { - return next; - } -} \ No newline at end of file diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/plugin/PluginStoreStatService.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/plugin/PluginStoreStatService.java deleted file mode 100644 index 01e987e3bc..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/plugin/PluginStoreStatService.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.plugin; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; -import org.apache.rocketmq.common.ThreadFactoryImpl; -import org.apache.rocketmq.common.constant.LoggerName; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PluginStoreStatService { - private final static Logger LOG = LoggerFactory.getLogger(LoggerName.ROCKETMQ_STATS_LOGGER_NAME); - private final String[] MESSAGE_ENTIRE_TIME_DESC = new String[] { - "[<=1000ns]", "[<=10000ns]", "[10000~100000ns]", - "[100000~1000000ns]", "[1~10ms]", "[10~100ms]", "[100~1000ms]", "[>=1000ms]"}; - private volatile AtomicLong[] putMessageDistributeTime; - private volatile AtomicLong[] getMessageDistributeTime; - private ScheduledExecutorService scheduleService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl - ("DeFiBusPluginStore_Stat_")); - - public void start() { - putMessageDistributeTime = new AtomicLong[MESSAGE_ENTIRE_TIME_DESC.length]; - getMessageDistributeTime = new AtomicLong[MESSAGE_ENTIRE_TIME_DESC.length]; - for (int i = 0; i < MESSAGE_ENTIRE_TIME_DESC.length; i++) { - putMessageDistributeTime[i] = new AtomicLong(0); - getMessageDistributeTime[i] = new AtomicLong(0); - } - - scheduleService.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - printStoreStat(); - } - }, 60 * 1000, 60 * 1000, TimeUnit.MILLISECONDS); - - } - - public void shutdown() { - scheduleService.shutdownNow(); - } - - public void recordPutTime(long value) { - final AtomicLong[] times = this.putMessageDistributeTime; - - if (null == times) - return; - - if (value <= 1000) { - times[0].incrementAndGet(); - } else if (value < 10000) { - times[1].incrementAndGet(); - } else if (value < 100000) { - times[2].incrementAndGet(); - } else if (value < 1000000) { - times[3].incrementAndGet(); - } else if (value < 10000000) { - times[4].incrementAndGet(); - } else if (value < 100000000) { - times[5].incrementAndGet(); - } else if (value < 1000000000) { - times[6].incrementAndGet(); - } else { - times[7].incrementAndGet(); - } - } - - public void recordGetTime(long value) { - final AtomicLong[] times = this.getMessageDistributeTime; - - if (null == times) - return; - - //stat - if (value <= 1000) { - times[0].incrementAndGet(); - } else if (value < 10000) { - times[1].incrementAndGet(); - } else if (value < 100000) { - times[2].incrementAndGet(); - } else if (value < 1000000) { - times[3].incrementAndGet(); - } else if (value < 10000000) { - times[4].incrementAndGet(); - } else if (value < 100000000) { - times[5].incrementAndGet(); - } else if (value < 1000000000) { - times[6].incrementAndGet(); - } else { - times[7].incrementAndGet(); - } - } - - public void printStoreStat() { - StringBuilder sbPut = new StringBuilder(); - for (int i = 0; i < MESSAGE_ENTIRE_TIME_DESC.length; i++) { - long value = putMessageDistributeTime[i].get(); - sbPut.append(String.format("%s:%d", MESSAGE_ENTIRE_TIME_DESC[i], value)); - sbPut.append(" "); - } - - StringBuilder sbGet = new StringBuilder(); - for (int i = 0; i < MESSAGE_ENTIRE_TIME_DESC.length; i++) { - long value = getMessageDistributeTime[i].get(); - sbGet.append(String.format("%s:%d", MESSAGE_ENTIRE_TIME_DESC[i], value)); - sbGet.append(" "); - } - - LOG.info("putMessage stat:" + sbPut); - LOG.info("getMessage stat:" + sbGet); - for (int i = 0; i < MESSAGE_ENTIRE_TIME_DESC.length; i++) { - putMessageDistributeTime[i].set(0); - } - - for (int i = 0; i < MESSAGE_ENTIRE_TIME_DESC.length; i++) { - getMessageDistributeTime[i].set(0); - } - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiAdminBrokerProcessor.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiAdminBrokerProcessor.java deleted file mode 100644 index 51af081b69..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiAdminBrokerProcessor.java +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusVersion; -import cn.webank.defibus.common.admin.DeFiBusConsumeStats; -import cn.webank.defibus.common.admin.DeFiBusOffsetWrapper; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.defibus.common.protocol.DeFiBusTopicConfig; -import io.netty.channel.ChannelHandlerContext; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.UtilAll; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.body.KVTable; -import org.apache.rocketmq.common.protocol.header.CreateTopicRequestHeader; -import org.apache.rocketmq.common.protocol.header.GetConsumeStatsRequestHeader; -import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; -import org.apache.rocketmq.remoting.common.RemotingHelper; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.store.DefaultMessageStore; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiAdminBrokerProcessor implements NettyRequestProcessor { - private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - private final DeFiBrokerController deFiBrokerController; - - public DeFiAdminBrokerProcessor(final DeFiBrokerController deFiBrokerController) { - this.deFiBrokerController = deFiBrokerController; - } - - @Override - public RemotingCommand processRequest(ChannelHandlerContext ctx, - RemotingCommand request) throws RemotingCommandException { - switch (request.getCode()) { - case RequestCode.UPDATE_AND_CREATE_TOPIC: - return this.updateAndCreateTopic(ctx, request); - case RequestCode.GET_BROKER_RUNTIME_INFO: - return this.getBrokerRuntimeInfo(ctx, request); - case DeFiBusRequestCode.GET_CONSUME_STATS_V2: - return this.getConsumeStatsV2(ctx, request); - default: - break; - } - - return null; - } - - @Override - public boolean rejectRequest() { - return false; - } - - private RemotingCommand getBrokerRuntimeInfo(ChannelHandlerContext ctx, RemotingCommand request) { - final RemotingCommand response = RemotingCommand.createResponseCommand(null); - - HashMap runtimeInfo = this.prepareRuntimeInfo(); - KVTable kvTable = new KVTable(); - kvTable.setTable(runtimeInfo); - - byte[] body = kvTable.encode(); - response.setBody(body); - response.setCode(ResponseCode.SUCCESS); - response.setRemark(null); - return response; - } - - private HashMap prepareRuntimeInfo() { - HashMap runtimeInfo = this.deFiBrokerController.getMessageStore().getRuntimeInfo(); - runtimeInfo.put("brokerVersionDesc", DeFiBusVersion.getVersionDesc(DeFiBusVersion.CURRENT_VERSION)); - runtimeInfo.put("brokerVersion", String.valueOf(DeFiBusVersion.CURRENT_VERSION)); - - runtimeInfo.put("msgPutTotalYesterdayMorning", - String.valueOf(this.deFiBrokerController.getBrokerStats().getMsgPutTotalYesterdayMorning())); - runtimeInfo.put("msgPutTotalTodayMorning", String.valueOf(this.deFiBrokerController.getBrokerStats().getMsgPutTotalTodayMorning())); - runtimeInfo.put("msgPutTotalTodayNow", String.valueOf(this.deFiBrokerController.getBrokerStats().getMsgPutTotalTodayNow())); - - runtimeInfo.put("msgGetTotalYesterdayMorning", - String.valueOf(this.deFiBrokerController.getBrokerStats().getMsgGetTotalYesterdayMorning())); - runtimeInfo.put("msgGetTotalTodayMorning", String.valueOf(this.deFiBrokerController.getBrokerStats().getMsgGetTotalTodayMorning())); - runtimeInfo.put("msgGetTotalTodayNow", String.valueOf(this.deFiBrokerController.getBrokerStats().getMsgGetTotalTodayNow())); - - runtimeInfo.put("sendThreadPoolQueueSize", String.valueOf(this.deFiBrokerController.getSendThreadPoolQueue().size())); - - runtimeInfo.put("sendThreadPoolQueueCapacity", - String.valueOf(this.deFiBrokerController.getBrokerConfig().getSendThreadPoolQueueCapacity())); - - runtimeInfo.put("pullThreadPoolQueueSize", String.valueOf(this.deFiBrokerController.getPullThreadPoolQueue().size())); - runtimeInfo.put("pullThreadPoolQueueCapacity", - String.valueOf(this.deFiBrokerController.getBrokerConfig().getPullThreadPoolQueueCapacity())); - - runtimeInfo.put("dispatchBehindBytes", String.valueOf(this.deFiBrokerController.getMessageStore().dispatchBehindBytes())); - runtimeInfo.put("pageCacheLockTimeMills", String.valueOf(this.deFiBrokerController.getMessageStore().lockTimeMills())); - - runtimeInfo.put("sendThreadPoolQueueHeadWaitTimeMills", String.valueOf(this.deFiBrokerController.headSlowTimeMills4SendThreadPoolQueue())); - runtimeInfo.put("pullThreadPoolQueueHeadWaitTimeMills", String.valueOf(this.deFiBrokerController.headSlowTimeMills4PullThreadPoolQueue())); - runtimeInfo.put("earliestMessageTimeStamp", String.valueOf(this.deFiBrokerController.getMessageStore().getEarliestMessageTime())); - runtimeInfo.put("startAcceptSendRequestTimeStamp", String.valueOf(this.deFiBrokerController.getBrokerConfig().getStartAcceptSendRequestTimeStamp())); - if (this.deFiBrokerController.getMessageStore() instanceof DefaultMessageStore) { - DefaultMessageStore defaultMessageStore = (DefaultMessageStore) this.deFiBrokerController.getMessageStore(); - runtimeInfo.put("remainTransientStoreBufferNumbs", String.valueOf(defaultMessageStore.remainTransientStoreBufferNumbs())); - if (defaultMessageStore.getMessageStoreConfig().isTransientStorePoolEnable()) { - runtimeInfo.put("remainHowManyDataToCommit", MixAll.humanReadableByteCount(defaultMessageStore.getCommitLog().remainHowManyDataToCommit(), false)); - } - runtimeInfo.put("remainHowManyDataToFlush", MixAll.humanReadableByteCount(defaultMessageStore.getCommitLog().remainHowManyDataToFlush(), false)); - } - - java.io.File commitLogDir = new java.io.File(this.deFiBrokerController.getMessageStoreConfig().getStorePathRootDir()); - if (commitLogDir.exists()) { - runtimeInfo.put("commitLogDirCapacity", String.format("Total : %s, Free : %s.", MixAll.humanReadableByteCount(commitLogDir.getTotalSpace(), false), MixAll.humanReadableByteCount(commitLogDir.getFreeSpace(), false))); - } - -// runtimeInfo.put("producerCount", String.valueOf(this.deFiBrokerController.getProducerManager().getProducerChannelTable().size())); -// runtimeInfo.put("consumerCount", String.valueOf(this.deFiBrokerController.getConsumerManager().getConsumerChannelMap().size())); - - return runtimeInfo; - } - - private RemotingCommand getConsumeStatsV2(ChannelHandlerContext ctx, - RemotingCommand request) throws RemotingCommandException { - final RemotingCommand response = RemotingCommand.createResponseCommand(null); - final GetConsumeStatsRequestHeader requestHeader = - (GetConsumeStatsRequestHeader) request.decodeCommandCustomHeader(GetConsumeStatsRequestHeader.class); - - DeFiBusConsumeStats consumeStats = new DeFiBusConsumeStats(); - - Set topics = new HashSet(); - if (UtilAll.isBlank(requestHeader.getTopic())) { - topics = this.deFiBrokerController.getConsumerOffsetManager().whichTopicByConsumer(requestHeader.getConsumerGroup()); - } else { - topics.add(requestHeader.getTopic()); - } - - for (String topic : topics) { - TopicConfig topicConfig = this.deFiBrokerController.getTopicConfigManager().selectTopicConfig(topic); - if (null == topicConfig) { - log.warn("consumeStats, topic config not exist, {}", topic); - continue; - } - - { - SubscriptionData findSubscriptionData = - this.deFiBrokerController.getConsumerManager().findSubscriptionData(requestHeader.getConsumerGroup(), topic); - - if (null == findSubscriptionData // - && this.deFiBrokerController.getConsumerManager().findSubscriptionDataCount(requestHeader.getConsumerGroup()) > 0) { - log.warn("consumeStats, the consumer group[{}], topic[{}] not exist", requestHeader.getConsumerGroup(), topic); - continue; - } - } - - for (int i = 0; i < topicConfig.getReadQueueNums(); i++) { - MessageQueue mq = new MessageQueue(); - mq.setTopic(topic); - mq.setBrokerName(this.deFiBrokerController.getBrokerConfig().getBrokerName()); - mq.setQueueId(i); - - DeFiBusOffsetWrapper offsetWrapper = new DeFiBusOffsetWrapper(); - - long brokerOffset = this.deFiBrokerController.getMessageStore().getMaxOffsetInQueue(topic, i); - if (brokerOffset < 0) - brokerOffset = 0; - - long consumerOffset = this.deFiBrokerController.getConsumerOffsetManager().queryOffset(// - requestHeader.getConsumerGroup(), // - topic, // - i); - if (consumerOffset < 0) - consumerOffset = 0; - - long lastDeliverOffset = this.deFiBrokerController.getConsumeQueueManager().queryDeliverOffset(// - requestHeader.getConsumerGroup(), // - topic, // - i); - if (lastDeliverOffset < consumerOffset) { - lastDeliverOffset = consumerOffset; - this.deFiBrokerController.getConsumeQueueManager().recordLastDeliverOffset(requestHeader.getConsumerGroup(), // - topic, i, consumerOffset); - } - - offsetWrapper.setBrokerOffset(brokerOffset); - offsetWrapper.setConsumerOffset(consumerOffset); - offsetWrapper.setLastDeliverOffset(lastDeliverOffset); - - long timeOffset = consumerOffset - 1; - if (timeOffset >= 0) { - long lastTimestamp = this.deFiBrokerController.getMessageStore().getMessageStoreTimeStamp(topic, i, timeOffset); - if (lastTimestamp > 0) { - offsetWrapper.setLastTimestamp(lastTimestamp); - } - } - - consumeStats.getOffsetTable().put(mq, offsetWrapper); - } - - double consumeTps = this.deFiBrokerController.getBrokerStatsManager().tpsGroupGetNums(requestHeader.getConsumerGroup(), topic); - - consumeTps += consumeStats.getConsumeTps(); - consumeStats.setConsumeTps(consumeTps); - } - - byte[] body = consumeStats.encode(); - response.setBody(body); - response.setCode(ResponseCode.SUCCESS); - response.setRemark(null); - return response; - } - - private RemotingCommand updateAndCreateTopic(ChannelHandlerContext ctx, - RemotingCommand request) throws RemotingCommandException { - final RemotingCommand response = RemotingCommand.createResponseCommand(null); - final CreateTopicRequestHeader requestHeader = - (CreateTopicRequestHeader) request.decodeCommandCustomHeader(CreateTopicRequestHeader.class); - log.info("updateAndCreateTopic called by {}", RemotingHelper.parseChannelRemoteAddr(ctx.channel())); - - if (requestHeader.getTopic().equals(this.deFiBrokerController.getBrokerConfig().getBrokerClusterName())) { - String errorMsg = "the topic[" + requestHeader.getTopic() + "] is conflict with system reserved words."; - log.warn(errorMsg); - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark(errorMsg); - return response; - } - - try { - response.setCode(ResponseCode.SUCCESS); - response.setOpaque(request.getOpaque()); - response.markResponseType(); - response.setRemark(null); - ctx.writeAndFlush(response); - } catch (Exception e) { - log.error("Failed to produce a proper response", e); - } - - TopicConfig topicConfig = new TopicConfig(requestHeader.getTopic()); - topicConfig.setReadQueueNums(requestHeader.getReadQueueNums()); - topicConfig.setWriteQueueNums(requestHeader.getWriteQueueNums()); - topicConfig.setTopicFilterType(requestHeader.getTopicFilterTypeEnum()); - topicConfig.setPerm(requestHeader.getPerm()); - topicConfig.setTopicSysFlag(requestHeader.getTopicSysFlag() == null ? 0 : requestHeader.getTopicSysFlag()); - - this.deFiBrokerController.getTopicConfigManager().updateTopicConfig(topicConfig); - - //set topic queue depth - HashMap extFields = request.getExtFields(); - long maxLength = extFields.get("maxQueueDepth") == null ? DeFiBusTopicConfig.DEFAULT_QUEUE_LENGTH : Long.valueOf(extFields.get("maxQueueDepth")); - this.deFiBrokerController.getExtTopicConfigManager().updateTopicConfig( - new DeFiBusTopicConfig(requestHeader.getTopic(), maxLength)); - - if (this.deFiBrokerController.getBrokerConfig().getBrokerId() != MixAll.MASTER_ID) { - return null; - } - - this.deFiBrokerController.registerIncrementBrokerData(topicConfig, this.deFiBrokerController.getTopicConfigManager().getDataVersion()); - - this.deFiBrokerController.getConsumerManager().notifyWhenTopicConfigChange(requestHeader.getTopic()); - - return null; - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiClientManageProcessor.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiClientManageProcessor.java deleted file mode 100644 index 159b46402c..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiClientManageProcessor.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.broker.client.DeFiConsumerGroupInfo; -import cn.webank.defibus.broker.client.DeFiConsumerManager; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.defibus.common.protocol.header.GetConsumerListByGroupAndTopicRequestHeader; -import io.netty.channel.ChannelHandlerContext; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import org.apache.rocketmq.broker.client.ConsumerGroupInfo; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.GetConsumerListByGroupResponseBody; -import org.apache.rocketmq.common.protocol.header.GetConsumerListByGroupResponseHeader; -import org.apache.rocketmq.remoting.common.RemotingHelper; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiClientManageProcessor implements NettyRequestProcessor { - private final DeFiBrokerController deFiBrokerController; - private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - - public DeFiClientManageProcessor(DeFiBrokerController deFiBrokerController) { - this.deFiBrokerController = deFiBrokerController; - } - - @Override - public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) throws Exception { - switch (request.getCode()) { - case DeFiBusRequestCode.GET_CONSUMER_LIST_BY_GROUP_AND_TOPIC: - return getConsumerListByGroupAndTopic(ctx, request); - default: - break; - } - return null; - } - - private RemotingCommand getConsumerListByGroupAndTopic(ChannelHandlerContext ctx, RemotingCommand request) - throws RemotingCommandException { - final RemotingCommand response = - RemotingCommand.createResponseCommand(GetConsumerListByGroupResponseHeader.class); - final GetConsumerListByGroupAndTopicRequestHeader requestHeader = - (GetConsumerListByGroupAndTopicRequestHeader) request - .decodeCommandCustomHeader(GetConsumerListByGroupAndTopicRequestHeader.class); - DeFiConsumerManager deFiConsumerManager = (DeFiConsumerManager) this.deFiBrokerController.getConsumerManager(); - ConsumerGroupInfo consumerGroupInfo = deFiConsumerManager.getConsumerGroupInfo(requestHeader.getConsumerGroup()); - - if (consumerGroupInfo != null) { - if (consumerGroupInfo instanceof DeFiConsumerGroupInfo) { - DeFiConsumerGroupInfo wqCGInfo = (DeFiConsumerGroupInfo) consumerGroupInfo; - List cidList = new ArrayList<>(); - if (requestHeader.getTopic() != null) { - Set cids = wqCGInfo.getClientIdBySubscription(requestHeader.getTopic()); - if (cids != null) { - cidList.addAll(cids); - } - GetConsumerListByGroupResponseBody body = new GetConsumerListByGroupResponseBody(); - body.setConsumerIdList(cidList); - response.setBody(body.encode()); - response.setCode(ResponseCode.SUCCESS); - response.setRemark(null); - return response; - } - } - - //topic is null or consumerGroupInfo not an instance fo deFiConsumerGroupInfo - List clientIds = consumerGroupInfo.getAllClientId(); - if (!clientIds.isEmpty()) { - GetConsumerListByGroupResponseBody body = new GetConsumerListByGroupResponseBody(); - body.setConsumerIdList(clientIds); - response.setBody(body.encode()); - response.setCode(ResponseCode.SUCCESS); - response.setRemark(null); - return response; - } else { - LOG.warn("getAllClientId failed, {} {}", requestHeader.getConsumerGroup(), - RemotingHelper.parseChannelRemoteAddr(ctx.channel())); - } - } else { - LOG.warn("getConsumerGroupInfo failed, {} {}", requestHeader.getConsumerGroup(), - RemotingHelper.parseChannelRemoteAddr(ctx.channel())); - } - - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark("no consumer for this group, " + requestHeader.getConsumerGroup()); - return response; - } - - @Override - public boolean rejectRequest() { - return false; - } -} - diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiPullMessageProcessor.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiPullMessageProcessor.java deleted file mode 100644 index caf77e0fdb..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiPullMessageProcessor.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import io.netty.channel.ChannelHandlerContext; -import org.apache.rocketmq.broker.BrokerController; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.client.ConsumerGroupInfo; -import org.apache.rocketmq.broker.processor.PullMessageProcessor; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.protocol.header.PullMessageRequestHeader; -import org.apache.rocketmq.common.protocol.header.PullMessageResponseHeader; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static org.apache.rocketmq.common.protocol.ResponseCode.NO_PERMISSION; -import static org.apache.rocketmq.common.protocol.ResponseCode.PULL_NOT_FOUND; -import static org.apache.rocketmq.common.protocol.ResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST; -import static org.apache.rocketmq.common.protocol.ResponseCode.SUBSCRIPTION_NOT_EXIST; -import static org.apache.rocketmq.common.protocol.ResponseCode.SUBSCRIPTION_NOT_LATEST; - -public class DeFiPullMessageProcessor extends PullMessageProcessor { - private DeFiBrokerController deFiBrokerController; - private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - - public DeFiPullMessageProcessor(BrokerController brokerController) { - super(brokerController); - this.deFiBrokerController = (DeFiBrokerController) brokerController; - } - - @Override - public RemotingCommand processRequest(final ChannelHandlerContext ctx, - RemotingCommand request) throws RemotingCommandException { - RemotingCommand response = super.processRequest(ctx, request); - - final PullMessageRequestHeader requestHeader = - (PullMessageRequestHeader) request.decodeCommandCustomHeader(PullMessageRequestHeader.class); - ConsumerGroupInfo consumerGroupInfo = deFiBrokerController.getConsumerManager().getConsumerGroupInfo(requestHeader.getConsumerGroup()); - if (consumerGroupInfo != null) { - ClientChannelInfo clientChannelInfo = consumerGroupInfo.getChannelInfoTable().get(ctx.channel()); - if (clientChannelInfo != null) { - String clientId = clientChannelInfo.getClientId(); - deFiBrokerController.getClientRebalanceResultManager().updateListenMap(requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueId(), clientId); - } - } - handleProcessResult(requestHeader, response); - return response; - } - - private void handleProcessResult(final PullMessageRequestHeader requestHeader, final RemotingCommand response) { - if (response != null) { - switch (response.getCode()) { - case SUBSCRIPTION_GROUP_NOT_EXIST: - case NO_PERMISSION: - case SUBSCRIPTION_NOT_EXIST: - case SUBSCRIPTION_NOT_LATEST: - response.setCode(PULL_NOT_FOUND); - final PullMessageResponseHeader responseHeader = (PullMessageResponseHeader) response.readCustomHeader(); - responseHeader.setMinOffset(this.deFiBrokerController.getMessageStore().getMinOffsetInQueue(requestHeader.getTopic(), requestHeader.getQueueId())); - responseHeader.setMaxOffset(this.deFiBrokerController.getMessageStore().getMaxOffsetInQueue(requestHeader.getTopic(), requestHeader.getQueueId())); - responseHeader.setNextBeginOffset(requestHeader.getQueueOffset()); - responseHeader.setSuggestWhichBrokerId(MixAll.MASTER_ID); - break; - } - } - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiReplyMessageProcessor.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiReplyMessageProcessor.java deleted file mode 100644 index 189d052de2..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiReplyMessageProcessor.java +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.broker.plugin.DeFiPluginMessageStore; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.message.DeFiBusMessageConst; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.defibus.common.protocol.header.ReplyMessageRequestHeader; -import io.netty.channel.ChannelHandlerContext; -import java.net.SocketAddress; -import java.util.Map; -import java.util.concurrent.RejectedExecutionException; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.mqtrace.SendMessageContext; -import org.apache.rocketmq.broker.processor.AbstractSendMessageProcessor; -import org.apache.rocketmq.common.MQVersion; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.TopicFilterType; -import org.apache.rocketmq.common.UtilAll; -import org.apache.rocketmq.common.constant.PermName; -import org.apache.rocketmq.common.help.FAQUrl; -import org.apache.rocketmq.common.message.MessageAccessor; -import org.apache.rocketmq.common.message.MessageConst; -import org.apache.rocketmq.common.message.MessageDecoder; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeaderV2; -import org.apache.rocketmq.common.protocol.header.SendMessageResponseHeader; -import org.apache.rocketmq.common.subscription.SubscriptionGroupConfig; -import org.apache.rocketmq.common.sysflag.MessageSysFlag; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.store.DefaultMessageStore; -import org.apache.rocketmq.store.MessageExtBrokerInner; -import org.apache.rocketmq.store.PutMessageResult; -import org.apache.rocketmq.store.config.StorePathConfigHelper; -import org.apache.rocketmq.store.stats.BrokerStatsManager; - -public class DeFiReplyMessageProcessor extends AbstractSendMessageProcessor implements NettyRequestProcessor { - private DeFiBrokerController deFiBrokerController; - - public DeFiReplyMessageProcessor(final DeFiBrokerController deFiBrokerController) { - super(deFiBrokerController); - this.deFiBrokerController = deFiBrokerController; - } - - @Override - public RemotingCommand processRequest(ChannelHandlerContext ctx, - RemotingCommand request) throws RemotingCommandException { - SendMessageContext mqtraceContext = null; - switch (request.getCode()) { - case DeFiBusRequestCode.SEND_DIRECT_MESSAGE_V2: - case DeFiBusRequestCode.SEND_DIRECT_MESSAGE: - SendMessageRequestHeader requestHeader = parseRequestHeader(request); - if (requestHeader == null) { - return null; - } - - mqtraceContext = buildMsgContext(ctx, requestHeader); - this.executeSendMessageHookBefore(ctx, request, mqtraceContext); - final RemotingCommand response = this.processReplyMessageRequest(ctx, request, mqtraceContext, requestHeader); - - this.executeSendMessageHookAfter(response, mqtraceContext); - return response; - default: - log.warn("Unsupported request code :" + request.getCode()); - } - return null; - } - - @Override - protected SendMessageRequestHeader parseRequestHeader(RemotingCommand request) throws RemotingCommandException { - SendMessageRequestHeaderV2 requestHeaderV2 = null; - SendMessageRequestHeader requestHeader = null; - switch (request.getCode()) { - case DeFiBusRequestCode.SEND_DIRECT_MESSAGE_V2: - requestHeaderV2 = - (SendMessageRequestHeaderV2) request - .decodeCommandCustomHeader(SendMessageRequestHeaderV2.class); - case DeFiBusRequestCode.SEND_DIRECT_MESSAGE: - if (null == requestHeaderV2) { - requestHeader = - (SendMessageRequestHeader) request - .decodeCommandCustomHeader(SendMessageRequestHeader.class); - } else { - requestHeader = SendMessageRequestHeaderV2.createSendMessageRequestHeaderV1(requestHeaderV2); - } - default: - break; - } - return requestHeader; - } - - @Override - public boolean rejectRequest() { - return this.deFiBrokerController.getMessageStore().isOSPageCacheBusy(); - } - - private RemotingCommand processReplyMessageRequest(final ChannelHandlerContext ctx, // - final RemotingCommand request, // - final SendMessageContext sendMessageContext, // - final SendMessageRequestHeader requestHeader) throws RemotingCommandException { - long arriveBrokerTime = System.currentTimeMillis(); - final RemotingCommand response = RemotingCommand.createResponseCommand(SendMessageResponseHeader.class); - final SendMessageResponseHeader responseHeader = (SendMessageResponseHeader) response.readCustomHeader(); - - response.setOpaque(request.getOpaque()); - - response.addExtField(MessageConst.PROPERTY_MSG_REGION, this.deFiBrokerController.getBrokerConfig().getRegionId()); - - log.debug("receive SendDirectMessage request command, " + request); - - final long startTimestamp = this.deFiBrokerController.getBrokerConfig().getStartAcceptSendRequestTimeStamp(); - if (this.deFiBrokerController.getMessageStore().now() < startTimestamp) { - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark(String.format("broker unable to service, until %s", UtilAll.timeMillisToHumanString2(startTimestamp))); - return response; - } - - response.setCode(-1); - super.msgCheck(ctx, requestHeader, response); - if (response.getCode() != -1) { - return response; - } - - final byte[] body = request.getBody(); - - int queueIdInt = requestHeader.getQueueId(); - TopicConfig topicConfig = this.deFiBrokerController.getTopicConfigManager().selectTopicConfig(requestHeader.getTopic()); - - if (queueIdInt < 0) { - queueIdInt = Math.abs(this.random.nextInt() % 99999999) % topicConfig.getWriteQueueNums(); - } - - int sysFlag = requestHeader.getSysFlag(); - - if (TopicFilterType.MULTI_TAG == topicConfig.getTopicFilterType()) { - sysFlag |= MessageSysFlag.MULTI_TAGS_FLAG; - } - - String newTopic = requestHeader.getTopic(); - if ((null != newTopic && newTopic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX))) { - - String groupName = newTopic.substring(MixAll.RETRY_GROUP_TOPIC_PREFIX.length()); - - SubscriptionGroupConfig subscriptionGroupConfig = - this.deFiBrokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(groupName); - if (null == subscriptionGroupConfig) { - response.setCode(ResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST); - response.setRemark( - "subscription group not exist, " + groupName + " " + FAQUrl.suggestTodo(FAQUrl.SUBSCRIPTION_GROUP_NOT_EXIST)); - return response; - } - - int maxReconsumeTimes = subscriptionGroupConfig.getRetryMaxTimes(); - if (request.getVersion() >= MQVersion.Version.V3_4_9.ordinal()) { - maxReconsumeTimes = requestHeader.getMaxReconsumeTimes(); - } - int reconsumeTimes = requestHeader.getReconsumeTimes(); - if (reconsumeTimes >= maxReconsumeTimes) { - newTopic = MixAll.getDLQTopic(groupName); - queueIdInt = Math.abs(this.random.nextInt() % 99999999) % DLQ_NUMS_PER_GROUP; - topicConfig = this.deFiBrokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(newTopic, // - DLQ_NUMS_PER_GROUP, // - PermName.PERM_WRITE, 0 - ); - if (null == topicConfig) { - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark("topic[" + newTopic + "] not exist"); - return response; - } - } - } - MessageExtBrokerInner msgInner = new MessageExtBrokerInner(); - msgInner.setTopic(newTopic); - msgInner.setBody(body); - msgInner.setFlag(requestHeader.getFlag()); - MessageAccessor.setProperties(msgInner, MessageDecoder.string2messageProperties(requestHeader.getProperties())); - msgInner.setPropertiesString(requestHeader.getProperties()); - msgInner.setTagsCode(MessageExtBrokerInner.tagsString2tagsCode(topicConfig.getTopicFilterType(), msgInner.getTags())); - - msgInner.setQueueId(queueIdInt); - msgInner.setSysFlag(sysFlag); - msgInner.setBornTimestamp(requestHeader.getBornTimestamp()); - msgInner.setBornHost(ctx.channel().remoteAddress()); - msgInner.setStoreHost(this.getStoreHost()); - msgInner.setReconsumeTimes(requestHeader.getReconsumeTimes() == null ? 0 : requestHeader.getReconsumeTimes()); - - if (this.deFiBrokerController.getBrokerConfig().isRejectTransactionMessage()) { - String traFlag = msgInner.getProperty(MessageConst.PROPERTY_TRANSACTION_PREPARED); - if (traFlag != null) { - response.setCode(ResponseCode.NO_PERMISSION); - response.setRemark( - "the broker[" + this.deFiBrokerController.getBrokerConfig().getBrokerIP1() + "] sending transaction constant is forbidden"); - return response; - } - } - - ReplyMessageRequestHeader replyMessageRequestHeader = new ReplyMessageRequestHeader(); - replyMessageRequestHeader.setBornHost(ctx.channel().remoteAddress().toString()); - replyMessageRequestHeader.setStoreHost(this.getStoreHost().toString()); - replyMessageRequestHeader.setStoreTimestamp(arriveBrokerTime); - - replyMessageRequestHeader.setProducerGroup(requestHeader.getProducerGroup()); - replyMessageRequestHeader.setTopic(requestHeader.getTopic()); - replyMessageRequestHeader.setDefaultTopic(requestHeader.getDefaultTopic()); - replyMessageRequestHeader.setDefaultTopicQueueNums(requestHeader.getDefaultTopicQueueNums()); - replyMessageRequestHeader.setQueueId(requestHeader.getQueueId()); - replyMessageRequestHeader.setSysFlag(requestHeader.getSysFlag()); - replyMessageRequestHeader.setBornTimestamp(requestHeader.getBornTimestamp()); - replyMessageRequestHeader.setFlag(requestHeader.getFlag()); - replyMessageRequestHeader.setProperties(requestHeader.getProperties()); - replyMessageRequestHeader.setReconsumeTimes(requestHeader.getReconsumeTimes()); - replyMessageRequestHeader.setUnitMode(requestHeader.isUnitMode()); - - if (msgInner.getProperties() != null && DeFiBusConstant.REPLY.equals(msgInner.getProperties().get(DeFiBusConstant.KEY))) { - String senderId = msgInner.getProperties().get(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO); - if (senderId == null) { - log.warn("senderId is null, can not reply message"); - } else { - ClientChannelInfo clientChannelInfo = this.deFiBrokerController.getProducerManager().getClientChannel(senderId); - if (clientChannelInfo == null || clientChannelInfo.getChannel() == null || !clientChannelInfo.getChannel().isActive()) { - - if (System.currentTimeMillis() - replyMessageRequestHeader.getBornTimestamp() <= 1000) { - log.warn("try to push rr reply message:{} later for clientId:{}", msgInner, senderId); - processRequestLater(ctx, request); - return null; - } else { - log.warn("ignore rr reply message:{} after retry, no channel for this client:{}", msgInner, senderId); - } - - } else { - Map map = MessageDecoder.string2messageProperties(replyMessageRequestHeader.getProperties()); - map.put(DeFiBusMessageConst.LEAVE_TIME, String.valueOf(System.currentTimeMillis())); - replyMessageRequestHeader.setProperties(MessageDecoder.messageProperties2String(map)); - - try { - this.deFiBrokerController.getPushReplyMessageExecutor().submit(new Runnable() { - @Override public void run() { - boolean isPushSuccess = deFiBrokerController.getDeFiBusBroker2Client().pushRRReplyMessageToClient - (clientChannelInfo.getChannel(), replyMessageRequestHeader, msgInner); - if (isPushSuccess) { - deFiBrokerController.getBrokerStatsManager().incBrokerGetNums(1); - if (deFiBrokerController.getMessageStore() instanceof DeFiPluginMessageStore) { - DefaultMessageStore defaultMessageStore = (DefaultMessageStore) - ((DeFiPluginMessageStore) deFiBrokerController.getMessageStore()).getDefaultMessageStore(); - defaultMessageStore.getStoreStatsService().getGetMessageTransferedMsgCount().incrementAndGet(); - defaultMessageStore.getStoreStatsService().getSinglePutMessageTopicTimesTotal(requestHeader.getTopic()).incrementAndGet(); - } - } else { - log.warn("push reply msg to client failed. [{}]", msgInner); - } - } - }); - } catch (RejectedExecutionException e) { - log.warn("too many push rr rely requests, and system thread pool busy"); - } - } - } - } - - PutMessageResult putMessageResult = this.deFiBrokerController.getMessageStore().putMessage(msgInner); - - if (putMessageResult != null) { - boolean sendOK = true; - response.setCode(ResponseCode.SUCCESS); - - switch (putMessageResult.getPutMessageStatus()) { - case PUT_OK: - sendOK = true; - response.setCode(ResponseCode.SUCCESS); - break; - case FLUSH_DISK_TIMEOUT: - response.setCode(ResponseCode.FLUSH_DISK_TIMEOUT); - sendOK = true; - break; - case FLUSH_SLAVE_TIMEOUT: - response.setCode(ResponseCode.FLUSH_SLAVE_TIMEOUT); - sendOK = true; - break; - case SLAVE_NOT_AVAILABLE: - response.setCode(ResponseCode.SLAVE_NOT_AVAILABLE); - sendOK = true; - break; - - case CREATE_MAPEDFILE_FAILED: - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark("create mapped file failed, server is busy or broken."); - break; - case MESSAGE_ILLEGAL: - case PROPERTIES_SIZE_EXCEEDED: - response.setCode(ResponseCode.MESSAGE_ILLEGAL); - response.setRemark( - "the message is illegal, maybe msg body or properties length not matched. msg body length limit 128k, msg properties length limit 32k."); - break; - case SERVICE_NOT_AVAILABLE: - response.setCode(ResponseCode.SERVICE_NOT_AVAILABLE); - response.setRemark( - "service not available now, maybe disk full, " + diskUtil() + ", maybe your broker machine memory too small."); - break; - case OS_PAGECACHE_BUSY: - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark("[PC_SYNCHRONIZED]broker busy, start flow control for a while"); - break; - case UNKNOWN_ERROR: - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark("UNKNOWN_ERROR"); - break; - - default: - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark("UNKNOWN_ERROR DEFAULT"); - break; - } - - String owner = request.getExtFields().get(BrokerStatsManager.COMMERCIAL_OWNER); - if (sendOK) { - - this.deFiBrokerController.getBrokerStatsManager().incTopicPutNums(msgInner.getTopic()); - this.deFiBrokerController.getBrokerStatsManager().incTopicPutSize(msgInner.getTopic(), - putMessageResult.getAppendMessageResult().getWroteBytes()); - this.deFiBrokerController.getBrokerStatsManager().incBrokerPutNums(); - - response.setRemark(null); - - responseHeader.setMsgId(putMessageResult.getAppendMessageResult().getMsgId()); - responseHeader.setQueueId(queueIdInt); - responseHeader.setQueueOffset(putMessageResult.getAppendMessageResult().getLogicsOffset()); - - doResponse(ctx, request, response); - - if (hasSendMessageHook()) { - sendMessageContext.setMsgId(responseHeader.getMsgId()); - sendMessageContext.setQueueId(responseHeader.getQueueId()); - sendMessageContext.setQueueOffset(responseHeader.getQueueOffset()); - - int commercialBaseCount = deFiBrokerController.getBrokerConfig().getCommercialBaseCount(); - int wroteSize = putMessageResult.getAppendMessageResult().getWroteBytes(); - int incValue = (int) Math.ceil(wroteSize / BrokerStatsManager.SIZE_PER_COUNT) * commercialBaseCount; - - sendMessageContext.setCommercialSendStats(BrokerStatsManager.StatsType.SEND_SUCCESS); - sendMessageContext.setCommercialSendTimes(incValue); - sendMessageContext.setCommercialSendSize(wroteSize); - sendMessageContext.setCommercialOwner(owner); - } - return null; - } else { - if (hasSendMessageHook()) { - int wroteSize = request.getBody().length; - int incValue = (int) Math.ceil(wroteSize / BrokerStatsManager.SIZE_PER_COUNT); - - sendMessageContext.setCommercialSendStats(BrokerStatsManager.StatsType.SEND_FAILURE); - sendMessageContext.setCommercialSendTimes(incValue); - sendMessageContext.setCommercialSendSize(wroteSize); - sendMessageContext.setCommercialOwner(owner); - } - } - } else { - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark("store putMessage return null"); - } - - return response; - } - - public SocketAddress getStoreHost() { - return storeHost; - } - - private String diskUtil() { - String storePathPhysic = this.deFiBrokerController.getMessageStoreConfig().getStorePathCommitLog(); - double physicRatio = UtilAll.getDiskPartitionSpaceUsedPercent(storePathPhysic); - - String storePathLogis = - StorePathConfigHelper.getStorePathConsumeQueue(this.deFiBrokerController.getMessageStoreConfig().getStorePathRootDir()); - double logisRatio = UtilAll.getDiskPartitionSpaceUsedPercent(storePathLogis); - - String storePathIndex = - StorePathConfigHelper.getStorePathIndex(this.deFiBrokerController.getMessageStoreConfig().getStorePathRootDir()); - double indexRatio = UtilAll.getDiskPartitionSpaceUsedPercent(storePathIndex); - - return String.format("CL: %5.2f CQ: %5.2f INDEX: %5.2f", physicRatio, logisRatio, indexRatio); - } - - public void processRequestLater(ChannelHandlerContext ctx, RemotingCommand request) { - ScheduledThreadPoolExecutor threadPoolExecutor = this.deFiBrokerController.getSendReplyScheduledExecutorService(); - if (threadPoolExecutor.getQueue().size() > this.deFiBrokerController.getDeFiBusBrokerConfig().getSendReplyThreadPoolQueueCapacity()) { - log.warn("Task rejected from ScheduledThreadPoolExecutor when try to push rr reply message again"); - return; - } - - //submit to threadpool 2 times to push the request per 100 ms - this.deFiBrokerController.getSendReplyScheduledExecutorService().schedule(new Runnable() { - @Override - public void run() { - deFiBrokerController.getSendReplyMessageExecutor().submit(new Runnable() { - @Override - public void run() { - try { - DeFiReplyMessageProcessor.this.processRequest(ctx, request); - } catch (Throwable e) { - log.warn("failed to processRequest", e); - } - } - }); - } - }, 100, TimeUnit.MILLISECONDS); - - } - -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiSendMessageProcessor.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiSendMessageProcessor.java deleted file mode 100644 index 71392775fe..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/processor/DeFiSendMessageProcessor.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.broker.client.DeFiProducerManager; -import cn.webank.defibus.broker.consumequeue.ConsumeQueueManager; -import cn.webank.defibus.broker.consumequeue.ConsumeQueueWaterMark; -import cn.webank.defibus.broker.consumequeue.MessageRedirectManager; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.protocol.DeFiBusResponseCode; -import io.netty.channel.ChannelHandlerContext; -import java.util.Map; -import org.apache.rocketmq.broker.BrokerController; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.processor.SendMessageProcessor; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.message.MessageDecoder; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.apache.rocketmq.common.protocol.header.SendMessageResponseHeader; -import org.apache.rocketmq.remoting.common.RemotingUtil; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiSendMessageProcessor extends SendMessageProcessor { - private final static Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - private ConsumeQueueManager deFiQueueManager = ConsumeQueueManager.onlyInstance(); - - public DeFiSendMessageProcessor(BrokerController brokerController) { - super(brokerController); - } - - @Override - public RemotingCommand processRequest(ChannelHandlerContext ctx, - RemotingCommand request) throws RemotingCommandException { - SendMessageRequestHeader requestHeader = parseRequestHeader(request); - String Topic = requestHeader.getTopic(); - int queueIdInt = requestHeader.getQueueId(); - if (deFiQueueManager.getBrokerController().getDeFiBusBrokerConfig().isRejectSendWhenMaxDepth() - && Topic != null - && !Topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX) - && !Topic.startsWith(MixAll.DLQ_GROUP_TOPIC_PREFIX) - && !Topic.contains(DeFiBusConstant.RR_REPLY_TOPIC) - && !Topic.startsWith(DeFiBusConstant.RMQ_SYS)) { - long maxQueueDepth = deFiQueueManager.getMaxQueueDepth(Topic); - double highWatermark = deFiQueueManager.getBrokerController().getDeFiBusBrokerConfig().getQueueDepthHighWatermark(); - ConsumeQueueWaterMark minConsumeQueueWaterMark - = deFiQueueManager.getMinAccumulated(Topic, queueIdInt); - if (minConsumeQueueWaterMark != null) { - long accumulate = minConsumeQueueWaterMark.getAccumulated(); - if (accumulate >= maxQueueDepth) { - if (System.currentTimeMillis() % 100 == 0) { - LOG.error("Quota exceed 100% for topic [{}] in queue [{}], current:[{}], max:[{}]", Topic, queueIdInt, accumulate, maxQueueDepth); - } - final RemotingCommand response = RemotingCommand.createResponseCommand(SendMessageResponseHeader.class); - response.setCode(DeFiBusResponseCode.CONSUME_DIFF_SPAN_TOO_LONG); - response.setRemark(" consume span too long, maybe has slow consumer, so send rejected"); - return response; - } else if (accumulate >= maxQueueDepth * highWatermark) { - if (System.currentTimeMillis() % 100 == 0) { - LOG.error("Quota exceed {}% for topic [{}] in queue [{}], current:[{}], max:[{}]", highWatermark * 100, Topic, queueIdInt, accumulate, maxQueueDepth); - } - } - } - } - if (RequestCode.SEND_MESSAGE_V2 == request.getCode() || RequestCode.SEND_MESSAGE == request.getCode()) { - Map properties = MessageDecoder.string2messageProperties(requestHeader.getProperties()); - DeFiProducerManager deFiProducerManager = (DeFiProducerManager) this.brokerController.getProducerManager(); - String sendId = properties.get(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO); - - if (sendId != null && deFiProducerManager.getClientChannel(sendId) == null) { - ClientChannelInfo clientChannelInfo = new ClientChannelInfo(ctx.channel(), sendId, request.getLanguage(), request.getVersion()); - deFiProducerManager.registerProducer(requestHeader.getProducerGroup(), clientChannelInfo); - } - } - - if (((DeFiBrokerController) brokerController).getDeFiBusBrokerConfig().isRedirectMessageEnable()) { - switch (request.getCode()) { - case RequestCode.CONSUMER_SEND_MSG_BACK: - break; - default: - Map properties = MessageDecoder.string2messageProperties(requestHeader.getProperties()); - String redirectFlag = properties.get(DeFiBusConstant.REDIRECT_FLAG); - //redirect message - MessageRedirectManager.RedirectResult redirectResult = ((DeFiBrokerController) brokerController).getMessageRedirectManager() - .redirectMessageToWhichQueue(requestHeader, redirectFlag); - switch (redirectResult.getStates()) { - case REDIRECT_OK: - log.debug("redirect message from queueId({}) to queueId({}), {}", requestHeader.getQueueId(), redirectResult.getRedirectQueueId(), requestHeader.getTopic()); - changeQueueIdInRequest(request, redirectResult.getRedirectQueueId()); - properties.put(DeFiBusConstant.REDIRECT, "true"); - updateProperties(request, MessageDecoder.messageProperties2String(properties)); - break; - case NO_REDIRECT_CONFIG: - properties.put(DeFiBusConstant.REDIRECT, "false"); - updateProperties(request, MessageDecoder.messageProperties2String(properties)); - break; - case NO_INSTANCE_FOUND: - RemotingCommand response = RemotingCommand.createResponseCommand(SendMessageResponseHeader.class); - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark("Redirect instance no found for [" + requestHeader.getTopic() + "] in [" - + RemotingUtil.socketAddress2String(getStoreHost()) + "] redirect flag: " + redirectFlag); - return response; - } - } - } - return super.processRequest(ctx, request); - } - - private void changeQueueIdInRequest(final RemotingCommand request, int queueId) { - switch (request.getCode()) { - case RequestCode.SEND_BATCH_MESSAGE: - case RequestCode.SEND_MESSAGE_V2: - request.getExtFields().put("e", String.valueOf(queueId)); - case RequestCode.SEND_MESSAGE: - request.getExtFields().put("queueId", String.valueOf(queueId)); - default: - break; - } - } - - private void updateProperties(final RemotingCommand request, String properties) { - switch (request.getCode()) { - case RequestCode.SEND_BATCH_MESSAGE: - case RequestCode.SEND_MESSAGE_V2: - request.getExtFields().put("i", properties); - case RequestCode.SEND_MESSAGE: - request.getExtFields().put("properties", properties); - default: - break; - } - } -} diff --git a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/topic/DeFiTopicConfigManager.java b/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/topic/DeFiTopicConfigManager.java deleted file mode 100644 index b895cbd8fd..0000000000 --- a/eventmesh-store/defibus-broker/src/main/java/cn/webank/defibus/broker/topic/DeFiTopicConfigManager.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.webank.defibus.broker.topic; - -import cn.webank.defibus.common.protocol.DeFiBusTopicConfig; -import cn.webank.defibus.common.protocol.body.DeFiBusTopicConfigSerializeWrapper; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.rocketmq.broker.BrokerController; -import org.apache.rocketmq.broker.BrokerPathConfigHelper; -import org.apache.rocketmq.common.ConfigManager; -import org.apache.rocketmq.common.DataVersion; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.constant.LoggerName; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiTopicConfigManager extends ConfigManager { - private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); - - private final ConcurrentHashMap extTopicConfigTable = - new ConcurrentHashMap(1024); - private final DataVersion dataVersion = new DataVersion(); - private final Set systemTopicList = new HashSet(); - private transient BrokerController brokerController; - - public DeFiTopicConfigManager() { - } - - public DeFiTopicConfigManager(BrokerController brokerController) { - this.brokerController = brokerController; - { - // MixAll.SELF_TEST_TOPIC - String topic = MixAll.SELF_TEST_TOPIC; - DeFiBusTopicConfig deFiBusTopicConfig = new DeFiBusTopicConfig(topic); - this.systemTopicList.add(topic); - this.extTopicConfigTable.put(deFiBusTopicConfig.getTopicName(), deFiBusTopicConfig); - } - - { - // MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC - if (this.brokerController.getBrokerConfig().isAutoCreateTopicEnable()) { - String topic = MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC; - DeFiBusTopicConfig deFiBusTopicConfig = new DeFiBusTopicConfig(topic); - this.systemTopicList.add(topic); - this.extTopicConfigTable.put(deFiBusTopicConfig.getTopicName(), deFiBusTopicConfig); - } - } - { - // MixAll.BENCHMARK_TOPIC - String topic = MixAll.BENCHMARK_TOPIC; - DeFiBusTopicConfig deFiBusTopicConfig = new DeFiBusTopicConfig(topic); - this.systemTopicList.add(topic); - this.extTopicConfigTable.put(deFiBusTopicConfig.getTopicName(), deFiBusTopicConfig); - } - { - - String topic = this.brokerController.getBrokerConfig().getBrokerClusterName(); - DeFiBusTopicConfig deFiBusTopicConfig = new DeFiBusTopicConfig(topic); - this.systemTopicList.add(topic); - this.extTopicConfigTable.put(deFiBusTopicConfig.getTopicName(), deFiBusTopicConfig); - } - { - - String topic = this.brokerController.getBrokerConfig().getBrokerName(); - DeFiBusTopicConfig deFiBusTopicConfig = new DeFiBusTopicConfig(topic); - this.systemTopicList.add(topic); - this.extTopicConfigTable.put(deFiBusTopicConfig.getTopicName(), deFiBusTopicConfig); - } - { - // MixAll.OFFSET_MOVED_EVENT - String topic = MixAll.OFFSET_MOVED_EVENT; - DeFiBusTopicConfig deFiBusTopicConfig = new DeFiBusTopicConfig(topic); - this.systemTopicList.add(topic); - this.extTopicConfigTable.put(deFiBusTopicConfig.getTopicName(), deFiBusTopicConfig); - } - { - String rr_reply_topic = this.brokerController.getBrokerConfig().getBrokerClusterName() + "-rr-reply-topic"; - DeFiBusTopicConfig deFiBusTopicConfig = new DeFiBusTopicConfig(rr_reply_topic); - this.systemTopicList.add(rr_reply_topic); - this.extTopicConfigTable.put(deFiBusTopicConfig.getTopicName(), deFiBusTopicConfig); - } - } - - public boolean isSystemTopic(final String topic) { - return this.systemTopicList.contains(topic); - } - - public Set getSystemTopic() { - return this.systemTopicList; - } - - public boolean isTopicCanSendMessage(final String topic) { - return !topic.equals(MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC); - } - - public void updateTopicConfig(final DeFiBusTopicConfig deFiBusTopicConfig) { - DeFiBusTopicConfig old = this.extTopicConfigTable.put(deFiBusTopicConfig.getTopicName(), deFiBusTopicConfig); - if (old != null) { - log.info("update ext topic config, old: " + old + " new: " + deFiBusTopicConfig); - } else { - log.info("create new ext topic, " + deFiBusTopicConfig); - } - - this.dataVersion.nextVersion(); - - this.persist(); - } - - public DeFiBusTopicConfig selectExtTopicConfig(final String topic) { - if (this.brokerController.getTopicConfigManager().selectTopicConfig(topic) == null) { - this.extTopicConfigTable.remove(topic); - this.persist(); - return null; - } - - //This scenario may exists in auto-create topics - if (this.extTopicConfigTable.get(topic) == null) { - extTopicConfigTable.put(topic, new DeFiBusTopicConfig(topic)); - this.persist(); - } - - return this.extTopicConfigTable.get(topic); - } - - public void deleteExtTopicConfig(final String topic) { - DeFiBusTopicConfig old = this.extTopicConfigTable.remove(topic); - if (old != null) { - log.info("delete topic config OK, topic: " + old); - this.dataVersion.nextVersion(); - this.persist(); - } else { - log.warn("delete topic config failed, topic: " + topic + " not exist"); - } - } - - public DeFiBusTopicConfigSerializeWrapper buildExtTopicConfigSerializeWrapper() { - DeFiBusTopicConfigSerializeWrapper ExtTopicConfigSerializeWrapper = new DeFiBusTopicConfigSerializeWrapper(); - ExtTopicConfigSerializeWrapper.setExtTopicConfigTable(this.extTopicConfigTable); - ExtTopicConfigSerializeWrapper.setDataVersion(this.dataVersion); - return ExtTopicConfigSerializeWrapper; - } - - @Override - public String encode() { - return encode(false); - } - - @Override - public String configFilePath() { - String configPath = BrokerPathConfigHelper.getTopicConfigPath(this.brokerController.getMessageStoreConfig() - .getStorePathRootDir()); - - return configPath.replaceAll("topics.json", "topicsExt.json"); - } - - @Override - public void decode(String jsonString) { - if (jsonString != null) { - DeFiBusTopicConfigSerializeWrapper extTopicConfigSerializeWrapper = - DeFiBusTopicConfigSerializeWrapper.fromJson(jsonString, DeFiBusTopicConfigSerializeWrapper.class); - if (extTopicConfigSerializeWrapper != null) { - this.extTopicConfigTable.putAll(extTopicConfigSerializeWrapper.getExtTopicConfigTable()); - this.dataVersion.assignNewOne(extTopicConfigSerializeWrapper.getDataVersion()); - this.printLoadDataWhenFirstBoot(extTopicConfigSerializeWrapper); - } - } - } - - public String encode(final boolean prettyFormat) { - //check consistency of TopicConfigManager and DeFiTopicConfigManager - boolean isChanged = false; - for (Map.Entry entry : this.brokerController.getTopicConfigManager().getTopicConfigTable().entrySet()) { - String topic = entry.getKey(); - if (this.extTopicConfigTable.get(topic) == null) { - this.extTopicConfigTable.put(topic, new DeFiBusTopicConfig(topic)); - isChanged = true; - } - } - if (isChanged) { - log.info("topicConfigManager is not consistent with extTopicConfigManager, auto fix it when encode"); - this.persist(); - } - - DeFiBusTopicConfigSerializeWrapper ExtTopicConfigSerializeWrapper = new DeFiBusTopicConfigSerializeWrapper(); - ExtTopicConfigSerializeWrapper.setExtTopicConfigTable(this.extTopicConfigTable); - ExtTopicConfigSerializeWrapper.setDataVersion(this.dataVersion); - return ExtTopicConfigSerializeWrapper.toJson(prettyFormat); - } - - private void printLoadDataWhenFirstBoot(final DeFiBusTopicConfigSerializeWrapper tcs) { - Iterator> it = tcs.getExtTopicConfigTable().entrySet().iterator(); - while (it.hasNext()) { - Entry next = it.next(); - log.info("load exist local topic, {}", next.getValue().toString()); - } - } - - public DataVersion getDataVersion() { - return dataVersion; - } - - public void clear() { - this.extTopicConfigTable.clear(); - } - - public void addAll(ConcurrentHashMap table) { - this.extTopicConfigTable.putAll(table); - } -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/BrokerFuseTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/BrokerFuseTest.java deleted file mode 100644 index 20d2d9c450..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/BrokerFuseTest.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker; - -import cn.webank.defibus.broker.client.DeFiConsumerGroupInfo; -import cn.webank.defibus.broker.consumequeue.ConsumeQueueManager; -import cn.webank.defibus.broker.consumequeue.ConsumeQueueWaterMark; -import cn.webank.defibus.broker.processor.DeFiSendMessageProcessor; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import cn.webank.defibus.common.protocol.DeFiBusResponseCode; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.net.InetSocketAddress; -import java.util.HashSet; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.rocketmq.broker.client.ConsumerGroupInfo; -import org.apache.rocketmq.broker.client.ConsumerManager; -import org.apache.rocketmq.broker.offset.ConsumerOffsetManager; -import org.apache.rocketmq.broker.topic.TopicConfigManager; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; -import org.apache.rocketmq.common.message.MessageExt; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.store.MessageStore; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import static org.mockito.Matchers.anyLong; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(ConsumeQueueManager.class) -public class BrokerFuseTest { - private DeFiSendMessageProcessor deFiSendMessageProcessor; - @Spy - private DeFiBrokerController brokerController = new DeFiBrokerController( - new BrokerConfig(), - new NettyServerConfig(), - new NettyClientConfig(), - new MessageStoreConfig(), - new DeFiBusBrokerConfig() - ); - - @Mock - private MessageStore messageStore; - @Mock - private ChannelHandlerContext handlerContext; - @Mock - private ConsumeQueueManager deFiQueueManager; - @Mock - private TopicConfigManager topicConfigManager; - - private String topic = "FooBar"; - private String producerGroup = "FooBarGroup"; - private String consumeGroup = "ConGroup"; - private int queueId = 1; - - @Before - public void init() { - brokerController.setMessageStore(messageStore); - when(messageStore.now()).thenReturn(System.currentTimeMillis()); - Channel mockChannel = mock(Channel.class); - when(mockChannel.remoteAddress()).thenReturn(new InetSocketAddress(1024)); - when(handlerContext.channel()).thenReturn(mockChannel); - when(messageStore.lookMessageByOffset(anyLong())).thenReturn(new MessageExt()); - } - - @Test - public void testProcessRequestFuse() throws Exception { - //fuse condition - ConsumeQueueWaterMark minWaterMark = new ConsumeQueueWaterMark(consumeGroup, topic, 1, 1000, 800); - PowerMockito.mockStatic(ConsumeQueueManager.class); - when(ConsumeQueueManager.onlyInstance()).thenReturn(deFiQueueManager); - when(deFiQueueManager.getMaxQueueDepth(topic)).thenReturn((long) 500); - when(deFiQueueManager.getMinAccumulated(topic, queueId)).thenReturn(minWaterMark); - when(deFiQueueManager.getBrokerController()).thenReturn(brokerController); - deFiSendMessageProcessor = new DeFiSendMessageProcessor(brokerController); - - //send message request - final RemotingCommand request = createSendMsgCommand(RequestCode.SEND_MESSAGE); - RemotingCommand response = deFiSendMessageProcessor.processRequest(handlerContext, request); - Assert.assertEquals(response.getCode(), DeFiBusResponseCode.CONSUME_DIFF_SPAN_TOO_LONG); - } - - @Test - public void testAutoUpdateDepth() throws Exception { - ConcurrentHashMap consumerTable = - new ConcurrentHashMap(1024); - DeFiConsumerGroupInfo deFiConsumerGroupInfo = - new DeFiConsumerGroupInfo(consumeGroup, - ConsumeType.CONSUME_ACTIVELY, - MessageModel.CLUSTERING, - ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); - consumerTable.put(consumeGroup, deFiConsumerGroupInfo); - SubscriptionData subscriptionData = new SubscriptionData(topic, "test"); - HashSet hashSet = new HashSet<>(); - hashSet.add(subscriptionData); - deFiConsumerGroupInfo.registerClientId(hashSet, "123"); - ConsumeQueueManager consumeQueueManager = ConsumeQueueManager.onlyInstance(); - consumeQueueManager.setBrokerController(brokerController); - ConsumerManager consumerManager = brokerController.getConsumerManager(); - ConsumerOffsetManager consumerOffsetManager = brokerController.getConsumerOffsetManager(); - consumerOffsetManager.commitOffset("resetByBroker", consumeGroup, topic, queueId, 100); - TopicConfig topicConfig = new TopicConfig(topic, 4, 4, 6); - - Assert.assertEquals(consumerOffsetManager.queryOffset(consumeGroup, topic, queueId), 100); - when(brokerController.getTopicConfigManager()).thenReturn(topicConfigManager); - when(topicConfigManager.selectTopicConfig(topic)).thenReturn(topicConfig); - - Field field = ConsumerManager.class.getDeclaredField("consumerTable"); - field.setAccessible(true); - field.set(consumerManager, consumerTable); - - Method method = ConsumeQueueManager.class.getDeclaredMethod("autoUpdateDepth", String.class, String.class, int.class, long.class, long.class); - method.setAccessible(true); - method.invoke(consumeQueueManager, consumeGroup, topic, queueId, 500, 1500); - Assert.assertEquals(consumerOffsetManager.queryOffset(consumeGroup, topic, queueId), 1500 - 500 * 0.65, 0); - - } - - private RemotingCommand createSendMsgCommand(int requestCode) { - SendMessageRequestHeader requestHeader = createSendMsgRequestHeader(); - - RemotingCommand request = RemotingCommand.createRequestCommand(requestCode, requestHeader); - request.setBody(new byte[] {'a'}); - request.makeCustomHeaderToNet(); - return request; - } - - private SendMessageRequestHeader createSendMsgRequestHeader() { - SendMessageRequestHeader requestHeader = new SendMessageRequestHeader(); - requestHeader.setProducerGroup(producerGroup); - requestHeader.setTopic(topic); - requestHeader.setDefaultTopic(MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC); - requestHeader.setDefaultTopicQueueNums(3); - requestHeader.setQueueId(queueId); - requestHeader.setSysFlag(0); - requestHeader.setBornTimestamp(System.currentTimeMillis()); - requestHeader.setFlag(124); - requestHeader.setReconsumeTimes(0); - return requestHeader; - } -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/DeFiBrokerControllerTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/DeFiBrokerControllerTest.java deleted file mode 100644 index e0c436cd6e..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/DeFiBrokerControllerTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker; - -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import java.io.File; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.UtilAll; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.After; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DeFiBrokerControllerTest { - @Test - public void testBrokerRestart() throws Exception { - DeFiBrokerController brokerController = new DeFiBrokerController( - new BrokerConfig(), - new NettyServerConfig(), - new NettyClientConfig(), - new MessageStoreConfig(), - new DeFiBusBrokerConfig()); - assertThat(brokerController.initialize()); - brokerController.start(); - brokerController.shutdown(); - } - - @After - public void destroy() { - UtilAll.deleteFile(new File(new MessageStoreConfig().getStorePathRootDir())); - } -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/DeFiBusBrokerStartupTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/DeFiBusBrokerStartupTest.java deleted file mode 100644 index f67ea674f6..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/DeFiBusBrokerStartupTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Properties; -import org.junit.Assert; -import org.junit.Test; - -public class DeFiBusBrokerStartupTest { - - private String storePathRootDir = "."; - - @Test - public void testProperties2SystemEnv() throws NoSuchMethodException, InvocationTargetException, - IllegalAccessException { - Properties properties = new Properties(); - Class clazz = DeFiBusBrokerStartup.class; - Method method = clazz.getDeclaredMethod("parsePropertie2SystemEnv", Properties.class); - method.setAccessible(true); - System.setProperty("rocketmq.namesrv.domain", "jmenv.tbsite.net"); - method.invoke(null, properties); - Assert.assertEquals("jmenv.tbsite.net", System.getProperty("rocketmq.namesrv.domain")); - } -} \ No newline at end of file diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/AdjustQueueNumStrategyTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/AdjustQueueNumStrategyTest.java deleted file mode 100644 index 09cd0c7d48..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/AdjustQueueNumStrategyTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.webank.defibus.broker.client; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.store.MessageStore; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class AdjustQueueNumStrategyTest { - - private String topic = "AdjustQueue"; - private AdjustQueueNumStrategy adjustQueueNumStrategy; - @Spy - private DeFiBrokerController deFiBrokerController = new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), new MessageStoreConfig(), new DeFiBusBrokerConfig()); - @Mock - private MessageStore messageStore; - - @Before - public void init() { - deFiBrokerController.setMessageStore(messageStore); - adjustQueueNumStrategy = new AdjustQueueNumStrategy(deFiBrokerController); - } - - @Test - public void testIsCanAdjustReadQueueSizeByFalse() { - deFiBrokerController.getTopicConfigManager().updateTopicConfig(createTopic()); - when(messageStore.getMaxOffsetInQueue(anyString(), anyInt())).thenReturn(1000L); - when(messageStore.getMessageStoreTimeStamp(anyString(), anyInt(), anyLong())).thenReturn(System.currentTimeMillis()); - boolean flag = adjustQueueNumStrategy.isCanAdjustReadQueueSize(topic, 3); - assertThat(flag).isFalse(); - } - - @Test - public void testIsCanAdjustReadQueueSizeByTrue() { - deFiBrokerController.getTopicConfigManager().updateTopicConfig(createTopic()); - boolean flag = adjustQueueNumStrategy.isCanAdjustReadQueueSize(topic, 4); - assertThat(flag).isTrue(); - } - - private TopicConfig createTopic() { - TopicConfig topicConfig = new TopicConfig(); - topicConfig.setTopicName(topic); - topicConfig.setWriteQueueNums(4); - topicConfig.setReadQueueNums(4); - return topicConfig; - } - -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/DeFiConsumerManagerTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/DeFiConsumerManagerTest.java deleted file mode 100644 index ac5164abb0..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/DeFiConsumerManagerTest.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.client; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import cn.webank.defibus.common.util.ReflectUtil; -import io.netty.channel.Channel; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import org.apache.rocketmq.broker.BrokerController; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumerData; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.remoting.protocol.LanguageCode; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Spy; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -public class DeFiConsumerManagerTest { - @Spy - private DeFiBrokerController deFiBrokerController = new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), new MessageStoreConfig(), new DeFiBusBrokerConfig()); - private DeFiConsumerManager deFiConsumerManager; - ConsumerIdsChangeListener consumerIdsChangeListener = (ConsumerIdsChangeListener) ReflectUtil.getSimpleProperty(BrokerController.class, deFiBrokerController, "consumerIdsChangeListener"); - private AdjustQueueNumStrategy adjustQueueNumStrategy = new AdjustQueueNumStrategy(deFiBrokerController); - private String topic = "FooBar"; - private String group = "FooBarGroup"; - private ClientChannelInfo clientChannelInfo; - private String clientId = UUID.randomUUID().toString(); - private ConsumerData consumerData; - private Channel mockChannel; - - @Before - public void init() { - deFiConsumerManager = new DeFiConsumerManager(consumerIdsChangeListener, adjustQueueNumStrategy); - mockChannel = mock(Channel.class); - clientChannelInfo = new ClientChannelInfo(mockChannel, clientId, LanguageCode.JAVA, 100); - consumerData = createConsumerData(group, topic); - deFiConsumerManager.registerConsumer(consumerData.getGroupName(), - clientChannelInfo, - consumerData.getConsumeType(), - consumerData.getMessageModel(), - consumerData.getConsumeFromWhere(), - consumerData.getSubscriptionDataSet(), - false); - } - - @Test - public void testRegisterAndUnregisterConsumer() { - assertThat(deFiConsumerManager.getConsumerTable().size()).isEqualTo(1); - deFiConsumerManager.unregisterConsumer(consumerData.getGroupName(), clientChannelInfo, false); - assertThat(deFiConsumerManager.getConsumerTable().size()).isEqualTo(0); - } - - @Test - public void testDoChannelCloseEvent() { - assertThat(deFiConsumerManager.getConsumerTable().size()).isEqualTo(1); - deFiConsumerManager.doChannelCloseEvent("127.0.0.1", mockChannel); - assertThat(deFiConsumerManager.getConsumerTable().size()).isEqualTo(0); - } - - private ConsumerData createConsumerData(String group, String topic) { - ConsumerData consumerData = new ConsumerData(); - consumerData.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); - consumerData.setConsumeType(ConsumeType.CONSUME_PASSIVELY); - consumerData.setGroupName(group); - consumerData.setMessageModel(MessageModel.CLUSTERING); - Set subscriptionDataSet = new HashSet<>(); - SubscriptionData subscriptionData = new SubscriptionData(); - subscriptionData.setTopic(topic); - subscriptionData.setSubString("*"); - subscriptionData.setSubVersion(100L); - subscriptionDataSet.add(subscriptionData); - consumerData.setSubscriptionDataSet(subscriptionDataSet); - return consumerData; - } - -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/DeFiProducerManagerTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/DeFiProducerManagerTest.java deleted file mode 100644 index ab13d854f2..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/client/DeFiProducerManagerTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.client; - -import io.netty.channel.Channel; -import java.util.HashMap; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.remoting.protocol.LanguageCode; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; - -import static org.assertj.core.api.Assertions.assertThat; - -@RunWith(MockitoJUnitRunner.class) -public class DeFiProducerManagerTest { - private DeFiProducerManager deFiProducerManager; - private String group = "FooBar"; - private ClientChannelInfo clientInfo; - - @Mock - private Channel channel; - - @Before - public void init() { - deFiProducerManager = new DeFiProducerManager(); - clientInfo = new ClientChannelInfo(channel, "ClientIdTest", LanguageCode.JAVA, 1); - - } - - @Test - public void doChannelCloseEvent() throws Exception { - deFiProducerManager.registerProducer(group, clientInfo); - assertThat(deFiProducerManager.getGroupChannelTable().get(group).get(channel)).isNotNull(); - - assertThat(deFiProducerManager.getProducerChannelTable().get(clientInfo.getClientId())).isNotNull(); - assertThat(deFiProducerManager.getProducerChannelTable().get(clientInfo.getClientId())).isEqualTo(clientInfo); - - deFiProducerManager.doChannelCloseEvent("127.0.0.1", channel); - assertThat(deFiProducerManager.getGroupChannelTable().get(group).get(channel)).isNull(); - - assertThat(deFiProducerManager.getProducerChannelTable().get(clientInfo.getClientId())).isNull(); - } - - @Test - public void testRegisterProducer() throws Exception { - deFiProducerManager.registerProducer(group, clientInfo); - HashMap channelMap = deFiProducerManager.getGroupChannelTable().get(group); - assertThat(channelMap).isNotNull(); - assertThat(channelMap.get(channel)).isEqualTo(clientInfo); - - assertThat(deFiProducerManager.getProducerChannelTable().get(clientInfo.getClientId())).isNotNull(); - assertThat(deFiProducerManager.getProducerChannelTable().get(clientInfo.getClientId())).isEqualTo(clientInfo); - } - - @Test - public void unregisterProducer() throws Exception { - deFiProducerManager.registerProducer(group, clientInfo); - HashMap channelMap = deFiProducerManager.getGroupChannelTable().get(group); - assertThat(channelMap).isNotNull(); - assertThat(channelMap.get(channel)).isEqualTo(clientInfo); - - assertThat(deFiProducerManager.getProducerChannelTable().get(clientInfo.getClientId())).isNotNull(); - assertThat(deFiProducerManager.getProducerChannelTable().get(clientInfo.getClientId())).isEqualTo(clientInfo); - - deFiProducerManager.unregisterProducer(group, clientInfo); - channelMap = deFiProducerManager.getGroupChannelTable().get(group); - assertThat(channelMap).isNull(); - - assertThat(deFiProducerManager.getProducerChannelTable().get(clientInfo.getClientId())).isNull(); - assertThat(deFiProducerManager.getProducerChannelTable().get(clientInfo.getClientId())).isNull(); - } - -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueManagerTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueManagerTest.java deleted file mode 100644 index c85d2e06df..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/consumequeue/ConsumeQueueManagerTest.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.consumequeue; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import io.netty.channel.Channel; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumerData; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.remoting.protocol.LanguageCode; -import org.apache.rocketmq.store.MessageStore; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class ConsumeQueueManagerTest { - private ConsumeQueueManager consumeQueueManager = ConsumeQueueManager.onlyInstance(); - @Spy - private DeFiBrokerController deFiBrokerController = new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), new MessageStoreConfig(), new DeFiBusBrokerConfig()); - @Mock - private MessageStore messageStore; - private final String group = "BarGroup"; - private final String topic = "BarTopic"; - private final int queueId = 0; - private final long offSet = 1024; - @Mock - private Channel channel; - private ClientChannelInfo clientChannelInfo; - private String clientId = UUID.randomUUID().toString(); - - @Before - public void init() { - deFiBrokerController.setMessageStore(messageStore); - consumeQueueManager.setBrokerController(deFiBrokerController); - } - - @Test - public void testRecordAndScanUnsubscribedTopic() { - consumeQueueManager.recordLastDeliverOffset(group, topic, queueId, offSet); - long deliverOffset = consumeQueueManager.queryDeliverOffset(group, topic, queueId); - assertThat(deliverOffset).isEqualTo(offSet); - consumeQueueManager.scanUnsubscribedTopic(); - long deliverOffsetNew = consumeQueueManager.queryDeliverOffset(group, topic, queueId); - assertThat(deliverOffsetNew).isEqualTo(-1); - } - - @Test - public void testGetMinAccumulated() throws Exception { - clientChannelInfo = new ClientChannelInfo(channel, clientId, LanguageCode.JAVA, 100); - ConsumerData consumerData = createConsumerData(group, topic); - deFiBrokerController.getConsumerManager().registerConsumer( - consumerData.getGroupName(), - clientChannelInfo, - consumerData.getConsumeType(), - consumerData.getMessageModel(), - consumerData.getConsumeFromWhere(), - consumerData.getSubscriptionDataSet(), - false); - deFiBrokerController.getConsumerOffsetManager().commitOffset(clientId, group, topic, queueId, offSet); - consumeQueueManager.setBrokerController(deFiBrokerController); - when(messageStore.getMaxOffsetInQueue(topic, queueId)).thenReturn(1025L); - ConsumeQueueWaterMark mark = consumeQueueManager.getMinAccumulated(topic, queueId); - assertThat(mark).isNotNull(); - assertThat(mark.getTopic()).isEqualTo(topic); - assertThat(mark.getConsumerGroup()).isEqualTo(group); - assertThat(mark.getAccumulated()).isEqualTo(1); - } - - private static ConsumerData createConsumerData(String group, String topic) { - ConsumerData consumerData = new ConsumerData(); - consumerData.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); - consumerData.setConsumeType(ConsumeType.CONSUME_PASSIVELY); - consumerData.setGroupName(group); - consumerData.setMessageModel(MessageModel.CLUSTERING); - Set subscriptionDataSet = new HashSet<>(); - SubscriptionData subscriptionData = new SubscriptionData(); - subscriptionData.setTopic(topic); - subscriptionData.setSubString("*"); - subscriptionData.setSubVersion(100L); - subscriptionDataSet.add(subscriptionData); - consumerData.setSubscriptionDataSet(subscriptionDataSet); - return consumerData; - } - -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/consumequeue/MessageRedirectManagerTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/consumequeue/MessageRedirectManagerTest.java deleted file mode 100644 index 1884b273cd..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/consumequeue/MessageRedirectManagerTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.webank.defibus.broker.consumequeue; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import cn.webank.defibus.common.DeFiBusConstant; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageDecoder; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Before; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.spy; - -public class MessageRedirectManagerTest { - private DeFiBusBrokerConfig deFiBusBrokerConfig = new DeFiBusBrokerConfig(); - private MessageRedirectManager messageRedirectManager; - private DeFiBrokerController deFiBrokerController; - private String topic = "TestTopic"; - private String group = "TestGroup"; - private String clientId = UUID.randomUUID().toString(); - - - @Before - public void init() { - deFiBrokerController = spy(new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), new MessageStoreConfig(), deFiBusBrokerConfig)); - messageRedirectManager=new MessageRedirectManager(deFiBrokerController); - messageRedirectManager.updateConfigs(createRedirectConfItem()); - deFiBrokerController.getClientRebalanceResultManager().updateListenMap(group,topic,1,"127.0.0.1"); - } - @Test - public void testRedirectMessageToWhichQueue() throws Exception { - MessageRedirectManager.RedirectResult result = messageRedirectManager.redirectMessageToWhichQueue(createSendMsgRequestHeader(),"flag"); - assertThat(result.getStates()).isEqualTo(MessageRedirectManager.RedirectStates.REDIRECT_OK); - assertThat(result.getRedirectQueueId()).isEqualTo(1); - } - - - private List createRedirectConfItem(){ - List list = new ArrayList(); - MessageRedirectManager.RedirectConfItem item = new MessageRedirectManager.RedirectConfItem(); - item.setConsumerGroup(group); - item.setTopic(topic); - Set ips = new HashSet<>(); - ips.add("127.0.0.1"); - item.setIps(ips); - item.setRedirectFlag("flag"); - list.add(item); - return list ; - } - private SendMessageRequestHeader createSendMsgRequestHeader() { - SendMessageRequestHeader requestHeader = new SendMessageRequestHeader(); - requestHeader.setProducerGroup(group); - requestHeader.setTopic(topic); - requestHeader.setDefaultTopic(MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC); - requestHeader.setDefaultTopicQueueNums(3); - requestHeader.setQueueId(1); - requestHeader.setSysFlag(0); - requestHeader.setBornTimestamp(System.currentTimeMillis()); - requestHeader.setFlag(124); - Message msg = new Message(); - msg.putUserProperty(DeFiBusConstant.KEY, DeFiBusConstant.REPLY); - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO, clientId); - msg.setBody(new String("abcd").getBytes()); - requestHeader.setProperties(MessageDecoder.messageProperties2String(msg.getProperties())); - return requestHeader; - } - -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/monitor/QueueListeningMonitorTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/monitor/QueueListeningMonitorTest.java deleted file mode 100644 index c062162bbe..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/monitor/QueueListeningMonitorTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.monitor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import java.lang.reflect.Field; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.verify; - -@RunWith(MockitoJUnitRunner.class) -public class QueueListeningMonitorTest { - private DeFiBrokerController deFiBrokerController; - - @Mock - QueueListeningMonitor queueListeningMonitor; - - @Before - public void init() throws Exception { - deFiBrokerController = new DeFiBrokerController( - new BrokerConfig(), - new NettyServerConfig(), - new NettyClientConfig(), - new MessageStoreConfig(), - new DeFiBusBrokerConfig()); - assertThat(deFiBrokerController.initialize()); - - Field field = DeFiBrokerController.class.getDeclaredField("queueListeningMonitor"); - field.setAccessible(true); - field.set(deFiBrokerController, queueListeningMonitor); - } - - @Test - public void testQueueListeningMonitorStart() throws Exception { - deFiBrokerController.start(); - verify(queueListeningMonitor).start(); - } - - @After - public void shutdown() { - deFiBrokerController.shutdown(); - } -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/plugin/DeFiPluginMessageStoreTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/plugin/DeFiPluginMessageStoreTest.java deleted file mode 100644 index f7eeb92351..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/plugin/DeFiPluginMessageStoreTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.webank.defibus.broker.plugin; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import java.lang.reflect.Field; -import org.apache.rocketmq.broker.plugin.MessageStorePluginContext; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.store.AppendMessageResult; -import org.apache.rocketmq.store.AppendMessageStatus; -import org.apache.rocketmq.store.GetMessageResult; -import org.apache.rocketmq.store.GetMessageStatus; -import org.apache.rocketmq.store.MessageExtBrokerInner; -import org.apache.rocketmq.store.MessageStore; -import org.apache.rocketmq.store.PutMessageResult; -import org.apache.rocketmq.store.PutMessageStatus; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; - -import static junit.framework.TestCase.assertTrue; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class DeFiPluginMessageStoreTest { - - @Mock - private MessageStorePluginContext messageStorePluginContext; - @Spy - private DeFiBrokerController deFiBrokerController = new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), new MessageStoreConfig(),new DeFiBusBrokerConfig()); - @Mock - private MessageStore messageStore; - @Spy - private DeFiPluginMessageStore deFiPluginMessageStore =new DeFiPluginMessageStore(messageStorePluginContext,messageStore);; - - private String topic = "FooBar"; - private String group = "FooBarGroup"; - - @Before - public void init()throws Exception{ - Field field = DeFiPluginMessageStore.class.getDeclaredField("next"); - field.setAccessible(true); - field.set(deFiPluginMessageStore,messageStore); - deFiBrokerController.setMessageStore(messageStore); - deFiBrokerController.getConsumeQueueManager().getBrokerController().setMessageStore(messageStore); - deFiBrokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(topic,2,6,0); - deFiPluginMessageStore.start(); - } - - @Test - public void testPutMessage(){ - MessageExtBrokerInner inner = new MessageExtBrokerInner(); - when(messageStore.putMessage(inner)).thenReturn(new PutMessageResult(PutMessageStatus.PUT_OK, new AppendMessageResult(AppendMessageStatus.PUT_OK))); - PutMessageResult result = deFiPluginMessageStore.putMessage(inner); - assertThat(result.getPutMessageStatus()).isEqualTo(PutMessageStatus.PUT_OK); - assertTrue(result.getAppendMessageResult().isOk()); - } - - @Test - public void testGetMessage(){ - GetMessageResult getMessageResult = new GetMessageResult(); - getMessageResult.setStatus(GetMessageStatus.FOUND); - getMessageResult.setNextBeginOffset(1); - when(messageStore.getMessage(group,topic,1,0,0,null)).thenReturn(getMessageResult); - GetMessageResult result = deFiPluginMessageStore.getMessage(group,topic,1,0,0,null); - assertThat(result.getStatus()).isEqualTo(GetMessageStatus.FOUND); - assertThat(result.getNextBeginOffset()).isEqualTo(1); - } - - @After - public void shutdown(){ - deFiPluginMessageStore.shutdown(); - } - -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/plugin/PluginStoreStatServiceTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/plugin/PluginStoreStatServiceTest.java deleted file mode 100644 index 7fb14280e4..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/plugin/PluginStoreStatServiceTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.webank.defibus.broker.plugin; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class PluginStoreStatServiceTest { - - private PluginStoreStatService pluginStoreStatService = new PluginStoreStatService(); - - @Before - public void init() { - pluginStoreStatService.start(); - } - - @Test - public void testRecordPutTime() { - long value = 999; - while (true) { - pluginStoreStatService.recordPutTime(value); - value = value * 10; - if (value > 1000000000) - break; - } - pluginStoreStatService.printStoreStat(); - } - - @Test - public void testRecordGetTime() { - long value = 999; - while (true) { - pluginStoreStatService.recordGetTime(value); - value = value * 10; - if (value > 1000000000) - break; - } - pluginStoreStatService.printStoreStat(); - } - - @After - public void shutDown() { - pluginStoreStatService.shutdown(); - } -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiAdminBrokerProcessorTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiAdminBrokerProcessorTest.java deleted file mode 100644 index 39604c5c4f..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiAdminBrokerProcessorTest.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import cn.webank.defibus.common.admin.DeFiBusConsumeStats; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import io.netty.channel.ChannelHandlerContext; -import java.nio.ByteBuffer; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.TopicFilterType; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.CreateTopicRequestHeader; -import org.apache.rocketmq.common.protocol.header.GetConsumeStatsRequestHeader; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.remoting.protocol.RemotingSerializable; -import org.apache.rocketmq.store.MappedFile; -import org.apache.rocketmq.store.MessageStore; -import org.apache.rocketmq.store.SelectMappedBufferResult; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.runners.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doAnswer; - -@RunWith(MockitoJUnitRunner.class) -public class DeFiAdminBrokerProcessorTest { - - private DeFiAdminBrokerProcessor deFiAdminBrokerProcessor; - - @Mock - private ChannelHandlerContext handlerContext; - - @Spy - private DeFiBrokerController - deFiBrokerController = new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), - new MessageStoreConfig(), new DeFiBusBrokerConfig()); - - @Mock - private MessageStore messageStore; - - private String consumerGroup; - private String topic; - - @Before - public void init() { - deFiBrokerController.setMessageStore(messageStore); - deFiAdminBrokerProcessor = new DeFiAdminBrokerProcessor(deFiBrokerController); - consumerGroup = "tempGroup"; - topic = "testTopic"; - } - - @Test - public void testProcessRequestUpdateAndCreateTopic() throws RemotingCommandException { - RemotingCommand request = createCommand(RequestCode.UPDATE_AND_CREATE_TOPIC); - final RemotingCommand[] response = new RemotingCommand[1]; - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - response[0] = (RemotingCommand) invocation.getArguments()[0]; - return null; - } - }).when(handlerContext).writeAndFlush(any(Object.class)); - RemotingCommand responseToReturn = deFiAdminBrokerProcessor.processRequest(handlerContext, request); - if (responseToReturn != null) { - Assert.assertNull(response[0]); - response[0] = responseToReturn; - } - Assert.assertEquals(response[0].getCode(), ResponseCode.SUCCESS); - Assert.assertEquals(response[0].getOpaque(), request.getOpaque()); - } - - @Test - public void testProcessRequestUpdateAndCreateTopic_fail() throws RemotingCommandException { - RemotingCommand request = createCommand(RequestCode.UPDATE_AND_CREATE_TOPIC); - - RemotingCommand response = deFiAdminBrokerProcessor.processRequest(handlerContext, request); - } - - @Test - public void testProcessRequest_GET_CONSUME_STATS_V2() throws RemotingCommandException { - RemotingCommand request = createCommand(DeFiBusRequestCode.GET_CONSUME_STATS_V2); - deFiBrokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(topic, 1, 6, 0); - RemotingCommand response = deFiAdminBrokerProcessor.processRequest(handlerContext, request); - assertThat(response.getCode()).isEqualTo(ResponseCode.SUCCESS); - DeFiBusConsumeStats consumerStats = RemotingSerializable.decode(response.getBody(), DeFiBusConsumeStats.class); - assertThat(consumerStats).isNotNull(); - } - - private SelectMappedBufferResult createSelectMappedBufferResult() { - SelectMappedBufferResult result = new SelectMappedBufferResult(0, ByteBuffer.allocate(1024), 0, new MappedFile()); - return result; - } - - private RemotingCommand createCommand(int requestCode) { - RemotingCommand request = null; - if (requestCode == RequestCode.UPDATE_AND_CREATE_TOPIC) { - request = RemotingCommand.createRequestCommand(requestCode, getCreateTopicRequestHeader()); - } else if (requestCode == DeFiBusRequestCode.GET_CONSUME_STATS_V2) { - request = RemotingCommand.createRequestCommand(requestCode, getConsumeStatsRequestHeader()); - } else if (requestCode == RequestCode.GET_BROKER_RUNTIME_INFO) { - request = RemotingCommand.createRequestCommand(requestCode, getConsumeStatsRequestHeader()); - } - request.setOpaque(1); - request.makeCustomHeaderToNet(); - return request; - } - - private GetConsumeStatsRequestHeader getConsumeStatsRequestHeader() { - GetConsumeStatsRequestHeader header = new GetConsumeStatsRequestHeader(); - header.setConsumerGroup(consumerGroup); - header.setTopic(topic); - return header; - } - - private CreateTopicRequestHeader getCreateTopicRequestHeader() { - CreateTopicRequestHeader header = new CreateTopicRequestHeader(); - header.setTopic(topic); - header.setDefaultTopic("DefaultCluster"); - header.setReadQueueNums(1); - header.setWriteQueueNums(1); - header.setPerm(6); - header.setTopicFilterType(TopicFilterType.SINGLE_TAG.toString()); - header.setTopicSysFlag(1); - return header; - } -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiClientManageProcessorTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiClientManageProcessorTest.java deleted file mode 100644 index fe73c0dc15..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiClientManageProcessorTest.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.defibus.common.protocol.header.GetConsumerListByGroupAndTopicRequestHeader; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.broker.client.ConsumerGroupInfo; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.GetConsumerListByGroupResponseBody; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumerData; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.remoting.protocol.LanguageCode; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.remoting.protocol.RemotingSerializable; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.assertj.core.api.Assertions.assertThat; - -@RunWith(MockitoJUnitRunner.class) -public class DeFiClientManageProcessorTest { - private DeFiClientManageProcessor deFiClientManageProcessor; - @Spy - private DeFiBrokerController deFiBrokerController = new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), new MessageStoreConfig(), new DeFiBusBrokerConfig()); - @Mock - private ChannelHandlerContext handlerContext; - @Mock - private Channel channel; - - private ClientChannelInfo clientChannelInfo; - private String clientId = UUID.randomUUID().toString(); - private String group = "FooBarGroup"; - private String topic = "FooBar"; - - @Before - public void init() { - // when(handlerContext.channel()).thenReturn(channel); - deFiClientManageProcessor = new DeFiClientManageProcessor(deFiBrokerController); - clientChannelInfo = new ClientChannelInfo(channel, clientId, LanguageCode.JAVA, 100); - ConsumerData consumerData = createConsumerData(group, topic); - deFiBrokerController.getConsumerManager().registerConsumer( - consumerData.getGroupName(), - clientChannelInfo, - consumerData.getConsumeType(), - consumerData.getMessageModel(), - consumerData.getConsumeFromWhere(), - consumerData.getSubscriptionDataSet(), - false); - } - - @Test - public void processRequest_GetConsumerListByGroupAndTopic() throws Exception { - ConsumerGroupInfo consumerGroupInfo = deFiBrokerController.getConsumerManager().getConsumerGroupInfo(group); - assertThat(consumerGroupInfo).isNotNull(); - - RemotingCommand request = GetConsumerListCommand(); - RemotingCommand response = deFiClientManageProcessor.processRequest(handlerContext, request); - assertThat(response).isNotNull(); - assertThat(response.getCode()).isEqualTo(ResponseCode.SUCCESS); - GetConsumerListByGroupResponseBody body = RemotingSerializable.decode(response.getBody(), GetConsumerListByGroupResponseBody.class); - List clientIdList = body.getConsumerIdList(); - assertThat(clientIdList).isNotNull(); - assertThat(clientIdList.get(0)).isEqualTo(clientId); - } - - @Test - public void processRequest_GetConsumerListByGroupAndTopicIsNull() throws Exception { - ConsumerGroupInfo consumerGroupInfo = deFiBrokerController.getConsumerManager().getConsumerGroupInfo(group); - assertThat(consumerGroupInfo).isNotNull(); - - RemotingCommand request = GetConsumerListCommandWithNoTopic(); - RemotingCommand response = response = deFiClientManageProcessor.processRequest(handlerContext, request); - assertThat(response).isNotNull(); - assertThat(response.getCode()).isEqualTo(ResponseCode.SUCCESS); - GetConsumerListByGroupResponseBody body = RemotingSerializable.decode(response.getBody(), GetConsumerListByGroupResponseBody.class); - List clientIdList = body.getConsumerIdList(); - assertThat(clientIdList).isNotNull(); - assertThat(clientIdList.get(0)).isEqualTo(clientId); - } - - private RemotingCommand GetConsumerListCommand() { - GetConsumerListByGroupAndTopicRequestHeader requestHeader = new GetConsumerListByGroupAndTopicRequestHeader(); - requestHeader.setConsumerGroup(group); - requestHeader.setTopic(topic); - RemotingCommand request = RemotingCommand.createRequestCommand(DeFiBusRequestCode.GET_CONSUMER_LIST_BY_GROUP_AND_TOPIC, requestHeader); - request.setLanguage(LanguageCode.JAVA); - request.setVersion(100); - request.makeCustomHeaderToNet(); - return request; - } - - private RemotingCommand GetConsumerListCommandWithNoTopic() { - GetConsumerListByGroupAndTopicRequestHeader requestHeader = new GetConsumerListByGroupAndTopicRequestHeader(); - requestHeader.setConsumerGroup(group); - RemotingCommand request = RemotingCommand.createRequestCommand(DeFiBusRequestCode.GET_CONSUMER_LIST_BY_GROUP_AND_TOPIC, requestHeader); - request.setLanguage(LanguageCode.JAVA); - request.setVersion(100); - request.makeCustomHeaderToNet(); - return request; - } - - static ConsumerData createConsumerData(String group, String topic) { - ConsumerData consumerData = new ConsumerData(); - consumerData.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); - consumerData.setConsumeType(ConsumeType.CONSUME_PASSIVELY); - consumerData.setGroupName(group); - consumerData.setMessageModel(MessageModel.CLUSTERING); - Set subscriptionDataSet = new HashSet<>(); - SubscriptionData subscriptionData = new SubscriptionData(); - subscriptionData.setTopic(topic); - subscriptionData.setSubString("*"); - subscriptionData.setSubVersion(100L); - subscriptionDataSet.add(subscriptionData); - consumerData.setSubscriptionDataSet(subscriptionDataSet); - return consumerData; - } -} \ No newline at end of file diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiPullMessageProcessorTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiPullMessageProcessorTest.java deleted file mode 100644 index 5a6d81ce97..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiPullMessageProcessorTest.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.PullMessageRequestHeader; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType; -import org.apache.rocketmq.common.protocol.heartbeat.ConsumerData; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.remoting.protocol.LanguageCode; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.store.MessageStore; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class DeFiPullMessageProcessorTest { - private DeFiPullMessageProcessor deFiPullMessageProcessor; - @Spy - private DeFiBrokerController deFiBrokerController = new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), new MessageStoreConfig(), new DeFiBusBrokerConfig()); - @Mock - private ChannelHandlerContext handlerContext; - @Mock - private MessageStore messageStore; - private ClientChannelInfo clientChannelInfo; - private String group = "FooBarGroup"; - private String topic = "FooBar"; - private String clientId = UUID.randomUUID().toString(); - - @Before - public void init() { - deFiBrokerController.setMessageStore(messageStore); - deFiPullMessageProcessor = new DeFiPullMessageProcessor(deFiBrokerController); - Channel mockChannel = mock(Channel.class); - when(handlerContext.channel()).thenReturn(mockChannel); - deFiBrokerController.getTopicConfigManager().getTopicConfigTable().put(topic, new TopicConfig()); - clientChannelInfo = new ClientChannelInfo(mockChannel, clientId, LanguageCode.JAVA, 100); - ConsumerData consumerData = createConsumerData(group, topic); - deFiBrokerController.getConsumerManager().registerConsumer( - consumerData.getGroupName(), - clientChannelInfo, - consumerData.getConsumeType(), - consumerData.getMessageModel(), - consumerData.getConsumeFromWhere(), - consumerData.getSubscriptionDataSet(), - false); - } - - @Test - public void testProcessRequest_SubNotLatest() throws RemotingCommandException { - final RemotingCommand request = createPullMsgCommand(RequestCode.PULL_MESSAGE); - request.addExtField("subVersion", String.valueOf(101)); - RemotingCommand response = deFiPullMessageProcessor.processRequest(handlerContext, request); - assertThat(response).isNotNull(); - assertThat(response.getCode()).isEqualTo(ResponseCode.PULL_NOT_FOUND); - assertThat(response.getRemark()).contains("subscription not latest"); - } - - private RemotingCommand createPullMsgCommand(int requestCode) { - PullMessageRequestHeader requestHeader = new PullMessageRequestHeader(); - requestHeader.setCommitOffset(123L); - requestHeader.setConsumerGroup(group); - requestHeader.setMaxMsgNums(100); - requestHeader.setQueueId(1); - requestHeader.setQueueOffset(456L); - requestHeader.setSubscription("*"); - requestHeader.setTopic(topic); - requestHeader.setSysFlag(0); - requestHeader.setSubVersion(100L); - RemotingCommand request = RemotingCommand.createRequestCommand(requestCode, requestHeader); - request.makeCustomHeaderToNet(); - return request; - } - - static ConsumerData createConsumerData(String group, String topic) { - ConsumerData consumerData = new ConsumerData(); - consumerData.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); - consumerData.setConsumeType(ConsumeType.CONSUME_PASSIVELY); - consumerData.setGroupName(group); - consumerData.setMessageModel(MessageModel.CLUSTERING); - Set subscriptionDataSet = new HashSet<>(); - SubscriptionData subscriptionData = new SubscriptionData(); - subscriptionData.setTopic(topic); - subscriptionData.setSubString("*"); - subscriptionData.setSubVersion(100L); - subscriptionDataSet.add(subscriptionData); - consumerData.setSubscriptionDataSet(subscriptionDataSet); - return consumerData; - } -} \ No newline at end of file diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiReplyMessageProcessorTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiReplyMessageProcessorTest.java deleted file mode 100644 index fb5855213a..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiReplyMessageProcessorTest.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.broker.client.DeFiProducerManager; -import cn.webank.defibus.broker.net.DeFiBusBroker2Client; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import java.net.InetSocketAddress; -import java.util.UUID; -import org.apache.rocketmq.broker.client.ClientChannelInfo; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageDecoder; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.store.AppendMessageResult; -import org.apache.rocketmq.store.AppendMessageStatus; -import org.apache.rocketmq.store.MessageStore; -import org.apache.rocketmq.store.PutMessageResult; -import org.apache.rocketmq.store.PutMessageStatus; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - -public class DeFiReplyMessageProcessorTest { - private DeFiBusBrokerConfig deFiBusBrokerConfig = new DeFiBusBrokerConfig(); - private DeFiReplyMessageProcessor deFiReplyMessageProcessor; - private ChannelHandlerContext channelHandlerContext; - private DeFiBrokerController deFiBrokerController; - private MessageStore messageStore; - private String topic = "TestTopic"; - private String group = "TestGroup"; - private String clientId = UUID.randomUUID().toString(); - - @Before - public void init() { - deFiBrokerController = spy(new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), new MessageStoreConfig(), deFiBusBrokerConfig)); - channelHandlerContext = mock(ChannelHandlerContext.class); - messageStore = mock(MessageStore.class); - DeFiBusBroker2Client broker2Client = mock(DeFiBusBroker2Client.class); - when(this.deFiBrokerController.getDeFiBusBroker2Client()).thenReturn(broker2Client); - when(broker2Client.pushRRReplyMessageToClient(any(), any(), any())).thenReturn(true); - Channel channel = mock(Channel.class); - when(channel.isActive()).thenReturn(true); - ClientChannelInfo channelInfo = mock(ClientChannelInfo.class); - when(channelInfo.getChannel()).thenReturn(channel); - DeFiProducerManager mockProducer = mock(DeFiProducerManager.class); - when(mockProducer.getClientChannel(anyString())).thenReturn(channelInfo); - when(this.deFiBrokerController.getProducerManager()).thenReturn(mockProducer); - this.deFiBrokerController.setMessageStore(this.messageStore); - when(this.messageStore.now()).thenReturn(System.currentTimeMillis()); - AppendMessageResult appendMessageResult = new AppendMessageResult(AppendMessageStatus.PUT_OK, 0, 0, "00000000000000000000000000000000", messageStore.now(), 0L, 0); - when(this.messageStore.putMessage(any())).thenReturn(new PutMessageResult(PutMessageStatus.PUT_OK, appendMessageResult)); - when(channel.remoteAddress()).thenReturn(new InetSocketAddress(1024)); - when(channelHandlerContext.channel()).thenReturn(channel); - deFiReplyMessageProcessor = new DeFiReplyMessageProcessor(this.deFiBrokerController); - } - - @Test - public void assertReplyResult() throws RemotingCommandException { - final RemotingCommand request = createReplyMsgCommand(DeFiBusRequestCode.SEND_DIRECT_MESSAGE); - final RemotingCommand[] response = new RemotingCommand[1]; - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - response[0] = (RemotingCommand) invocation.getArguments()[0]; - return null; - } - }).when(channelHandlerContext).writeAndFlush(any(Object.class)); - RemotingCommand responseToReturn = deFiReplyMessageProcessor.processRequest(channelHandlerContext, request); - if (responseToReturn != null) { - Assert.assertNull(response[0]); - response[0] = responseToReturn; - } - Assert.assertEquals(response[0].getCode(), ResponseCode.SUCCESS); - Assert.assertEquals(response[0].getOpaque(), request.getOpaque()); - } - - private SendMessageRequestHeader createSendMsgRequestHeader() { - SendMessageRequestHeader requestHeader = new SendMessageRequestHeader(); - requestHeader.setProducerGroup(group); - requestHeader.setTopic(topic); - requestHeader.setDefaultTopic(MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC); - requestHeader.setDefaultTopicQueueNums(3); - requestHeader.setQueueId(1); - requestHeader.setSysFlag(0); - requestHeader.setBornTimestamp(System.currentTimeMillis()); - requestHeader.setFlag(124); - Message msg = new Message(); - msg.putUserProperty(DeFiBusConstant.KEY, DeFiBusConstant.REPLY); - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO, clientId); - msg.setBody(new String("abcd").getBytes()); - requestHeader.setProperties(MessageDecoder.messageProperties2String(msg.getProperties())); - return requestHeader; - } - - private RemotingCommand createReplyMsgCommand(int requestCode) { - SendMessageRequestHeader requestHeader = createSendMsgRequestHeader(); - RemotingCommand request = RemotingCommand.createRequestCommand(requestCode, requestHeader); - request.makeCustomHeaderToNet(); - return request; - } -} diff --git a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiSendMessageProcessorTest.java b/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiSendMessageProcessorTest.java deleted file mode 100644 index 3e4f99ec85..0000000000 --- a/eventmesh-store/defibus-broker/src/test/java/cn/webank/defibus/broker/processor/DeFiSendMessageProcessorTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.webank.defibus.broker.processor; - -import cn.webank.defibus.broker.DeFiBrokerController; -import cn.webank.defibus.common.DeFiBusBrokerConfig; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import java.net.InetSocketAddress; -import org.apache.rocketmq.broker.transaction.TransactionalMessageService; -import org.apache.rocketmq.common.BrokerConfig; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.NettyServerConfig; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.store.AppendMessageResult; -import org.apache.rocketmq.store.AppendMessageStatus; -import org.apache.rocketmq.store.MessageExtBrokerInner; -import org.apache.rocketmq.store.MessageStore; -import org.apache.rocketmq.store.PutMessageResult; -import org.apache.rocketmq.store.PutMessageStatus; -import org.apache.rocketmq.store.config.MessageStoreConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class DeFiSendMessageProcessorTest { - private DeFiSendMessageProcessor deFiSendMessageProcessor; - @Mock - private ChannelHandlerContext handlerContext; - @Spy - private DeFiBrokerController deFiBrokerController = new DeFiBrokerController(new BrokerConfig(), new NettyServerConfig(), new NettyClientConfig(), new MessageStoreConfig(), new DeFiBusBrokerConfig()); - @Mock - private MessageStore messageStore; - - @Mock - private TransactionalMessageService transactionMsgService; - - private String topic = "FooBar"; - private String group = "FooBarGroup"; - - @Before - public void init() { - deFiBrokerController.setMessageStore(messageStore); - deFiBrokerController.getConsumeQueueManager().getBrokerController().setMessageStore(messageStore); - deFiBrokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(topic, 2, 6, 0); - when(messageStore.now()).thenReturn(System.currentTimeMillis()); - Channel mockChannel = mock(Channel.class); - when(mockChannel.remoteAddress()).thenReturn(new InetSocketAddress(1024)); - when(handlerContext.channel()).thenReturn(mockChannel); - deFiSendMessageProcessor = new DeFiSendMessageProcessor(deFiBrokerController); - } - - @Test - public void testProcessRequest() throws RemotingCommandException { - when(messageStore.putMessage(any(MessageExtBrokerInner.class))).thenReturn(new PutMessageResult(PutMessageStatus.PUT_OK, new AppendMessageResult(AppendMessageStatus.PUT_OK))); - assertPutResult(ResponseCode.SUCCESS); - } - - private SendMessageRequestHeader createSendMsgRequestHeader() { - SendMessageRequestHeader requestHeader = new SendMessageRequestHeader(); - requestHeader.setProducerGroup(group); - requestHeader.setTopic(topic); - requestHeader.setDefaultTopic(MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC); - requestHeader.setDefaultTopicQueueNums(3); - requestHeader.setQueueId(1); - requestHeader.setSysFlag(0); - requestHeader.setBornTimestamp(System.currentTimeMillis()); - requestHeader.setFlag(124); - requestHeader.setReconsumeTimes(0); - return requestHeader; - } - - private RemotingCommand createSendMsgCommand(int requestCode) { - SendMessageRequestHeader requestHeader = createSendMsgRequestHeader(); - - RemotingCommand request = RemotingCommand.createRequestCommand(requestCode, requestHeader); - request.setBody(new byte[] {'a'}); - request.makeCustomHeaderToNet(); - return request; - } - - private void assertPutResult(int responseCode) throws RemotingCommandException { - final RemotingCommand request = createSendMsgCommand(RequestCode.SEND_MESSAGE); - final RemotingCommand[] response = new RemotingCommand[1]; - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - response[0] = invocation.getArgument(0); - return null; - } - }).when(handlerContext).writeAndFlush(any(Object.class)); - RemotingCommand responseToReturn = deFiSendMessageProcessor.processRequest(handlerContext, request); - if (responseToReturn != null) { - assertThat(response[0]).isNull(); - response[0] = responseToReturn; - } - assertThat(response[0].getCode()).isEqualTo(responseCode); - assertThat(response[0].getOpaque()).isEqualTo(request.getOpaque()); - } -} \ No newline at end of file diff --git a/eventmesh-store/defibus-client/.gitignore b/eventmesh-store/defibus-client/.gitignore deleted file mode 100644 index c1285b3799..0000000000 --- a/eventmesh-store/defibus-client/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -/bin/ -/.git/ -/.gradle/ -/.settings/ -/logs -.DS_Store -.*.swp -*.ipr -*.iml -*.iws -*.class -*.log -.idea -build -.classpath -.project -/test-output/ -/dist -/.pmd -/classes -/logs -/out \ No newline at end of file diff --git a/eventmesh-store/defibus-client/build.gradle b/eventmesh-store/defibus-client/build.gradle deleted file mode 100644 index 6c00fedfd6..0000000000 --- a/eventmesh-store/defibus-client/build.gradle +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -List Log = [ - "org.slf4j:slf4j-log4j12:1.7.12", - "log4j:log4j:1.2.17" -] - -dependencies { - compile project(":defibus-common") - compile "org.apache.rocketmq:rocketmq-client:$project.rocketmqVersion" - testCompile Log -} \ No newline at end of file diff --git a/eventmesh-store/defibus-client/conf/checkstyle.xml b/eventmesh-store/defibus-client/conf/checkstyle.xml deleted file mode 100644 index 3d024111bc..0000000000 --- a/eventmesh-store/defibus-client/conf/checkstyle.xml +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/DeFiBusClientManager.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/DeFiBusClientManager.java deleted file mode 100644 index 1c76d16caf..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/DeFiBusClientManager.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client; - -import cn.webank.defibus.client.impl.factory.DeFiBusClientInstance; -import cn.webank.defibus.common.util.ReflectUtil; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; -import org.apache.rocketmq.client.ClientConfig; -import org.apache.rocketmq.client.impl.MQClientManager; -import org.apache.rocketmq.remoting.RPCHook; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusClientManager { - private static DeFiBusClientManager instance = new DeFiBusClientManager(); - private AtomicInteger factoryIndexGenerator = new AtomicInteger(); - private ConcurrentHashMap factoryTable; - - public static final Logger LOGGER = LoggerFactory.getLogger(DeFiBusClientManager.class); - - @SuppressWarnings("unchecked") - private DeFiBusClientManager() { - try { - //factoryTable, shared by all producer and consumer - //same clientId will return the same MQClientInstance - //In order to set our own deFiclient instance to all producer and consumer, need to get the pointer of this table - factoryTable = (ConcurrentHashMap) ReflectUtil.getSimpleProperty(MQClientManager.class, - MQClientManager.getInstance(), "factoryTable"); - } catch (Exception e) { - LOGGER.warn("failed to initialize factory in mqclient manager.", e); - } - } - - public static DeFiBusClientManager getInstance() { - return instance; - } - - public synchronized DeFiBusClientInstance getAndCreateDeFiBusClientInstance(final ClientConfig clientConfig, - RPCHook rpcHook) { - - String clientId = clientConfig.buildMQClientId(); - DeFiBusClientInstance instance = this.factoryTable.get(clientId); - if (null == instance) { - instance = - new DeFiBusClientInstance(clientConfig.cloneClientConfig(), - this.factoryIndexGenerator.getAndIncrement(), clientId, rpcHook); - DeFiBusClientInstance prev = this.factoryTable.putIfAbsent(clientId, instance); - if (prev != null) { - instance = prev; - LOGGER.warn("Returned Previous MQClientInstance for clientId:[{}]", clientId); - } else { - LOGGER.info("new instance activate. " + clientId); - } - } - return instance; - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/common/DeFiBusClientConfig.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/common/DeFiBusClientConfig.java deleted file mode 100644 index 73e035364f..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/common/DeFiBusClientConfig.java +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.common; - -import cn.webank.defibus.common.DeFiBusVersion; -import org.apache.rocketmq.remoting.RPCHook; - -public class DeFiBusClientConfig { - //default mq producer - private String producerGroup = "DefaultProducerGroup"; - private int retryTimesWhenSendFailed = 2; - private int retryTimesWhenSendAsyncFailed = 2; - - private int pubWindowSize = 65535; //clientAsyncSemaphoreValue - - //default mq push consumer - private String consumerGroup = "DefaultConsumerGroup"; - private int consumeConcurrentlyMaxSpan = 2000; - private long pullInterval = 0; - private int consumeMessageBatchMaxSize = 1; - private int pullBatchSize = 32; - private int maxReconsumeTimes = 3; - private long consumeTimeout = 15; - - private int ackWindowSize = 1000; //pullThresholdForQueue - private int threadPoolCoreSize = 24; //consumeThreadMin - private int threadPoolMaxSize = 72; //consumeThreadMax - private int ackTime = 5000; //persistConsumerOffsetInterval - - //rmq client config - private String namesrvAddr = null; - private int pollNameServerInterval = 1000 * 5; - private int heartbeatBrokerInterval = 1000 * 10; - - private int consumeRequestQueueCapacity = 10000; - private String wsAddr = null; - private String clusterPrefix = null; - private final int version = DeFiBusVersion.CURRENT_VERSION; - private final RPCHook rpcHook = null; - private long queueIsolateTimeMillis = 60 * 1000L; - - private long pullTimeDelayMillsWhenExcept = 0; - private long pullTimeDelayMillsWhenFlowControl = 50; - private long pullTimeDelayMillsWhenSuspend = 500; - - private int minMqNumWhenSendLocal = 1; - - public String getProducerGroup() { - return producerGroup; - } - - public void setProducerGroup(String producerGroup) { - this.producerGroup = producerGroup; - } - - public int getRetryTimesWhenSendFailed() { - return retryTimesWhenSendFailed; - } - - public void setRetryTimesWhenSendFailed(int retryTimesWhenSendFailed) { - this.retryTimesWhenSendFailed = retryTimesWhenSendFailed; - } - - public int getRetryTimesWhenSendAsyncFailed() { - return retryTimesWhenSendAsyncFailed; - } - - public void setRetryTimesWhenSendAsyncFailed(int retryTimesWhenSendAsyncFailed) { - this.retryTimesWhenSendAsyncFailed = retryTimesWhenSendAsyncFailed; - } - - public int getPubWindowSize() { - return pubWindowSize; - } - - public void setPubWindowSize(int pubWindowSize) { - this.pubWindowSize = pubWindowSize; - } - - public String getConsumerGroup() { - return consumerGroup; - } - - public void setConsumerGroup(String consumerGroup) { - this.consumerGroup = consumerGroup; - } - - public int getConsumeConcurrentlyMaxSpan() { - return consumeConcurrentlyMaxSpan; - } - - public void setConsumeConcurrentlyMaxSpan(int consumeConcurrentlyMaxSpan) { - this.consumeConcurrentlyMaxSpan = consumeConcurrentlyMaxSpan; - } - - public long getPullInterval() { - return pullInterval; - } - - public void setPullInterval(long pullInterval) { - this.pullInterval = pullInterval; - } - - public int getConsumeMessageBatchMaxSize() { - return consumeMessageBatchMaxSize; - } - - public void setConsumeMessageBatchMaxSize(int consumeMessageBatchMaxSize) { - this.consumeMessageBatchMaxSize = consumeMessageBatchMaxSize; - } - - public int getPullBatchSize() { - return pullBatchSize; - } - - public void setPullBatchSize(int pullBatchSize) { - this.pullBatchSize = pullBatchSize; - } - - public int getMaxReconsumeTimes() { - return maxReconsumeTimes; - } - - public void setMaxReconsumeTimes(int maxReconsumeTimes) { - this.maxReconsumeTimes = maxReconsumeTimes; - } - - public long getConsumeTimeout() { - return consumeTimeout; - } - - public void setConsumeTimeout(long consumeTimeout) { - this.consumeTimeout = consumeTimeout; - } - - public int getAckWindowSize() { - return ackWindowSize; - } - - public void setAckWindowSize(int ackWindowSize) { - this.ackWindowSize = ackWindowSize; - } - - public int getThreadPoolCoreSize() { - return threadPoolCoreSize; - } - - public void setThreadPoolCoreSize(int threadPoolCoreSize) { - this.threadPoolCoreSize = threadPoolCoreSize; - } - - public int getThreadPoolMaxSize() { - return threadPoolMaxSize; - } - - public void setThreadPoolMaxSize(int threadPoolMaxSize) { - this.threadPoolMaxSize = threadPoolMaxSize; - } - - public int getAckTime() { - return ackTime; - } - - public void setAckTime(int ackTime) { - this.ackTime = ackTime; - } - - public String getNamesrvAddr() { - return namesrvAddr; - } - - public void setNamesrvAddr(String namesrvAddr) { - this.namesrvAddr = namesrvAddr; - } - - public int getPollNameServerInterval() { - return pollNameServerInterval; - } - - public void setPollNameServerInterval(int pollNameServerInterval) { - this.pollNameServerInterval = pollNameServerInterval; - } - - public int getHeartbeatBrokerInterval() { - return heartbeatBrokerInterval; - } - - public void setHeartbeatBrokerInterval(int heartbeatBrokerInterval) { - this.heartbeatBrokerInterval = heartbeatBrokerInterval; - } - - public int getConsumeRequestQueueCapacity() { - return consumeRequestQueueCapacity; - } - - public void setConsumeRequestQueueCapacity(int consumeRequestQueueCapacity) { - this.consumeRequestQueueCapacity = consumeRequestQueueCapacity; - } - - public String getWsAddr() { - return wsAddr; - } - - public void setWsAddr(String wsAddr) { - this.wsAddr = wsAddr; - } - - public int getVersion() { - return version; - } - - public RPCHook getRpcHook() { - return rpcHook; - } - - public long getQueueIsolateTimeMillis() { - return queueIsolateTimeMillis; - } - - public void setQueueIsolateTimeMillis(long queueIsolateTimeMillis) { - this.queueIsolateTimeMillis = queueIsolateTimeMillis; - } - - public String getClusterPrefix() { - return clusterPrefix; - } - - public void setClusterPrefix(String clusterPrefix) { - if (clusterPrefix != null) { - String tmp = clusterPrefix.toUpperCase().trim().replace(" ", ""); - if (tmp.length() > 0) - this.clusterPrefix = tmp; - } - } - - public long getPullTimeDelayMillsWhenExcept() { - return pullTimeDelayMillsWhenExcept; - } - - public void setPullTimeDelayMillsWhenExcept(long pullTimeDelayMillsWhenExcept) { - this.pullTimeDelayMillsWhenExcept = pullTimeDelayMillsWhenExcept; - } - - public long getPullTimeDelayMillsWhenFlowControl() { - return pullTimeDelayMillsWhenFlowControl; - } - - public void setPullTimeDelayMillsWhenFlowControl(long pullTimeDelayMillsWhenFlowControl) { - this.pullTimeDelayMillsWhenFlowControl = pullTimeDelayMillsWhenFlowControl; - } - - public long getPullTimeDelayMillsWhenSuspend() { - return pullTimeDelayMillsWhenSuspend; - } - - public void setPullTimeDelayMillsWhenSuspend(long pullTimeDelayMillsWhenSuspend) { - this.pullTimeDelayMillsWhenSuspend = pullTimeDelayMillsWhenSuspend; - } - - public int getMinMqNumWhenSendLocal() { - return minMqNumWhenSendLocal; - } - - public void setMinMqNumWhenSendLocal(int minMqNumWhenSendLocal) { - this.minMqNumWhenSendLocal = minMqNumWhenSendLocal; - } - - @Override public String toString() { - return "DeFiBusClientConfig{" + - "producerGroup='" + producerGroup + '\'' + - ", retryTimesWhenSendFailed=" + retryTimesWhenSendFailed + - ", retryTimesWhenSendAsyncFailed=" + retryTimesWhenSendAsyncFailed + - ", pubWindowSize=" + pubWindowSize + - ", consumerGroup='" + consumerGroup + '\'' + - ", consumeConcurrentlyMaxSpan=" + consumeConcurrentlyMaxSpan + - ", pullInterval=" + pullInterval + - ", consumeMessageBatchMaxSize=" + consumeMessageBatchMaxSize + - ", pullBatchSize=" + pullBatchSize + - ", maxReconsumeTimes=" + maxReconsumeTimes + - ", consumeTimeout=" + consumeTimeout + - ", ackWindowSize=" + ackWindowSize + - ", threadPoolCoreSize=" + threadPoolCoreSize + - ", threadPoolMaxSize=" + threadPoolMaxSize + - ", ackTime=" + ackTime + - ", namesrvAddr='" + namesrvAddr + '\'' + - ", pollNameServerInterval=" + pollNameServerInterval + - ", heartbeatBrokerInterval=" + heartbeatBrokerInterval + - ", consumeRequestQueueCapacity=" + consumeRequestQueueCapacity + - ", wsAddr='" + wsAddr + '\'' + - ", clusterPrefix='" + clusterPrefix + '\'' + - ", version=" + version + - ", rpcHook=" + rpcHook + - ", queueIsolateTimeMillis=" + queueIsolateTimeMillis + - ", pullTimeDelayMillsWhenExcept=" + pullTimeDelayMillsWhenExcept + - ", pullTimeDelayMillsWhenFlowControl=" + pullTimeDelayMillsWhenFlowControl + - ", pullTimeDelayMillsWhenSuspend=" + pullTimeDelayMillsWhenSuspend + - ", minMqNumWhenSendLocal=" + minMqNumWhenSendLocal + - '}'; - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/common/DeFiBusClientUtil.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/common/DeFiBusClientUtil.java deleted file mode 100644 index 664f495a94..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/common/DeFiBusClientUtil.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.common; - -import cn.webank.defibus.common.DeFiBusConstant; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageExt; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusClientUtil { - public static final Logger LOGGER = LoggerFactory.getLogger(DeFiBusClientUtil.class); - - public static Message createReplyMessage(MessageExt sourceMsg, byte[] content) { - String cluster = sourceMsg.getUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_CLUSTER); - String replyTopic = DeFiBusConstant.RR_REPLY_TOPIC; - if (!StringUtils.isEmpty(cluster)) { - replyTopic = cluster + "-" + replyTopic; - } else { - LOGGER.warn("no cluster info from message, can not reply"); - return null; - } - - Message msg = new Message(); - msg.setTopic(replyTopic);//回程topic - msg.setBody(content);//body - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO, sourceMsg.getUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO));//回给谁 - msg.putUserProperty(DeFiBusConstant.PROPERTY_RR_REQUEST_ID, sourceMsg.getUserProperty(DeFiBusConstant.PROPERTY_RR_REQUEST_ID));//原uniqueId - String sourceBroker = sourceMsg.getUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_BROKER); - if (!StringUtils.isEmpty(sourceBroker)) { - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_BROKER, sourceBroker);//消息从哪个broker来 - } - - return msg; - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/DeFiBusClientAPIImpl.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/DeFiBusClientAPIImpl.java deleted file mode 100644 index a14abe5718..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/DeFiBusClientAPIImpl.java +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.defibus.common.protocol.body.GetConsumerListByGroupAndTopicResponseBody; -import cn.webank.defibus.common.protocol.header.GetConsumerListByGroupAndTopicRequestHeader; -import cn.webank.defibus.common.util.ReflectUtil; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import org.apache.rocketmq.client.ClientConfig; -import org.apache.rocketmq.client.exception.MQBrokerException; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.client.hook.SendMessageContext; -import org.apache.rocketmq.client.impl.ClientRemotingProcessor; -import org.apache.rocketmq.client.impl.CommunicationMode; -import org.apache.rocketmq.client.impl.MQClientAPIImpl; -import org.apache.rocketmq.client.impl.factory.MQClientInstance; -import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; -import org.apache.rocketmq.client.impl.producer.TopicPublishInfo; -import org.apache.rocketmq.client.producer.SendCallback; -import org.apache.rocketmq.client.producer.SendResult; -import org.apache.rocketmq.client.producer.SendStatus; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageClientIDSetter; -import org.apache.rocketmq.common.message.MessageConst; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.common.namesrv.TopAddressing; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeaderV2; -import org.apache.rocketmq.common.protocol.header.SendMessageResponseHeader; -import org.apache.rocketmq.remoting.InvokeCallback; -import org.apache.rocketmq.remoting.RPCHook; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.exception.RemotingConnectException; -import org.apache.rocketmq.remoting.exception.RemotingException; -import org.apache.rocketmq.remoting.exception.RemotingSendRequestException; -import org.apache.rocketmq.remoting.exception.RemotingTimeoutException; -import org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.ResponseFuture; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusClientAPIImpl extends MQClientAPIImpl { - public static final Logger LOGGER = LoggerFactory.getLogger(DeFiBusClientAPIImpl.class); - private static boolean sendSmartMsg = - Boolean.parseBoolean(System.getProperty("org.apache.rocketmq.client.sendSmartMsg", "true")); - private TopAddressing topAddressing; - - public DeFiBusClientAPIImpl(NettyClientConfig nettyClientConfig, - ClientRemotingProcessor clientRemotingProcessor, - RPCHook rpcHook, - ClientConfig clientConfig) { - - super(nettyClientConfig, clientRemotingProcessor, rpcHook, clientConfig); - - } - - public void setWsAddr(String wsAddr) { - try { - topAddressing = (TopAddressing) ReflectUtil.getSimpleProperty(MQClientAPIImpl.class, this, "topAddressing"); - ReflectUtil.setSimpleProperty(TopAddressing.class, topAddressing, "wsAddr", wsAddr); - LOGGER.debug("activate configure center, address: " + wsAddr); - } catch (Exception e) { - LOGGER.warn("Error when set ws address. configure center may not work.", e); - } - } - - @Override - public SendResult sendMessage(// - final String addr, // 1 - final String brokerName, // 2 - final Message msg, // 3 - final SendMessageRequestHeader requestHeader, // 4 - final long timeoutMillis, // 5 - final CommunicationMode communicationMode, // 6 - final SendCallback sendCallback, // 7 - final TopicPublishInfo topicPublishInfo, // 8 - final MQClientInstance instance, // 9 - final int retryTimesWhenSendFailed, // 10 - final SendMessageContext context, // 11 - final DefaultMQProducerImpl producer // 12 - ) throws RemotingException, MQBrokerException, InterruptedException { - RemotingCommand request = null; - if (DeFiBusConstant.REPLY.equals(msg.getProperties().get(DeFiBusConstant.KEY)) || - DeFiBusConstant.DIRECT.equals(msg.getProperties().get(DeFiBusConstant.KEY))) { - if (sendSmartMsg) { - SendMessageRequestHeaderV2 requestHeaderV2 = SendMessageRequestHeaderV2.createSendMessageRequestHeaderV2(requestHeader); - request = RemotingCommand.createRequestCommand(DeFiBusRequestCode.SEND_DIRECT_MESSAGE_V2, requestHeaderV2); - } else { - request = RemotingCommand.createRequestCommand(DeFiBusRequestCode.SEND_DIRECT_MESSAGE, requestHeader); - } - request.setBody(msg.getBody()); - final AtomicInteger times = new AtomicInteger(); - this.sendMessageAsync(addr, brokerName, msg, timeoutMillis, request, sendCallback, topicPublishInfo, instance, - retryTimesWhenSendFailed, times, context, producer); - return null; - - } else { - return super.sendMessage(addr, brokerName, msg, requestHeader, timeoutMillis, communicationMode, sendCallback, topicPublishInfo, instance, retryTimesWhenSendFailed, context, producer); - } - } - - private void sendMessageAsync(// - final String addr, // - final String brokerName, // - final Message msg, // - final long timeoutMillis, // - final RemotingCommand request, // - final SendCallback sendCallback, // - final TopicPublishInfo topicPublishInfo, // - final MQClientInstance instance, // - final int retryTimesWhenSendFailed, // - final AtomicInteger times, // - final SendMessageContext context, // - final DefaultMQProducerImpl producer // - ) throws InterruptedException, RemotingException { - super.getRemotingClient().invokeAsync(addr, request, timeoutMillis, new InvokeCallback() { - @Override - public void operationComplete(ResponseFuture responseFuture) { - RemotingCommand response = responseFuture.getResponseCommand(); - if (null == sendCallback && response != null) { - - try { - SendResult sendResult = processSendResponse(brokerName, msg, response); - if (context != null && sendResult != null) { - context.setSendResult(sendResult); - context.getProducer().executeSendMessageHookAfter(context); - } - } catch (Throwable e) { - // - } - - producer.updateFaultItem(brokerName, System.currentTimeMillis() - responseFuture.getBeginTimestamp(), false); - return; - } - - if (response != null) { - try { - SendResult sendResult = processSendResponse(brokerName, msg, response); - assert sendResult != null; - if (context != null) { - context.setSendResult(sendResult); - context.getProducer().executeSendMessageHookAfter(context); - } - - try { - sendCallback.onSuccess(sendResult); - } catch (Throwable e) { - } - - producer.updateFaultItem(brokerName, System.currentTimeMillis() - responseFuture.getBeginTimestamp(), false); - } catch (Exception e) { - producer.updateFaultItem(brokerName, System.currentTimeMillis() - responseFuture.getBeginTimestamp(), true); - onExceptionImpl(brokerName, msg, 0L, request, sendCallback, topicPublishInfo, instance, - retryTimesWhenSendFailed, times, e, context, false, producer); - } - } else { - producer.updateFaultItem(brokerName, System.currentTimeMillis() - responseFuture.getBeginTimestamp(), true); - if (!responseFuture.isSendRequestOK()) { - MQClientException ex = new MQClientException("send request failed", responseFuture.getCause()); - onExceptionImpl(brokerName, msg, 0L, request, sendCallback, topicPublishInfo, instance, - retryTimesWhenSendFailed, times, ex, context, true, producer); - } else if (responseFuture.isTimeout()) { - MQClientException ex = new MQClientException("wait response timeout " + responseFuture.getTimeoutMillis() + "ms", - responseFuture.getCause()); - onExceptionImpl(brokerName, msg, 0L, request, sendCallback, topicPublishInfo, instance, - retryTimesWhenSendFailed, times, ex, context, true, producer); - } else { - MQClientException ex = new MQClientException("unknow reseaon", responseFuture.getCause()); - onExceptionImpl(brokerName, msg, 0L, request, sendCallback, topicPublishInfo, instance, - retryTimesWhenSendFailed, times, ex, context, true, producer); - } - } - } - }); - } - - private void onExceptionImpl(final String brokerName, // - final Message msg, // - final long timeoutMillis, // - final RemotingCommand request, // - final SendCallback sendCallback, // - final TopicPublishInfo topicPublishInfo, // - final MQClientInstance instance, // - final int timesTotal, // - final AtomicInteger curTimes, // - final Exception e, // - final SendMessageContext context, // - final boolean needRetry, // - final DefaultMQProducerImpl producer // 12 - ) { - int tmp = curTimes.incrementAndGet(); - if (needRetry && tmp <= timesTotal) { - String retryBrokerName = brokerName;//by default, it will send to the same broker - if (topicPublishInfo != null) { //select one message queue accordingly, in order to determine which broker to send - MessageQueue mqChosen = producer.selectOneMessageQueue(topicPublishInfo, brokerName); - retryBrokerName = mqChosen.getBrokerName(); - } - String addr = instance.findBrokerAddressInPublish(retryBrokerName); - LOGGER.info("async send msg by retry {} times. topic={}, brokerAddr={}, brokerName={}", tmp, msg.getTopic(), addr, - retryBrokerName); - try { - request.setOpaque(RemotingCommand.createNewRequestId()); - sendMessageAsync(addr, retryBrokerName, msg, timeoutMillis, request, sendCallback, topicPublishInfo, instance, - timesTotal, curTimes, context, producer); - } catch (InterruptedException e1) { - onExceptionImpl(retryBrokerName, msg, timeoutMillis, request, sendCallback, topicPublishInfo, instance, timesTotal, curTimes, e1, - context, false, producer); - } catch (RemotingConnectException e1) { - producer.updateFaultItem(brokerName, 3000, true); - onExceptionImpl(retryBrokerName, msg, timeoutMillis, request, sendCallback, topicPublishInfo, instance, timesTotal, curTimes, e1, - context, true, producer); - } catch (RemotingTooMuchRequestException e1) { - onExceptionImpl(retryBrokerName, msg, timeoutMillis, request, sendCallback, topicPublishInfo, instance, timesTotal, curTimes, e1, - context, false, producer); - } catch (RemotingException e1) { - producer.updateFaultItem(brokerName, 3000, true); - onExceptionImpl(retryBrokerName, msg, timeoutMillis, request, sendCallback, topicPublishInfo, instance, timesTotal, curTimes, e1, - context, true, producer); - } - } else { - - if (context != null) { - context.setException(e); - context.getProducer().executeSendMessageHookAfter(context); - } - - try { - sendCallback.onException(e); - } catch (Exception ignored) { - } - } - } - - private SendResult processSendResponse(// - final String brokerName, // - final Message msg, // - final RemotingCommand response// - ) throws MQBrokerException, RemotingCommandException { - switch (response.getCode()) { - case ResponseCode.FLUSH_DISK_TIMEOUT: - LOGGER.warn("publish success, but flush disk timeout " + response.getRemark()); - case ResponseCode.FLUSH_SLAVE_TIMEOUT: - LOGGER.warn("publish success, but flush slave timeout " + response.getRemark()); - case ResponseCode.SLAVE_NOT_AVAILABLE: { - LOGGER.warn("publish success, but slave is not available " + response.getRemark()); - } - case ResponseCode.SUCCESS: { - SendStatus sendStatus = SendStatus.SEND_OK; - switch (response.getCode()) { - case ResponseCode.FLUSH_DISK_TIMEOUT: - sendStatus = SendStatus.FLUSH_DISK_TIMEOUT; - break; - case ResponseCode.FLUSH_SLAVE_TIMEOUT: - sendStatus = SendStatus.FLUSH_SLAVE_TIMEOUT; - break; - case ResponseCode.SLAVE_NOT_AVAILABLE: - sendStatus = SendStatus.SLAVE_NOT_AVAILABLE; - break; - case ResponseCode.SUCCESS: - sendStatus = SendStatus.SEND_OK; - break; - default: - assert false; - break; - } - - SendMessageResponseHeader responseHeader = - (SendMessageResponseHeader) response.decodeCommandCustomHeader(SendMessageResponseHeader.class); - - MessageQueue messageQueue = new MessageQueue(msg.getTopic(), brokerName, responseHeader.getQueueId()); - - SendResult sendResult = new SendResult(sendStatus, - MessageClientIDSetter.getUniqID(msg), - responseHeader.getMsgId(), messageQueue, responseHeader.getQueueOffset()); - sendResult.setTransactionId(responseHeader.getTransactionId()); - String regionId = response.getExtFields().get(MessageConst.PROPERTY_MSG_REGION); - if (regionId == null || regionId.isEmpty()) { - regionId = "DefaultRegion"; - } - sendResult.setRegionId(regionId); - return sendResult; - } - default: - break; - } - - throw new MQBrokerException(response.getCode(), response.getRemark()); - } - - public List getConsumerIdListByGroupAndTopic( - final String addr, - final String consumerGroup, - final String topic, - final long timeoutMillis) throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, - MQBrokerException, InterruptedException { - GetConsumerListByGroupAndTopicRequestHeader requestHeader = new GetConsumerListByGroupAndTopicRequestHeader(); - requestHeader.setConsumerGroup(consumerGroup); - requestHeader.setTopic(topic); - RemotingCommand request = RemotingCommand.createRequestCommand(DeFiBusRequestCode.GET_CONSUMER_LIST_BY_GROUP_AND_TOPIC, requestHeader); - - RemotingCommand response = this.getRemotingClient().invokeSync(MixAll.brokerVIPChannel(false, addr), - request, timeoutMillis); - assert response != null; - switch (response.getCode()) { - case ResponseCode.SUCCESS: { - if (response.getBody() != null) { - GetConsumerListByGroupAndTopicResponseBody body = - GetConsumerListByGroupAndTopicResponseBody.decode(response.getBody(), GetConsumerListByGroupAndTopicResponseBody.class); - return body.getConsumerIdList(); - } - } - default: - break; - } - - throw new MQBrokerException(response.getCode(), response.getRemark()); - } - -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/DeFiBusClientRemotingProcessor.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/DeFiBusClientRemotingProcessor.java deleted file mode 100644 index 4feace3705..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/DeFiBusClientRemotingProcessor.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl; - -import cn.webank.defibus.client.impl.factory.DeFiBusClientInstance; -import cn.webank.defibus.client.impl.producer.RRResponseFuture; -import cn.webank.defibus.client.impl.producer.ResponseTable; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.message.DeFiBusMessageConst; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.defibus.common.protocol.header.NotifyTopicChangedRequestHeader; -import cn.webank.defibus.common.protocol.header.ReplyMessageRequestHeader; -import io.netty.channel.ChannelHandlerContext; -import java.io.IOException; -import java.net.InetSocketAddress; -import org.apache.rocketmq.common.UtilAll; -import org.apache.rocketmq.common.message.MessageAccessor; -import org.apache.rocketmq.common.message.MessageDecoder; -import org.apache.rocketmq.common.message.MessageExt; -import org.apache.rocketmq.common.sysflag.MessageSysFlag; -import org.apache.rocketmq.remoting.common.RemotingHelper; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; -import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusClientRemotingProcessor implements NettyRequestProcessor { - public static final Logger LOGGER = LoggerFactory.getLogger(DeFiBusClientRemotingProcessor.class); - private final DeFiBusClientInstance mqClientFactory; - - public DeFiBusClientRemotingProcessor(final DeFiBusClientInstance mqClientFactory) { - this.mqClientFactory = mqClientFactory; - } - - @Override - public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) throws Exception { - switch (request.getCode()) { - case DeFiBusRequestCode.PUSH_RR_REPLY_MSG_TO_CLIENT: - return this.receiveRRReplyMsg(ctx, request); - case DeFiBusRequestCode.NOTIFY_WHEN_TOPIC_CONFIG_CHANGE: - return this.notifyWhenTopicConfigChange(ctx, request); - default: - break; - } - return null; - } - - private RemotingCommand receiveRRReplyMsg(ChannelHandlerContext ctx, - RemotingCommand request) throws RemotingCommandException { - long receiveTime = System.currentTimeMillis(); - ReplyMessageRequestHeader requestHeader = (ReplyMessageRequestHeader) request.decodeCommandCustomHeader(ReplyMessageRequestHeader.class); - - try { - MessageExt msg = new MessageExt(); - msg.setTopic(requestHeader.getTopic()); - msg.setQueueId(requestHeader.getQueueId()); - msg.setStoreTimestamp(requestHeader.getStoreTimestamp()); - - if (requestHeader.getBornHost() != null) { - String[] bornHostArr = requestHeader.getBornHost().split("/"); - String bornHost/*ip:port*/ = bornHostArr[bornHostArr.length - 1]; - String[] host = bornHost.split(":"); - if (host.length == 2) - msg.setBornHost(new InetSocketAddress(host[0], Integer.parseInt(host[1]))); - } - - if (requestHeader.getStoreHost() != null) { - String[] storeHostArr = requestHeader.getStoreHost().split("/"); - String storeHost = storeHostArr[storeHostArr.length - 1]; - String[] host = storeHost.split(":"); - if (host.length == 2) - msg.setStoreHost(new InetSocketAddress(host[0], Integer.parseInt(host[1]))); - } - - byte[] body = request.getBody(); - if ((requestHeader.getSysFlag() & MessageSysFlag.COMPRESSED_FLAG) == MessageSysFlag.COMPRESSED_FLAG) { - try { - body = UtilAll.uncompress(body); - } catch (IOException e) { - LOGGER.warn("err when uncompress constant", e); - } - } - msg.setBody(body); - msg.setFlag(requestHeader.getFlag()); - MessageAccessor.setProperties(msg, MessageDecoder.string2messageProperties(requestHeader.getProperties())); - - MessageAccessor.putProperty(msg, DeFiBusMessageConst.ARRIVE_TIME, String.valueOf(receiveTime)); - msg.setBornTimestamp(requestHeader.getBornTimestamp()); - msg.setReconsumeTimes(requestHeader.getReconsumeTimes() == null ? 0 : requestHeader.getReconsumeTimes()); - processResponse(msg); - - } catch (Exception e) { - LOGGER.warn("unknown err when receiveRRReplyMsg", e); - } - - return null; - } - - private void processResponse(MessageExt msg) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("receive reply message :{}", msg); - } - final String uniqueId = msg.getUserProperty(DeFiBusConstant.PROPERTY_RR_REQUEST_ID); - - RRResponseFuture rrResponseFuture = ResponseTable.getRrResponseFurtureConcurrentHashMap().get(uniqueId); - if (rrResponseFuture != null && !rrResponseFuture.release()) { - if (rrResponseFuture.getRrCallback() != null) { - rrResponseFuture.getRrCallback().onSuccess(msg); - ResponseTable.getRrResponseFurtureConcurrentHashMap().remove(uniqueId); - } else { - rrResponseFuture.putResponse(msg); - } - } else { - LOGGER.warn("receive reply message {} , but requester has gone away", msg.toString()); - } - } - - private RemotingCommand notifyWhenTopicConfigChange(ChannelHandlerContext ctx, RemotingCommand request) { - try { - final NotifyTopicChangedRequestHeader requestHeader = - (NotifyTopicChangedRequestHeader) request.decodeCommandCustomHeader(NotifyTopicChangedRequestHeader.class); - LOGGER.info("receive broker's notification[{}], topic: {} config changed, update topic route info from nameserver immediately", - RemotingHelper.parseChannelRemoteAddr(ctx.channel()), - requestHeader.getTopic()); - this.mqClientFactory.updateTopicRouteInfoFromNameServer(requestHeader.getTopic()); - this.mqClientFactory.rebalanceImmediately(); - } catch (Exception e) { - LOGGER.warn("notifyWhenTopicConfigChange failed", RemotingHelper.exceptionSimpleDesc(e)); - } - return null; - } - - @Override - public boolean rejectRequest() { - return false; - } -} \ No newline at end of file diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/consumer/DeFiBusPullMessageService.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/consumer/DeFiBusPullMessageService.java deleted file mode 100644 index afbf3a4e22..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/consumer/DeFiBusPullMessageService.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.consumer; - -import cn.webank.defibus.client.impl.factory.DeFiBusClientInstance; -import cn.webank.defibus.common.util.ReflectUtil; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; -import org.apache.rocketmq.client.impl.consumer.MQConsumerInner; -import org.apache.rocketmq.client.impl.consumer.PullMessageService; -import org.apache.rocketmq.client.impl.consumer.PullRequest; -import org.apache.rocketmq.client.log.ClientLogger; -import org.apache.rocketmq.common.utils.ThreadUtils; -import org.apache.rocketmq.logging.InternalLogger; - -public class DeFiBusPullMessageService extends PullMessageService { - private final InternalLogger log = ClientLogger.getLog(); - private final DeFiBusClientInstance mQClientFactory; - private final LinkedBlockingQueue pullRequestQueue; - private final BrokerHealthyManager brokerHealthyManager; - - private final ExecutorService executorService = Executors.newSingleThreadExecutor( - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "DeFiBusPullMessageRetryThread"); - } - }); - - public DeFiBusPullMessageService(DeFiBusClientInstance deFiBusClientInstance) { - super(deFiBusClientInstance); - this.mQClientFactory = deFiBusClientInstance; - this.brokerHealthyManager = new BrokerHealthyManager(); - - pullRequestQueue = (LinkedBlockingQueue) ReflectUtil.getSimpleProperty(PullMessageService.class, this, "pullRequestQueue"); - } - - private void pullMessage(final PullRequest pullRequest) { - final MQConsumerInner consumer = this.mQClientFactory.selectConsumer(pullRequest.getConsumerGroup()); - if (consumer != null) { - long beginPullRequestTime = System.currentTimeMillis(); - - DefaultMQPushConsumerImpl impl = (DefaultMQPushConsumerImpl) consumer; - log.debug("begin Pull Message, {}", pullRequest); - impl.pullMessage(pullRequest); - - long rt = System.currentTimeMillis() - beginPullRequestTime; - if (rt >= brokerHealthyManager.getIsolateThreshold()) { - brokerHealthyManager.isolateBroker(pullRequest.getMessageQueue().getBrokerName()); - } - } else { - log.warn("No matched consumer for the PullRequest {}, drop it", pullRequest); - } - } - - private void pullMessageWithHealthyManage(final PullRequest pullRequest) { - boolean brokerAvailable = brokerHealthyManager.isBrokerAvailable(pullRequest.getMessageQueue().getBrokerName()); - if (brokerAvailable) { - pullMessage(pullRequest); - } else { - runInRetryThread(pullRequest); - } - } - - @Override - public void run() { - log.info(this.getServiceName() + " service started"); - - while (!this.isStopped()) { - try { - PullRequest pullRequest = this.pullRequestQueue.take(); - this.pullMessageWithHealthyManage(pullRequest); - } catch (InterruptedException ignored) { - } catch (Exception e) { - log.error("Pull Message Service Run Method exception", e); - } - } - - log.info(this.getServiceName() + " service end"); - } - - private void runInRetryThread(PullRequest pullRequest) { - try { - executorService.submit(new Runnable() { - @Override - public void run() { - pullMessage(pullRequest); - } - }); - } catch (Exception ex) { - log.info("execute pull message in retry thread fail.", ex); - super.executePullRequestLater(pullRequest, 100); - } - } - - @Override - public void shutdown(boolean interrupt) { - super.shutdown(interrupt); - ThreadUtils.shutdownGracefully(this.executorService, 1000, TimeUnit.MILLISECONDS); - } - - @Override - public String getServiceName() { - return DeFiBusPullMessageService.class.getSimpleName(); - } - - class BrokerHealthyManager { - private final ConcurrentHashMap isolatedBroker = new ConcurrentHashMap<>(); - private long isolateThreshold = 500; - private long ISOLATE_TIMEOUT = 5 * 60 * 1000; - - public boolean isBrokerAvailable(String brokerName) { - boolean brokerIsolated = isolatedBroker.containsKey(brokerName); - if (brokerIsolated) { - boolean isolatedTimeout = System.currentTimeMillis() - isolatedBroker.get(brokerName) > ISOLATE_TIMEOUT; - if (isolatedTimeout) { - removeIsolateBroker(brokerName); - return true; - } else { - return false; - } - } else { - return true; - } - } - - public void removeIsolateBroker(String brokerName) { - Long val = isolatedBroker.remove(brokerName); - if (!isolatedBroker.containsKey(brokerName)) { - log.info("remove isolated broker success, brokerName: {} isolate time: {}", brokerName, val); - } - } - - public void isolateBroker(String brokerName) { - isolatedBroker.put(brokerName, System.currentTimeMillis()); - if (isolatedBroker.containsKey(brokerName)) { - log.info("isolate broker for slow pull message success, {}", brokerName); - } - } - - public long getIsolateThreshold() { - return isolateThreshold; - } - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstance.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstance.java deleted file mode 100644 index 888d3838e1..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstance.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.factory; - -import cn.webank.defibus.client.impl.DeFiBusClientAPIImpl; -import cn.webank.defibus.client.impl.DeFiBusClientRemotingProcessor; -import cn.webank.defibus.client.impl.consumer.DeFiBusPullMessageService; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.defibus.common.util.ReflectUtil; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicInteger; -import org.apache.commons.lang3.RandomUtils; -import org.apache.rocketmq.client.ClientConfig; -import org.apache.rocketmq.client.impl.ClientRemotingProcessor; -import org.apache.rocketmq.client.impl.factory.MQClientInstance; -import org.apache.rocketmq.common.protocol.route.BrokerData; -import org.apache.rocketmq.common.protocol.route.TopicRouteData; -import org.apache.rocketmq.remoting.RPCHook; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusClientInstance extends MQClientInstance { - private static final Logger LOGGER = LoggerFactory.getLogger(DeFiBusClientInstance.class); - private final ClientConfig clientConfig; - private DeFiBusClientAPIImpl deFiClientAPI; - private ClientRemotingProcessor clientRemotingProcessor; - private DeFiBusClientRemotingProcessor deFiClientRemotingProcessor; - private ExecutorService executorService; - private ScheduledExecutorService scheduledExecutorService; - - public DeFiBusClientInstance(ClientConfig clientConfig, int instanceIndex, String clientId) { - this(clientConfig, instanceIndex, clientId, null); - } - - public DeFiBusClientInstance(ClientConfig clientConfig, int instanceIndex, String clientId, RPCHook rpcHook) { - super(clientConfig, instanceIndex, clientId, rpcHook); - this.clientConfig = clientConfig; - try { - clientRemotingProcessor = (ClientRemotingProcessor) ReflectUtil.getSimpleProperty(MQClientInstance.class, this, "clientRemotingProcessor"); - - deFiClientRemotingProcessor = new DeFiBusClientRemotingProcessor(this); - - deFiClientAPI = new DeFiBusClientAPIImpl( - super.getNettyClientConfig(), - clientRemotingProcessor, - rpcHook, - clientConfig); - - ReflectUtil.setSimpleProperty(MQClientInstance.class, this, "mQClientAPIImpl", deFiClientAPI); - - DeFiBusPullMessageService deFiBusPullMessageService = new DeFiBusPullMessageService(this); - ReflectUtil.setSimpleProperty(MQClientInstance.class, this, "pullMessageService", deFiBusPullMessageService); - - if (this.clientConfig.getNamesrvAddr() != null) { - this.deFiClientAPI.updateNameServerAddressList(this.clientConfig.getNamesrvAddr()); - LOGGER.info("user specified name server address: {}", this.clientConfig.getNamesrvAddr()); - } - - executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactory() { - private AtomicInteger threadIndex = new AtomicInteger(0); - - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r, "deFiClientThread_" + this.threadIndex.getAndIncrement()); - t.setDaemon(true); - return t; - } - }); - - scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r, "deFiClientScheduledThread_"); - t.setDaemon(true); - return t; - } - }); - - super.getMQClientAPIImpl().getRemotingClient() - .registerProcessor(DeFiBusRequestCode.PUSH_RR_REPLY_MSG_TO_CLIENT, deFiClientRemotingProcessor, executorService); - super.getMQClientAPIImpl().getRemotingClient() - .registerProcessor(DeFiBusRequestCode.NOTIFY_WHEN_TOPIC_CONFIG_CHANGE, deFiClientRemotingProcessor, executorService); - } catch (Exception e) { - LOGGER.warn("failed to initialize factory in mqclient manager.", e); - } - - } - - @Override - public void shutdown() { - this.scheduledExecutorService.shutdown(); - super.shutdown(); - this.executorService.shutdown(); - } - - public ExecutorService getExecutorService() { - return executorService; - } - - public ScheduledExecutorService getScheduledExecutorService() { - return scheduledExecutorService; - } - - @Override - public List findConsumerIdList(final String topic, final String group) { - String brokerAddr = this.findBrokerAddrByTopic(topic); - if (null == brokerAddr) { - this.updateTopicRouteInfoFromNameServer(topic); - brokerAddr = this.findBrokerAddrByTopic(topic); - } - - if (null != brokerAddr) { - try { - LOGGER.debug("findConsumerIdList of {} from broker {}", topic, brokerAddr); - List cidList = deFiClientAPI.getConsumerIdListByGroupAndTopic(brokerAddr, group, topic, 3000); - if (cidList != null && !cidList.isEmpty()) { - return cidList; - } - } catch (Exception e) { - LOGGER.warn("getConsumerIdListByGroup failed, " + brokerAddr + " " + group + ", retry immediately"); - } - - String lastSelected = brokerAddr; - brokerAddr = this.findAnotherBrokerAddrByTopic(topic, lastSelected); - if (null == brokerAddr) { - this.updateTopicRouteInfoFromNameServer(topic); - brokerAddr = this.findAnotherBrokerAddrByTopic(topic, lastSelected); - } - if (null != brokerAddr) { - try { - LOGGER.debug("findConsumerIdList of {} from broker {}", topic, brokerAddr); - List cidList = deFiClientAPI.getConsumerIdListByGroupAndTopic(brokerAddr, group, topic, 3000); - return cidList; - } catch (Exception e) { - LOGGER.warn("getConsumerIdListByGroup failed, " + brokerAddr + " " + group + ", after retry ", e); - } - } - } - - return null; - } - - private String findAnotherBrokerAddrByTopic(String topic, String lastSelected) { - TopicRouteData topicRouteData = this.getTopicRouteTable().get(topic); - if (topicRouteData != null && topicRouteData.getBrokerDatas() != null) { - List allBrokers = topicRouteData.getBrokerDatas(); - for (BrokerData bd : allBrokers) { - if (!bd.selectBrokerAddr().equals(lastSelected)) { - String addr = bd.selectBrokerAddr(); - LOGGER.debug("find another broker addr by topic [{}], find addr: {}, lastSelected: {}", topic, addr, lastSelected); - return addr; - } - } - - if (!allBrokers.isEmpty()) { - int index = RandomUtils.nextInt(0, allBrokers.size()); - BrokerData bd = allBrokers.get(index % allBrokers.size()); - String addr = bd.selectBrokerAddr(); - LOGGER.debug("find any broker addr by topic [{}], find addr: {}, lastSelected: {}", topic, addr, lastSelected); - return addr; - } - } - return null; - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/hook/DeFiBusClientHookFactory.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/hook/DeFiBusClientHookFactory.java deleted file mode 100644 index 8b2c74d3b8..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/hook/DeFiBusClientHookFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.hook; - -import org.apache.rocketmq.remoting.RPCHook; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusClientHookFactory { - private static final Logger LOGGER = LoggerFactory.getLogger(DeFiBusClientHookFactory.class); - - public static RPCHook createRPCHook(final RPCHook rpcHook) { - return new RPCHook() { - @Override - public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - if (rpcHook != null) { - rpcHook.doBeforeRequest(remoteAddr, request); - } - } - - @Override - public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { - } - }; - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/DeFiBusProducerImpl.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/DeFiBusProducerImpl.java deleted file mode 100644 index f5e7b01a05..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/DeFiBusProducerImpl.java +++ /dev/null @@ -1,456 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.producer; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.client.impl.factory.DeFiBusClientInstance; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.DeFiBusErrorCode; -import cn.webank.defibus.common.exception.DeFiBusException; -import cn.webank.defibus.common.protocol.DeFiBusResponseCode; -import cn.webank.defibus.common.util.DeFiBusRequestIDUtil; -import cn.webank.defibus.producer.DeFiBusProducer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.client.Validators; -import org.apache.rocketmq.client.exception.MQBrokerException; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.client.impl.factory.MQClientInstance; -import org.apache.rocketmq.client.producer.DefaultMQProducer; -import org.apache.rocketmq.client.producer.SendCallback; -import org.apache.rocketmq.client.producer.SendResult; -import org.apache.rocketmq.common.ServiceState; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageBatch; -import org.apache.rocketmq.common.message.MessageClientIDSetter; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.common.protocol.body.ClusterInfo; -import org.apache.rocketmq.remoting.exception.RemotingException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusProducerImpl { - public static final Logger LOGGER = LoggerFactory.getLogger(DeFiBusProducerImpl.class); - - private DeFiBusProducer deFiBusProducer; - private HealthyMessageQueueSelector messageQueueSelector; - private ScheduledExecutorService scheduledExecutorService; - private ExecutorService executorService = null; - private ConcurrentHashMap topicInitMap = new ConcurrentHashMap(); - private ClusterInfo clusterInfo; - - public DeFiBusProducerImpl(DeFiBusProducer deFiBusProducer, DeFiBusClientConfig deFiBusClientConfig, - DeFiBusClientInstance deFiBusClientInstance) { - this.deFiBusProducer = deFiBusProducer; - this.messageQueueSelector = new HealthyMessageQueueSelector(new MessageQueueHealthManager(deFiBusClientConfig.getQueueIsolateTimeMillis()), - deFiBusClientConfig.getMinMqNumWhenSendLocal()); - - executorService = deFiBusClientInstance.getExecutorService(); - scheduledExecutorService = deFiBusClientInstance.getScheduledExecutorService(); - - scheduledExecutorService.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - cleanExpiredRRRequest(); - } - }, 0, 1000, TimeUnit.MILLISECONDS); - - } - - private void cleanExpiredRRRequest() { - try { - List expiredRRRequest = new ArrayList(); - - Iterator> it = ResponseTable.getRrResponseFurtureConcurrentHashMap().entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = it.next(); - String rId = entry.getKey(); - RRResponseFuture responseFurture = entry.getValue(); - if (responseFurture.getExpiredTime() + 1000L <= System.currentTimeMillis()) { - it.remove(); - expiredRRRequest.add(responseFurture); - LOGGER.warn("remove timeout request " + rId); - } - } - - for (final RRResponseFuture responseFuture : expiredRRRequest) { - executorService.submit(new Runnable() { - @Override - public void run() { - if (!responseFuture.release()) { - Throwable throwable = new DeFiBusException(DeFiBusErrorCode.RR_REQUEST_TIMEOUT, "remove timeout request, deadline: " + responseFuture.getExpiredTime()); - responseFuture.getRrCallback().onException(throwable); - } - } - }); - } - } catch (Throwable ignore) { - LOGGER.warn("cleanExpiredRRRequest failed ,{}", ignore.getMessage()); - } - } - - public void reply( - Message replyMsg, - final SendCallback sendCallback) throws InterruptedException, RemotingException, MQClientException, MQBrokerException { - replyMsg.putUserProperty(DeFiBusConstant.KEY, DeFiBusConstant.REPLY); - replyMsg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL, String.valueOf(deFiBusProducer.getDefaultMQProducer().getSendMsgTimeout())); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Reply message: {} ", replyMsg.toString()); - } - final String requestId = replyMsg.getUserProperty(DeFiBusConstant.PROPERTY_RR_REQUEST_ID); - if (requestId == null) { - LOGGER.warn("rr request id is null, can not reply"); - } - publish(replyMsg, new SendCallback() { - @Override - public void onSuccess(SendResult sendResult) { - if (sendCallback != null) { - sendCallback.onSuccess(sendResult); - } - } - - @Override - public void onException(Throwable e) { - LOGGER.warn("Reply message fail, requestId={}", requestId); - if (sendCallback != null) { - sendCallback.onException(e); - } - } - }); - } - - public Message request(Message requestMsg, - long timeout) throws InterruptedException, RemotingException, MQClientException, MQBrokerException { - return request(requestMsg, null, null, timeout); - } - - public Message request(Message requestMsg, final SendCallback sendCallback, RRCallback rrCallback, long timeout) - throws InterruptedException, RemotingException, MQClientException, MQBrokerException { - - boolean isAsyncRR = (rrCallback != null); - - final String uniqueRequestId = DeFiBusRequestIDUtil.createUniqueName("w"); - DefaultMQProducer producer = deFiBusProducer.getDefaultMQProducer(); - requestMsg.putUserProperty(DeFiBusConstant.KEY, DeFiBusConstant.PERSISTENT); - requestMsg.putUserProperty(DeFiBusConstant.PROPERTY_RR_REQUEST_ID, uniqueRequestId); - requestMsg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO, producer.buildMQClientId()); - requestMsg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL, String.valueOf(timeout)); - - final RRResponseFuture responseFurture = new RRResponseFuture(rrCallback, timeout); - - String topic = requestMsg.getTopic(); - boolean hasRouteData = deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl().getmQClientFactory().getTopicRouteTable().containsKey(topic); - Boolean isSendHeartbeatOk = topicInitMap.get(topic); - if (isSendHeartbeatOk == null) { - isSendHeartbeatOk = false; - } - if (!hasRouteData || !isSendHeartbeatOk) { - long startTimestamp = System.currentTimeMillis(); - synchronized (this) { - boolean hasRouteDataSync = deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl().getmQClientFactory().getTopicRouteTable().containsKey(topic); - if (!hasRouteDataSync) { - LOGGER.info("no topic route info for " + topic + ", send heartbeat to nameserver"); - deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl().getmQClientFactory().updateTopicRouteInfoFromNameServer(topic); - deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl().getmQClientFactory().sendHeartbeatToAllBrokerWithLock(); - topicInitMap.put(topic, true); - } - } - long cost = System.currentTimeMillis() - startTimestamp; - if (cost > 500) { - LOGGER.warn("get topic route info for {} before request cost {} ms.", topic, cost); - } - } - - ResponseTable.getRrResponseFurtureConcurrentHashMap().put(uniqueRequestId, responseFurture); - if (isAsyncRR) { - this.publish(requestMsg, new SendCallback() { - @Override - public void onSuccess(SendResult sendResult) { - if (sendCallback != null) { - sendCallback.onSuccess(sendResult); - } - } - - @Override - public void onException(Throwable e) { - LOGGER.warn("except when publish async rr message, uniqueId :{} {} ", uniqueRequestId, e.getMessage()); - ResponseTable.getRrResponseFurtureConcurrentHashMap().remove(uniqueRequestId); - if (sendCallback != null) { - sendCallback.onException(e); - } - } - }, timeout); - return null; - - } else { - publish(requestMsg, new SendCallback() { - @Override - public void onSuccess(SendResult sendResult) { - if (sendCallback != null) { - sendCallback.onSuccess(sendResult); - } - } - - @Override - public void onException(Throwable e) { - LOGGER.warn("except when publish sync rr message, uniqueId :{} {}", uniqueRequestId, e.getMessage()); - ResponseTable.getRrResponseFurtureConcurrentHashMap().remove(uniqueRequestId); - if (sendCallback != null) { - sendCallback.onException(e); - } - } - }, timeout); - Message retMessage = responseFurture.waitResponse(timeout); - ResponseTable.getRrResponseFurtureConcurrentHashMap().remove(uniqueRequestId); - if (retMessage == null) { - LOGGER.warn("request {} is sent, constant is :{}, but no rr response ", topic, uniqueRequestId); - } - return retMessage; - } - } - - public void publish(Message msg) throws MQClientException, RemotingException, InterruptedException { - publish(msg, deFiBusProducer.getDefaultMQProducer().getSendMsgTimeout()); - } - - public void publish(Message msg, long timeout) throws MQClientException, RemotingException, InterruptedException { - publish(msg, new SendCallback() { - @Override - public void onSuccess(SendResult sendResult) { - LOGGER.debug(sendResult.toString()); - } - - @Override - public void onException(Throwable e) { - LOGGER.warn("", e); - } - }, timeout); - } - - public void publish( - Collection msgs) throws MQClientException, RemotingException, MQBrokerException, InterruptedException { - for (Message msg : msgs) { - if (msg.getUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL) == null) { - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL, DeFiBusConstant.DEFAULT_TTL); - } - } - publish(batch(msgs)); - } - - private MessageBatch batch(Collection msgs) throws MQClientException { - MessageBatch msgBatch; - try { - msgBatch = MessageBatch.generateFromList(msgs); - for (Message message : msgBatch) { - Validators.checkMessage(message, deFiBusProducer.getDefaultMQProducer()); - MessageClientIDSetter.setUniqID(message); - } - msgBatch.setBody(msgBatch.encode()); - } catch (Exception e) { - throw new MQClientException("Failed to initiate the MessageBatch", e); - } - return msgBatch; - } - - public void publish(Message msg, - SendCallback sendCallback) throws MQClientException, RemotingException, InterruptedException { - publish(msg, sendCallback, this.deFiBusProducer.getDefaultMQProducer().getSendMsgTimeout()); - } - - public void publish(final Message msg, final SendCallback sendCallback, - final long timeout) throws MQClientException, RemotingException, InterruptedException { - if (msg.getUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL) == null) { - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL, DeFiBusConstant.DEFAULT_TTL); - } - - final AtomicReference selectorArgs = new AtomicReference(); - AsynCircuitBreakSendCallBack asynCircuitBreakSendCallBack = new AsynCircuitBreakSendCallBack(); - asynCircuitBreakSendCallBack.setMsg(msg); - asynCircuitBreakSendCallBack.setProducer(this.deFiBusProducer); - asynCircuitBreakSendCallBack.setSelectorArg(selectorArgs); - asynCircuitBreakSendCallBack.setSendCallback(sendCallback); - - String topic = msg.getTopic(); - boolean hasRouteData = deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl().getmQClientFactory().getTopicRouteTable().containsKey(topic); - if (!hasRouteData) { - LOGGER.info("no topic route info for " + topic + ", send heartbeat to nameserver"); - deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl().getmQClientFactory().updateTopicRouteInfoFromNameServer(topic); - } - - DeFiBusProducerImpl.this.deFiBusProducer.getDefaultMQProducer().send(msg, messageQueueSelector, selectorArgs, asynCircuitBreakSendCallBack, timeout); - } - - class AsynCircuitBreakSendCallBack implements SendCallback { - private Message msg; - private DeFiBusProducer producer; - private AtomicReference selectorArg; - private SendCallback sendCallback; - private AtomicInteger sendRetryTimes = new AtomicInteger(0); - private AtomicInteger circuitBreakRetryTimes = new AtomicInteger(0); - private int queueCount = 0; - - public void setProducer(DeFiBusProducer producer) { - this.producer = producer; - } - - public void setMsg(Message msg) { - this.msg = msg; - } - - public void setSelectorArg(AtomicReference selectorArg) { - this.selectorArg = selectorArg; - } - - public void setSendCallback(SendCallback sendCallback) { - this.sendCallback = sendCallback; - } - - @Override - public void onSuccess(SendResult sendResult) { - messageQueueSelector.getMessageQueueHealthManager().markQueueHealthy(sendResult.getMessageQueue()); - if (sendCallback != null) { - sendCallback.onSuccess(sendResult); - } - } - - @Override - public void onException(Throwable e) { - try { - MessageQueueHealthManager messageQueueHealthManager - = ((HealthyMessageQueueSelector) messageQueueSelector).getMessageQueueHealthManager(); - MessageQueue messageQueue = ((AtomicReference) selectorArg).get(); - if (messageQueue != null) { - messageQueueSelector.getMessageQueueHealthManager().markQueueFault(messageQueue); - if (messageQueueSelector.getMessageQueueHealthManager().isQueueFault(messageQueue)) { - LOGGER.warn("isolate send failed mq. {} cause: {}", messageQueue, e.getMessage()); - } - } - //logic of fuse - if (e.getMessage().contains("CODE: " + DeFiBusResponseCode.CONSUME_DIFF_SPAN_TOO_LONG)) { - //first retry initialize - if (queueCount == 0) { - List messageQueueList = producer.getDefaultMQProducer().getDefaultMQProducerImpl().getTopicPublishInfoTable() - .get(msg.getTopic()).getMessageQueueList(); - queueCount = messageQueueList.size(); - String clusterPrefix = deFiBusProducer.getDeFiBusClientConfig().getClusterPrefix(); - if (!StringUtils.isEmpty(clusterPrefix)) { - for (MessageQueue mq : messageQueueList) { - if (messageQueueHealthManager.isQueueFault(mq)) { - queueCount--; - } - } - } - } - - int retryTimes = Math.min(queueCount, deFiBusProducer.getDeFiBusClientConfig().getRetryTimesWhenSendAsyncFailed()); - if (circuitBreakRetryTimes.get() < retryTimes) { - circuitBreakRetryTimes.incrementAndGet(); - LOGGER.warn("fuse:send to [{}] circuit break, retry no.[{}] times, msgKey:[{}]", messageQueue.toString(), circuitBreakRetryTimes.intValue(), msg.getKeys()); - producer.getDefaultMQProducer().send(msg, messageQueueSelector, selectorArg, this); - //no exception to client when retry - return; - } else { - LOGGER.warn("fuse:send to [{}] circuit break after retry {} times, msgKey:[{}]", messageQueue.toString(), retryTimes, msg.getKeys()); - } - } else { - int maxRetryTimes = producer.getDeFiBusClientConfig().getRetryTimesWhenSendAsyncFailed(); - if (sendRetryTimes.getAndIncrement() < maxRetryTimes) { - LOGGER.info("send message fail, retry {} now, msgKey: {}, cause: {}", sendRetryTimes.get(), msg.getKeys(), e.getMessage()); - producer.getDefaultMQProducer().send(msg, messageQueueSelector, selectorArg, this); - return; - } else { - LOGGER.warn("send message fail, after retry {} times, msgKey:[{}]", maxRetryTimes, msg.getKeys()); - } - } - - if (sendCallback != null) { - sendCallback.onException(e); - } - } catch (Exception e1) { - LOGGER.warn("onExcept fail", e1); - if (sendCallback != null) { - sendCallback.onException(e); - } - } - } - } - - public void updateSendNearbyMapping(Map newMapping) { - this.messageQueueSelector.setSendNearbyMapping(newMapping); - } - - public void startUpdateClusterInfoTask() { - updateClusterInfo(); - scheduledExecutorService.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - updateClusterInfo(); - } - }, 0, 60, TimeUnit.SECONDS); - } - - private void updateClusterInfo() { - try { - MQClientInstance mqClientInstance = this.deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl().getmQClientFactory(); - if (mqClientInstance != null - && this.deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl().getServiceState() == ServiceState.RUNNING) { - if (mqClientInstance.getMQClientAPIImpl() != null && mqClientInstance.getMQClientAPIImpl().getNameServerAddressList() != null - && mqClientInstance.getMQClientAPIImpl().getNameServerAddressList().size() == 0) { - mqClientInstance.getMQClientAPIImpl().fetchNameServerAddr(); - } - clusterInfo = mqClientInstance.getMQClientAPIImpl().getBrokerClusterInfo(3000); - updateLocalBrokers(clusterInfo); - } - } catch (Throwable e) { - LOGGER.warn("updateClusterInfo failed, {}", e.getMessage()); - } - } - - private void updateLocalBrokers(ClusterInfo clusterInfo) { - if (clusterInfo != null) { - String clusterPrefix = deFiBusProducer.getDeFiBusClientConfig().getClusterPrefix(); - HashMap> clusterAddrTable = clusterInfo.getClusterAddrTable(); - Set currentBrokers = new HashSet(); - for (Map.Entry> entry : clusterAddrTable.entrySet()) { - String clusterName = entry.getKey(); - String clusterIdc = StringUtils.split(clusterName, DeFiBusConstant.IDC_SEPERATER)[0]; - if (StringUtils.isNotEmpty(clusterPrefix) && StringUtils.equalsIgnoreCase(clusterIdc, clusterPrefix)) { - currentBrokers.addAll(entry.getValue()); - } - } - if (!currentBrokers.equals(messageQueueSelector.getLocalBrokers())) { - messageQueueSelector.setLocalBrokers(currentBrokers); - LOGGER.info("localBrokers updated: {} , clusterPrefix :{} ", currentBrokers, clusterPrefix); - } - } - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/HealthyMessageQueueSelector.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/HealthyMessageQueueSelector.java deleted file mode 100644 index d0f616bc11..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/HealthyMessageQueueSelector.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.producer; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.client.producer.MessageQueueSelector; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageQueue; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class HealthyMessageQueueSelector implements MessageQueueSelector { - private static final Logger LOGGER = LoggerFactory.getLogger(HealthyMessageQueueSelector.class); - private final ConcurrentHashMap topicSendIndex = new ConcurrentHashMap<>(); - private final MessageQueueHealthManager messageQueueHealthManager; - private int minMqCountWhenSendLocal = 1; - private Map sendNearbyMapping = new HashMap<>(); - private Set localBrokers = new HashSet(); - - public HealthyMessageQueueSelector(MessageQueueHealthManager messageQueueHealthManager, int minMqCountWhenSendLocal) { - this.messageQueueHealthManager = messageQueueHealthManager; - this.minMqCountWhenSendLocal = minMqCountWhenSendLocal; - } - - @Override - @SuppressWarnings("unchecked") - public MessageQueue select(List mqs, Message msg, final Object selectedResultRef) { - - if (mqs == null || mqs.size() == 0) { - LOGGER.debug("mq list is empty"); - return null; - } - - boolean pub2local = MapUtils.getBoolean(sendNearbyMapping, msg.getTopic(), Boolean.TRUE); - MessageQueue lastOne = ((AtomicReference) selectedResultRef).get(); - - if (pub2local) { - List localMQs = new ArrayList<>(); - List remoteMqs = new ArrayList<>(); - HashMap localBrokerMQCount = separateLocalAndRemoteMQs(mqs, localBrokers, localMQs, remoteMqs); - - for (String brokerName : localBrokerMQCount.keySet()) { - //if MQ num less than threshold, send msg to all broker - if (localBrokerMQCount.get(brokerName) <= minMqCountWhenSendLocal) { - localMQs.addAll(remoteMqs); - } - } - - //try select a mq from local idc first - MessageQueue candidate = selectMessageQueue(localMQs, lastOne, msg); - if (candidate != null) { - ((AtomicReference) selectedResultRef).set(candidate); - LOGGER.debug("select local mq [{}], {}", candidate.toString(), msg); - return candidate; - } - - //try select a mq from other idc if cannot select one from local idc - candidate = selectMessageQueue(remoteMqs, lastOne, msg); - if (candidate != null) { - ((AtomicReference) selectedResultRef).set(candidate); - LOGGER.debug("select remote mq [{}], {}", candidate.toString(), msg); - return candidate; - } - } else { - //try select a mq from all mqs - MessageQueue candidate = selectMessageQueue(mqs, lastOne, msg); - if (candidate != null) { - ((AtomicReference) selectedResultRef).set(candidate); - LOGGER.debug("select global mq [{}], {}", candidate.toString(), msg); - return candidate; - } - } - - //try select a mq which is not isolated if no mq satisfy all limits - for (int j = 0; j < mqs.size(); j++) { - int index = this.getSendIndex(msg.getTopic()); - int pos = Math.abs(index) % mqs.size(); - MessageQueue candidate = mqs.get(pos); - if (isQueueHealthy(candidate)) { - ((AtomicReference) selectedResultRef).set(candidate); - LOGGER.debug("select any available mq [{}], {}", candidate.toString(), msg); - return candidate; - } - } - - //in case of retry, still try select a mq from another broker if all mq isolated - if (lastOne != null) { - for (int j = 0; j < mqs.size(); j++) { - int index = this.getSendIndex(msg.getTopic()); - int pos = Math.abs(index) % mqs.size(); - MessageQueue candidate = mqs.get(pos); - if (!lastOne.getBrokerName().equals(candidate.getBrokerName())) { - ((AtomicReference) selectedResultRef).set(candidate); - LOGGER.debug("select another broker mq [{}], {}", candidate.toString(), msg); - return candidate; - } - } - } - - //select a mq from all mqs anyway if no mq satisfy any limits - int index = this.getSendIndex(msg.getTopic()); - int pos = Math.abs(index) % mqs.size(); - MessageQueue candidate = mqs.get(pos); - ((AtomicReference) selectedResultRef).set(candidate); - LOGGER.debug("select any mq [{}], {}", candidate.toString(), msg); - return candidate; - - } - - private MessageQueue selectMessageQueue(List mqs, MessageQueue lastOneSelected, - Message msg) { - boolean isRetry = (lastOneSelected != null); - List candidateMqs = mqs; - if (isRetry) { - candidateMqs = filterMqsByBrokerName(mqs, lastOneSelected.getBrokerName()); - } - for (int i = 0; i < candidateMqs.size(); i++) { - int index = this.getSendIndex(msg.getTopic()); - int pos = Math.abs(index) % candidateMqs.size(); - MessageQueue candidate = candidateMqs.get(pos); - if (isQueueHealthy(candidate)) { - return candidate; - } - } - return null; - } - - private boolean isQueueHealthy(MessageQueue mq) { - return (mq != null) && (messageQueueHealthManager.isQueueHealthy(mq)); - } - - private List filterMqsByBrokerName(final List mqs, String brokerName) { - List result = new ArrayList<>(); - if (mqs != null && StringUtils.isNotEmpty(brokerName)) { - for (int i = 0; i < mqs.size(); i++) { - if (!mqs.get(i).getBrokerName().equals(brokerName)) { - result.add(mqs.get(i)); - } - } - } - return result; - } - - private HashMap separateLocalAndRemoteMQs(List mqs, Set localBrokers, - List localMQs, List remoteMQs) { - if (localMQs == null) - localMQs = new ArrayList<>(); - if (remoteMQs == null) - remoteMQs = new ArrayList<>(); - HashMap brokerMQCount = new HashMap<>(); - for (MessageQueue mq : mqs) { - if (localBrokers.contains(mq.getBrokerName())) { - localMQs.add(mq); - Integer count = brokerMQCount.get(mq.getBrokerName()); - if (count == null) { - count = 0; - } - brokerMQCount.put(mq.getBrokerName(), count+1); - } else { - remoteMQs.add(mq); - } - } - return brokerMQCount; - } - - public MessageQueueHealthManager getMessageQueueHealthManager() { - return messageQueueHealthManager; - } - - public void setSendNearbyMapping(Map sendNearbyMapping) { - this.sendNearbyMapping = sendNearbyMapping; - } - - public Set getLocalBrokers() { - return localBrokers; - } - - public void setLocalBrokers(Set localBrokers) { - this.localBrokers = localBrokers; - } - - private int getSendIndex(String topic) { - AtomicInteger index = topicSendIndex.get(topic); - if (index == null) { - topicSendIndex.putIfAbsent(topic, new AtomicInteger(0)); - index = topicSendIndex.get(topic); - } - int result = Math.abs(index.getAndIncrement()); - if (result < 0) { - index.set(0); - result = index.getAndIncrement(); - } - return result; - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/MessageQueueHealthManager.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/MessageQueueHealthManager.java deleted file mode 100644 index 52aee446ff..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/MessageQueueHealthManager.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.producer; - -import java.util.concurrent.ConcurrentHashMap; -import org.apache.rocketmq.common.message.MessageQueue; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MessageQueueHealthManager { - public static final Logger LOGGER = LoggerFactory.getLogger(MessageQueueHealthManager.class); - - public final ConcurrentHashMap faultMap = new ConcurrentHashMap(32); - - /** - * unhealthy mq isolate time in millisecond - */ - private long isoTime = 60 * 1000L; - - public MessageQueueHealthManager(long isoTime) { - this.isoTime = isoTime; - } - - public void markQueueFault(MessageQueue mq) { - faultMap.put(mq, System.currentTimeMillis() + isoTime); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("mark queue {} fault for time {}", mq, isoTime); - } - } - - public void markQueueHealthy(MessageQueue mq) { - if (faultMap.containsKey(mq)) { - LOGGER.info("mark queue healthy. {}", mq); - faultMap.remove(mq); - } - } - - public boolean isQueueFault(MessageQueue mq) { - Long isolateUntilWhen = faultMap.get(mq); - return isolateUntilWhen != null && System.currentTimeMillis() < isolateUntilWhen; - } - - public boolean isQueueHealthy(MessageQueue mq) { - return !isQueueFault(mq); - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/RRCallback.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/RRCallback.java deleted file mode 100644 index 4614be0492..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/RRCallback.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.producer; - -import org.apache.rocketmq.common.message.Message; - -public interface RRCallback { - public void onSuccess(Message msg); - - public void onException(Throwable e); -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/RRResponseFuture.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/RRResponseFuture.java deleted file mode 100644 index 330f698dc3..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/RRResponseFuture.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.producer; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.rocketmq.common.message.Message; - -public class RRResponseFuture { - private CountDownLatch countDownLatch = new CountDownLatch(1); - private volatile Message respMsg = null; - private final RRCallback rrCallback; - private long expiredTime = System.currentTimeMillis(); - private AtomicBoolean release = new AtomicBoolean(false); - - public RRResponseFuture() { - this.rrCallback = null; - } - - public RRResponseFuture(RRCallback rrCallback) { - this.rrCallback = rrCallback; - } - - public RRResponseFuture(RRCallback rrCallback, long timeout) { - this.rrCallback = rrCallback; - this.expiredTime += timeout; - } - - public void putResponse(final Message respMsg) { - this.respMsg = respMsg; - this.countDownLatch.countDown(); - } - - public Message waitResponse(long timeout) throws InterruptedException { - this.countDownLatch.await(timeout, TimeUnit.MILLISECONDS); - return this.respMsg; - } - - public RRCallback getRrCallback() { - return rrCallback; - } - - public long getExpiredTime() { - return expiredTime; - } - - public boolean release() { - return release.getAndSet(true); - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/ResponseTable.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/ResponseTable.java deleted file mode 100644 index 04d0069ee7..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/producer/ResponseTable.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.producer; - -import java.util.concurrent.ConcurrentHashMap; - -public class ResponseTable { - private static ConcurrentHashMap rrResponseFurtureConcurrentHashMap = new ConcurrentHashMap(); - - public static ConcurrentHashMap getRrResponseFurtureConcurrentHashMap() { - return rrResponseFurtureConcurrentHashMap; - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/rebalance/AllocateMessageQueueByIDC.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/rebalance/AllocateMessageQueueByIDC.java deleted file mode 100644 index 59ff32b91f..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/client/impl/rebalance/AllocateMessageQueueByIDC.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.rebalance; - -import cn.webank.defibus.common.DeFiBusConstant; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.apache.rocketmq.client.consumer.AllocateMessageQueueStrategy; -import org.apache.rocketmq.client.impl.factory.MQClientInstance; -import org.apache.rocketmq.client.log.ClientLogger; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.common.protocol.route.BrokerData; -import org.apache.rocketmq.common.protocol.route.TopicRouteData; -import org.apache.rocketmq.logging.InternalLogger; - -public class AllocateMessageQueueByIDC implements AllocateMessageQueueStrategy { - private static final InternalLogger log = ClientLogger.getLog(); - private MQClientInstance mqClientInstance = null; - private static final String UNKNOWN_IDC = "UNKNOWN_IDC"; - - @Override - public String getName() { - return "IDC_NEARBY"; - } - - @Override - public List allocate(String consumerGroup, String currentCID, List mqAll, - List cidAll) { - List result = new ArrayList(); - if (currentCID == null || currentCID.length() < 1) { - throw new IllegalArgumentException("currentCID is empty"); - } - if (mqAll == null || mqAll.isEmpty()) { - log.info("[IGNORE] doRebalance.allocate, mqAll is empty"); - return result; - } - if (cidAll == null || cidAll.isEmpty()) { - log.info("[IGNORE] doRebalance.allocate, cidAll is empty"); - return result; - } - - if (!cidAll.contains(currentCID)) { - log.info("[BUG] ConsumerGroup: {} The consumerId: {} not in cidAll: {}", - consumerGroup, - currentCID, - cidAll); - return result; - } - - { - log.debug("doRebalance: consumerGroup: {} currentCID: {}", consumerGroup, currentCID); - log.debug("mqAll:" + mqAll); - if (mqAll != null) { - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < mqAll.size(); i++) { - sb.append("MQ#" + i + ":" + mqAll.get(i) + " "); - } - log.debug(sb.toString()); - } - log.debug("cidAll:" + cidAll); - if (cidAll != null) { - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < cidAll.size(); i++) { - sb.append("CID#" + i + ":" + cidAll.get(i) + " "); - } - log.debug(sb.toString()); - } - } - - /** - * step1: seperate mqs and cids by idc - */ - Map> sepMqs = this.seperateMqsByIDC(mqAll); - Map> sepClients = this.seperateCidsByIDC(cidAll); - - /** - * step2: allocate local mqs first - */ - String clusterPrefix = extractIdcFromClientId(currentCID); - if (clusterPrefix != null) { - List nearbyMqs = sepMqs.get(clusterPrefix); - List nearbyCids = sepClients.get(clusterPrefix); - - if (nearbyMqs != null && nearbyCids != null && !nearbyMqs.isEmpty() && !nearbyCids.isEmpty()) { - Collections.sort(nearbyCids); - Collections.sort(nearbyMqs); - int index = nearbyCids.indexOf(currentCID); - for (int i = index; i < nearbyMqs.size(); i++) { - if (i % nearbyCids.size() == index) { - result.add(nearbyMqs.get(i)); - } - } - } - } - - /** - * step3: allocate mqs which no subscriber in the same idc - */ - List mqsNoClientsInSameIdc = new ArrayList<>(); - for (String idc : sepMqs.keySet()) { - if (!idc.equals(UNKNOWN_IDC) && (sepClients.get(idc) == null || sepClients.get(idc).isEmpty())) { - mqsNoClientsInSameIdc.addAll(sepMqs.get(idc)); - } - } - if (!mqsNoClientsInSameIdc.isEmpty()) { - Collections.sort(mqsNoClientsInSameIdc); - Collections.sort(cidAll); - int index = cidAll.indexOf(currentCID); - for (int i = index; i < mqsNoClientsInSameIdc.size(); i++) { - if (i % cidAll.size() == index) { - result.add(mqsNoClientsInSameIdc.get(i)); - } - } - } - - /** - * step4: allocate mqs which no matched any cluster and cannot determined idc. - */ - if (sepMqs.get(UNKNOWN_IDC) != null && !sepMqs.get(UNKNOWN_IDC).isEmpty()) { - log.warn("doRebalance: cannot determine idc of mqs. allocate all to myself. {}", sepMqs.get(UNKNOWN_IDC)); - result.addAll(sepMqs.get(UNKNOWN_IDC)); - } - return result; - } - - private Map> seperateMqsByIDC(List mqAll) { - String topic = mqAll.get(0).getTopic(); - TopicRouteData topicRouteData = mqClientInstance.getTopicRouteTable().get(topic); - if (topicRouteData == null) { - mqClientInstance.updateTopicRouteInfoFromNameServer(topic); - topicRouteData = mqClientInstance.getTopicRouteTable().get(topic); - } - - HashMap brokerIdcMap = new HashMap<>(); - ArrayList brokerDatas = new ArrayList<>(topicRouteData.getBrokerDatas()); - for (BrokerData broker : brokerDatas) { - String clusterName = broker.getCluster(); - String idc = clusterName.split(DeFiBusConstant.IDC_SEPERATER)[0]; - brokerIdcMap.put(broker.getBrokerName(), idc.toUpperCase()); - } - - Map> result = new HashMap<>(); - for (MessageQueue mq : mqAll) { - String idc = brokerIdcMap.get(mq.getBrokerName()); - if (idc == null) { - idc = UNKNOWN_IDC; - } - if (result.get(idc) == null) { - List mqList = new ArrayList<>(); - mqList.add(mq); - result.put(idc, mqList); - } else { - result.get(idc).add(mq); - } - } - return result; - } - - private Map> seperateCidsByIDC(List cidAll) { - Map> result = new HashMap<>(); - for (String cid : cidAll) { - String cidIdc = extractIdcFromClientId(cid); - if (cidIdc != null) { - cidIdc = cidIdc.toUpperCase(); - if (result.get(cidIdc) != null) { - result.get(cidIdc).add(cid); - } else { - List cidList = new ArrayList<>(); - cidList.add(cid); - result.put(cidIdc, cidList); - } - } - } - return result; - } - - private String extractIdcFromClientId(final String cid) { - if (cid != null) { - String[] cidArr = cid.split(DeFiBusConstant.INSTANCE_NAME_SEPERATER); - if (cidArr.length > 2) { - return cidArr[cidArr.length - 1]; - } - } - return null; - } - - public void setMqClientInstance(MQClientInstance mqClientInstance) { - this.mqClientInstance = mqClientInstance; - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrently.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrently.java deleted file mode 100644 index 2856c6651b..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrently.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.consumer; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.message.DeFiBusMessageConst; -import java.util.ArrayList; -import java.util.List; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; -import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; -import org.apache.rocketmq.common.message.MessageExt; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class DeFiBusMessageListenerConcurrently implements MessageListenerConcurrently { - private static final Logger LOG = LoggerFactory.getLogger(DeFiBusMessageListenerConcurrently.class); - - @Override - public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { - - List nonTimeOutMsgs = new ArrayList(); - try { - for (MessageExt msgExt : msgs) { - if (LOG.isDebugEnabled()) { - LOG.debug("begin to receive message: " + msgExt); - } - - long ttl = 0; - try { - ttl = Long.valueOf(msgExt.getUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL)); - } catch (NumberFormatException e) { - LOG.warn("receive illegal message, ttl format err, ack immediately." + msgExt.toString()); - continue; - } - - long storeTimestamp = msgExt.getStoreTimestamp(); - long leaveTime = -1; - if (msgExt.getProperties().get(DeFiBusMessageConst.LEAVE_TIME) != null) { - leaveTime = Long.valueOf(msgExt.getProperties().get(DeFiBusMessageConst.LEAVE_TIME)); - } - - double elapseTime = 0L; - if (leaveTime != -1) { - elapseTime = leaveTime - storeTimestamp; - } - if (elapseTime >= ttl) { - if (LOG.isWarnEnabled()) { - LOG.warn("discard timeout message : " + msgExt.toString()); - } - continue; - } - - nonTimeOutMsgs.add(msgExt); - } - - if (nonTimeOutMsgs.size() == 0) { - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - ConsumeConcurrentlyStatus status = null; - status = handleMessage(nonTimeOutMsgs, context); - - return status; - } catch (Throwable e) { - LOG.warn("handleMessage fail", e); - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - - } - - public abstract ConsumeConcurrentlyStatus handleMessage(List msgs, ConsumeConcurrentlyContext context); - -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrentlyOnce.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrentlyOnce.java deleted file mode 100644 index de5e786219..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrentlyOnce.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.consumer; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.message.DeFiBusMessageConst; -import java.util.ArrayList; -import java.util.List; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; -import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; -import org.apache.rocketmq.common.message.MessageExt; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class DeFiBusMessageListenerConcurrentlyOnce implements MessageListenerConcurrently { - private static final Logger LOG = LoggerFactory.getLogger(DeFiBusMessageListenerConcurrentlyOnce.class); - - @Override - public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { - List nonTimeOutMsgs = new ArrayList(); - for (MessageExt msgExt : msgs) { - if (LOG.isDebugEnabled()) { - LOG.debug("begin to receive message: " + msgExt); - } - - long ttl = 0; - try { - ttl = Long.valueOf(msgExt.getUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL)); - } catch (NumberFormatException e) { - LOG.warn("receive illegal message, ttl format err, ack immediately." + msgExt.toString()); - continue; - } - - long storeTimestamp = msgExt.getStoreTimestamp(); - long leaveTime = -1; - if (msgExt.getProperties().get(DeFiBusMessageConst.LEAVE_TIME) != null) { - leaveTime = Long.valueOf(msgExt.getProperties().get(DeFiBusMessageConst.LEAVE_TIME)); - } - - double elapseTime = 0L; - if (leaveTime != -1) { - elapseTime = leaveTime - storeTimestamp; - } - if (elapseTime >= ttl) { - if (LOG.isWarnEnabled()) { - LOG.warn("discard timeout message : " + msgExt.toString()); - } - continue; - } - nonTimeOutMsgs.add(msgExt); - } - - if (nonTimeOutMsgs.size() == 0) { - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - - ConsumeConcurrentlyStatus status = null; - try { - for (MessageExt msg : nonTimeOutMsgs) { - status = handleMessage(msg, context); - } - } catch (Throwable e) { - LOG.info("handleMessage fail", e); - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - return status; - } - - public abstract ConsumeConcurrentlyStatus handleMessage(MessageExt msg, ConsumeConcurrentlyContext context); - -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrentlyWithReply.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrentlyWithReply.java deleted file mode 100644 index 051f501a01..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusMessageListenerConcurrentlyWithReply.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.consumer; - -import cn.webank.defibus.client.common.DeFiBusClientUtil; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.message.DeFiBusMessageConst; -import cn.webank.defibus.producer.DeFiBusProducer; -import java.util.ArrayList; -import java.util.List; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; -import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageExt; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class DeFiBusMessageListenerConcurrentlyWithReply implements MessageListenerConcurrently { - private static final Logger LOG = LoggerFactory.getLogger(DeFiBusMessageListenerConcurrentlyWithReply.class); - private DeFiBusProducer deFiBusProducer; - - public DeFiBusMessageListenerConcurrentlyWithReply(DeFiBusProducer deFiBusProducer) { - this.deFiBusProducer = deFiBusProducer; - if (!deFiBusProducer.isStart()) { - try { - deFiBusProducer.start(); - } catch (MQClientException e) { - e.printStackTrace(); - } - } - } - - @Override - public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { - List nonTimeOutMsgs = new ArrayList(); - for (MessageExt msgExt : msgs) { - if (LOG.isDebugEnabled()) { - LOG.debug("begin to receive message: " + msgExt); - } - - long ttl = 0; - try { - ttl = Long.valueOf(msgExt.getUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL)); - } catch (NumberFormatException e) { - LOG.warn("receive illegal message, ttl format err, ack immediately." + msgExt.toString()); - continue; - } - - long storeTimestamp = msgExt.getStoreTimestamp(); - long leaveTime = -1; - if (msgExt.getProperties().get(DeFiBusMessageConst.LEAVE_TIME) != null) { - leaveTime = Long.valueOf(msgExt.getProperties().get(DeFiBusMessageConst.LEAVE_TIME)); - } - - double elapseTime = 0L; - if (leaveTime != -1) { - elapseTime = leaveTime - storeTimestamp; - } - if (elapseTime >= ttl) { - if (LOG.isWarnEnabled()) { - LOG.warn("discard timeout message : " + msgExt.toString()); - } - continue; - } - nonTimeOutMsgs.add(msgExt); - } - - if (nonTimeOutMsgs.size() == 0) { - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - - ConsumeConcurrentlyStatus status = ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - try { - for (MessageExt msg : nonTimeOutMsgs) { - String replyContent = handleMessage(msg, context); - Message replyMsg = DeFiBusClientUtil.createReplyMessage(msg, replyContent.getBytes()); - deFiBusProducer.reply(replyMsg, null); - } - } catch (Throwable e) { - LOG.info("handleMessage fail", e); - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - return status; - } - - public abstract String handleMessage(MessageExt msg, ConsumeConcurrentlyContext context); - -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusPushConsumer.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusPushConsumer.java deleted file mode 100644 index 1b36bf324a..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/consumer/DeFiBusPushConsumer.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.consumer; - -import cn.webank.defibus.client.DeFiBusClientManager; -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.client.impl.DeFiBusClientAPIImpl; -import cn.webank.defibus.client.impl.factory.DeFiBusClientInstance; -import cn.webank.defibus.client.impl.hook.DeFiBusClientHookFactory; -import cn.webank.defibus.client.impl.rebalance.AllocateMessageQueueByIDC; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.DeFiBusVersion; -import java.util.Map; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.rocketmq.client.consumer.AllocateMessageQueueStrategy; -import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; -import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.client.impl.consumer.ProcessQueue; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.remoting.RPCHook; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusPushConsumer { - protected static final Logger LOG = LoggerFactory.getLogger(DeFiBusPushConsumer.class); - - private DefaultMQPushConsumer defaultMQPushConsumer; - private DeFiBusClientInstance deFiBusClientInstance; - private AllocateMessageQueueStrategy allocateMessageQueueStrategy; - private RPCHook rpcHook; - private DeFiBusClientConfig deFiBusClientConfig; - private AtomicBoolean isStart = new AtomicBoolean(false); - - static { - System.setProperty("rocketmq.client.log.loadconfig", "false"); - } - - public DeFiBusPushConsumer() { - this(new DeFiBusClientConfig()); - } - - public DeFiBusPushConsumer(final DeFiBusClientConfig deFiBusClientConfig) { - this.deFiBusClientConfig = deFiBusClientConfig; - RPCHook rpcHookForAuth = DeFiBusClientHookFactory.createRPCHook(deFiBusClientConfig.getRpcHook()); - this.rpcHook = rpcHookForAuth; - this.allocateMessageQueueStrategy = new AllocateMessageQueueByIDC(); - - defaultMQPushConsumer = new DefaultMQPushConsumer(deFiBusClientConfig.getConsumerGroup(), rpcHook, allocateMessageQueueStrategy); - defaultMQPushConsumer.setVipChannelEnabled(false); - } - - /** - * start the consumer which will begin to connect with the broker and then message can be consumed. - * If the consumer has been already started, nothing will happen. - * @throws MQClientException - */ - public void start() throws MQClientException { - if (isStart.compareAndSet(false, true)) { - - if (deFiBusClientConfig.getNamesrvAddr() != null) { - this.defaultMQPushConsumer.setNamesrvAddr(deFiBusClientConfig.getNamesrvAddr()); - } - this.defaultMQPushConsumer.changeInstanceNameToPID(); - - String instanceName = this.defaultMQPushConsumer.getInstanceName() + DeFiBusConstant.INSTANCE_NAME_SEPERATER + DeFiBusVersion.getVersionDesc(deFiBusClientConfig.getVersion()); - if (deFiBusClientConfig.getClusterPrefix() != null) { - instanceName = instanceName + DeFiBusConstant.INSTANCE_NAME_SEPERATER + deFiBusClientConfig.getClusterPrefix(); - } - this.defaultMQPushConsumer.setInstanceName(instanceName); - defaultMQPushConsumer.setConsumeMessageBatchMaxSize(deFiBusClientConfig.getConsumeMessageBatchMaxSize()); - defaultMQPushConsumer.setPullInterval(deFiBusClientConfig.getPullInterval()); - defaultMQPushConsumer.setPullBatchSize(deFiBusClientConfig.getPullBatchSize()); - defaultMQPushConsumer.setConsumeConcurrentlyMaxSpan(deFiBusClientConfig.getConsumeConcurrentlyMaxSpan()); - defaultMQPushConsumer.setPollNameServerInterval(deFiBusClientConfig.getPollNameServerInterval()); - defaultMQPushConsumer.setPullThresholdForQueue(deFiBusClientConfig.getAckWindowSize()); - defaultMQPushConsumer.setConsumeTimeout(deFiBusClientConfig.getConsumeTimeout()); - defaultMQPushConsumer.setConsumeThreadMax(deFiBusClientConfig.getThreadPoolMaxSize()); - defaultMQPushConsumer.setConsumeThreadMin(deFiBusClientConfig.getThreadPoolCoreSize()); - defaultMQPushConsumer.setPersistConsumerOffsetInterval(deFiBusClientConfig.getAckTime()); - defaultMQPushConsumer.setMaxReconsumeTimes(deFiBusClientConfig.getMaxReconsumeTimes()); - defaultMQPushConsumer.setHeartbeatBrokerInterval(deFiBusClientConfig.getHeartbeatBrokerInterval()); - - deFiBusClientInstance = DeFiBusClientManager.getInstance().getAndCreateDeFiBusClientInstance(defaultMQPushConsumer, rpcHook); - - deFiBusClientInstance.start(); - - if (allocateMessageQueueStrategy instanceof AllocateMessageQueueByIDC) { - ((AllocateMessageQueueByIDC) allocateMessageQueueStrategy).setMqClientInstance(deFiBusClientInstance); - } - - if (deFiBusClientConfig.getWsAddr() != null) { - DeFiBusClientAPIImpl deFiClientAPI = (DeFiBusClientAPIImpl) deFiBusClientInstance.getMQClientAPIImpl(); - deFiClientAPI.setWsAddr(deFiBusClientConfig.getWsAddr()); - deFiClientAPI.fetchNameServerAddr(); - } - - this.defaultMQPushConsumer.start(); - final String retryTopic = MixAll.getRetryTopic(this.defaultMQPushConsumer.getConsumerGroup()); - defaultMQPushConsumer.unsubscribe(retryTopic); - defaultMQPushConsumer.getDefaultMQPushConsumerImpl().getmQClientFactory().updateTopicRouteInfoFromNameServer(); - - LOG.info("DeFiBusPushConsumer start ok"); - } else { - LOG.warn("DeFiBusPushConsumer already started"); - } - } - - public void shutdown() { - if (isStart.compareAndSet(true, false)) { - this.defaultMQPushConsumer.shutdown(); - LOG.info("DeFiBusPushConsumer [{}] shutdown", defaultMQPushConsumer.getInstanceName()); - } else { - LOG.info("DeFiBusPushConsumer [{}] already shutdown", defaultMQPushConsumer.getInstanceName()); - } - } - - /** - * register a message listener which specify the callback message how message should be consumed. The message will be consumed in a standalone thread pool. - * @param messageListener - */ - public void registerMessageListener(MessageListenerConcurrently messageListener) { - this.defaultMQPushConsumer.registerMessageListener(messageListener); - } - - /** - * subscirbe a topic so that the consumer can consume message from. Typically, you should subscribe topic first then start the consumer - * @param topic topic name that the consumer needs to subscribe - * @throws MQClientException - */ - public void subscribe(String topic) throws MQClientException { - this.defaultMQPushConsumer.subscribe(topic, "*"); - LOG.info("add subscription [{}] to consumer", topic); - } - - public void unsubscribe(String topic) { - unsubscribe(topic, true); - } - - public void unsubscribe(String topic, boolean isNeedSendHeartbeat) { - LOG.info("remove subscription [{}] from consumer", topic); - ConcurrentMap processQueueTable = - this.defaultMQPushConsumer.getDefaultMQPushConsumerImpl().getRebalanceImpl().getProcessQueueTable(); - - for (Map.Entry entry : processQueueTable.entrySet()) { - MessageQueue messageQueue = entry.getKey(); - ProcessQueue pq = entry.getValue(); - if (messageQueue.getTopic().equals(topic)) { - pq.setDropped(true); - } - } - this.defaultMQPushConsumer.unsubscribe(topic); - if (isStart.get()) { - if (isNeedSendHeartbeat) { - sendHeartBeatToBrokersWhenSubscribeChange(); - } - } - } - - public DefaultMQPushConsumer getDefaultMQPushConsumer() { - return defaultMQPushConsumer; - } - - public DeFiBusClientInstance getDeFiBusClientInstance() { - return deFiBusClientInstance; - } - - public String getNamesrvAddr() { - return this.defaultMQPushConsumer.getNamesrvAddr(); - } - - public void setNamesrvAddr(String namesrvAddr) { - this.defaultMQPushConsumer.setNamesrvAddr(namesrvAddr); - } - - public void setConsumeFromWhere(ConsumeFromWhere consumeFromWhere) { - this.defaultMQPushConsumer.setConsumeFromWhere(consumeFromWhere); - } - - private void sendHeartBeatToBrokersWhenSubscribeChange() { - this.defaultMQPushConsumer.getDefaultMQPushConsumerImpl().getmQClientFactory().sendHeartbeatToAllBrokerWithLock(); - } -} diff --git a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/producer/DeFiBusProducer.java b/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/producer/DeFiBusProducer.java deleted file mode 100644 index 80dc1fcafb..0000000000 --- a/eventmesh-store/defibus-client/src/main/java/cn/webank/defibus/producer/DeFiBusProducer.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.producer; - -import cn.webank.defibus.client.DeFiBusClientManager; -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.client.impl.DeFiBusClientAPIImpl; -import cn.webank.defibus.client.impl.factory.DeFiBusClientInstance; -import cn.webank.defibus.client.impl.hook.DeFiBusClientHookFactory; -import cn.webank.defibus.client.impl.producer.DeFiBusProducerImpl; -import cn.webank.defibus.client.impl.producer.RRCallback; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.DeFiBusVersion; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.rocketmq.client.exception.MQBrokerException; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.client.producer.DefaultMQProducer; -import org.apache.rocketmq.client.producer.SendCallback; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageClientIDSetter; -import org.apache.rocketmq.remoting.RPCHook; -import org.apache.rocketmq.remoting.exception.RemotingException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeFiBusProducer { - private static final Logger LOG = LoggerFactory.getLogger(DeFiBusProducer.class); - private DefaultMQProducer defaultMQProducer; - private DeFiBusClientInstance deFiBusClientInstance; - private RPCHook rpcHook; - private AtomicBoolean isStart = new AtomicBoolean(false); - private DeFiBusProducerImpl deFiBusProducerImpl; - private DeFiBusClientConfig deFiBusClientConfig; - - static { - System.setProperty("rocketmq.client.log.loadconfig", "false"); - } - - public DeFiBusProducer() { - this(new DeFiBusClientConfig()); - } - - public DeFiBusProducer(DeFiBusClientConfig deFiBusClientConfig) { - RPCHook rpcHookForAuth = DeFiBusClientHookFactory.createRPCHook(deFiBusClientConfig.getRpcHook()); - defaultMQProducer = new DefaultMQProducer(deFiBusClientConfig.getProducerGroup(), rpcHookForAuth); - defaultMQProducer.setVipChannelEnabled(false); - this.rpcHook = rpcHookForAuth; - this.deFiBusClientConfig = deFiBusClientConfig; - } - - /** - * start the producer which will begin to connect with the broker. A producer MUST call this method before sending any message - * If the producer has been already started, nothing will happen. - * @throws MQClientException - */ - public void start() throws MQClientException { - if (isStart.compareAndSet(false, true)) { - try { - System.setProperty("com.rocketmq.remoting.clientAsyncSemaphoreValue", String.valueOf(deFiBusClientConfig.getPubWindowSize())); - - if (deFiBusClientConfig.getNamesrvAddr() != null) { - this.defaultMQProducer.setNamesrvAddr(deFiBusClientConfig.getNamesrvAddr()); - } - if (!this.defaultMQProducer.getProducerGroup().equals(MixAll.CLIENT_INNER_PRODUCER_GROUP)) { - this.defaultMQProducer.changeInstanceNameToPID(); - } - - String instanceName = this.defaultMQProducer.getInstanceName() + DeFiBusConstant.INSTANCE_NAME_SEPERATER - + DeFiBusVersion.getVersionDesc(this.deFiBusClientConfig.getVersion()); - - if (deFiBusClientConfig.getClusterPrefix() != null) { - instanceName = instanceName + DeFiBusConstant.INSTANCE_NAME_SEPERATER + deFiBusClientConfig.getClusterPrefix(); - } - this.defaultMQProducer.setInstanceName(instanceName); - - this.defaultMQProducer.setPollNameServerInterval(deFiBusClientConfig.getPollNameServerInterval()); - this.defaultMQProducer.setRetryTimesWhenSendAsyncFailed(deFiBusClientConfig.getRetryTimesWhenSendAsyncFailed()); - this.defaultMQProducer.setRetryTimesWhenSendFailed(deFiBusClientConfig.getRetryTimesWhenSendFailed()); - this.defaultMQProducer.setHeartbeatBrokerInterval(deFiBusClientConfig.getHeartbeatBrokerInterval()); - this.defaultMQProducer.setPersistConsumerOffsetInterval(deFiBusClientConfig.getAckTime()); - deFiBusClientInstance - = DeFiBusClientManager.getInstance().getAndCreateDeFiBusClientInstance(defaultMQProducer, rpcHook); - - if (deFiBusClientConfig.getWsAddr() != null) { - DeFiBusClientAPIImpl deFiClientAPI = (DeFiBusClientAPIImpl) deFiBusClientInstance.getMQClientAPIImpl(); - deFiClientAPI.setWsAddr(deFiBusClientConfig.getWsAddr()); - } - - deFiBusProducerImpl = new DeFiBusProducerImpl(this, deFiBusClientConfig, deFiBusClientInstance); - this.defaultMQProducer.start(); - deFiBusProducerImpl.startUpdateClusterInfoTask(); - } catch (MQClientException e) { - LOG.warn("DeFiBusProducer start client failed {}", e.getMessage()); - isStart.set(false); - throw e; - } catch (Exception e) { - LOG.warn("DeFiBusProducer start client failed", e); - isStart.set(false); - throw new MQClientException("DeFiBusProducer start client failed", e); - } - - MessageClientIDSetter.createUniqID(); - - LOG.info("DeFiBusProducer start ok"); - } else { - LOG.warn("DeFiBusProducer already started"); - } - } - - public void shutdown() { - if (isStart.compareAndSet(true, false)) { - this.defaultMQProducer.shutdown(); - LOG.info("DeFiBusProducer [{}] shutdown", defaultMQProducer.getInstanceName()); - } else { - LOG.info("DeFiBusProducer [{}] already shutdown", defaultMQProducer.getInstanceName()); - } - } - - public DefaultMQProducer getDefaultMQProducer() { - return defaultMQProducer; - } - - //sync Request-Response interface - public Message request(Message msg, long timeout) - throws InterruptedException, RemotingException, MQClientException, MQBrokerException { - return deFiBusProducerImpl.request(msg, timeout); - } - - //async Request-Response interface - public void request(Message msg, RRCallback rrCallback, long timeout) - throws InterruptedException, RemotingException, MQClientException, MQBrokerException { - deFiBusProducerImpl.request(msg, null, rrCallback, timeout); - } - - public void request(Message msg, SendCallback sendCallback, RRCallback rrCallback, long timeout) - throws InterruptedException, RemotingException, MQClientException, MQBrokerException { - deFiBusProducerImpl.request(msg, sendCallback, rrCallback, timeout); - } - - public void reply(Message replyMsg, SendCallback sendCallback) - throws InterruptedException, RemotingException, MQClientException, MQBrokerException { - deFiBusProducerImpl.reply(replyMsg, sendCallback); - } - - //async publish with callback - public void publish(Message msg, SendCallback sendCallback) - throws MQClientException, RemotingException, InterruptedException { - this.deFiBusProducerImpl.publish(msg, sendCallback); - } - - //async public - public void publish(Message msg) throws MQClientException, RemotingException, InterruptedException { - this.deFiBusProducerImpl.publish(msg); - } - - public void publish( - Collection msgs) throws MQClientException, RemotingException, MQBrokerException, InterruptedException { - this.deFiBusProducerImpl.publish(msgs); - } - - public String getNamesrvAddr() { - return defaultMQProducer.getNamesrvAddr(); - } - - public void setNamesrvAddr(String namesrvAddr) { - defaultMQProducer.setNamesrvAddr(namesrvAddr); - } - - public boolean isStart() { - return isStart.get(); - } - - public DeFiBusClientConfig getDeFiBusClientConfig() { - return deFiBusClientConfig; - } - - public void updateSendNearbyMapping(Map newMapping) { - this.deFiBusProducerImpl.updateSendNearbyMapping(newMapping); - } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/common/DeFiBusCLientUtilTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/common/DeFiBusCLientUtilTest.java deleted file mode 100644 index 9d20241491..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/common/DeFiBusCLientUtilTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.common; - -import cn.webank.defibus.common.DeFiBusConstant; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageExt; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DeFiBusCLientUtilTest { - @Test - public void createReplyMessage_Success() { - MessageExt msg = new MessageExt(); - msg.setTopic("Test"); - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_CLUSTER, "ClusterName"); - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO, "reply_to"); - msg.putUserProperty(DeFiBusConstant.PROPERTY_RR_REQUEST_ID, "w/request_id"); - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_BROKER, "BrokerName"); - - byte[] replyContent = "reply content".getBytes(); - Message replyMsg = DeFiBusClientUtil.createReplyMessage(msg, replyContent); - - assertThat(replyMsg).isNotNull(); - assertThat(replyContent).isEqualTo(replyMsg.getBody()); - } - - @Test - public void createReplyMessage_Fail() { - MessageExt msg = new MessageExt(); - msg.setTopic("Test"); - msg.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO, "reply_to"); - msg.putUserProperty(DeFiBusConstant.PROPERTY_RR_REQUEST_ID, "w/request_id"); - - byte[] replyContent = "reply content".getBytes(); - Message replyMsg = DeFiBusClientUtil.createReplyMessage(msg, replyContent); - - assertThat(replyMsg).isNull(); - } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusMessageListenerConcurrentlyOnceTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusMessageListenerConcurrentlyOnceTest.java deleted file mode 100644 index 39b1200002..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusMessageListenerConcurrentlyOnceTest.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.consumer; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.client.impl.DeFiBusClientAPIImpl; -import cn.webank.defibus.client.impl.factory.DeFiBusClientInstance; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.consumer.DeFiBusMessageListenerConcurrentlyOnce; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import java.io.ByteArrayOutputStream; -import java.lang.reflect.Field; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import org.apache.rocketmq.client.consumer.PullCallback; -import org.apache.rocketmq.client.consumer.PullResult; -import org.apache.rocketmq.client.consumer.PullStatus; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; -import org.apache.rocketmq.client.impl.CommunicationMode; -import org.apache.rocketmq.client.impl.FindBrokerResult; -import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; -import org.apache.rocketmq.client.impl.consumer.ProcessQueue; -import org.apache.rocketmq.client.impl.consumer.PullAPIWrapper; -import org.apache.rocketmq.client.impl.consumer.PullMessageService; -import org.apache.rocketmq.client.impl.consumer.PullRequest; -import org.apache.rocketmq.client.impl.consumer.PullResultExt; -import org.apache.rocketmq.client.impl.consumer.RebalancePushImpl; -import org.apache.rocketmq.client.impl.factory.MQClientInstance; -import org.apache.rocketmq.common.message.MessageClientExt; -import org.apache.rocketmq.common.message.MessageDecoder; -import org.apache.rocketmq.common.message.MessageExt; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.common.protocol.header.PullMessageRequestHeader; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class DeFiBusMessageListenerConcurrentlyOnceTest { - private String consumerGroup; - private String topic = "FooBar"; - private String brokerName = "BrokerA"; - private DeFiBusClientInstance defiBusClientFactory; - private int totalMsg = 5; - private AtomicInteger consumeCount = new AtomicInteger(0); - - @Mock - private DeFiBusClientAPIImpl deFiBusClientAPIImpl; - - private PullAPIWrapper pullAPIWrapper; - private RebalancePushImpl rebalancePushImpl; - private DeFiBusPushConsumer pushConsumer; - - private final CountDownLatch countDownLatch = new CountDownLatch(totalMsg); - - @Before - public void init() throws Exception { - DeFiBusClientConfig clientConfig = new DeFiBusClientConfig(); - consumerGroup = "FooBarGroup" + System.currentTimeMillis(); - clientConfig.setConsumerGroup(consumerGroup); - pushConsumer = new DeFiBusPushConsumer(clientConfig); - pushConsumer.setNamesrvAddr("127.0.0.1:9876"); - pushConsumer.getDefaultMQPushConsumer().setPullInterval(60 * 1000); - - pushConsumer.registerMessageListener(new DeFiBusMessageListenerConcurrentlyOnce() { - @Override - public ConsumeConcurrentlyStatus handleMessage(MessageExt msg, ConsumeConcurrentlyContext context) { - countDownLatch.countDown(); - consumeCount.getAndIncrement(); - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - }); - - DefaultMQPushConsumerImpl pushConsumerImpl = pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl(); - rebalancePushImpl = spy(new RebalancePushImpl(pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl())); - Field field = DefaultMQPushConsumerImpl.class.getDeclaredField("rebalanceImpl"); - field.setAccessible(true); - field.set(pushConsumerImpl, rebalancePushImpl); - pushConsumer.subscribe(topic); - pushConsumer.start(); - - defiBusClientFactory = spy(pushConsumer.getDeFiBusClientInstance()); - field = DefaultMQPushConsumerImpl.class.getDeclaredField("mQClientFactory"); - field.setAccessible(true); - field.set(pushConsumerImpl, defiBusClientFactory); - - field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); - field.setAccessible(true); - field.set(defiBusClientFactory, deFiBusClientAPIImpl); - - pullAPIWrapper = spy(new PullAPIWrapper(defiBusClientFactory, consumerGroup, false)); - field = DefaultMQPushConsumerImpl.class.getDeclaredField("pullAPIWrapper"); - field.setAccessible(true); - field.set(pushConsumerImpl, pullAPIWrapper); - - pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl().getRebalanceImpl().setmQClientFactory(defiBusClientFactory); - defiBusClientFactory.registerConsumer(consumerGroup, pushConsumerImpl); - - when(defiBusClientFactory.getMQClientAPIImpl().pullMessage(anyString(), any(PullMessageRequestHeader.class), - anyLong(), any(CommunicationMode.class), nullable(PullCallback.class))) - .thenAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock mock) throws Throwable { - PullMessageRequestHeader requestHeader = mock.getArgument(1); - PullResult pullResult = createPullResult(requestHeader, PullStatus.FOUND, createMessageList(totalMsg)); - ((PullCallback) mock.getArgument(4)).onSuccess(pullResult); - return pullResult; - } - }) - .thenAnswer(new Answer() { - @Override public Object answer(InvocationOnMock invocation) throws Throwable { - PullMessageRequestHeader requestHeader = invocation.getArgument(1); - PullResult pullResult = createPullResult(requestHeader, PullStatus.NO_NEW_MSG, new ArrayList()); - ((PullCallback) invocation.getArgument(4)).onSuccess(pullResult); - return pullResult; - } - }); - - doReturn(new FindBrokerResult("127.0.0.1:10912", false)).when(defiBusClientFactory).findBrokerAddressInSubscribe(anyString(), anyLong(), anyBoolean()); - Set messageQueueSet = new HashSet(); - messageQueueSet.add(createPullRequest().getMessageQueue()); - pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl().updateTopicSubscribeInfo(topic, messageQueueSet); - } - - @Test - public void testPullMessage_ConsumeSuccess() throws Exception { - PullMessageService pullMessageService = defiBusClientFactory.getPullMessageService(); - pullMessageService.executePullRequestImmediately(createPullRequest()); - countDownLatch.await(5000, TimeUnit.MILLISECONDS); - - Thread.sleep(2000); - assertThat(consumeCount.get()).isEqualTo(totalMsg); - } - - @After - public void terminate() { - pushConsumer.shutdown(); - } - - private PullRequest createPullRequest() { - PullRequest pullRequest = new PullRequest(); - pullRequest.setConsumerGroup(consumerGroup); - pullRequest.setNextOffset(1024); - - MessageQueue messageQueue = new MessageQueue(); - messageQueue.setBrokerName(brokerName); - messageQueue.setQueueId(0); - messageQueue.setTopic(topic); - pullRequest.setMessageQueue(messageQueue); - ProcessQueue processQueue = new ProcessQueue(); - processQueue.setLocked(true); - processQueue.setLastLockTimestamp(System.currentTimeMillis()); - pullRequest.setProcessQueue(processQueue); - - return pullRequest; - } - - private PullResultExt createPullResult(PullMessageRequestHeader requestHeader, PullStatus pullStatus, - List messageExtList) throws Exception { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - for (MessageExt messageExt : messageExtList) { - outputStream.write(MessageDecoder.encode(messageExt, false)); - } - return new PullResultExt(pullStatus, requestHeader.getQueueOffset() + messageExtList.size(), 123, 2048, messageExtList, 0, outputStream.toByteArray()); - } - - private ArrayList createMessageList(int size) { - ArrayList list = new ArrayList<>(); - for (int i = 0; i < size; i++) { - MessageClientExt messageClientExt = new MessageClientExt(); - messageClientExt.setTopic(topic); - messageClientExt.setQueueId(0); - messageClientExt.setMsgId("123"); - messageClientExt.setBody(new byte[] {'a'}); - messageClientExt.setOffsetMsgId("234"); - messageClientExt.setBornHost(new InetSocketAddress(8080)); - messageClientExt.setStoreHost(new InetSocketAddress(8080)); - messageClientExt.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL, "3000"); - list.add(messageClientExt); - } - return list; - } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusMessageListenerConcurrentlyTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusMessageListenerConcurrentlyTest.java deleted file mode 100644 index b8dcf2a092..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusMessageListenerConcurrentlyTest.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.consumer; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.client.impl.DeFiBusClientAPIImpl; -import cn.webank.defibus.client.impl.factory.DeFiBusClientInstance; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.consumer.DeFiBusMessageListenerConcurrently; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import java.io.ByteArrayOutputStream; -import java.lang.reflect.Field; -import java.net.InetSocketAddress; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import org.apache.rocketmq.client.consumer.PullCallback; -import org.apache.rocketmq.client.consumer.PullResult; -import org.apache.rocketmq.client.consumer.PullStatus; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; -import org.apache.rocketmq.client.impl.CommunicationMode; -import org.apache.rocketmq.client.impl.FindBrokerResult; -import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; -import org.apache.rocketmq.client.impl.consumer.ProcessQueue; -import org.apache.rocketmq.client.impl.consumer.PullAPIWrapper; -import org.apache.rocketmq.client.impl.consumer.PullMessageService; -import org.apache.rocketmq.client.impl.consumer.PullRequest; -import org.apache.rocketmq.client.impl.consumer.PullResultExt; -import org.apache.rocketmq.client.impl.consumer.RebalancePushImpl; -import org.apache.rocketmq.client.impl.factory.MQClientInstance; -import org.apache.rocketmq.client.stat.ConsumerStatsManager; -import org.apache.rocketmq.common.message.MessageClientExt; -import org.apache.rocketmq.common.message.MessageDecoder; -import org.apache.rocketmq.common.message.MessageExt; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.common.protocol.header.PullMessageRequestHeader; -import org.apache.rocketmq.common.stats.StatsItem; -import org.apache.rocketmq.common.stats.StatsItemSet; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class DeFiBusMessageListenerConcurrentlyTest { - private String consumerGroup; - private String topic = "FooBar"; - private String brokerName = "BrokerA"; - private DeFiBusClientInstance defiBusClientFactory; - - @Mock - private DeFiBusClientAPIImpl deFiBusClientAPIImpl; - - private PullAPIWrapper pullAPIWrapper; - private RebalancePushImpl rebalancePushImpl; - private DeFiBusPushConsumer pushConsumer; - - private final CountDownLatch countDownLatch = new CountDownLatch(1); - private final MessageExt[] messageExts = new MessageExt[1]; - - @Before - public void init() throws Exception { - DeFiBusClientConfig clientConfig = new DeFiBusClientConfig(); - consumerGroup = "FooBarGroup" + System.currentTimeMillis(); - clientConfig.setConsumerGroup(consumerGroup); - pushConsumer = new DeFiBusPushConsumer(clientConfig); - pushConsumer.setNamesrvAddr("127.0.0.1:9876"); - pushConsumer.getDefaultMQPushConsumer().setPullInterval(60 * 1000); - - pushConsumer.registerMessageListener(new DeFiBusMessageListenerConcurrently() { - @Override - public ConsumeConcurrentlyStatus handleMessage(List msgs, ConsumeConcurrentlyContext context) { - messageExts[0] = msgs.get(0); - countDownLatch.countDown(); - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - }); - - DefaultMQPushConsumerImpl pushConsumerImpl = pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl(); - rebalancePushImpl = spy(new RebalancePushImpl(pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl())); - Field field = DefaultMQPushConsumerImpl.class.getDeclaredField("rebalanceImpl"); - field.setAccessible(true); - field.set(pushConsumerImpl, rebalancePushImpl); - pushConsumer.subscribe(topic); - pushConsumer.start(); - - defiBusClientFactory = spy(pushConsumer.getDeFiBusClientInstance()); - field = DefaultMQPushConsumerImpl.class.getDeclaredField("mQClientFactory"); - field.setAccessible(true); - field.set(pushConsumerImpl, defiBusClientFactory); - - field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); - field.setAccessible(true); - field.set(defiBusClientFactory, deFiBusClientAPIImpl); - - pullAPIWrapper = spy(new PullAPIWrapper(defiBusClientFactory, consumerGroup, false)); - field = DefaultMQPushConsumerImpl.class.getDeclaredField("pullAPIWrapper"); - field.setAccessible(true); - field.set(pushConsumerImpl, pullAPIWrapper); - - pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl().getRebalanceImpl().setmQClientFactory(defiBusClientFactory); - defiBusClientFactory.registerConsumer(consumerGroup, pushConsumerImpl); - - when(defiBusClientFactory.getMQClientAPIImpl().pullMessage(anyString(), any(PullMessageRequestHeader.class), - anyLong(), any(CommunicationMode.class), nullable(PullCallback.class))) - .thenAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock mock) throws Throwable { - PullMessageRequestHeader requestHeader = mock.getArgument(1); - MessageClientExt messageClientExt = new MessageClientExt(); - messageClientExt.setTopic(topic); - messageClientExt.setQueueId(0); - messageClientExt.setMsgId("123"); - messageClientExt.setBody(new byte[] {'a'}); - messageClientExt.setOffsetMsgId("234"); - messageClientExt.setBornHost(new InetSocketAddress(8080)); - messageClientExt.setStoreHost(new InetSocketAddress(8080)); - messageClientExt.putUserProperty(DeFiBusConstant.PROPERTY_MESSAGE_TTL, "3000"); - PullResult pullResult = createPullResult(requestHeader, PullStatus.FOUND, Collections.singletonList(messageClientExt)); - ((PullCallback) mock.getArgument(4)).onSuccess(pullResult); - return pullResult; - } - }); - - doReturn(new FindBrokerResult("127.0.0.1:10912", false)).when(defiBusClientFactory).findBrokerAddressInSubscribe(anyString(), anyLong(), anyBoolean()); - Set messageQueueSet = new HashSet(); - messageQueueSet.add(createPullRequest().getMessageQueue()); - pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl().updateTopicSubscribeInfo(topic, messageQueueSet); - } - - @Test - public void testPullMessage_ConsumeSuccess() throws Exception { - PullMessageService pullMessageService = defiBusClientFactory.getPullMessageService(); - pullMessageService.executePullRequestImmediately(createPullRequest()); - countDownLatch.await(); - - Thread.sleep(2000); - - ConsumerStatsManager mgr = pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl().getConsumerStatsManager(); - - Field statItmeSetField = mgr.getClass().getDeclaredField("topicAndGroupConsumeOKTPS"); - statItmeSetField.setAccessible(true); - - StatsItemSet itemSet = (StatsItemSet) statItmeSetField.get(mgr); - StatsItem item = itemSet.getAndCreateStatsItem(topic + "@" + pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl().groupName()); - - assertThat(item.getValue().get()).isGreaterThan(0L); - assertThat(messageExts[0].getTopic()).isEqualTo(topic); - assertThat(messageExts[0].getBody()).isEqualTo(new byte[] {'a'}); - } - - @After - public void terminate() { - pushConsumer.shutdown(); - } - - private PullRequest createPullRequest() { - PullRequest pullRequest = new PullRequest(); - pullRequest.setConsumerGroup(consumerGroup); - pullRequest.setNextOffset(1024); - - MessageQueue messageQueue = new MessageQueue(); - messageQueue.setBrokerName(brokerName); - messageQueue.setQueueId(0); - messageQueue.setTopic(topic); - pullRequest.setMessageQueue(messageQueue); - ProcessQueue processQueue = new ProcessQueue(); - processQueue.setLocked(true); - processQueue.setLastLockTimestamp(System.currentTimeMillis()); - pullRequest.setProcessQueue(processQueue); - - return pullRequest; - } - - private PullResultExt createPullResult(PullMessageRequestHeader requestHeader, PullStatus pullStatus, - List messageExtList) throws Exception { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - for (MessageExt messageExt : messageExtList) { - outputStream.write(MessageDecoder.encode(messageExt, false)); - } - return new PullResultExt(pullStatus, requestHeader.getQueueOffset() + messageExtList.size(), 123, 2048, messageExtList, 0, outputStream.toByteArray()); - } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusPushConsumerTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusPushConsumerTest.java deleted file mode 100644 index 38d5c93b44..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/consumer/DeFiBusPushConsumerTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.consumer; - -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import org.apache.rocketmq.client.exception.MQClientException; -import org.junit.Test; - -import static junit.framework.TestCase.assertFalse; -import static org.junit.Assert.assertTrue; - -public class DeFiBusPushConsumerTest { - private String topic = "FooBar"; - - @Test - public void test_unsubscribe() throws MQClientException { - DeFiBusPushConsumer pushConsumer = new DeFiBusPushConsumer(); - pushConsumer.subscribe(topic); - assertTrue(pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl().getRebalanceImpl().getSubscriptionInner().containsKey(topic)); - - pushConsumer.unsubscribe(topic); - assertFalse(pushConsumer.getDefaultMQPushConsumer().getDefaultMQPushConsumerImpl().getRebalanceImpl().getSubscriptionInner().containsKey(topic)); - } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/DeFiBusClientAPIImplTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/DeFiBusClientAPIImplTest.java deleted file mode 100644 index ae05cd018d..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/DeFiBusClientAPIImplTest.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import org.apache.rocketmq.client.ClientConfig; -import org.apache.rocketmq.client.exception.MQBrokerException; -import org.apache.rocketmq.client.hook.SendMessageContext; -import org.apache.rocketmq.client.impl.CommunicationMode; -import org.apache.rocketmq.client.impl.MQClientAPIImpl; -import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; -import org.apache.rocketmq.client.producer.DefaultMQProducer; -import org.apache.rocketmq.client.producer.SendCallback; -import org.apache.rocketmq.client.producer.SendResult; -import org.apache.rocketmq.client.producer.SendStatus; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageConst; -import org.apache.rocketmq.common.protocol.ResponseCode; -import org.apache.rocketmq.common.protocol.header.GetConsumerListByGroupResponseBody; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.apache.rocketmq.common.protocol.header.SendMessageResponseHeader; -import org.apache.rocketmq.remoting.InvokeCallback; -import org.apache.rocketmq.remoting.RemotingClient; -import org.apache.rocketmq.remoting.exception.RemotingException; -import org.apache.rocketmq.remoting.netty.NettyClientConfig; -import org.apache.rocketmq.remoting.netty.ResponseFuture; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doAnswer; - -@RunWith(MockitoJUnitRunner.class) -public class DeFiBusClientAPIImplTest { - private DeFiBusClientAPIImpl deFiBusClientAPI = new DeFiBusClientAPIImpl(new NettyClientConfig(), null, null, new ClientConfig()); - @Mock - private RemotingClient remotingClient; - @Mock - private DefaultMQProducerImpl defaultMQProducerImpl; - - private String brokerAddr = "127.0.0.1"; - private String brokerName = "DefaultBroker"; - private static String group = "FooBarGroup"; - private static String topic = "FooBar"; - private Message msg = new Message("FooBar", new byte[] {}); - - @Before - public void init() throws Exception { - Field field = MQClientAPIImpl.class.getDeclaredField("remotingClient"); - field.setAccessible(true); - field.set(deFiBusClientAPI, remotingClient); - } - - @Test - public void testSendMessageTypeOfReply_Success() throws Exception { - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock mock) throws Throwable { - InvokeCallback callback = mock.getArgument(3); - RemotingCommand request = mock.getArgument(1); - ResponseFuture responseFuture = new ResponseFuture(null, request.getOpaque(), 3 * 1000, null, null); - responseFuture.setResponseCommand(createSuccessResponse(request)); - callback.operationComplete(responseFuture); - return null; - } - }).when(remotingClient).invokeAsync(anyString(), any(RemotingCommand.class), anyLong(), any(InvokeCallback.class)); - SendMessageContext sendMessageContext = new SendMessageContext(); - sendMessageContext.setProducer(new DefaultMQProducerImpl(new DefaultMQProducer())); - msg.getProperties().put("msgType", "reply"); - deFiBusClientAPI.sendMessage(brokerAddr, brokerName, msg, new SendMessageRequestHeader(), 3 * 1000, CommunicationMode.ASYNC, - new SendCallback() { - @Override - public void onSuccess(SendResult sendResult) { - assertThat(sendResult.getSendStatus()).isEqualTo(SendStatus.SEND_OK); - assertThat(sendResult.getOffsetMsgId()).isEqualTo("123"); - assertThat(sendResult.getQueueOffset()).isEqualTo(123L); - assertThat(sendResult.getMessageQueue().getQueueId()).isEqualTo(1); - } - - @Override - public void onException(Throwable e) { - } - }, null, null, 0, sendMessageContext, defaultMQProducerImpl); - } - - @Test - public void testSendMessagetypeOfnull_Success() throws RemotingException, InterruptedException, MQBrokerException { - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock mock) throws Throwable { - InvokeCallback callback = mock.getArgument(3); - RemotingCommand request = mock.getArgument(1); - ResponseFuture responseFuture = new ResponseFuture(null, request.getOpaque(), 3 * 1000, null, null); - responseFuture.setResponseCommand(createSuccessResponse(request)); - callback.operationComplete(responseFuture); - return null; - } - }).when(remotingClient).invokeAsync(anyString(), any(RemotingCommand.class), anyLong(), any(InvokeCallback.class)); - SendMessageContext sendMessageContext = new SendMessageContext(); - sendMessageContext.setProducer(new DefaultMQProducerImpl(new DefaultMQProducer())); - deFiBusClientAPI.sendMessage(brokerAddr, brokerName, msg, new SendMessageRequestHeader(), 3 * 1000, CommunicationMode.ASYNC, - new SendCallback() { - @Override - public void onSuccess(SendResult sendResult) { - assertThat(sendResult.getSendStatus()).isEqualTo(SendStatus.SEND_OK); - assertThat(sendResult.getOffsetMsgId()).isEqualTo("123"); - assertThat(sendResult.getQueueOffset()).isEqualTo(123L); - assertThat(sendResult.getMessageQueue().getQueueId()).isEqualTo(1); - } - - @Override - public void onException(Throwable e) { - } - }, - null, null, 0, sendMessageContext, defaultMQProducerImpl); - } - - @Test - public void testGetConsumerIdListByGroupAndTopic_Success() throws Exception { - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock mock) throws Throwable { - RemotingCommand request = mock.getArgument(1); - GetConsumerListByGroupResponseBody body = new GetConsumerListByGroupResponseBody(); - List cidList = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - cidList.add(i + ""); - } - body.setConsumerIdList(cidList); - request.setBody(body.encode()); - request.setCode(ResponseCode.SUCCESS); - request.setOpaque(request.getOpaque()); - return request; - } - }).when(remotingClient).invokeSync(anyString(), any(RemotingCommand.class), anyLong()); - List list = deFiBusClientAPI.getConsumerIdListByGroupAndTopic(brokerAddr, group, topic, 3 * 1000); - assertThat(list.size()).isEqualTo(10); - } - - @Test(expected = MQBrokerException.class) - public void testGetConsumerIdListByGroupAndTopic_OnException() throws Exception { - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock mock) throws Throwable { - RemotingCommand request = mock.getArgument(1); - request.setCode(ResponseCode.SYSTEM_ERROR); - return request; - } - }).when(remotingClient).invokeSync(anyString(), any(RemotingCommand.class), anyLong()); - deFiBusClientAPI.getConsumerIdListByGroupAndTopic(brokerAddr, group, topic, 3 * 1000); - } - - private RemotingCommand createSuccessResponse(RemotingCommand request) { - RemotingCommand response = RemotingCommand.createResponseCommand(SendMessageResponseHeader.class); - response.setCode(ResponseCode.SUCCESS); - response.setOpaque(request.getOpaque()); - - SendMessageResponseHeader responseHeader = (SendMessageResponseHeader) response.readCustomHeader(); - responseHeader.setMsgId("123"); - responseHeader.setQueueId(1); - responseHeader.setQueueOffset(123L); - - response.addExtField(MessageConst.PROPERTY_MSG_REGION, "RegionHZ"); - response.addExtField(MessageConst.PROPERTY_TRACE_SWITCH, "true"); - response.addExtField("queueId", String.valueOf(responseHeader.getQueueId())); - response.addExtField("msgId", responseHeader.getMsgId()); - response.addExtField("queueOffset", String.valueOf(responseHeader.getQueueOffset())); - return response; - } - -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/DeFiBusClientManagerTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/DeFiBusClientManagerTest.java deleted file mode 100644 index 62c2b38d11..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/DeFiBusClientManagerTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DeFiBusClientManagerTest { -// @Test -// public void test_createInstanceOnlyOnce() { -// ClientConfig clientConfig = new ClientConfig(); -// RPCHook rpcHook = new RPCHook() { -// @Override public void doBeforeRequest(String remoteAddr, RemotingCommand request) { -// -// } -// -// @Override -// public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { -// -// } -// }; -// -// DeFiBusClientInstance instance1 = DeFiBusClientManager.getInstance().getAndCreateDeFiBusClientInstance(clientConfig, rpcHook); -// DeFiBusClientInstance instance2 = DeFiBusClientManager.getInstance().getAndCreateDeFiBusClientInstance(clientConfig, rpcHook); -// -// assertThat(instance1).isEqualTo(instance2); -// -// } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/consumer/DeFiBusPullMessageServiceTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/consumer/DeFiBusPullMessageServiceTest.java deleted file mode 100644 index 25dd18fa45..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/consumer/DeFiBusPullMessageServiceTest.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.consumer; - -public class DeFiBusPullMessageServiceTest { -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstanceTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstanceTest.java deleted file mode 100644 index 615766bb0b..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstanceTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.factory; - -import static org.assertj.core.api.Assertions.assertThat; - -//@RunWith(MockitoJUnitRunner.class) -public class DeFiBusClientInstanceTest { -// private DeFiBusClientInstance deFiBusClientInstance = DeFiBusClientManager.getInstance().getAndCreateDeFiBusClientInstance(new ClientConfig(), DeFiBusClientHookFactory.createRPCHook(null)); -// private String topic = "FooBar"; -// private String group = "FooBarGroup"; -// -// @Mock -// private DeFiBusClientAPIImpl deFiBusClientAPI; -// -// @Test -// public void testFindConsumerIdList() throws InterruptedException, MQBrokerException, RemotingTimeoutException, RemotingSendRequestException, RemotingConnectException { -// List cidList = new ArrayList<>(); -// cidList.add("client-1"); -// cidList.add("client-2"); -// cidList.add("client-3"); -// -// ReflectUtil.setSimpleProperty(MQClientInstance.class, deFiBusClientInstance, "mQClientAPIImpl", deFiBusClientAPI); -// ReflectUtil.setSimpleProperty(DeFiBusClientInstance.class, deFiBusClientInstance, "deFiClientAPI", deFiBusClientAPI); -// -// deFiBusClientInstance.getTopicRouteTable().put(topic, createRouteData()); -// -// when(deFiBusClientAPI.getConsumerIdListByGroupAndTopic(anyString(), anyString(), anyString(), anyLong())).thenReturn(cidList); -// assertThat(cidList).isEqualTo(deFiBusClientInstance.findConsumerIdList(topic, group)); -// } -// -// @Test -// public void testFindConsumerIdList_retry() throws InterruptedException, MQBrokerException, RemotingTimeoutException, RemotingSendRequestException, RemotingConnectException { -// List cidList = new ArrayList<>(); -// cidList.add("client-1"); -// cidList.add("client-2"); -// cidList.add("client-3"); -// -// ReflectUtil.setSimpleProperty(MQClientInstance.class, deFiBusClientInstance, "mQClientAPIImpl", deFiBusClientAPI); -// ReflectUtil.setSimpleProperty(DeFiBusClientInstance.class, deFiBusClientInstance, "deFiClientAPI", deFiBusClientAPI); -// -// deFiBusClientInstance.getTopicRouteTable().put(topic, createRouteData()); -// when(deFiBusClientAPI.getConsumerIdListByGroupAndTopic(anyString(), anyString(), anyString(), anyLong())).thenReturn(null).thenReturn(cidList); -// assertThat(cidList).isEqualTo(deFiBusClientInstance.findConsumerIdList(topic, group)); -// } -// -// public static TopicRouteData createRouteData() { -// TopicRouteData topicRouteData = new TopicRouteData(); -// List brokerDataList = new ArrayList<>(); -// -// BrokerData brokerDataA = new BrokerData(); -// brokerDataA.setBrokerName("Broker-A"); -// brokerDataA.setCluster("Cluster-A"); -// HashMap addr = new HashMap<>(); -// addr.put(0L, "127.0.0.1:10911"); -// brokerDataA.setBrokerAddrs(addr); -// brokerDataList.add(brokerDataA); -// -// BrokerData brokerDataB = new BrokerData(); -// brokerDataB.setBrokerName("Broker-B"); -// brokerDataB.setCluster("Cluster-B"); -// HashMap addrB = new HashMap<>(); -// addrB.put(0L, "127.0.0.2:10911"); -// brokerDataB.setBrokerAddrs(addrB); -// brokerDataList.add(brokerDataB); -// -// topicRouteData.setBrokerDatas(brokerDataList); -// -// QueueData queueData = new QueueData(); -// queueData.setBrokerName("Broker-A"); -// queueData.setReadQueueNums(3); -// queueData.setWriteQueueNums(3); -// queueData.setPerm(6); -// -// QueueData queueDataB = new QueueData(); -// queueDataB.setBrokerName("Broker-B"); -// queueDataB.setReadQueueNums(3); -// queueDataB.setWriteQueueNums(3); -// queueDataB.setPerm(6); -// -// List queueDataList = new ArrayList<>(); -// queueDataList.add(queueData); -// queueDataList.add(queueDataB); -// topicRouteData.setQueueDatas(queueDataList); -// -// return topicRouteData; -// } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/hook/DeFiBusClientHookFactoryTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/hook/DeFiBusClientHookFactoryTest.java deleted file mode 100644 index adbdd6935b..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/hook/DeFiBusClientHookFactoryTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.hook; - -import java.util.concurrent.atomic.AtomicInteger; -import org.apache.rocketmq.remoting.RPCHook; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DeFiBusClientHookFactoryTest { - @Test - public void test() { - DeFiBusClientHookFactory.createRPCHook(null); - } - - @Test - public void test_doBefore_doAfter() { - AtomicInteger invokeTimes = new AtomicInteger(0); - RPCHook rpcHook = new RPCHook() { - @Override public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - invokeTimes.getAndIncrement(); - } - - @Override - public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { - invokeTimes.getAndIncrement(); - } - }; - DeFiBusClientHookFactory.createRPCHook(rpcHook); - rpcHook.doBeforeRequest("", null); - assertThat(invokeTimes.get()).isEqualTo(1); - rpcHook.doAfterResponse("", null, null); - assertThat(invokeTimes.get()).isEqualTo(2); - } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/producer/MessageQueueHealthManagerTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/producer/MessageQueueHealthManagerTest.java deleted file mode 100644 index 0131eecfd6..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/producer/MessageQueueHealthManagerTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.producer; - -import org.apache.rocketmq.common.message.MessageQueue; -import org.junit.Test; -import org.mockito.Spy; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class MessageQueueHealthManagerTest { - private long isoTime = 3 * 1000L; - @Spy - private MessageQueueHealthManager messageQueueHealthManager = new MessageQueueHealthManager(isoTime); - - @Test - public void testMarkQueueFault() throws Exception { - MessageQueue mq = new MessageQueue("topic1", "brokerName1", 0); - messageQueueHealthManager.markQueueFault(mq); - assertTrue(messageQueueHealthManager.isQueueFault(mq)); - Thread.sleep(isoTime + 10); - assertFalse(messageQueueHealthManager.isQueueFault(mq)); - } - - @Test - public void testMarkQueueHealthy() throws Exception { - MessageQueue mq = new MessageQueue("topic1", "brokerName1", 0); - messageQueueHealthManager.markQueueFault(mq); - assertTrue(messageQueueHealthManager.isQueueFault(mq)); - messageQueueHealthManager.markQueueHealthy(mq); - assertTrue(messageQueueHealthManager.isQueueHealthy(mq)); - } - -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/producer/RRResponseFutureTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/producer/RRResponseFutureTest.java deleted file mode 100644 index c28e6dcbe3..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/producer/RRResponseFutureTest.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.producer; - -import org.apache.rocketmq.common.message.Message; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class RRResponseFutureTest { - @Test - public void test() { - RRResponseFuture responseFuture = new RRResponseFuture(); - ResponseTable.getRrResponseFurtureConcurrentHashMap().put("key1", responseFuture); - - RRResponseFuture responseFuture2 = new RRResponseFuture(new RRCallback() { - @Override public void onSuccess(Message msg) { - - } - - @Override public void onException(Throwable e) { - - } - }); - ResponseTable.getRrResponseFurtureConcurrentHashMap().put("key2", responseFuture2); - - RRResponseFuture responseFuture3 = new RRResponseFuture(new RRCallback() { - @Override public void onSuccess(Message msg) { - - } - - @Override public void onException(Throwable e) { - - } - }, 3000); - ResponseTable.getRrResponseFurtureConcurrentHashMap().put("key3", responseFuture3); - } - - @Test - public void test_watiSuccess() throws InterruptedException { - RRResponseFuture responseFuture = new RRResponseFuture(new RRCallback() { - @Override public void onSuccess(Message msg) { - - } - - @Override public void onException(Throwable e) { - - } - }, 3000); - Message rspMsg = new Message(); - rspMsg.setTopic("FooBar"); - Thread thread = new Thread(new Runnable() { - @Override public void run() { - try { - Thread.sleep(1000); - responseFuture.putResponse(rspMsg); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }); - thread.setDaemon(true); - thread.start(); - - Message rsp = responseFuture.waitResponse(3000); - assertThat(rsp).isNotNull(); - assertThat(rsp).isEqualTo(rspMsg); - } - - @Test - public void test_watiTimeout() throws InterruptedException { - RRResponseFuture responseFuture = new RRResponseFuture(new RRCallback() { - @Override public void onSuccess(Message msg) { - } - - @Override public void onException(Throwable e) { - } - }, 1000); - - Message rsp = responseFuture.waitResponse(1000); - assertThat(rsp).isNull(); - } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/rebalance/AllocateMessageQueueByIDCTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/rebalance/AllocateMessageQueueByIDCTest.java deleted file mode 100644 index 6c52c2966c..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/impl/rebalance/AllocateMessageQueueByIDCTest.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.impl.rebalance; - -import cn.webank.defibus.common.DeFiBusConstant; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.rocketmq.client.impl.factory.MQClientInstance; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.common.protocol.route.BrokerData; -import org.apache.rocketmq.common.protocol.route.QueueData; -import org.apache.rocketmq.common.protocol.route.TopicRouteData; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class AllocateMessageQueueByIDCTest { - private String topic = "FooBar"; - private String currentCid = "client#0#A"; - private AllocateMessageQueueByIDC allocateMessageQueueByIDC = new AllocateMessageQueueByIDC(); - - @Mock - private MQClientInstance mqClientInstance; - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Test - public void test_CurrentCIDisNull() { - thrown.expect(IllegalArgumentException.class); - thrown.expectMessage("currentCID is empty"); - allocateMessageQueueByIDC.allocate("group", null, null, null); - } - - @Test - public void test_mqAllIsNull() { - List result = allocateMessageQueueByIDC.allocate("group", "currentCid", null, new ArrayList<>()); - assertThat(result).isEmpty(); - } - - @Test - public void test_cidAllIsNull() { - List mqAll = new ArrayList<>(); - MessageQueue mq = new MessageQueue(); - mqAll.add(mq); - List result = allocateMessageQueueByIDC.allocate("group", "currentCid", mqAll, null); - assertThat(result).isEmpty(); - } - - @Test - public void test_allocateSuccess() { - List cidAll = prepareCidList("A", 4); - cidAll.addAll(prepareCidList("B", 5)); - cidAll.add(currentCid); - List mqAll = prepareMqList(topic, "A", 4); - mqAll.addAll(prepareMqList(topic, "B", 5)); - - ConcurrentHashMap topicRouteTable = new ConcurrentHashMap<>(); - TopicRouteData topicRouteData = prepareRouteData(); - topicRouteData.getBrokerDatas().addAll(prepareBrokerData("A", 5)); - topicRouteData.getBrokerDatas().addAll(prepareBrokerData("B", 5)); - topicRouteTable.put(topic, topicRouteData); - allocateMessageQueueByIDC.setMqClientInstance(mqClientInstance); - when(mqClientInstance.getTopicRouteTable()).thenReturn(new ConcurrentHashMap<>()).thenReturn(topicRouteTable); - when(mqClientInstance.updateTopicRouteInfoFromNameServer(anyString())).thenReturn(true); - - List result = allocateMessageQueueByIDC.allocate("group", currentCid, mqAll, cidAll); - - assertThat(result.size()).isEqualTo(1); - assertThat(result.get(0)).isEqualTo(mqAll.get(0)); - } - - @Test - public void test_allocateWithUnknownIdc() { - List cidAll = prepareCidList("A", 4); - cidAll.addAll(prepareCidList("B", 5)); - cidAll.add(currentCid); - List mqAll = prepareMqList(topic, "A", 4); - mqAll.addAll(prepareMqList(topic, "B", 5)); - List mqInC = prepareMqList(topic, "C", 5); - mqAll.addAll(mqInC); - - ConcurrentHashMap topicRouteTable = new ConcurrentHashMap<>(); - TopicRouteData topicRouteData = prepareRouteData(); - topicRouteData.getBrokerDatas().addAll(prepareBrokerData("A", 5)); - topicRouteData.getBrokerDatas().addAll(prepareBrokerData("B", 5)); - topicRouteTable.put(topic, topicRouteData); - allocateMessageQueueByIDC.setMqClientInstance(mqClientInstance); - when(mqClientInstance.getTopicRouteTable()).thenReturn(new ConcurrentHashMap<>()).thenReturn(topicRouteTable); - when(mqClientInstance.updateTopicRouteInfoFromNameServer(anyString())).thenReturn(true); - - List result = allocateMessageQueueByIDC.allocate("group", currentCid, mqAll, cidAll); - - assertThat(result.size()).isEqualTo(6); - assertThat(result.get(0)).isEqualTo(mqAll.get(0)); - assertThat(result.containsAll(mqInC)).isTrue(); - } - - @Test - public void test_allocateOtherIdc() { - List cidAll = prepareCidList("A", 4); - cidAll.add(currentCid); - List mqAll = prepareMqList(topic, "A", 4); - List mqInB = prepareMqList(topic, "B", 5); - mqAll.addAll(mqInB); - - ConcurrentHashMap topicRouteTable = new ConcurrentHashMap<>(); - TopicRouteData topicRouteData = prepareRouteData(); - topicRouteData.getBrokerDatas().addAll(prepareBrokerData("A", 5)); - topicRouteData.getBrokerDatas().addAll(prepareBrokerData("B", 5)); - topicRouteTable.put(topic, topicRouteData); - allocateMessageQueueByIDC.setMqClientInstance(mqClientInstance); - when(mqClientInstance.getTopicRouteTable()).thenReturn(new ConcurrentHashMap<>()).thenReturn(topicRouteTable); - when(mqClientInstance.updateTopicRouteInfoFromNameServer(anyString())).thenReturn(true); - - List result = allocateMessageQueueByIDC.allocate("group", currentCid, mqAll, cidAll); - - assertThat(result.size()).isEqualTo(2); - assertThat(result.get(0)).isEqualTo(mqAll.get(0)); - assertThat(result.get(1)).isEqualTo(mqInB.get(0)); - } - - @Test - public void test_allocate_notContainCurrentCID() { - List cidAll = prepareCidList("A", 4); - cidAll.addAll(prepareCidList("B", 5)); - List mqAll = prepareMqList(topic, "A", 4); - mqAll.addAll(prepareMqList(topic, "B", 5)); - - ConcurrentHashMap topicRouteTable = new ConcurrentHashMap<>(); - TopicRouteData topicRouteData = prepareRouteData(); - topicRouteData.getBrokerDatas().addAll(prepareBrokerData("A", 5)); - topicRouteData.getBrokerDatas().addAll(prepareBrokerData("B", 5)); - topicRouteTable.put(topic, topicRouteData); - allocateMessageQueueByIDC.setMqClientInstance(mqClientInstance); - List result = allocateMessageQueueByIDC.allocate("group", currentCid, mqAll, cidAll); - - assertThat(result).isNotNull(); - assertThat(result.size()).isEqualTo(0); - } - - public List prepareCidList(String idc, int size) { - List cids = new ArrayList<>(); - for (int i = 1; i <= size; i++) { - cids.add("client" + DeFiBusConstant.INSTANCE_NAME_SEPERATER + i + DeFiBusConstant.INSTANCE_NAME_SEPERATER + idc); - } - return cids; - } - - public List prepareMqList(String topic, String idc, int size) { - List mqs = new ArrayList<>(); - for (int i = 0; i < size; i++) { - MessageQueue mq = new MessageQueue(); - mq.setTopic(topic); - mq.setBrokerName(idc + "-Broker-" + i); - mq.setQueueId(i); - mqs.add(mq); - } - return mqs; - } - - public TopicRouteData prepareRouteData() { - TopicRouteData topicRouteData = new TopicRouteData(); - List brokerDataList = new ArrayList<>(); - topicRouteData.setBrokerDatas(brokerDataList); - List queueDataList = new ArrayList<>(); - topicRouteData.setQueueDatas(queueDataList); - return topicRouteData; - } - - public List prepareBrokerData(String idc, int size) { - List brokerDataList = new ArrayList<>(); - for (int i = 0; i < size; i++) { - BrokerData brokerData = new BrokerData(); - brokerData.setBrokerName(idc + "-Broker-" + i); - brokerData.setCluster(idc + DeFiBusConstant.IDC_SEPERATER + "Cluster"); - HashMap addr = new HashMap<>(); - addr.put(0L, "127.0.0.1:10911"); - brokerData.setBrokerAddrs(addr); - brokerDataList.add(brokerData); - } - return brokerDataList; - } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/ClientFuseTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/ClientFuseTest.java deleted file mode 100644 index ae1cfabcfe..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/ClientFuseTest.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.producer; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.client.impl.producer.DeFiBusProducerImpl; -import cn.webank.defibus.client.impl.producer.HealthyMessageQueueSelector; -import cn.webank.defibus.client.impl.producer.MessageQueueHealthManager; -import cn.webank.defibus.common.protocol.DeFiBusResponseCode; -import cn.webank.defibus.producer.DeFiBusProducer; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import org.apache.rocketmq.client.ClientConfig; -import org.apache.rocketmq.client.exception.MQBrokerException; -import org.apache.rocketmq.client.hook.SendMessageContext; -import org.apache.rocketmq.client.impl.CommunicationMode; -import org.apache.rocketmq.client.impl.MQClientAPIImpl; -import org.apache.rocketmq.client.impl.MQClientManager; -import org.apache.rocketmq.client.impl.factory.MQClientInstance; -import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; -import org.apache.rocketmq.client.impl.producer.TopicPublishInfo; -import org.apache.rocketmq.client.producer.SendCallback; -import org.apache.rocketmq.client.producer.SendResult; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; -import org.apache.rocketmq.common.protocol.route.BrokerData; -import org.apache.rocketmq.common.protocol.route.QueueData; -import org.apache.rocketmq.common.protocol.route.TopicRouteData; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class ClientFuseTest { - private static DeFiBusProducer deFiBusProducer; - private Message msg; - private String topic = "test"; - private String producerGroup = "fuseTest"; - - @Mock - private MQClientAPIImpl mqClientAPIImpl; - @Spy - private MQClientInstance mQClientFactory = MQClientManager.getInstance().getAndCreateMQClientInstance(new ClientConfig()); - - @Before - public void init() throws Exception { - DeFiBusClientConfig clientConfig = new DeFiBusClientConfig(); - clientConfig.setClusterPrefix("GL"); - clientConfig.setProducerGroup(producerGroup); - clientConfig.setNamesrvAddr("127.0.0.1:9876"); - deFiBusProducer = new DeFiBusProducer(clientConfig); - deFiBusProducer.start(); - - msg = new Message(topic, new byte[] {'a'}); - Field field = DefaultMQProducerImpl.class.getDeclaredField("mQClientFactory"); - field.setAccessible(true); - field.set(deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl(), mQClientFactory); - - field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); - field.setAccessible(true); - field.set(mQClientFactory, mqClientAPIImpl); - - deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl().getmQClientFactory(). - registerProducer(producerGroup, deFiBusProducer.getDefaultMQProducer().getDefaultMQProducerImpl()); - - Exception e = new MQBrokerException(DeFiBusResponseCode.CONSUME_DIFF_SPAN_TOO_LONG, "CODE: " + DeFiBusResponseCode.CONSUME_DIFF_SPAN_TOO_LONG + " DESC: consume span too long, maybe has slow consumer, so send rejected\nFor more information, please visit the url, http://rocketmq.apache.org/docs/faq/"); - when(mqClientAPIImpl.sendMessage(anyString(), anyString(), any(Message.class), any(SendMessageRequestHeader.class), anyLong(), any(CommunicationMode.class), - any(SendCallback.class), nullable(TopicPublishInfo.class), any(MQClientInstance.class), anyInt(), nullable(SendMessageContext.class), any(DefaultMQProducerImpl.class))) - .thenAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - Object[] args = invocation.getArguments(); - SendCallback callback = (SendCallback) args[6]; - callback.onException(e); - return new SendResult(); - } - }); - } - - @After - public void shutdown() { - if (deFiBusProducer != null) { - deFiBusProducer.shutdown(); - } - } - - @Test - public void testProcessResponseFuse() throws Exception { - when(mqClientAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); - CountDownLatch countDownLatch = new CountDownLatch(1); - Field fieldSelector = DeFiBusProducerImpl.class.getDeclaredField("messageQueueSelector"); - fieldSelector.setAccessible(true); - Field fieldProducer = DeFiBusProducer.class.getDeclaredField("deFiBusProducerImpl"); - fieldProducer.setAccessible(true); - MessageQueueHealthManager messageQueueHealthManager = ((HealthyMessageQueueSelector) fieldSelector.get(fieldProducer.get(deFiBusProducer))).getMessageQueueHealthManager(); - - Assert.assertEquals(0, messageQueueHealthManager.faultMap.size()); - - deFiBusProducer.publish(msg, new SendCallback() { - @Override - public void onSuccess(SendResult sendResult) { - } - - @Override - public void onException(Throwable e) { - Assert.fail(e.getMessage()); - countDownLatch.countDown(); - } - }); - countDownLatch.await(3000L, TimeUnit.MILLISECONDS); - - Assert.assertEquals(3, messageQueueHealthManager.faultMap.size()); - } - - public static TopicRouteData createTopicRoute() { - TopicRouteData topicRouteData = new TopicRouteData(); - - topicRouteData.setFilterServerTable(new HashMap>()); - List brokerDataList = new ArrayList(); - BrokerData brokerData = new BrokerData(); - brokerData.setBrokerName("BrokerA"); - brokerData.setCluster("DefaultCluster"); - HashMap brokerAddrs = new HashMap(); - brokerAddrs.put(0L, "127.0.0.1:10911"); - brokerData.setBrokerAddrs(brokerAddrs); - brokerDataList.add(brokerData); - topicRouteData.setBrokerDatas(brokerDataList); - - List queueDataList = new ArrayList(); - QueueData queueData = new QueueData(); - queueData.setBrokerName("BrokerA"); - queueData.setPerm(6); - queueData.setReadQueueNums(3); - queueData.setWriteQueueNums(4); - queueData.setTopicSynFlag(0); - queueDataList.add(queueData); - topicRouteData.setQueueDatas(queueDataList); - return topicRouteData; - } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/DeFiBusProducerTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/DeFiBusProducerTest.java deleted file mode 100644 index cea5ad5377..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/DeFiBusProducerTest.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.producer; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; - -//@RunWith(MockitoJUnitRunner.class) -public class DeFiBusProducerTest { -// @Spy -// private DeFiBusClientInstance deFiBusClientInstance = DeFiBusClientManager.getInstance().getAndCreateDeFiBusClientInstance(new ClientConfig(), null); -// @Mock -// private DeFiBusClientAPIImpl mqClientAPI; -// -// private DeFiBusProducer producer; -// private Message message; -// private Message zeroMsg; -// private Message bigMessage; -// private String topic = "FooBar"; -// private String producerGroupPrefix = "FooBar_PID"; -// private String clusterName = "DefaultCluster"; -// -// @Before -// public void init() throws Exception { -// String producerGroupTemp = producerGroupPrefix + System.currentTimeMillis(); -// DeFiBusClientConfig clientConfig = new DeFiBusClientConfig(); -// clientConfig.setProducerGroup(producerGroupTemp); -// producer = new DeFiBusProducer(clientConfig); -// producer.setNamesrvAddr("127.0.0.1:9876"); -// producer.getDefaultMQProducer().setCompressMsgBodyOverHowmuch(16); -// message = new Message(topic, new byte[] {'a'}); -// message.getUserProperty(""); -// zeroMsg = new Message(topic, new byte[] {}); -// zeroMsg.getUserProperty(""); -// bigMessage = new Message(topic, "This is a very huge message!".getBytes()); -// bigMessage.getUserProperty(""); -// -// producer.start(); -// -// Field field = DefaultMQProducerImpl.class.getDeclaredField("mQClientFactory"); -// field.setAccessible(true); -// field.set(producer.getDefaultMQProducer().getDefaultMQProducerImpl(), deFiBusClientInstance); -// -// field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); -// field.setAccessible(true); -// field.set(deFiBusClientInstance, mqClientAPI); -// -// producer.getDefaultMQProducer().getDefaultMQProducerImpl().getmQClientFactory() -// .registerProducer(producerGroupTemp, producer.getDefaultMQProducer().getDefaultMQProducerImpl()); -// -// when(mqClientAPI.sendMessage(anyString(), anyString(), any(Message.class), any(SendMessageRequestHeader.class), anyLong(), any(CommunicationMode.class), -// nullable(SendCallback.class), nullable(TopicPublishInfo.class), nullable(MQClientInstance.class), anyInt(), nullable(SendMessageContext.class), any(DefaultMQProducerImpl.class))) -// .thenAnswer(new Answer() { -// @Override public Object answer(InvocationOnMock invocation) throws Throwable { -// String brokerName = invocation.getArgument(1); -// CommunicationMode communicationMode = invocation.getArgument(5); -// SendCallback callback = invocation.getArgument(6); -// SendResult sendResult = createSendResult(SendStatus.SEND_OK, brokerName); -// switch (communicationMode) { -// case SYNC: -// return sendResult; -// case ASYNC: -// case ONEWAY: -// if (callback != null) { -// callback.onSuccess(sendResult); -// } -// } -// return null; -// } -// }); -// } -// -// @After -// public void terminate() { -// producer.shutdown(); -// } -// -// @Test -// public void testSendMessage_ZeroMessage() throws InterruptedException, RemotingException, MQBrokerException { -// try { -// producer.publish(zeroMsg); -// } catch (MQClientException e) { -// assertThat(e).hasMessageContaining("message body length is zero"); -// } -// } -// -// @Test -// public void testSendMessage_NoNameSrv() throws RemotingException, InterruptedException { -// try { -// producer.publish(message); -// } catch (MQClientException e) { -// assertThat(e).hasMessageContaining("No name server address"); -// } -// } -// -// @Test -// public void testSendMessage_NoRoute() throws RemotingException, InterruptedException { -// try { -// producer.publish(message); -// } catch (MQClientException e) { -// assertThat(e).hasMessageContaining("No route info of this topic"); -// } -// } -// -// @Test -// public void testSendMessageAsync_Success() throws RemotingException, InterruptedException, MQBrokerException, MQClientException { -// final CountDownLatch countDownLatch = new CountDownLatch(1); -// final AtomicInteger success = new AtomicInteger(0); -// when(mqClientAPI.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); -// producer.publish(message, new SendCallback() { -// @Override -// public void onSuccess(SendResult sendResult) { -// assertThat(sendResult.getSendStatus()).isEqualTo(SendStatus.SEND_OK); -// assertThat(sendResult.getOffsetMsgId()).isEqualTo("123"); -// assertThat(sendResult.getQueueOffset()).isEqualTo(456L); -// success.getAndIncrement(); -// countDownLatch.countDown(); -// } -// -// @Override -// public void onException(Throwable e) { -// countDownLatch.countDown(); -// } -// }); -// long timeout = producer.getDefaultMQProducer().getSendMsgTimeout(); -// countDownLatch.await(timeout, TimeUnit.MILLISECONDS); -// assertThat(success.get()).isEqualTo(1); -// } -// -// @Test -// public void testSendMessageAsync_Exception() throws RemotingException, MQClientException, InterruptedException, MQBrokerException { -// final CountDownLatch countDownLatch = new CountDownLatch(1); -// final AtomicBoolean success = new AtomicBoolean(true); -// when(mqClientAPI.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); -// when(mqClientAPI.sendMessage(anyString(), anyString(), any(Message.class), any(SendMessageRequestHeader.class), anyLong(), any(CommunicationMode.class), -// nullable(SendCallback.class), nullable(TopicPublishInfo.class), nullable(MQClientInstance.class), anyInt(), nullable(SendMessageContext.class), any(DefaultMQProducerImpl.class))) -// .thenAnswer(new Answer() { -// @Override public Object answer(InvocationOnMock invocation) throws Throwable { -// SendCallback callback = invocation.getArgument(6); -// if (callback != null) { -// callback.onException(new Exception("test send exception")); -// } -// return null; -// } -// }); -// producer.publish(message, new SendCallback() { -// @Override -// public void onSuccess(SendResult sendResult) { -// success.set(true); -// countDownLatch.countDown(); -// } -// -// @Override -// public void onException(Throwable e) { -// success.set(false); -// countDownLatch.countDown(); -// assertThat(e).hasMessage("test send exception"); -// } -// }); -// long timeout = producer.getDefaultMQProducer().getSendMsgTimeout(); -// countDownLatch.await(timeout, TimeUnit.MILLISECONDS); -// assertThat(success.get()).isEqualTo(false); -// } -// -// @Test -// public void testRequest_Timeout() throws RemotingException, MQClientException, InterruptedException, MQBrokerException { -// when(mqClientAPI.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); -// when(deFiBusClientInstance.getTopicRouteTable()).thenReturn(new ConcurrentHashMap()); -// Message replyMsg = producer.request(createRequestMessage(topic, clusterName), 3000); -// assertThat(replyMsg).isNull(); -// } -// -// @Test -// public void testRequest_Success() throws RemotingException, MQClientException, InterruptedException, MQBrokerException { -// when(mqClientAPI.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); -// when(deFiBusClientInstance.getTopicRouteTable()).thenReturn(new ConcurrentHashMap()); -// final AtomicBoolean finish = new AtomicBoolean(false); -// new Thread(new Runnable() { -// @Override public void run() { -// ConcurrentHashMap responseMap = ResponseTable.getRrResponseFurtureConcurrentHashMap(); -// assertThat(responseMap).isNotNull(); -// while (!finish.get()) { -// try { -// Thread.sleep(10); -// } catch (InterruptedException e) { -// } -// for (Map.Entry entry : responseMap.entrySet()) { -// RRResponseFuture future = entry.getValue(); -// future.putResponse(createRequestMessage(topic, clusterName)); -// } -// } -// } -// }).start(); -// Message replyMsg = producer.request(createRequestMessage(topic, clusterName), 3000); -// finish.getAndSet(true); -// assertThat(replyMsg.getTopic()).isEqualTo(topic); -// assertThat(replyMsg.getBody()).isEqualTo(new byte[] {'a'}); -// } -// -// @Test -// public void testRequestAsync_Success() throws RemotingException, MQClientException, InterruptedException, MQBrokerException { -// when(mqClientAPI.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); -// when(deFiBusClientInstance.getTopicRouteTable()).thenReturn(new ConcurrentHashMap()); -// final AtomicBoolean finish = new AtomicBoolean(false); -// new Thread(new Runnable() { -// @Override public void run() { -// ConcurrentHashMap responseMap = ResponseTable.getRrResponseFurtureConcurrentHashMap(); -// assertThat(responseMap).isNotNull(); -// while (!finish.get()) { -// try { -// Thread.sleep(10); -// } catch (InterruptedException e) { -// } -// for (Map.Entry entry : responseMap.entrySet()) { -// RRResponseFuture future = entry.getValue(); -// future.putResponse(createRequestMessage(topic, clusterName)); -// } -// } -// } -// }).start(); -// producer.request(createRequestMessage(topic, clusterName), new RRCallback() { -// @Override public void onSuccess(Message msg) { -// finish.getAndSet(true); -// assertThat(msg.getTopic()).isEqualTo(topic); -// assertThat(msg.getBody()).isEqualTo(new byte[] {'a'}); -// } -// -// @Override public void onException(Throwable e) { -// finish.set(true); -// assert false; -// } -// }, 3000); -// } -// -// public static TopicRouteData createTopicRoute() { -// TopicRouteData topicRouteData = new TopicRouteData(); -// -// topicRouteData.setFilterServerTable(new HashMap>()); -// List brokerDataList = new ArrayList(); -// BrokerData brokerData = new BrokerData(); -// brokerData.setBrokerName("BrokerA"); -// brokerData.setCluster("DefaultCluster"); -// HashMap brokerAddrs = new HashMap(); -// brokerAddrs.put(0L, "127.0.0.1:10911"); -// brokerData.setBrokerAddrs(brokerAddrs); -// brokerDataList.add(brokerData); -// topicRouteData.setBrokerDatas(brokerDataList); -// -// List queueDataList = new ArrayList(); -// QueueData queueData = new QueueData(); -// queueData.setBrokerName("BrokerA"); -// queueData.setPerm(6); -// queueData.setReadQueueNums(3); -// queueData.setWriteQueueNums(4); -// queueData.setTopicSynFlag(0); -// queueDataList.add(queueData); -// topicRouteData.setQueueDatas(queueDataList); -// return topicRouteData; -// } -// -// private SendResult createSendResult(SendStatus sendStatus, String brokerName) { -// SendResult sendResult = new SendResult(); -// sendResult.setMsgId("123"); -// sendResult.setOffsetMsgId("123"); -// sendResult.setQueueOffset(456); -// sendResult.setSendStatus(sendStatus); -// sendResult.setRegionId("HZ"); -// MessageQueue mq = new MessageQueue(); -// mq.setTopic(topic); -// mq.setBrokerName(brokerName); -// mq.setQueueId(0); -// sendResult.setMessageQueue(mq); -// return sendResult; -// } -// -// private Message createRequestMessage(String topic, String clusterName) { -// Message requestMessage = new Message(); -// Map map = new HashMap(); -// map.put(DeFiBusConstant.PROPERTY_MESSAGE_REPLY_TO, "127.0.0.1"); -// map.put(DeFiBusConstant.PROPERTY_MESSAGE_CLUSTER, clusterName); -// map.put(DeFiBusConstant.PROPERTY_MESSAGE_TTL, "3000"); -// MessageAccessor.setProperties(requestMessage, map); -// requestMessage.setTopic(topic); -// requestMessage.setBody(new byte[] {'a'}); -// return requestMessage; -// } -} diff --git a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/HealthyMessageQueueSelectorTest.java b/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/HealthyMessageQueueSelectorTest.java deleted file mode 100644 index 81a749a9d1..0000000000 --- a/eventmesh-store/defibus-client/src/test/java/cn/webank/defibus/client/producer/HealthyMessageQueueSelectorTest.java +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.client.producer; - -import cn.webank.defibus.client.impl.producer.DeFiBusProducerImpl; -import cn.webank.defibus.client.impl.producer.HealthyMessageQueueSelector; -import cn.webank.defibus.client.impl.producer.MessageQueueHealthManager; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageQueue; -import org.junit.Assert; -import org.junit.Test; -import org.mockito.Mockito; - -public class HealthyMessageQueueSelectorTest { - @Test - public void testLocalValidQueue() { - - final DeFiBusProducerImpl producerImplMock = Mockito.mock(DeFiBusProducerImpl.class); - Message msg = new Message(); - msg.setTopic("testtopic"); - - Set locBrokers = new HashSet<>(); - locBrokers.add("localIDC"); -// PowerMockito.when(producerImplMock.getLocalBrokers()).thenReturn(locBrokers); - - MessageQueueHealthManager manager = new MessageQueueHealthManager(60 * 1000); - HealthyMessageQueueSelector selector = new HealthyMessageQueueSelector(manager, 1); - selector.setLocalBrokers(locBrokers); - - List mqs = new ArrayList<>(); - for (int i = 1; i <= 10; i++) { - MessageQueue m = new MessageQueue("testtopic", "localIDC", i); - mqs.add(m); - } - - final AtomicReference selectedResultRef = new AtomicReference(); - MessageQueue select = selector.select(mqs, msg, selectedResultRef); - Assert.assertTrue(select != null && !(select.getBrokerName().equalsIgnoreCase("dummyBroker"))); - } - - @Test - public void testErrorQueue() { - Set locBrokers = new HashSet<>(); - locBrokers.add("localIDC"); - - MessageQueueHealthManager manager = new MessageQueueHealthManager(60 * 1000); - HealthyMessageQueueSelector selector = new HealthyMessageQueueSelector(manager, 1); - selector.setLocalBrokers(locBrokers); - - List mqs = new ArrayList<>(); - for (int i = 1; i <= 10; i++) { - MessageQueue m = new MessageQueue("testtopic", "localIDC", i); - mqs.add(m); - manager.faultMap.put(m, System.currentTimeMillis() + 60 * 1000);//设置为熔断queue - } - - MessageQueue m = new MessageQueue("testtopic", "dummyBroker", 0); - mqs.add(m); - - final AtomicReference selectedResultRef = new AtomicReference(); - //List mqs, Message msg, final Object selectedResultRef - Message msg = new Message(); - msg.setTopic("testtopic"); - MessageQueue select = selector.select(mqs, msg, selectedResultRef); - Assert.assertTrue(select != null && select.getBrokerName().equalsIgnoreCase("dummyBroker")); - } - - @Test - public void testOtherValidQueue() { - Set locBrokers = new HashSet<>(); - locBrokers.add("localIDC"); - - MessageQueueHealthManager manager = new MessageQueueHealthManager(60 * 1000); - HealthyMessageQueueSelector selector = new HealthyMessageQueueSelector(manager, 1); - selector.setLocalBrokers(locBrokers); - - List mqs = new ArrayList<>(); - for (int i = 1; i <= 10; i++) { - MessageQueue m = new MessageQueue("testtopic", "localIDC1", i); - mqs.add(m); - } - - final AtomicReference selectedResultRef = new AtomicReference(); - //List mqs, Message msg, final Object selectedResultRef - Message msg = new Message(); - msg.setTopic("testtopic"); - MessageQueue select = selector.select(mqs, msg, selectedResultRef); - Assert.assertTrue(select != null && !(select.getBrokerName().equalsIgnoreCase("dummyBroker"))); - } - - @Test - public void testBizTopic() { - String bizTopic = "XX0-s-00000000-01-0"; - String localBrokerName = "localIdcBroker"; - String otherIdcBrokerName = "otherIdcBroker"; - - Message msg = new Message(); - msg.setTopic(bizTopic); - - Set localBrokers = new HashSet<>(); - localBrokers.add(localBrokerName); - - MessageQueueHealthManager manager = new MessageQueueHealthManager(60 * 1000); - HealthyMessageQueueSelector selector = new HealthyMessageQueueSelector(manager, 1); - selector.setLocalBrokers(localBrokers); - - //construct mq data - List localMqs = new ArrayList<>(); - List otherMqs = new ArrayList<>(); - List mqs = new ArrayList<>(); - for (int i = 0; i < 3; i++) { - MessageQueue m = new MessageQueue(bizTopic, localBrokerName, i); - mqs.add(m); - localMqs.add(m); - } - for (int i = 0; i < 3; i++) { - MessageQueue m = new MessageQueue(bizTopic, otherIdcBrokerName, i); - mqs.add(m); - otherMqs.add(m); - } - Collections.sort(mqs); - - //case 1:There are mqs that aren't isolated in this IDC, select from this IDC - for (int i = 0; i < mqs.size(); i++) { - final AtomicReference selectedResultRef = new AtomicReference(); - MessageQueue selectResult = selector.select(mqs, msg, selectedResultRef); - - Assert.assertTrue(selectResult != null - && localBrokers.contains(selectResult.getBrokerName())); - Assert.assertTrue(!selector.getMessageQueueHealthManager().faultMap.containsKey(selectResult)); - } - - //case 2:All mqs in this IDC are isolated, select mq from other IDC. - for (MessageQueue mq : localMqs) { - selector.getMessageQueueHealthManager().markQueueFault(mq); - } - for (int i = 0; i < mqs.size(); i++) { - final AtomicReference selectedResultRef = new AtomicReference(); - MessageQueue selectResult = selector.select(mqs, msg, selectedResultRef); - - Assert.assertTrue(selectResult != null - && !localBrokers.contains(selectResult.getBrokerName())); - Assert.assertTrue(!selector.getMessageQueueHealthManager().faultMap.containsKey(selectResult)); - } - - //case 3:All mqs are isolated, select one randomly - for (MessageQueue mq : otherMqs) { - selector.getMessageQueueHealthManager().markQueueFault(mq); - } - for (int i = 0; i < mqs.size(); i++) { - final AtomicReference selectedResultRef = new AtomicReference(); - MessageQueue selectResult = selector.select(mqs, msg, selectedResultRef); - - Assert.assertTrue(selectResult != null - && (selectResult.getBrokerName().equals(localBrokerName) || selectResult.getBrokerName().equals(otherIdcBrokerName))); - Assert.assertTrue(selector.getMessageQueueHealthManager().faultMap.containsKey(selectResult)); - } - } - - @Test - public void testRetryBizTopic() { - String bizTopic = "XX0-s-00000000-01-0"; - String localBrokerNamePrefix = "localIdcBroker"; - String otherIdcBrokerNamePrefix = "otherIdcBroker"; - - Message msg = new Message(); - msg.setTopic(bizTopic); - - Set localBrokers = new HashSet<>(); - for (int i = 1; i <= 3; i++) { - localBrokers.add(localBrokerNamePrefix + i); - } - - MessageQueueHealthManager manager = new MessageQueueHealthManager(60 * 1000); - HealthyMessageQueueSelector selector = new HealthyMessageQueueSelector(manager, 1); - selector.setLocalBrokers(localBrokers); - - //construct mq data - List localMqs = new ArrayList<>(); - List otherMqs = new ArrayList<>(); - List mqs = new ArrayList<>(); - for (int i = 0; i < 3; i++) { - for (int j = 1; j < 3; j++) { - MessageQueue m = new MessageQueue(bizTopic, localBrokerNamePrefix + j, i); - mqs.add(m); - localMqs.add(m); - } - } - for (int i = 0; i < 3; i++) { - for (int j = 0; j <= 3; j++) { - MessageQueue m = new MessageQueue(bizTopic, otherIdcBrokerNamePrefix + j, i); - mqs.add(m); - otherMqs.add(m); - } - } - Collections.sort(mqs); - - //case 1:There are mqs that aren't isolated in this IDC, select from this IDC - MessageQueue lastSelectedMq = localMqs.get(0); - for (int i = 0; i < mqs.size(); i++) { - final AtomicReference selectedResultRef = new AtomicReference(); - selectedResultRef.set(lastSelectedMq); - MessageQueue selectResult = selector.select(mqs, msg, selectedResultRef); - - Assert.assertTrue(selectResult != null - && localBrokers.contains(selectResult.getBrokerName()) - && !selectResult.getBrokerName().equals(lastSelectedMq.getBrokerName())); - Assert.assertTrue(!selector.getMessageQueueHealthManager().faultMap.containsKey(selectResult)); - } - - //case 2:All mqs in this IDC are isolated, select mq from other IDC. - for (MessageQueue mq : localMqs) { - selector.getMessageQueueHealthManager().markQueueFault(mq); - } - for (int i = 0; i < mqs.size(); i++) { - final AtomicReference selectedResultRef = new AtomicReference(); - selectedResultRef.set(lastSelectedMq); - MessageQueue selectResult = selector.select(mqs, msg, selectedResultRef); - - Assert.assertTrue(selectResult != null - && !localBrokers.contains(selectResult.getBrokerName()) - && !selectResult.getBrokerName().equals(lastSelectedMq.getBrokerName())); - Assert.assertTrue(!selector.getMessageQueueHealthManager().faultMap.containsKey(selectResult)); - } - - //case 3:All mqs are isolated, select one randomly - for (MessageQueue mq : otherMqs) { - selector.getMessageQueueHealthManager().markQueueFault(mq); - } - for (int i = 0; i < mqs.size(); i++) { - final AtomicReference selectedResultRef = new AtomicReference(); - selectedResultRef.set(lastSelectedMq); - MessageQueue selectResult = selector.select(mqs, msg, selectedResultRef); - - Assert.assertTrue(selectResult != null - && !selectResult.getBrokerName().equals(lastSelectedMq.getBrokerName())); - Assert.assertTrue(selector.getMessageQueueHealthManager().faultMap.containsKey(selectResult)); - } - } -} diff --git a/eventmesh-store/defibus-client/src/test/resources/log4j.xml b/eventmesh-store/defibus-client/src/test/resources/log4j.xml deleted file mode 100644 index 2aae98e725..0000000000 --- a/eventmesh-store/defibus-client/src/test/resources/log4j.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/defibus-common/.gitignore b/eventmesh-store/defibus-common/.gitignore deleted file mode 100644 index c1285b3799..0000000000 --- a/eventmesh-store/defibus-common/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -/bin/ -/.git/ -/.gradle/ -/.settings/ -/logs -.DS_Store -.*.swp -*.ipr -*.iml -*.iws -*.class -*.log -.idea -build -.classpath -.project -/test-output/ -/dist -/.pmd -/classes -/logs -/out \ No newline at end of file diff --git a/eventmesh-store/defibus-common/build.gradle b/eventmesh-store/defibus-common/build.gradle deleted file mode 100644 index baeb0e739d..0000000000 --- a/eventmesh-store/defibus-common/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -dependencies { - compile "org.apache.rocketmq:rocketmq-common:$project.rocketmqVersion" - compile "org.apache.rocketmq:rocketmq-remoting:$project.rocketmqVersion" -} \ No newline at end of file diff --git a/eventmesh-store/defibus-common/conf/checkstyle.xml b/eventmesh-store/defibus-common/conf/checkstyle.xml deleted file mode 100644 index 3d024111bc..0000000000 --- a/eventmesh-store/defibus-common/conf/checkstyle.xml +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusBrokerConfig.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusBrokerConfig.java deleted file mode 100644 index 01f085a3bc..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusBrokerConfig.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common; - -import org.apache.rocketmq.common.annotation.ImportantField; - -public class DeFiBusBrokerConfig { - private int sendReplyMessageThreadPoolNums = 64; - - private int pushReplyMessageThreadPoolNums = 64; - - private int sendReplyThreadPoolQueueCapacity = 10000; - - private int pushReplyThreadPoolQueueCapacity = 10000; - - @ImportantField - private String rmqAddressServerSubGroup = "namesrvAddr"; - - @ImportantField - private String rmqAddressServerDomain = "http://127.0.0.1:8090"; - - private int scaleQueueThreadPoolQueueCapacity = 100000; - - private int scaleQueueSizeDelayTimeMinute = 5; - - private int scaleQueueRetryTimesMax = 10000; - - private int minQueueNum = 1; - - private boolean redirectMessageEnable = true; - - // whether reject sending when the depth exceeds threshold - @ImportantField - private boolean rejectSendWhenMaxDepth = true; - - //warning threshold of fuse - private double queueDepthHighWatermark = 0.7; - - //whether enable auto-clean when there are multiple consumer groups - @ImportantField - private boolean autoUpdateDepth = true; - - @ImportantField - private int depthCheckInterval = 30 * 1000; - - @ImportantField - private int checkQueueListeningPeriod = 5; - - @ImportantField - private boolean checkQueueListening = true; - - public int getSendReplyMessageThreadPoolNums() { - return sendReplyMessageThreadPoolNums; - } - - public void setSendReplyMessageThreadPoolNums(int sendReplyMessageThreadPoolNums) { - this.sendReplyMessageThreadPoolNums = sendReplyMessageThreadPoolNums; - } - - public int getPushReplyMessageThreadPoolNums() { - return pushReplyMessageThreadPoolNums; - } - - public void setPushReplyMessageThreadPoolNums(int pushReplyMessageThreadPoolNums) { - this.pushReplyMessageThreadPoolNums = pushReplyMessageThreadPoolNums; - } - - public int getSendReplyThreadPoolQueueCapacity() { - return sendReplyThreadPoolQueueCapacity; - } - - public void setSendReplyThreadPoolQueueCapacity(int sendReplyThreadPoolQueueCapacity) { - this.sendReplyThreadPoolQueueCapacity = sendReplyThreadPoolQueueCapacity; - } - - public int getPushReplyThreadPoolQueueCapacity() { - return pushReplyThreadPoolQueueCapacity; - } - - public void setPushReplyThreadPoolQueueCapacity(int pushReplyThreadPoolQueueCapacity) { - this.pushReplyThreadPoolQueueCapacity = pushReplyThreadPoolQueueCapacity; - } - - public String getRmqAddressServerSubGroup() { - return rmqAddressServerSubGroup; - } - - public void setRmqAddressServerSubGroup(String rmqAddressServerSubGroup) { - this.rmqAddressServerSubGroup = rmqAddressServerSubGroup; - } - - public String getRmqAddressServerDomain() { - return rmqAddressServerDomain; - } - - public void setRmqAddressServerDomain(String rmqAddressServerDomain) { - this.rmqAddressServerDomain = rmqAddressServerDomain; - } - - public int getScaleQueueThreadPoolQueueCapacity() { - return scaleQueueThreadPoolQueueCapacity; - } - - public void setScaleQueueThreadPoolQueueCapacity(int scaleQueueThreadPoolQueueCapacity) { - this.scaleQueueThreadPoolQueueCapacity = scaleQueueThreadPoolQueueCapacity; - } - - public int getScaleQueueSizeDelayTimeMinute() { - return scaleQueueSizeDelayTimeMinute; - } - - public void setScaleQueueSizeDelayTimeMinute(int scaleQueueSizeDelayTimeMinute) { - this.scaleQueueSizeDelayTimeMinute = scaleQueueSizeDelayTimeMinute; - } - - public int getScaleQueueRetryTimesMax() { - return scaleQueueRetryTimesMax; - } - - public void setScaleQueueRetryTimesMax(int scaleQueueRetryTimesMax) { - this.scaleQueueRetryTimesMax = scaleQueueRetryTimesMax; - } - - public int getMinQueueNum() { - return minQueueNum; - } - - public void setMinQueueNum(int minQueueNum) { - this.minQueueNum = minQueueNum; - } - - public boolean isRedirectMessageEnable() { - return redirectMessageEnable; - } - - public void setRedirectMessageEnable(boolean redirectMessageEnable) { - this.redirectMessageEnable = redirectMessageEnable; - } - - public boolean isAutoUpdateDepth() { - return autoUpdateDepth; - } - - public boolean isRejectSendWhenMaxDepth() { - return rejectSendWhenMaxDepth; - } - - public double getQueueDepthHighWatermark() { - return queueDepthHighWatermark; - } - - public int getDepthCheckInterval() { - return depthCheckInterval; - } - - public boolean isCheckQueueListening() { - return checkQueueListening; - } - - public int getCheckQueueListeningPeriod() { - return checkQueueListeningPeriod; - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusConstant.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusConstant.java deleted file mode 100644 index c51ec5060c..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusConstant.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common; - -public class DeFiBusConstant { - public static final String PROPERTY_MESSAGE_REPLY_TO = "REPLY_TO"; //requester clientId - - public static final String PROPERTY_RR_REQUEST_ID = "RR_REQUEST_UNIQ_ID"; - - public static final String PROPERTY_MESSAGE_TTL = "TTL"; //timeout for request-response - - public static final String PROPERTY_MESSAGE_CLUSTER = "CLUSTER"; //cluster name - - public static final String PROPERTY_MESSAGE_BROKER = "BROKER"; //broker name where message stored - - public static final String REDIRECT = "REDIRECT"; - - public static final String REDIRECT_FLAG = "REDIRECT_FLAG"; - - public static final String PLUGIN_CLASS_NAME = "cn.webank.defibus.broker.plugin.DeFiPluginMessageStore"; - - public static final String RR_REPLY_TOPIC = "rr-reply-topic"; //post fix for reply topic - - public static final String KEY = "msgType"; - - public static final String DEFAULT_TTL = "14400000"; - - public static final String EXT_CONSUMER_GROUP = "ExtConsumerGroup"; - - public static final String RMQ_SYS = "RMQ_SYS_"; - - /** - * msgType1: indicate the msg is broadcast message - */ - public static final String DIRECT = "direct"; - - /** - * msgType2: msg of type except broadcast and reply - */ - public static final String PERSISTENT = "persistent"; - - /** - * msgType3: indicate the msg is which consumer reply to producer - */ - public static final String REPLY = "reply"; - - public static final String INSTANCE_NAME_SEPERATER = "#"; - - public static final String IDC_SEPERATER = "-"; - -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusErrorCode.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusErrorCode.java deleted file mode 100644 index 2f90a50cb2..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusErrorCode.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common; - -public class DeFiBusErrorCode { - public static final int RR_REQUEST_TIMEOUT = 1; -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusVersion.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusVersion.java deleted file mode 100644 index f9ebc81915..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/DeFiBusVersion.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common; - -public class DeFiBusVersion { - public static final int CURRENT_VERSION = Version.V1_0_0.ordinal(); - - public static String getVersionDesc(int value) { - try { - DeFiBusVersion.Version v = DeFiBusVersion.Version.values()[value]; - return v.name(); - } catch (Exception e) { - } - - return "HigherVersion"; - } - - public static DeFiBusVersion.Version value2Version(int value) { - return DeFiBusVersion.Version.values()[value]; - } - - public enum Version { - V1_0_0_SNAPSHOT, - V1_0_0, - V1_0_1_SNAPSHOT, - V1_0_1, - V1_1_0_SNAPSHOT, - V1_1_0, - V1_2_0_SNAPSHOT, - V1_2_0, - V1_3_0_SNAPSHOT, - V1_3_0, - V1_3_1_SNAPSHOT, - V1_3_1, - V1_3_2_SNAPSHOT, - V1_3_2, - V1_3_3_SNAPSHOT, - V1_3_3, - V1_3_4_SNAPSHOT, - V1_3_4, - V1_4_0_SNAPSHOT, - V1_4_0, - V1_4_1_SNAPSHOT, - V1_4_1, - V1_4_2_SNAPSHOT, - V1_4_2, - V1_4_3_SNAPSHOT, - V1_4_3, - V1_4_4_SNAPSHOT, - V1_4_4, - V1_4_5_SNAPSHOT, - V1_4_5, - V1_4_6_SNAPSHOT, - V1_4_6, - V1_4_7_SNAPSHOT, - V1_4_7, - V1_5_0_SNAPSHOT, - V1_5_0, - V1_5_1_SNAPSHOT, - V1_5_1, - V1_5_2_SNAPSHOT, - V1_5_2, - V1_6_0_SNAPSHOT, - V1_6_0, - V1_6_1_SNAPSHOT, - V1_6_1, - V1_6_2_SNAPSHOT, - V1_6_2, - V1_6_3_SNAPSHOT, - V1_6_3, - V1_6_4_SNAPSHOT, - V1_6_4, - V1_6_5_SNAPSHOT, - V1_6_5, - V1_7_0_SNAPSHOT, - V1_7_0 - } - - public static void main(String[] args) { - System.out.println(CURRENT_VERSION); - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/admin/DeFiBusConsumeStats.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/admin/DeFiBusConsumeStats.java deleted file mode 100644 index 1be8386a1a..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/admin/DeFiBusConsumeStats.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.admin; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import org.apache.rocketmq.common.message.MessageQueue; -import org.apache.rocketmq.remoting.protocol.RemotingSerializable; - -public class DeFiBusConsumeStats extends RemotingSerializable { - private HashMap offsetTable = new HashMap(); - private double consumeTps = 0; - - public long computeTotalDiff() { - long diffTotal = 0L; - - Iterator> it = this.offsetTable.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry next = it.next(); - long diff = next.getValue().getBrokerOffset() - next.getValue().getConsumerOffset(); - diffTotal += diff; - } - - return diffTotal; - } - - public HashMap getOffsetTable() { - return offsetTable; - } - - public void setOffsetTable(HashMap offsetTable) { - this.offsetTable = offsetTable; - } - - public double getConsumeTps() { - return consumeTps; - } - - public void setConsumeTps(double consumeTps) { - this.consumeTps = consumeTps; - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/admin/DeFiBusOffsetWrapper.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/admin/DeFiBusOffsetWrapper.java deleted file mode 100644 index 7e7ae40e33..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/admin/DeFiBusOffsetWrapper.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.admin; - -import org.apache.rocketmq.common.admin.OffsetWrapper; - -public class DeFiBusOffsetWrapper extends OffsetWrapper { - private long lastDeliverOffset; - - public long getLastDeliverOffset() { - return lastDeliverOffset; - } - - public void setLastDeliverOffset(long lastDeliverOffset) { - this.lastDeliverOffset = lastDeliverOffset; - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/exception/DeFiBusException.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/exception/DeFiBusException.java deleted file mode 100644 index c562b9787d..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/exception/DeFiBusException.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.exception; - -public class DeFiBusException extends Exception { - - private int errorCode; - private String errorString; - - public DeFiBusException(int errorCode, String errorString) { - super("CODE: " + errorCode + " DESC:" + errorString); - this.errorCode = errorCode; - this.errorString = errorString; - } - - public DeFiBusException(String message, Throwable cause) { - super(message, cause); - this.errorCode = -1; - this.errorString = message; - } - - public int getErrorCode() { - return errorCode; - } - - public void setErrorCode(int errorCode) { - this.errorCode = errorCode; - } - - public String getErrorString() { - return errorString; - } - - public void setErrorString(String errorString) { - this.errorString = errorString; - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/exception/DeFiBusRuntimeException.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/exception/DeFiBusRuntimeException.java deleted file mode 100644 index 60aa9247a8..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/exception/DeFiBusRuntimeException.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.exception; - -public class DeFiBusRuntimeException extends RuntimeException { - public DeFiBusRuntimeException(String message) { - super(message); - } - - public DeFiBusRuntimeException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/message/DeFiBusMessageConst.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/message/DeFiBusMessageConst.java deleted file mode 100644 index 391fa5f369..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/message/DeFiBusMessageConst.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.message; - -public class DeFiBusMessageConst { - public static final String LEAVE_TIME = "LEAVE_TIME"; //leaveBrokerTime - public static final String ARRIVE_TIME = "ARRIVE_TIME"; //arriveClientTime -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusRequestCode.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusRequestCode.java deleted file mode 100644 index ce64bf5e83..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusRequestCode.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.protocol; - -public class DeFiBusRequestCode { - public static final int PUSH_RR_REPLY_MSG_TO_CLIENT = 400; - public static final int SEND_DIRECT_MESSAGE = 402; - public static final int SEND_DIRECT_MESSAGE_V2 = 403; - public static final int GET_CONSUME_STATS_V2 = 506; - public static final int GET_CONSUMER_LIST_BY_GROUP_AND_TOPIC = 507; - public static final int NOTIFY_WHEN_TOPIC_CONFIG_CHANGE = 508; -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusResponseCode.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusResponseCode.java deleted file mode 100644 index 0c958b9ec8..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusResponseCode.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.protocol; - -public class DeFiBusResponseCode { - public static final int CONSUME_DIFF_SPAN_TOO_LONG = 301; - -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusTopicConfig.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusTopicConfig.java deleted file mode 100644 index e343b9a9e4..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/DeFiBusTopicConfig.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.webank.defibus.common.protocol; - -import com.google.common.base.Preconditions; - -public class DeFiBusTopicConfig { - public static final long DEFAULT_QUEUE_LENGTH = 500; - private static final String SEPARATOR = " "; - private String topicName; - private long maxQueueDepth = DEFAULT_QUEUE_LENGTH; - - public DeFiBusTopicConfig() { - } - - public DeFiBusTopicConfig(String topicName) { - this(topicName, DEFAULT_QUEUE_LENGTH); - } - - public DeFiBusTopicConfig(String topicName, long maxQueueDepth) { - Preconditions.checkArgument(topicName.indexOf(SEPARATOR) < 0, "topicName is invalid:" + topicName); - this.topicName = topicName; - this.maxQueueDepth = maxQueueDepth; - } - - public String encode() { - StringBuilder sb = new StringBuilder(); - - sb.append(this.topicName); - sb.append(SEPARATOR); - sb.append(this.maxQueueDepth); - - return sb.toString(); - } - - public boolean decode(final String in) { - String[] strs = in.split(SEPARATOR); - if (strs != null && strs.length == 2) { - this.topicName = strs[0]; - - this.maxQueueDepth = Long.parseLong(strs[1]); - - return true; - } - - return false; - } - - public String getTopicName() { - return topicName; - } - - public void setTopicName(String topicName) { - Preconditions.checkArgument(topicName.indexOf(SEPARATOR) < 0, "topicName is invalid:" + topicName); - this.topicName = topicName; - } - - public long getMaxQueueDepth() { - return maxQueueDepth; - } - - public void setMaxQueueDepth(long maxQueueDepth) { - this.maxQueueDepth = maxQueueDepth; - } - - @Override - public boolean equals(final Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - final DeFiBusTopicConfig that = (DeFiBusTopicConfig) o; - - if (maxQueueDepth != that.maxQueueDepth) - return false; - if (topicName != null ? !topicName.equals(that.topicName) : that.topicName != null) - return false; - return true; - } - - @Override - public String toString() { - return "DeFiBusTopicConfig[" + - "topicName='" + topicName + '\'' + - ", maxQueueDepth=" + maxQueueDepth + - ']'; - } - - @Override - public int hashCode() { - int result = topicName.hashCode(); - result = 31 * result + (int) (maxQueueDepth ^ (maxQueueDepth >>> 32)); - return result; - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/body/DeFiBusTopicConfigSerializeWrapper.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/body/DeFiBusTopicConfigSerializeWrapper.java deleted file mode 100644 index 16407feded..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/body/DeFiBusTopicConfigSerializeWrapper.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.protocol.body; - -import cn.webank.defibus.common.protocol.DeFiBusTopicConfig; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.rocketmq.common.DataVersion; -import org.apache.rocketmq.remoting.protocol.RemotingSerializable; - -public class DeFiBusTopicConfigSerializeWrapper extends RemotingSerializable { - private ConcurrentHashMap extTopicConfigTable = - new ConcurrentHashMap(); - private DataVersion dataVersion = new DataVersion(); - - public ConcurrentHashMap getExtTopicConfigTable() { - return extTopicConfigTable; - } - - public void setExtTopicConfigTable(ConcurrentHashMap extTopicConfigTable) { - this.extTopicConfigTable = extTopicConfigTable; - } - - public DataVersion getDataVersion() { - return dataVersion; - } - - public void setDataVersion(DataVersion dataVersion) { - this.dataVersion = dataVersion; - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/body/GetConsumerListByGroupAndTopicResponseBody.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/body/GetConsumerListByGroupAndTopicResponseBody.java deleted file mode 100644 index 49e8750284..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/body/GetConsumerListByGroupAndTopicResponseBody.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.protocol.body; - -import java.util.List; -import org.apache.rocketmq.remoting.protocol.RemotingSerializable; - -public class GetConsumerListByGroupAndTopicResponseBody extends RemotingSerializable { - private List consumerIdList; - - public List getConsumerIdList() { - return consumerIdList; - } - - public void setConsumerIdList(List consumerIdList) { - this.consumerIdList = consumerIdList; - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/GetConsumerListByGroupAndTopicRequestHeader.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/GetConsumerListByGroupAndTopicRequestHeader.java deleted file mode 100644 index f65936ea5b..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/GetConsumerListByGroupAndTopicRequestHeader.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.protocol.header; - -import org.apache.rocketmq.remoting.CommandCustomHeader; -import org.apache.rocketmq.remoting.annotation.CFNotNull; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; - -public class GetConsumerListByGroupAndTopicRequestHeader implements CommandCustomHeader { - @CFNotNull - private String consumerGroup; - - @CFNotNull - private String topic; - - @Override - public void checkFields() throws RemotingCommandException { - } - - public String getConsumerGroup() { - return consumerGroup; - } - - public void setConsumerGroup(String consumerGroup) { - this.consumerGroup = consumerGroup; - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } -} \ No newline at end of file diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/GetConsumerListByGroupAndTopicResponseHeader.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/GetConsumerListByGroupAndTopicResponseHeader.java deleted file mode 100644 index 0486fbe09d..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/GetConsumerListByGroupAndTopicResponseHeader.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.protocol.header; - -import org.apache.rocketmq.remoting.CommandCustomHeader; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; - -public class GetConsumerListByGroupAndTopicResponseHeader implements CommandCustomHeader { - - @Override - public void checkFields() throws RemotingCommandException { - } -} - diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/NotifyTopicChangedRequestHeader.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/NotifyTopicChangedRequestHeader.java deleted file mode 100644 index 04cec6b01b..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/NotifyTopicChangedRequestHeader.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.protocol.header; - -import org.apache.rocketmq.remoting.CommandCustomHeader; -import org.apache.rocketmq.remoting.annotation.CFNotNull; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; - -public class NotifyTopicChangedRequestHeader implements CommandCustomHeader { - @CFNotNull - private String topic; - - @Override - public void checkFields() throws RemotingCommandException { - - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/ReplyMessageRequestHeader.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/ReplyMessageRequestHeader.java deleted file mode 100644 index e26c10915c..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/protocol/header/ReplyMessageRequestHeader.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.protocol.header; - -import org.apache.rocketmq.remoting.CommandCustomHeader; -import org.apache.rocketmq.remoting.annotation.CFNotNull; -import org.apache.rocketmq.remoting.annotation.CFNullable; -import org.apache.rocketmq.remoting.exception.RemotingCommandException; - -public class ReplyMessageRequestHeader implements CommandCustomHeader { - @CFNotNull - private String producerGroup; - @CFNotNull - private String topic; - @CFNotNull - private String defaultTopic; - @CFNotNull - private Integer defaultTopicQueueNums; - @CFNotNull - private Integer queueId; - @CFNotNull - private Integer sysFlag; - @CFNotNull - private Long bornTimestamp; - @CFNotNull - private Integer flag; - @CFNullable - private String properties; - @CFNullable - private Integer reconsumeTimes; - @CFNullable - private boolean unitMode = false; - - @CFNotNull - private String bornHost; - - @CFNotNull - private String storeHost; - - private long storeTimestamp; - - public String getBornHost() { - return bornHost; - } - - @Override - public void checkFields() throws RemotingCommandException { - } - - public String getProducerGroup() { - return producerGroup; - } - - public void setProducerGroup(String producerGroup) { - this.producerGroup = producerGroup; - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } - - public String getDefaultTopic() { - return defaultTopic; - } - - public void setDefaultTopic(String defaultTopic) { - this.defaultTopic = defaultTopic; - } - - public Integer getDefaultTopicQueueNums() { - return defaultTopicQueueNums; - } - - public void setDefaultTopicQueueNums(Integer defaultTopicQueueNums) { - this.defaultTopicQueueNums = defaultTopicQueueNums; - } - - public Integer getQueueId() { - return queueId; - } - - public void setQueueId(Integer queueId) { - this.queueId = queueId; - } - - public Integer getSysFlag() { - return sysFlag; - } - - public void setSysFlag(Integer sysFlag) { - this.sysFlag = sysFlag; - } - - public Long getBornTimestamp() { - return bornTimestamp; - } - - public void setBornTimestamp(Long bornTimestamp) { - this.bornTimestamp = bornTimestamp; - } - - public Integer getFlag() { - return flag; - } - - public void setFlag(Integer flag) { - this.flag = flag; - } - - public String getProperties() { - return properties; - } - - public void setProperties(String properties) { - this.properties = properties; - } - - public Integer getReconsumeTimes() { - return reconsumeTimes; - } - - public void setReconsumeTimes(Integer reconsumeTimes) { - this.reconsumeTimes = reconsumeTimes; - } - - public boolean isUnitMode() { - return unitMode; - } - - public void setUnitMode(boolean isUnitMode) { - this.unitMode = isUnitMode; - } - - public void setBornHost(String bornHost) { - this.bornHost = bornHost; - } - - public String getStoreHost() { - return storeHost; - } - - public void setStoreHost(String storeHost) { - this.storeHost = storeHost; - } - - public long getStoreTimestamp() { - return storeTimestamp; - } - - public void setStoreTimestamp(long storeTimestamp) { - this.storeTimestamp = storeTimestamp; - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/util/DeFiBusRequestIDUtil.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/util/DeFiBusRequestIDUtil.java deleted file mode 100644 index ae2c9ddb55..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/util/DeFiBusRequestIDUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.util; - -import java.util.UUID; - -public class DeFiBusRequestIDUtil { - public static String createUniqueName(String prefix) { - if (prefix != null && prefix.trim().length() != 0) { - StringBuilder bldr = new StringBuilder(prefix); - bldr.append("/"); - bldr.append(UUID.randomUUID().toString()); - return bldr.toString(); - } else { - return UUID.randomUUID().toString(); - } - } -} diff --git a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/util/ReflectUtil.java b/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/util/ReflectUtil.java deleted file mode 100644 index 11ee6fd0c6..0000000000 --- a/eventmesh-store/defibus-common/src/main/java/cn/webank/defibus/common/util/ReflectUtil.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.util; - -import cn.webank.defibus.common.exception.DeFiBusRuntimeException; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public class ReflectUtil { - public static void setSimpleProperty(Class c, Object instance, String proName, Object value) { - try { - Field field4pro = c.getDeclaredField(proName); - field4pro.setAccessible(true); - field4pro.set(instance, value); - } catch (NoSuchFieldException e) { - throw new DeFiBusRuntimeException("set property fail", e); - } catch (IllegalAccessException e) { - throw new DeFiBusRuntimeException("set property fail", e); - } catch (Exception e) { - throw new DeFiBusRuntimeException("set property fail", e); - } - } - - public static Object getSimpleProperty(Class c, Object instance, String proName) { - Object value = null; - try { - Field field4pro = c.getDeclaredField(proName); - field4pro.setAccessible(true); - value = field4pro.get(instance); - } catch (NoSuchFieldException e) { - throw new DeFiBusRuntimeException("get property fail", e); - } catch (IllegalAccessException e) { - throw new DeFiBusRuntimeException("get property fail", e); - } catch (Exception e) { - throw new DeFiBusRuntimeException("get property fail", e); - } - - return value; - } - - public static void invokeMethod(Class c, Object instance, String methodName) { - try { - Method method4bean = c.getDeclaredMethod(methodName); - method4bean.setAccessible(true); - method4bean.invoke(instance); - } catch (IllegalAccessException e) { - throw new DeFiBusRuntimeException("invokeMethod fail", e); - } catch (InvocationTargetException e) { - throw new DeFiBusRuntimeException("invokeMethod fail", e); - } catch (NoSuchMethodException e) { - throw new DeFiBusRuntimeException("invokeMethod fail", e); - } catch (Exception e) { - throw new DeFiBusRuntimeException("invokeMethod fail", e); - } - } - - public static Object invokeMethodWithReturn(Class c, Object instance, String methodName) { - Object result = null; - try { - Method method4bean = c.getDeclaredMethod(methodName); - method4bean.setAccessible(true); - result = method4bean.invoke(instance); - } catch (IllegalAccessException e) { - throw new DeFiBusRuntimeException("invokeMethod fail", e); - } catch (InvocationTargetException e) { - throw new DeFiBusRuntimeException("invokeMethod fail", e); - } catch (NoSuchMethodException e) { - throw new DeFiBusRuntimeException("invokeMethod fail", e); - } catch (Exception e) { - throw new DeFiBusRuntimeException("invokeMethod fail", e); - } - - return result; - } - - public static void invokeMethodByParams(Method method, Object instance, Object... params) { - try { - method.invoke(instance, params); - } catch (IllegalAccessException e) { - throw new DeFiBusRuntimeException("invokeMethodByParams fail", e); - } catch (InvocationTargetException e) { - throw new DeFiBusRuntimeException("invokeMethodByParams fail", e); - } catch (Exception e) { - throw new DeFiBusRuntimeException("invokeMethodByParams fail", e); - } - } - - @SuppressWarnings("unchecked") - public static Method getMethodByName(Class c, String methodName) { - try { - Method[] methods = c.getDeclaredMethods(); - if (methods == null) { - return null; - } - - for (Method method : methods) { - if (method.getName().equalsIgnoreCase(methodName)) { - Method declaredMethod = c.getDeclaredMethod(methodName, method.getParameterTypes()); - declaredMethod.setAccessible(true); - return method; - } - } - } catch (NoSuchMethodException e) { - throw new DeFiBusRuntimeException("getMethodByName fail", e); - } catch (Exception e) { - throw new DeFiBusRuntimeException("getMethodByName fail", e); - } - return null; - } -} diff --git a/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/DeFiBusBrokerConfigTest.java b/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/DeFiBusBrokerConfigTest.java deleted file mode 100644 index 961f36d467..0000000000 --- a/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/DeFiBusBrokerConfigTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common; - -import org.junit.Test; - -import static org.junit.Assert.assertTrue; - -public class DeFiBusBrokerConfigTest { - - @Test - public void testDeFiBusBrokerConfigDefaultValue() throws Exception { - DeFiBusBrokerConfig deFiBusBrokerConfig = new DeFiBusBrokerConfig(); - assertTrue(deFiBusBrokerConfig.getSendReplyMessageThreadPoolNums() == 64); - assertTrue(deFiBusBrokerConfig.getPushReplyMessageThreadPoolNums() == 64); - assertTrue(deFiBusBrokerConfig.getSendReplyThreadPoolQueueCapacity() == 10000); - assertTrue(deFiBusBrokerConfig.isRejectSendWhenMaxDepth() == true); - assertTrue(deFiBusBrokerConfig.isRedirectMessageEnable() == true); - assertTrue(deFiBusBrokerConfig.isAutoUpdateDepth() == true); - assertTrue(deFiBusBrokerConfig.getDepthCheckInterval() == 30 * 1000); - } -} diff --git a/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/admin/DeFiBusConsumeStatsTest.java b/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/admin/DeFiBusConsumeStatsTest.java deleted file mode 100644 index 3419fab244..0000000000 --- a/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/admin/DeFiBusConsumeStatsTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.admin; - -import java.util.HashMap; -import org.apache.rocketmq.common.message.MessageQueue; -import org.junit.Test; - -import static org.junit.Assert.assertTrue; - -public class DeFiBusConsumeStatsTest { - private String topic = "topic"; - private String brokerName = "brokerName"; - private HashMap offsetTable = new HashMap(); - private DeFiBusConsumeStats deFiBusConsumeStats = new DeFiBusConsumeStats(); - - @Test - public void testComputeTotalDiff() throws Exception { - long totalDiff = createOffsetTable(10); - deFiBusConsumeStats.setOffsetTable(offsetTable); - long i = deFiBusConsumeStats.computeTotalDiff(); - assertTrue(totalDiff == deFiBusConsumeStats.computeTotalDiff()); - } - - private long createOffsetTable(int queueSize) { - long totalDiff = 0; - for (int i = 0; i < queueSize; i++) { - DeFiBusOffsetWrapper wrapper = new DeFiBusOffsetWrapper(); - wrapper.setBrokerOffset(queueSize); - wrapper.setConsumerOffset(i); - long temp = queueSize - i; - totalDiff += temp; - offsetTable.put(new MessageQueue(topic, brokerName, i), wrapper); - - } - return totalDiff; - } -} diff --git a/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/protocol/DeFiBusTopicConfigTest.java b/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/protocol/DeFiBusTopicConfigTest.java deleted file mode 100644 index 36c0ff1b98..0000000000 --- a/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/protocol/DeFiBusTopicConfigTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.protocol; - -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertTrue; - -public class DeFiBusTopicConfigTest { - private String topic = "topicA"; - - @Test - public void testEcodeAndDecode() throws Exception { - DeFiBusTopicConfig deFiBusTopicConfig = new DeFiBusTopicConfig(topic); - String ecodeMsg = deFiBusTopicConfig.encode(); - assertTrue(deFiBusTopicConfig.decode(ecodeMsg)); - } - - @Test - public void testAttribute() { - DeFiBusTopicConfig deFiBusTopicConfig = new DeFiBusTopicConfig(); - deFiBusTopicConfig.setTopicName(topic); - deFiBusTopicConfig.setMaxQueueDepth(500); - assertThat(deFiBusTopicConfig.getTopicName()).isEqualTo(topic); - assertThat(deFiBusTopicConfig.getMaxQueueDepth()).isEqualTo(500); - } -} diff --git a/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/util/DeFiBusRequestIDUtilTest.java b/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/util/DeFiBusRequestIDUtilTest.java deleted file mode 100644 index 447f10fdea..0000000000 --- a/eventmesh-store/defibus-common/src/test/java/cn/webank/defibus/common/util/DeFiBusRequestIDUtilTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.common.util; - -import org.junit.Test; - -import static org.junit.Assert.assertTrue; - -public class DeFiBusRequestIDUtilTest { - - @Test - public void testCreateUniqueNameByPrefix() { - String prefix = "w"; - String UniqueName = DeFiBusRequestIDUtil.createUniqueName(prefix); - String prefix2 = UniqueName.split("/")[0]; - assertTrue(prefix.equals(prefix2)); - } - - @Test(expected = ArrayIndexOutOfBoundsException.class) - public void testCreateUniqueNameNoPrefix() { - String UniqueName = DeFiBusRequestIDUtil.createUniqueName(null); - String prefix2 = UniqueName.split("/")[1]; - } -} diff --git a/eventmesh-store/defibus-common/src/test/resources/logback.xml b/eventmesh-store/defibus-common/src/test/resources/logback.xml deleted file mode 100644 index d2bb771a7f..0000000000 --- a/eventmesh-store/defibus-common/src/test/resources/logback.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - ../logs/broker_default.log - - - %d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n - UTF-8 - - - - true - - - - ../logs/brokder-default-%d{yyyy-MM-dd_MM}.%i.log - - 1MB - 10 - 20GB - - - - - - - - - - diff --git a/eventmesh-store/defibus-examples/build.gradle b/eventmesh-store/defibus-examples/build.gradle deleted file mode 100644 index 2c739da0f4..0000000000 --- a/eventmesh-store/defibus-examples/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -List Log = [ - "org.slf4j:slf4j-log4j12:1.7.12", - "log4j:log4j:1.2.17" -] - -dependencies { - compile project(":defibus-client") - compile project(":defibus-common") - compile "org.apache.rocketmq:rocketmq-common:$project.rocketmqVersion" - compile "org.apache.rocketmq:rocketmq-client:$project.rocketmqVersion" - compile "org.apache.rocketmq:rocketmq-remoting:$project.rocketmqVersion" - compile Log -} diff --git a/eventmesh-store/defibus-examples/conf/checkstyle.xml b/eventmesh-store/defibus-examples/conf/checkstyle.xml deleted file mode 100644 index 3d024111bc..0000000000 --- a/eventmesh-store/defibus-examples/conf/checkstyle.xml +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/RequestProducer.java b/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/RequestProducer.java deleted file mode 100644 index 8cccab04fd..0000000000 --- a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/RequestProducer.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.examples.rpc; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.producer.DeFiBusProducer; -import org.apache.rocketmq.client.exception.MQBrokerException; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.remoting.exception.RemotingException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RequestProducer { - private static final Logger logger = LoggerFactory.getLogger(RequestProducer.class); - - public static void main(String[] args) throws MQClientException { - DeFiBusClientConfig clientConfig = new DeFiBusClientConfig(); - clientConfig.setClusterPrefix("XL"); - - DeFiBusProducer deFiBusProducer = new DeFiBusProducer(clientConfig); - deFiBusProducer.setNamesrvAddr("127.0.0.1:9876"); - - deFiBusProducer.start(); - - long ttl = 2000; - String topic = "RequestTopic"; - - final String content = "Hello world"; - Message msg = new Message(topic, content.getBytes()); - try { - long time = System.currentTimeMillis(); - - Message reply = deFiBusProducer.request(msg, ttl); - long cost = System.currentTimeMillis() - time; - - if (reply == null) { - logger.warn("request timeout. "); - } else { - logger.info("request success. cost: {}ms. reply msg: {}", cost, reply); - } - } catch (MQClientException | RemotingException | InterruptedException | MQBrokerException e) { - logger.warn("{}", e); - } catch (Exception e) { - logger.warn("{}", e); - } finally { - // normally , we ONLY shutdown DeFiBusProducer when the application exits. In this sample, we shutdown the producer when message is sent. - deFiBusProducer.shutdown(); - } - } -} diff --git a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/ResponseConsumer.java b/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/ResponseConsumer.java deleted file mode 100644 index ff585db9dd..0000000000 --- a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/ResponseConsumer.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.examples.rpc; - -import java.util.List; - -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; -import org.apache.rocketmq.client.exception.MQBrokerException; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.client.producer.SendCallback; -import org.apache.rocketmq.client.producer.SendResult; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.common.message.MessageExt; -import org.apache.rocketmq.remoting.exception.RemotingException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.client.common.DeFiBusClientUtil; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.consumer.DeFiBusMessageListenerConcurrently; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import cn.webank.defibus.producer.DeFiBusProducer; - -public class ResponseConsumer { - private static final Logger logger = LoggerFactory.getLogger(ResponseConsumer.class); - - public static void main(String[] args) throws MQClientException { - String topic = "RequestTopic"; - DeFiBusClientConfig deFiBusClientConfig = new DeFiBusClientConfig(); - deFiBusClientConfig.setConsumerGroup("Your-group-name"); - deFiBusClientConfig.setPullBatchSize(32); - deFiBusClientConfig.setThreadPoolCoreSize(12); - deFiBusClientConfig.setClusterPrefix("XL"); - DeFiBusProducer deFiBusProducer = new DeFiBusProducer(deFiBusClientConfig); - deFiBusProducer.setNamesrvAddr("127.0.0.1:9876"); - deFiBusProducer.start(); - DeFiBusPushConsumer deFiBusPushConsumer = new DeFiBusPushConsumer(deFiBusClientConfig); - deFiBusPushConsumer.setNamesrvAddr("127.0.0.1:9876"); - deFiBusPushConsumer.registerMessageListener(new DeFiBusMessageListenerConcurrently() { - @Override - public ConsumeConcurrentlyStatus handleMessage(List msgs, ConsumeConcurrentlyContext context) { - for (MessageExt msg : msgs) { - String uniqueId = msg.getUserProperty(DeFiBusConstant.PROPERTY_RR_REQUEST_ID); - if (uniqueId == null) { - logger.info("REQUEST_ID is null from the request msg, will not reply this constant..."); - } else { - try { - logger.info("begin handle: " + msg.toString()); - Message replyMsg = DeFiBusClientUtil.createReplyMessage(msg, ("I am replying content").getBytes()); - deFiBusProducer.reply(replyMsg, new SendCallback() { - @Override - public void onSuccess(SendResult sendResult) { - logger.info("reply success. {}", msg.toString()); - } - @Override - public void onException(Throwable e) { - logger.info("reply fail. {}", msg.toString(), e); - } - }); - } catch (InterruptedException | RemotingException | MQClientException | MQBrokerException e) { - logger.warn("{}", e); - } - } - } - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - }); - deFiBusPushConsumer.subscribe(topic); - deFiBusPushConsumer.start(); - - //shutdown the consumer when application exits. - Runtime.getRuntime().addShutdownHook(new Thread(){ - @Override - public void run() { - deFiBusPushConsumer.shutdown(); - } - }); - } -} diff --git a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/ResponseConsumerAutoReply.java b/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/ResponseConsumerAutoReply.java deleted file mode 100644 index 36eb9c594e..0000000000 --- a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/rpc/ResponseConsumerAutoReply.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.examples.rpc; - -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; -import org.apache.rocketmq.common.message.MessageExt; -import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.consumer.DeFiBusMessageListenerConcurrentlyWithReply; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import cn.webank.defibus.producer.DeFiBusProducer; - -/** - * the example of responder with auto reply - */ -public class ResponseConsumerAutoReply { - public static void main(String[] args) { - DeFiBusClientConfig deFiBusClientConfig = new DeFiBusClientConfig(); - deFiBusClientConfig.setNamesrvAddr(""); - DeFiBusProducer deFiBusProducer = new DeFiBusProducer(deFiBusClientConfig); - DeFiBusPushConsumer deFiBusPushConsumer = new DeFiBusPushConsumer(deFiBusClientConfig); - deFiBusPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET); - deFiBusPushConsumer.getDefaultMQPushConsumer().setMessageModel(MessageModel.CLUSTERING); - deFiBusPushConsumer.registerMessageListener(new DeFiBusMessageListenerConcurrentlyWithReply(deFiBusProducer) { - @Override - public String handleMessage(MessageExt msg, ConsumeConcurrentlyContext context) { - //1. biz handle logic - - //2. create reply content - - return "A reply message content"; - } - }); - try { - deFiBusProducer.start(); - deFiBusPushConsumer.subscribe("REQUEST_REPLY_TOPIC"); - deFiBusPushConsumer.start(); - } catch (MQClientException e) { - e.printStackTrace(); - } finally { - deFiBusProducer.shutdown(); - } - - //shutdown the consumer when application exits. - Runtime.getRuntime().addShutdownHook(new Thread(){ - @Override - public void run() { - deFiBusPushConsumer.shutdown(); - } - }); - - } -} diff --git a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/simple/PubProducer.java b/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/simple/PubProducer.java deleted file mode 100644 index aab3f60776..0000000000 --- a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/simple/PubProducer.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.examples.simple; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.producer.DeFiBusProducer; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.remoting.exception.RemotingException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PubProducer { - private static final Logger logger = LoggerFactory.getLogger(PubProducer.class); - - public static void main(String[] args) throws MQClientException { - DeFiBusClientConfig clientConfig = new DeFiBusClientConfig(); - clientConfig.setClusterPrefix("XL"); - - DeFiBusProducer deFiBusProducer = new DeFiBusProducer(clientConfig); - deFiBusProducer.setNamesrvAddr("127.0.0.1:9876"); - deFiBusProducer.start(); - - String topic = "PublishTopic"; - final String content = "Hello world"; - Message msg = new Message(topic, content.getBytes()); - try { - deFiBusProducer.publish(msg); - } catch (MQClientException | RemotingException | InterruptedException e) { - logger.warn("{}", e); - } finally { - // normally , we only shutdown DeFiBusProducer when the application exits. In this sample, we shutdown the producer when message is sent. - deFiBusProducer.shutdown(); - } - } -} diff --git a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/simple/SubConsumer.java b/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/simple/SubConsumer.java deleted file mode 100644 index 3c8af43441..0000000000 --- a/eventmesh-store/defibus-examples/src/main/java/cn/webank/defibus/examples/simple/SubConsumer.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.examples.simple; - -import java.util.List; - -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; -import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.common.message.MessageExt; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.consumer.DeFiBusMessageListenerConcurrently; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import cn.webank.defibus.producer.DeFiBusProducer; - -public class SubConsumer { - private static final Logger logger = LoggerFactory.getLogger(SubConsumer.class); - - public static void main(String[] args) throws MQClientException { - String topic = "PublishTopic"; - DeFiBusClientConfig deFiBusClientConfig = new DeFiBusClientConfig(); - deFiBusClientConfig.setConsumerGroup("Your-group-name"); - deFiBusClientConfig.setPullBatchSize(32); - deFiBusClientConfig.setThreadPoolCoreSize(12); - deFiBusClientConfig.setClusterPrefix("XL"); - - DeFiBusProducer deFiBusProducer = new DeFiBusProducer(deFiBusClientConfig); - deFiBusProducer.setNamesrvAddr("127.0.0.1:9876"); - deFiBusProducer.start(); - - DeFiBusPushConsumer deFiBusPushConsumer = new DeFiBusPushConsumer(deFiBusClientConfig); - deFiBusPushConsumer.setNamesrvAddr("127.0.0.1:9876"); - deFiBusPushConsumer.registerMessageListener(new DeFiBusMessageListenerConcurrently() { - @Override - public ConsumeConcurrentlyStatus handleMessage(List msgs, ConsumeConcurrentlyContext context) { - for (MessageExt msg : msgs) { - logger.info("begin handle: " + msg.toString()); - } - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - }); - - deFiBusPushConsumer.subscribe(topic); - deFiBusPushConsumer.start(); - - //shutdown the consumer when application exits. - Runtime.getRuntime().addShutdownHook(new Thread(){ - @Override - public void run() { - deFiBusPushConsumer.shutdown(); - } - }); - - } -} diff --git a/eventmesh-store/defibus-examples/src/main/resources/log4j.xml b/eventmesh-store/defibus-examples/src/main/resources/log4j.xml deleted file mode 100644 index e5e5006a47..0000000000 --- a/eventmesh-store/defibus-examples/src/main/resources/log4j.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/defibus-namesrv/.gitignore b/eventmesh-store/defibus-namesrv/.gitignore deleted file mode 100644 index c1285b3799..0000000000 --- a/eventmesh-store/defibus-namesrv/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -/bin/ -/.git/ -/.gradle/ -/.settings/ -/logs -.DS_Store -.*.swp -*.ipr -*.iml -*.iws -*.class -*.log -.idea -build -.classpath -.project -/test-output/ -/dist -/.pmd -/classes -/logs -/out \ No newline at end of file diff --git a/eventmesh-store/defibus-namesrv/build.gradle b/eventmesh-store/defibus-namesrv/build.gradle deleted file mode 100644 index 22807bb8b9..0000000000 --- a/eventmesh-store/defibus-namesrv/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//apply plugin: 'java' - -dependencies { - compile project(":defibus-common") - testCompile project(":defibus-common") - - compile "ch.qos.logback:logback-core:1.2.3" - compile "ch.qos.logback:logback-classic:1.2.3" - - compile "org.apache.rocketmq:rocketmq-broker:$project.rocketmqVersion" - compile "org.apache.rocketmq:rocketmq-namesrv:$project.rocketmqVersion" - compile "org.apache.rocketmq:rocketmq-client:$project.rocketmqVersion" -} \ No newline at end of file diff --git a/eventmesh-store/defibus-namesrv/conf/checkstyle.xml b/eventmesh-store/defibus-namesrv/conf/checkstyle.xml deleted file mode 100644 index 3d024111bc..0000000000 --- a/eventmesh-store/defibus-namesrv/conf/checkstyle.xml +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/defibus-namesrv/src/main/java/cn/webank/defibus/namesrv/DeFiBusNamesrvStartup.java b/eventmesh-store/defibus-namesrv/src/main/java/cn/webank/defibus/namesrv/DeFiBusNamesrvStartup.java deleted file mode 100644 index a35aeeea92..0000000000 --- a/eventmesh-store/defibus-namesrv/src/main/java/cn/webank/defibus/namesrv/DeFiBusNamesrvStartup.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.namesrv; - -import org.apache.rocketmq.namesrv.NamesrvStartup; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.common.MixAll; - -public class DeFiBusNamesrvStartup { - - private static final String DEFAULT_ROCKETMQ_HOME_PATH = "."; - - //init default rocketmq home path. - public static void initRocketMQHomePath() { - String rocketmqHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - if (StringUtils.isBlank(rocketmqHome)) { - System.setProperty(MixAll.ROCKETMQ_HOME_PROPERTY, DEFAULT_ROCKETMQ_HOME_PATH); - } - } - - - public static void main(String[] args) { - NamesrvStartup.main0(args); - } -} diff --git a/eventmesh-store/defibus-tools/.gitignore b/eventmesh-store/defibus-tools/.gitignore deleted file mode 100644 index 404407627e..0000000000 --- a/eventmesh-store/defibus-tools/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -bin -.git -.gradle -.settings -logs -.DS_Store -.*.swp -*.ipr -*.iml -*.iws -*.class -*.log -.idea -build -.classpath -.project -test-output -dist -.pmd -classes -out diff --git a/eventmesh-store/defibus-tools/build.gradle b/eventmesh-store/defibus-tools/build.gradle deleted file mode 100644 index 42f6a2d403..0000000000 --- a/eventmesh-store/defibus-tools/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -apply plugin: 'java' - -dependencies { - compile project(":defibus-common"), project(":defibus-client") - testCompile project(":defibus-common"), project(":defibus-client") - - compile "org.springframework:spring-beans:4.3.9.RELEASE" - compile "ch.qos.logback:logback-core:1.2.3" - compile "ch.qos.logback:logback-classic:1.2.3" - - compile "org.apache.rocketmq:rocketmq-client:$project.rocketmqVersion" - compile "org.apache.rocketmq:rocketmq-srvutil:$project.rocketmqVersion" - compile "org.apache.rocketmq:rocketmq-store:$project.rocketmqVersion" - compile "org.apache.rocketmq:rocketmq-tools:$project.rocketmqVersion" -} \ No newline at end of file diff --git a/eventmesh-store/defibus-tools/conf/checkstyle.xml b/eventmesh-store/defibus-tools/conf/checkstyle.xml deleted file mode 100644 index 3d024111bc..0000000000 --- a/eventmesh-store/defibus-tools/conf/checkstyle.xml +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/admin/DeFiBusAdminExt.java b/eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/admin/DeFiBusAdminExt.java deleted file mode 100644 index 68abd18255..0000000000 --- a/eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/admin/DeFiBusAdminExt.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.tools.admin; - -import org.apache.rocketmq.remoting.RPCHook; -import org.apache.rocketmq.tools.admin.DefaultMQAdminExt; - -public class DeFiBusAdminExt extends DefaultMQAdminExt { - public DeFiBusAdminExt(RPCHook rpcHook, long timeoutMillis) { - super(rpcHook, timeoutMillis); - } -} diff --git a/eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/command/DeFiBusAdminStartup.java b/eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/command/DeFiBusAdminStartup.java deleted file mode 100644 index 561fa431d7..0000000000 --- a/eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/command/DeFiBusAdminStartup.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.tools.command; - -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.joran.JoranConfigurator; -import ch.qos.logback.core.joran.spi.JoranException; -import cn.webank.defibus.tools.command.topic.UpdateTopicPermSubCommand; -import com.alibaba.fastjson.JSONObject; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.common.AclClientRPCHook; -import org.apache.rocketmq.acl.common.AclUtils; -import org.apache.rocketmq.acl.common.SessionCredentials; -import org.apache.rocketmq.common.MQVersion; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.remoting.RPCHook; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.apache.rocketmq.srvutil.ServerUtil; -import org.apache.rocketmq.tools.command.SubCommand; -import org.apache.rocketmq.tools.command.broker.*; -import org.apache.rocketmq.tools.command.cluster.CLusterSendMsgRTCommand; -import org.apache.rocketmq.tools.command.cluster.ClusterListSubCommand; -import org.apache.rocketmq.tools.command.connection.ConsumerConnectionSubCommand; -import org.apache.rocketmq.tools.command.connection.ProducerConnectionSubCommand; -import org.apache.rocketmq.tools.command.consumer.*; -import org.apache.rocketmq.tools.command.message.*; -import org.apache.rocketmq.tools.command.namesrv.*; -import org.apache.rocketmq.tools.command.offset.CloneGroupOffsetCommand; -import org.apache.rocketmq.tools.command.offset.ResetOffsetByTimeCommand; -import org.apache.rocketmq.tools.command.queue.QueryConsumeQueueCommand; -import org.apache.rocketmq.tools.command.stats.StatsAllSubCommand; -import org.apache.rocketmq.tools.command.topic.*; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.List; - -public class DeFiBusAdminStartup { - protected static List subCommandList = new ArrayList(); - - public static void main(String[] args) { - main0(args); - } - - public static void main0(String[] args) { - System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION)); - - initCommand(); - - try { - initLogback(); - switch (args.length) { - case 0: - printHelp(); - break; - case 2: - if (args[0].equals("help")) { - SubCommand cmd = findSubCommand(args[1]); - if (cmd != null) { - Options options = ServerUtil.buildCommandlineOptions(new Options()); - options = cmd.buildCommandlineOptions(options); - if (options != null) { - ServerUtil.printCommandLineHelp("mqadmin " + cmd.commandName(), options); - } - } else { - System.out.printf("The sub command %s not exist.%n", args[1]); - } - break; - } - case 1: - default: - SubCommand cmd = findSubCommand(args[0]); - if (cmd != null) { - String[] subargs = parseSubArgs(args); - - Options options = ServerUtil.buildCommandlineOptions(new Options()); - final CommandLine commandLine = - ServerUtil.parseCmdLine("mqadmin " + cmd.commandName(), subargs, cmd.buildCommandlineOptions(options), - new PosixParser()); - if (null == commandLine) { - return; - } - - if (commandLine.hasOption('n')) { - String namesrvAddr = commandLine.getOptionValue('n'); - System.setProperty(MixAll.NAMESRV_ADDR_PROPERTY, namesrvAddr); - } - - cmd.execute(commandLine, options, getAclRPCHook()); - } else { - System.out.printf("The sub command %s not exist.%n", args[0]); - } - break; - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void initCommand() { - initCommand(new UpdateTopicSubCommand()); - initCommand(new DeleteTopicSubCommand()); - initCommand(new UpdateSubGroupSubCommand()); - initCommand(new DeleteSubscriptionGroupCommand()); - initCommand(new UpdateBrokerConfigSubCommand()); - initCommand(new UpdateTopicPermSubCommand()); - - initCommand(new TopicRouteSubCommand()); - initCommand(new TopicStatusSubCommand()); - initCommand(new TopicClusterSubCommand()); - - initCommand(new BrokerStatusSubCommand()); - initCommand(new QueryMsgByIdSubCommand()); - initCommand(new QueryMsgByKeySubCommand()); - initCommand(new QueryMsgByUniqueKeySubCommand()); - initCommand(new QueryMsgByOffsetSubCommand()); - - initCommand(new PrintMessageSubCommand()); - initCommand(new PrintMessageByQueueCommand()); - initCommand(new SendMsgStatusCommand()); - initCommand(new BrokerConsumeStatsSubCommad()); - - initCommand(new ProducerConnectionSubCommand()); - initCommand(new ConsumerConnectionSubCommand()); - initCommand(new ConsumerProgressSubCommand()); - initCommand(new ConsumerStatusSubCommand()); - initCommand(new CloneGroupOffsetCommand()); - - initCommand(new ClusterListSubCommand()); - initCommand(new TopicListSubCommand()); - - initCommand(new UpdateKvConfigCommand()); - initCommand(new DeleteKvConfigCommand()); - - initCommand(new WipeWritePermSubCommand()); - initCommand(new ResetOffsetByTimeCommand()); - - initCommand(new UpdateOrderConfCommand()); - initCommand(new CleanExpiredCQSubCommand()); - initCommand(new CleanUnusedTopicCommand()); - - initCommand(new StartMonitoringSubCommand()); - initCommand(new StatsAllSubCommand()); - - initCommand(new AllocateMQSubCommand()); - - initCommand(new CheckMsgSendRTCommand()); - initCommand(new CLusterSendMsgRTCommand()); - - initCommand(new GetNamesrvConfigCommand()); - initCommand(new UpdateNamesrvConfigCommand()); - initCommand(new GetBrokerConfigCommand()); - - initCommand(new QueryConsumeQueueCommand()); - initCommand(new SendMessageCommand()); - initCommand(new ConsumeMessageCommand()); - } - - private static void initLogback() throws JoranException { - String rocketmqHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - - LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - JoranConfigurator configurator = new JoranConfigurator(); - configurator.setContext(lc); - lc.reset(); - configurator.doConfigure(rocketmqHome + "/conf/logback_tools.xml"); - } - - private static void printHelp() { - System.out.printf("The most commonly used mqadmin commands are:%n"); - for (SubCommand cmd : subCommandList) { - System.out.printf(" %-20s %s%n", cmd.commandName(), cmd.commandDesc()); - } - - System.out.printf("%nSee 'mqadmin help ' for more information on a specific command.%n"); - } - - private static SubCommand findSubCommand(final String name) { - for (SubCommand cmd : subCommandList) { - if (cmd.commandName().toUpperCase().equals(name.toUpperCase())) { - return cmd; - } - } - - return null; - } - - private static String[] parseSubArgs(String[] args) { - if (args.length > 1) { - String[] result = new String[args.length - 1]; - for (int i = 0; i < args.length - 1; i++) { - result[i] = args[i + 1]; - } - return result; - } - return null; - } - - public static void initCommand(SubCommand command) { - subCommandList.add(command); - } - - public static RPCHook getAclRPCHook() { - String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - String fileName = "/conf/tools.yml"; - JSONObject yamlDataObject = AclUtils.getYamlDataObject(fileHome + fileName, - JSONObject.class); - - if (yamlDataObject == null || yamlDataObject.isEmpty()) { - System.out.printf(" Cannot find conf file %s, acl is not be enabled.%n", fileHome + fileName); - return null; - } - - String accessKey = yamlDataObject.getString("accessKey"); - String secretKey = yamlDataObject.getString("secretKey"); - - if (StringUtils.isBlank(accessKey) || StringUtils.isBlank(secretKey)) { - System.out.printf("AccessKey or secretKey is blank, the acl is not enabled.%n"); - return null; - } - return new AclClientRPCHook(new SessionCredentials(accessKey, secretKey)); - } -} diff --git a/eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/command/topic/UpdateTopicPermSubCommand.java b/eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/command/topic/UpdateTopicPermSubCommand.java deleted file mode 100644 index 0db2518425..0000000000 --- a/eventmesh-store/defibus-tools/src/main/java/cn/webank/defibus/tools/command/topic/UpdateTopicPermSubCommand.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.webank.defibus.tools.command.topic; - -import cn.webank.defibus.tools.admin.DeFiBusAdminExt; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.commons.io.FileUtils; -import org.apache.rocketmq.client.exception.MQBrokerException; -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.TopicConfig; -import org.apache.rocketmq.common.protocol.body.ClusterInfo; -import org.apache.rocketmq.common.protocol.route.BrokerData; -import org.apache.rocketmq.common.protocol.route.QueueData; -import org.apache.rocketmq.common.protocol.route.TopicRouteData; -import org.apache.rocketmq.remoting.RPCHook; -import org.apache.rocketmq.remoting.exception.RemotingConnectException; -import org.apache.rocketmq.remoting.exception.RemotingException; -import org.apache.rocketmq.remoting.exception.RemotingSendRequestException; -import org.apache.rocketmq.remoting.exception.RemotingTimeoutException; -import org.apache.rocketmq.tools.command.SubCommand; - -import java.io.File; -import java.util.*; - -public class UpdateTopicPermSubCommand implements SubCommand { - ClusterInfo clusterInfo = null; - - @Override - public String commandName() { - return "updateTopicPerm"; - } - - @Override - public String commandDesc() { - return "Update topic perm"; - } - - @Override - public Options buildCommandlineOptions(Options options) { - Option opt = new Option("b", "brokerAddr", true, "create topic to which broker"); - opt.setRequired(false); - options.addOption(opt); - - opt = new Option("t", "topic", true, "topic name"); - opt.setRequired(false); - options.addOption(opt); - - opt = new Option("f", "topicList", true, "read the topic list by file path, split with '\\n'"); - opt.setRequired(false); - options.addOption(opt); - - opt = new Option("s", "sleetTime", true, "sleep time between create two topic(ms)"); - opt.setRequired(false); - options.addOption(opt); - - opt = new Option("p", "perm", true, "set topic's permission(2|4|6), intro[2:W; 4:R; 6:RW]"); - opt.setRequired(true); - options.addOption(opt); - - return options; - } - - @Override - public void execute(final CommandLine commandLine, final Options options, RPCHook rpcHook) { - DeFiBusAdminExt deFiBusAdminExt = new DeFiBusAdminExt(rpcHook, 3000L); - deFiBusAdminExt.setInstanceName(Long.toString(System.currentTimeMillis())); - try { - deFiBusAdminExt.start(); - TopicConfig topicConfig = new TopicConfig(); - - long sleepTime = 1000; - if (commandLine.hasOption("s")) { - sleepTime = Long.parseLong(commandLine.getOptionValue("s").trim()); - } - - List topicList = new ArrayList<>(); - if (commandLine.hasOption("t")) { - String[] topicArr = commandLine.getOptionValue("t").trim().split(";"); - topicList = Arrays.asList(topicArr); - } else if (commandLine.hasOption("f")) { - String path = commandLine.getOptionValue("f").trim(); - topicList = FileUtils.readLines(new File(path)); - } - for (String topic : topicList) { - try { - updateTopicPerm(topic, deFiBusAdminExt, topicConfig, sleepTime, commandLine); - } catch (Exception e) { - System.out.println("[WARN] update topic[" + topic + "] perm failed ,exception info: " + e.getMessage()); - try { - updateTopicPerm(topic, deFiBusAdminExt, topicConfig, sleepTime, commandLine); - } catch (Exception e1) { - System.out.println("[WARN] try again ,update topic[" + topic + "] perm failed,exception info: " + e1.getMessage()); - } - } - } -// ServerUtil.printCommandLineHelp("mqadmin " + this.commandName(), options); - } catch (Exception e) { - e.printStackTrace(); - } finally { - deFiBusAdminExt.shutdown(); - } - return; - } - - private void updateTopicPerm(String topic, DeFiBusAdminExt deFiBusAdminExt, TopicConfig topicConfig, long sleepTime, CommandLine commandLine) throws InterruptedException, MQClientException, RemotingException, MQBrokerException { - TopicRouteData topicRouteData = deFiBusAdminExt.examineTopicRouteInfo(topic); - assert topicRouteData != null; - List queueDatas = topicRouteData.getQueueDatas(); - assert queueDatas != null && queueDatas.size() > 0; - - Set brokerAddrs = new HashSet<>(); - if (commandLine.hasOption('b')) { - brokerAddrs.add(commandLine.getOptionValue('b').trim()); - } else { - brokerAddrs = fetchMasterAddrByTopic(deFiBusAdminExt, topic); - } - if (brokerAddrs.size() == 0) { - System.out.println("[WARN] can not get brokerAddr for topic[" + topic + "]"); - return; - } - for (String brokerAddr : brokerAddrs) { - String brokerName = getBrokerNameByBrokerAddr(deFiBusAdminExt, brokerAddr); - QueueData queueData = null; - for (QueueData queueDataTemp : queueDatas) { - if (brokerName.equals(queueDataTemp.getBrokerName())) { - queueData = queueDataTemp; - break; - } - } - if (queueData == null) { - System.out.println("[WARN] topic[" + topic + "] get queueData failed for brokerAddr[" + brokerAddr + "]"); - return; - } - topicConfig.setTopicName(topic); - topicConfig.setWriteQueueNums(queueData.getWriteQueueNums()); - topicConfig.setReadQueueNums(queueData.getReadQueueNums()); - topicConfig.setPerm(queueData.getPerm()); - topicConfig.setTopicSysFlag(queueData.getTopicSynFlag()); - - //new perm - int perm = Integer.parseInt(commandLine.getOptionValue("p").trim()); - int oldPerm = topicConfig.getPerm(); - if (perm == oldPerm) { - System.out.printf("new perm equals to the old one!%n"); - } - topicConfig.setPerm(perm); - deFiBusAdminExt.createAndUpdateTopicConfig(brokerAddr, topicConfig); - Thread.sleep(sleepTime); - System.out.printf("update topic[%s] perm from %s to %s in %s success.%n", topic, oldPerm, perm, brokerAddr); - } - } - - private Set fetchMasterAddrByTopic(DeFiBusAdminExt defaultMQAdminExt, String topic) throws RemotingException, MQClientException, InterruptedException { - Set masterSet = new HashSet<>(); - TopicRouteData topicRouteData = defaultMQAdminExt.examineTopicRouteInfo(topic); - for (BrokerData bd : topicRouteData.getBrokerDatas()) { - String masterAddr = bd.getBrokerAddrs().get(MixAll.MASTER_ID); - if (masterAddr != null) { - masterSet.add(masterAddr); - } else { - System.out.println("there is no master alive in " + bd.getBrokerName() + ", skip this group"); - } - } - - return masterSet; - } - - private String getBrokerNameByBrokerAddr(DeFiBusAdminExt deFiBusAdminExt, String brokerAddr) throws InterruptedException, MQBrokerException, RemotingTimeoutException, RemotingSendRequestException, RemotingConnectException { - String brokerName = null; - if (clusterInfo == null) { - clusterInfo = deFiBusAdminExt.examineBrokerClusterInfo(); - } - Map brokerDataMap = clusterInfo.getBrokerAddrTable(); - for (Map.Entry entry : brokerDataMap.entrySet()) { - Map brokerAddrs = entry.getValue().getBrokerAddrs(); - if (brokerAddrs.containsValue(brokerAddr)) { - brokerName = entry.getKey(); - break; - } - } - if (brokerName == null) { - System.out.println("can not get brokerName for brokerAddr[" + brokerAddr + "]"); - System.exit(-1); - } else { - System.out.println("brokerAddr[" + brokerAddr + "]'s name is " + brokerName); - } - return brokerName; - } -} diff --git a/eventmesh-store/gradle.properties b/eventmesh-store/gradle.properties deleted file mode 100644 index 0b010e9090..0000000000 --- a/eventmesh-store/gradle.properties +++ /dev/null @@ -1,24 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -group=com.webank.defibus -version=1.0.0 -rocketmqVersion=4.4.0 -jdk=1.8 -snapshot=false -mavenUserName= -mavenPassword= -#org.gradle.java.home=C:\\Program Files\\Java\\jdk1.7.0_67 diff --git a/eventmesh-store/releasenotes.txt b/eventmesh-store/releasenotes.txt deleted file mode 100644 index 0d48a10a49..0000000000 --- a/eventmesh-store/releasenotes.txt +++ /dev/null @@ -1,9 +0,0 @@ --------------------------VERSION 1.0.0----------------------------- -1. implement of sync-request producer. -2. dark launch -3. circuit breaker mechanism -4. invoke service nearby -5. (tong cheng duo huo) -6. dynamic adjust queue -7. isolation mechanism -8. fault tolerant \ No newline at end of file diff --git a/eventmesh-store/script/broker_watchdog.sh b/eventmesh-store/script/broker_watchdog.sh deleted file mode 100644 index b0a051b098..0000000000 --- a/eventmesh-store/script/broker_watchdog.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -if [ ! -f "pid.file" ]; then - Result_pid="noPid" -else - Result_pid=`cat pid.file` -fi - - -Result=$(ps -ef|grep DeFiBusBrokerStartup|grep -v grep|grep $Result_pid) -if [ "" == "$Result" ] -then - export LANG=zh_CN.utf8 - export LC_ALL=zh_CN.UTF-8 - export LC_CTYPE=en_US.UTF-8 - ./runbroker.sh -fi diff --git a/eventmesh-store/script/namesrv_watchdog.sh b/eventmesh-store/script/namesrv_watchdog.sh deleted file mode 100644 index 098293677a..0000000000 --- a/eventmesh-store/script/namesrv_watchdog.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -Result=$(ps -ef|grep NamesrvStartup|grep -v grep | awk '{print $2}') -if [ "" == "$Result" ] -then - export LANG=zh_CN.utf8 - export LC_ALL=zh_CN.UTF-8 - export LC_CTYPE=en_US.UTF-8 - ./runnamesrv.sh -fi diff --git a/eventmesh-store/script/runadmin.cmd b/eventmesh-store/script/runadmin.cmd deleted file mode 100644 index 61a11704fe..0000000000 --- a/eventmesh-store/script/runadmin.cmd +++ /dev/null @@ -1,32 +0,0 @@ -@echo off -rem Licensed to the Apache Software Foundation (ASF) under one or more -rem contributor license agreements. See the NOTICE file distributed with -rem this work for additional information regarding copyright ownership. -rem The ASF licenses this file to You under the Apache License, Version 2.0 -rem (the "License"); you may not use this file except in compliance with -rem the License. You may obtain a copy of the License at -rem -rem http://www.apache.org/licenses/LICENSE-2.0 -rem -rem Unless required by applicable law or agreed to in writing, software -rem distributed under the License is distributed on an "AS IS" BASIS, -rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -rem See the License for the specific language governing permissions and -rem limitations under the License. - -if not exist "%JAVA_HOME%\bin\java.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! & EXIT /B 1 - -set "JAVA=%JAVA_HOME%\bin\java.exe" - -setlocal -set BASE_DIR=%~dp0 -set BASE_DIR=%BASE_DIR:~0,-1% -for %%d in (%BASE_DIR%) do set BASE_DIR=%%~dpd -set CLASSPATH=.;%BASE_DIR%conf;%CLASSPATH% -rem =========================================================================================== -rem JVM Configuration -rem =========================================================================================== -set "JAVA_OPT=%JAVA_OPT% -server -Xms1g -Xmx1g -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m" -set "JAVA_OPT=%JAVA_OPT% -Djava.ext.dirs="%BASE_DIR%\lib;%BASE_DIR%\apps";"%JAVA_HOME%\jre\lib\ext"" -set "JAVA_OPT=%JAVA_OPT% -cp "%CLASSPATH%"" -"%JAVA%" %JAVA_OPT% cn.webank.defibus.tools.command.DeFiBusAdminStartup %* \ No newline at end of file diff --git a/eventmesh-store/script/runadmin.sh b/eventmesh-store/script/runadmin.sh deleted file mode 100644 index 4e19a72715..0000000000 --- a/eventmesh-store/script/runadmin.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -#=========================================================================================== -# Java Environment Setting -#=========================================================================================== -TMP_JAVA_HOME="/nemo/jdk8" - -function is_java8 { - local _java="$1" - [[ -x "$_java" ]] || return 1 - [[ "$("$_java" -version 2>&1)" =~ 'java version "1.8' ]] || return 2 - return 0 -} - -if [[ -d "$TMP_JAVA_HOME" ]] && is_java8 "$TMP_JAVA_HOME/bin/java"; then - JAVA="$TMP_JAVA_HOME/bin/java" -elif [[ -d "$JAVA_HOME" ]] && is_java8 "$JAVA_HOME/bin/java"; then - JAVA="$JAVA_HOME/bin/java" -elif is_java8 "/nemo/jdk8/bin/java"; then - JAVA="/nemo/jdk8/bin/java"; -elif is_java8 "/nemo/jdk/bin/java"; then - JAVA="/nemo/jdk/bin/java"; -elif is_java8 "$(which java)"; then - JAVA="$(which java)" -else - echo -e "ERROR\t java(1.8) not found, operation abort." - exit 9; -fi - -echo "admin use java location= "$JAVA - -ROCKETMQ_HOME=`cd "./.." && pwd` -export ROCKETMQ_HOME - - -JAVA_OPTS="-server -Xms256m -Xmx256m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+DisableExplicitGC" -JAVA_OPT="${JAVA_OPT} -Djava.security.egd=file:/dev/./urandom" - - -APP_HOME=../. -APP_MAIN=cn.webank.defibus.tools.command.DeFiBusAdminStartup -CLASSPATH=$APP_HOME/lib:$APP_HOME/apps:$APP_HOME/conf -ARGS="$@" - -for libJar in "$APP_HOME"/lib/*.jar; -do - CLASSPATH="$CLASSPATH":"$libJar" -done - -for appJar in "$APP_HOME"/apps/*.jar; -do - CLASSPATH="$CLASSPATH":"$appJar" -done - -for confFile in "$APP_HOME"/conf/*.*; -do - CLASSPATH="$CLASSPATH":"$confFile" -done -export CLASSPATH -#echo $CLASSPATH -#echo $APP_HOME -#echo $APP_MAIN - -startup(){ - $JAVA $JAVA_OPTS -classpath $CLASSPATH $APP_MAIN $ARGS -} - -if [ ! -d "../logs" ]; then - mkdir ../logs -fi -if [ ! -d "../logs/otherdays" ]; then - mkdir ../logs/otherdays -fi -if [ -f "../logs/tools.log" ]; then -today=`date '+%Y-%m-%d'` -files="tools.log" -for file in $files -do -timestamp=`stat -c %Y ../logs/$file` -fileTime=`date -d @$timestamp '+%Y-%m-%d'` -if [[ $fileTime != $today ]] -then - num=$(ls ../logs/otherdays|grep "tools-$fileTime"|wc -l) - mv ../logs/$file ../logs/otherdays/tools-$fileTime-$num.log -else -filesize=`ls -l ../logs/$file | awk '{ print $5 }'` -maxsize=$((1024*1024*2)) -if [[ $filesize -gt $maxsize ]] -then - num=$(ls ../logs/otherdays|grep "tools-$fileTime"|wc -l) - mv ../logs/$file ../logs/otherdays/tools-$fileTime-$num.log -fi -fi -done -fi -startup $ARGS |tee -a ../logs/tools.log \ No newline at end of file diff --git a/eventmesh-store/script/runbroker.cmd b/eventmesh-store/script/runbroker.cmd deleted file mode 100644 index 3cf476e539..0000000000 --- a/eventmesh-store/script/runbroker.cmd +++ /dev/null @@ -1,37 +0,0 @@ -@echo off -rem Licensed to the Apache Software Foundation (ASF) under one or more -rem contributor license agreements. See the NOTICE file distributed with -rem this work for additional information regarding copyright ownership. -rem The ASF licenses this file to You under the Apache License, Version 2.0 -rem (the "License"); you may not use this file except in compliance with -rem the License. You may obtain a copy of the License at -rem -rem http://www.apache.org/licenses/LICENSE-2.0 -rem -rem Unless required by applicable law or agreed to in writing, software -rem distributed under the License is distributed on an "AS IS" BASIS, -rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -rem See the License for the specific language governing permissions and -rem limitations under the License. - -if not exist "%JAVA_HOME%\bin\java.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! & EXIT /B 1 -set "JAVA=%JAVA_HOME%\bin\java.exe" - -setlocal - -set BASE_DIR=%~dp0 -set BASE_DIR=%BASE_DIR:~0,-1% -for %%d in (%BASE_DIR%) do set BASE_DIR=%%~dpd -set CLASSPATH=.;%BASE_DIR%conf;%CLASSPATH% -set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:PermSize=128m -XX:MaxPermSize=320m" -set "JAVA_OPT=%JAVA_OPT% -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:+DisableExplicitGC -XX:-UseParNewGC" -set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:"%USERPROFILE%\rmq_srv_gc.log" -XX:+PrintGCDetails" -set "JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow" -set "JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages" -set "JAVA_OPT=%JAVA_OPT% -Djava.ext.dirs=%BASE_DIR%lib;%BASE_DIR%apps" -set "JAVA_OPT=%JAVA_OPT% -cp "%CLASSPATH%"" -"%JAVA%" %JAVA_OPT% cn.webank.defibus.broker.DeFiBusBrokerStartup %* - -IF %ERRORLEVEL% EQU 0 ( - ECHO "DeFiBusBroker starts OK" -) \ No newline at end of file diff --git a/eventmesh-store/script/runbroker.sh b/eventmesh-store/script/runbroker.sh deleted file mode 100644 index f86d72b807..0000000000 --- a/eventmesh-store/script/runbroker.sh +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -#=========================================================================================== -# Java Environment Setting -#=========================================================================================== - -TMP_JAVA_HOME="/nemo/jdk8" - -function is_java8 { - local _java="$1" - [[ -x "$_java" ]] || return 1 - [[ "$("$_java" -version 2>&1)" =~ 'java version "1.8' ]] || return 2 - return 0 -} - -#0(not running), 1(is running) -function is_brokerRunning { - local _pid="$1" - local pid=`ps ax | grep -i 'cn.webank.defibus.broker.DeFiBusBrokerStartup' |grep java | grep -v grep | awk '{print $1}'|grep $_pid` - if [ -z "$pid" ] ; then - return 0 - else - return 1 - fi -} - - -if [[ -d "$TMP_JAVA_HOME" ]] && is_java8 "$TMP_JAVA_HOME/bin/java"; then - JAVA="$TMP_JAVA_HOME/bin/java" -elif [[ -d "$JAVA_HOME" ]] && is_java8 "$JAVA_HOME/bin/java"; then - JAVA="$JAVA_HOME/bin/java" -elif is_java8 "/nemo/jdk8/bin/java"; then - JAVA="/nemo/jdk8/bin/java"; -elif is_java8 "/nemo/jdk1.8/bin/java"; then - JAVA="/nemo/jdk1.8/bin/java"; -elif is_java8 "/nemo/jdk/bin/java"; then - JAVA="/nemo/jdk/bin/java"; -elif is_java8 "$(which java)"; then - JAVA="$(which java)" -else - echo -e "ERROR\t java(1.8) not found, operation abort." - exit 9; -fi - -echo "broker use java location= "$JAVA - -ROCKETMQ_HOME=`cd "./.." && pwd` - -error_exit () -{ - echo "ERROR: $1 !!" - exit 1 -} - -export ROCKETMQ_HOME -export JAVA_HOME -#export JAVA="$JAVA_HOME/bin/java" -export BASE_DIR=$(dirname $0)/.. -export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH} - -#=========================================================================================== -# JVM Configuration -#=========================================================================================== -JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" -JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:MaxGCPauseMillis=50" -JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy" -JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" -JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow" -JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch" -JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g" -JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking" -JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib:${BASE_DIR}/apps" -#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n" -JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}" -JAVA_OPT="${JAVA_OPT} -Djava.security.egd=file:/dev/./urandom" - -if [ -f "pid.file" ]; then - pid=`cat pid.file` - if ! is_brokerRunning "$pid"; then - echo "broker is running already" - exit 9; - else - echo "err pid$pid, rm pid.file" - rm pid.file - fi -fi - - -nohup $JAVA ${JAVA_OPT} cn.webank.defibus.broker.DeFiBusBrokerStartup -c ../conf/broker.properties 2>&1 >/dev/null & -echo $!>pid.file diff --git a/eventmesh-store/script/runbroker_cloud.sh b/eventmesh-store/script/runbroker_cloud.sh deleted file mode 100644 index efafa39f5f..0000000000 --- a/eventmesh-store/script/runbroker_cloud.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#=========================================================================================== -# Java Environment Setting -#=========================================================================================== - -TMP_JAVA_HOME="/nemo/jdk8" - -function is_java8 { - local _java="$1" - [[ -x "$_java" ]] || return 1 - [[ "$("$_java" -version 2>&1)" =~ 'java version "1.8' ]] || return 2 - return 0 -} - -#0(not running), 1(is running) -function is_brokerRunning { - local _pid="$1" - local pid=`ps ax | grep -i 'cn.webank.defibus.broker.DeFiBusBrokerStartup' |grep java | grep -v grep | awk '{print $1}'|grep $_pid` - if [ -z "$pid" ] ; then - return 0 - else - return 1 - fi -} - - -if [[ -d "$TMP_JAVA_HOME" ]] && is_java8 "$TMP_JAVA_HOME/bin/java"; then - JAVA="$TMP_JAVA_HOME/bin/java" -elif [[ -d "$JAVA_HOME" ]] && is_java8 "$JAVA_HOME/bin/java"; then - JAVA="$JAVA_HOME/bin/java" -elif is_java8 "/nemo/jdk8/bin/java"; then - JAVA="/nemo/jdk8/bin/java"; -elif is_java8 "/nemo/jdk1.8/bin/java"; then - JAVA="/nemo/jdk1.8/bin/java"; -elif is_java8 "/nemo/jdk/bin/java"; then - JAVA="/nemo/jdk/bin/java"; -elif is_java8 "$(which java)"; then - JAVA="$(which java)" -else - echo -e "ERROR\t java(1.8) not found, operation abort." - exit 9; -fi - -echo "broker use java location= "$JAVA - -ROCKETMQ_HOME=`cd "./.." && pwd` - -error_exit () -{ - echo "ERROR: $1 !!" - exit 1 -} - -export ROCKETMQ_HOME -export JAVA_HOME -#export JAVA="$JAVA_HOME/bin/java" -export BASE_DIR=$(dirname $0)/.. -export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH} - -#=========================================================================================== -# JVM Configuration -#=========================================================================================== -JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g" -JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:MaxGCPauseMillis=50" -JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy" -JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" -JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow" -JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch" -JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=1g" -JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking" -JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib:${BASE_DIR}/apps" -#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n" -JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}" -JAVA_OPT="${JAVA_OPT} -Djava.security.egd=file:/dev/./urandom" - -if [ -f "pid.file" ]; then - pid=`cat pid.file` - if ! is_brokerRunning "$pid"; then - echo "broker is running already" - exit 9; - else - echo "err pid$pid, rm pid.file" - rm pid.file - fi -fi - - -nohup $JAVA ${JAVA_OPT} cn.webank.defibus.broker.DeFiBusBrokerStartup -c ../conf/broker.properties 2>&1 >/dev/null & -echo $!>pid.file diff --git a/eventmesh-store/script/runnamesrv.cmd b/eventmesh-store/script/runnamesrv.cmd deleted file mode 100644 index b3344addd0..0000000000 --- a/eventmesh-store/script/runnamesrv.cmd +++ /dev/null @@ -1,37 +0,0 @@ -@echo off -rem Licensed to the Apache Software Foundation (ASF) under one or more -rem contributor license agreements. See the NOTICE file distributed with -rem this work for additional information regarding copyright ownership. -rem The ASF licenses this file to You under the Apache License, Version 2.0 -rem (the "License"); you may not use this file except in compliance with -rem the License. You may obtain a copy of the License at -rem -rem http://www.apache.org/licenses/LICENSE-2.0 -rem -rem Unless required by applicable law or agreed to in writing, software -rem distributed under the License is distributed on an "AS IS" BASIS, -rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -rem See the License for the specific language governing permissions and -rem limitations under the License. - -if not exist "%JAVA_HOME%\bin\java.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! & EXIT /B 1 -set "JAVA=%JAVA_HOME%\bin\java.exe" - -setlocal - -set BASE_DIR=%~dp0 -set BASE_DIR=%BASE_DIR:~0,-1% -for %%d in (%BASE_DIR%) do set BASE_DIR=%%~dpd -set CLASSPATH=.;%BASE_DIR%conf;%CLASSPATH% -set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:PermSize=128m -XX:MaxPermSize=320m" -set "JAVA_OPT=%JAVA_OPT% -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:+DisableExplicitGC -XX:-UseParNewGC" -set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:"%USERPROFILE%\rmq_srv_gc.log" -XX:+PrintGCDetails" -set "JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow" -set "JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages" -set "JAVA_OPT=%JAVA_OPT% -Djava.ext.dirs=%BASE_DIR%lib;%BASE_DIR%apps" -set "JAVA_OPT=%JAVA_OPT% -cp "%CLASSPATH%"" -"%JAVA%" %JAVA_OPT% cn.webank.defibus.namesrv.DeFiBusNamesrvStartup -c ../conf/broker.properties %* - -IF %ERRORLEVEL% EQU 0 ( - ECHO "DeFiBusNamesrv starts OK" -) \ No newline at end of file diff --git a/eventmesh-store/script/runnamesrv.sh b/eventmesh-store/script/runnamesrv.sh deleted file mode 100644 index f4395dab46..0000000000 --- a/eventmesh-store/script/runnamesrv.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#=========================================================================================== -# Java Environment Setting -#=========================================================================================== -TMP_JAVA_HOME="/nemo/jdk8" - -function is_java8 { - local _java="$1" - [[ -x "$_java" ]] || return 1 - [[ "$("$_java" -version 2>&1)" =~ 'java version "1.8' ]] || return 2 - return 0 -} - -if [[ -d "$TMP_JAVA_HOME" ]] && is_java8 "$TMP_JAVA_HOME/bin/java"; then - JAVA="$TMP_JAVA_HOME/bin/java" -elif [[ -d "$JAVA_HOME" ]] && is_java8 "$JAVA_HOME/bin/java"; then - JAVA="$JAVA_HOME/bin/java" -elif is_java8 "/nemo/jdk8/bin/java"; then - JAVA="/nemo/jdk8/bin/java"; -elif is_java8 "/nemo/jdk1.8/bin/java"; then - JAVA="/nemo/jdk1.8/bin/java"; -elif is_java8 "/nemo/jdk/bin/java"; then - JAVA="/nemo/jdk/bin/java"; -elif is_java8 "$(which java)"; then - JAVA="$(which java)" -else - echo -e "ERROR\t java(1.8) not found, operation abort.">>read.me - exit 9; -fi - -echo "nameSrv use java location= "$JAVA - - -ROCKETMQ_HOME=`cd "./.." && pwd` - -error_exit () -{ - echo "ERROR: $1 !!" - exit 1 -} - - -export ROCKETMQ_HOME -#export JAVA_HOME -#export JAVA="$JAVA_HOME/bin/java" -export BASE_DIR=$(dirname $0)/.. -export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH} - -#=========================================================================================== -# JVM Configuration -#=========================================================================================== -JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g" -JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:-UseBiasedLocking -XX:+AlwaysPreTouch -XX:SoftRefLRUPolicyMSPerMB=0" -JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy" -JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" -JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow" -JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch" -JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib:${BASE_DIR}/apps" -#JAVA_OPT="${JAVA_OPT} -Dio.netty.recycler.maxCapacity.default=0" -#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n" -JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}" -JAVA_OPT="${JAVA_OPT} -Djava.security.egd=file:/dev/./urandom" - -nohup $JAVA ${JAVA_OPT} cn.webank.defibus.namesrv.DeFiBusNamesrvStartup -c ../conf/namesrv.properties 2>&1 >/dev/null & - -echo "Now Add crontab...." -crontab -l | grep -v namesrv_watchdog > tmp_crontab.txt -dir=`pwd` -echo "*/1 * * * * cd $dir; ./namesrv_watchdog.sh >/dev/null 2>&1" >> tmp_crontab.txt -crontab tmp_crontab.txt -rm tmp_crontab.txt \ No newline at end of file diff --git a/eventmesh-store/script/stop.cmd b/eventmesh-store/script/stop.cmd deleted file mode 100644 index 6c2ad3f800..0000000000 --- a/eventmesh-store/script/stop.cmd +++ /dev/null @@ -1,35 +0,0 @@ -@echo off -rem Licensed to the Apache Software Foundation (ASF) under one or more -rem contributor license agreements. See the NOTICE file distributed with -rem this work for additional information regarding copyright ownership. -rem The ASF licenses this file to You under the Apache License, Version 2.0 -rem (the "License"); you may not use this file except in compliance with -rem the License. You may obtain a copy of the License at -rem -rem http://www.apache.org/licenses/LICENSE-2.0 -rem -rem Unless required by applicable law or agreed to in writing, software -rem distributed under the License is distributed on an "AS IS" BASIS, -rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -rem See the License for the specific language governing permissions and -rem limitations under the License. - -if not exist "%JAVA_HOME%\bin\jps.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! & EXIT /B 1 - -setlocal - -set "PATH=%JAVA_HOME%\bin;%PATH%" - -if /I "%1" == "broker" ( - echo killing broker - for /f "tokens=1" %%i in ('jps -m ^| find "DeFiBusBrokerStartup"') do ( taskkill /F /PID %%i ) - echo Done! -) else if /I "%1" == "namesrv" ( - echo killing name server - - for /f "tokens=1" %%i in ('jps -m ^| find "DeFiBusNamesrvStartup"') do ( taskkill /F /PID %%i ) - - echo Done! -) else ( - echo Unknown role to kill, please specify broker or namesrv -) \ No newline at end of file diff --git a/eventmesh-store/script/stop.sh b/eventmesh-store/script/stop.sh deleted file mode 100644 index d4dfb13ded..0000000000 --- a/eventmesh-store/script/stop.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -echo "Now removing crontab....." -crontab -l | grep -v broker_watchdog | grep -v namesrv_watchdog > tmp_crontab.txt -crontab tmp_crontab.txt -rm -f tmp_crontab.txt -echo "Finish...." - -case $1 in - broker) - - pid=`ps ax | grep -i 'cn.webank.defibus.broker.DeFiBusBrokerStartup' |grep java | grep -v grep | awk '{print $1}'` - if [ -z "$pid" ] ; then - echo "No DeFiBusBroker running." - exit -1; - fi - - if [ "$2" != "-f" ] ; then - echo "read from pid.file" - pid=`cat pid.file` - fi - - echo "The DeFiBusBroker(${pid}) is running..." - kill ${pid} - - echo "Send shutdown request to DeFiBusBroker(${pid}) OK" - - # wait for broker to shutdown - while ps -p ${pid} > /dev/null 2>&1; do sleep 1; echo "waiting broker process ${pid} to exit."; done; - - rm -rf pid.file - - echo "broker process exits." - ;; - namesrv) - - pid=`ps ax | grep -i 'cn.webank.defibus.namesrv.DeFiBusNameSrvStartup' |grep java | grep -v grep | awk '{print $1}'` - if [ -z "$pid" ] ; then - echo "No DeFiBusNameSrv running." - exit -1; - fi - - echo "The DeFiBusNameSrv(${pid}) is running..." - - kill ${pid} - - echo "Send shutdown request to DeFiBusNameSrv(${pid}) OK" - ;; - *) - echo "Useage: `basename $0` (broker|namesrv)" -esac \ No newline at end of file diff --git a/eventmesh-store/settings.gradle b/eventmesh-store/settings.gradle deleted file mode 100644 index 28900ab3ab..0000000000 --- a/eventmesh-store/settings.gradle +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -rootProject.name = 'eventmesh-store' -String jdkVersion = "${jdk}" -if (jdkVersion.equals('1.7')) { - include 'defibus-common', 'defibus-client', 'defibus-tools' -} else { - include 'defibus-common', 'defibus-client', 'defibus-tools', 'defibus-broker', 'defibus-namesrv', 'defibus-examples' -} - - diff --git a/settings.gradle b/settings.gradle index 85cd45b52e..e12f08c4e4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -18,10 +18,7 @@ rootProject.name = 'EventMesh' String jdkVersion = "${jdk}" include 'eventmesh-emesher' -include 'eventmesh-governance' include 'eventmesh-registry' -include 'eventmesh-acl' -include 'eventmesh-store' include 'eventmesh-sdk-java' include 'eventmesh-common' From ca46e8ccc993caac5f007a21a2d0a5f3a7964fe5 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Tue, 18 Aug 2020 11:47:21 +0800 Subject: [PATCH 05/26] doc --- .../eventmesh-store-quickstart.md | 48 +++++++++++++++++++ docs/en/instructions/quickstart.md | 3 +- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 docs/en/instructions/eventmesh-store-quickstart.md diff --git a/docs/en/instructions/eventmesh-store-quickstart.md b/docs/en/instructions/eventmesh-store-quickstart.md new file mode 100644 index 0000000000..adf9717aeb --- /dev/null +++ b/docs/en/instructions/eventmesh-store-quickstart.md @@ -0,0 +1,48 @@ +# Eventmesh-store Quick start Instruction + +### dependencies +``` +64bit OS, Linux/Unix is recommended; +64bit JDK 1.8+; +Gradle at least 5.6; +4g+ free disk for eventmesh-store server +``` + +### download and build with sources + +download source code from [https://github.com/WeBankFinTech/DeFiBus](https://github.com/WeBankFinTech/DeFiBus) +You will get 'DefiBus-master.zip' + +**build eventmesh-store** +The eventmesh-store takes DeFiBus for example at the follwing parts, because eventmesh depends on defibus as store layer by default, other implements such as Rocketmq etc. is coming soon. + +``` +unzip DefiBus-master.zip +cd /*YOUR DEPLOY PATH*/DefiBus-master +gradle clean dist tar -x test +``` +You will get **DeFiBus_1.0.0.tar.gz** in directory /* YOUR DEPLOY PATH */DefiBus-master/build + +### Deployment + +- deploy DeFiBusNamesrv +``` +upload DeFiBus_1.0.0.tar.gz +tar -zxvf DeFiBus_1.0.0.tar.gz +cd bin +sh runnamesrv.sh +``` +If you see "Thre Name Server boot success" in ../logs/namesrv.log, you setup DeFiBus Namesrv successfully. + +- deploy DeFiBusBroker +``` +upload DeFiBus_1.0.0.tar.gz +tar -zxvf DeFiBus_1.0.0.tar.gz +cd conf +config your broker.properties +cd ../bin +sh runbroker.sh +``` +If you see "The broker \[YOUR-BROKER-NAME, IP:PORT\] boot success." in ../logs/broker.log, +you setup eventmesh-store successfully. + diff --git a/docs/en/instructions/quickstart.md b/docs/en/instructions/quickstart.md index f0e54f1e40..ebd541686f 100644 --- a/docs/en/instructions/quickstart.md +++ b/docs/en/instructions/quickstart.md @@ -13,7 +13,8 @@ download source code from [https://github.com/WeBankFinTech/EventMesh](https://g You will get 'EventMesh-master.zip' To setup an eventmesh, you need to deploy the following components at least: eventmesh-emesher. -**Step 1.** prepare the rocketmq/defibus runtime +**Step 1.** prepare eventmesh-store runtime +Read more [here](./eventmesh-store-quickstart.md) **Step 2.** build eventmesh-emesher ```$xslt From 3770ff4552378e82f2bdf99a43b24b838adcbd41 Mon Sep 17 00:00:00 2001 From: lrhkobe Date: Tue, 18 Aug 2020 16:28:32 +0800 Subject: [PATCH 06/26] fix: performance improvement,reduce cost time in message transformation --- .../webank/emesher/configuration/CommonConfiguration.java | 8 ++++++++ .../protocol/tcp/client/group/ClientGroupWrapper.java | 4 ++-- .../protocol/tcp/client/session/send/SessionSender.java | 2 +- .../protocol/tcp/client/task/MessageTransferTask.java | 4 ++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java index 3195c05899..9161d3662a 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java @@ -17,6 +17,7 @@ package cn.webank.emesher.configuration; +import cn.webank.emesher.util.ProxyUtil; import com.google.common.base.Preconditions; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,7 @@ public class CommonConfiguration { public Integer rebalanceInterval = 20 * 1000; public Integer proxyRegisterIntervalInMills = 10 * 1000; public Integer proxyFetchRegistryAddrInterval = 10 * 1000; + public String proxyServerIp = null; protected ConfigurationWraper configurationWraper; public CommonConfiguration(ConfigurationWraper configurationWraper) { @@ -158,6 +160,10 @@ public void init() { rebalanceInterval = Integer.valueOf(clientRebalanceIntervalIntervalStr); } + proxyServerIp = configurationWraper.getProp(ConfKeys.KEYS_PROXY_SERVER_HOST_IP); + if(StringUtils.isBlank(proxyServerIp)) { + proxyServerIp = ProxyUtil.getLocalAddr(); + } } static class ConfKeys { @@ -205,6 +211,8 @@ static class ConfKeys { public static String KEYS_PROXY_DEFIBUS_CLIENT_REBALANCE_INTERVEL = "proxy.server.defibus.client.rebalanceInterval"; + public static String KEYS_PROXY_SERVER_HOST_IP = "proxy.server.hostIp"; + public static String KEYS_PROXY_SERVER_REGISTER_INTERVAL = "proxy.server.registry.registerIntervalInMills"; public static String KEYS_PROXY_SERVER_FETCH_REGISTRY_ADDR_INTERVAL = "proxy.server.registry.fetchRegistryAddrIntervalInMills"; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java index 8b0f9e695d..a17481c6b9 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java @@ -408,7 +408,7 @@ public ProxyConsumeConcurrentlyStatus handleMessage(MessageExt msg, ConsumeMessa proxyTcpMonitor.getMq2proxyMsgNum().incrementAndGet(); String topic = msg.getTopic(); msg.putUserProperty(ProxyConstants.REQ_MQ2PROXY_TIMESTAMP, String.valueOf(System.currentTimeMillis())); - msg.putUserProperty(ProxyConstants.REQ_RECEIVE_PROXY_IP, ProxyUtil.getLocalAddr()); + msg.putUserProperty(ProxyConstants.REQ_RECEIVE_PROXY_IP, accessConfiguration.proxyServerIp); msg.putUserProperty(ProxyConstants.BORN_TIMESTAMP, String.valueOf(msg.getBornTimestamp())); msg.putUserProperty(ProxyConstants.STORE_TIMESTAMP, String.valueOf(msg.getStoreTimestamp())); @@ -496,7 +496,7 @@ public ProxyConsumeConcurrentlyStatus handleMessage(MessageExt msg, ConsumeMessa String topic = msg.getTopic(); msg.putUserProperty(ProxyConstants.REQ_MQ2PROXY_TIMESTAMP, String.valueOf(System.currentTimeMillis())); - msg.putUserProperty(ProxyConstants.REQ_RECEIVE_PROXY_IP, ProxyUtil.getLocalAddr()); + msg.putUserProperty(ProxyConstants.REQ_RECEIVE_PROXY_IP, accessConfiguration.proxyServerIp); msg.putUserProperty(ProxyConstants.BORN_TIMESTAMP, String.valueOf(msg.getBornTimestamp())); msg.putUserProperty(ProxyConstants.STORE_TIMESTAMP, String.valueOf(msg.getStoreTimestamp())); diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java index e262da4637..cba8c2d01e 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java @@ -127,7 +127,7 @@ public void onSuccess(Message msg) { .getStoreTimestamp())); } msg.putUserProperty(ProxyConstants.RSP_MQ2PROXY_TIMESTAMP, String.valueOf(System.currentTimeMillis())); - msg.putUserProperty(ProxyConstants.RSP_RECEIVE_PROXY_IP, ProxyUtil.getLocalAddr()); + msg.putUserProperty(ProxyConstants.RSP_RECEIVE_PROXY_IP, session.getAccessConfiguration().proxyServerIp); session.getClientGroupWrapper().get().getProxyTcpMonitor().getMq2proxyMsgNum().incrementAndGet(); Command cmd; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java index 7049039d4d..781fd0f87d 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java @@ -111,11 +111,11 @@ private void addTimestamp(AccessMessage accessMessage, Command cmd, long sendTim if (cmd.equals(RESPONSE_TO_SERVER)) { accessMessage.getProperties().put(ProxyConstants.RSP_C2PROXY_TIMESTAMP, String.valueOf(startTime)); accessMessage.getProperties().put(ProxyConstants.RSP_PROXY2MQ_TIMESTAMP, String.valueOf(sendTime)); - accessMessage.getProperties().put(ProxyConstants.RSP_SEND_PROXY_IP, ProxyUtil.getLocalAddr()); + accessMessage.getProperties().put(ProxyConstants.RSP_SEND_PROXY_IP, proxyTCPServer.getAccessConfiguration().proxyServerIp); } else { accessMessage.getProperties().put(ProxyConstants.REQ_C2PROXY_TIMESTAMP, String.valueOf(startTime)); accessMessage.getProperties().put(ProxyConstants.REQ_PROXY2MQ_TIMESTAMP, String.valueOf(sendTime)); - accessMessage.getProperties().put(ProxyConstants.REQ_SEND_PROXY_IP, ProxyUtil.getLocalAddr()); + accessMessage.getProperties().put(ProxyConstants.REQ_SEND_PROXY_IP, proxyTCPServer.getAccessConfiguration().proxyServerIp); } } From ab2020cb98b353cf1af32b1d076ce524ea5f8e33 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Tue, 18 Aug 2020 18:02:52 +0800 Subject: [PATCH 07/26] complete zh_Ch doc --- CONTRIBUTING.md | 2 +- CONTRIBUTING.zh-CN.md | 70 +++++++++++ README.md | 12 +- README.zh-CN.md | 44 +++++++ .../eventmesh-emesher-quickstart.zh-CN.md | 32 +++++ .../eventmesh-sdk-java-quickstart.zh-CN.md | 118 ++++++++++++++++++ .../eventmesh-store-quickstart.zh-CN.md | 44 +++++++ docs/cn/instructions/quickstart.zh-CN.md | 17 +++ docs/cn/quickstart.md | 36 ------ .../eventmesh-emesher-quickstart.md | 10 +- .../eventmesh-sdk-java-quickstart.md | 1 - .../eventmesh-store-quickstart.md | 9 +- docs/en/instructions/quickstart.md | 33 +---- 13 files changed, 346 insertions(+), 82 deletions(-) create mode 100644 CONTRIBUTING.zh-CN.md create mode 100644 README.zh-CN.md create mode 100644 docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md create mode 100644 docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md create mode 100644 docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md create mode 100644 docs/cn/instructions/quickstart.zh-CN.md delete mode 100644 docs/cn/quickstart.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c03c59a0bc..de1080bc63 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,7 +32,7 @@ Here are the workflow for contributors: 7. Create a pull request Please follow [the pull request template](./.github/PULL_REQUEST_TEMPLATE.md). -Please make sure the PR has a corresponding issue. +Please make sure the PR has a corresponding issue. [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) After creating a PR, one or more reviewers will be assigned to the pull request. The reviewers will review the code. diff --git a/CONTRIBUTING.zh-CN.md b/CONTRIBUTING.zh-CN.md new file mode 100644 index 0000000000..29e6367267 --- /dev/null +++ b/CONTRIBUTING.zh-CN.md @@ -0,0 +1,70 @@ +# 贡献给EventMesh + +欢迎使用EventMesh! 本文档是有关如何为EventMesh做出贡献的指南。 +如果发现不正确或缺失的内容,请留下评论/建议。 + +## 开始之前 + +### 设置您的开发环境 + +您应该在操作系统中安装了JDK。 + +## 贡献 + +无论是对于拼写错误,BUG修复还是重要的新功能,我们总是很乐意为您做出贡献。 +请不要犹豫,提出问题或发送请求请求。 + +我们非常重视文档以及与其他项目的集成。 +我们很高兴接受这些方面的改进。 + +### GitHub工作流程 + +我们将`develop`分支用作开发分支,这表明这是一个不稳定的分支。 + +这是贡献者的工作流程 : + +1.Fork到您个人仓库 +2.克隆到本地存储库 +3.创建一个新分支并对其进行处理 +4.保持分支同步 +5.提交您的更改(确保您的提交消息简明扼要) +6.将您的提交推送到分叉的存储库 +7.创建PR合并请求 + +请遵循[Pull Requests模板](./.github/PULL_REQUEST_TEMPLATE.md). +请确保PR对应有相应的问题. [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) + +创建PR后,将为拉取请求分配一个或多个审阅者。 +审阅者将审阅代码。 + +在合并PR之前,请压缩所有修订审阅反馈,拼写错误,合并的内容和基于基础的提交内容。 +最终的提交消息应该清晰简洁。 + +### 打开问题/ PR + +我们将使用Issues和Pull Requests作为跟踪器 +[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) +[Pull Requests](https://github.com/WeBankFinTech/EventMesh/pulls) + +如果您在文档中发现拼写错误,在代码中发现错误,想要新功能或提出建议, +您可以提出问题[在GitHub上打开问题](https://github.com/WeBankFinTech/EventMesh/issues/new) +请按照问题模板中的准则消息进行操作。 + +如果您想贡献,请遵循[贡献工作流程](#github-workflow)并创建一个新的拉取请求。 +如果您的PR包含较大的更改,例如组件重构或新组件,请写详细文档 +有关其设计和使用的信息。 + +请注意,单个拉取请求不应太大。如果需要进行重大更改,最好将更改分开 +到一些个人PR。 + +### 代码审查 + +所有代码应由一个或多个提交者进行良好的审查。一些原则: + +- 可读性: 重要代码应有详细记录。符合我们的代码风格 +- 优雅: 新功能,类或组件应经过精心设计 +- 可测试性: 重要代码应经过良好测试(较高的单元测试覆盖率) + +## 社区 + +### 联系我们 \ No newline at end of file diff --git a/README.md b/README.md index 61bda75926..0563b47152 100644 --- a/README.md +++ b/README.md @@ -18,19 +18,23 @@ General functions of the event grid: * Dynamic routing; * Cloud native +Dependent components: +* defibus : a distributed messaging platform with low latency, high performance and reliability, flexible scalability. [DefiBus](https://github.com/WeBankFinTech/DeFiBus) + Key components: * eventmesh-emesher : an middleware to transmit events between event producers and consumers, support cloud native apps and microservices * eventmesh-sdk-java : support for popular open standard protocols and APIs, including REST/HTTP, AMQP, MQTT, Websocket and JMS, gRPC etc. -* eventmesh-registry : automatically routes events between applications and services connected to seperate event meshers +* eventmesh-registry : automatically routes events between applications and services connected to seperate event meshers, manage eventmesh-emesher ## Quick Start 1. Build and deploy eventmesh-emesher, see instruction ['eventmesh-emesher quickstart'](docs/en/instructions/eventmesh-emesher-quickstart.md). 2. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](docs/en/instructions/eventmesh-sdk-java-quickstart.md). ## Contributing -Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines. +Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines -You can start with the issues labeled with good first issue. +You can start with the issues labeled with good first issue. +[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) ## License [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) Copyright (C) Apache Software Foundation @@ -38,6 +42,6 @@ You can start with the issues labeled with good first issue. ## Contacts WeChat group: -![wechat_qr](./docs/images/mesh-helper.png) +![wechat_qr](docs/images/mesh-helper.png) diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000000..fd0126755c --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,44 @@ +[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh) +[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master) +[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases) +[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) + +## 什么是Event Mesh? +该图显示了Event Mesh相对于应用程序框架中其他类似技术(例如Service Mesh)的定位. +![architecture1](docs/images/eventmesh-define.png) + +Event Mesh是一个动态的插件式云原生基础服务层,用于分离应用程序和中间件层。它提供了灵活,可靠和快速的事件分发,并且可以进行管理 +下图显示了Event Mesh的体系结构: +![architecture2](docs/images/eventmesh-arch.png) + +Event Mesh允许将来自一个应用程序的事件动态路由到任何其他应用程序. +Event Mesh的一般功能: +* 事件驱动; +* 事件治理; +* 动态路由; +* 云原生 + +依赖部件: +* defibus:具有低延迟,高性能和可靠性,和灵活可伸缩性的分布式消息传递平台 [DefiBus](https://github.com/WeBankFinTech/DeFiBus) + +关键部件: +* eventmesh-emesher:一种中间件,用于在事件产生者和使用者之间传输事件,支持云原生应用程序和微服务 +* eventmesh-sdk-java:支持流行的开放标准协议和API,包括REST / HTTP,AMQP,MQTT,Websocket和JMS,gRPC等 +* eventmesh-registry:自动在连接到单独事件网格器的应用程序和服务之间路由事件, 管理emesher + +## 快速开始 +1.构建并部署eventmesh-emesher,请参见说明['eventmesh-emesher quickstart'](docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md) +2.运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart'](docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md) + +## 贡献 +永远欢迎捐款!请参阅[贡献](CONTRIBUTING.zh-CN.md)了解详细指南 + +您可以从问题开始. +[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) + +## License +[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) Copyright (C) Apache Software Foundation + +## 联系人 +微信群: +![wechat_qr](docs/images/mesh-helper.png) \ No newline at end of file diff --git a/docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md new file mode 100644 index 0000000000..2f95577eea --- /dev/null +++ b/docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md @@ -0,0 +1,32 @@ +#Eventmesh-emesher快速入门说明 + +###依赖 +``` +建议使用64位操作系统,建议使用Linux / Unix; +64位JDK 1.8+; +Gradle至少为5.6; +``` + +###下载源码 +[https://github.com/WeBankFinTech/EventMesh](https://github.com/WeBankFinTech/EventMesh) +您将获得**EventMesh-master.zip** + +###构建源码 +```$ xslt +unzip EventMesh-master.zip +cd / *您的部署路径* /EventMesh-master/eventmesh-emesher +gradle clean tar -x test +``` +您将在目录/ *您的部署路径* /EventMesh-master/eventmesh-emesher/dist中获得**eventmesh-emesher_1.0.0.tar.gz** + +###部署 +-部署eventmesn-emesher +```$ xslt +upload eventmesh-emesher_1.0.0.tar.gz +tar -zxvf eventmesh-emesher_1.0.0.tar.gz +cd bin +配置 proxy.properties +cd ../bin +sh start.sh +``` +如果看到"ProxyTCPServer[port=10000] started....",则说明设置成功。 \ No newline at end of file diff --git a/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md new file mode 100644 index 0000000000..aa255bf1ea --- /dev/null +++ b/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md @@ -0,0 +1,118 @@ +##如何运行eventmesh-sdk-java演示 + +> Eventmesh-sdk-java作为客户端,与eventmesh-emesher通信,用于完成消息的发送和接收。 +> +> Eventmesh-sdk-java支持同步消息,异步消息和广播消息。同步消息表示生产者发送消息,需要消费者提供响应消息;异步消息表示生产者只发送消息,不关心回复消息。广播消息表示生产者发送一次消息,所有订阅广播主题的消费者都将收到消息。味精 +> +> Eventmesh-sdk-java支持HTTP和TCP协议。 + + +### 1. TCP DEMO + +####同步消息 + +- 创建主题 + +``` +sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} +``` + + + +*启动消费者,订阅上一步骤已经创建的Topic + +``` +运行cn.webank.eventmesh.client.tcp.demo.SyncResponse的主要方法 +``` + + + +启动发送端,发送消息 + +``` +运行cn.webank.eventmesh.client.tcp.demo.SyncRequest的主要方法 +``` + + + +####异步消息 + +- 创建主题 + +``` +sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} +``` + + + +- 启动消费者,订阅上一步骤已经创建的Topic + +``` +运行cn.webank.eventmesh.client.tcp.demo.AsyncSubscribe的主要方法 +``` + + + +启动发送端,发送消息 + +``` +运行cn.webank.eventmesh.client.tcp.demo.AsyncPublish的主要方法 +``` + + + +####广播消息 + +- 创建主题 + +``` +sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} +``` + + + +- 启动消费端,订阅上一步骤已经创建的Topic + +``` +运行cn.webank.eventmesh.client.tcp.demo.AsyncSubscribeBroadcast的主要方法 +``` + + + +*启动发送端,发送广播消息 + +``` +运行cn.webank.eventmesh.client.tcp.demo.AsyncPublishBroadcast的主要方法 +``` + +### 2. HTTP演示 + +>对于http,eventmesh-sdk-java仅实现msg的发送。而且它已经支持同步味精和异步味精。 +> +>在演示中,Java类`LiteMessage`的`content`字段表示一个特殊的协议,因此,如果您要使用eventmesh-sdk-java的http-client,则只需设计协议的内容并提供消费者的应用程序在同一时间。 + + + +####同步消息 + +>发送消息,生产者需要等到收到用户的响应消息 + +``` +运行cn.webank.eventmesh.client.http.demo.SyncRequestInstance的主要方法 +``` + + + +>发送消息,生产者在回调中处理响应消息 + +``` +运行cn.webank.eventmesh.client.http.demo.AsyncSyncRequestInstance的主要方法 +``` + + + +####异步消息 + +``` +运行cn.webank.eventmesh.client.http.demo.AsyncPublishInstance的主要方法 +``` \ No newline at end of file diff --git a/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md new file mode 100644 index 0000000000..7ed5366bae --- /dev/null +++ b/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md @@ -0,0 +1,44 @@ +#Eventmesh-store快速入门说明 + +###依赖 +``` +建议使用64位操作系统,建议使用Linux / Unix; +64位JDK 1.8+; +Gradle至少为5.6; +4g +可用磁盘用于eventmesh-store服务器 +``` + +###下载源码 +下载源代码[https://github.com/WeBankFinTech/DeFiBus](https://github.com/WeBankFinTech/DeFiBus) +您将获得**DefiBus-master.zip** + +###构建源码 +eventmesh-store在下面的部分采用DeFiBus为例,因为默认情况下,eventmesh依赖于defibus作为存储层,其他工具如Rocketmq等也即将推出。 +``` +unzip DefiBus-master.zip +cd / *您的部署路径* / DefiBus-master +gradle clean dist tar -x test +``` +您将在目录/*您的部署路径*/DefiBus-master/build中获得**DeFiBus_1.0.0.tar.gz** + +###部署 +- 部署DeFiBusNamesrv +``` +上传DeFiBus_1.0.0.tar.gz +tar -zxvf DeFiBus_1.0.0.tar.gz +cd bin +sh runnamesrv.sh +``` +如果在../logs/namesrv.log中看到"Thre Name Server boot success”,则说明已成功设置DeFiBus Namesrv。 + +-部署DeFiBusBroker +``` +上传DeFiBus_1.0.0.tar.gz +tar -zxvf DeFiBus_1.0.0.tar.gz +cd conf +配置 broker.properties +cd ../bin +sh runbroker.sh +``` +如果看到"The broker \[YOUR-BROKER-NAME, IP:PORT\] boot success."在../logs/broker.log中, +您可以成功设置eventmesh-store。 \ No newline at end of file diff --git a/docs/cn/instructions/quickstart.zh-CN.md b/docs/cn/instructions/quickstart.zh-CN.md new file mode 100644 index 0000000000..659ab70f59 --- /dev/null +++ b/docs/cn/instructions/quickstart.zh-CN.md @@ -0,0 +1,17 @@ +#快速入门说明 + +###依赖 +``` +建议使用64位操作系统,建议使用Linux / Unix; +64位JDK 1.8+; +Gradle至少为5.6; +``` + +###部署eventmesh-store +阅读更多[这里](eventmesh-store-quickstart.md) + +###部署eventmesn-emesher +阅读更多[这里](eventmesh-emesher-quickstart.md) + +###运行eventmesh sdk演示 +阅读更多[这里](eventmesh-sdk-java-quickstart.md) \ No newline at end of file diff --git a/docs/cn/quickstart.md b/docs/cn/quickstart.md deleted file mode 100644 index bcff7fc088..0000000000 --- a/docs/cn/quickstart.md +++ /dev/null @@ -1,36 +0,0 @@ -# Quick start Instarction - -### dependencies -``` -64bit OS, Linux/Unix/Mac is recommended; -64bit JDK 1.8+; -Gradle 3.x; -4g+ free disk for Broker server -``` - -### download and build - -``` -download from git -unzip defibus-master.zip -cd defibus-master -gradle clean dist tar -x test - -You can get a tar.gz package in directory named 'build' -``` - -### Deployment - -deploy DeFiBusNamesrv -``` -tar -zxvf DeFiBus_1.0.0.tar.gz -cd bin -sh runnamesrv.sh -``` - -deploy DeFiBusBroker -``` -tar -zxvf DeFiBus_1.0.0.tar.gz -cd bin -sh runbroker.sh -``` diff --git a/docs/en/instructions/eventmesh-emesher-quickstart.md b/docs/en/instructions/eventmesh-emesher-quickstart.md index 0e1ea2fc9c..0ffa9fec42 100644 --- a/docs/en/instructions/eventmesh-emesher-quickstart.md +++ b/docs/en/instructions/eventmesh-emesher-quickstart.md @@ -7,13 +7,11 @@ Gradle at least 5.6; ``` -### download and build with sources - +### download sources download source code from [https://github.com/WeBankFinTech/EventMesh](https://github.com/WeBankFinTech/EventMesh) -You will get 'EventMesh-master.zip' +You will get **EventMesh-master.zip** - -**build eventmesh-emesher** +### build sources ```$xslt unzip EventMesh-master.zip cd /*YOUR DEPLOY PATH*/EventMesh-master/eventmesh-emesher @@ -22,9 +20,7 @@ gradle clean tar -x test You will get **eventmesh-emesher_1.0.0.tar.gz** in directory /* YOUR DEPLOY PATH */EventMesh-master/eventmesh-emesher/dist ### Deployment - - deploy eventmesn-emesher -**NOTICE**: To setup an emesher, you need to deploy firstly. ```$xslt upload eventmesh-emesher_1.0.0.tar.gz tar -zxvf eventmesh-emesher_1.0.0.tar.gz diff --git a/docs/en/instructions/eventmesh-sdk-java-quickstart.md b/docs/en/instructions/eventmesh-sdk-java-quickstart.md index 1210321d8d..321273d32e 100644 --- a/docs/en/instructions/eventmesh-sdk-java-quickstart.md +++ b/docs/en/instructions/eventmesh-sdk-java-quickstart.md @@ -7,7 +7,6 @@ > Eventmesh-sdk-java supports the protocol of HTTP and TCP. - ### 1. TCP DEMO #### Sync msg diff --git a/docs/en/instructions/eventmesh-store-quickstart.md b/docs/en/instructions/eventmesh-store-quickstart.md index adf9717aeb..a5b872ead9 100644 --- a/docs/en/instructions/eventmesh-store-quickstart.md +++ b/docs/en/instructions/eventmesh-store-quickstart.md @@ -8,14 +8,12 @@ Gradle at least 5.6; 4g+ free disk for eventmesh-store server ``` -### download and build with sources - +### download sources download source code from [https://github.com/WeBankFinTech/DeFiBus](https://github.com/WeBankFinTech/DeFiBus) -You will get 'DefiBus-master.zip' +You will get **DefiBus-master.zip** -**build eventmesh-store** +### build sources The eventmesh-store takes DeFiBus for example at the follwing parts, because eventmesh depends on defibus as store layer by default, other implements such as Rocketmq etc. is coming soon. - ``` unzip DefiBus-master.zip cd /*YOUR DEPLOY PATH*/DefiBus-master @@ -24,7 +22,6 @@ gradle clean dist tar -x test You will get **DeFiBus_1.0.0.tar.gz** in directory /* YOUR DEPLOY PATH */DefiBus-master/build ### Deployment - - deploy DeFiBusNamesrv ``` upload DeFiBus_1.0.0.tar.gz diff --git a/docs/en/instructions/quickstart.md b/docs/en/instructions/quickstart.md index ebd541686f..dbe9f771dc 100644 --- a/docs/en/instructions/quickstart.md +++ b/docs/en/instructions/quickstart.md @@ -7,32 +7,11 @@ Gradle at least 5.6; ``` -### download and build with sources +### Deploy eventmesh-store +Read more [here](eventmesh-store-quickstart.md) -download source code from [https://github.com/WeBankFinTech/EventMesh](https://github.com/WeBankFinTech/EventMesh) -You will get 'EventMesh-master.zip' -To setup an eventmesh, you need to deploy the following components at least: eventmesh-emesher. +### Deploy eventmesn-emesher +Read more [here](eventmesh-emesher-quickstart.md) -**Step 1.** prepare eventmesh-store runtime -Read more [here](./eventmesh-store-quickstart.md) - -**Step 2.** build eventmesh-emesher -```$xslt -cd /*YOUR DEPLOY PATH*/EventMesh-master/eventmesh-emesher -gradle clean tar -x test -``` -You will get **eventmesh-emesher_1.0.0.tar.gz** in directory /* YOUR DEPLOY PATH */EventMesh-master/eventmesh-emesher/dist -### Deployment - -**Step 3.** deploy eventmesn-emesher -```$xslt -upload eventmesh-emesher_1.0.0.tar.gz -tar -zxvf eventmesh-emesher_1.0.0.tar.gz -cd conf -fill up proxy.properties -cd ../bin -sh start.sh -``` -If you see "ProxyTCPServer[port=10000] started....", you setup emesher successfully. - -###Run eventmesh demo +### Run eventmesh sdk demo +Read more [here](eventmesh-sdk-java-quickstart.md) \ No newline at end of file From 7ca394d1ad16835ab5126266b8e17856d3401887 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Tue, 18 Aug 2020 20:33:42 +0800 Subject: [PATCH 08/26] complete doc --- README.md | 8 ++++++-- README.zh-CN.md | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0563b47152..8dafb58c08 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ [![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) +[点我查看中文版](README.zh-CN.md) + ## What is Event Mesh? This figure shows the positioning of the event mesh relative to other similar technologies (such as service mesh) in the application framework. ![architecture1](docs/images/eventmesh-define.png) @@ -27,8 +29,10 @@ Key components: * eventmesh-registry : automatically routes events between applications and services connected to seperate event meshers, manage eventmesh-emesher ## Quick Start -1. Build and deploy eventmesh-emesher, see instruction ['eventmesh-emesher quickstart'](docs/en/instructions/eventmesh-emesher-quickstart.md). -2. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](docs/en/instructions/eventmesh-sdk-java-quickstart.md). +1. Build and deploy eventmesh-store([DefiBus](https://github.com/WeBankFinTech/DeFiBus)), + see instruction ['eventmesh-store quickstart'](docs/en/instructions/eventmesh-store-quickstart.md). +2. Build and deploy eventmesh-emesher, see instruction ['eventmesh-emesher quickstart'](docs/en/instructions/eventmesh-emesher-quickstart.md). +3. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](docs/en/instructions/eventmesh-sdk-java-quickstart.md). ## Contributing Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines diff --git a/README.zh-CN.md b/README.zh-CN.md index fd0126755c..4c21f9088f 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -27,8 +27,10 @@ Event Mesh的一般功能: * eventmesh-registry:自动在连接到单独事件网格器的应用程序和服务之间路由事件, 管理emesher ## 快速开始 -1.构建并部署eventmesh-emesher,请参见说明['eventmesh-emesher quickstart'](docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md) -2.运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart'](docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md) +1. 构建并部署eventmesh-store([DefiBus](https://github.com/WeBankFinTech/DeFiBus)) + 请参见说明['eventmesh-store quickstart'](docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md) +2. 构建并部署eventmesh-emesher,请参见说明['eventmesh-emesher quickstart'](docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md) +3. 运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart'](docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md) ## 贡献 永远欢迎捐款!请参阅[贡献](CONTRIBUTING.zh-CN.md)了解详细指南 From 7c88bf9eb4c54d2d82b9c2c5a31e3230290cae5e Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Tue, 18 Aug 2020 20:41:43 +0800 Subject: [PATCH 09/26] fix README.zh-CN.md --- README.zh-CN.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 4c21f9088f..c3b8e3074d 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -28,12 +28,12 @@ Event Mesh的一般功能: ## 快速开始 1. 构建并部署eventmesh-store([DefiBus](https://github.com/WeBankFinTech/DeFiBus)) - 请参见说明['eventmesh-store quickstart'](docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md) -2. 构建并部署eventmesh-emesher,请参见说明['eventmesh-emesher quickstart'](docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md) -3. 运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart'](docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md) + 请参见说明['eventmesh-store quickstart.zh-CN'](docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md) +2. 构建并部署eventmesh-emesher,请参见说明['eventmesh-emesher quickstart.zh-CN'](docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md) +3. 运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart.zh-CN'](docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md) ## 贡献 -永远欢迎捐款!请参阅[贡献](CONTRIBUTING.zh-CN.md)了解详细指南 +永远欢迎参与共建, 请参阅[贡献](CONTRIBUTING.zh-CN.md)了解详细指南 您可以从问题开始. [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) From 7ea580b5e1fbd63a755d0428c9bbf762e07e927d Mon Sep 17 00:00:00 2001 From: lrhkobe Date: Wed, 19 Aug 2020 10:03:25 +0800 Subject: [PATCH 10/26] fix: ack problem when msg's ack arrvie to server prior to the callback of pushed msg --- .../tcp/client/session/push/SessionPusher.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java index c2fe33e8e1..026844dc96 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java @@ -102,6 +102,15 @@ public void push(final DownStreamMsgContext downStreamMsgContext) { } finally { session.getClientGroupWrapper().get().getProxyTcpMonitor().getProxy2clientMsgNum().incrementAndGet(); pushContext.deliveredMsgCount(); + + //avoid ack arrives to server prior to callback of the method writeAndFlush,may cause ack problem + List msgExts = new ArrayList(); + msgExts.add(downStreamMsgContext.msgExt); + pushContext.unAckMsg(downStreamMsgContext.seq, + msgExts, + downStreamMsgContext.consumeConcurrentlyContext, + downStreamMsgContext.consumer); + session.getContext().writeAndFlush(pkg).addListener( new ChannelFutureListener() { @Override @@ -110,6 +119,9 @@ public void operationComplete(ChannelFuture future) throws Exception { logger.error("downstreamMsg fail,seq:{}, retryTimes:{}, msg:{}", downStreamMsgContext.seq, downStreamMsgContext.retryTimes, downStreamMsgContext.msgExt); pushContext.deliverFailMsgCount(); + //push msg failed, remove the msg from unackMap + pushContext.getUnAckMsg().remove(downStreamMsgContext.seq); + //how long to isolate client when push fail long isolateTime = System.currentTimeMillis() + session.getAccessConfiguration().proxyTcpPushFailIsolateTimeInMills; session.setIsolateTime(isolateTime); @@ -122,12 +134,6 @@ public void operationComplete(ChannelFuture future) throws Exception { } else { pushContext.deliveredMsgCount(); logger.info("downstreamMsg success,seq:{}, retryTimes:{}, bizSeq:{}", downStreamMsgContext.seq,downStreamMsgContext.retryTimes, ProxyUtil.getMessageBizSeq(downStreamMsgContext.msgExt)); - List msgExts = new ArrayList(); - msgExts.add(downStreamMsgContext.msgExt); - pushContext.unAckMsg(downStreamMsgContext.seq, - msgExts, - downStreamMsgContext.consumeConcurrentlyContext, - downStreamMsgContext.consumer); session.getClientGroupWrapper().get().getDownstreamMap().remove(downStreamMsgContext.seq); if(session.isIsolated()){ From fd95179739f15806d2704dffd3cdfe7815a95588 Mon Sep 17 00:00:00 2001 From: qqeasonchen Date: Wed, 19 Aug 2020 11:09:05 +0800 Subject: [PATCH 11/26] update eventmesh discriptions --- README.md | 12 +++++++++--- README.zh-CN.md | 14 ++++++++++---- docs/images/eventmesh-arch.png | Bin 40379 -> 45297 bytes docs/images/eventmesh-landscape.png | Bin 0 -> 33151 bytes docs/images/eventmesh-overview.png | Bin 0 -> 23805 bytes 5 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 docs/images/eventmesh-landscape.png create mode 100644 docs/images/eventmesh-overview.png diff --git a/README.md b/README.md index 8dafb58c08..3d3def8349 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,12 @@ This figure shows the positioning of the event mesh relative to other similar technologies (such as service mesh) in the application framework. ![architecture1](docs/images/eventmesh-define.png) +Overview of EventMesh: +![architecture1](docs/images/eventmesh-overview.png) + +Landscape of EventMesh: +![architecture1](docs/images/eventmesh-landscape.png) + Event Mesh is a dynamic plug-in cloud-native basic service layer used to decouple the application and middleware layer. It provides flexible, reliable and fast event distribution, and can be managed. This diagram shows the architecture of EventMesh: ![architecture2](docs/images/eventmesh-arch.png) @@ -21,7 +27,7 @@ General functions of the event grid: * Cloud native Dependent components: -* defibus : a distributed messaging platform with low latency, high performance and reliability, flexible scalability. [DefiBus](https://github.com/WeBankFinTech/DeFiBus) +* DeFiBus : a distributed messaging platform with low latency, high performance and reliability, flexible scalability. [DeFiBus](https://github.com/WeBankFinTech/DeFiBus) Key components: * eventmesh-emesher : an middleware to transmit events between event producers and consumers, support cloud native apps and microservices @@ -29,8 +35,8 @@ Key components: * eventmesh-registry : automatically routes events between applications and services connected to seperate event meshers, manage eventmesh-emesher ## Quick Start -1. Build and deploy eventmesh-store([DefiBus](https://github.com/WeBankFinTech/DeFiBus)), - see instruction ['eventmesh-store quickstart'](docs/en/instructions/eventmesh-store-quickstart.md). +1. Build and deploy event-store([DeFiBus](https://github.com/WeBankFinTech/DeFiBus)), + see instruction ['event-store quickstart'](docs/en/instructions/eventmesh-store-quickstart.md). 2. Build and deploy eventmesh-emesher, see instruction ['eventmesh-emesher quickstart'](docs/en/instructions/eventmesh-emesher-quickstart.md). 3. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](docs/en/instructions/eventmesh-sdk-java-quickstart.md). diff --git a/README.zh-CN.md b/README.zh-CN.md index c3b8e3074d..09711b1183 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -7,7 +7,13 @@ 该图显示了Event Mesh相对于应用程序框架中其他类似技术(例如Service Mesh)的定位. ![architecture1](docs/images/eventmesh-define.png) -Event Mesh是一个动态的插件式云原生基础服务层,用于分离应用程序和中间件层。它提供了灵活,可靠和快速的事件分发,并且可以进行管理 +EventMesh的概览: +![architecture1](docs/images/eventmesh-overview.png) + +EventMesh的功能全景: +![architecture1](docs/images/eventmesh-landscape.png) + +Event Mesh是一个动态的插件式云原生基础服务层,用于分离应用程序和中间件层。它提供了灵活,可靠和快速的事件分发,并且可以进行管理, 下图显示了Event Mesh的体系结构: ![architecture2](docs/images/eventmesh-arch.png) @@ -19,7 +25,7 @@ Event Mesh的一般功能: * 云原生 依赖部件: -* defibus:具有低延迟,高性能和可靠性,和灵活可伸缩性的分布式消息传递平台 [DefiBus](https://github.com/WeBankFinTech/DeFiBus) +* DeFiBus:具有低延迟,高性能和可靠性,和灵活可伸缩性的分布式消息传递平台 [DeFiBus](https://github.com/WeBankFinTech/DeFiBus) 关键部件: * eventmesh-emesher:一种中间件,用于在事件产生者和使用者之间传输事件,支持云原生应用程序和微服务 @@ -27,8 +33,8 @@ Event Mesh的一般功能: * eventmesh-registry:自动在连接到单独事件网格器的应用程序和服务之间路由事件, 管理emesher ## 快速开始 -1. 构建并部署eventmesh-store([DefiBus](https://github.com/WeBankFinTech/DeFiBus)) - 请参见说明['eventmesh-store quickstart.zh-CN'](docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md) +1. 构建并部署event-store([DeFiBus](https://github.com/WeBankFinTech/DeFiBus)) + 请参见说明['event-store quickstart.zh-CN'](docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md) 2. 构建并部署eventmesh-emesher,请参见说明['eventmesh-emesher quickstart.zh-CN'](docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md) 3. 运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart.zh-CN'](docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md) diff --git a/docs/images/eventmesh-arch.png b/docs/images/eventmesh-arch.png index cce4513da68f84b452ff8e157699abe9b3f2883b..fccf225f61d9cca4cfb94de25dc3d914933da611 100644 GIT binary patch literal 45297 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 literal 0 HcmV?d00001 diff --git a/docs/images/eventmesh-overview.png b/docs/images/eventmesh-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c6515a6d9952d00cabf05bdaa6207bb9da4bb9 GIT binary patch literal 23805 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 Date: Wed, 19 Aug 2020 14:11:58 +0800 Subject: [PATCH 12/26] update doc img --- docs/images/eventmesh-define.png | Bin 19431 -> 23415 bytes docs/images/mesh-helper.png | Bin 34870 -> 387161 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/eventmesh-define.png b/docs/images/eventmesh-define.png index 0f28170127806d796606db8d8e32d51431256dea..496b0f3f7d0e1610816314fb889fe2b58a43c49e 100644 GIT binary patch literal 23415 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 diff --git a/docs/images/mesh-helper.png b/docs/images/mesh-helper.png index 7d60d817992bcd77b8b628d6085e5fe91fc1b9ba..f1a16876cadecaff829d8a6133b70a21dfd6a0a9 100644 GIT binary patch literal 387161 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%0DRdvVg_5ehk) zg#Y1PcR)sT?@SsuYe)+1KBPjOu9(Armw-=n{bUAy4`zw%l^eCm0qP4_$$eJgr|;Wa zF{MYBDNPh%?sJetYZc6pOt&Aq{l_hBnUlm2urdnIE|Sldb;%9>9&bJlXJ@TMD`K=Y z_93UjcPL%{kj;K7T9zSuQfkY*2n=YBgY#Ahk0Pw4PH~*`OwA=%4Yb=aPmSPo3HDDV z_}8rr^-kg=(-f6IUSCbQa8y4ctN8xd!keNBc9$iwmsedV#R111jq)Fae7;u2WJ(f0Q!0goDok{3*)RqFf~ENZ$&?Rm zE;6FKP>PehXqp}t2m>5H@Jy@N{RidA`-cW(bpob(eJrP8<9jcNUA8efp5d*NY?ai6?ta#)T(U%|5~P4&k?+2KK1Q zT(dk=Qk`)S5i!7`b#C3iCV4fH6LV5-<#poKel-Sjb#91g?sq=lN$>`qa~;F&6UWyeKE{r*=@aAV1&U8PPJyvLoGa%%H*gZ_ zf0bhm5h~-JFA6GQv{(J9#dX%5B0jP3EiU;G$qsMQu=bV+>kLzSJjZD-`;#s+kY`L^@-g=h5@}nJ9 zSA#cJknz9XLh89-cB8Nf!gJh@L?yXT_rHMgoUrL*>lq>^28VbC*KiSESiRa)ATmO+ zmUZHo(T!07syQox++%Ezf}9TT9S{Ze!jcm>j`=8kYh7;6gePE7#=b&=K&WM!7;6V*afz7@+P2bHVR1M(0cg-o*9anRScQ)8YD^ub4vE zx3HD!+{N)mapM(7I#a~5295Rg;1i47b2h#1MyP$-iQ%oPdH^~X+q^I(> zq-SQCu*jw~R>&$!_q}Vs#gk`;;pA&KUtZH&U=z{T*6~y{FdD49D+_>%1Q_8AFTkF^ zVk=yFm?qfgdOcY*#Y-re{j$j)%$4NFgPYbFo9JxS{*x@_W8)Sk{~ICrRQ&9mD)fsb zKYI5S9+&TwfuDHBgE(NK)BF9yLY!q%k!(;kv>>VCmrK6ub$^oaa{wDkGy-3M$?MU@p z4#vASgH1#B;^*4M+HA1B?GWuw5nw{T$jNxx{GN=~SW@`rF~wt13IP2Az}Dr5UEv$K z>g$kZ<9hQ=Q1~X-*?ZVBkGQAH+)JPWMRq8pL-Vr?D**sYYjcXh6!-z0v}$RJGd)NU zNh%uoj3kiE8*gTF{l5GP2s470CbQS))q$l4oe|dyDr2;=qQBac*9e{CRjFH9L zI%TX!xL4Gd)wEbQL@H%nqQlRjl}1D%2ke~W5YPaqHT#scut~cDXfWYi6whI!8Q)$G z@Z{L!MW;mc(f>RF@fBiN3uF~P7Q8fQeL+=C>%t;09?X>8NJ`GuKqU=-tm#f^H9P9d1E@XRJ4q3C@V1dr^{a_&3A8g1gDs z;REQBvQN72vV7z3kMmkKU7gzFB7DGc=O^d zXP0?m#))uP>YHQY7TDC}=oGbo=RX(12&Bj>gN^#!+6Lc0?6vWC%CkR`SK)f@J%z%T@JM$dhBrT zIP=e$#gLJ?mFNWw|+eRj+?uCzEb27ps)?P zzk59!MetM+wE_6#CnKT4Px%YV6 z*DjVT-){6$DHBQQOm;bYwd`8SrhZ#eRjtHf)Pt<|d_o!nUSlx1l|?y)86{)&c|~I_ zNaB0R+7pTsuD6`ZwpBj;TPt_X8aFv8AwuTa8T!~@vbuS(x886P%^Ujcqg2Q6ZO^X2 zmrpX_>TC~Q9ZMfqwP^LvqMK;0hOMyLvgyi>KR${^s&75c3V46$+5c9@dyHHCSdR3> zRrmPb2QNgEz1aTU{$X%3ny#IEigiK`cq#;nH2YX>i1|o~@Bku1H3ybdPw3@fdV6Kv zen(f{@~vV^&N+qXooIjUAO@j|0rQ1I*jO6^0sV6`jF4^-*UUboe9>!p?~~A5E)OAD z-)5BZzQ##X&Y^)>?7cA^V2o}aCwW|oJzS)feeazgm@F5WTe`Rrc>cNyLLx>$(q|Mz zWPjCrQ{I&cy0xIAzSvKfXd@uMI=ZmjN%wvpc^#jlwmH~^8+kLM*nc2h4o=$!g8xicd zO@p@jeX(Z$Hk@%&8|%=AkhBcyM9IQ&>^%Ur)|0aK*T=OBRK@2H=&J3xN#ko*i8q88lb*f)2jz)u!I1BB8iMk_mm_2& z7&qT~C_A%o&)EGk<}d5U_Da4^0!k4(*_Xp_c{ICzF_#xf$i3jTa%f(}7sb+2Q8;N{ za0ro=o4mjy^D9X0W0B>+=+o=-@`hsgQU^XH|A)_EeuBlX>*~*RVgS6xBvM5% zE-Lph(Exs#rsyz5;x!Lkupw-`lC-2|B;-5LgO7dua3t{o~kU6}&mPE(=k9^Z z;$*J(42RS(iAte`>g|<#kf)Ftr(^20wj4a_#BX{q2F1NRx6__WL?5&`!L8J_FViN5 zT&mdi%g?e7UgEgpZ+`YCCg)+1YdCP}REWEBMZc_y7QeU5QfeeJ4GvDWD-lTh3YKSQ z)EG9o*dXj3K9yu08Apb5ogaE8t9WDM2BoXxoSIB`nHKP^hg-okIiR8WherbU6wWH; z*k1~#Z3(}p{9YVeR=okv;K7HpR?_2yi+R&=FM;ey9(>F3X8V&d+?sD9iLr zW*$%=W?HI$IY!^X`-=eURzo30ZqH6K*E%zs)}oMrrC+qHTOj7!MA(uti@0!S;5G7Y zRPLy3_Im-RM63`7k#o z=c~^nOJDA6?c;b(h?GFbRbiatwa0OyH~6i;bZ+{9<%Y$^ljX&8#cKE5^AkYbv%G+c?mfiDy!& z#cP(Op)$q>i5+ERXeb{YD+#2l-go-?%&8_U{(h0gxE3ru+{ zZ$>>Zy|y|wy+F{gk>Kl%iL+Zm=YBqDtbDQ%tzM^fh-bP@-$JYl^cj^@wUO;5#m-&i zba#ArRz_{>Qm_jw*$)`}DRsO7ur9;S0LZL5)?u^zGMwW(KX8%P;lCuHJWnhq2FnzmV^~Ph4}}**eihjkS`@DM;GMJB3 zE6Zd}0R4_R0e{3u(Ye|%H2Jm9QR{771>XVb^gHI8$$~Y8D1*e%+%Rvx|KM6X@j>%% zi}3UD93IA`j$Y}aB&yC}s4`q&U5{UiIb3E%3jEX9TDzJ*$nZRgK3k5pCUIxY#WK%Stlszs^5FQ% z0Q!mi0Lv$K2r>Mv*v|&2IbZ6wyHo}oQ0nE3M$Y}<;7%{LKAH3}iKjQEbL`K!jPCfD zipskbAYklJ@A?&ScaA!8bH-@g0#%@SC3_X-5tIGw+vHL$1mx#HCU%c*nqVG$% zy(!)=E0Y{{CIygdNIUxi2z!F2%nuS*Yb6qHmO%9J(Pj0-1^ zqK+5Z2E&q0iMsZ^z!UTw`QPgC@FG3a>bjZ22J8LwY`%JvsK61_tn7=Vz1(NTzji2; z%=2MY;F4i0v#YaJ2lbzN=4_m0Oodv=@0J+{6ZdvHzqlum+WtJ-WQ%8y&q3t~o` zsC>ftX#;SC*~1I^Umul8Xvr^l0(`G#)hk*FAG`DhlOs_VC{~NQo0jV9#@;8ASQ7hPEuds)eZQn4^!!?S0 zfvlg0Q+;c|s*rejUw}HHr_ACT_#Sy2^dc!jH3R&En`xO0UQ&uge&xy3{Zy+Vga`Xe zuBDdBhbokB`}0FQ3xw^2@JWr@Ro}oH9^L!fKQ#Nkxjs&9GH;*vk3#BmW!g0wZEk&p zNFn)cF9T!-fYOg%ohmpHs}TiyCTkVW>6$ONZ2kr$a#E%Ls)}VPS9$EDseu_}SWtE8 z!^Yg;_bBz}_Vp z()Cf1EJ|?xNQG~Y21mp_bdSB!cC-TjL1`Y#VngwXLVz7XZ4s7{pn-!kV(;7 z`K~vTb@0YpXa4%Al?tu)CL4W7Q;=CnK3jjSzd8;q`azcDSOB0ao|W z@Ud6FFLl2@^}fUIz*PF&tEbgN(S@rusT_i~{l|PSl3#pGyu2X0XBHuce3zUKuY`V; z6tz%LBFqtM9GYJsO?(DWtY3bpNOc4xk9Q(8@gw|r(0~HuJ2X;V1oD+*7;v;Nue_&n z>l$v!K`NH6E`ptzG%~68GHUF-CnS_EfAaa*Gh8buZY>Vxaa-(gGhIuGc%opmd@r}8 z__4P_tml1H=cdicEzvSY+=B6P$!-w`HFkJS&L>6abgjp2pXa`81|P!`XA30K5?r32 zFdmc{0+d7q1_BJ`GiO2OB4Zy1fj&=~+aw3C-pfdbx7D~QUT>ctu&l9urqG^SYO|pe z=drdk=rpT{yDLa{Y|j zU(+`v3%H#G4q>23(5%IRZ5#8T@}=@oH6;a*1)&5R9+f;67J#L13y&knQR@4O)TB70k?eLX~vzW4b)R~M|ns^>64JZmqPVesaxgi z2K6iY5x02Pk) z=Cu2*dd)(7t2ae-q59`@p6=^TNRHX1+#?9lz0pmyIp-v&z5Vi`utmew=hx-4&ln%S zZ1hVw$e`je-1D@HjN^^JmY(Mu3+jGZde_XB3cX2t`x&pDx8QxdB3Sa(`KWKE`IQ!F z=~IRn_WMGgZnL*1Zdg{R@H@rV?)Ix|zyrOiysAaHSEAxY%j6SgDs|s?UcZ03Wc4eo zyXLNa?IiNeh1(`L-krMJ-)sL`JJ%Y-#Bl@9QoC8)6>zI!hYxSlBphy!N{K3`K28;J zaxEdqziSqdg5}T4UQ8e9Rk?ODC*|YZQ}+wH$-p-~Vv3@PC1NX!gM| zf$8zZaIDg$d%qk?44TL8Y{pu<9~3e4e@hfQ$S$B|BLWF~&B}S6#=rm(CpF-ld!(z7 zChy}4fvzVQeXxSd$gZ5)XJloEe}BY%N|27*lA9Ps8oHUN~5x6scD{6`R>!Vw)h}~mZ z!ys$X@sun*Rh7UePG$jF27YcsGO9zQ^iFmsC-$$rB#7$KK`1r_k4owLuUw9^0tA{9 zRe2L{F(p&tR9c_!H@quq-}Y`o6TR-`OCoy(Z)VK9J$zR7`|Xzy;67J@QwwHecO!8c z6mI17vml(0S`TYUzw=ifX+!e6fJ5OTtBAy@4Qx2y8-BXu}0Z z_@|d#ADoMtokM(I^bdV7yPH2QpSK$^M7vprl3ffvRA|vmt~2z`b?D)won@KLZh7$i z%6@qgeY#FtQ#z9$Cl*)!Ro-yvl2cq7e4%)|tAuvri!7?WMs~|d2y$`hyER?4wLkxR z@e1s&hJo(W-d*r{W~p)~+cQ(CQx6Op&wSsg-*`9=7dwHSLs;e-eQmyLYg@#g{Fhr2Ip#m6ZD%vm`hyp~5TWB_H|5Tr zZg}Z|f}XKkqWds_$4L3{!&tcV^)T^~>anA_l?HkcU!qp>S7Ooyql`S{n&-T}fSYLPtAAHa5tvFym_5hT6 zI+GKFIUDypW%qR1?>N0RlEAI#llciOjPyh1wlp0HxPHbiRr9-kz;RmhDruXVbEBqv zv#;TfLtXYvNn9^kwoZL!AR?=e`Bl44{~cpHeX&4!#%Yf$R02P81vj#~F;aG~EcDaW(a$|v!FI|0eSTkKF-tYHeOB-%Od#HaRvV;@(ZzpICSU<9R4~E?n+V9rFd&DJSl4d4V_UuN zAZDDOTSO`oP=nr>SrCrPcJ<}LV~>Kd02!N0Sp(=C|8S>7qJ7h=#e2QUuQyw-x(Q$S ze&ue0D;wss|KPP96+PhSjfU&CW0ucjbhrJa{VQ&&J5-#)%8jz$&F2IX7qA&3A`2a* z>_)K}8JDAI$DckMi(6&ir7esz!wHcaOH78vOx8+;IY`Ut^mMk3Mw1G0pEvHW#d*Eq zH;`G6;`-Jn?G;lZ+yG&jNOR4U9*m8#XAbH-;J5zqH*$cRilIP%d~WsIv5IKPYL5RX z+6K!m9*v`b(m8s(`N^W?Y;CCQVydX_EvZF>2={XO?%DJ89RXgKAfNu#eaLqcaF3E4 zDY5C&iH%f00JrhG{<^*xN^He1hU{j9KH}frug)=owxyVxVmVyIZg%lV8)bwcQ1$;0 zPiGwzTR^%*xA6X&vmZrbF#9Cb{0k%h4ag3;>td=H$HJ7?IH5ReLTml_2mg8+|bEK zSQaQ=-!==HDwN+H9v=4cAF=(aUzo+E^lMie-un9MLyv`Bi}1bJ2_PoyUzh<}izx;h zw7MpO1dk}Rb8e&#m$-2?S$-drsS;5gis)Y9UY@Jw^yBrKI6kH2}W)V#_y+$5Nh1^Ec5)D zS^{h0f3uvVygkM7fRF+viXHqI|0%z&D;vN6mgQnmOgf5y5liufXZxRzjN)G7?RcHV z_Y8>Sa!*BZ;;D{CN=-A4o8R?g#Q>J}M~=z!ZNjDa5<)m&#@N3OztANbaHhYBZUt9z z+ps?Mq-g~Xs!NJUn)~U8!ynHjIu}})xmJ~>x9PuUHcJ|^T?G=`^krQnpm-i%EvR}4 z?cVGMY#y06LH@Q3UBxb@E0E|)Hs$qJRE(Z*w^`hfQgaY}ddVWGNK6p=nRM?IK+9zy z^pxA|lZ`;!Fb-UZA~*&qr~*Bio--fWNE=+lj;??wHTML!z&5kVmAYu2r0WD-VoE30ohVYV^H8b9WE{v8@1kpH& zp;EnW4_EZS;1?f^F0B2Cb`@Ev729H97ri9xu71A-d&z=BQT@uL79r%NLnvSxrjwcR zARD>1Z9U{`-EyqF&V3(L3-kZTPOXF&u*Y&iw)~Nwe}0wnl+5#;4HBpv9Ubk%g#Hft zcRJIreiC`-`uktx6&`r<55~O^gy`cupHvj?s#xjC`sN(|JYlQ?6%>OC3HAE^Wrbbw zA>mk_j6Y~Rut?#(U*C8^c0{{i!0^Es+A~9}&B*qh-UJ zyu0=#L5sSCi-5fYXT81N%B9+DQHUUe=o6dn53>id##-B%hZc)C4F`&_9=M3ji`}Wh zh|xl&;DJK9_xjLZr@ebg@k!%GL<4R>H1;-r#1x;%*ZDN!uQ=trZHz(kQ{w&-DA`JU$XtA$TzqU&_$VYUdw z;tN#JoHX-6j2b4B^6=I3q{~*+uIrBh)PHUh^st7pjXddri;DO{exjDi5TDV7v^j$U zPW>!DpKWF-1~gcIp18qv`YEEWTt7AZ^04^Ji1hwYVH9K=^LuqO{MP2S-Zy-_P%-qk z;=@r(<)x4t|NmqL%6wgILq=`nK%0e`h7IEVo6#*kq21|2MbxcE(tzyj zdscSk2ovx%?a3Boa2hg=xe$f)Zu&?DWadOKT$Ki;ffSrpV zqjRS3)Sn1*1_}RMA)J@1@a2|?Rxd&WpwD}%E=$6Q=0gF-)@`{Lr%}=Mf7)59ZE$YUh;WZlju@3{!>gs|+G@;jas65~ z-~d0&ot~Xv_O|taqJ2=~KHCIg8HNgTM|h+hY#@tP7DVTJU52F{&ZgF(U$^>bVv|0w zw~y1^BO!+&=CNKlrd6+^rfV?xs45OI1p8QWv2wTcNWDXs@x@c=$M@_?Na=2N!keAb zGk5Le74z7;*crS1!{4xU$IF1b7d;e+Xv5wJ)^0zWiy!|QY%^@*8f*smMxMv}y!`#t z?uw{qz@peQ1Y{QS$p<@}3r@%AJ;g9o$WM1Wh7j^y2^oypN#?}*ejt7_kp4k$B~pFeAa4Y}AteUNr^V2c=;rdo>t(GkSwDfO#0lIC2@UZR~};vBc` zag#|t%Va0!bI)7mewF3_DJ-nGK<7w^NcwI9T4phN`|)D?R3i zOj1m=$L-tO8gQqV<@zxSs>9P`#hB|LsHY5mDk;-umH%aB&qe6?zIg=C-sGFBUrF(_ zy#D!al&Qqwu@>x{Asam6d16$@BppCzt z+1r^D+3H}-$#%*?ggfv2B&>MU)0yWs*53wdUE=kF=6bM4 z^R=Hwq9H<5&YTF`)WpFBeM3V-RYw+mAMwXzVzGmcM*aVh2h`={MPX(m>~_=SQYR58 zqgY{^9;Qpr(cORPUoV5wchbs?@G}L(tY1Fmg6_?FCtLk@O+Z!-eOLl*gP{lqFJE(Q z%g`*|eTwH&%i~L!{Qa*WGzj~3qh-mStw}#|#7PHl5VsJEe~NNz@>Wm|gmWefAGJMx zhu3uf44@>=x&atb*8r-&$uNIPZ2Uk!-bDhR=V?2Kuxj&>=0gl01GT+an`MLM#z*5zEgPo|Ov6J0e? zeBD5aZGXL_OXM6aSDxb0_;(p;PYwLb;H$a()tgm71k7*GupGHOx(ANhh0dIGhMzeG z*_P4wP3%l2zy2w#@x&{@-icJ!by}-1FUH6(M^0LTzeZnBN^bX)q$}&TJ(F{Jh?SKv z(ZI!noSZOG${R8*KD-{qhGgSX|4(O1e`;TmBZnC5#G;Ms>Io;#Wk$i(bEu_#w%jCL zApFVqbW&k$odHQr%iILczbxD%ZUqmo!=sbG;sBXv8{FY9OXUdj{N&)zQtOT{b9jO_ zTt^tB=Va+YO$Q-XQzzfFhT8w#v9Bd5?Mbak6ia zdUW(jMYe(Hp>jW*zHCO#DQQ2#FX3fVWiPv56AK^9_YV$K6oRo3ipYX*qFl9;BwTw6Rsm%+=X!%ep!}Y6T?sKuSFMixe<*92#X|`}?@j2BRZ+ zKt%z!O?@-n>QSd0g`1;y?JAFubfPM8zUjyraLS8<@JK9)GFtVRT{9fvAbeE}{-hOx zMp&PtQjxEZB71)N8nxc2T8BQM8bO1KHE6vJC6f=2Xn&%XmTGv9b`o7IJ3`MI*t+0D>ho7=JL zLwa$Zgh(n^UK)xIRNI)|ZWsW0%}cQMqG8@7^*@x>NeOFvcDwbi$--OtU`mT-KW zb4ew8$gG3?j8Nm2apc6tDcE*0qv}H5G-qlLQYDY#q3V3Hz}Vy%V)hGX;`>Nc zf$*H_X0WF>!WRh+9u264{hbB?_sOLgRes6xXF>rR<#)0mTLia!)>49iex;>*)8SH` z)Dz|oN4t0*?(8P_2y@U3NY^xzMn82!K>!oQ9z1jMqvzp9zS&Nc57l9f3YvN5{1cU} zsd#@=_1k=PGuxirMNSR?bbjlXz35%znZjvY#jU1IUMP&IH|BF*;3^+G|LwgU;U2i- z@?|l{*O;YHK>xn2b^YN!qvwQViEu0&v_ip`@laQF%iRndM+;*F-&+SNA`4?4hjFR* ziVx}csu0aPX_~e$KrIE33yd+|-4e*e4;sn%IljA?~${PF`Kw|M?dB4Hifx46+C;JjYYn;x z_M6jIBrl7NpVw}a;fsGNFW^=-hHuoj7~A#=S9_KiUs0 z(Vw3YYS@SO7?J(fXa^7$swn#xZ2;@&IZYb~`dEl>;Un9JnB<>=(qaLP--RwlWGXQR zMRNOH&YtZfV5;(J)m>_o&UmIunsT2U)(Nw#v_H*D_SsP^TU6d~D31uZw4r(p_Hj|= zp*g?{ zxl$tgCAiHszDA&}$r9%1H9R?(8lqbf^{OVSCeQY+G^DRH? zJN5#9FnC-3ec&rBJNh5)+xvZChy>(`@q>Dt=3en%5xl`9cc)vvp0?td=fVGLJ1e)yb!0zMr}+X9cB ze&PZW?j5x_DsgGw6EK>N)k=-0;P$E|UmZf=) z6y|@G#)>M40^7bs=)o!Rlw*N9M=mdVcfETe{&$95 zcB!xGsZ$g0Iznf}Ri@hc-_l9c>aJM{yJqkJ%}aN!ID>Kw??d|Eo8T)Dgq&Y*(=ws5 z7sE0li+>QbO#=R8O+Nt?#yLh79Jj4*?tDgsNOP3nPj(7p14gecBY3;if0}nW%wNm} zMXpPTRiW)(VzxpB{7;L*F6~cZGwCi50_A4=lUL9B9!7o_JE>q3XjX(VCR~0)QambC(Xy4+@iF2(qu-iM?5ASL z>D*OCqME%|V0u=MwT6`KlWH8Gz(^<&dm;BgsjJ)l`;f+6BH=TI>#-z(I;JuA$fjt2_wKm}4yRE6qFPDFF8?{j^F_vQfupQV_IENO zcH{Hx8xBQ6kB!~n3g5fJVMlKs)2{%TwCxR4kPkgYJv7fb_{MhGQxa_GiffmGzJLFh zeH#1fR@P?@HoQX9Q&KGGtR^)1=NSUTXP@L+jj4+1g#%`=3W>~m{1%@VCn44tW@eZn zrC*Diq;ce=zKHa>C(+{tjEK8QS>xdx#Le6*k*AO#d`X;^Z8-MvCZ42(s2b29rVln0 z#HvDn(1^K8;>~T;Z*Mc{TZAgkUG_&2iD^c7R70QhqZqT$VjM4=DpDIDGH+3qsb!|{`?d`9CzFQ`tz&U`}N9K z`E?hH&h%NleZRtXKZvfr?blls7}~WcU3{(tDYzqwBl-D%XN_>jNnfr@A*Yu1Z|8@)}lEi%%AXfUh}$G!yk5n)tNhmWEww*hD>58 zYZJcfj|$P&is6g@!Q0N~3C4Y2gzmTh6-iU(&houMe6Dil*2oZi<@qxXx0G#STYJYp zHn^Ezqr@Rdv_Ss!>2;XLv%p*$z>C#5Hf%MHtdVtKe#Gz(d>d)zqQNu-iVkO^bh~Y| z;F3PZ?Ly&FJL0Nsab0{f5zD?sTHuNsg%L>=?XUI~+$V40s-3tlqVCZiySg zfqQ(buOl?I@FH+&y92o4x&Wl+_(*?N$YzcH@vcYMofWmfnQw?5oNFyReA?plX25`* z59F1~Y04@-Z`z5t65do#ZR=i)J->=Am?Yk?%e>;#0KG-+vLL03+4tJ6h%n53F|RH+ zT)<=610GT0p_%c8f z`v$$?4Bc6!T~1^wu!TvW#aCS3_eb!2p*(Qa z{Jpfhl=AwTx29umV1KowM8}V3Q3c^4LnGf}oAQH>6KnpgGgy7qzzy zI6Lo#ZPAhY4$7>f3*QPDi?b9;n+!Qr1pbRTb@y%gM6)oPa0*S4Bo`KpeVgGugf0SC zcD|*e#!e}gD|4vxX)&Bc&v5)hvi8T!D_>tLRK*f*P*TBm=+|hdwLjBL;`u!>i7Xh2 zq=dL!QE^iwT$CwjiHinGNL_wodlVy#Y$)Oj zGusn?dG_%2cAPp#9#J$lvvtl9v3$qunnDCOK?fy*5c1)Q`@73;SZSy{=EBp}7x~Vf zf7_k9iA_&quN@C}dPcHyN;|RtWnaG->1q?FMq=O4(lhV9@?*$se01@UZH26~2h=pkz)-w7dB?B$jiQzOj4CN=ii2d`?*EjNGmQC4w zS{s$-?~(tAc70P>zfRx)%WM?QT@MK7>w>v2k3@Gan~?`So|a97Mg#a5$8?`|$ zO1kktZohu1r_+`7-}|2%V3pPYxSAd~m}l>9lf<}&{xA)7T#hy2>rYF*GW1EO3nQ5L zTbDjUQtT7>VdNFrRd;HU$dWgK@pd&eituNJiUGGnq88BRl)1Jg ziYv?%gu`N$#6m?U`!7DqA<8)dG-ex%f07Ud@k(^2vm1&iQVJNmzP(x5`Uhu5rbnwE>cvn1@P*yK)V#dNTJQh3;P9`gi`amYReuP=Y~;Wboz z79(k{EwYpa^9^e}M-6~pN^-q09=#MSRovcSr+2A&hQD_+QI*C-ritt)E>*&3b2{ z&-PGtcPuAI?Q*6WPdl^i8*&OP<`r^!kBZ*pFytJHi80VWe%F{q%EnR{NogNPK=?x2 zBinc^vXGVk5sTHB-cQ5M)3^V9JHOooVZzHOUON=EeoTe%7#H?Pdpk=RYew=*?*hsk z2YpJR(kWdJ+b>ex8zi1&dS;DLuR+zOlFQcK@cPz_T zdcl{lDN-igrUt5}tgom)3x~VhX`>jBrZwn9R3GePXxulNR1%cT2ozV$LPV?{XHh&H z(~A$(2pbsT;bo0wq2z~0zMDU43prPCI4O|O(@T>%^i*B^L3vUvoNc*J57N#sLoBvW zfCY3*u-zT-JXpox=gSSix(H*)sPdO5ACW6uUw5BaVH5rsOEIh%<=K9S7qB)=L^xMt zCio#?koLnR#}tEpxeF}`N4wX?(W?B~`fR{Q*>;AIi@ws!3RyyY^Rz--C%ENM*G~^~ z#&7_uX#DcRA+YdrnIF~j zl+m8+8Fx4yQ^CtD+;(v= z17IIzDgH?@HSu0ZyjU+F)gQreXtS(cTygiie7NZrd_GAhU>fx!QO*0le!IhD>C{F2 z>>MiZc`h>u9k?}pG-0WsHa1whC_B)vb5qxV^O756w_81XYzUtQl1`2nxTcidEuo%? z!btTWO(;TI;RvaOr>ePTZ;vvUx%dVj$$L4fo&PqP>HO9;NAE>T2pl@irf0|70i^e~ zYF52!nQAIEoqDW76OA<~Q$q3<`9UTIJ}Ss&h-4`4@YDn*BqA}`G9n4p$>K%8aEKVEXAL$5Hsy+)VM-Vj!58m9jS;Usa&I{=qs~#FLzOOF@3dY;-itctT zqJqV$FudRk`y`YD%ELSg;$YqqLg}jFL#i!o&j%Q2Uq9Cr%DJODK_!IF&T=G#(RWDq*{LBut7he#tF8wPX@*IOsoo{Fro*H48jqJ)* zt_lFtXhxjbeSvYt{7j*hutM|zM>SpRZ#)uzb$jc#QTCsQ%7(l^f;m(^fFH?||5B%?B3+JXE=q{|X^w zBGo6JAPc}79Y|MB?O>rdVE*tg5LaxPI5c9pk*(~fdJD}UDm6qz>{nSNj$)LEfL+8lM5JruIVJT0U%Pb1|GJ$v zrRr;2$I7crMSdZ!{it@S#bcZi^H`cDBGr=}l6Cv#L%OeiLfe12&GzJ<(i|vMM6y8D z>6(m0qL}S~qzjNTxY<7GYv-t?=Vr@Vo6O^C5`L+d4nc_w?Ky7`pFB&#`!jHO!fcN$%QfUdcdi0b(Lt$Bzsp)~&1k1K`lVCj9 z&-jve9d__$a;nhh(p5<~+^zN1CCthZBl>#)rLrj<(j4kUY&8b}x)&-$$sWLr@t^D0 zSjHIGPaTYqk-`Zd;|h`Cx`f7QSiGFZ{|LZcW>1^3L{QAKKhyjYv!X`%HX-`*ucSun zo+!M{Xf-OLUw81FvwerkD1`>=`1squjy9Hsmx#-(u5@$SC&?w(Jp} zv6}~2@C~}Sw!xv_0yCKkj=2KV!kN)6vVKQj>}!>(egaLTRvUL%f=tVfBye)9XY7v- z6z4G=un24PR=J8<>{@fp1bt-dKHGASb7$ic{j=p0@+^5-7g-2p?d&do+(mNjB8f^kdPE*b;Qd0{)$Z7Elxz!zk&U!t;oy9=!`%BR5w z8d`&adA0euRuMZ5Sdb-g;L3%YK&sZLH12z8vq)lUE1=5TrbZaqHAR;#@tNIkpa3xaeCqAGP~j-R0gal-JKebf+WgByz~^mAb? zy?HM4XdgSJE>L%ktrCf{jLI8ceI_F*Uitv7hPDKfKmR5?e`zLV4eToHu!e=`(g3>0%zQu-icia+`}1Hw(5^2A%u>N_@JQdQ)i~+Fr^p)4Rt6i0 zw{$YFPwL_2!&gH6*4L043D5Hf;`$eKTs(){kI5Q0e8j;E26ba&jcfjfq)$ijN}oLY zoQCdud^$;aT5=&QciMOcRhJr)HR<3GMY5#Q=D&S4a&uFd6Bru%Ya_02 z-SkrL1X0npJMmY8LOEy|aWIWp=iA_>Q1ntzT_>T#9n*N>(ak=aRli;89b(t;z#p_0 zfYIRDhy7Q=?%)xC&!O9__-As7zI=!KXA;M};~?(v@kx9|@a?39PaF;6rpH|<67NgI z!72JHI;x|ZVtOOmcY*nW8+(B#+N*VnyMfqLCf z_DqfB3l0^*6kRt{Gjp_ou?Z{+M#AulGN z&%|8IaKlf0Hv>*8!wO`p`RH%E z)gNxVqUAovy-^fq16x}8PqVzqpxSVq7XxFCOi#utE>A*Xp^KQ_2)^XlZVe>;PsJaX zQ}WMIo%+)jvzsA@uWlb;VJlcBrSc(v+7BuD=84M(3KacZVFm5fr(s}^h!{Gi?+v(* zB_1K^xFtaOH^9$nx!tGqPpfybY1{bX$u}vEv445(l`i{M-Hckg!uSU%y={C8{oy1} zQpyGv2vHTLeO2l(?&HYnH=)49MZp5Xm(8Vt2`>`>l!BC&Lvq6(^8`9x$Zp*v=|6gT z^>QllB+q*{^H}-*tEBj+&&a7l#ogfrzWv&IVd3^CfP)3pJHx-dT_)&I_>WM35N^l8 ze0gn3nPzYn)fQ+0z&!gRz2t-_@~F(e0PH8Z#Z6zMSRL{1?~(g0-ije2Beh7B%Jf6@ zMNueKf^thiT0}wGQutn*g&pu$G8=FUcUmEqxQA^S3ai`zXZXH#nCQO`PDQlXuDE|j zuDd#Q6cyRMGduw=NzNQ{h38G5-12OI-oCem!A|LSZ@Y5$bz~G2_Ck0DliKOmS{OKF zMDqK!F3;$!lybIg&UcA&W7z|CqrN@2h{F@% z6<_3vci2G?e7BkQL7V?3wFZo&E%KX@9mGgoo$L7N1TM@ ziF-E|6_Hy~ee|rP3fg+RaewKTS#P^g4mquRz^GrdNoH?ITt5@vBc?L>`Du zb{`Q9e0!Gmez&r+?l)EF2&)mF&<`1>a)r{?irX>_u?}YPP}v`Zhz0HS-pfO`L_p^x zC(L%J=7;FUh(%OlV+60doq^l^Ig}Pv+ZYziS`MX}g(4)d0XNq0p~ z9*vhtquHoCQNY$e0a8D`uQ&wLHWFG_|*8_MKb0tnQVqY(J-J7eXfu& zON6a(p}(-E6NLBeWTRaW!&HHvg=j&*5`jS@x8UeMLWvpdII?PE-<0qAO;T5x=#M?y zFm#hV@@R>4q)@8YKo>nd-gGJS=k`C1dn7pJQq3S19J={9E8@@^CZWR6G2?rAs)I$MoUTYPdHFmt_ojhw7veWWU zvx~cIBtw&fi(H#VZdi7I@x3B*==SSd#E;%vLFiR5G&F_~3mHWDD9dI^w)ngc8D5F# zyzlWMQ3~;j*Abegio1mT@~(umGU9>u6$Ye|&h(<$O zstmeE`yH0*RIhUUGv~DRaOYCIIpYk{yZKSy_e4lIrBpcb?#eTtjxO7^K+r)Z|H3p% zgzJUF?^%ls2JsT7LO=Wmv?apiQ>_Z#Ce#)J-Z1K`>DNfoRTFV`c@`lFnmkU zE)8>yrC3`m+a*wAa!g95>+;TEmSguDEa5{R9-?8$ggaz&H}aER5bUlH7Kk|qrDA$A zuc5QGJ;~VXHZEzH;YhEfiqKl~q6vow>CaDY1$@t!3}L4ZiIdN;jQZrR2(n&-QITKr z9QUy62$?fDNY;=>Gl*;=ptIikIf?#}KhKXPEc70+%4BzD%%R&SFIa+Jrb@w5%m>dO!>p2A*%G@I#y|`_bhk1Q#4{{o+|uV z$-pl=#8uUA)i8{tK={2Wm_B@Lq(K`>V0U)w`S0=%pYlFBBB1SINBP0~E2XX83BQ6q zzii3y+PcFDEB9DBu7cng_+!4w^NZ9Rm)vY5V})cue|1MW(t$^elHdJJs3AGA;}rt* zP_jr8^RgNma9PP1pW~zJ{?(t1i;F0QnVI=JU8A>O^+w@wLsc}2J2&mLebKdUzA!ag4!4RtD#bcOp{`wfWyBg^sOQ2N_Z1U)eGV0AxyWId&05?qd_od^ z|1m)HG;%HUG(O;_V(e$xscL`XUaQz_D6N*JhAu0o)>ODFQgBIr7jGNFrIyH`3spMz ziV#vkWt|)c+zwA-DtFJ+XAikHsx+lgs4~7A1>5ZPV6CT^CE@>l+WdFY(%m+mf~gB^ z=WEPVzr-XUA6mc1PbgARf@z zZV0h6>?^op=pLk1fV{(*Ab1?0rG7xBfhiGT3jK%MnyR;c_w}l1%WgtUMZ<>|lXxm= zwIeB$c7bYC&Vqh2fjtPEU%77`vnTukQbi2iE)necfJApekbe6rljfEvKU^_P=s}F; zL@LIBOv1bEN1WL;K&EUXtsBWqg0u21Y3rK}U2{-bGx$E$A^nFYF&+Wn*O%8E(}UPm zj4Q(*W!Lfz$Uk8BL~x>637_Vmi~n%vb5Y#fAQLPB#wfKG>nW^4ZV<~szO_gO_ zZr#AaT4gTA7$OE)@8HvrzscbfthC{_SAwN>HoT}?W)&#?EG(J7U@Hh+^r-jGDe-Le zUf(pTKuZdGvUw*8%3M#ipzrooRPI?8-lf6ZV*R{y+oI|UsuHcQ*o}>VW7MBlo?vFw zxG=ACPXH6%8tNdU3or(PnNln@=y-K|zWiIFo4o1qKl*F>7vSl7_w#V;!`{Y-L z=>>lVZESHn|HCj0fm-AdT=Jb7Q*H#kCgHlP`5nIbD9bd~gZ=#gN8DHGxSiaC+=Luf zQj{gF9~(WARTuWmiyOxL493cDZBEu9SR=5tHP##oJtChx1uE80`aBln>1*NO`ys|z zT(%S(B?DmD#hWCha2H$Hw@}YVSuy9V#oatK{`gn444uAyiZm5kZEvOKZ(IF%z+K|6 z%^@$t`$s|CWB!!1o$-z2;zrqn$2{z~u_xY%49a`RyqMdsknJ)`6 zFE(9vXTcW(2-t#GfYxbOiuvrn-A~fzjabvJ=|y{rU~lThd(<3nkQ>Z)3HJNn>#&%J z3B6ttg=mgLl{s!VEj-U7QPaWpJoF@1>7}VM=rT}L_L`ou$?WwaGw#HnSV>~S1-37} zGyCdQsA5AGpw%HC$Ts?$vErOL@U-*?ng!FjdJIJfo`OKVO&DRgpt61fN&$VFtqJA% zXn1Es>C<`jDGW3IDzA_Wk+WRO5o9RK`3GcJpiuPDo!)9iH#o8H_@+-7$G6+F7XMpr zjT6O2$WrlPsI+}om`?QHz59H)1=$Wdy>H#(Iom{LrXrWvchfO-36ZI6Ic@#=q}Q~c z_7YMzX?SrbDl`R`9_@?-b2}kC!3cs-6^zQ&Vlrp~RR+G#dH5BA0im$yWq#GLosOUL zz6l+TVMy0?jOMRc4Gc;Y`SAgf4Rr(F1;4r#K1|(I?kFrPpw!Q$7W*}PO|T8lCRHq% zz3 z_*=_<2Kcmb)P)McW9FI-6+O38YbV$&nDDP=J3Rcpl;f@1{v;Si8YiIHy5x!ER36=c zP^&CI<%h2$H&_y8d)~t;-S}4)FW-Q9ydn_0>ec)J;X&!!uE@uUzlldu<+U3G4>J|rfs;%s_m4jMca;wC|MpDV3!bJo;nZeeCDvdUs8lwpxN`juF}T@!`lGFV zx5HTY;RkMtc$%WVCr_R*oTm4CA?H3byqX+73f^$34#))@zDB!%V&8y5W92(RPRJJ!d!=z1u^9e5*^j7rDy$lZ2aO8RKGz& zG85l&`JbOowAfk{@9BN$S)gJ6I(?Mvn2}hUcE5I3mZ8q~TZ30tU%72vjhq;h-upQ? z#mV4Kh!dfiDL}(o`22Iq_txNdm?Kx^zY)7M>_O0nct-qy*jQc(q1XFo_2S~iWk znT}XT%|ox>-zvvLVaQzYcjEzUV<34#(Ti}_W0~}%Lx7GU0&DO_4d z_+&UkOnymING*yVF#b(F?b!N|c^$cK8zkK_i_!HH(nl(H$nNoWLP8L4 zg73?eqGT+;l7CwDEW%iwPk-CfIya0@kHcVxct@1;0pa1{4caOV_4U}kY>FQsyLQd- z-e|#-i|Z#>tXl24Ul16xpy(=#_Nm1z2m0%gFs=JPnjl-HeYOV0*`ps;$g$4gcFAuI z6I%*d>U*Qg`jX#AW1-%y717^>piJfT5ISLHeXb(oYb=Lj+}>%z-t2CHLyDkMAz?7NE2`8I-TwiWx^B7o&5w`b-allA(Se*E(gr`e-~Ps+8^V0poR!kAp>~;u!x;47bl5QJvaxO&6C$?6DQ59htV0k7m_ee3 zsb%eEKUXSOp!!+LCb%6`)Q8apy~G)7)4)5W!%p=*^L;+QsmIDGUpcr`A70|q;XHMb zTCH%QwQukhwilTP05Sh+?E>slB&b%MHU7};(-3~^t&F{Km~X-Lh#HVpVSRi(9dYBj zuAFJo&*uPx-Cb2JGM4MZ?i1ljY3-#F+f2lrJoJs4SkIAJG=y3hdmR0RtN$kZ<6|8k z!N?91vDSI&*7pkU(G(EA7Qg@Cgk&SZ1Y#C$PAwAmSs!Hs#45l1TePp`#RDExJ9zQ~ z{oV}b{F`|~rTw{8TkA(-%i4i4>l+o!BF1MM0sh&ppR_WZ%W{rEJ_uf;W>S<>>j698 zaz3vd7y2Efm}0j#dVODT3Ge7`dxeyIg^!VS4dWvd3p!qv?kI-NudaI39s>Nx$THGi zv!#-#a1j7C&9}D4`Sg%587vH_8Duz0ZgTT6u5Ejm*M6!Li2F{H8%Tl+%ys`w(PBA! zgx$_5Nkm`ob~TZL_<|+S19kjgqMjy^&Q{eG`>09EJ(VCzaqP-mEc!}n5cr?~X1X4& zLy}GK%K6xHVi(Z3sD8Tsb*Nl>5X$R$a4-BFAXuhsxnZLNQtzIhcC|K;nPcNgVD(7C zx*xO=F}{%yiw2wPizRz|^T5TMsL$of^sF{dLCTVv>|7S#Upqb3?&5m@C8^;}u)5}% z**EChHzP6|H-kVF#Z|E7tH{9x$x2-mH6qJ6f7aj-3lxR0gQSf|~|wqQnt8<&*rw!bX#gJ=^AWWkp$@3COc zan?gCqrs2%23j%hQ=2Cu9o&CGDIt#PDEcTz-H|Vx2LGMvJlz!hB{}4u(#JCISofwU z+urAv?Ik%WAD@cr6nXSBZr$edW;sw#xcP3QU1ZXnST8PeI2!V!ri5!Udf&96JO67} z2Qkm$vhBwgPHSws#iOU0x#RsTXKSc50lN6+_f>pUXuG?R0@G1}(2WuGVu=V796 z>{wv|aV}j)Xu7dV%zko>BQ7eN(NshKO%&ROGtgjD%qa0sjcG!1RKAN z2%=u;KYAc=(3aXWOB-wDKg;S?@lL-)@LJ>oGo+F*CsPOMOLvoK66@~0m3mA?KOp}r zz%-Q$+*Py9@SqsCT2Mc-NvOQ;=zDe9yynHtQpR39Lc6neZLmKBz*Z7FLtv+|DqEs0 z>B`>Y%ypJCB6to8;#Tg8ppSS@$|I_)#6*43TuM2Og^-rEQ~wAVK843e4(EAB*nYML z1`eqPyXQxgGN?i_;&Qd%2e;Lj;FngdrlS*GW^395WAI}s_vxVkq{_(@({*RinlV7(2X;V!k>X1espf~Pf;7a#A^SQ^nE-@d zIq@-%mY?te@XVcFk*qw{DtLj=(0w55HhXm!2!z*JsWpq-Y0 zgFgFX2t|9u4JQjTOtFINN1{(-J>y$ucBXVl&R757-P?hFz|}S#3R@B?-DSM(>_4v? z4u!?-&f9$$Y@9JL`e)gh74TW2FL&La>X4O*3RmcEa>Ty9|J(pkB`ex{kT-tJ&cfoA zAdhWUSx9u?@O~O@ z2-A}WBjW@?`bV3Wi{{Xb_Q)}S@3?V>`5PoldFK~}u{+(kE0-du1qv+?rp`HrA;|Xm z+2r`!ckd<^{)0vzX~sT3(*#y*pO$(rA-#Bl4R$Z}1N`%ljiAkMSjX6d6R+J}4j!r#XhP3{EJ;&eUkJcpo^NFEKLY9vdATVb1L)?{V*6#0pN zUzqYOxg_l%NuJwRJaC}srgJ(cMUmd2oy-xK%;B+GpKDJJPG^_X1^k`8e%# z=SFhlSjW>~UdHs>N2N5qS{7QC}jB+H@&*41ct)gDj_kV@r{CG~bJ>5@hLM18@ffe`ms?*S~ueajK#oMmd9RqrR> zFRNi|w64y8leXZ^>rhC%TRsRPMz}7OlC%a;UwX}q+f6Ji+&RdN>A-M0H+2j^2By}J z*;-;m4M}Wg>b`kQiFW#0M}{6?jNB462#KdSX>BZ#GL?Dr)Joi9I6%@w7wblpu95Bz z<%g=tl?nM!<#XTJ*vayPW&jO3E=2{)AB0{FwG2<;RlG5)rPD$MgbXy$I(4^)!68ou zEypOy7Pb)YSTX_eZ}%r;C%b*QCGpEGz#}-oL>(Y$%rI)1&!sv-)3f_Io-HaNSnHCA;1V zj|b-Sq@yYvjM^-_7TS+GMNopvwX^npOj8Ln(jU2&Tty_u&d! zj}AP&>+xb07vuzA~^&zJ4zj09yZ5s(Jn#YaDce zes1-sWMMigSU@7+fp$#r879o5i$ytXq~u%FBj_S8AVjQZ;RG%aEa7+6WA)-g0fuUj zU3r4G(JV!~DA&)#Gaxi--S~o;i5kS^khGv8KkQcQXRBFFie8N8mbMW|zjclwu5QQ_ zk@EbmJJ#SjdEc-lG^uzri8R2Lg4B_^I}?wAxF2*EwSNEZ2~QGiGOr;N20W5x(LW!K z=m|gY>L3+Ch;MKfBm#tZmvG>Lk9vJDI%`cwMs?5rW14^{yS@kqj~Y5=JM+*Q)~DSR zxwjcX_)rV^zR9=l-kPOP7OT!otMiLnJShF$z384|-4;~v;^+(rmSs-oNdRQjApIf| zJ;$Revp4llxi@PSGN|KGK1}4xT>KbBy?>FRD`$WGQoZZg2QPMLU!(bMt98cUK2%;<0B+b0?#J6iAbS%cL>C1 z$a&OLvp_H2yhhWDJ+Q^=fk64}YGKzvqbq#8gjZv@Qt};gTiV*$AM&Z0RF2Ta# zl*MQ`y~;jWq_`k(uE*x#bsNPxzN&xEkU`w8@7~NKta0GIj3&lLGxluid=Ou+vo;VM zA)-6E5wHD?Fw@Y;NeW_rL#PgcqRb#hQ6b8A8&(k&_KU>O$eV%89~U;Zv)={D*j{qr zKbg3#v$A^EyzJc|(H66pV7xR5C^1j30aV@M*=^s&fq0_Zw-^TqHNizG@(F|_x%SyG zsE0c3wR6bP0OE1p%l_7QaB+N0^->m^>O;T%?T5R1Va&|BTohPHTLSaKZ!VUvb% z>x6VSpVQi$#b?To2;rVD2$sK9jO?^_EfDU3LPXxJ&3T`nbVKYp?&IHuM!7yFTNOe5 zxlb&tt+B$$Sj*YAw(zc}nZ-3zrlem%HA?%IDx zr!M;fhm_5qAn5!5d%leMyoa4nU|VMi1N>Wa6`&p4;7(>&demgph20^0HDLiHj3TM< zA$^B6S>5~!E!e|&PzCdCvJlHOUO@=^b{{7HSe8AxCOdt6fe#`zDwo%q(7ru}VB(y2 zzQ5>U4eaP%e`DnYZ@nHm_}O&P7H+yP6F@4e)#d!x4XihH=`zvoWtE7ZS`rb-GA}ng zdQm2gc=@_;qULFqfxn4W{B-{2iirs)lpblOnJvb_`ML!_(hf5*|5!U3c_UPVL z9w68a?RcuY*RHu2TVd0=mPws-9RK!f(@=x>R7>ArQ!@qQA-9@kz0h~XSRB^GG<_LW z#O4G+*F*~3)NvD(yGG}}RHLwYzR(qBVY~~Kllc?j-)e5C5xe&JrBruv10G_kNAyUy zMZwx~^cD81Vr^)v1s_VZ2>~f;9(dQ+n`rYZP*62_*#FwoXD7CDe|a15;&!zRAN`5w z(`-KP#ERmpie7k(!2F5f5iWChNVj8Eleo>M$9s83^k7YJD%12X5NKA={#c)=P@=Id zkMO&ibR*Sb6I_09>*TE#|Bd7J*7}IvDg4Q!g~a*)8YQQpYSY0{WD+~ZUiN#VuYO@a zs9UyH@=%6`G&_FHh}z)Nzy`PYbUs8j8)AVg4tQfv-KQa3@yi_sjE{>X99*|n4GAH>gj*K?5{ruzZzu>!F zW}3aJ(YzB+GlMkxfb~;3Ti}8@5EL|fDgziyfbC%B@c+_`2H{$*DvaC~uqDCOdSBZf ztt~_-xKKyv;f%Q20%Lk;%ff+O*0hre5vq@xjEikBB~u@bo#0Q{284{MXEJ%$9tAqX(d6A3ynm5AM` zBw>a_U#h$lDdtJCnEEBfgJzm;8xsO35$fH}UQ=>svq&Y?Xb6xMbOUgwzbkQHr&*7V}Uf>e+p=$jQzuAKNjLT+7}QgO4_!ZXUh z3wmlx@#6Q~l?`u>Z%idcMtL(Z}+) z)yWowiHsP1DHT4!N`3a5<*n}RtgFOryfgHxJ+$;GM}WrpKsx9?6G2Y^eo-XBR0+>& z+Fn9e_Ace*iRTDgJKwJ+RPA069zrA#1sn!72@-=#!@U{z&>|5$7$)n=GHLWS9rxS| zh-v2`vWGKcgE`%^N6&$d`jx{zCBZs&Kvf6{eU19yTIR~ipdFp1P*bd2q8SaRRIiy` zm^~{2?hnb*&za7@J%?uS;cP!1xev(?>D(}0Q&g)&Rh}Mn%y)busR$X~|TGdp!7sd7A6MP`3j=hAU*|rQA6{v{9UD0X<(FgJu>yis%{gxoQYiYi$2KuaGIUUPVT7u$tAh_E^ zUPS9+)fb!6y|+JNey#RpmRQQ7Vyl;)mt01X>ATLaOEEJq8hPYpv4S<<&ZoQtKYV}N zZD}-;esutWHu*q(&x$iD{`drXr)lMkkR{w7l_SD@z=ZxlfOgmD6l}{ydOE2jN0#lN zYGBWg2rfQ4cTl8eDnV~e%jzLdq>I0lK-{=p^tEA2CPSti2$3AJ@0VuvDC_vxy1$b_ z{*ztxf78=AGf9mM+vE{_RXQ zww7TllMq-#-(()6Ny)L~7HQaCUWQi(op(0VQ^=Pm1(r@<7P3vCH={1j$Da(f+pPTH zpHxfTv)T@Lc`gpr%+DIRMK7z#(bm2*{K2n8A*h-fxiwV|gH3|Js4}AxeNHa;yCCH& z_&VBYQRC(&<2>VGI9=C5N^R&9(;=9h{|CIpTvofFnYz>@N$Pt@mSUm@KJN7Svk!Bn z7LJ8w4mz&4%ah(6ubD@EM_{naf#-{Mfe(i~G#$Mh-{A;v*v+1IvrPIauh|oZ7A(d8g^o1T7upn2N+j?vdjHc%RYh&kA-0>1x{BX}v&VX6vG zvx#MLtSdjOyJI)6>B>`wMaH&VpVF~Q1wVdKyMNq2=2)sk`KPe#vGM%K&h;{`W0CY~ zv|M)#r*08)WGf(B!miZcLDidAD!&r8-0UY7Xb086n&vkZoC^#X6sMj{|Cj1SWC&;L z>{c&7<%!##I6rk3xHpmKvqh;;Rib)Tx9SNQ*?osN;&B3(k7mYJ*ZzxelJjb^@1u~+ z-w3ZXP9*1DesU24)%)?jR)vrsfPcz_-5TNof$C&ExLclnBzHRBcA>!uI(qUTh;EkK z1>-?&LVW;>wEP$9cWF5r43xLzC_RUFFLP4x%~)m&vZvpV$*a@yzV}4fN;N%^<>nK4 zU4CgKAld0VV&3}p(I{i2-(OTrL&9BDn<)$-37Smq0MU4^mtJg@qn*-9xFCV;4f;`_1vQj06_UG)lxFBK?i2WnKLt#jsOL(wI z$yiJXY(8D%mEdX{vrWSD5Xm9>=K}{Vzm=bwhfw9ce(b8?=%kvT;x-j!vz2Sl>tO*S z9JAhxR(uqV3qI);ZUN|y0|J%}{6j;(t4Q-L5kPPczTt&E(I^!XUhg@iF^B+hjeZDc z&h^?;mIEf154czn7R#k%1Ba`9yJ`AHYPs^eL8lq=2S(;TWpFdGnN}Y$8IKI z)q^*3Fv1f+7XM+mD$ZJBnKL9lsH9|55FUn+!gEd{D(}F9S6tyY|Gq;e!rFq^SS1XT zyVl4OuGYxz zImauG>~KL^e74OkxOwI9-@IN5efK7$8Tn)h99ua&{69`2D*z)r^q%qxRUh}X4SH1@ zd8c2V1+ll8RJb3uzjacUvCw-=@9MpMTK;>{d+Tso(2%U+)6nln<~1RFBCgtgVR~t;QW#iwYAxWaSBf=U#q6FfI5~xK8x7$9( zf1xx;=mfE(XCD*%3*ZKSue}k_9(hPOPt@TWs4rt7a}cy6XelBst{oFa2>#T;2hp2v z6d2D_-J)!RyfV}{BO|;EHRRtw6w_Jq{@z2E=^5~MJbUbEwf%ZFs0jM^|+#a0xJ7fn{=S5q{?n zhXrg`@ks0!(hQCH!fkUCO79wL%3VB*HayLQK4tV z=$d7=Kb5K@V}`xeH9`q9Ka$g&QV&4c!*RNEid_ij3I0_6{^{%F8v4<#)bf3Vr_TuM zT?Rg>0k7E*2_Q2K*Nm+~XqcO2zS!0lxrZu{DRDT09C1s}1= zs1Ok~Fq|bh*+1kQHG14G9q0P=(|GXbI`220x>vsouYcceXHvD4Bv6&vPV*6XPfEGU z05i!j3vmfaV}c;u!y5#r|1{*;e#pzq*g2DVSL^On7C~hEwNY8`x1oncd&Bb{gF%*_ zMCo*{0sLo1IVnpuPI3)sRM2bZ=4Vo9Fwq5{P<{zKW4^I?;VtZD0kPkce^IRkbgG){!eXp3N|fBWazojH3xs%ep3IK62%JW$Ty=LVH9BmX72rZ$ zZ+Thw_Y+;C83=C^`1|G3gY(%~3wM-Rg|7Iwlg#{2eWRMS2WM-2PbWG8_oFZUG>k8I zLqhlKG>8_&z?V9Mk838$+5*1@&eLcd?+-vox6507tj1aVW*#IhdMmPy)_lNH^{P2I zy9^L40@f)#8NB?YRTC!B4jw8pT#i;;ql33|a1W8RZsO{l#L#zPj%HRiGvw!9t$f9j zv^gVrvqt+KV7qxWa`YlOZV1gotxd;)H}Sc{s?ic|pI~8H&!>o0-r#QtzbPZMn%8}K z(h+tONUG*bjjj>D7T`i`JEEsoT|GOtSVY2(lauOgU%*^hBqichiHIZ$qy>PQA#?H` zOG_L7+|q;+)b5HOsJVY-a*IaZ;34?6q;xv9FMlY`iT>|%pV9C=Z>Sw83_+o?HUe6r z+_xeYaUNtzsg?)h0tM~g@|f8gY*!<`Jdh;BF$J!^P&}R(^bnyu1e(%?=Z`{|y37c4 zV;4I(zASr45F%Wq_F4S`Z{2_MKo>qyOO{U>osuNJ?gm}j$-Q4gpaI37D6f>?ktRcT z9XNAbdUAH@{WD}3?(Q$|99~5#!=t9k>ru+#?*|Rw^_QGEaLTcvGPlR zXdvb=8PZ^PY+tU@(BN7po6tWpI2-9A+5y~A6e1DPb~K+4W#gNN_k(4WZ- zuQ7l&jSF38$Lc!Tf2cM~3$>SM23`$`WD-Vu~nFNxGJe zYks%|zJmW2v!@Lk(UZ?A%gUVZ z2~e-+AXce@>)VCJuGK$@*|@lVuFpS-_|ze1O0LcYE4MS&HEOB*t{?UNxuWToaq)4% z7v~apXRr8VR(*jz8ws1*2Q?p8WA5Bm-sxKkd2-QcyLvN@m6H@=d)S))dlo-+?k|x7 zYf@_%S@w2^J*I;2bdhiUymbeI4h#eCvq2d6sqg8`gCWl?jz1su+fx&*JY&=TA;<6v zYA1*$NgfydZg~K6Ht;=q_xU>|@k&d${wE78_8os!8{(QmQdDMlBwH?J1ARb-UiA50 zW$8;q$>t?H(Mv6xp^FS#iqtxe=4Yb1S8Sy%g9nZF5(yvpvJPM!{We&AZ|5Xp0o0BW zhe$qFtAkB}{+8%1-9)h0{L)UxOo~^A#a8D%na~r24CK_wV9Q{?zI(_$=RCmvaWflU z{-<2FEDF0*Sov1XQ%r}5-Q#k(XS4)1zf;P_IcLY7o=)Qp>C_YOom@YQ;T-Dtascg8 z4mO&O$4)&{1HswQB(HX6y0Ss*t=%lrNGL;Y9zB&C{Q;ylhly$^_p9VXtN1OstR)&h zX&?qs&{;Rk`U=@q7h>{1@nBC z8JW1)n{RC0rw}+E|EofC>|yT*)b#Kpc7PDo^#Y{m`v50RgjlgrzG4pIRFMlm2Ik`Z zx}O}OR`IMH@3BP+k5=;ZZC3y0^^6>p?1J%H$llauekZlL-FYL z=sq7Sb51ic+ck-k;BWa71j=?vC|Rme%D(bIuq4KqH)DdQIVDQHzm!LuYe%_olpHhbU)+5 zYbd>c6fPs+r=xNHg$ym=98zBQpAI&1dM2U|fuEAcCyRN5hcvaWY+92gH=JtQAjUMPj6ja`A>dLRya^&4$ifIZMZ(4Jh#lHLB^Q)TT@NOV)clG z4-FgP#%B@dn3ShQ%DZ_}$PW`Tn;jNz^hBqKD;enmBNB#F5+sY>{OekxiaC{F6PjD= zPtSx#ImYv(4qpiUY4P5n`^_n>xU@3NfTqv45h9>@$Whn*4;eyIa(!Vt33IvR(jYGEhZH*OR z+JVwONF;^`!9CH27mJbgwi@Ud1!tKFo&|i16`C^#BNoWCe{JuohkO@*xg9nA?7sLm z=Lx!=f?N4aw9xUdNO@fy3p$+nP%V5Ocr(nfoCWt(Z9xSM{lTYkqeQ&NspS^tD8<-r zmT$Tnv1NV0azlyytGSZDkH;fls{vi6_&ljCDH>?sW-b9`LjVYYX?klT?xw&WZJ*@u zxVzu{+rAE&Y!^8wV^|mh>P><{w5}{PJ1Fic#M?T-Y+&H*U=W;;0z^oXSWc5bC`xYj zqRcYh^i@-qI#T%0NAMlp_ITz~^9xE-FRi($FK<&rpZjqSf;hCg%$RawFE&`Xukqq` z2Y74S2@XV1$0K~5dHK=C4z&E@SCo?#6;-y*ZCTlmk@c7a^yd=F>1Ppy{X8x{${@|% zbh(SaEy%V7?Rzo_-;W%s=kH&~Ej^OmX!IE(Z~L;GfLOQrN@Idx~m^& zCN+SZ(7;BF9DOX+stxV4AyepnA$ex00G5z0^Sza~&SA*T1 zuf|^feBT0fAVW<4klTnJ5s`u#!%>P?eeg@08FF z&uU;liIZ@|hx3ah0z}JY6x#H^ zTXRP*5!uW#z{o=pqT2xj2ga+j3`}4gv`G5nD0m1|+?*fc!8Q8^HtRw~d`giWrfC%j&&v)Zr4$n#+@ z_wF}t-o=3;nGO$PFTp%AxDeNm4X#6h0L8eW)z^OH!p1o*D*I5lT_Tx<{3~zm=zx5Y z(kAw0BHyjU*B|1|SHgC-D2oz?#;wk)gRfT}Ah>52o(li);20fKOA9p>-)|ZITTa33x@;ACfh#Ja{d8?7e$&{Pf$;^8_Td$g2 z+X?hJ$XST%^MeET_L!9SeGQ9o9z6kw@_Sg>rCz$dM}Y5A_Y~!^;`( zbP(c;s7^0aPvQODYyRc>g^7&h|f@kpW=37rk1g6r7h0>oN<3Xg~dl`kakq zF=aVy)67Yo-&r6GBC8_QfU@)4Hpabm1&GJW>&&R)(=5{|a z;n_S>21EH2RF%IgDAupYY=BV^ap)0|!dC&Qu-CR92aYXM{*BtiJsLW$S;R}e<;vuW zsAkzbvHkXUitA21x+`0?z~JO)qMZ;?;^~(fxMX~Xyv=uI!B0}4&qA+eC>z=}#Pt9K zYX?`5<3Fo{ad3W3LPmeY!2X%NRVC+2=>%*Q)KK*zLN&_7*M|5}{Mw)5M)bO9wmi`R zz|)|@ZH(smu1=`Idmj1|Bx;`Y1<9|-ZxZ+`$}Rt*MGGCs8$X!76X?KuCoYPo+>ehZ z`0br>LH4AfP288YQHN930yr2>s~&${eeb>w(v0lySsY(q3MV*ngyz$+ZtDwWXW zK7LX)jvvCWpAp#;l;=(SWBn*Vxm{1d5ti}~CRy>3cFex@%eXqusSTcFgxk6@Rd;JKc3qld1Dj!@88CMrtnKF>yWzrGzN7gE3O3a~Riw8kR=4%90`_%!X`D za}hQR5AkU^Rx#GEZy>@)?<(L5%_#YKZcR+~W)fTn-Wfj^vtgLr&muGz?=A2i}SJF2>e02iK zP4jUUQaC+=^*dRBx*pXo>1;0&v!y~( z&!SCNmQ91~e{{2ib7WrgE=MMc@lv23F>mQ?vq(rtm1kS%6>GN+@heAs&fjkmyCe>U z-D-2h#{!3~0TL!$$#FSk#CiVJ*}L*+gC0=Gul(c#_S2#j>qg#a<#4XckLQ`?RCC?% z-MbKY!{kdi8Ww^m8c<&VIi^%F0~(dnzwo^kUuFh9&$hM_l3vl4b4-la=s5O2_1NtW_I20op|GkyR6xas?qAI zcUw40lN^+|VA0F36h`A8%J0%CDCSQ;=29xP)4UGwUwmykWbUm}9MTNJp#1Gt-%^I% zfQb~Ck2Z{rtex7y>ttgjG8awWw~c`wfgTXYp2c(HCFN<}ye?7(r?T`ioo=1GLHjS37!PM zN0TkELO1p(>vhh*TE3gysF5#(v~PEMH@;o{-f|;VC|_npfg`o-^ri307WQAZo?O^M zf4F&1G`ZAa<1k(qE@j>g${-%DvCAjWW+-YUKz+?DSbe}3R(aD~Jv8A6K;+f#|0 zw8rr8q3bD0*4ljZ`%xEC(tYtsUAgmF`*dp&GNrg3?YXWf7Ellfu#V3m+)86e0$B)J5ZZ? z$|x?;pCuc&q8+X^_=zr5$a=Z&x3ey8$&tK#98g2U-~6Te2hJFdFVV_T@+^!LBOuoC z4?JoQhLc=ey<}PC)S{9u>Vtll7_JP1awPZD)o4Omy7(y2YP??N=Ps9QaHR5myrmB9 z6=d~shKMS=PizRdevS|Y?3sm4Kjx0CaCQjC12*QBjX?;xFI=#lnF0kcY1z$AijzF6 z;Z94^jCL-|GC}`r#4*qYv~lbi{_wI-$BF?e`Q7Ka?EXM6WCx6pw}ryD!>UvG-~3d) z0DXe)^*dDz@v~<#w5s2FWnDfw`(-YHDm+lW-Prs6_%3=Y;CD5tCW}=5xLXFJZ;8PGp0f*eqMie3 zi<+{5k)3kj{q0@QeJPA98?t4>>QQ}#%$>ny_>-HdqH393B)*_gOU==FoK6KRx<)8| zng82RiGJS|(Ui!YV|M3vYZt(En1wMWRkr@Z;%_+;)_AqGzwc#dm*twpdXl=#%jJ+Y zk^oh~d#eF=Nlubc7~wMZGJ@UdS^(#h=NFB9pgxTdSN<-eQ1CQCZ!S%zkZN=fI9?yLdL%yb5Q4BKq6y(tU_x^KVxQ!^&;j-_5EUh6l&B$Y zIU3zYJ9+kxz;1*bwITpn!B%2oZCQ~E@XH*8k0SG10F`heoK~s`=o-g`ufp3*EcA9H@C8@BD+UgMo ztsCZJZ#y>6eC764-rqy_EndqkNlC;tZAXj0^Lnd;Az$SuX8K++^WiPWI-x5dfFA)B6CSP z#fh^Y$RpN!5R6BpL1qzpW9a_QhSh4HNyRk7teQ4!)68gh%!XR|b7TGexs4~L!zf-o3jz+87(;nK6YLysDpIrYFmC$^prJAS0D0(9TaM`X^LSX$d zN=zJsjJje)OvT0+4P|8t4oTYpyV^SBerfB(-mf|kdfK!4mrm64KWLdfy6Hg?5atVp zKMHMZz1p8SJ!Cu+V`yH8|4a>0r!vZ~tV!N-$;g=M#PX5I=^B51onV~~ldl+0G(U=g ziCnXMyLKd`h9MVT_$Ew``M+~%0cm7OU%k)n4kTQ!9hKJjba+D!kRX$kR3Bw(B|KYt z@;VzzeXomvy5)f^J8&C`q0CcjmM0Dkpkg7! z-#tT|bMyKpl75N1CL`WZ1@j!(-#i)U#YH>eNg5@Z3c6{rn!RQ}Oo*DoLq7ouh!jg-*d_5^eYx)USEK z(Pm~zqRf;0x3}eU7!iCL?hdqXv^N9W`7swY&Iv4>KB878(Nb?a9BYvLGBJD??=4Hh zgj!J`sS?x5eXdIQ)qOc>L8n-_qi}=7~$mZ}e zW5!d)0Sn0c8iB1bRJKPo5hCNbJNrPfH-{ucsZ9Xtt31My5bUF-&Yutrql!9zx4#m} z-gv;uS=-76E&bV+_Sq;v>88($!UE4@Qvz5l^@Dr98rc}~%kQILnch}XUjORpgaaNa ztG$03xO2OWtH3LDEgx4alrOBE%REN=3nwxp!7K3|8yje&OC7MdpZ=k|7m;RblGg8U zcyHeOlGWJfna)f!Z@Ro*MZ&?%KAS(r`uD`IZ3`Lyp4&I(R{Jpl+kXnKWMHPDKRbo| zi50X{9fI+_$|j9FjL$4PgHQP92kdq`gTz6w&kU63b+};&g7?+~kN^quuCaHS1^bo~ zQid`?-?m#*B~T0#_XBTdv)pCl*-xoUiLHMC#&W0R1=B-$hVBD90XIJ)WD72EwTp$@ zbQ^zoc=%(Xo3rzqxW;gjLfUMaq=@X$qmgG3Z+>e-Xwr|pWY{&KqWw#n`L5SMQEW*Q zIG(x{`?3U=y^zEt>HO2ogEP3%3W7Fofdgx#Spx%>3M000HP3(r$tZ{X^K8>+SoX)L zHuz=oJRdetcgY`*l`94;2?i!#S7E`iFRl9t9HH@9LxZmVTMPdQ_X4>kG^LR|t@+=b}fCIilTgy^Aj zE2xhI{ii-&&#{o?&aO^?nb;hdsIY*Ib}GD#W{jKaE7l0Y>uJz1#9uF%?)nuzRf;C$ z=@M|7#lAgW7dl^9`9XL3?6OJr*=T;ZKtaR@?>pNj7pQ04c*TwM?Am`$o*nbIz zW^+;pq5=)K`Z{n|#CND+26=Vw=O;+LMoyLuDwD6eZ640P+^NI-)NhMnl{SO86iIrT5T* zTY8E-q+&&@s+50QCvF!Izub``e?D1795$qbbK7r1wPV@o~YefnJ=y;^^j$7!bG6J0{(az6E^byB}2AH@`8w z6e|JrAYjC|+Kkmit>Lc>>Z7G!zE8(Qp+({}83~3+X$hz@h%j%Mw)M8^^^%or6|`%) z)M6J{4SM4p@%t4c11r>X2-S&Sp+evD!7=w)%Jq#sU38U_h`iutR~0ZZ>bz4G-B~f8 zegkver4WGyS><<)2lf4C)!F|5CGSxQi5xm&((hpLe8F^^DD~XRTQc_jCcVH`Gm7Hf zLBO&YRD|mv=~t(5*#bRPR(Q~hQuQum2xQX690=vqm8)&EnYDGf>Oop^POIu#RE`cB zlBH6A8>6`Hs*StjfkPxq45LScG)J}g5s=g%V|q8Fbx|3-RdNLhBG(%ioLGC5RDgWo& z{Q-_I9nGy-SR8vlU>SGg-sv}ATDEB+B#Mus8T}Q!HR=zEDQF)$k(Y+VVmfdD&{+!Sz>i?qpaqXVPuaPj<11#gwYd*VkW5@5Bs% z-PN;8{TF`*@63mkY4~R?W=Zx--FNvm@UQL@4B_>2(m}f|q#N&i^L4`9`tlP~gJ0vb z75fQNdDVkjv`>HADnAexovHP!W7Pcq;W7a7Jo>GW0TsIMhJrM9r7@xX#R={z3LWovm2uwBUum@%zjkHui>;>qd8j*H1Lu-{ddL zVmAxZgKbRtoS-lGEOv^ODroBhp{GmEUy>vZ^!I%BXSPf*3i9Vbo{1iRQ{6UFo7gNH z@PadXVtWo(TbEZ2PO<+Gk;6$Z=E5jW|HcY8BQ{1%=0JpZZG1xkOI`G%RscFU>&`4} z*|KfX;Xl0C{I1tLmHS4`^5(s1c9tiN!4EBNu>w!W51?yoTOcrzZYF zumbml!Y#MOv%%AV$}9D-wd2`WWZV}#F{L|C9>e8-VmRC;ePF?Z!il?DLXGChvQ|}m z$QILcLUjB2e%rnd4kO>{@$Dw2?d|@zv@O5OIq$gi>N!N)oBeF*;|V989d9Ep^AyX_f3` zKj5HM9{a0_ERg^k=bLnx`{D`xKJN2L9*~KXzbcf6A3TrmHL2>{NWo^jN$E+XUkY_LwhLR?AzO=tAn_m?Ysh) z?P^0|b2_UI$H3XEYOl~cWUhr?TWI6cW#RHp^d(brBRt^cmAv)Vz0_mIuPla*Go)9Y zL;5bzfddFe?!0Am?tlnZNZ&V>@S1A0J1=%^bn2pRRCdQA`3AQfe51C{Iw0RqNXj&H z=fN-cPS1HSY@))K<)><)k54TNqIv!%3{~At+HEYeo+Tx`M7FR>FZ`+%g&_Ln_dBuU z5gXYoh$YJr7Z}v{;8qw|*J?g(PRvR8t% ze_F%ivpM6Lx@z!X@qzh7z)1luO5-}4@D=v_QyXZ#-*|g_%hS%ZsWr!D!eD-2{EwGW zoUQl!lWkIiFJjyNYa@4>?DUMm_m7eUgxaISCenSW0NxY9x?GB0NkZ`Vz&!`KPm%oL zg8^O4O2&T(+c|p4PreCwatM5+-TDgrAs6aimMojbif&y%m>D5qaI4LA=IXZ9(srU5ePx&q>9u`P%&ld5iG@2s`iKs ztikT0$_{%hiiEU;sx%5M4R{Fu9@s^XzBrWI#ToJ4W@n?IiRX(4L59e)k}WY)!A0#T zN6HPb@d?rM0y+7MC71p0vy)7>2fz6%CgCpp)(TH`onfawjV+DqgtCzAMAZ{6khxT` zv+k2Bg8X%XtS$;hRKo;O>qz_WUjqttbqZNzM6nV#w4{1Un118-CtZw5j~O!))gW(4 zCo8{!|319i{g)z;h^y1_ReaYr?VTbjKgF}gmpU@940qx4gN-OnyguXG%dbpHPml}3 z!Dkr@=$`*0>MXpXe7|TvbeABV(jpDw(9+V#S6T+8M4BNa2LuV}k_Hh05$Tc~kQ!j< zE=OwUZkV|9yX&rX|AUG1KJRnR*?WJ!AJ*M%MyLmI#^ZLLv){vKj1l4cL~fRSecCT# z^(A-szI`e|A63>Yoo_2!Si<(-?=&5E?HRg$RrOJ_OPV4GcU)eu+1#Q@IcM0^r+(B< z2S9qfa{!UT9}eeGBudZi`*LuHdk|yH^`0Z}e2_v%Zz)j3}6Eb%4rgoa`+k<6GB*ZMftP4vgVX&&yj6L|3;LRINsZp0wioywRrh zh56g1LPhwnZX5F*(1*N8>>Jp5Z80t<-?u=~WtqqQ0a&5mAyJdsVu-wgzV@f~c8Bx{ z$HxZ%YuWnaqn-M9FRq*ph#%=%|LsBJAwNnzd?`eO^fmnKYoU5%DLj3wIegJ?6grIV zd7Lps8H|rqu6>!*waUOOuRCd-So@T0_jm@@Y-JZdo1D?G;B{NM)oqh>mM!|+QX*je zMlxd9u*I=K3yDv561PUViD#n^VDU>^rE1Gks(yNlBl!PnR2tLx&XJAy5PJ?p86g`uam~{mo&f#wM9}-0Cw1e>d__S_!lgBc^OvO<*FVum@qKiuda=8F%}n+hWTT`ji8NG}U8$K&ALY=^Mg_Ep zDIP}B6&kywxBWP41pPRDlG@N})nRo_gSC%KX2Kq!yvXX6dvcEQ!Z{Ni9y!n+Am657d7}R z-cCx2kOk3`ye&5D^TzZk)$rEg;eshhkq0dSkOrC7X-1^=zS19uD{u$%sz)+Pf{gBw za$OY|oC^|%1I~I?l-_Jg5?s|R+wwbl;`#yFdG>KUM{`Ez;>>Ox3<>^xerv#U<%8nTFUI{rkw-o*X+)pU}{A~6w74UHt5^)CZjd9S28Uqs|5m8!Hy zrR#`T$Ylp#jz9JAG{d2+a?(`lEr(5>3)Lk(DyJgm1NiBa+{S*?E~SMrXzTSw!C<*P zE9f8kDP#RbE$1wb9}(gqd($t=#6?NKLi%Ux!ht2}T$`Fm4>CAMfO~jrm9>p#6D6k! zLprp3Olw5N1+R~2*d@%xiWuqU@Yj*|;f)pb-+DrcQiiBk__+5kC_OfS{yX+H_#4J$Po6 z@mf9(T2grJs-CXtZ|SbX$124!af)*|Q%Z5#pSXykaqaT9Zo#L5m%udkgb-?J0yDHZJ2%GDHr@8 zYD!f&o4)_Hi#C=2ED>fMDYPpsYH9lgg_CdMY$$&%H-g0x##mX2`4Y^?7pKs5eyI$yWMxlFs_@b#E;Np zh?h7%*2%%tjhQ$f$thpv;M!z@9P3VU+#SkGLzJTq`7K3 zIn#`Lp?A?s=N84U)7Tc*w~X@uI*|m(X&fBqj*;TbpGYBoYHmRx76pKAeZzv&bbFaZa|gN_MU55 zHMZVH4RR%J|1SQ84;7-BD^4{JrAAEnBtgEo=rUc@YUP(LalPVxyXua7BHE!x)uaoM-P*E59_6Z?Rj!t}DI*iN1S6Z3hK)cQqF=7YPx6l`nA_qC99k z*jh;Ek@JPh6xRhb1LGjPtovGg&gagkV2qj#j!R@L#L#D!m^oX}mg6N6quGkFL}26* z2{!MgudQ8mBks%+&`l!(ci?UYL^|d*HhvWM+m7OFqG_%GtDrQkjqh?!0T)mHJkg^> zl1J?RUiADk9z%dkTGrYMkJB~dkuuV+|B*c)S@*B!@$^XcHygLqUUsR}VzJ@{`;4cs zXOY~Es$Ix%YFosxuHL5@jX1= z4TcueCDwrHtIABKOZ3Wjcsvx!Cc?7Afy+X+XEkZR_K(X@>CG#Pg#04|^t`Oi+M8lSb;%{R%&tWuqbUF#+swGhZIJ(llxqkJ!k0U;0{AzwxzQ_ZfQ#PPXj45 zGty9c#ew3LKD*CG>O|zT%!FX(sgM__BIVl6=(cw9x!d7km2jXx@Xe=-dLmjCO}iw; z7UM=X32n3Bq0rvDO)w#upGZ zWq01lwIXKpIG%mH&-;nrr*=n}OXyng&A-GGDDaplJGd8TI-DHUH^?irsPi6Df-`t0 zHD)lwQVq}P@WAaMuRMemljeLVWu&N8zrBcNc&o|Ys^^=}EBo((z2N8go32tg0V)0;?fX&!HWbC!*iOuhbm-^hJ!-=H&%qEETR8#mbk6Yz0>x~ z+A$cjHe*^+FYLFi-GZ+=!#R}BE-8%(=dMWQ8NzYSQvTADH7R*nZnk1{b| z*+!>|B$_@SK^iX*OjWkk*x7nPO6JbQQ_XofEv#Nd>w-4pdC`97SgRw3iMz#0qU9TQ zwvsgYp+oAqEhoG{DR?09omaE{{gno&V>ODIa1#%>OBXnqF{g&PewbY%UH@N^yncAx z@ME8kiql~~b>w*abt5!5?oH-ebBAAli5h#i1EUac%ggyz^8YI!Gh?^+7dYMY`&Pz1 z{C(zbsHwmgAS%)0q3U2AmT5>mk^IDsgnrY=CA*ymdn4yEl4x&S|A#@<=Ig{$Tr}`? zMX-aZ?=ti2YZy>P>H%y@Co@0#IbLhr8l9Zj-tn%iL`xxz9gRfYf<4p>+uzTR`Cho< z+M7jO9^4e$Biyt5EI}49g_m=3YNUk3&JBvAwuZS~R2gzuc+U`Dg|khRccULe;2<@zHD^PZI{Y`AN%1AtFACZQ%ixD0aGtz`wNW6AOt1 z7QkYnPLI!c->Ni`6u%QmEC|96=oT}_(Y3D8;ZeQhrb6qXoRats>Qw%?t*l$oa$gQ157cJ z{Np^=iXYP+mNCPg7k8c#2TOB~ABqa|+M}|*GQ%xNDtdN;RGq1Y^>~F%Ur?mR}}j9R-e0~@G01t$*f&C zBV<4#hS7`wXA>Y+S-(G;l!LfC@?^DI(=bZ3QK&$INARiKK*nQ7aYE$4A_}5dFhvp1 zq2`gl)nE7QEv4Oa2aiA7u-yjfyQCU71V8t@!*YbB1|h~?TOd%%Jz4sEnvm5}cl?7b zhf~5)m9zrb>Wqsy1I5*1W8B@ItfQeyogyv~V@vBuHXw5X<&+3O?>SyaWk%Cxvpvji zSkd@a_8f!ngLB2~qu8f^;qxgSx_i7i&TscQRU?K6zK*B3bXtCYdtYnyrRXIC>-c!L zO>j&Vbyb?}tR7V8`{gN_^cXb>jLeC**D;_-rQgqU$h;JK5zF!a5&=7J|GMTlba z1at%RR3R!mc9vi=+sJveW}}IxVe#BTKA!fV#Cin%UiZO?IfcM);oxny;S2Ha`XCg% z{9x^?{(m1ZN=h|!VMX%X7AI*QbOq~5CnccpBM&mG?S&|K%>e~(-*`rBat>xO#%^(72WJ_#R z22=2UJFv~c1)e3^ISZDre7B8*yAx&y@6HJ8<^IJPSk3g7KGJ`n^Gw(bEl>dx__>YO zka+RLB$;>H6LhF`)&{tT1K-08mV)=Px4PMhBK&ZfT|3s)`Vyt` zyXI8_rIN5zwwc)ahNgaUn&m5vaD8@5FT!=ip2j--;_pqCv?{J-6yi3T#ng{iD!o*F46#IbMG zj1|Le3z)iTrO6j(V{tAuXY<&nKdZiDHSazDK?p9eVOLN*SSLUeBbPyZZYOpMg|MK+ zF}vEhVJr}{8af>zmgd8ppLK*PM;c&;$IxvQH^?p>o8nZME-_d(I0W` z%A+vR5v}65)&Qx|{ zzF$7f;&4hS`@1`h_(}SehB%3oF&>y+1KAe5QvAxW!AV%=M#XPED&pMD z-sxh3lpoXQwI(W+Be8$*meO3zxeAsYr}gzm>p!t1{VMNVrMkYd;uB;jAnM)%a2$hE zTaAf(1(%Y^o{{QHtd@_zT=1_6=d3gnj@5nr{fZDqM@ClpH&*CR`D|+gUFh3vUpF7d z9cdh(*LiN*-G%Y`0lYvyaB2klBo&GmJg!1F8MMiDBX=7Q$+!HY;zI7~=fqH9Akxj2 z%~l`E(uvaMy`@;GbIj;w|Kt)Ubx8M)lZ7=!8rO)z4!hO3o)3mub+flO8?O^fnAh2t zZ+*Z+>SGrrpf&SX#9E&2&^LE=chbT9(xX923e1t;x~z1!Q!;U<*#%o2O`^L+p z?JKb8_U%V4v6B&HcL?%v=#5uW`uY8GxgxG!#q4nrKCEl8nM}D8|+D!Q@0d>1*uMQ#^Lpc zRk-%E>+a$8K27LAs4dO5+@~pQMfZdAbs+}uX27TKs=zb7LY}<^lMTtmeZ-|*NV!J=Y9!u-q{8K6jG;+phWr(mQNdC!r z1kthzu*L{$Mw6VOs=wfh$`Wl!kzF$VJt;SMCNz~zN8|rW-F%9`rqfqAw(kV2kRN5l z`D}+tH8vU7T$teq_hYg3#Nj}#fiJyTCyoV7+=3Wb1i{WC1GSx4!{RLW-K z&}GVfk`8&0S;7s@Ds=C^8hl;T1wL4y8}bBZi+uOIc8%;+D4xJ)-eqJi{vmBg-5!PE zEm^}TLp2}l;-zubU?EqS3xhM>)?>n=f`{8xFfCW}2W(Vd&wh#=%b#@}-zz_EkgD{O zz5D7^7$_qT6VT2LmCSNlP%S>X?=n`Es|c;QCHO)mruh^BPl|r92xu$SPQ*8U_VY#K z@wGkXoHQAvwfXvoT0^H@Y%EB_;bwegOQ7 zXS@=PoVR3lNz-2~C9*DmA@4h7wp?91i)!3;FhnU8l!WeCD3zS6tQnymVl2WDf{jnm zJ_4Z&pd}czRW*7PN3spAg~HW`jqulN+atbxN3#YDH`T2sDS8b9zcAUVD{ixLC%e%v zlOvlO^0Sfyr-mO_R1J1@9J1(r^~y1|KmVHWq_5)pm!LDkriI;(QgsS5h2*Ih-VJOp z_1&ve$PLAH40io`MJ4o#~~zh0a~B6>&JswnvsSt6$XPl&_*i=h^^w7Q_RkE-=E~1uXGr-57yltUHm>!UDKXv8ek`O z@{BuaIxU>^vpWHwQ=pP2Cy-jfIOpvI)m2&;F0zch@EJi$cq;)}cKTFIdBg%E_gF6h z59smH3w$sRKmfN(aCATq^}1mbu@_wGW?!+^xTuiZv#k*M)frgI2hl|@2pdBu9`gx-tfJZdH7a#nAx9} zS5VoYzUpx+D7(;~B9{OUZa@_*aqWYT6q?L*xr_KvT}GB{`3?_WC7|MRJ5GaKUz)qS zCnFk93IpDT77Er}iZ}Xl%`eaKVskKTDa+qb<$pt@4n3=>Fo@coHtLl7qL~)#+B`<@ z`t>5h^CuLmadl0z=!6b%xsOjcQN#l~1rRtMip#nuV$&k03LL)}JUYqK+S)Hwaj(VZizZ5fx_q&Md`_xZX^P+jQwZoGup2 z_6Gy{eXP5KVe7Pg5NeI?x_+$)elu>%P5ma7){*dYW_T2g41RhOKh7)RT>jk1GY9J; z!DQ7X8QxqOdbV4BgzBfT#s{}9SNc^qRV+4}pAOe`>gKas|Dyfp;o|^Lq@uLUr8$$v zLn<#i5C?SqPew7nv~*M$hy=C-cz&v^nB+73(bi`6pZzejzJBV*&!1BR6>ViNiz=j4 z`#*SpPM#4caA&SJyzE2(7C-Xmj}G)$y1$|m6bMbQc~HVHF}MvZCJ(Gh3I7ypQC-)g ztQ{x$`Alw}AZ#rMG1qjXMBw}ARL-8X4YB2nO8&I$4Cww_EF$veFhoNi zuaZg82hfT)`SC9Fun28>y#|V+oMHX(D$3=PvltO_ZUmdkj@d?9##{fdWEx(#`p=rh zYV!A&$xL^Paut6!HtUP|??5!5eb~S4OexrJ{QfmX45tJ8UE@+rY$8S9bJCxL#zz(2 z*yra{-hj8f4{%`A2N?(?S_%lTR`}snjH9BqTQScK) z`?BI&QK^IfQkjpA{Y*>Li3d&^Q+dVQiq|8g0dhQmtZ?~uF^NHEJn!j^`~?n4S~->e z2pYqx_Z{uap_5qop%_(VNuMv69#xx@;nNk*>1>{qmD-;xg0-#UC$_qAoB!PQRmjRM zC7s;Bg!YVgg}V?R8kWTucga%xrQ>FISDU2P|E0Jp+mth0(9<{NT8$U(9&A&+TQ@Y@;-FXfsXwnwEgyXFIC zDgW^3sj|;rZX|8^TSI)g&xk0hl=AV^MZa_^iO2-wN~ZAW!BL&F|7>jB6bv_wHEm<* zMJI#3-4UkchVS7M^VY7oBeZf@<$NAltI7ekD>y4^QK_g7wLBD8^)U9m5ix3I!~SdnmMzz>pK+XzL$4BcERBrzTkr7E(vvDC zhy^S3*fao@9ZW<^$o3E9-a+$dR+u6R0VCGqy_#<+M_$UdoX{Q%fOGg8xS!Y+ZR;1 zjT^;F1DwCRSkul4lUjUBKL0oPScw44%WGfF$h|lv(7)t9Gl}OHCvUJ=ALL|RW~~)> zy2s$caBkX&TjmxK-TOY7a9e)l^t0EfV8Z0J#7r2&^H=S+5 zP{`bx^i&r!(~f2(IHR|14H4eHo_B;(7{J7TPnz%1o6hZouJ+!uCf~yo89oJO@Pu9w z?4km`LxlyODa$(z1r1)nP@!SBKY~rpGYTS0Vrb&abEktG6z)q)v=auW*RNZ;PV3u4 zH=^&8j~%zgt*dvW{n=2Sx2>%7^MN7ecQNi$si}1F?%&MB>mB$OwYpw#MTGr{@BfxA zDy!%dQh2Wg!bJEDV}tI_ z9hML^f>+nAo0H4`AOd;uXtbvz1fmDos0Hk({9MgNH%ai^h%YYictvkNz3TH`C^iIh z6!gj}`nlDe0WX}*@y6d}&;7sSwC&JtY`9M61)ji9k&)8xiYW`?JwI`N7Ejkaw!_^9 zix^;YhgK-y?p#l=xqj)uWjN*<5ukF1zy@5SA(u5PiI6L!)jR~+{W=DE{rb8FaviXW zy>I`9xUJ^Ygytz?#*Q68%d)odf9@lsj+uh0pd4YmHuNUjhoJo>C}tILei2Mt19c5P zhnxgM55vAp4O?YfOvT|?udlZgz!((jmk;M3rPfwh=}JW9oG)aHEm(Fh67)< z22_XlUjV>DrixMhrKQcXPN9_6`l-)H<{@Y5?xk25wg`KhymF0b+pf0l+VQZ>qFn9p zhzmbnIrH5gkPR?6-}rM2#upP@9iksxB^w%ZMcjuH_;_MZV$4pIb{ezEn-d=C??}oX zVckcudTmg15M*@fN$nxwB0G(IH*(C9V$Rt*^T9{BWjOnIpkm;9)M$$Y1VLLjLGo)6 zm09?xoc+Z|Pehw=7>Kb(Hb53~YvY7DQ$i=^&DS_1kAb70O+I+<%I!V~dbd~k#pzK9 zGNIa=qgGu^B0=oB4*}#?8r;5J>5pex@k_kl(qoz}Vmtb~x@_5265Lva;h|{J4DhAd zC8|DOE)XIg<^IJmL zsYs7I28?ogmZQ-HeHcu@H%RKlaa=7FdWZqM#QvSxK7n;!st8`0U-yKjfyUh2Ya8kg zi6&T52zG9Xv(*IvV9kSi((j9NKW_{V*xQKLf%8wC%%A3LV%q(W{m}#jM}Iz17*S^{ z)WqqzD|KtU!WTFp?N@#Ky?ow)hQItwpqvtZ8Q{myG66m(+;Tll#3{GpCRHFp+`b5< z57!*mYyWH7CP66BQN$$ZHwiY26T1pMPrkK{akUN`MW9r8r(ExFD(fz~qU|ND(FJ5- zLmP4mX`{J?E2wI zV1_@?b+}xJT>V$I9P!Aio|y7R<}eAZ#d$+rK3pC)|(|Jc%BRPA>~@{gm^fg_Mp$ zu-2(bSzBx6W0{S#Yy*HM+wG66wu^~MzCY;X0_{A~%$NIo&%XpKG^@mj&=aB8B&RI80y;{`h< zlf@`tiAl+AO9ZmjRh|8p7ydcQZzJMJ+VrH}oohvTa3^X7Tjy<_e%+-CUrC0b?5`t` zMowJ<=K=j4R1Bk_@Rb%>NO}70Ju0;Xcpjj7o<)h~6QHqe`GAqaztd*WtYWQ!Gls4lf#iVRkRi)<5E&(URj3Yl?`L zgD|ya*zX!W3=Sf9%KYiJ-SD#;gT&CJ^XdF z+U6Kj)*%zmVQdToMB;nDeXk!b8Vz_KHv8}?2VP?r3?*WmcM@1;)7Ckv+tS>-LaR** z+$%l3lyYTyrJ^!GIb8h67}LOM53TgrXR##@PH+&clf4lHEqhe#84t~6u9R&`Trwxc z>K@5Dn+PaANAG5Q_tlM&Xz$VG38+$w(y+M{68o3uZ$$lZ38C#gc~*KZ2t90i)aqQ= z#EbcjvakP;uGlxXN1n`1E*O}!4zx?hpGd7rQ=P#4RZ>_zF^0AWZUjx`jmna{+mpf! zv`<45s2s=kXxS7k@(eSqy+LaTBg zbvlQP8=LWbLcL;_Uu<`-VPj{W89w{wo~MKxNL@&Zynb1R0T_gY^9qgWV>NBmD<1SI zKij#7=1Sgwvzl;`RNAHL;s{1(Czw~=51T{O&(~e7|9e1@Tl|3Tyqxs0zhhs@kx)G| z@O`oEGYHSEYo6c@Ui62cQKb11jD(N?!gjH8&5Nq7EMr}z?s=ubT zqb~QjanLVbyIgxGU1#osxo$QcX%I98e&xpEvRaJ=+^W7Q7NPH?{YfJ(@PEm_RU2Y> zv@+G_4fwlGuWDJ^S7N)N^uWYLwRwj zx9Fc+%ri?SOG5^)X7GNTc`qz3E*GhqKxKEdVNe(ydb8_%G}<2E&Q6+9#5`q@n7U=V zkqNv|C4X@Ish8JT)zB{F4d3Y;89X&IsgcU`PRzQA;H4PDD2*mIRO%lge7EV8Ubk?5 z_IA7L0a2m6ZFvIzJdR?MMq6mnkuwi7{au~8btSiXymEU!H2j;-l7#?eepTdZd}8y} zMvy41=5@OhWZS!0oGq4us*6r+Ld@$7E^XAl+8)q0JnS=?PCiO+=<2HYv(k+k?-#dW zq55V98wY3I;pAwcfcP_rLj8G**12qOTF4fP2=0D$z33$1BICFypPRQLarYFQ7T9Ny ztX85G)vUjF85PcTdoFL4x4ORat6likdIa`qAMYX2rq*(94%`+j#I#rvTX6LjgsiMQa-y-xiP6 zAgOM45$QDB<`J(92Bm%K88b2+nKn$4zuaTIyl-D@@%chbyo?-9ICl&+mbV5HTe^g+Vvi~RDO14{jHDIy%y?SQ^@T2r?cKJ>@fr9wo|)D@zyl_j3mS zm||$Tk&T$>1Jpg7F2A+2Gu+T*5dyrX&ZZAETEP)c-#p_hkuZ8vU~BrO`>_HnHf9zz}I$a)Ep z4IFCx;B}jTo>rW%q%|K7qkx zbx@CsahTiTjKDGBwWmC_+N6D{M59~>pzl!HpK8~69(`^FOxfy~ik(`z+wFfiCl1mR z4nf-;d7i_zWOgBncV9xAQyDRHbF3V3Zk}f(XatgLPI}?*X5bQLua^^kI~Za&hE+<1 zxQuq&)Q^rvL^H#4RtaEln1T_A`KP;WR0vzvG%AOktWp+3Aoj zyw$Y2p=2~O^T3OWU;P`NxmOM_@S_`gWDoc(RbYG7qvMI+WY5|~_EwVPSy4`x@ zY`4Z0qmO65oQKrPhbwhOag85MI`Jg-aH{=MSRRumK&OrI1TrbaO3M`pX>zXc`FE@_bDmeCb^_-$@f*ThHd?K^=j1;%qraL$ ziWKesTlf&>vPhkw=r1uJFDW8>tmnRdyVkXV*)Ztq?&VUHN58LzVppUSo zdj{MH>5>Vv@YeT>DyOW4d1FMz`#^pU>pY@O2f?@=PEPjvXKw2XRPd_zP?V<=L}@wF zofxbvORRk~5|G(8Hy|%JGrcB2a&PcMbdDsMmfKK9MOUJwJIcdJm3}wyoN_H^nH(n# zmZNr&F%wiyM;AV9N*2Nf)H66dGPwKscivP9lW2>Q{VrGU7_1c7bM~hc`tF*x8gPtK ziIOPZYzocedckU!WNN0g`r2dsNNWBOhUPPtUL9@4LCwZoy9Zz;d1>t>^#Jhi7Ll`s zwI>97huFaWJ8HR4o9+DZyr`GfcZfD6;JwZ;g%P7Jg9Jmce?z@-wwn48ut{D;+Icvs ziiLsm+HRJWTc9)yG3>*yO4|Jbj?n6{xx2O>XSef6%LXdCC%jTiSpEoLyELyN7U4UI zj!BxI=I!m8`NA1W*u3BB$wEA+1 z^71MkyL!~WRdQsz#2gYax@lzhF+)7uwRv&}0;tQua7`@y!~$Z&@c#C6h0QO|9@?fz z^)o{lE>*syUwm+6&3ZI^T`;?oRmy@LzjY%HZ{7PzF3M^_sh{f5+qibej3INNWIq-KZ{=8w91uux5 z*qxt>8C=6t=%ZhR&AvcL2Ul!=b8mo>ou=ABq??%(hV#~XS*8#(*t*VUHi4=6v@S>J zcHH=x3*s;KpL(VHzKBF7Gd6L1hm)>Urb1^%fP0>o4amo>{rcoI)r5^iaX7z2z`)>L zgrMcOnBuI6kY!|c>;2LCC$PVdN0FK1s{5#i+t>Ng1j-z`Gftuo?+xPh1)om<`bcJb za(-U8H2~b0Nof&(WB5fzADDqvu#{qfsdqSf#?$gq%cx>}A3q}cua|@*P@>#(2XsS! zdc1FG@qFPG=A+KM`i2ZuVH{7ycJ5Cf;Sn25gMl+AkR|kd9dc0~XvuS0mq)erU6m3>kPqIIRcumB9eXB~lOTIqybhmC;yLb}o z#VU8P+Uz7lr<8L3ypkC}-poe(;Dm23S>xL>9&$%T5*!YEOq}wTkk*4Z;$hf&MC6oR zlIuqCyD$pt%E>vedigXrsDIl!|fs5`!fsr_Rm_chiaRh zRlMXf8kPeM>bt5)2HF`))I&ZU$*oSEfnd^6<@NRjXUV5l``4`xU;qmMxZ?Ps zK&ad|yKDR{tl^i7;*LJ+t7f4EP`>b$+%3exsG%=-sB*I%6M)(_PYIoBxnE~1j~iOB z+nV{2D3XJNHpO4hka{wu?9+R3vM|GE$hPS)=>)UGF4d2*7ZMjzDW1#J$ZFeGhYDI& zSr?Kv1&5SIc{~`IjzvC=oyUK69vb*!+=CklQ7#sgA9CDT4WdbwsgQH1ER-mkhFp!| zT@?hyM1M1kV{;MysiEZ4eG+UA4rh;5tu1LtPa%UXnoE6`cKc z@)sey949uLq!Pf`gO;&Yz&W{(Jz8^CKL{fgm zk)`zNIkR*SA-!tSW8TY3YzKZp>7kXEd)WbM6(uWVxn+#5KYHGu$^pE(*}0S4%{zW| z%w1OW;B62z`CH=U^2FaK^C;}xCre6mlOU)Rg8@`26q1_E_!#0k@9?kDXp+|r7!Pf5 zWw&+9jmj@&gIFy4*WHKMEKvwz10QF$#5>4{d@L;X)c(sfMCqGx#Vju0HJL2RFxkMu z-BvNdjXr&8J&pie0mXiQYA9Lska?ZY-{q9rTtvd$C?TJemT4TsC}N-M+~;qoJ9b*@ zd~V~x3CB(5Y!}+~&RgVVArvr3CQ|&Br5aIs6Qlj7Fl@x;adr0sMSQ%6akrP2-I!q! zTlVw{$81R5ZG21;&QNxgxXcrG)cjQ8nfEzv=w|ZYawg{qThT}?p{IG$69>p&MR{C` zaWGI6`{C0E4e{Cu0^?t}o-r6#qmB7T6Z27XSn-f~Q=H0S?rspmBE^6l!f+a0LhT^l z5jUQ@Ce1VEUft0_%kgW}h;#I$p#A-QYu7pOMI^nHV1lP|ULP<%a^t)I|B~#0)~cV6 z3#Rh^vtngqe}EXmli#8?82v5WonM{afr-NdA6%vjf#3KKG|9>SPQ`FmDQdxaHAZ!~ z8bwukBm#7}$8^S>W3*RdqxRVzlm%M@=!=!EuFoY9Bj&V*7@F_u%tE6N>DAJRd>3Ej zlhPkU48NQh@qaH`M39c2V?W=h@MGqg{y{V1GspzFIs>%1-{jpu-Eo1c|D`hn6P|M% z?M5mOlxaq*>IQT`L7z>+wa)tRsJmAuaoYcTd6DJW9*v_Lhhu<*HvEOBXN`!6NQ1k4 zxIvOOHFpfp1bDxO5*MiJZe}Q1^=df1aKg@7Dasg6&77hyG6WkgEKBP`1yI3#bg1$Bc|~{ep96oS}qG|Aw9SNddNy-^-Y)*_Yd#yqD@Xe$}dW<_s{Av^$(K5t7-}El)|LSzO!Tp<8MM$ucZ!C zyT*w=@YQ3Y^|U&uYt9xCcEPs^o{Hl{;J+9vpm^x~@vmFtVNo~xl@Y2Y6XocS-xuI7 zzR;gd7hYJD|CBr6-Ag+|l%T$2r`=eKm-Awmhe&pb;!uJ0{OZ{{&;0b?_jOk1Qu4^m z^a-{2wp7h3Jl;!P004XOLgV>=NG1tFTCMl*`l#aZ#JOyJJYm_Ptv&4PX|aY0XVQIG z`#0b0#5Lvuq6ozcKs+ZVU0f9DRm1=v$oUKW9lod+6eyK?315o`^aJ&_n z#bXL#Q~Vw0Q@G;|_Ct@&Q(>)Z<6Ps-K)(DpSqf32z;@@r|%Bk>5a(?JcY8Vnm7wCC_dv|f2! zql$Zv#x@9Xh(YFtqa;J~wi4JZ-*5(|qFmFVPDMQW~ z7a?D;=flUJO}>bP13|72XNewl)Fz(CPd%89DnEINrG)5fPV^c=A59j zr~g>$NE#ISS3otfAj(kaTIPbWC;tuybHN8Qs)~OyDyn*tl<@pVG;O#IF|OaLrhrfS zK#Jyy1&%-BB(cx(a|{N_hSGz= zQA|6wWlB@mqhueYqYjNcBhlDi=UbJUv+!2G1<=7Ef)w^#q??^YwJ949e)#w?ohstE zEw@2c?1LIXEP=i>V*(kf-1cVa4d)Qs98|SS2^U&zpAjBcv4%(H>9c3pjR%M@C*>xo z>nC4y8E&SoI-qfJ9Ct`ceAC=e+~1NKCbvBhcqqQzc++kjr~=vG=o{oR)*+B*qoRK* zu3tm}M?d_5-DbZPVTS9UCdOUXsK4dPvnobvw$w*Qh#t^QG1oHHU*>-=7Kokm)tBQ z!ThV2?n1Z_dJtTE%xYmk`I1i{cB(M8me-2s$}F ziR<-0X~7$J8}T_5xVP%}*ZieNb_P}MRA38&WI|OBGqj2ZLh~HIWM%w&^>qL(xRuj! zm=xIz|IONuojTqsmtD33S?r_5e>isAn3vyxHmS|b*-|KCG66n4Y*{Zxi|1`f;I{+- z*T^`vmUzq?jLA=tLa6HyuF2@iU)GgiYUv22`yc&qBwmjbPDN?)q%zrH>?4rzjRTY2 zwu8<&6X#)O2mam|yGj?oL;wa3{69RMby!pX`~OEv2uOEINp~{@r5gchq$LHEkQgD2 zG}843L_t959w=Qyx{+>14+h)$?sNUF>-YbzUHjwgob$Tx=kxKHpI+SZr^(htBQUJI zJIqa}C3@l6MKP_;zbvtijEeW#0X(_~%}c?Jx2TX}^Xt$fTaX`yGW$_bOUYZ|Q>D2G zEr_}9q~oJAa1||Z;CR>IJ=%*ey};fvE6gVSA0A1f z?Ja2>&AQ7w$InU2tv_smN%yUUYn*gW*F;-rlzn4-CyYpR^=bn2d`P-2Z%v&c85k#W8$#a@jM9zX4U!z-;A&V%i=C<45N$SeCtO= zL8s>POWaN&H%a#xBz6Y0^;gUaC!mg7B^u5dD27iU&_u=}qflck7Sgw1$7G1E@nH6u zYX0x{?5SV?K_kQ74EJ&wNDRlhH?=p|@Ytj=U8$W$Ni``AFL`T&GKZ6uBB&?k9{G4o zmyB3L3v2xFNeYv)SEozQwNz6)kO!6a^2`G)JuxhN%jQu@=5KzAHO$UKDnE!us6@1W zurBun(pQ%25R|{SmFYY_UCTr-W9I}5ocs#t!K@}U8h)Am`=;qT>!AF*7;_ZO#`m?l zw5y%=NmzCfUtr4NlpM^}!AI{)Tryn1_B3{SIg)WCFcCzJOItaxn zQu$ID2{Qk9OdlqUKm$b~%l;yWfkI1sZu|}kkq8mWdrpphC8m!eBGSq4bQj)g_24dR zLvH6Rhi&gomILpj@8{Pc(_JCkKR=b3sBB)|_Y-m9R6SlGeC^KUEc>`>w$Fb%cUdGy zySCJ05y^{z$+b1SQg&;>lG8FUOsHz9{$pOKs*zAUZ6COW&m|3N`u-h=;^F ziYkQ1X<=!}$~HK^C#d7J<4;kGv?S5b+4d^M;FZ&KiWa{?(!YLQW;Lap z;%ow+_5f!%B=NC`&uODAeKvgMWQj33^?E4=@I89eC|` z9kVq?v*!EcOO#&k4X@nKc;^T3hb7F+Kt7usm&St-_8MSHrhCb zzVJ2=x8!lm5K6pIDFAbjXgtFntKkCJB?l@>s zzFKMmpVX6coO+m8uCcJzZg$nwClu|8bN?vjE$`_Szh@mNl6}zH2*9RxZ61Gi2hR{N z`*K1JG_g_TL$ ze6@1x^^s@e&Q;~(#OXkzQWRRYU0EuI=h4_|NAM^{b}iZ`wLTf%ldp_hPWZTllQ|x* z7H3=H7rWlUgG)!DdBxQ`->C&a8^cE{%VbOReI;58>#HPuiUvSC$vbWbZf2xudX|^RAF5R$bcXD z83gJg@$_nxZuh%ynfD|9LPFry0Y`^Ud>JpL|1()nGFcspl*M^(B!HP6zi3N+HsIC} z7GWpETIy)nsmt`9{2k-u$cOY-&xkKihc42CH}>my(l}9%DoxXY^qlc z5hvL;bB?VCVaSYPq^RcY=5UI!g%UP9C%g+$6w&tNJnqNY%qS<;Q$BUM8J>%wrsur& z^hwD@Uh{lzPZk_UW8gk{7hM7C4bZ!uZH^)O6b9+wtBZ`%7yjrBr0&!byz@d={-8xh z-rYv-G%K34@yEQMafa6`d@Qm@mXpk{dQ;i=OTBf+v3=1m-149ifu0~CO4V}2V)`nq z*}trR#XzFiqB=2_X2p=ck~W2@N#T_T-aEJJAU>966I%-_8h~ukzqiE}8M6ljgNM)7 zSu*Z*E)}?MVJ_hNq@Ph)Vl7293Vz$LD!#gRirA&b>BKlsjB%OVUy^*I-2bGLtMylJ zbRkzPOW-ds9w|%O6jFtTl!y|LZ|{Fs$n1jDkp=378WOioT*|vkc3++~#1_HN6o$ID z`OAuZ!=$yB2Oz`XqSjCgs;j2v#f_&lCo|#ARp2R9AB2LKD77I+_J9k=FAsJUpG*8e zN|hJU*5KmN?JGwujKl&l`q@$6Vc2VSLbgS+_n$*T<9H<;3(6OTg@i4O+B8RkG8o zz%A5=CmAYK7C4e1)!_NTv|3QCqZrC22U*i&qF7coyfn@W(NRtkS*+vZ!Fdt~FxqR58;#W?7&$V5&HRD)EvOe|Dd8<--rIE|7 zsF~Q$^L3Kkb)Z7kt|Vs$WR%XU%ZpD%lj+?j#induT%CIE>E_{!L60~gkVk_n7))kA zton3L@ciEExBF)TQOSbWFAq3x10%iM1wlaxOuj788FoEuwmO_~W?lE0u1+~!{`1L!AF{UF?_!1zap+#h zklOLhr#tMrsw3pQ)6;z2n02l5gZlf?)s7E;^s1-yk2)Ml+BS>4zCj&RV&n2#tL{tp zr4Teq#EV@vbD<&xGf?Bfln!Ga{nmzbIAtC56cg^^H+9L}+yJ%r06q80XI&E{4DepS z7iVfc@PG?}bRX=iOf;2X4Kvy#NZD8|_r}!>UaJPAxd4U~_iUkHv?`JWZ~8Bn_ez`l zmcMp!o9|u1K$8ei=W2sKJ85}r@ac>G+7uN7{^rG9qLEDLRUT?HU zjO+DYem3XRAIhxCtf@(A%EA3629+k>RSLeHL_##TE~`!nRzIz&2W~L zLdZTQQZ(@zHsU#;g6drm6E=UJhIk_4@~dROSmgrpbK*iXeLL&nlO>*CfaLsecD5$+ zGp!NG-vSvB@^k&M>l2MUBE6iYc)#B=&z@PCYyP5fC}hYM#}`qV7M_eKU~E!)Nrh=w zg=`DG4dIE2=?74okh&gmzVBaOhQB>$Wh)#4I=9z5Ut-f4r1M8 zfBkwt{Y35KRl$RL{(a_r=)&BOhXTs*h}T1$N8IqQj9qJe$r(CGE4Ecm0=x+=@6F+^ z66gob_2;qc?f$FpHx=(g6}4jEnqiCG-2s+z>Ng>fO~yvG~&Z>s~Pg1_QGOfML+r&e#bbd@4&OsZYEsbj8+rqp7cS-`wU#()MA6JuB2 zsdwa0mn$U^41w@`EGfJ+>SVu!x>}5UFp4Z6)+OYKT;ao;Tb(U6G0OjD-BYsq!9Sq& zbWLb}dj8~Nd5I=-gm!0F*J_68tIpkz!jQ7cQ8d1!z5J5p=Z{x;t<{9OA_|Nk+RJ0t zO?u6=cX^lnsvL^l0t4wU5IZ}ZA0dmK93gA22R{*1ijY2L+4^nLqp-a_=ao;OsS;BM z+}|zV*K3TP)fgF_tXjmseb-T-Ao#JDrud9t~2=NG~ZfTH6tk{XwcO9IZjC9#l@*=iooZ*S?;60(sM_odk zw_B{hYshG@)t{<_Ec!KkEx~ANtC%a6VpIwo^@8&D>;0Uxt&ed#wBir(Y0ziN6u$;z zFRKvxNw@FnF&!PMV*jmk_BvQv=3jfhVx#?cvlX!BgE-&T`o8tXJn)+M{MMkj0oqCzLV1@z*0*?NAywdD?b|7fUdH|!xBl7$Kl z{)9lcbtT_Bz+XOON22EV*Cpy$B*pli^zpUb<(d!InwF$X!XV@GRKVcVN)UUeY3WWz zi$t^<7&LV`ZCu;c)|$w49$y}KTe@sA#l-xBAH^EwbdmdU2>CwAumXtJKlh(_>yx)JGe*Yya(?aVB&8O%v zFiTX9%IFTH>=tY%Z^uM)=_G;mEf^|gK^rRWAs+D6>~@Q> zR9m%~?~J>=*lPWURYk>G;P;-pn-ux>9)`U9kK+y<$RuVLpPu^#M^0-_QU7+}OOSHNwgJoV-RDX9_JLl>clv6; zqn^dGKsn8vTr?@7*Bk!R)UnYG;3@PfaBxt8u3pKpJ~%i8iE3*Q=b;8|y3@%+!8i9HjV3vM5XFBj9@ zGz#r*bc{tk7E6N*2>S1I1R$S&F{&<(YXY z>A&+^yXv_A^#|bieQY%DqhRtKUBt@Vc2$VyH&?7rPXG-$#r zkp!wPAU($u8QcJE8XJ_;|7Ije)s9opa2#Ii2u^YGs%+jgW#F&>K1?_&w@w(R9?>kd zc>5|I5{%1WSWxjYopRXVdl49c5wTa>qN;-GL4N0oo{bx#j`r}nl_NPW+9;;A)D@Cy zR&pP2oOb7@6_a)ItAc_wxQaFBzqMPkavG}VYjee(r7M`E=dq7N7^4KfabJ%{gi1<* zWAMVxUVB#<@-ncgYf-v^DWGcq85upDdG)GYvBRHs8*I6}PMH&8`%j|r^#qZjD=6$1 z8schmnXizDV^rJsgS?o(kh5*?g$Rg)yhzUNpVzj8Q)$c-r5mIu@ekm0ozhM>`dB>g z$VPf6^)$b{)_}e)vB=N%o&eCFpE20eV*;O^LW{4*950`!l^@-mvMPT@1R43s4}mQM zihvKb?JCH(F25lMI)`ari24)|R%y2YKn`H$>w|OK7_{@e$8Z`$+|O90;j2uVeVY7g zQRTfr^w#G@jfdj7|G>tK46r_$9;P*46*iDx^i|3U5$>Hn$fUoh%aorIHtpQYWS6j% z2P4+G@(a}b7+?_-Vl|MbD(g8uZaPob6%fuayst7&oUqYwdq_ogfw40oR4_*w&0DZA zx}~}G?SXOnZ%SIv5(`*RSGq!pgO4hye)I77K)n6k_vc~hciPc}yWZwLxi;{0f#GI$ zvv#t$*A7)~nM3|r8nn-yw;W+3PvP>3MISn@JB<>DP&+%d&lOy&v#m2$u11qfc}m$e zkdzEmfehr=qy7jAbwQ38x@8i&NZuojiOy612vLQS>&G3dR#zE zT>Jp{vK5|fTp;PG$Z_un4_{xhiuy$-%_QIGV_B5lD?oW zah~HXT5+a-jQ-;FUEA9I8K0SZ#Jjje5U2j$4QrdOH*YYbU1`qL-Ikjeh1BWKj^UqJ zD%E0fw?BIJPhkX*3>9PF)(77X93E;Znl3qHvG7;(TfH=CBY73gEL&GwB?ZIj8~OUR zec)TWR&kv`z%0keFw?i1Ukjg_zp5qjGf*|0zexL&7)Yx3(iaqEoMzld7$2y2+Vswo zV#@D={Z~Tl+1Y1O($?-Gp?RS{&({}g|J#@2VdZyMFd0%daV_Dmy6UXANHOteNZ&f^ zhMTB05gHccq30h39#3~Mk)YSiw87qJ2gWqT`U+)P6Gl0JO} zFI?3WSEu<>YWXZ<5NE!k?!XO`CE@BOc;vgv1J4)XU1;H{HVNIUx}(SGb*Mc4%#Ds9 zRNlQu1_FKunK$hN$=c7$EWTXh^0gLSOY-}?`IYKlUzhIOqf`(nYXjmZJGP06!@VVr#As=42#7=G zd%<1kk#WtfEgu?A4lMTp#_ktjuXA_pJbs6(-=%ostr?q;-G5mTa_6l2Z~HKusZ1Jh zXgaOJ%%>+FG-HeQM#xHIL|0ijT5}YfNOA=WJAb2v+*``3mX)Vue0v6*7RsOAajIK; z2c$5jjnnlX{THMx_$vG*D5Y0i9r9xmY^P`UNhC!#sx3vSu^c`C%$Z7OE!g@y=pYj3 z_aUtOHKLP&pk09{ZIASyd{2#=@1ILs3DUTj&M1PWp?}m=W$6r`n#_L;O3?JRcKGz; zt$^dQo8$7$+tOfz=FZaQrKVZt_g&c5nHl9(u=22JJ-GTuKm0mt`}LoG0u-r&oE^LR zchfG-IqLTWPCWP4`s&%#P2S%!PGLjc9>P*Gzy3HU=4Ly$1U+?#7-X8gvU~x27f5}kLW%q0qOwxjVMgt^6sy``v&hW^hOUV}Iu4m4Ls+)Fb z=qB*~D8Ib=lZxu?GiMP!N->=bUbQq`jcfe}33mIRUn5$>Qbf@J(mC)89e!f;O}V@KT-Jr-4=;WADLOW3$@1=NjKL zzNmeMviQWWH|FG8-C3SUJM8H72-%(Pr*X~K1k>*yCHMGuIpU{KePHO~XkqgBAyYA= ztu*XQkKGTH;*0DuLIqNsuD9^Nalq-`S~2}S#5X$QI`Am)w!6T zZHHa!NqVrl@23Po}#1&{#==Zv&3Y zwVTjr#-Rc8{fITP|1G)+{V!&yi=Yc@a$Ecgq}#m>YuQ%$%-Plo8We%Y_1{kZDPeXa z|6(Ncv7Y;J4#lh|U(wUecwf^SQ1OOyj?P!!dAw~&${9pEN)QxjOv>}F;ym*7bdzFa z98gFu>?38|=rRG5+5ed}t5$gdIa0uXW5yGu`=W2lK7Uv$yubxX_N4?!4>*E+g^A*& zG(tS%%l!QDi(ZNFy!jb1`52ci_UK7zZ=rSpQRTCvZJZ?NBNNb zrCzZdyAws>*QKX9{A=dBBTa|D`r6y~e#-5Zb5(Ds@nKQn*1mHiY}S4wz-m+fhltVe z>(`YG{2aS{YS;^R?Xsg|*C(lz1~a!J^l5^dfA+OgOQU*ovZ$n-tDE<6@OQn|eS`&t zm*=G0HdNf`28MQ@(}4|XbV%B4`0$FcAk0OCVdDCOnB>Go(RV>&IG(8}2bMA&@L~N7 znxWw9>G=gt;tbZlT?beuk{2Je(8B4_M z+ncdR1yX2j+4=<7SmK9E2xE^`A0Vw2<_$J~r;xW-em(N*QpxE#7BsCO@~rZcQ$MG}2+B-l`C%ZSY_ByX|%Rn}1N{ zKDWxZ(o-a32Z;E;pEGC(L}-_>yc0P^vdMjH>DgRv+GcO5!d<)XMniin9iL5NVU_>O z9L8?5z-qIYuX11geBJCRSKIdcbm8}{<8CTG!BwQXsA~MfLZkpk`ey#THf-2jMv0eg ze)XumB3Nb-rXX$wg8iy%CqptIJFv%wP4iV_l+;lKL(e~a)GOTZ$C530fgy)}r(FI` zcxCJBtt|B4BxGBOT(k?rvC#*3Fi(K(n@Cw*ZoP=^#-FagTpBEVd~UIN-$?dUC84(C z(O9}SLfYw%QmbQg8MZ;Yyjz*h-18&?=dzSkgcLTi8aOoEqgc9DXq!Z|mzjIDXEnv2 zPvO{oLw;19K5t&8V|j{VVL-QC(*dNqx=1@yLLHLrI6tg57vv!4Z=GUNHwxl!x#4Wv zyoQ+xMdD8m$%v8;QTU2t=0jv^#}-j*uq#`r>eqK-F|2v1ViHQ+DoLqN6U5YAlRzIg zyO8c5d~kp!hBM__YvtNuNol6{_vKe{!cPbAMFJo=cBDk(nFn`%Gz~8WRHBvnDDhsp zZG9b#YL^bj^$Io(3AMQU70H$Jh5CfK#sj<}k#j$^nlAcJL@Tt=RA2XlnB$KD1LecS zN3a52=k3a5(WU=H6EPd!_-6{L7-grSCmzj!8mxvRR@Z*pu=2b%OM)HpU~e0N+9-Vgf>76yL?&d*}wc;{O@%FfMgiZ-_ zB5U4a$^Id{Qapf0=!EA-wEuWmmK^R7bX=g%p+ZlF>bMsD%XN17H}~0n3cOhOYw*#o zQvD1|0e=6u_QMwfiV{<@rwf#OJ_85XCTDdy$m#!V3; ziD~B&=mRxLrR_J)g68*?q5Z8Jk$6ewQ(B_yrtEy)R-HQ|E+n3ujw&nV23U6~ZzInF zRFjIY6T6*}DVzVE^q$%Eeo{x-Q}j883$e4Ra=-bzw}fGebbu+{e%KB{9EYe%2z(E- zKVfgY-uR&Li8rip7wE$zx8)l*-DX}?kTuZ|D2G2={(;ejzej8-s5656=)|>kIbIfx zUuOPT`WMelRWhqUL04a7BdwN%gZ0~}3PbTqfl{`pK-EWyq(`oB0!|K{q)X$ijje@> z#IYz#W`Auol}q#@fM5X zjMY2=7vz5haffEtX&Cck_))|IroL_gX0K*sjd8g#4TE+pd&yZihz2^ z_nfvfKfExhX*$RhbUOoLKdytG&9*`{7@=FRcTb6Q{y@@cjQ3gftpou2df5{9k1*eV zx;laP-1j>B#x8yhpeK6xWHD}BoR~HMRvMPynKaJ!Pgs1-0QY}>?tG$j&D@NuCC6hg zz$~)6l?1-MHx|zrYw1fUZ{vHJCJ3*k=Nn|~Z_?z>`qC*Ou;w7eX0y=8mlHU$p9wAv zQQ->jFpSMqu*lXu89t_V8~m0$bt{$oP7$Z}k$k8fUbv`eT&cILg8nUYlq_lZ#6AOr zIE+#}bZaS#hhQuXafH{yH1g`(^}9$@*qwwR()=7BZYRHr*tBj-;)RX5BE0dNc^fE=gNT$P2=rN#t ze_f1&!}cC7I!4+IhhXo5vJbOseuLcqBYCHdbgy*_opXDu^$+CBOz|RNAVuSE5`t_& zQ}|P#Q9Nkmz3|#&!41$*eBkFZwinOC1GnY8F!S#Mc`)%s6iVBlrCh737MLy256J;$a!?g62R4rtF?B0As@20-nNm?{!T z-h`pje%n?pq~f9Op_D1?1-woOAk1+fVcU&b!>F?Ox4{z)G=QnfO-9fuSP;0of@z_H zQK~04FkodyqVfOzF+guHU5hb(;6Ca>dsp{{^Ug&+%(ACoyBJ5g2srUycy>HQ2jIYe zG1v2XoSP>V6vfuN71*7S|71(fqx^fdyz8xtyFC*?>^bF!WW{L%?P8N-kC`XsqFKVD zNhp|f{$u@z-E11QTG9A)k%rVE@fURa_n*stsjtTp@I`jgYes|E&-wH$GwVlwoS_Bw zp5k@%GHiONbUa@Jnz85q;y~LWK`jEQ;+5%-cV9_#mm`ZN(J`64 zhCyE+GPEgXf&Liu37eji9plHim|^>bWhavUT&z!!Beh6|ja*j!yZTds0;$5xp0N@M zjF-I6k1)aW*YA+OL?W?v2OpGI4$wHC;;=->^A0fo5@p1r4;(L^ry3mk`)X0?`B^M- z>Cz~BVpdB@OoKm$nLN4Pkvm=sUyW<1G%O|b_Y@3$Qp5hE1*(wyYN8D>3&tN}&YX-v z6Tq0-!ZqwWX>#~y#O!LVM;gBk=_y42A{4a%$u>)+cVdV;alb8-{MTvPA+eF z>(p*BO4LH&w+Ac!(A8yK`{Rd(np+*cI6SQ<^)1uFTnZImJ$2^W(rHK8&+D8YG;}n@ z9sIXq3crrgiASDf_zZ>1ayQ$+jxbW*%4*pf1^$1bCnH=P7+C3mymqw3Ku*nX2#L9^ zdUoM$9yenf4gUayUK$3WZ|Jm34l^kE_(3FK;~|I`xu!Ygs^_jXV7}6`XE$_lzTQ({ z+Ia<;E@Ds0?dkjb@>ba4OL)9Qj>B5)-DirM2k)~79+*8+A|QbXlXu5fE!>0*Cv%up z-+M2BfE0YRx?S?jQ&1bM=3o0B6s~>|@h$B$`k{>t=s!w_j9B>mm-0#_0%*H{Uc?fe zJAAlH=`C=yeNbm@n4H*wVu0+#+q~4ZJ;X03 zkZfXxu`Tbp=64vLq7aeY<BA(ppkM{5!4nG99KeZ#eoG4w+=qElu zNIeL_@oN_jRoZTOakCh`Y-WBCbAP`Q?Uw`*05GX*^D%N!%66ahjb8-dXYZ!wH}q?y z*e3^$vy>--H=mLaTwCGhM71?L@qG>6c=EP{Tx11GVv+HQgiZbNaA~&^j!(IHxU&Nr z0hb+Vs^ge6Mbw9JDh1p)Z7Rj!Opn%l14NrtFMEGtW} zpyzrz_vUHeJ@rFfRimeTzX>kP{2+6S1^9?q&tJQuG4yqlxIIP%#k^{r4Us%V2*jkiC0>J42GygVJDdk~4 z0Vw~;o<;t^b07`jSvEx*u!sE+0@6b>AoMQhK<8 zriUK!N|XF8re2ODdsEgGIwu)Q*0u#FHzrl?+Zvpp(e(XQ7h7@v%LRY?XV-#V*B97yL7J>G`E`A}D;q5mSJGwH(W-P!JI zum^(!P8$op9Vhh@keiJ_d>40}*w&kw#|+U?V}IFgJYTqG7_%0jL60_koi;ZYv9Dut zTIt4op5BJ@67L3rpU)C%5Z(X7ZSZxArqoozw;xhwqQ7Rxbo1Mkn>pfptnx?{*!PhF zL%D3~NPQL&9AA+1HM7NE$S2Lvr^%oVGG)@J5h7880shKC?$9rEvfB1PA_~bb)c@6_ zi1v)7*1kz~%&}K?S*~p#_)=x!pZf1LOIrksADA(fQa?Ve4BqUkh56pX6Kp?T@#LMY z+@73`T-O>N{8ZdQ#}S&I?0?44WE0UB?C&WQ(`6Ocr3T#uO;2y`jba=R269a1GqsBz z%CD43qqlbA2$}U5@SU{&A?JFSc0$r~s1xZK#(qqJe8l?*-&%ou*7z$4YhdK-=4}Bf zCg2EwQPlaoI^;op?a|GtMHD8g0*>CTne-#g*+Sr?zGfUNqy%KfB1Ico+0U0q%R2UDh420Ji8<7BdpK*QZPiY z_w~}Bih!+6z;qkz72YOn0rUy}@1sD>HSC#S-6p(YMmbCmtx#nG>2fAPyHUCZ)7C_$gf_^zyLwYILNzX@l%hiZ1#3(`a*ykK=bNJ={=ox_vXO@B)g zif<-D>o_gAqKw#W(0d0)GPWb|FNf~XINRU$MWy3CugwKhZL5)Xs8{Q=`qgLT!CP!J zBJpdn0L##0b6z@=r#&y6`s<;21eHdMPfh>-MN2z&5KKh`*%+$dxjW4ERel~*qZvMl z(F4t53F-8f_ZHN~3#=3C%>ScHkD=q$$jH2{#^CBtDF4Lb+8Hp>X+_8?sze+pY_2t8 z{rkZ77(aT6ot5N}O#Y{Re2eL{a&nfs9$<#!SGqpzmn3k`c=A~n+xNsvBf;6jZqn`6 za1=Hu7AOXL!!e^Y%xNd2-TaY$?gie$o6e{2#3`x_Ypjq>zQ1Z_w}1Y@vi#0NIfsP3 zeTMxmk-1{}n^Q2D2UdU^HyB4GnO>MDN(mcDNL&r$YcO4P2+*!(oEizR4==DSf~xVp zvNw&18TWHMgY4+X6E=U|BvSCrjOh58TU#cq)_aayU5uvbgK% z8$ml_UQh1OAmz_|hP+a^KTLW3DABYl~gx_L>R_`!kKt9&FSHM)H%;{ zi)4gEveN+xAI1MBL4H(nJTneF7s6ZhVR!m&8DD!}JV*1u)dg{OrPzS&-aq1618AWP zK)me|jDm&bE8&j#J6c~9?>i_k(MdGlOkJ?1|ssvZEno=yCnAvAv~Frrms;D#GWe-h4sE z`qGa&<%>tIV;_y}Zr>TZ!GcUWeu|bCQhw<~`DFvrQeUg?@R_!5j9D@|&rHaJuo@Bp zpYwi)7y7xUAZY*R`5X{c%QXw>5ndYuZG)Uva8P7+6OPu!J87*3n-qdle{Y4l>JTz# zFT|Yrzp#<(J`=0z0Wo!<^<|BHx4}W2DY%$Y=T@+^_w5Y%BXw=#DEHkLBseTC26KLT zX7sbp;xB?Zw(2vJ;y|X6Wjmsx>lDGZYr0q{PgrDr?Ib}H@i$#E?%JQOVK%^ zlyv)te@8lhydL{!opG7(4R zBoO>YCqAR6i)A2I%u~K7Xldkkp$z(?o-B{<`nGxLm(X>4d|1)VL$*&05Lh_2#lQGE z3t%n+t|0u>yu9TphLOc%8+K!2G0Ie%#@J69sGH4EQtRBG%}I78DmBzb74v&1L-Tl) zUyumICJLY;2jX>3v0cTsC62&t%CQ3KK*~6 zhrk4EMO1ewie>y3-SNc|yU+vHh_G zsY>wW4;tb-Ui!8!i^|q*K)Yl0a3rbQT(T6ui3l(2*&JJPT>kc2LdMPkrbkP)&9-3K z;1a0gH2NC!+9b9VOa8GZSDl3I9m%h4P6q9&M1$aFbGxLoIGjUO&uC-~dOoh$8RGt4 zzxvuzj>qzjU0c8_(yUhS0Ek0U+Mi*4sJ><`bda)yXFQ7*5kC!5K}4>QX`X7T+Dm@K zO5Y6KSzA3_tb>ei1Gn)G{5@9aW+QCOAbLn^wLZsIB%Gg=QnYHJR1_>hTqJ$p^GmT@WoZwv?Faz80IH z4EX)l*zL0luLj+Gb*~HKbWvh!^58f`uXwL5?r7WJ{Vkj3rc%V`S=Pk2xtL7>9JbZ|PCz2wc9DHCwz zL0A1cEIs+}pE#(0{U(Z$EYrbo=l`l|PW1^!w26y3GuP(ekYiUn_Z(7aCFL@k_Wr3- z?|h+i!BMj<>YOcX+e|(AHLp8H)M00!m!^3)Y9)yNsD6*h|12XgWm%BCVe3f0qYgc= zK3mng)OB-+Sh)u$@?2Vk4tMMSyKS515r5cI9{+g@d&96?8;;;Z`xW}i3@sSaH^8Aj z!r9*$J?3kz8|>#cB-lYh+&F$lzeVvx_HfQxeDj2fcR`iTJ+WAR*uE<*Nir;0nSz&t zD&VX8CNXR-n4(JuAx3vNWxJ$+Q)}Js;TPcjHrGAdO9gFs;eK9x*Twt*{fMeMIz91y zIrTmB=?FhC|>6uyqn>+)Hz0T}o(yAj>% z72eLdkUjBWf4G)Yz)j!V(gng%V)uZLe&t|Azaxdf9H_t z_(sy~ZyEDczV7Bp7*-3>LCfmlk=`}4eLjVJi*YE&Ag5&Uf$_I>uj|xV{llO5L-B zC(VekTS0fTbPym}kosWuqn7KgS>7wCHfm3TaS?hDP%?f~jGh9NSM>M6zxad?f`wI) zLVWb3-X*{WOCBa3^qJ}*r#s+agnGI5kswX3)nD_)NS9<2+ZxjfI$pQgQsr#!2K7ln zZWS#F-d8>Nples&y@r<}^NWHaW<)vKN#;8Ey9=a<Fq+ z#6#CI$^}jfW5v%v_v5aY2CRq9ccGC->2-QrE={KWcRftYjQ35?9`_FZNHwfF$&<%W zXnuET;S<{0nT#LiOcKi94J34i)X|vt=T$PF-uesxbz+FVxeqsYhgYX5>pna-^3E(! zl*NzhCg+`XmsndKV0{%Em<34bPyXeu`QOpnJwk~t&cic)$f%>Cxml3uw!|s(c)ews zJ2Fb}^_PR1Gv=aK(0TBg+V0g07XtIFd{&nXbP_hSItZSxec&r#s zij^ILihk|k6bE~L2E9P1S@4|CAhOefNeI|LG=8}4CHt`;;)z4)%Tm10;JLO>t z^3g%qanV(QUBB{;59&(a?r>8uA3;5K6mB{TC6O zii92I&jE@4&pbj=;Dh91g^g~+k~_9<_A1$W*m7u+-Drl9tBX70=GpP#|DNd5 z=}`#j>b5!k{ZARM=#f#a-Q<`hyA#nrHaq0qA7X#ow@!KJaTU~a!g}3#c97){6Mg4= zO|{YHY|~9Da}P$G~vH+RYh_bs?~94@9{9% zd@Y7b4$o&g=;AjTp{hY#_^%Gc968>0b4T^xim+7bu>|lWckSBTuL0bu{(rkrf57!8 zVo9${W-V_*dscRc_rxDqX@L0BPe7`$q`31k4VFOazZI=*yT4>bVPN5N ziq{*F9X_apjt|BTAi#SxIS!EC0I~!CeJzCQg21L{TFrYv15qD&WnQ*@&9^AeBCG+V zwjyJ~Xz4eV@qI!9yo1|Hh38ne)#ty_smL{SENs6pTl*UTUrC?PaolZII=T;Cyx=X` zlJ0LXP7jDv)pn_n&S^-!Hb=>RILti1DQ6K6RJp|EXluN-T$leIyeGbptOHyJUjb5> zYrL%t%@az9Qb%yY?H*0TuN0gA=Av!qty38Zowazvq44_aFXc$ML=Ey6?|*o(VktK^qeVU((4r1)ANe*00IzU z_AqI{3#_^zPOIo+GKh5EW#>*iXXb|td;j0e>5M$ZJjMG^G~ ztTcX~II1fw9~_sE`l-@Qg?CS3S3}FJKVJ@_VO-lGc)}IC;GW(i6dzDp;63Ra!T9a{ zS|u`LERpF0D;nn`ngbXVv8M|@x2i){43G89*Z0S+p>w$hnOIw0Zq?Avkwt$L9`gSv z!lP6yge?pnv8@+(RBRm=Lv8N5rs4lAIS{eg|NmiA~5C6!}o{t=B%%c{&qxo zy6mIft+fN%q}Q6JT!cv~nXU~~8lpC)^i7ZP`d@FDIjO{KIOWqg&2h_KU={X&d6bMS zzlge*nf=I-O3Wh`AAH7A+&7iBn%^g#>B=@Hsa%8aL)xzjAP)Vf^jI>Dyn$j>om`Il z(j=|j8mT>9I?-w~Eb($Bwxy#Jnq&V>`I%)%@dl^$gy}Z4r zEW3s!`sQRo5u}3&y>>d~RF#QplhZ_1x)_mkjscqfJqdeqO=D;ZKR?G$u6SMn>L<4$ z(Ut%7y0Eu`8&>a6Fh_ff(5l)>v3eH8$>|b;7iTxaH`cG*GxkD?KaD=Z_GO#>5VZ5& znoU)ZX3Eg5AT;-D(r8Z#@Tt!57+6WW7M^EG#&6y*0Fk;~$9n)>EPea6QomHcC`WMHh;!ts&CqP`}eJ+fMc<)&F@i2BJq9yps2gir|6rK_|)fdHaj9iBjrD@ zjRNf7>DcV#)rL1tBs_<)RV!W~$bY?WC{n zaoS1AQnws?MZ;2#D88;xUCBs&d8}g}ZD3kpMt^YZ_XX=wLeq0d?d1V?z6=SinftJW z{rEW?EY|8TWF8h6QGBD!VxGp>G?aj=?-;Y9$5?Xea_T)n!nm|>s_SBGbf2+nI9mtd zlWL!c7olLCkoCc$EOW)iUihWj$21xZ% zsPvg19$8=mCL=5|3%S{>IA{v=xCuHM8&?bo?2SGf?}tlOS=ENX-iDP|Q+h|?a|&`( z1iF<%pQwL;o5CkGZudnjWrCWJ+{QL}XnzeMsfO%L1tOa1XB%)a)crjn5lvAZ&Tai? zq;bBJXVW=ULINJnc)stR`Cq>{2D+{g{$a;DY%LYlo@TB?7O9zFofkeEJ_~7L^KlcR zHqzMO0D|Dqn%FtlgOTnJm?ryFqnPEF{2_rP?Tmx7rH^ZbfX<8AQmn$YVxsC!Rs zpSot4s1m=>ju(%CEvuERmTR29B(H&zpQPcWF6flqIt^Jw%hZo#= zypJ0HNX#!4X&*R3W3RS-^?HpJ@_TsG>FOr^-+DoE0V89&h#s0O8gS^2mP?_sy&s08 zDkHajaDC*m=ayyBxQ-j(kl*OE65`@B8`~9u@25ltm)44}=7-zyB7St~cBtuaq~nv7 z%14+v^I1WZwkPL9~y)k{1NHFZP@ym7>E2nx4ODcmf;tN1tbn7o^ z+P9ZB1OR75HR7Q2Bz6dP7c2wR{V5$GCms-QKx{*L3mpUh!Kiy~t;x_*Ek&>%IAu6D zE8QZ*!()}daH-QFT-cVZN07scJ>~HpjkEe^h8eYZo6HXr7?(N z+Y9f$>-_3d&yT^LOG#he)$=f}Z!1Jdq2-}2dxT+*@2=cf!ZRN^q|NlD*z=ew@U8hx z`1OMjZjNT_xHfmDqyOE*#G4Xo#6v=Hs7Eb=2r>~Wf|}%8SIS-M1TA+rcew)x><=WA zKJ)x-i>a9%n*r5p0hO4j6Z$0Hu?ZvQN9;;YFn8U=tiY=s?{k%}ZqKi9!`?Xcw5U!f zQu1Y(yq(TR%&)>qc5^@!kn-7syK!NbxG#944;_vaSND20M}1)Nrt zwDLX9(ApE$Iuc}l@7oSOqJdgD0ddFj8qd;_LMi(MN^3<3GNqmspQgWw_}C|sO3*cq z)%q-lU=8zj9Grykz(uP>C}MJD z4z1JHRt1)5wMgc-;2KSDtb8x&^E{PtNLr?L~G=s5PI2 z^?S0Eu4LZTxnM9yEqT!vHQ2EQ`o!JG=^|9_;rbBs5qk$f&lYxX%%~U2%uzj^;Y;3Q zx7e5uxHqA95@>%avr^wvm*QD9@a6j0*hWwY&TwadYqpP|Q8|Fj-B*_}um+BkwJf1tqeT%eJhdJ-hXY~>wW+ux zz~c_D{QijJ8FqH6;dZLNJ2`+Y+r~*VVE~Xsdfo1le6Bk(r8AaFxMLz9H@aSl7MaKg z_QnM%;iai1%BtghT-ToUS1$C8VEk1}=wP1&RcT&y9Q=2UxtznWH=ajr^#n3!z%3CH zl2V6`Y?ykRq_GA@&s`nL&id!i+*Tg_VUpK9hhB^m3E*As?0_bqKOBfdDu?5hhImY9 z!`ZcNou3Fq(xke%xcf3;d55jaC5wjQTq^X0_OD`4ZW(LrF1IC%bPt2!^GhaP%u=#G z5p54x4)|x|gbTQ2j5efR`5tngh-VJuLO!*DX)t1rvD8YYw~Rm84ASWf^yTM#a^D1IIZlhJPCPz?o}Qy zW}ODs4ccLW9!h*@Pa2OM`U?Inr;JFukf(u6J%aOk!kvunEq+l4NI>WRde!S(vf&B2 zQAjMeBEeqU&6}Su@NcXI3m15Hlkw|8r}Nebg_bIKqvIFt;a2O&cG+g5gnN{VUPtW} zD$k=7Z1bf^EqARutWPJJd5cDvfQ9V`VSA9HjmYp?+{?9nU+ux9pSCm29o&O1 zg1qbL5{>~9k6<@ipCp#YbK=oLOjhJMZUIfAj*u1__`1gKzIt^9 zcgvzUAu;eh@$0wTYvMp0Mdfc=$-N)H6l!7q*lH_&0m{c6&xT>qY=Ofzz~-HiZ6a__ zV(4q*))34k*)~{)+flGEJMxkE<=kww@iVBQhhcQk_JWx>>(INL{!Z0jL8DhYpSLh^ zMm#?s*)KrFNU1L09Thvb*)eEw&@`qt5w$(i@wF@dbs^7!?oJH4ZJiEtJ6o46z_L4= zy|HdJ#k{9(p%j8|trMm(=GJJn5QmUwcibyV?^&cyL7NnBG%j`!?t4z?*W9|SuJqyJ2zTd@Y-X%-zFjp!S&o@7 z!Xm{GiIk z;_+%cKwk_9|A!5?(QS>QaxDOVt(2U@xE=xT2Yv(ky3+-t5FI{|5p=-fsx`II3Z3v!!21-u9ZYg*AR;xJrOU)!>Jvb6IA#auHs&;3)9Wc(&g2|f6paoB z8=|(;5+cNQ?5IGuWE*2c=wNseRYU*H?llBND@d`{$i{>|8aeuYn0fKgBo+9JLs)w1 zXo>!4rA9vFcvOY%;-5<+NmRQ*g@u}VKL4Wrjw^pP75V%|9+^ZNB!+ALDJ#&MmW4K5 z|4k1U_sZ5|ZeoW5;+m0#yhavrC9Ux9~Q10_p(T zVC9M4m5HO1XabBiOP5RyS;R0K)>O{*6Cb5}uymu>!|?Ce*Roby^ahJ0u;T2E52d*K z@h;H!9e;|NJa#I9kFR?b)&@N;SEbU*5)W!@A0Gw%VJIhc{7r4>nBGwDb@3N$SpSc! zQI7RaZ&bn2(XqcwRfL`)n_k~0k+qiy_6|U!V@R+5J&U4XRWcy8)Jmkm_m@m8H<|bB z(n2xnzSb}unTI48Hub}glsf-Rx1igL6&j0fxADxs5z;##imFdRPi*yMqm7Ofc=aUM z(U`IDN-+iUq&ft9rj{22)H^CrNKr!D+l!`;6(BCAjLc3Efs6D_b z=jWVcyIu^(;5=rz*s$#YtlMjTVFZua%A)M5dd~yTFo+{wZiHhvn#UdJXxDM$cI0N2 zyY?ego9C}fZ6J-X*_(p?>SATGm)lrMZ_4`j#}mmqBMV85TkA)Yh_6Oy4V>j#3r19X z8M7pLD)4fut15j-?nyhoVJC^&Pt;Y^_L2A@M#;&f4*hH+q)gj}3A=G>CdOzl;zWod z1iH1Uh?zcSe|WV@EZ@kPL8&=klp#UG8JL|__U-KT#5l$;DuO% zX?A_+aXE3UNU?B24?kn~=Mz3#`1~dE1=$W(+;d$_BWU1kDZKW`%#G-cV@pzdA!>5Ysg1ZY074?Iil3I|An1cDWtmr-5)wDPrgJ zH6ey~6$;OyW5L=F+kY?Jwb1=Gg5;LNdZ{C?1wm_2C36qB#js{5SIL4XUT|~mR6R9& znEZ)w^T6k9?rJ^Hzv5T?-;fW3@~{gD&pwix>RS5+Os!h#j5$la=YF^@EmmGhoc`TO zU;b-FH7~`q{lLzsOsgX1t{eV{6-$NB&Zgl7ZDTxzr2NWh$5Ni1W%-jEX&ZLyY<4qyl`hW`K)Yl+HdHjr(|VA1 z_rw4dZpU&FDYbUbzN8ToCS?cnjRTH2IHI5)g%V3f1mmB;)#!)Idj_rt$KlybA(*o` zrttucu^2$$(p}plk}MGza%5ZAepXfQN8Ug7Zc(!hbojh)Whr^yKt7w%AFiA>@9l>d%+lG84*jSchtCL9R0FkQ)Wd$~ z}b z;AVGr(MR;~=Nqyg0C!@qO!QYq6qNxDyr_?KFoZ(nD?sWM5#IB27Ve31XnFv4(Kt{D z4I9zeS%*bjDe$8MVUAbwikWvk9w}xhpmlX6{EFMk--bx_2p5gH1{i+#7>1#LsvDIX!LWtJokS^nLj_9ruhTr@} zI%uh-)xRx$Ph$o3J*=*~Vc-f9@LlKu(k(46W_!TGQ#Zlexu+y@Phz^sZnGQrL|53cX+FfyI* zU_Vsr+`K7oV_4Rcx{lEL>N%4cql}_@J|%J0EZD*KucEK~vZ^aT@FfLWKHb>ir+#}j}D^(P59;KKNVqWT07P?W20AFVV}@}%6)TuBEEq;#IMPSH9s$k zYDcW#0NxfSg;&*M6j}5AW;#R!+KVd_qtNjw8`bcbrwZM*6Ls3>P4!=YKM8wqN#K^pIMrpeEn~btnu6^3~1`Mdp~>lGV3fu4|d>aZik!;h2COVw#S43(9y$+ zkl$Z>R&1FA!9%xd3nzo_tl0xEH&B%Q&Z&FrJQK-PT?u5+@O1U~I`eZIlPC_xdTt%S z=@fR{a@vkqM?*(g?CV@#eQJ;HwOHZ#j$Eo9TKV;Gbs~vI&0EYCYS4|U(v3^ZudnUm zNq5wI=ER-9Us@LU!<$8km$dZk3;yVO1cn8Mu?)my8+PMr9sPvapK;lf58J7T+&j`u zKI}g6+)HMvQv>h)JNS#0m4ZM12LQtHlN`PY5TEM|@6y-@ZWDUH|=0oyukA5OLB- zX>&76%j0lKUYqygPZWD7qVus~8aOaO7Cyi?uuhgPN5+JMGA@dg001nbR2@AuYLs31?^N`Q%w7qgfc2l_7+5>0hm&Vf=O~@aN;=9eozy`vYKjx!thf*_eN(I zVdAO!R>Zd0m`GRb<~%jOk7ku6ovo2Ml4n>flpJRNWW)@Z(wI zT0pR~iz!si-1QF&tHS0LfA(rK?C|A5k^eyv^HuiYGwk%RI8>{f)y&Y{o=ZJ=!At>k zS7uMlGB;;-$822s-*~bn6;`wM1unZjULR5&VZcRK1Rl76Y&>Ncz#iTIGmMba7>d7b zl>TgQ|EU*tZ3SG4Yr&}~+%b0_E-0JoyBUg|*nAK6$H7P9!WXAsY58-w^@m{Q#bnk{7Mld)}3SM_r-i6p6`yd4*T+)5AeIf#>E zwlryOR2pMvE;7cX09t6MFD=64YUB;*-hJ{A#$0HLja(C_^b?R=y*Gb(#RZI(c6E5v z28iSN6ps35y6xiZV|}5&Vtae5*LxXxle*b+lQ0y)>V=jL@|>qcp)a{%beM30m9N1T zdNY?7fkYOZc&v5vtYM1vSb%kQqWE%#+-e6`DUE@XGLz^f)13wWEFop%yamnc6X#QJ zIm=bgO0c4;-*2Wu1^WhXp=T@&LmUaQtBp5Iaq|hF3%s45SLc!|=3XmJ_e35X8j|i! z{(gRR!zD(%HiCfm9MTy=*_T)W!2Xv7?7O{6_*qP1lYn-qE)%K@ye*ij>gqq?HGZA& zt&wvpDKgk)UKB2t8uNJk<$kv>N{ok@y{Bc#`MhuLFw(W?RXKd)CBHw^*GOjc_(P0|7q8Sv6YYpexq=LUwKdATob~BZDdd3 z;nLusGHJ26#q6h4D%S&)SpfsJ4CArveJ9Lubs9#IGM?hz(@u7kd!JUjl_vVJ%t7Q! zvek&%OSCdh+@NQ1wfx_Q5a9yW8b7@|D~VVCyG-U|gZ9^Bx7LSPN_97*dz^0iOKANQ zSqtk~E%#)K!XOXZMLo4hq7=aREz23}n8BS{$$a6QC%oc8k&`1gRAKKy_Hk!c+cP;L{F1ivcNvuaOY6|{4u9A`x{!X&mnt}M&~!Z- z=@3}6RnecT=XmmyM@tyz`>K?jl|1;@YFqHE>*KXtqbp1PksB~SqDWTk7f&Z1-A)9L~otNb;JdL&)4I2+wW&hKG;t!{ZfFG~ zIxnRA(7KK)(T?jin0du0gfH?Ed$C73S^nXY3el%HVP>P@qGw#S%DT=&)p+5$abyPL9 z`NGpfE>0Lups3>_`r?V)Y+k+@VWZ*jSVg=-zE4x;caOKm0Y3PyRFr{#-9C-avpi;X zN-(tf^oR_@hwlGD;##0ysmUyLnCg4@7eHs@>^wX{3C7cVeuh`vr@8m5;E(rt<*u`+an-Mvv>)3U*MMPzWElrxH5Wqx12j2-3WNr=YRFe@}YQ$Ls#{LRLSd#=Cx& z-hM)M{j!*Mv*&vbPAl4eheG{?tv*FuvpfeYXsX(mckPuPyOOb>RvvDP9)`ovYjPtQ zmkTZYX{eW{!M8o%+kN#fjZ{T9;ZRa&F~cST^HcDGmDOHJNM2g02E5uUlYwGv zR_%85O=Ht63dl{CT;@jznBUB3NU}?<(d%naT>^mJ3k_%K95b$OGfwG-=@dvG=(x%& zRkY(@Wy}9XKX*#4%7A2ezqAWFKn4X|o#O@=NaM@-EnSxY*ef zyFh%Uw)M(+=p&8kBR(kshG39 zL8oYKLxor%A2u>mO{Wii!X3@{mqjFbqEnorsB%}oSgOMLLZ2QqS<12VddvCmU;GN0 zp8b2=QQ|4TZG2Yq&-56yMTSw6BpR{6g@WsgSiR`JD;d-{@2%+9_FJ1tySK>mQVj5_ z8y(clVZ-l+S85X1D(`E(Li;jd|D`vKz%>i*EfrZT1FZ_vk7DNo0SbZEWwXzIO(Uqb zWN1GKQzKapHXggN3JI7BBc#x}JNp+<^peqFjTlC|o*eX=>il6?iC%KQ;GWo zPE?JG_Gi3LWCw-hGrM{IwU+HP4wZiSE3cqj6zq=9 z{Pv3E7C7GGR);WZ?c*@&i!*!BjBYpCO`{O~GrllJblU5LBtkBY%C z`2VEF4BD;%6x@q^zZ<3)A)d!em8OOOKtvq9*+a3q9p zci@FzcW2r7mGdME_&DbtZXFCwg+C{&CxW9_1J?Yqn=7|7y<2-%?AKGxX)i>4OVF6G ziv_C{6`5qsZA$E2jN+AUIC9%wM_A%Cfm4R=(S>nO$~aQ1kt5hznMHo~gMEugaAwka z*v+ESL@9oJ1!3;I9OqhTBJ!vm{%q5(_`kF#@l{;ltKdAyoa5g#@;l0II-Y%~)rf{# zNcDiJj!t6x7*=zj>#OGvWka*ho%DA8DnxLRByoJZJkBwXLpO8d&ZB)JbjW*_LlBKQ zlBrfzE*Siybx1aApL|(6%_=Bdy#sc}hIqA=7Dkwk3ZhtkYEHdh>Fk5ymhQA#g)ah_ zE?zVTuGM85d3E)42eLJ%D4p;?dXKVb1BvPHHh#c-N z{>dCkuM%K6>TNdK+0Zd~CFT+>giA^xImdnI;S~@jD$#ZmB2z|dX8z2Z_Eb^ZFnYNu zB%7a~*RNdVY28}@P-AF#=S`KfQ_Lq#O@VM;hQDtMLMJl@)-xZQG7H+4`DZ`w>~<)x z3*FN(Hu!0*T07@gsnG2qP?wU!c9kYw)W>e?h(}1!`XcW$XW=&$#Nr11_iB5js=K(5 zTY+a?i&u2I4?7BL!Llx?kF+e7 z^$Pn5MfxQ}i{UIDtV6n^Id5Gyr_bA}!+X-z;iP`0+NaX`7drA9qWn1y_uOt~@!4%v zt*-$VORJaFUzTVZ>l13|nAj6nT9+;|_Xl=#)@*#cN;7BszQZ@At&R;za*i z9u)_;{3LZN080Lxj#Ow?Brafb?Y$Tjr@L3edUe4LF$iNryaT>aERg3WA9_ci(~h;n zb%!VJWsgHI)iUa09jOj6R(VF?iUS)JTMv=xT%8>=PVZc_xbKtfIkn2Me&4O_;rX2f z${5Scdc`FC9TiJ8xyCQK^=-k|%L63zjM-lyaJ%rE{yS!Lqol0B{Zkt2pu>4g^Ny^* zLnp_d?7~p3s@L;>iaMw2Rb*D?QJd=lNlAYG5l0XA`s4L3Re?Y2%Z^?5zsx5yH8qR( zz-NqC{z5}nk9h=qRUB060xRx#`DQOD4^Zh_PJS#hD{Eh#PTz-c#?IEYd-gCfzO26t zfOLdM$`O1yjbCs&D2lr)%aF#UKf(zIz7O07+?VX;_qhEzOu}?sMnO`dHVUh;`nL0g z$}Aocb_7}JW9Xd6OAbC&rsjMy0>LNkdn*RIVYBjx?s+Reh0dOVoIm0UisrYGJy|w_ z^?;Y^+l#LM8OQl4Ax0_V6AY;gPh5-su?(jx{wg!Npc2K}R*Ld0tB1-emdQK2RzAlz zFgFm;fjcg<`_|B;xh z;h(uFn_s`n=xKFzB7A5gE*bv5xqj@i*Uv3BAr2&!Ihb3oxS!D|FIi(MENt}X)@}K{ zsF4tqBvwN+{?gpV{j{6c?i!g^inkUcW)(#*DO>I#P+Ql)JoROwl-jpSMAZQgCXF!- z#u?Z%1pD|ek*0Xt3S%ghueIY0f+SSGvemXNU*0M`H!w=x|EtT)35I(aW3Gy1z-xYp z>$a^%$_%ubfX;9qUd}~)fcj>`I^fA#gKDHy#)Hww&p|pH>|x;LLg}!q7eG8xO7q=w zRZ=O-A<&Q$&d#`|B&VVz-^Nh9F|dQKoB8xO8~Be}&)rYJk0g1iavb#GSRk8;S5+%q z!?JZ}57`cau`OtY+#Dz&=DtX-BoJxV^|UB~GD6fzr7EHR!L!3X*N7K<-C{PoZOM#g z!qB@47H~RppvUq!Ls!8MLuUXTV_{0F)y{y9(NEoV-y1DD4DY6OXpB3;3a&q&5Z`44 zc8+$3tPGzOcfLRPaKF(vw4JMj(k+zU&2!K#48NvpH4pnf&0a5E!Y4yv$ri*vFPG`2 z&j&CD_v-t7EZgLGkn^+%4x6rAXRgqKmPW~nC~#>baDFFW*$gdE@NmiHawwamPN_+XVhODsq}~YsS}J4lTGb3bBW6cY!u~)=zu;ws}8drZyfApkWpmfUMI-G z8?Vh7|2D;L1(NHcfy;@72(gvDe3Pd1&OL02(w>Vej3YECDrp2cxGK4#AK9)$H@C*j zTQw;-&&N8i2n&Og$PX&}hjWQBzx~-{D6FP6nxL8BsmQ;k&I>h#OTrWe7g8b>Qbm-0 zzTjQ)to@cv8oiWm>aYcN00|^QRS$f`6BloZ_AFBpHAg1jV1wKxf%|%c7*F(%og(_u z{#Mhvmp5)*G@D@wJL|nGFY3FI7xF&uWz(yZjty-O0KVAAW;NnecD$@Z7OI%IK6WmW zVBBGMui3*d)=~CB_G|B+?DpM8AO5sLKpFV+Q;bzmv@7?P=uB%T)*^r{o83kzqJ8&P z>BN7DcBqG`a;j%Y78Ok|XO{HJE`(Tkep%Bs-&WwmSh+&=ab|aruT;?ZTo*Oq3Tu;u zUSWFlN7HoKQ1q>7z!A(3@lFgqrGFd#{2NIt78r2bn)65SH}NNuVWzSz!t$dTFKcj{ zD$z9kRY1>?vx_jfq%`Xy3sbWJa%V%6J6O`oQ`snAGIb~Hjc>`q5w>dvEvqR6oF!AkNT6@6?V>|tDHq&sW@y~k_X^CI!>=qsYImh_l#&_BG zlHUAU^Qx@nVuXj}LKXktYG;$I1P~$^zakpf@A2^ueEVn?TZ%Ff3-+x{QSJWzSd3Qi z5Eh&srqRCa+C3K~h3&$?jST{j5$0!^f0BJ2nDu&RiM25}>52p^y=_Kj)>zw-n4&z4 zYt~q^PsG-SeQzhfZWkBiA>dDcsk1~&8*7wY?-ca=-Y^dhiH(XxA}*f+y&<(ZY~gmG zq><3QNu~gk?IFH|zmc-Pb+^kOw;|4dSZ41^*(8r>J;VLAkKq9!Jl#Zobp6A_Wv>zx z;Wr)G?U5Yb;U9}=FA1OL5LOEpfSAS;-7PQp{<6s3wYD1@;p223pL>d?;&+4BaiQ_9 z*|CTxT}lRDdFpM{G>r_Ih*sprO0djk|9I&9hGb>N(xWqT_({$`xJj46LifI_H3HKF zJe;IkaI_m+Yu{^OZQeOx>&xRTV25;Yy9^Y6B!CBUaKKVBe3Jg9KPnFklteEX!MLs2 zXivSVettj9(VUj9y?zkrboeXVzOD%5HLPG__ z7k^=HUoYmdK)09ZQWt)@b4?-`=Tp_&k52`(uIYGOWX+Q>s|nZC{Yh;;HLV8ebBN)d zT1MAf!c>lT9spk+Km_B{sAtK81brEXmkj02KNi=2N7;W=+lrtQ6}`x)Y_TqW*IWj4Uq2AR$Kg*`32!`cq}By*l19)ObBxhWe;UeDF8xnhCL*6>>N}# z_>p#o)Deu#Iv2iJ#BV}L2XijT3;0&jopc5_2Fd|2`;Yno4(JlGzC}1BTb54jOlfZ04PXUQu&`X zmkgfES)40bz+s0of9EBnA^;`J920$6j)A30IyA#9Zc~&iiu!dVSgx)uhliRSQ zQdD@JUYOy?dt$W4))j+=p&t#!u}TkH>&5?(p#Z9cBl}0rSt|$=_T5~O1G>m|q?Ob# z6q_1LUX4wPsA^2c@s>v2pikmx^HwUrz-E8!5o}|9cP#t(2ex^IdzGkl)QK*(bRqiD zc&$c?cXRq@(jfy6{S zn`8@*G9eSPoMq<=rOd>vhc5)<9)0T-YzX5ziv|PremXq)LB(XZL1Vgujqr6H;UQZ9 z^dutjqsP4n^B{VdXDG(hPAnG)y7>Hw4TfI-21{Brz3>)c<|J85MB<-14HEI8nwU&q zqmDsX5lwe1Cg396=vKGz{2|NpSAXu!((rxLc_Rweq5^e7`SB%QM2|^KU?Pew>JO8> z5vaLLMYGqW?rc;P4!f})jci1S7wp2V%+S&7+CST~JYpE;h`{+RFs8C2Qb&R^jsp|f zu5A=2i&H9UqTR4z2rkMLOraW2lgAczwMlNd6iFZ;f1yHEf$|j>P&fn zL8E9Fs~u;YZJWw$=f?u~-dFdfMA##Vq`ZMzk}FS7*Xe0yk4r#*UTyD#XFwE~M$p1L zj2`+$CLqr$<(I`2x}iJz14^j*`Gqs)eb=2K$4(2m(H~>@I7EBv2-oGP)No&@ESiVw zLFhIUjr#AT=?4I*iB(kzD-!1g?KFRSxi6rqgV)nt^+)`TW1I;yXd4@*N6#El9*ubf zvc_^UmlCy@8R1loYt(QTdg*@qUaYkPr9;;k$tF2L{Ub4_ef(;LL0qvQF%MA5ZN+U~ zCu&O_TdK}%>%~K*;!;%JPKWWiWy#tIYBRWu1h^-1ve4Zwg$oba{|tnGWth^)$k2q_ z3*zi-1exTD8UKh)k697{*GB(dQ&&dyv#PlT3h?nfnW>q;_Chq&Rz6Z~JogyA* zQ^49Dz%014hSNp(jR$VZJ8YcqUMP~LJeCn)#M=KG+T!6#ZJ_%or}|m80D0>3l!6Eg zP^p6+?eVG4^I>oH9yWW{8Zm%a=TtfoZn_D}Xi{hip4FjLFOF3Dq3IvN3ym;MS zCG379uU&k!a_TP$?QxepwGFq+rP()aj<2}p*d=3^WTBhaLc#Vea+`eJ!j%(*F;nBPGo07Lh8bqJl(K9U-F z)0&NTYkh^dP>~!=!5PH-#Kda;YT399q@<@lDy(+R<_s$p`|Q@Nx&Xkkf8xy~@UDa_ z7XwG>2XHdCci;gvNqGpzXAeQ*9ae%u zY*dT4N0>*^_bU-AHO}@nQ{s|h?N#yW0k@Pv)3(Bm{$yJX>#xBqhUV1@(QB;(y)HWy zeNRrwb25LlhaSO6G? zxj&1(c_RKAqt55yu7*ErRhi}JemwV(B68f&9Ud=89>>v7Gew$N*$GO)8IRs8B(iMIQtbX#y zMlf(UFeRQOhd)ciQ6*M%K}VQI7S!Kp6ZfDY1)LV0VT_>NKX^a$m67=$Xs>*H`_*1b z<8CL-zK{6xK~b(RSRfS{|F-Xs=$i>%4+EujD*C?4qp>CLiudc#>fE7j2?9Ik zXl8{!xbF42fy>A*AgI8k{F3R3&Dn6tylG{{FN>w;***9v-_m#r9tlFUExP*N=!vV( zE#WGLbV}na-LHtumGIAGydd>6Lh4<7!D(7}=N?X`S=RaGJ(0QHvq~{enW?1KK zPqq*lb01KEOk81_qk9jG55PcmD@KhW--Tc5j-Zzj%vhR-<>jK0cuIo}qfCWZjUpu3 zF;`_vI!&LzZ~Xz|z^zA~wI?)(^WWoXrEq>n(0*c3N{xus)~95^NsW3PYa{Zi)LWtyWI_1P+S(~*oyg6oDc!h(7{%abUlR9R<%E5Qy1AQ3??T798oX~?Lt^q8pg zJ@p)Wt?QE8Hia&AzdgYXwwM?^9XB0A#5xTm!f9C1N}{$qxbC*{ZsE)CIAClS6hRc; zME!HF|8+rPZbI(Z zI%eKhvT5Yj=>UT$88{MVXt`d>DJGl!4LsKl$KC0wP&i6@?#(@l3knvX8y!xo1KN`e z$Fr;+dq5t#nwm{m+a@p(4R*Eg|Czllp*G2uIR*d7<0sc2<=E+j1@#sHpOYn6NDt#q&4BpMMwuzG@>Ntk=KKKY#HSreRrOgB#r8pe8vN5O$)zc3uGGPDVzb0Z~oa9 zGZoC)stc{hn1)`4KWj;PjC~;LC@vvCNSN|SBg^O9?$zn+ z^a#*IC}^iti-hk@7Jyd2tkyMG&Ky^No%^1Rj`YYxFJ>YGTE*HOF?Hh&PNUR2D#Ezu ztlZ?rL~#ib7LNIb7)$va=H@NC6plb4X)2;R6ie95C6jgc=2Y=B)p#ylhajAi3}95P4<2h@;e=e z>P;`luA2RZ_Ytn* z;`@WKF{?YNM#f(Wnek&Mu*J%cKChVIB_2N|rjJR?Bx#%Rc;c$zKJyqmo(tZuk17vm z*{vz`vpg0M{Z_HcZC(R_x6xPqBfo`BfTqag9(5mVZlVg6!)XVD~F56zN5+Kub8kv5hE!ILCr{L z09honlN}OcLpWYCZ)ps#>xaEGSJFT|J*C>>R`0~%(E(qZk*zasb;tES_&6}v?|cGA z^{T$_8V&dt)%hAz5p@=)r`iPM#wACcqlk`*qL4Z9kr##OB0)b!ZZ8&{irOUCZJccM zRl5ukOG0NQ_X+p)YD5nkZ^Mi$0%vPfiW7a}6B|ZSV5i&+^XML8%%!5dh;VELC6v*o zE=$(;mU<&ug(}QFqAv=)>$U9gUURKA%03lYWIQ>7%%}u9 zPV`Y@w|}%19;!NanTX9*>`*wjOxCng?Ra`It+~QqVGPGCf_#6#y5Q9of`!e+Rd?Ks zp;av~L1GI8k|$4gpl-`R&hwL*Pw`Cd4N({pJ_mzR0bxHYsn-Wf(UytuyIw}zFJ5bH zCosovmfaENASKH=j_fj)cjix61I}zDBIE;up3xXR8m^@o2a>}H-X3R_@GNhC_c!i{ zn#H$wrWe1hBwXGMZVAT7FD@-o!k8@Udb-C*&MFajS1(=?vdU74I%DWUv>$loYzf@m zRQW?)W3T;MTnvr&=*ea}mOjbV*$>UPeDw&xFnn~{;DO7Ib5GiatV52)6B2Gljepuw zNzbg??W!g%V;o#!1nI5?<#{H(a_rbl$2KKw-KKrjP^MTk3^rap_yBK%3 zj<(FyW}*vsq|Q_RIqmd-!Z5u4VQ>gL`kCV)5OnWqF|a0wrTVn4>_ye83D+WpY4=XL zZEI=U@bO04e1}zY(|B0e5a?vS=Pt9Fnn!`n?nctQ(gPW*5csz{aOcO-fwPYtqy^J} zzmFd0!FR-~x%PI;ptenC(UGI3k=x_x4c|R{`jBP9hxW(Z#o{}LU$7vRmV+@Xy<2{k z*-=(ODr2i!aW<`UoOhm1B!dn}hlqH!-A9RP(+7S^;}5V44b&q_&=8PV!dbyzd8X+3 zd+6tFSBXf(m}kAO$Jcr&$$?d@m@X@&b%tI?XZvEyEMf0~yc_?h<-o}o&usfPt&X$y zdWG%6yQKPscPzbA*)1gsR^SJ}rYh@)Lt~QS-MkL^|webDKi9_gF}hGEpu=n{voZ-z6+w0eN5&n++~r;RQBIzG67fI zcAFG68q&@^n(S4g*zBv^zLWhD+CMKl!g(DZ}0avuxHOM_uO-eH-#4N z6@oDO>4{TNAGfXxNO%3N*x!h_{oRH+d$uAP+i5UP6(6DqsB z^d&bA(O2;xzTPky_O4FZ+=l_FHV>!6Z{^SI9~JDBkz2ANepw8t^3Up0ujF=Uprnxf zUpi+l>Jc;^2adtp>5c-@Awfp30yYvSLD&1a{05r_n@?J3V)n9mGxIC{70dJWT>eX| zV%V*e+)>Zr6S@a)AGm$$DkZOASFu`kruf=N$AFUqn(}8Aum^WF0re-k2kny>=s^x7 zoUIn%kyd0z&9IBp8Ub9M&vE}2UdA!UPuaV-{-|1+J5SdBJvt9dz0ZRHZ~63OV3^$C zSZC57K$cwi#S_)v3QX*~JYTEB0H|09@G$Io8~*8N2?_!VP~QlJjYPmx#DVi%vecAq z6Po8y;BG|7qz#G6V;K-(3|s1vT5Hvzt!<%f)jnVEKHBIA{$(QIP{~U>x4v2`+rGv; zt5?e-XeI4jkNO9OgFF@Ax$}AdlIn$xfZ%PodrhH;)_3bi=#`Ke`@Uc4_3KR9*5gj! z%hE3PSOX=SHq{q>YJHjk_lQtf4T=<)1Y)%>da5^6VbgjgJ+pZpaQ>GYqoSPECbh(+ zzW~-vk00dN?fW>{yOlHV9OP9+1PF%?O{^!jz9jGHxDEE5XHI8(o0Hr1Wmp|HmD{_W z+83~fewU3|_JvrEtA+LYj~w2i3*~pWg=b5PjAwTe!@K1{A9T*w+eXld>n_mcYTqu6 zv(uWX@6AS=6W4bS9rWLplFX+#~Rgq2lM6wi6wzwuKVcf&~3sXg6rpK?}z5 z014R7d>Sx^t$|T1V6y@E)FBqp04eBRCGcpD8+Ke>-HS|knc=Xm$*Sjh%VUcVXw9VRDJ;}ULw(O4frmoe$hANP?p>M4vf)V#qivfjf7 zJ#M6qr2P-KTK%6N=K*Sd_R=pI;;-S$`&HSIIFcq9u8G=t+Ie_}O0AmiM%}G?uS$EA zuiPI!y%V(d=S>4ISoC>_7H6Os+r`hlI}4Y&#X?$O9|ibOx#)GpS4?HTJ+yxvX&t=J z$U_*}^Z`UC{kl9|g=FW!wJrg#V*0B;?+&BZKy3gdb zW2vElt8@P&;#<@g=I&0PfB!w@_B~m)3(E?a9Z8@iA#cO;^v2kl(4QuWr&jTjxaDqgPqb(#S| zDZOgb9H@4^K&?Bkjka^ko-nl#v#a{esZm^n);+$EiuFoebO#=b-|(+9mGkONIp0r+ z(!Kre$Te?N7RcipK;``hU1HJ#DZxFg)~u>be8s|{A=ju;S5G_NkvuRH5mnB~(U)O);ef)MMRqA}*A9Ux8S~}IZiy#a>vKKgA zZHtm&D6Vba2>KO%!YI`B0-sm}TS!0vlH1Z0?30lrTP!{v49B+;oS8mZZR2r0n%sUXDen- z!7-^iFA(=asBsfHkEakJt~C60(!HLH?1)d^WPI9+0%6~n$Qvc-u#*33g20IIpudXS zPPeweqqhz-!UWxt)2ha0?zDZfU9T)@E54Sva8t%(-d$7~oZlYxC|EKs_}LkfxcYb0 zED9k?#K~KE*oPC{zXMD^d-#WG^6k>ss%xx!<7*3>%I61!k6Y(f4wj zyHBpMlm=a4RPOq zLK1TMzE5NGzTaG3w--_NnBUFl;E4W(s9D9eFxF(n|J~u#teu?(Vxru z4lRU$Tz^o^CFZojbca^dF*}A^gxD8U9{8fLH{jzIxm&Zw<5cShp&-Mqj=JFA*J!|`%GUEcrq@IJ44<=sg^i_5cOm+tw)vO3i-KYQ%)=#tvLn6z^}-~xV4%*E@$ zBd)L+w(l5d5GklYjQG>fgcb3YkIGK>*xk(o9Ny6LtFo_l>Q<@XevtmgEmFpRes;sH zKc-vSvmlIDpGj)iqg({Tnzj^o6w$MJ@87opFAo3`XPP)##9oV3E}=OUGV@d!!Op z%$O2Ec6}tXQl)?AX5xC+8rm{lOV>V!ym;CS6dDJZPtpw3i#h~xJ$@G_8ubx1=u2r5 zS1CEbF!k*z4XaP1d@0Z-{cVSW)jOTtvRT6}QMKzP%-bw~*tw#5y?I$;>CBHg1#>$y z$BG=IeNa>>yMtr?)mUyQ#qrRh5Wx7IdF%dV=o^9JfCuzaZH@8$m_6XJD+JpkyxXL5 zUnilGC$flYU#YtnlL9Z3O6mgK_`Lp4VZ!W78t-{{+yU9un7vuTu$xBX&@+i8sSe6| zFd5lQeb z0t|Eaf3U`gxnUB1_r6JGt3<^nFRyt@s{6M`>{3<=U385-4_92Jsl1}xG&^>tHJI{NPGYJO)_hW^p}`+>}raj(X1^yDcSxzL+z zP9PfjUPgbHqXn(?1YYlyF(D;j}joO>GDq=kKoy_mcZa0uTS_VHRhCb%kn-@Lrtc;NsGt#1P9uD8V z_`}`RZ62e5xwq4reC+`JB;)T%7>+(RwcM`Ix@2BoV-Fv|Ojnc6<4qs3JQg7btkkHg*TP%sWyaM-iINwB zEM?u%BA?HTG9{5G{#(GX`pVHO@O*IV+w^;(4Hb*kcLHR+?H1Kfwt+`Gf2jdGy(9lY z5os(Pg>$S)q6C8lTdf1D{nxlDLWGodw~6Bm?o%W}`2DxylKvU~wGP4@Bqy zf6B3Ec#cM?dr&I=zKY6+f7FS1FR;l%O}vA2-jAChh6<^zF49D(v3m}M<)Pz$vI_;su^d$OySh#T$zX<} zfBRD6pv#)9%iG8R9A+$0~)V5;R?0NIGkHK|dbA=BC)b_q` z5nKUAbguRUrhVOkiU+nrT&!BqSY0sgLjh|%fiuet_ zD9*=FO->qSzE|Q?)v1jr}kl|rkO zLtpM0H2q9<_9nH9uNgK9+g=UH z>;rt+>r?RjUQ1$r40;9dy(PnCt}lu&o%R&XULe9wu6v%%d@vs^niUO`Lkl1WnXh$k z;#sjohv_6tNS+e|qH_r6&y_tM-s2Ej!fccguYsb7<y^h7(Dg#ZmX>@UzQ>rZZC6uD9oWOu2uhr zBMkd_MZP@0aa3tC!^^$;P3>9Oe{s$`z>f_k!|&4C{uN(D;Gi;Ck3anc(Nk!5NyG9?dt80)v8@U*v62t3lYe_es=O*hZXHF|n_+J1bBOI66P zIboTLA-8Y+jTU^ayv$1)VH0wMMk{pbKX~izZN3Z8e72DUcor1)3I{r4-RLaxRLIw! zl+1z8CjGd92AJMQ;-wCiGe;-|rlud}{6{q?^Fa5UsFfRQi7AhPzHR2q3jWbM@`o8s z;3sFs2V3OQEGW_<5#SS*2fn?H2_QS$j$*$0)dMZ;`=-kV0@>AKJYqunl9oa_LOw#$ZNNJK+ibW1n z0Q7a=Ok=TJN#U0i7DFHy*zF(^$#<%uz@kc35Ovh-Y!L@lYNU}`Z0eKdWlN&WCBg|` zWD9o9wYbv;-e^r{&^RAmly-5#`$??JT|Yg--E|jA{F|sYCVEl#43AjCBa&|Q4McH2 zoEnTcSenJ5KjFqT&9R{#?nTNsM;KA6PkM2-Uh->-X0nT>-# zbWr5wMPqr+S3h2e3njOEI*zH@tGRv#sKxA%M>cREkKcWB713lN)pMjLG8UabzY|Cz<*otr z#GDloC)v`xYAYEV2UVVu#c#o0Sh6xR2_q7%`Y%Szt8oc90JO$LPyjVFd|C{YutLZ4e_>vNz|KuYpBjwM>DwEma)N~;X>S3;3cr!FjWdGZRY27hr*QL zmWT&iL5Bx0uAh4Mi2pj?hV)B(Bco?{F=<#DQXx;{QJ+g_n}@Clqhv@AM_V-uSkPB$ zOed|ZN4T5PmA3nX4xr1I49|#RImuX!izYYLC8Tk`8yW!m%>6`oSa#Fd+@GZcvcSHX zmw#Jx5Rawr876%SislEC@zUO$HV&?1jB<;kn?b9!I&rjXwdQ;S77;fC&5FIAvU$7M z$vK>v9L|oe8$yc4*n6V*d}fz!%G=63PIYDW)o81%fU5wgE9_l9^EAsTg)z?F^K`wR zs%X1Ruc84*-mhnj%>9)85S$n+Whui6O8Re!}Th9On27HEe{ zD;33j4!_H;jPq5kTUdoS>cYHXnH=iu;o!%^ILGR<6ORsA^3;5O}_%yE! z9&z;l{TN_^*%)NfJQ9CXP{EqC?DF|FHTnDRxs;@&Q>4W!9D}uKz~^W2xJ2@T!tLeo zB$QLKSlHba_zd+KU4x+tJqn$^+V~4N$WQ0dx>0rnL+!4tx%eRlGJmUO78r&P&on9IndHfgx-+V zi$ZmbSg-3*pG;>X#j}e&2O43zyz7eKVk+SSC2~OgzetZ{i?2L5jjwIpb858|nFcNc z=Jes^D898lichW2#d$a@=tqXKjtO2UzhEDa{#TtLGMu;lmb^n1e;ead5DQFp9%R`( z&5Z!&(c!c`t68$01HD!xYqnk0dR#AYY2wfLhzJL<|VWFpx ztx-y@hMJS4&og0H?t5(F%#e{UpZekBoEwH9Q;%Vq(Q~V_r4Ldl(*xGsIOq63?)|Es zDNw`zP;x(WNiZPDGr>!Dwlw(vp1g;us>-H^;h%i8qd)fXdeCvRtKLBo6aSW8diXtARCbHdx+3 z(FYZPUpO;;`&<74`j7-IQ`zZY?vkuI@$AwgzB zEROM?NZ#&fgo{tEU)PyAzkMWxFIRAsF4cu&(Pi-uln3`o_cDX+@?uXF6M8Ypt^GPH zQu-B^-!Y89R@*f1NeE=!hBG;~^-!x-%XZso6())%SGD*XefH=%hoiIsgW2RZM^B(p zUrbM$$yrnqtzf4TVqIP~(5ysQeNr>=IpN-M4+px0P||CLFZx)gkyKHJ3Ly%Y#>(6U7c1I=VCVMRb338$tS0*v5S3C*Hbgj6&aZi>8=FPHl zQoCLX7akRs)t%5$D-l2;gsj(J=dN#=LW5;hV2?>~U-* zdNwxf{6UV_O*zc3xy;y?d~JQ#1nf{e6-2uCTz?{xS|c_wqN2{Ymg7;R%pIR7rr08{&~YIWI+Xzx?Lc)VC4|CaiX*l8dP zAXq-K$RelNZ}BIeDzAAh0w3kW6O1$<_(M*qFEgN2c=Be+rVD;GbUmj6sW96PzxeGK z$Nm8*i@8b)^>P|uVjfD-;T16WQrGJ4h@tHKBPug$t{8&;OWk9#CC?{c&l@Xu`g>Kj z>nI!Wf0+*OoTR#BGO&zi2TTqaK6>&^FbTKsprdmXeO>Z4zp*TMM91kIvHLW&Y|X2+ zlIdGzWJWO#m5$~?R|f0akg<2}M_Sq_t^&P1-Nw8c*2l;$3*k5oJFhv$ zrr9W~)z{$JYrZ!&L6cQlnAY=fVu3GT?=7>pWBm>U*n(&)zFm@VE2h3xu$hdcw^2^x z5n`Zy&It^$N+QCSyJQez*|hB%X)`g$-aGw%T5>OhOfhhaNG(vtn{1rwq81Lkg9k6y z=J2@UN#o>`jZ@+BR-Jk~CzP&}gk9wxB~x%Y zUFV#V76oCHqCgxCtbH0D2_S!MBUp1|HlypRZ)jKFSNMxW;hP996*C1EM3{Dk9AnZ9 zg_S;I@%avaW^oiC7Wb~OPYGr7{m;W8-lRYbmS!6M(%?i}zBZxK->{%hG<94LVV^gMXVS_sGuxxz}fXLq^+$D#1+=ZjTII%fl~ z7@Nvs4{|QmQTY|TO^(6xevt_mE7+6U^gjo7{`vNKXjfMY)PGb7iHKTYLxXO}TnjA+ zsnVG_o7B7^T~uK~@<>q~N!Y=H#NNZE*WE?TdQoO|yrzO8ikdl0MevO0xj1ajz!YuYcM~GY5c@+|z zCBo6Ft(B2YZtnP6*=ckk&L$ag^c_)t@4g7^U&F8zi>x>R$mnO_aL%y}EzbS1iJHR_ z4GP+;bOFqO(Vvgb1;6WYd{eZ=FS}4lWU91=&Ok3F7(=F?Noh0t-K&oJapH**BO?wI z^|Z2m{a${M%C5HVw|r4Kzu))PCU1(G7u{k4r{sJYu;lTcIYwo&vN}8u`gL(eagLMc z?&;AK>7hTGN=!r_SxCz$~0p0nmbMKsr#yEL)05SDBlk7A{@1`WGaZydy3qa(|6GjtS3pKUAo zRO4MJTKsugL!+|aR)&%1{sT1!K4g{i1w3nmv@uS`KA3lw{n;DwUQF8LV3mx9_k&3H zl1D-uxR7)#tN!|D9C(extMAk7%{W!%@ffOS z^ESW1<iAb*(4SJF48|km*==18!z*s^DkW~R#Qg-?O`_#QIHQ?7>>H1LD@#}8O;Rv z?3Nf?yzFhwB~*t!pj?LTp~`I!^q*8&^-Y9C4cOWJE?W~=gGo8 z86DW*A1-fID?y_r$6Fh`_g{LSYR__FFs=trTo&=^oRw`xzgG^&JvurRSUNs*aLp~s(6G1N($$?HNtZfQD1l|iVtqU zG6fQY=)hp53_8oXfZ_*6BSr1mzS7%4^LPXPdpr2${d?r)XsZz)goJI2*3fXK-gW$6 zpQhgm+9GOs|PoBRuhbARVVPYTnn^tDPDm9!)R9bJrOx?X<2I1S7cUm~;5 zf&{UkGeApp+0DQ=?BRXujhT29%w79)#>o6Q5T z5Xx73`YZj$yzk1Fw4~|=sTgchze>2ZWzOW$oi}7<K=TO zAzhoZ5e&U&Ck`;VgC)7S3QJK(LADg_EG|ar)3bVx=P}F7B0=>ued}|x&iX~87=G+d zf;wZja-0{>O`VE*Du;ApKEFrST^S%*bX`076e89?>AOJW7@7)yTr06}nq)4Orc}|MUwZTuW z&1&#m`6H}6*#{dc4wpepX?(-6S0Cd|7Qwf&S5db{w7q2eZT!bczQhN61_NrSY1rM= zg4F2{sH)--Wr5TvrGNSa@b2`2wCLU&nO@#Sf$4P9^NlF*V32`g{bi0H?Oip4zSLjk z#vJaiqGggX@YMy>1?e!e$mL#&c4U$obT9dL`>Qix?P(6elpo3M_J+B50T9Tg7N>UX zRI0uUjts}e%s(qr3*SI*7vyHzo<@jRmT}TkLdazEV!wsL!?$yh^xa^9AOEK|0_fGH z1iHBskqU2~597lY7Hkv4C&fXpxi|8XxwS z#>z&0Wn^?a=gi}WC?Q*kHe0XuE|_%`hb#lvcP1iAID2hjH0 zKCP7%=ylbnpQj5~Vdy!m^P7jp>j&q)z45t zZ8t>qo000q9{8bfG;L^ff6{uGEdz`_iX%MYg=atbM?#$GV=cpSab1Ayt&EIra{m3- zpa1|)bEjl=?=)$!aQo<=JiTihFNH{%BOQ|TMtPkxF(&??=VOsGOA8LROoxScZ2^H- zgIZCL+jo%(o43V~c@sO2>EEwct%fpwoi|cOqxJW_XIQ~JXWr_|VV_fIk` z-}>&B!NS5CZq!Nn^Pez<1D^>y+n0*W1nH69bv2@QwBK>)T<2dgv_8u!UhA=sJIO3o z2#4QiVL|hVJp9_KvV!dMG=Re>{rb6Y{DFzZ&B``x%=gsx99M7G2Mctmg4S zbIT=LpW`$KU89Bzp5@nKyx<^Qa&+Xxp^BD?pS+Nycffvr3P+bv_&(~PM9TMYIXOYW z!4P_f(U%0HE^ptwjUP{WSef|5R)=KMPpc^0GTB>ueS6|@H{Ye`0q-R@((pQcfD7|AL zwLKXlX6+UnBOiNIOaJbu2Z48-OhWfCEw!}h+-4%v>K4cR=ReBGLe@fY0{X2AY$z@^ z)at!OfcHlCi2}mK@9Mg7FEx+7-=fi^KqOD)w>=qcB-8Tc76$TugO*+_*Q;hpv1C{^XYtd_1}}1d;#VIplS-XuLV_1Y|0}Pg_E{oW#3Ub5}hnYt?|=X;+osD za|8go zsEHyw-j?_KY9e*L@pbB*qGAN#n*L$M{LGD8cGAB4qsha-%bj}>8#%h%yo>Q*wq=hJ z7ejmbIv>1lN>-1GTnyj2jL2viqtpD|))kqtu?1n($}9($l4ZNmr&m9u7J>Q(c3GrL zOP$)c*DDoZpQ$<85o?g8jUXl^AHP?fKN)G|3iSs%7Su4}`QbV485@%6=*iu&v#%+jnFodlTXcdk% z;im{Y9D1oS4X{? z%xW^L;-jCZ8P1hvBBsEIAZ47tBureng@APh6g~QBIPIqy{~)9o`SzkC2%KJw$A(u~ z$b#-CoQMm<@VvWoPP|rax|C6la#aup?`DpJ|IIuiTtNcIqhekI`9MGf#C z`22YI#A@56re`qyQHRTrM)BcgNq7DD)dnLSLjp&aa~tgJ_uA@w==mf9bDpC+@NMNw zX>IwyzSv6Fsvi%4&^YX>jnz^te8u@Ur`Nzsb!cIE*npwKR$zL*x0B;Aqt8we8v5Xb zEY82!p!Ii`GWf8Z;pSOGLfvI|TV~iKW*9Xa!CAdaPtMD_@Gv?5v~rUBm>-PntgNh5 zRNO16<#muQ^!>D4QzuC^rkC}tKx~|gB1OX_RB~P<<$98_O5%^)7cD0vjt`~;)NHmi zGJAS+Fkx;`C14QYQ+gA4ex@H`)$wumt$W$+*IYT2VHXVt+vstlo8^5-`_Zk5h||S0 zGH>>8UZoSn1gFVnkEym&vLscTrYq7_{Z~BUvC~X!zp)_fQgu(v*+oo;WbxE}Hv>}t z1Tbk+Xt>mguZ~4M)k$c&urgQFc8i&6 zE8$nG3-^AYqlXt|QofV@#h+x-ALgbQy>z?q@w=XH_7N)T#%>aV| zWoGvOl7v_~!EPeRp+aDbLrfCda6=urJHJc=T|WsyerAy&39^rv4U@B?w9P1-!3;jZ z^X_QPafHprktT~kSanB`B5HZ_yHs_civhf|nIL`E-u+nL`dQQ zeyzQ<7}D9|`M=v2&+<6Mzb;d4L#@0lyUr9sF1`ielcp%7$w!n2b0gH?R+v70tP%I$ z%+x=N(>ymF7v7%yeQ6X2FbQ>ztF)Y6^{@Tq&;80WHz4$$Amht7J;K(iM)p?)=^M22^9Yygso6XJdy8FC`JjvbuXDeX$MLuGgz%w* zyttoKhovxm@1HL%qK~EUXPE0GSY@te$RP~(BjfNb)#=%ny}l}(3@CDW(GBTkgN~yp z@=JsE;n3Oj&X8Z>Hv`dJsKN87&_|-V-}#RTjCa=Ke7TN-H$Z?4hYJ4EGn+Fxg*4eB zAR~&G0d&7UY=KB4U;cUTT(>EXTrMDllM2T+FwFI(5+ToNQ0)XBZ?$@fiAf9LJE8ab z(A8n#TGpyd@wt$e-lIpnKV-rfDl7l=oX04|0BU( z7W}YW2N^zMN_s|*@rTM-4=;G!J^sMrJl%Kt6qsh=P6=?K&EWO;P%^DYfsh8C=s(-* zjySCxo87%Wj$7KpuhrT+U`$GSpXJv^9&r)}6n=OpOk?>o{J5=h1`bUgwuaFKIi4S( z?OwjVNtF-t7%gl;oKQt>>AXfU}QtB5hu)#o4Kb$vwgkPhYJYCFMIvn&t z#%!hsW3S=258`kyX6dp<@-7psaj;%px=YyX6)Ck;j@Q!Zs|;@Qs~ zJwqdR`!ZP$#85%I2N8Xh){c$f;?Kj1x_>fxT_LxLCnx8Ac%)Q1^xJ&{`b>tLWV|>I zG1k;0s&@Bo>)1m@E4BSwG=Etsp_hUOr9n^Y=Me`Hh-zyHc&)EO39@67>;3*CpAyC? z-Fe-HZ{RIMUusu-33Z@GOI!D;S7O48*C4bEjj&$*g)O&DMeo~J;g2m(vuPW?dU^tN zE!kxR*$1bT%0MO5@58QVW1KGQ4~bom{m9@e3ATB+uimi|(?U)EaPmrtLc`_^o(@xmtj zvgzwLgAbVbLcHp^OY(BBU%w$EIN9MoEbR(18w@-|81ouH`p|aDWxS4g{TPQ*F$(od zB$nL2AY8@&m_;KOQeQpdtr=lJPzZ12@cNvE;fEs5bJ=#bsjpM3P3H6R{90QS${?de z6g7U!F#yM)GX33bl}i(;d(fD%@_2ce*J* zdym380Vbmgx>Za0zY%lC{5zntrRSaqb< z8GO-2b{&l0NA0=Z`Q3Zu4+;F-m>CMSt|@hO{72qj)`>m;d#?BKJQYcToZS>WdaBbh zv+VVi@q}ZctSN+sj+&OnawguT$fX^1-jfh?YrLe-a%2eI>$gS>tqwm~>JfX@@Ur)d z@o%uUJJj-kxPZL)KN*;)P`d`h2?Grdo?uDT{235A1!@R|)CNP!9)v0StrmOOtq(!^ zNSSc$ri)D3`bN2mWnk((Ua@c|*=5@E3(5>|u3!ZedQ%m+hPnnl@=3`^x~ctL88t7- zvzneWSbOt_iIB`Dw)wfqUY}JOAzS+04iIsR;&=#NoG?g1eU+HXh1%~g5x4WN2dLPm zS#NWnBtgx)BTP>2zCVTygDdw zfM#x!ES>*XEVQ|B?`~-s8#nE~ks(y-_mh|xb>|&xRtEv2PMyy#%N9gHO9*cBJLXfF zyl6;*_O2-jD`g)cUdw_TZR(ZQ3!WJHF5lO54PwrCSXs_zle_C1=^vZh#M+s+D*ncT z>|}jbGu)lk9Pttl?QJ#7Tmo;m@kn)rlie_8+wXse@eQU{YjrV&<&v=CcB_p`b~=+n z;j_LCuQPQsD0r!iyce8Dcc~&R2yMg(Hn5rWUl5Wd> z=!i6WvcwO3(^a~XPcKyt!~4D!N`X%ZCPjG7pCv!gW!Tuj8-+^^^YNa2V6ONepT%-` zu1PG)`E71?;cyrm${(gsi~38Ab@=nlG?K(RaiGqNaI1rx`(ielG#M}DrYE8}Xd&!B zYtzq~Dv{o6ynV3>0pKur;bu`(1(OkoJiCa_+6~awKZ)WBh$=CE_Bl z%9-1T`($l3s%+tALg@!!o?S{TkC2$a9e5VDUt1lAB9{WEzg8B@)UvjHf)If{v32^! z5bv0N3TUpgI)Vp5eVact_9D>3OTX&@2llsdcMNH~<7NS7XMc%^1IhV!slH1)p|Q=l zgR`Ch5m+;}mTy=up9qf_I)+0{aS{oWPM-v|kN#0jhOyen@@_{Js`(y{$1k!PAu~`ZCk`JytR50g<*o0){Vz^KYPH z+#8XnpMUn?@KGUx=pHkYbT=ZLXdrJrJ2v3kCte;7qXLuD9m}aFRKo52Ko6EVL4r*ZwF$JROu znR`6cqV3rBbtV{vKxD(=rq`IYK;R37$BTg{T+D_&vMDA}TI^*iaNK;f3??hU2g+HY zu>JY!crDqS=8tX`_)u;>bcgYh@OC1jkOx?{NdoUSe;C`8|AO2P-I^}yZXy|&&;BLK z2AjromBFk-2W*;b`C8tkAped{9+3Xq`Nyi05_eM)l+y4Mf7D1wM78EI=F8r$t7x3j#4jE;w30pSraU7iW1oEP zlm2UAh>mIFufdhBsMr_6tBVa(?+9H`)tc9wopPO|!$R%SR2`?u;0BaBqb z|5tA7)FubQ>_`gNl?z;JOj>9=^`9I)FvPOsG7eRNil zO$km~ycyJH3^?B_CXfwE`p+(!jB`Ryf`gl<!&8?FaFlg=>75!c6RqyAPQ+4*wOj3wN+f& zt*uQe>&tP&eZ`xr3Qha7@cWDPsp{S0vLtC6RIhrQimqRGo*^jZv8H8u0^U}f`qs=T>*fkilT zREXnoUywX43Z9fZ`R=UyUPIbp}2K=`Z1Uq2BpjVJrT&`Fw)neHht> zh6+9aJe>4s5J8e%yG`nHmn(Y#aT3$4CO0=Xbg+l{KP4?K2#d_?`h$fZHyNR8)$L6- zdb7>|KZ!+!Ki`a$>r-Ni)^YcQ>y4oV6L0?{a3i?BXGi~X*QBC<9jKecqh|kDxIMt` zt)_L;LGmISefDZxs%k?17H8Wg&6)-_hLDt!DipP63YbIxKy%Pg%cj<8Y0EQgwRGr4 zm9a<U6hhMPvOT}}RA5aswuYPtUaZFYtVN?1Mi#%hQLVMst%gm-Vr7~rZ7r<^6 zvr4ziL=5&Q$!wMP5^)_lskfX~?qr%C?k>LawVqBHDi}8YVo_-gY0p)==_|!_>e{n$ zKM)Ui-;?J%fBXB;9SfmEgSwF8Jilf$)K2T=mW zsJ=h8;x9)|+lTtD=jUTcd^#WCcAx%LK<9%iEjxnOvG;N4gbJZ1mDs>OR?%_>?(0MKudgXS>4?V>2PpA=1*40WXy zIWJZO?6s8h?5>Cfo?Qnm@9yymz*jAsk%W^NFIW5NWI1JTDCdqZ|M9(I zcz813-*7y-EFOIewH#m89b*+Ae-oi|Twmt{UONw&jmfuX@xENX{GK3>SrLg|-9F;w zVX0PbO7EqqlZ;WA0PvWU(zNLubFhA{^^*4}b{Y0#BOU8mb@*QjYYojU`v^OO_&y1lGZy}PqJ=`&{_7V$5pLNdk=M6KGjd__-eQIQ zEoDU^g^|a=T~*XJNCrmkXUJ@h`>ImW|=lM>w;8IyM@NzP+*G0=9}&rn;%1U4iv52GuWtM%`Ev=oG*XO3Cy6 zN{p$X0+uVwq|XAuWthGVv9PljD@PL1;z9Yxa9>l!LJiA821=B>B@qk;DLxZiE>Cgg zmf)s+0Rx!iRE0Dnt4fNsi=%2=NIKqKrrL1BDOoRYoS^zVRY@|hW4F7mk8DlE8 z&*&sN!z~cOxN?5h{f{^=t0d#+z6^|>pYj=JwrTW61qCjZfs59?+|tWqD0i(1y^Wyb zy0)3gYa4wqWnST2tB=6Nw`Zf|Mrs1n=mA<(QI`zIwuL-zwQ^{L)s`i*_|8pAR?tyW zuP<|)pF&q;!UEuD$|F;JYa=LunzPE7F$Y^^O;+se!X=K%im4*pGXwl!iko3tACz{DA3Z$UxHYOHzTp{T z`pF3;8OQejv2+#=O}+2?A6+8d9STTFcS#BoA`Jo}Eg+1pfq)?0jBWvGDd~`AbV&&e z937)$Y~Q^OSW=_j6y@>++4gV%bzxP_}xajX9>`^q6>0D^HRXd!qo5#%Eos zMfw6MYZ{~lNVV%H?XBIqaKRlN0jo>}=AVy=-_%yAZVR%yJ}#Y_gMOhSiVvq!EMi9z zqs{ThXoWJHvzCWWQ$-(5;i%X}6BM@BXBOA^D=5ky?oiT}JWtfCKLd-tmC6HcdY{@J ztsA_xPDqW{8|6GB3DWhK9=Wwbd_#z`mcQZaGpa0Y-?yHu24cE+jITAxJFp69zDg;0 zg}XCiy!3bW!#TxW-jD*_xd?h|PJv|@Hr1Oug3@viVFrdv@g2i$je^X#3k5XW6F{Hb z(V9JZ7U%5{VBeZVdEc9`pg=--APs-KYDjXg9yZL{k2;ixE1Bjyn#4HqwRad5w%tp# zJBkh`hGDAmuPGOHIR|3ESPiDhjnv37shy$$b6pRLc;}(|O=ca&kJJSGaO0n5rTX)1 zU-DIRz5L?20n!nM&)L93S6OU4A9BAmj9_HENmhNmP)x920(-`|oFz0i)tW}$fdwpB zon#!(=q8WG-8!BVVn!%5sxR|*ynz6C2EVY*aZK9J9$l9B)u1L7*asG>pONkhU8$h zHORwpjS60}G>@Gy3E|ak8rV`xlTA$wzYXQzS18>*dk>&CiIRGcGeQ=ZN)YjdeMtI) zQ48ZE-ZY#p2&%l1deggca4LE2p4xwKtRp!V=k4p&Zk))nAqGaX{5&q`QMixdi+X$# zmn?LzP#)ock%h&o#1-wbUW;xQ3X%_|%f#T{!dlM*Z$a$wD7h?8T*q=ax+UJ|p!*bw zy6T@JLYIq5@T87z4617I;T`Kt5Y~?9P^i>L>l#IKz_tBgd@tiB@gbu>#WB5NqL_6j z1%`B2i`nlpkV}57}ecZW`|&b!-d0gm&ksbp}I2W zj`oh?RAoR!uxiPW%kyF%6MVvoR+`U1sH2EcZ5Y!17l2R6;bCeqjs<;Kk4z8E9=x%#MU3Vw+luGRyQkIGoX1plx|Z?61glxs)w)xG)y$ zP#B}sw&YKdSltxRCXX(|ISFELW6wQ{g3lA8s!pM9d%%HU+%71Lz({NB&1KqJ4gP)s z+EYk8Ln{R}2DUK5)T>9{j+wwT=E#iIc*-)1ujut{Ipg!DAK$5OPx;N>femM3*$!;>8Ke7m5T&TX2Xn3M+7hNJY6(J7J{OV7R7bP#RTzJ#M5mM4_aZG zQUJ8mqOf+_4btsKhSee?=th;MmOcf@VI0_V2uTp{i+v2$3C0iql(pxc)ac z2PKhOa5nY5viUP)553?_sYMhY_yrZ=Oad_5rX}%o1 z${-Y_{F|#(O_>`_bEM~_WObfr=dS1)Ng(f=go?TlF7lp(zS&>pGFo>}ch;6*<4XNh z@>lZzGHs6cCRH&}Ayb3k1P^7=*fbs5E~4?$wwON$ z3>uSV9iIDnDcq9yv#?(of8nNVZvjLvQn%9jWE2dhJa<#d!jZ?n?4(D$Vpa&E`gYH0 z(u=m0Qksb(aU(<}LfeFp^Tu!V38ZALvRoT`_TJJ-K-jRpWH>D9P;32r^9r=zKo z8wR1w3DFqekU~b!>kE;xo4n$MyKCrK3Qt5;zIsl;86}@U=+{iI6%@ zeD(@Qt+uDLg0;Z8|Jd6hbHpPP9Q9}NZsR^9Jm2_1`v&yberv^=QL&IcCJax66^@ys zg@`nTZfH?Os*MsW9>0Mr@CbB|@-NZ4tDu{vF6hl)2OaC^AX6a;ZMO~^ zbj->3LV!sVz9~OBa|48l`-M-}H)bvDHbbG-CD&8*A8$l5_8&5Au!526VsPtgd_B6ZQb^V#Kxm2%>?YI9kwn0s~F(b7}d7z`S%9RK6bpq-^HY%xfrf; z4hW3TDm5wPW997M_$+MJ3l)odwjIe?8ksQ)iryFJlbv;Q(qvc+WxU)?78P^qR)S{v zh177OG_tZ1EzsZb^3@m45#&KTuVf)=p@I01Q+*0>q$h+P4eqoh6f#CV-1A3{&;R+w zK%wv%(k|I!Jv`rm0W=mYPXuj(R^O>9K9w%sU7$aG9q+5D+O~=Zrch+nHF*wRb-u7Z z$(clDTDt4D@(P@nRsOu?f`amMm=)DrV?kyE3QRtfG42f3V2>Rzm6W6slL7n}I%YX! z#Qj@r7#{GGGr*IX_9e-gLP+dKip_xt;?@N+2ZL@LtkpG8o$M0uS<$wpYvDo_ZI_HeP5 zL5Q+9m;W8&9l+Bp7grd2M&RB}6! z?d=uQ#6NDg8s23Li<7qpR3Qqr5b(w2K5Sp@e;*IEfNC9+Y+{HLLh6J_-rlG4hkC*m zT_8F#8f_hcC6N@yF2>a`1V2?(Bm1;QdiIjxgyHixG>Qj4gr=~4ly$mO>SZwLWyebr z5i0kf3FY{ZI82F(%eD)jbxgZ)avxOJ2#$NZOUqIPGNF1?`2(GR`~(^1cf8bk@~VL3 z<7=Tt)Z>A|m`3MIIr%NMg^k+l1UYn32&io*B4%z^C1X%@<}&Z8o`vNObtz+mS9Jj@ zzL_1Y$PG00GLlnu$q@tMnvQa4?M1=7?UYDow8Zk=RHmxvP*&}Z|0)QH&Vw}7{YsvP z3X?!n6rV1W{DT(I7G5Cc7|~-{rbx`4ioQ2aBGsOZ$!O8K{a}JAhUZz2ALA0Hd-~7| zE>?#^$2GoLwm*0*Gxl(C^xTgzLNz%ATQ4gX)wtt;02@%S*IuDSzvX-Js}=PrFwPkm zL5hnofF|x7tWlk%qAUVrXXIQmj|aY0_XbAqb^@B&+PzK?t=5x6eutM=pDtyR+yhBq zdiLKU{>5WGc}7KnnI8FLa1?6I_KJ@j-&#UI&9dEJgjjor9-$bxevJuX!jOzC?Ip*J z*f!XdoLSlV%DFT2@Hq41_z4?!Eagjp0BPN>hvTkX@=aSZxsWPrOpxsNp{7D9GpZyP zSGT14nNuw(Hb82r{9qX4)IOIow+anbdzPSZ!|789TbvO`L6OhJ-KP9RtF6hHHsyvL zdxcuF`4IiP_ny;NjzIzzl9@%2pSx0%Lv4HhV%wm2mgRl)<>qFEm$H-Mur%)6#;Vtk zJ?p~_)j5sw{td&6jo|sIlE^@2l0&Jhtwp9J0+5Q?!@A~Rw&}zG4sn@mmj2;;{K736 z7>J}>yuDdXHgo}&C~_b;aBxx2M|p*1PRyb})dgY0mm_jH$_Z)Kov7OpkER$^f$3;P zZtIhZ-Zi&GQyvlfZI(rM>=dk|ZAUSJ9not&C%edT-WOg>-%j|yw3&d4U7C*16%uzu zR>3Hbq^P$&1C8PtXaRkLHNqGo3>oPnf@mwm|nu z;|U9XpK4k`qfr=s_Q{KkLR_KyPI6E)K$43)dqczGk6Vl?3)Tzogc}7sl*8zhBsjJ# zMKc-3qgK>F_Z4)OcZ3TeSmO$_Q0e@d_~ltcRoUP|6$#$;>C%OfFC4P$-j^E>U)(=j z-t%SM$R`9JqQ%XUDS9t!!O9==!=8}EhBL`ThQQ0fdHEi#ZtFjxgGK-75qv*ETZ?Zc zTGv~+te=J{GE0%kbW-yq3B*il*Qdb)YoehDFJuX|m-@x0BCGwn{1g zEC5S|1Te(dS(h^RJdZJBK5~~Y@?%@$V$-rQawySJz66qC>+9Gw5ecd1*DNInIA{K; zeXz?sqB5P`VodQ=Kc^-slusEW8y$9T=6Gzn4p##-mP*v~ca zA&iB9Cr@6|%-k+%IK6v`lK5!lZDRFAC_^0ro9~jIbx9D(=1jsG6$n6tH@0nH`w>1SUg(;kOqYV5za3Jt$ziW` z|6IznANz%APhn9KpEb%`AhgYvDAw(G@u0Ss(OV{UJF$*>Q?U4*DQ-A{#1|`auqRlPc|FSr;19=g3OG79#U={*3%GDF!o&11ucs%XPU6--7 zMtum@DA}Dr(L7UVfc$eoG-rK->u!QB0n}|t;i+>^9&%w^g9^x*3*D+#w7hwaHoJO536h)!DY1h zwp`qdb(kHZ^4gbd>=V)96>KvJij*o z@s1`iFo3`Qi*=X>99vX;lNVo4Gn7NllS*eVI4E=odtMDUU|j=L#{!Cf+?x&!P1WsE z_k%Ap{wO%|y@4s`u07@|4SCIE4ohl0ZE1!yS z(Fp92v5&9W*g?-2=!~P~GmH&?&HfNJertH}`bCkjv4!VIu=|Gm5?`BY(PflOHNb|7 z^d!mQb0ETsAGv|T>qU)D#GMd-#!{%qz^4@N3=sh=IAU!jUbvJH3)RV?ZaL@pylXQw;i#9xj@=0Ht~%UszWm-Pf*hj&>8RIf$9@WcSS71@hf_=-w~&T6Ew6nX41P zVkr+yM}uYG=TfR$zggkW7xqLx+|VglNyq|8wTpWFX$BL@%09)t)78>)&8N;;GlMcXP*Aq#YBsI> zpl@VW%w!R-=p25WTXCd#tnahu(-brKW-1Q{xGWD8VicY5e|uEImDa#c!@a=(-3bx&L+711kT@bNtH%0SFy;VEz%;LRiQT>R=T2}W0xexj_HM3LN zNS^3hhjpZSfkGiN^9QP>djX{Ngz=u43_t>vI;G%Lex1p%R9ntuU`MzZAK@~2RfUW| z{-c5&zSK>8SVyvR>!t~^-o!j?pN1?MvPd0GYSMwO7If}TZ*XDt^yvQ~k{?zNgQ$(i z?K%Y%o{%~#AZWAC;$Z%Zw@sL^qRE3FP_I)32#-J_~VQD9`T4wu2eTILw-FW&cR-^l_6F65o1DEq2A>L1tXJs~|N@Yl4p z=CDK(v20F#z5w~BR+Ic$+<4P2zq|=W{gC{_lTW^x(cjmL5XknHiJg8OGmF2Ut{*!o z${ptZU+sZ>A7R82vcezKg^rSz%jlfKO5)BO`ff0Iv6^Wch9-1$b67!#6D+3rl^a2~ z$-y+k)Fy$m`;9w5c`P;+(j8g(5QN|Fu#F11r3AK`n!5U%Ktmo}$FWl^W<`%ZL5FV$ z3X~)i>iDD_TO+1s2100#f?hN1iD>D-d)NIh%=M@%#G{skzS^SWE1lawMnEX@!KBkgW6X z>z*_k7rH*tDnaw$Z&NnG)^8+O@$iibmMPJ#SYht`W+VP-P^wuH(Wic91^=V&>1^#A)1IK)mn&U-EgtwyYu77dL!M(}^4Y!+CQ8k$SEi z$F#DRqFitn<2tkY-(xlACyVF&z6Q#)tgS6So!hcA+}4_k7e2m=iay_x9sqXu>?U-S zAkS|~Ie*o-^xO^#YO|e|&Y*7omY|jNmp6sPN@h#@pO>yn+)PP+D#x)epT4aFU6GuW-<-DP zEYFUv7{|1}`Y*T~ID-o0(XT+8il$UAnW!*4714nI!{_OUC{$7?z}PCN5oM4dtEK70ThQV`6c>Yh9m2&;3H(S}+EoB8CwZ zEfJzG@Idr5HKE;PwH9q3Uh|UL#;8W`(v&QPfdoD#^h9)7rcM*9xT$qelWhPEdm5WM zt2d}NejgT#UD*u$htg8nL48uMcA6t9mR=7XxN*UDn*|_Ol%gfeodB z9FYU6@uzJ-hj_mP_WHoW!~>Vj#EE-%%B#G2<{-SoK+|p28pC^%8PI(f^;N;mQTBU5 zw5s}KqvJH>iUehiprI+wYI;B391`3U)Wg&4^&auTi(uB}>aqG3#ROL=6wKGY0&_9SUrEJRo08J2NI=8;Ul0~RVZg!2sL z4?kI+D__%uqwKD@a!^~r%p7lf1m7zQo^gID~!_$0l;ZI(sQbK@kQ zVi~B5EAp^xnM9;L%)zSl(^ zqE^p|6Yx7{9MF@mSobP%OMYTv>I$1ax&wuGmilP$f zw>^8kNj$Q{Isha)pJr~B&*T*O8*F^8e(xf8*Z4m6_m3-u<|Y0Inj1=p$L}ZDvDqck zU_z+>^T?b2r(ktHPyD;qkh52-l`IRjNU`HR9*YF3{%W#fij|3;v8!#aPfH4NQvU)v z0wG_*zWjNEB8#{@+)iA+x|erLXYNFWb-b_{n#|ebR{k4qD6oSoEHpghgbjn?to6fR zSSKh(FJq7?lCX033rnco2H~YMWm|+}lMVj}tA|i+Db}oWzD5hOA16a(26Bb)!jfC( zFdJ7V_uw3>k4e0Tz!KfJrFrB7fdwJw=8tamFZ}X**~8d>D;ooUjWsukbxgV)M--`) zAAaGC>)>pXZgzP(|6&UwsjVH?#y}puHl;(~VH>)Z8ZrH!P?Jnbx)}Akho`ONIVu!e@2J<32u3kEq8p(5AyP{i)y(kGNZYdmFRL} zlbhnKmb+(E&nj@%>Hp(!&8Cy}xSm#gI)3D9zp=eEV%D=fDLEYwe*-;~xai(vD9gaK zyS~Fh3xY$}7`PI0Qt$dNn*v|`gyE&|Dok%5rpVQOaEcq@b0Z=;`Eyi#C-#UoL5Ti~ zV{Cl*88{dGZ!`EdLE&@Nph4!3H&%k4vj5}aK5i=N!gmW|go^0EmT za|#(BS92P_n?R@1gm!S7QT1~XFXgz^l+BIQp^&II@m8X4P6K{Jnn75Pus*yMN(-?n zCiRBfg^9SttPQ%0Z_Tk0$40yvtauvMd!Oylu5lCVMaj^$hf`F+%WilOW%+y{5AXi_W^yd)I25khl~CQ%`5v4l{;1T8rQ`-^%f}xPlkjXh2+K|W z$gD(vdrd`sWQ?lZYy=kU)&;%_LG5szwzo>r&E^V1bhw7aRQi9I6Wx zW;@q=KvRA^P4PPu7w7=pvisI@YqzC0j~|B7O>@nU7WOeYOrcwR@7899EiRQ=edoj! zv2KGUjgc4ytZvoa$$VgetUBIw0pXL+X_0mb2+P}FrrfeBdcR4@elS;~qn*%!sO%Tz z+wPYdG2s{l(#5s(&!X!`7F0q!@jZGiLb|CNLnq#ZWjU;i8~ikP@9{+wH$SU8yR7+k zKMbEd)FIkdt?H-#Y3fl?{_7})Vj6Q#o9QK?Be%6oVpHz3iiDw`ggZ*Q9^&pv2n zX$D<6JhUv>84vyVbiQskScQ66b4fZU+oHzL_Jg0vxy#_J{!#TmCC+PN=+Si{mNzOXONE-M6Cz&?pislZP-fw=e7Z#C!h_3AaVw&L||N; zh`U}v{qUzS@hb;m0^fNTruY1T%)6jo1Y97$=WMOmKVLQ=H%^T`CcQ!|MaENw9`QFt zg;nK9L(JqbNG}3Zz}dIm73`*Wv%s&YghN0rWG#R#hb@HH+b8UMcV4zjPWG%eybC4YQ;qcN#{jTYD5-m8h$9{!SlLde}DF8WLA zk;(dOhDIg_B`C28@?%EUePDWb;62Eu|Bce$KMqwE=hKJkaK(UlqwQe;*cfj!54&@^ z?Sgcel+_)lTUKKeOS>9?QGT9xeEei4Qzq{D;_Z45P==7zu{9Kf&$BIP0u!ud+Hwy0 z>HY6qb#y9fM#8O*4J8$0m7DLw1dUR1?cGZ56&w;#5sTH(dX*+JTv>t@oR9l({E@UE5I7K#`7Bs|s zaH>gLn3Izyj@&L~71hk&TaI1S-d5XLHNXJE3tom!KKj#5 znn3oqbAx0hW}&F`T1{oBwSEJRiG^PRU40Fz%H?EXQ1!UoY`p?~(aQE}g$eXkxI1cC zg|VTz_?v3I;TWN|)l_%la+#S^`uDsoUHPfkLWMOA zaD6^PP9ui*3i2PA%R>rmPbY4BuJKTjv14 zGgN>77nhVTeds&@b^aj$R5)x+r+3ZA`~+@ZaNTZqt&l42(suugOm%uV8kEI z?E4-6A7Y9JlTYP%%b}qC0m_2dmV7(NK5X{HdXlnnQP2>FwTe%u|C>_Xp_}_ls~SF` z%tn%YVTRXWYw+%WPaVBbz}nl%abZ7RNIs<`#eit4;l0Le8+wjqx&K&>sZmQv%aH88 zSF`HkVnm&Q_{zCDboJHKFRhfQM;Ek*Wuz31@F-ZS;Wh{N{T&(I}K6}w^ze4SaXl8`35e&FQ8(^-<`Q%(a9{x?ScI(^S zZxj_XE2*B#`k1eT(H;lKgLr%6L--+1B2Aw{vMO8d5M2LsRHnY$p`b)~uxJR!pQ4VM z-@S}$r`X8vdm}? zadP{a_-wRw2TcZ0DNm6uRve4tFic2p&?p>?+lD^_R}M3lQQ9lj{|>eTBE(Mi z!`o0~$#`Bx7_fTCqvE-PBHGJnXkMOtwN__LvRSBSYVB2T99p`NhEEoE7%ug`oV&3o z;#Aq@!?vK!z%T5hZ-e!+jOYgFe?E^s{_RcFI;fztF%{DGSpo){>k^nn$$Ui5MuSlWswaLCUxv*~%Fd9ox)or3Sd`0b_=deB3L@49p=YKqdx*DiaqL-LdB6RYMiIeI|;oM4E({W^yT zCNF~IBBnq_*`lX0JM2OZ=}Mx1;qc)eGM44Z7V1_>2@a$wIXL!W19mZ$E-9Cj@fa(} z2<8BMsWAM)be7y$vH;j=68akO@Jv$1GAHz@V(t6bmiEqmDkq1?skJhq53pSvm^_V0 zP2@@(CJ?LixsAG@8hO%hWr-S`L*EDHkz{SjP^tF@5k1B-15eKvmS>#n(J^qG_|Min zA|gk4hg}d(pHo8et=)LjI?8GTg?uNyy;|D7^vhn55#B_5V^(2*lOvemqK#OIuzmYW zg?M{2z+yWA>s}|FE(ml1dowPgVSfWygHpEvpqRlFy%vsHH)M{D8C8jg`izj8oAs=o z0#&+=ES=Ccu$=%FWSt5{+8kr|REQ?X+#||*9V+}%Omy=(f7Ehe$;WIwAV0LHjks^k zej;4T)gDb?&c{NXw$On)ScR69T%qh(KuUDt?O+Ws&28YrkUlheD0S?q$!_#f6Fk;j z?Nf*+#xKQ654*>dlbGBxD!YGVpDz@J0soyFj*u~F-q8^?B)K1V{6x__DklalYHU9+ zX6?ncTYp~4P%S-f-DBvxH!F+j&zq-~(pT#b~p^Xk#WI47K1ON**L=B!W=UP@4T5-F*scY7FuY`FqvU+^+d@F1MEv zyHG1kYNmeUncgdrc{j#Xy~D!;uVYM4l^STSi@Yae4S63WhE%T2;Z^rk?c@h)@c6KU zfCSjjj33Ahe48z39B?6<+@6mOTrni8B-HqqAD>V^Ugzr@$>;6Y;{zV@#{>*JHt%coW) zGU#6lHdUX-k`+#|WZd@%ja}tAVHXln;sFbO$v|0x@+F^RLCEyw1?{xcqz=VHr5eYQ zqkZBKc5nM@;@xcQ$2<#zk)w;f7JKfFx9G&_)lgJ2(Foow<*^w0nfnX*&Um-@5;9WZ za~f)Xb?U+gCwTyz=i8kqNZ)w*w6k61lnj#9Nc66~46`{Oc6|y<5#fI=7E<6ifHASk zw&?zBc$QHgGlK5b&iDIpGR4Fqqfe2S>hjhJwnmGm&#eVgm9_AI$C$uJd7#o0NOJMm z?7MxbD}M}6Y-hdNxR;Kum?K*bCa%cOmn_S#7UBRfC}pO?r{_I0)+aXDu+KnD$dv(+ zrJ{}~uc8E(kOT67-Aj<5jNt1Yg`l`|wI&zv;@(h;Db4wC%Gc4u4H9zW)O=(WBw#Jj z1nIMR`5E$>St>#Qo7tec0HEzXM%y)Q(r@FZLc=c)!}^P9upmwjcL!^^X<@y&U?+K8 z7(^P+<1%Jy;#Vl+KRYje6-)i)u=ZMf_gFI=$TvT9F0-n5a&d%eU1S2)w?S=t&-2_a zv^M6g*q*=rc8vU%RYlg6MJeR`{902ZeV2`&O-3;2a z^J`nOP!KI$NG1j2FBTWGQ>6607&gIUrRlY(g@dSv8AI0IrY#F^OqH&;Omw?9-n6a? z_Xz3$+E8rJm;Q38cpNdU^Sc1NZVZ^lnbuP&OjcPiM|R885Jpr*D2<=hTqvSNZS z6a{t|^Qf)jU2KKsS96S9(hCKu>y%)PHi=lRiXMtI3Us&j;Zke4*f4g9asaHe?!G>U z1`XGllLc?&*5L}riM@0A@x2q`cYa_u0b+zKe-*q5ih?b9#N@vjM-DnXg%wT<<3*iw z`CdKLG0C{`sB0()3n)sgaj=%JzYnx+bcw-|k`s@9>Vo&xZt`tvePe(dx(2h&VSrT< zFa;2z3Q-Z|jp@w^YVPI1eeiND zq;v{RF4tv(4ARM@YTVL~)cykiWwrDVqzT^X+wY9O%1X~n2kZS-US8P?-ofo4r#?{- z+f4jHx8xDeGIkV^hB4+RVSRG`Zycrp@hg7v$(T>su^52)5~-v=FpM&lWGzp$@)-|O zNNrj0MA#tS9(n$By+-<&!*2RSwyYQ--?kA7e*9`-65A8q!+&)wC4|bawB8!`u3-;< zH2F7R+gQDxd+4k8^T#?V2PonBXh>YG7?Y9ZBrG1ANpd5xH9TVv^ z&FTk$_FL0ZxI!gWexh*e6$g^53Y{X}`Of;CC%q6}(r=OgMMa`BSQsPK)6e&(B0`y$ zQfoNijx?7?&;ACyLkWo8^GJL7Io>KCZTB2BJW??yF_f7GOqxUi=17+1sgh*g<@~yt z2)mb#PrawZklFzS=Y8z1#ggAwxFNr1{761PfcbdCg{2D;xhocrZmI)zTYGqX6VunOLn#YjU@2A9APyqX!_Fqx(uvxL3n zCiH7wYc0?S@3=Wx^QdD{u*qmE`YSK-CtLwdj2$t2$Asm1bgS~;|7Vcs+xDs7jh{l> z0zW*zXnSclo%0SeOC|sx#6a=Uk|~3dycgETATvsdadMXT@%6^UdG$K0t6g%JJEw_3X!w?Go-E9(Y35cTK0`iang8NZd&S6n zmt?8!6F>5O?f>3&l4)vgF7TW~%ip&J_K(>)*z$F*$1P4m%#C749J8s1zWsGpvn*as zqV2POxSvNL{5_zjPLQ(v0?oL63{&ZQa z@e|hfCbD5XbW~XNP-~mP`R77Bmo+`%018%zO36|$3?S!2Ga!0Bw9TPDWcyq|zNc?@ zR=qJmNd5YYKYHIpD#6&JorSpt;czP}TnCUk|C{`4(ZabD3qn86qaEJLIeY3?;Lm&# zzjTQ*&3n>W!T(FDfsV*Jp~R5SGgOM%f1;gkshz2~I40DqYp70AaLSYHy<{NFT!_XU zUNEY9*gOS(@+e=a+1_;ffW3$Bv+3AeX{5~$@QrY+z=vS$u#)RMH%QG5?6y8ZuEa<* zs-qQ(*87@z*koW175d%%Bu9+W zjGbRD84;5Y!AsUUL#Zp+E zad+**)8&eA`)SwNJYzMmF@A;o%0J99Bv>?w;nv1|W`nqx9^$_ukoo?yfFZ$Yr6z(| z-U)5<&Fc&+uMbgwyg!~BDrrF0^S)R)U0KapZ@bv1qMcn-oQDRFC|Ru&K?;`i_9MhLRt$Hc`N=EId2tnUiT7}s6tt0RHVNn{ZC-~ z+65hqMg8MVZ|;rjlL0jJoQR(SB3E<8km(M;3$Eyi4R0gB0^U0LqrD3RTupZaXt^W@ zCf#r#pC|5)==;z%ugq*Otq*%Z;&ved*pE-09h@9eFy!-aDd#(=Og38DS(gh7<5;Rx zA`iZyO*(XP_c)HfI>Eo_aW62{m@1HZ<#yrhgD>(f40N{Q*NVcbE zXylgIIfOnUuiQK6`@6s6wW@_AXi^D{%s6ZJDs_UXRbC!&JwD#eB$lWUyR#o1irFw1MT%scz?SyfOA5~K**+~02akVRz1?ed z4ZpsHXP%toiCwIJzLv3-R(ij=<531xm%IAGy743_9Xe}^vG*HpvO|Wn65P|sX;L`;jJZ4 zCOwFJ8>0fRh=;HnsQxK8mN2O3k(VAtV~JF#8M2R)^>`Orn6{GSm%yqr6l~$*XL9IV zSTgaRxtq~7Gm(AMriT}Kq zW9GuL-flp|H3fN7*Ktj4YsrFlt5}DTWgQhoI*at?Q%5|VVATi~Z#ABARWr;KfI(tI z=uMmb>9_L>zP@KSu8DV%ZX4qdYrayzYmG0rCnoL9$H+{9r^d6VeN(wVq3Iv2TymB56QfrExAYX%Dg*@ zY0|MmA`9A1gLYA{`X4>ObN8AN(9eHK95&r?A2Os^CXVk=N!=Y~ZAyp&A$3>2JC*6l z=*__GU{^Q%Niekry|sufLQp8pNNHoEAyXE|25a0nYeXz&L}#t3Jl=el7`<9&CbvCD+2stB1+&hZ0YBpaJXz zu(K= z=CSGeUMf>pOle|#kkwuC`xAzxI_HtMvR7}M-vLb9J=TL>9%6r%X--x=h3c+6vz(1- zHdu0bt!0rVu7y`-PO@|A>%Z}k|Bwkn48!W8rx;~#pc1zNXlXJb%=(B+H{aykusb{y zH(vo^aha9xvb)0~qES$SJ>f2YKf=FZ;TcO5`*sH(aBQt&>3U3#$wa-W7#946qk5#f z*1M@SM>Sy}hEikLVKbaWUT83`%#L@!L6fNWLOqeW4AIrH+&vwP%=F#xM!_anmZ5Ue zVp|DQ6DDcPRp`{I0cftw_a#P=O|IGSiz?b0OBHN$Hm07(XQfC^IJb#H)9u*Y? zEXA2grE<=S7|1r+vTuHqF#qYgMZ*|m1CV#SAr^>0cpJgM?&Cw)uSvu${6qCm0*ny{ z7KM<`{Xc`tLP$-)_jfC1R+rx?+I@%;* zmsHX`?^Y4t>s80g0$E_uw7iTrLhmzQ0>zT#82S);*obvv0*WCgW7jSWv+~G956Gj& zHmdSu+ZLws*lU)o8NzIEF$!m%yy2di0uSqop^8Pjh2-z&M|v{hA?HA{hLi15mmyu# zo*wTpZ$UlSuI$E-I<*5XS!7ZOJb&c=$KlE-gKF>tIuLneoeUiKP$RJp4jn{XrpZW4 zxMZ|b#D+XF+db;UwG|=XXHMULqWI-PX^k-wA0HnBax-BOcZOF^U;|BHn{VfAB^blYN{Fzo+^I)gK0a!dAVug7l-=DB6Cfz{^dy=;1-MK9Q|TCL|; z@-N#0^$&fu0pB%kgFbRsdD-)A8KysJU$Dm!Q;42i?3h1W3UQ zSPZ$!3Wpv(j#BU3#IAJv-9|oCUY=TY-o1j)6`JQ}d2$T^hX<`<&BlMJ$2AxQkk58y z6S=+!qV!0uqUh0ff^oMV_UZ$~Murnz0%U@vHiMwr>HMo3qf|(UAn76Jq^BS-5W3-hWO01!0 zXzR-&4*XyYt+_!ofB!WV2vA%mVAc7t5QmqsK&pJ|X9;@>g^hARLh1)+&sxjH8}g!P z!3Z)CLvnEDUVr4p$$X`+HW})utAMVMh$6+JzJY-762#b)C^gd5}c7#Cd58HSmrfD-RCPtspp=A|fZcN;uA=DCAZ10`vajBlXoDYkuKz#N^+u0r$%cY4s?H^3vmCfP zxeV*Qe{CjKnBvKAvlDedc746b|VydtTm~i-g-+aZS zf7>yhDe&OUShIU*T=zO*ttkYm;BOTawBaY4it+}zw9YGB882nJz0W){_i*WaZ|)&c zYX#&rtGf0#@5nd0>N-MxGwb@iRSiSN$ppiiV5nhCa)~$)6j4w$=+E{P23T0C?MDSe zQLmRa=ALazvLl!10T3rF5vl3J=QvNkaj72!*kIF#qOenL!tILC{1n2>Y2HmKRHrKuz*5SBDUNE<4b4$ z*Tkfpl!kzUQ=!5A$I)7)*@=_k7XUP>O@oVWHS274&9=+wp4QAmA@ZesLkpd$T41LOe{xO4g& z&LE`DEW}6k_}0Ge0C@!FA%?iFf7Ah)L|-bzxxju!xnwOVApe;AV0dOkFEX}r?7DW# zsO2>G0?pZ~J&J755!1v3n?^CHoPnjhl}Mjw?UoL{nTNgPXlI}>nW^_T`e9{=PP1;o zZ_Qwzpfx}25I+bi`v!u**_mGRCiDyPCe!}seB#>D!miMghteX-XW|G)$Rj34FyI~k32$L012+b`p|!7h{PPF6qGMMtp1Z_ zDuRIwRn4m)CQ+&r7A?(nERorWuU^(YB3ulgJ!rsxJMvlp+jq@S2w|+xSrf?w}e4F1vR4NXh1;5 z5k`kC2wET32i7UHc4PY)Yx5fnYxpIVJE7Q{0f+#UT`Xx zD02ygOL88pPPUDy+L?VY><@^baqLGcE3b+MctFPX9pbtdNRAC{SEsLp?j%iX=m?E# z3S2t5_Tp!clsQBS+VfVzt)vwddO>k<-Wwv;)lZk1mRXyyzU772n zB@3$KHIJ#s^Pl259~FBnhuGd27ptDx;4Jo!EN(eds7;xR>muffXSw#kh`Tn<^`GLYhfy8 zF-PvsUIcMs)K5MnXc7h=GgX&T551BP_juKg9Zp9ZRs}#;qRfpD4&Y}|1&KG8m#KR| z1Ley-?b>ZML0-yfuJ{0r>4azW;H&}RJ2sWtkKid;9*N(e9;t45e&ZF=fq zP;Eikdr0?h*{aAd_zlxjjWa{cg2Rv8-N|*M)EYzT0+OZbnwu7LBR5!z2G%Ryp?XPw z7#x{__`H&wT;J6{0U7R4S8w+`uadsj=+4W?$hfez$s4@O{_7Ec?FzrX=|V>wLhJbW z_XgiLBr~b8w@tlFBiKr;Uu&4TZ{;Wo>LqFv4oKw}i zx+a=5-_)}){yp#v$6UoSjR}8Ig{o6^Rh$(%4EK(^9=+R5`tr;tEp4|UN|mo6_qQ)2 zw2mntX^AsTI`p4k*QMHj=LE|iI$ymuPd(K@T4Jxo;6IaooaIy2G8se@h<#OiGH|Ia z-}(Q4Dir&{-L;p;RN=(VL)z6`x+pb9 z#&g3WX;QzVVya6>ZMo#&|F+L*<7HiA#8Rq@>n0w#;EBx5A8|O__Umz?z>}YRuPGlM z+$)>maW3-e=;sJzW>oA#u+6KBQ*o);oHJH0!dFImZ(UxO*9pjZ4=%Of1*2D2Zj*A_txVy9Px4ipX4KqUcnOh$uaCVjc zJV_`?fbUW*aW6&WcYo+bpzk-)Hs{{uhysaMdgcBzxD|vHaIDHGLWQEeIDIm=M~`s( zU*XQ;IaK|ktTZc%;O=Mqml+Nn91uf3QmLAZ?zOHux2{;4=B5XbHOYe%g*sQ#N7Wtt zO@b+UpAXHx`Sz2+$A0hS9vP(`LYwX^E8?_@dB0oR#a|l+pB`&m%eJ`t4P|2Y(WAV4^I3XES@7jD#6RAKcSa`rB7n1;zcTdyNGjeIOCD8Ky>#GZfA!9M%VTG^|9-|aW@a-Oy>R+Hpz&>B{|(tub`!(F_J&Hr z(ey6f+CU{C_|JO5BqHW`GG@99d6C3a_|r+C6M1oC9=*+tBuP*%A^h=iZ*0swZVm^7 z@}-X&zbzFa;El zUT9b!AIzF>rX-W>)}Qipq7ST2@_m1T|6KpPU#dvK=eZNI|12i*U`cnG1@wtSWm3hh zCip3RVX5vWD{e72QmdQu1|H{jfmVX%y825u?%H>{&<#c_5|nNf`f>mbYSlzKt4L&X z$3x20oV%p;39s3)$(<=aw^3p~#T+xud80rfFWhz33R4f?c<$Y=P!dU=bVJGz?zKXLYEz;;+32ldQSyxt#fc4)x*TANP|>PEnB6WWhFT8$hxKvUx!-q1WjFgH_~V3lzi<*u)LCzA&g?AKu102=J%GU9^9`@0yHiQ9GGtDzAB8VZ5)_Dj<83m z(bq+S^i8qR-H%6n5TkZOvR^+W`?BrAEA}o;iHJ;7fS=3oHm>Y%HYEMeB&HcywR(EK znk>}uIPBbx^(urxvFv}sZlsF;8_x=%n5UnnD21cXP4@7CFrlJg8vEdp{Kq#ScdPV& z4siN|T_i>&<5S_w&prKp2s@{r4OC7qVn|*8wZp47 z8a&Y_*@0XAdh=`L=clK?b;en=xYDv{kjR!@r7y(qRoKT6zesQZr-sIOk7OLt2;WOG zj7=5X{l~8`lh7o)L){?9DPZPv@8{kw70+@L(SP5R0|P;>)_TnC(zXCpkE4dcIlU5n zDM7L0O3PYH*+MP{<{I{rv(}TXr)aFtAjl?Ek&y$zg(!z0o7ROEnW zh+DkNv|=-cUzir5mH@*Wf|iVbb&^0m3vDeg)H}YzvtUuIZvE}0iU}T}B}nY+rWjK` zBmKf6K))W#t-&ecd&W3g7lQHS!Q%A`R_Xmr8HPI{`FtGMqq0*3hQn2X7a$a>sd=Pn zmvh@uxtfgBI`^oiAIYuBOZF&t{Fz0L?he_^l%7nPiC^|2bJie+mBT{;C<4v1c(WM< z`b|LofccR}C(Ry9d~@A!7G;Rfx2iy__xdgXp>2AzZRE-1(yk6zX7^;d>oN`pvMlvn zEPd$(qj@q$ic5cye(|F-@=!)32~>I3;CYH3OdlCHwQ>?^}p zVlvXH$HnQ;SW&UCV$T=Ab0mh1yFP+z{Di--5;Q@un6ON#bW2(sAMcLoB*NW$mmA!3 zuDMan6j|BqVfstlQkmgvScwf1U)2V?oNI5d~J^n=I9#_u7O0vQ~n| z+jCf6#M(_gAjiq43<1KmM8bZz_0k4gM|#g~tW!VTGJmj9D|m9Z>@cK=75(XmT&!Er zTE%;>PuJ$AW>E)^rM#C&K)!PERK6W>UdQ(=p98U~W14IFAlR$HUQx#{A7Fc~9DI^Q z0dF-wOi-PxQw-}}6%cO=d%cXK-Tx_*^r|LJnDjUA6TUH68NTL6wkjiRCsVfGP&Ho0CaC#cnwSG0gni%^>?GzUYc3jY3)tA%m1G*Hr4!1MwQWm#h& zKcJJOfu{dHx)D(jVjDKtiK(``HAKUS?pJ{0!`L)8FCH6zH|a)DrIdWYto`g0PsMq7 zTG<1>>G9-KoVbM6+~WK~-@KVc17jifF9t|uH-n2@>oDD_2fHaKhC1dvE=8yQJByR1 zE$&8on#`H+sGJ33DE4HW`rEV&@GS19X>*m5H!Tbxk*(5ksyRn~H~>jhtNO`2%)*Tc zv(BrS!o}^H|6HkaRH}ExPVks`xR=qi)Hr*9(Ki4is!y|ONV@Vk^l4A7UHfka2e&BW zOFFZs7`{4-70eZ0~aya?t>Epi@z`~JmuwDhW3}_cfjV6YIdk8*b4_k}=EQwV5mHR-6 zsr_k0han~!gkMzsey-|ACB=_jsYdl$Y?aZT{|;qOK822jMvd%y*9b5}{EWQOp2DSd zn*Z-g!_6cbO5K*mgqaYC5CjEccc_XB*nyMn9MV>EE5*tj+Y!Ty(xQ=Wa&MH{lQe)}qJQCc)ahx(BD(_;2w@q#9$|;R@rOGYAg_9#va{+c;RIr0U;bRANUW&2rjeF>?qewN;u_QIB?t(`eNzZmoe0gH zTcOIKJjd~x?g1-KAXujFaEF~=4$Vs)G0$V`D<;W-3Tk$8=A|Bms&82fzMK7t?9FRN z=x*O-Ap$FZ#`P@k@MWazTur(<=*7j-8JBqSsy9SwPQ+@22y?4kq~Pw5;=;1*-NTlg zz?aTy{A76Q_%za~;>3&i25M2X+;_izVa^L|gko*F_kjJw)rmDy!6fZGSP4W~7lf>B_GL3HmCn!I%Ow{j>z@3^ zanS-oY>^k3wON>mz)nALq(}N^3rSXeF+lLrlQ}_5~7hm+7 zp$R?9c}>(}Hw{(`=i223T{TzaR(q#Il@y6IR9#_mRWFxR)f4&oX=(FS_nJS)ark*RwpK_;{;en%#7M&$w7sBcQe{>}?z@dK?7#kfFF?C=pJ$cl zO#fM?m?Ag(SF2EQo~0ezB-f{vYiSgstffPyom{#!(YhFrUQAj%uh*Ugp@4bqE(h}9 z>z#u$iPh?PO~j%AeWwCYQ}GJEPR7c9CHg8(virG7=h+|Am0v+;S$_h7z{JQAm+mXx zuG^9ZzLTa190L+;j*S^d8kI0PmX`;;N80WWI4(zwP4!YuX8c=braRy=GRLte+;{d@Xj;FzXwB3jIuK7>;VnG~_ zg=iq*II!AYyIIF-mq2@UNnFJb)Ov*IO4N5m<+v7$&s97&-}nZdkP^az-5m!r86PGn zEEC9M-ab;Rm|b_JQpRH)vNAM$?Q+IL)!nYN!_QSzr=7L4<1AVND;fx+EWce)C%^Lb zE?0QK%rqs|$EJKxrufVR6ze*G8HC+7HstMD*S?jYO8A{pU+4FhuU65Qg#IcuO_>r> zq3?DHdbJ-^MrrFVtCbOt_l8fOVEqS@+H+`{aU2CfaPBKz25w`3t#7-%;NfH~Kjv-} zZt*s0m$pGM#~fVan%+{rhx>+-pC8O&0I8`eoV)N8Seu-`NWGYr>KJs91B|&%r$Ah+DouSCTW8p-(^)OIk0HR zzck2~)A3)JD8{X0%e=*b(I--#){^)O)sJSKzAEX*4BZl084|j=V>%%Bc<)_uO*GYA zj&aSq2vxtK#b>3(f{dV!B0eG9mjz@)+-ey zFNaLJ?z1%T$HcC&#qDh1!#o=qEb&@sGABM7i%Br}VYE*SI!J{cX^;}kNZeq0!KAth zcJGOWR4!KL1lr=R8LDem{Ts+k=7 zXA@o}+2tuim5sNB39-P0;6!9AY~YQn74Jq_;ptQ=#l1)52c;wEDHSj9fa$gLRwfMm zfiu=BvoN1IMrYee0uURqA1~;%Q`DPd?W${!OuR3(il<;i%Eb^^zczW}-tJHJTuV9S zrtaXcB&*utr*iUmnjxHk&*nwn`k3-YaCWV_K-<6upMJ}njAd?Nr*v-azEfP7``c*z zitqV%>{=y~%rrigN*%T+35Cp9ji(y3Po|u=Q!f`s3{qv^#^JBg2jRPr7|~~r@hyAo z3{6-raR_tofO@cj02J5bRAUw6eVCBSCsL*~);pP{N}9EO#e(+ldDH}11r9L@!IBY< zaAsJYyZX|XQ{L8Yp6D0jLnR3YS}}<3nJ+^ep|CGFnOKz?&*?I^0!pxBKj`)g=0_QB zv81YbH;PFv*W|f0BT8Q)l{fqmYDhL#+TnOLJssnnr#3quBzT0~7-an`B20KULj^Iz z#zk0+=1#Xk!Hi<8LmWNs6v9J3N9|PksW~+pV{+C5jAut|t5A#Z8&V^~Hn#KW-+b*x z4y_C`C#Csl%pF_^c-~t}nhvd{p-V7~k$s+LYmlCU9uu(IWEg##{-_5%F_%4}8z!An zaQ_jhlJ)J9RFS0B9Ybh1F(j<@O;{@cp#r-r#j-RtXcQV)mX62pv{1h8`*S8E`o@X` zExp=sO;$xcN4&Mly6Qo5inV?B2WMMd%!W}oOsof-E`1JC6m*u5B6_AMxD*tPnc2r3 zAc^TkxwHV%HrB10j{Am3vZyDmaidY0<6^c~Fe$oYAsC?73r;KKd7|k1`EXQop2s8t zgOEN9rvTgrl14Byxs=AYa7Cka=`sV~xXUm4oz3=uhwN1RLEA7jAPNzhtN76*pv11@ z_t!aWDV!vc)08EfAuAo|&_vV-kCh{@HPtjNHVfl4rxh@Rcs`?#jaYeXy0lWah|~PD zazq^q;>mhb6y6H|Myv$Vj5(xvSz|IRhyo<$_nXl@mcvH||iV!V2do&(vO4BsZSM~|38gJ1$M}|XE43*h%lYOXQ2W?pE z3x2Qv){oE;4H=&2>@x{`49$m!$H5Qmn8PNlk7!~WQ8(FU&ld~B(^v8?NLM2YqO7>e5jfI9(rvG=Y2W_V&M2o-OhcXH@BZ=kH^Py#dke32Ydmr%Its(s4D5wRB}#RVF;4(oszl4h#HV zDvEx7t%B$DQ}qKls+fgKv3&|_R>HKBz=u$WYAHMCr9v_!?MjGFak2o_I6S7RD2Y+9 zZ()Or67B(8eJqKNA$p^@I*RStNSN5L(iWP#!;i_2&l;7rSiV&j*XP!r$t$C~I4FRU z*F@HH6`N^x@(8UlRhKo&dZCjUueh9woZG^m8{%f6Vo9#E33=(u;aZSu?~HFk+ngqd}Szlc&Kg{ zH-@u)#mrhA0PoGkEA|w|TQ7lM(f*2@I8pl;d(TLg(4@)A{A9S^vz9hQx zk?bP0SyS0|HYxHfD9Rq+T{G4>$G@rjk6;E=#1vOzhi^=7QeTAMRpPJeq0glWAMh%{ zJp8q@>a(WbRE&PO`Gv${)epm)K5SI9@ZUOiHZf`Qe>t<-$CdtQF`9Vgu9Ws z@jFz(nMa=YBzaW?gWLNb-fnWjjze{(GAdORe>s`N(qdYXO?Z;)WD;#wk$SLpcXQCi-&^k?#1zN z-bk{AL#A%HYdEI#(MUh{nr{L15`+Sw(mfwMt&{Tby<<-C25xK_E;SU*v9}W=LT&V) z#SuDjH!j|WV?vNC0vCU^m*R2zdoq>dT8k~dh;)8RAt=T-*}5FM=};Gt zcgsp8*yV{-oz~QR|HvvjNy!Q$@UVf2eo6}*j=y8b575w?IbEFMr}WIU%f z+!5>+hR2(nFD{kaQ=?2e(+;~6(vNgYC!qrMI=u8hB4<<6+B!~y;mO`_pZd)OpTBoR zHoP4JUp}?}*t)mK9DF-z(HZ19hVUM`<6|B%JEQrda-txU6qlO?$XekP5=6`r46D2cOf|82?is^IfI?rg&IYrFyM zuk@35)Ylrd|A_W$O}4s32{`e{(#Qsf_*!V*lU^0fsvj?f>YE3a`V0E~VOF^NRWvoz zlPf9Y0MOE|*UXLHJrZxd%hn95F*0{_O+i>%xijWuA?^`NdSQ{ntIA8}9;zX~WX?t# znzcJV9FGZgduIq)crsNnxuf~~t1BCq4ULi_4MgiPrw5JNgeGp%l1Lhx*z=4l;E`p& zSLY<9rt{vXF!+JMQ{`+c6OD81;+)JFlQ>7qC5p^P)I_pJX+C2|nbs2Ow3G1-TJ;qR){?5uD&n2;Yu211)g7NVM}Vhk(2_otND!=EIiwU2`L^o`+%fQKJu!RS_(!u*i{7{K4+k$!HclQ{F}I|bgWejKRk*ezacUqR2zvCP2$(jz;Fq27K5x z0>-bAnCft!s;|bPJ;U>M<1_cOt~(y2Owa5HNyg;tH)^}E=xL3=VvsN8TrCdyNk0x06w7lhX(DQ z(FYh>olHp4!KSLsyEfJT-3z_Fqr4d%t0Xx8S@so_XY`jaMui-1U?1+&lf>+;_^j>) zBb(+Cxtn}0w%00<)Xt&K%$y3MJ2zh+*PmTi5?eU^OtJFQp^Bz0G$(1!EAm5Ubg{Xl z2`6Xu>tG&1*!-!!*?r*QDNBy)_(04sJhchoFaAOF(PZJ4um8uo-@eC(hB5>T=uvqn z?8n|pGGBDOj#m75o%l2SU%IKD?(;!Ryh37M{kBHaN|{6V7`MoWo8_8eRaI4O0|Wl^ z)5}ir3;62sLLYRPTLJp6D)7<`O#rIdDl8ImYE9@`6QR4d7d^j{X$ag}(qJ8&28>~qy z4_v8@I$l9tMJv^;gQfM3@{Xz$cGIB#D}jR~Um*m!Am&jyP%5Cx>p*(E(I>RrezWHD zKY~yc4GMV$@LlytROl|%N9sqW$fXv9A_mE`cE1-_{YF-17C4ME_QY|#X2t?Y!cp_v zT0dONe6HC=`^|9h#b&l3jgT?m*PWK572fwzyn=`soET4_60%9Lh7iWWWFh#xRBJn0 zv@78Ns%CHJAg;RR1F8Yget zT$n^GT;t%CGicL4Qa+sDiSqnb9wV!+PDDyd<|tl}*=I;4=JGE1+F9>G=7-vTOLdYy z{;!ud);6Q@=wC~ctV2olcf>sPxyg4Apl$sAA3S`~7v{bUXkl&{=d0Sf_tx-$%}>#) zQSInP^96ciD$W%70GGdAut*mjVt;GmHSD7mqVp~c%Jo=b5!CVHw&hadUzRN@Khg|p>rPSm!Rd;0H9fBj-N?P z{FJ<+NB#y8wQ!1bD@T7i;0#^1ULZrm@{XJO%8!l5~g+S#CTkSiQAQ}Y4dQ% zN9PZn!g4#`2VV%3vQPanwv-vLtz4Vi<+`+GVPr~2b+X>xhFs)p@3|#SCY4-kZ24Pg zC7(ZgoX5anMq2RY3bi$quxw-*+{7WgH@`-CleJ4^#4^f=%LFdH-aRWORj4n418L{# z_J*;S$)C*O2`qBE@f_igZ4;$qhD%yaYRot(X-gdI($V{I^D7TBe*C`c2U3F^|I1Rp z`UIfU*4oYZnwPW0N>^?njxSp+$t-5$$@kuU;tYL61a4oy+=I6_068`QWI1G+uqxwo zm@4;{e46uyXcvCw7esoyFKGE$@b+}JNet5qebc<=^^hH{lgh@K4Z*Q5ZOJfd%M#s$@hqtM4865Lt&slPY%F`9@$+&`nF8X)`d^ol5EGVG z=993Hshdgke&_7kl*fMk;NC|WpNo=q&xg-}r;ZAc1W`i6A>iTjbeMOY+T!kppw9sH z?ETG2`_Un{Dzuy$fAJyeO-9D@_|Y=f7E}k~J-8diGc4w))7rcmFe4!$(W1}W(h?y^ zH0jy-c2q^>Gvp$>NlW-IHmnYx4Y9|9+Q>Lr?QBmEO5wPdh^o)9kI9c9f{?kY*cM7DauS6aioEYG{&0x-&K5rWJ#67X|)cIdZ3jG}g*VWDx?N=KPY8S@^>w3xB*mCSd+~di2Afh%=dapA*7{|wZ%-0Qh z8stKNr0+#W_j|vSO6Po`a;TI5!M{$Kiga|6zJ@Dx-na1hVv2_T}@qEpJ?FOkJ--dw6nkV5pffZPS`0{(o(EaldM2 zmRQJ)3oz8*^(Z{uhE#PQACUq)c=U1igVfDT0cv)o!+&P3vdT=ZyZV|~_p=0H0`5o0 zB&nbACf%lgPLYTbnZOrE%JnD@LXX0v*G>7ya$2<@c88J?N?XkAe^j#I@GRc-l8cUl*T;A9i0tXoF#G z5oeTgyo;VDNApLoxA!zU{d8_N=OyNiFO8~MV-l4QAy>@v)dzvMA=_g0nEq}F>|WeT zXMtb;6gBNn+1)i&Oq=;>qpO+k7{==H$EG?8prFiu4F~P)m|V z#@{YMfBzr;R`F*EL|zDF>t(WQvfK3eu(NzaM@iF@#bCx;4*GBfo^rLQh25#EAKN6) zt_P{FEfr6Ux{==k+2#ISnf?2+Y9LHYCCYZf0!7wIQz+wS#No40?}q~-)!KxpENL&d zJ{A7LSWY41%V&#v-i@3B8pe1OvR@WFZyG8N4t=*U9aGtgt|*&iqd}Y3CB72;$?vI@ zCz!Cjjk#4)v2D01`AxZLaSOJi9S@fo#rf~f$XZ|&s4GpqR6MT=}kMYgr3JepJv8PQNG8P36; zJ9O(^6_Z)=0?st_?olvOR|93OMlei2m78){^il?1c|IS6Q;{@oHi&4*lsbaa1x9(2 z9$!Y1uE=4uO05OW#Hk}}41X0hvZAt9+0j;uABWlj^fB420CQx^i?m4{*Yhf?dq_9>8V24IC8NQ0S z91PqdjV!9Y1H}Vm!5u7;rQ}zIbIX*RS=U5#B9>=ieLj-bv>Ydwss9k&c#pujW za>Y44h~H?n9{uA$U$+AuP1KZ_5WVYIy0U-v^?r(UZSqC_QkMvd8gO=Og=An?4ss8{ zGTK!iPQMnIO0BHC&Hwkf?d2YO;8fqfm7VZVx$#CKnzSgT7j7#$xUH?9aM-yGL1z~m z>YRhTTJ8E)oBvXG0`xf{hISfoLHGT%77bMxI`(#rYTXZOCkLwa93^j*x%bc!rNYN6 z=xz9ov%0vjH_mw~f_UNYyC5E^Axto72{6tkVY8nj=;RWOUPgV+8`|6Emy~KI)#QPRg`Ng5x(*12fRW~Ooa{@wh`}EH#>bd~MH~-4$ zbRt(?fED@2N!)7p-C&fiEf{vJYBpCr7{n|wm@0-*OTUBZ&HmPQ<*9es!nH=3l^zz% zqqM3N+`Jaz(JsW!Zh3d&w=#DBRwquOqYrT;{rkE4lb7j%yBtE2C`UJ>!IZffJ$h1j zV=YmbF74G&R_nLAkx+IY6^xkeV?v}si)DA-b|Dp%>PI)oHoj^GAD#Z*0urwKB*7VJ zslU0z$hhnzl%~LLS=X}_Api0`h~|I}t!!*cF)nb@znptNk{8%kzW=%F^YQ6w@H`bR zil2=o`!-WmaRT|dzne{t0uEr|#BiDx9Uh;#2zFUrdK${0pND-NoeocC^x17-KpIB> z&%*gMBi1m8>;w&6P+MEyo1#)Cn;&~d=94ItZZG=|~u0a)* zoIKyYOh#$xxztPJ_PMn1>?{G5e|2m*j#>xzCz}~rbm)Z_Js*h1%nOcOo#z~^23I8U z&W@|lwBHJEYJXvj;!i&(wSLXY8p+zZxoK0?tsc^kFBbuq3MCP4&iMyLZgZdbxPi_G z7-l*EPHCtl79=3I_sJ6r$v()`Cq$Le7W(d2?tOcp-?e~@Mb9uihHJ($;2>dzuOf%q&&odrrMmQqfd}o-zi&f!?%&u_w-PMMv08F4y$kuGI`CrON^)^* zbFD^AtJ)z@6)0vdXCyE$*3or|)i{NLWj{;;K=am%3oj#Q^4c^CbL!n%bCb6&{*5kA zh9h3vY6!dxCGy8wvI?^O5GM6jS$^+z8@m|i(0Ld()kl^KYVy06wg2jgC|x{$c+@VN z@HiJ;M~yZO%U(wgVA4<_>IqCZ8VDF8#(}9l>VfsJHsY2>TeZI8uJrRWz&-R zCNV9_LFv>NK@3~}6Tl`g2X9nccDu;X(Rj8F(m|hMxtp$Q@G$|S3J4pmg^yt?V+N+F zX`6FH0U-77{;KqOtB%(T+ zJ}rc{_8nM};6(g}aHsD~*0R^|3$?bEYmBSq9UUJEAJLF6fX{L3d6Y-!qLO`v89GA5+DRG>{{#7x9ALk> z7+Y($da7dqGX3s1;P^T%EKvqKH%Ug4Dqqc#;`qehyx*3!^B;1}wLoN(A$WdGk0>a_ zeX#1)KDxnJ{GVhGIA9MM0m+W!x<&_9t1v#Xgs>L?Hi*N z%ni4`b8%hY^U?gi+iXUB`FC6n6xFSh?&`)F(jNtFKQ*<-d(9Q$%J#=5yKm`w*11&0 z_x64NDWj)2rha$$?pE+M!(=;C93JBHXOO{mt6H<@r>b!r@@wc% zzBUoK+oD4Xc4nkoYh|88UNkIFgs^ysLPLaJxM=Tk-XA}hH4TtdBvG8_LTvy}c-w?c z7LN0{^W?HOzmi@H|Ba{jqkO>_tB{`EgAT>g`T;)wM}>ShWP^ChhO8?)3n3iFf$H@v z>+O1E5u-$`?|!2v=@KcAq5C*gqXso#_F?O`dr_4=s)SuG)( zIyNp7$nv=6VsFz~j*wrNv+I^+jCk@%ysJa_sk3b~XW;INITe2vyUF`gaq?R=Y{b`% zA7^_I_x`2eMz>nX(_Kf?3mkUGA~>6rU7GPAX94~u#;_;s3sM9Bs~%;2G(~{*>Hxev zprE9ytoEAWu7F_oox{7zEA7;#^dj8M2H7;V;#r!*Mohq*GkO{k3ud!eR$XAutW+})J#(7TfPYn*$ABS z5`qblKM16N)rG{B41v60k#l1GcPAbmfJW8NFR9zP`*gm9+;w11D_8##F2Zj`;zwTu zui(7bIMl_V{{a7iSr?{uqNSrZHSz^z`|=HR-HcCxTYjX(F5lpTY=BOeT5@87Q(PkB z<-!y&0Q`<}1UG!YQoIX*zuSMg{BB{kwza&vx)z1!?^697k>x^CPWbyrD`x`Ot4;2i z1He5pK)Yw;zl?zwdI+W3$3NHpD9vlj{{+-(SLpW=U*_nA09O?8;x??eJS$lgEO2Xu z7mu^>vS?VeCzmej@4;i^$9Iu=rJTxf!xV>yNqNdomz*ANl&1<6jwTub-jpvOAKbqn zBGYyAhW;|c-%E??{`;q|cGDjzuv5u?>1ucswqk=adGMA zdQc%y#PR0`OTc=2sWxj5u}!(Pwkou}!Gmw_vh?KAifi=H5U}tUInb|IA%mwbb&i8@ zw)<~X8cfPr&YN4Q?c5w>0UoxsXBaVzfQ&gO$H%o9dw1G*unxPKndY5RHsw7ucu8mL za&ukW)B}Y9@p~K#Y*5TbbW6`YW)KY_<&;_u504Y8dp$@(p4!Z%U8j0>tcA_FhPJl* z%@q+ob#uoS7GK~NE|E_Bm7R`RjHLL@9b{qr!=z-4C0Vo~soy0G>Fnm7szjmC!?KA{ zNsx8H-2mj__8e8WXhy=9t(K*Fz+rTAP+sRs9%k6UT>+ay;goz>>m1iPJa(_Zts2-^ z3?!H&F~tg4#SMYBeTjDK&At=|NlS&bMwo=P?k-yiIwxJG`{GLxcuiO3?0G2T0&iUy zxnekriQe<1ZHF|)1Rx?9XA=I6=!3XxZm6Il$(Ym&GEAS!jx;;6pk$3g%%mD6>_j5* z?HB!)7MR6|$*Kd?meoXyU*2{8BJgN5XKq=M?uthyms>y7(tk0d)WFwfmX=(3_X{$D zKAvuHwiY$$zWEg%#LKvWoIlvhb`ReN`_fAB|Txt`ukF?0=f10~09y z(=Z`CB2iHVpj|Q*VPi0CgXiU=S9B?|uQgb?Bcd_ChVbv0bVT6cMvE@R)c*SIltFwh zOQkEx_7$E(k$^#%Dl_E%7gznWW>%3Pcyd774;y!wmew>`%0`=_U@$MV_1ZKDi2(t# zvFzrHpQ!yp97)84m87K8zf~+M@D_7(OYhn|5yOP^j^amrCgUvPA5aKoRX}+vX7Ddn zpP!CPqZVUK(5goI51&MP!47v><<3}Whmm4{!Wu!-}^?Rtyxfcy~RPnEQH84PX7_C+$ZLA-nK}t=L7+3oJlBlNiGP*VH z_&xYu?K}JFfbsCw{~8Ob^D|RFJdZso8T>+D5fVGUEi3;qbZ(8oxlKApl%mk*un{%J zQppZe_%ae6aQ>bFJ<9+*VOr98255!&YfCXl#ghsr=4Q;@w+Ugb1d{!S?dPOlOdfPb zbS*N7alAqDAhzal(W`3!Hlpw!XK#I9{Bbo2tNUp$c$tb34Yry%B*0paE$J?)SV*k< zjN#RyOBNk(AMEKcSS3iHJ;X;hC26-li_-&+_(y3$5Y}n~At(epfQL6|Y5Bc?yS>Uu zTJ)Q5;DWe7g$jgDRRr(s0SpVY9_eoFr1jI@IIFOfuvptScfi>k{M}nXq`i_?-2&7= zey~3pK39Ln9%`=3tyn$uL?)J)INOKhR@YAUpjc@Pd0aL5|E|g@rA+^GpejHe^C`=3 z;MHs;#}PCm(@#;61X|D-iYxM3cAf2&ml~zWqBx8iK#iJ&3rEx`De3XEWZGG~(C`yU z|D6-=yu^QB3?|<(sSFieSBuGmXVs>y<0vjny~E}zlORaMQYXG4-Iuz*&dCFK5PE)& z_Ah@4lkBqNMvG_!G2Ae~BF@#G8on_+WJV%#`Xsh$?)&^AOQJypm*I-HPM%vwo{skS z8pnVPB$${7!@n0!m0%x7D1&(YqFs8!lW-4>l#?7h2Es5FP>sB zud`r5q!E$lIJG#!c#EDOTfygcjU$K#dbWqp=iPde=wd3_wW9`o%y%IlC8AD2u{C(R z9lsWz{NE)AG!m%xuyS(Bdb?GMMNnxBP(|?9liI=V7gTdBpq$OU5G2lSqw`~v^Zd}( zKYUBGFjqN*ZGDNTR(v;is@b$C5F=Z>C|ydW7&>PDYug%ksXL2C%Fci9mZ?CY4Hz98_5QzJ+7F^xi#;e9q<53(+z{$iu1nQ;`AbHC`i}q30NIV_EL%n z)M1j(6q!p&2&QpGPOL9SWQtZgcx@}691_LQK6eSBqWC#GuZ1Bk5X4-p$`XH7xzLhI zn6Tm0q$Y!*N%_)AFTP$(*ugX^lUD-OJ1;Q7f9`C~0*gkp?|VS>9Qur43DC&ntHpE1 z%nBTAXQYn@f`@{7p%jOlzi8{>fkJ-v=c9<9&23`W0*j|nqGr`yL%iZx5ZWTtp0kJ+ zUBo#+Fx;{=!mV#GV*#g+DZjiIe z>#Y8qbkz9ELcD<<4KEoj6yRc>pUx_2RsYM z7}DWRV?cgHI{-^!uqv|%YTy&Txph35Fx8|_xZ%vXl z*)!nQfETq<#*`0QFCAlX2}wVazq}xtMeATe(DU59!d(Kwj_HNeGSwWJxIn;&dW)%{ zTBU!A{sN+Mv-o?O2bEQyYi8*vOzStJh+-QO;{}Ljg>mr*&Id@!{D``Q@YVzg)L3gT z5VRP+!Nb@Wwu#mFe630AWh3zeo@golc4FK#08iBP5b$TyGTqV;aiR$*WGF&&PsG4g z`oEr-6w|Us*5qD=>OPJOicZ-JzHCm-{e^>_Jq3{z+c)n@$&E(DuCg-z;x2zj!g%|^ z;V0k`hEdb(I;Zq~USg@TNpk(&_6v`COsYG=LzYH$8`^yL{+;_`n0Q3oVj=(n z<%P8oYZ4fK;!UzwnY(I1osi7)7S6ur{>B$E8jmgPNJArFL-T%tdW#k>k?4&yA5FD9 z=59w{upJJWg!;PIa=0o!i$G{!V(26`PNLe-^}TX6z*fFk^mkYSU}-=1#~;(38&y>e z1%;9)HzzmA>RLrHbxUs(y{e_F#mCr2egqDl{O@@lRK!cNZkq{q|NW@Td;}|pmV`Xd z!djmmv{bAv%`;6o*aB*YEIGdsLe5BqXpII~Xk+mn5Fo1J!hGM$Fmy@w{BIQm)9d`)(Q%PY_0JzSnbq2vfz4cRUPXjf*>|&| zndq(f#=N>a2|0O(XoVTS!RH6q7aVouay7dV{)33fYobiN;b>A21Z+?gl||bFwjUfO zB|x9z!mJl%xLtWt2m4!C6g64PwOuuFh#%AIG5Zh$ozAZ_1F0@D7H)gp**$R}+&sg9 z{cu%|CitWNCL?{RuGCOi0}FD{(N3Q!R?uz!fH&*|+TK*_TP+&q`ccs|z@!Q_0WEM@ z>Dc0advW65NTn9>PwAs{GWqT)RF&8?dzrdXGc>7SBxqZdj&P96TV5&?AhdFA>D6#* zpPPxOZBO+^6}Fk{I#wJxxxXLB^tz6Gez~ePq86u-_=B`bA4F3H*c@xZRY{a;11wwn z^w;%ALC@rXOrv_ElZf}vpNmt>itf3n_*Whxn2@UDoR6)K4+2lPWy; zrsn|Q37NQtbap7nn%ewAvCD;`vKxzmQ+))2F*8L`x_Y4YA108+ex59aZ|_cC!GNCo z?1cPw2J*5-I?|y-!ldKSby;z}xhznH#xT0gNjio44nH4FdVFFItMeoxr8PcV1l~I7 z8h%UkkbX~GUN@c}P45pi_8}xfN@Z)!T9HKI`*t0Uy!Pg?xUeH8)i2ELG~rKVJ5d}@ zHxdp5hy8p@e*AiLfm@PtKn|yXsjisu*QN*bUsoxp=l&2vnJYM%r#;&012A)6WcdeZ1ld|G zToMG4z%lQ}VB4y1+e8PuPL}P?XGT^~NcgmHt?+fSUgn;ueD}2B8R7BO2EIm?tS()+ zQ3MtWi0$=X9GhywGIuZ3LfujLJ3!uVg5;2T8ik~)TaILi!SEuC-PsPKJ3wdLN)JW# z_EV%4{k+Yz3str3zt;Htb!8$hzAQo{3cdSzqBDw5YWOv2?$R}7wdY%Kp43I&QOj@L zRpR=Vd~)mD0cNz6-nkIPUd(txIp$eMAH< zwR#lgZ@t$2npXIBMjY0EgPWEZAo1nIIVIt}Zm1vDG1swRj6rMpI*iG;2I9m)rvL~R__{7XRv%@0VOjB-BNRbqXg}!> zjs@Z|ucKmT_kNC5du^leL73apc8i|fu^8)Hgv}VB!F-TNQVpJTY}k)Ik_(=Y$-J0e zv#c4jG{~pKqLd=n@CkzA1j*I1%RS^~FYVIoW|5FQyDif#XSBd5ACBzPEc-Gj5CFAuI9Qm?qH25l%ZEItcnIg3e zZD71=Pf;b=+3lI1Z_JEI!YP6CBc}~yYxR$LSewybH`w6&~gchJVyp1yE6t@wPmF60-l| zckU)0*VLc~%1hk?6$bD(w6L zntD}fPo5?bRP)Fv7>|bDCnCx|!+Nz2cIHIDpW*Sy@!`R|sCTsr?CtLrHGKMGZorqz z4lY7A&(!?U`axVRkc zg87-zQ{I4wfnsFzi$rmI0J|1;c%AoXL&rn>jW~$q3C`a@rFQ&Y+UoMl6t^dq8CIWD zf4aFh&Lms%$Q3md+?{RPwcQ`|B1gMWS>2~BuV+KNtY^Hu%iZ(|!J0E5m~B~lPQhQv z=KMAej+HS^W-ph-^1h4Rd4=0sFKNMZRU+p>SS)9P4RS?mm1OqHx_H(Zg@C!Y;BUtK zBXp>@V6O;kG}a+S7C3>2w{5^c-b|L8!*kW*o4A0>p)E3?uh@7|`<^;k`Pn1ME=NcK zChkSEwX-k9^p}L4{IEK0Q-Vo(QxtEyd&yHF3e3jpYCuPim>%6QhT zKq~RpX_W-*mF8)ry+V^;){5Uz+^JAw*;^0-p|HZApdHDGj*Hji1>Qa1vuZOlI*PvB z#_OZde?ka@kgK5IUSSe3zWiT5QXd@np>F3#o}|W!_`ZF6B4_b=uc*K(Dg8TX4Kzlf zZ2EZ_-uIY@%zT^|M!O1y_V>wk8w>SU2cEd;hw8v)7`QBc=@HUIqD-#$$E(@AHOwKW-RsX0olY|Qzmfu$Yh=`#J z4t!ho_G75g!mh}Gpo1DVO@1VN<;oOH43>hGuz>_{b4XJ1$x}jy(b+$kO0K$qNp68^ zj0(X#ZkKG8viX~!B!$mR%(0TfHw%xNC$3F|&nD3srN1e;S=GLND)PTIfUcJC-H1l` z6}UC3#=j7b6hKcOJ5>g@H7#57C`# zpk_HKkM*#T_!NZmEZ)%b3;Q^aJ_>04U%=bQDE#*nnC}V6sr2-k)MtI2d9KvY@NPLY z!?x*D06_%Kh`&s#OF^fdo%3LXME8Ih?uU+M+e|@6_a-{-vh!uO*&lso|1e61GZP)_ zRt$PJV3y<6Z)r*lE&iOUYpA{C-DIgGt*;{7XEFjYNN~QpsCYv{_R3`N$jIQ^TwD4L ze2xMGmh@UXuIO+zg;Xs?-U6W-a?mzbl;pQkDvBzaDqB`otA0_T`~;p%)t>cWm(I~R zPu|e{L=rXt{zlf``WS9=nJZa`fY4%k-)EzFngUPEp)7Mtu2y&<)-0fyi0#Mu7l?xx zc!la?gkX2|Ir3s_`Z=N0>8D4Qyv%EwUfLb}C|_C_vsO^j%+BX} z%-{`mj-<{z4zR1J<|$50B5u90SMZo_IDrcK#jvV27@{KO9(l58J9<8T)IdLG8SGIc zioLd-+w#c-LTtd(6}X==@qoCUj2jj>q9{6@q?G&n>Bz9whz-X_0#R{AcSPe0?OIpZ zbC$x4ewF~f;MYrGmBfazswgz>EC}E6{kpChEvZ=f@$t;8&y2EQmUA3(QOF?KAA|g- zjT{7Uu8vmmg)Xf*`R@aZ**#nKj0g@%j1Hqq>mS$#1J_o5*)$&}ls@C~{k5@P+2i78 zK806Xc2Y0NY-QkC|C^3`(tn6pk+ZSCGkAIKsDV-2>eEa2JH7Ec0}7#@_dWl4+m4|R zfgfg^L&(Y6!N*oOO}Lz2VELp0V_%6SZHAKj)N!yC6R?Ffw@c7jV(mZa$tCTPgtle* z0R&jxTYvwJ#0jXwI$$UD!RCrWjWU@8|9XmbM_~-*BuW8eroLA*3B6j4kQg81Ztv;v zhs;PwO}7}6?l2Vp)av&B)qB-*pAB(lYo~S&zTyw9?dTd{Q$)-6xim?ZE>0RIH?-8P ziIU!Sx9B>Nc@SsU6s8zcavem^u(@GH=Z}uU4Egfm(``utsVAO{iIIL~X(al6Sv7X# znSmvwllpNt@5rSlPQHf}xgQ!?(n~qMAXh*?A4Ut(_D0DOlK+bhN#T-VpiA@|d?}-N z@XbAY-_f_`^=_Y}Yd0G@=T4F+SA@5vDStFEkojvG&ROn+Fw3c!52F^_gcUMpXB#?( zNpr4)Ypj=Cbahi#0D0Yy7WS-6ac#G{r}Z^+V^IwQx4_t=48ece;|#l5@cQp_%~)UP zh*GM>1A3FPQ)HD6QIpBoFzFCpa5X_OVD@pDtUALZ-*z{%NMkewm2Pn%@jGD-gl%WF z0kR>k%ay7L^4__%<#$#|cyg;M_!?{VqJz@yMJ=B`aJ@U%ZiB1jpSq(g01Vb(xVee$2Ip}4)%Nyjcc49@EzZl9J{)|y=m2hkJGwU%W&kY32z%)bgA zud%R<%kY*OLNU9yQU5EDU%#e)cnN*~bNa1@AK4y-3(05xi7Tx>+7q(9=3F7$I3K2b zoFs8?&Y<=PxDU%~We!te^I50j;*N3-r=7`r#({yO&`Yl;)c@wat&)RQ8 zecTYYJ*S8($qmm1+U}sO&h`u*)7E8Glh;(8CR1uf_nHfCkB$Kt6f|zTDBds!zF-(C zqe=QmH7)eh4Zzm6!HpoHjtJNp77>#X-KJ*4QbA)TcPMYxH+x^l%d0v%neWZ3n?B;O z_s@vHW%lS2SGn%s$?zJ1-K9OZN8&BiG7)I2TSP<$y^P9L6JzTWUQk(E^y9iCU(xl8 zweDz6w>SJ1yO?wvz;+n@Q}8`C?Tg?nzefpodI=RheCa%%vi;H7v>; zHJ)rcumD7&7AKSbBw+y|F4+$bKIy|`_$j3Ki5A;1E6dr{q#2iikaCu}7up*d9@zmK zdH`+VGR@8co^pT3e|u{+E{Dhn0{y4tm~NV~Yc{2;^jiR;TQE%0B)$SGo`nPCVUM5Z za{^EuOOIv)t~n*U=$&HQZI((@LPxJRo&A?2;4enI>>^?w$j#^z4*%1Y0FL}!buS_s z^uIYg?fzc&T+Ne*7aW48nopZL8H zQp{XPwwyI3o~{Gjz9o=~^8Uf}JP#2PM9H9=WB{}ish@F!=qD!B(cC!~*1saWHA!XJ za(9ZAu0oN@Yi_2EG7083;kb_1 z`MfaufPm2;cbUhtuyfXp+cWQTzN?hIqBya^ilUHmmAQc!=5@qKvP_fhkJj~o#cIQN zeUdaFounF~Cd#Av+C@wG-#(@#{R?s4JKLyHwg}ZCtFrV#-1Q+Ann|kq*=v)r(e`_c zHJ3zD0;M#KLa_JVJdpM@-1#F6qTtv7=SZ^iLxJaW(CXyRJqAgW<4cu+Ti^V)X8D7pc!PKl;#$$$BB-`C9I{xosdI>ldN zzb^vwWHPtWJ{NT#71p1_F=FnGlEM4y5F` z<~tVIJ>3&y=sq>5wG=8`jdn?BOoDsVY(bB2AWnzVmcXJu(SrW}b6Q?EBq= z>Q0E#5e4L@!PLxq|9%kd5E_6zil+!=}o0KWPsd>bEDD9J2Ctx=@?3@&YVhIP;!HSym|J!4cj-(HCGO|sd0 zI@#ZCdeDYEF|7XZYxQ4RTBVypZ)R6}*HQV<5x7(SS73*e6gQ<}Lam*%{fi6XQ+v=~ zFGWLcNE)*9zUJeW44=z0EOd^7hqM!9!adSsy&S0*M7$K4h{_ri%gKXrpZv!R9PAv* zJPTI~ctNKET0$bv#N3UaN~_79qKi0F73|RNwV58O4rj=&qxnDFM~Xx?ba?InY4EPw zXR|}51#V)+9QPf!Avd2x00YcNSkn`Ev&~(wqnn))D}pHb49nUex+tsGf+VHmDCB7Z z@?M+%;C7(@>G=mu;&A~TxZMWGJ0Z9O&6?gSX@OYpXR|NZN3Yvc&VMjzE=jzK?%N*h ztoBIeUR_R0N_c56Y;_g>jbIOR)S7L`Un?1-T&S-A^qH+6HdpO+FFE(qg5+N>1_pyv zm8*hfWtF*-aqf#zARLC;GZGx)GctC*Ms1g@3v&>4IoK(T|J5Ta42SIjbm9(PIpnk? z$6A|rwcQfCl;2#8loz2(o(L{-OE~0WSFPjrg<;*#GPW9_^Zm-*G3oR3t`+~)wUsp4 zG=OgmWwq4gRV!aLOdd2&))o0DLizRF~|RN0NGQJ5{;=|54!&7+2J#H)u* zYfKlUKYQt~b#&S(StW9IlN_>}hrU0KmNNRnVQxl36wQxz#$Jv_#Z2-7ojvGt=cSVj z#PwwhKFlWSrg^Mv@>d2NA3Pd}IPjsH;;A+6G36jMuG*+2+UMev*fq(^UtRI&Vw3Y3 z9wtM+D&C0+@l=MwZl z3Hi9&yd+Sk_95uBP9c{J&)}QdYRlA@2h6|a1=~!YoCk~uQ6!3D5cO5ub;LQ`erx8^?X86o zZ5-P49hQ$5r!{=pBBHHL0tzyDCrW;Cd$|l)(wYbLlC8owH=`oKpYMdas@n)p^o;ax-E&#gw-9X~MLc5#A+(+#Lii~{r=Y{r#hhIZ#2myMVsSm+Q^;32= z2UWk=pmk~$8Wm4dJrDjEv!8@5NWe}qW$^^`^4fP(CtsxVG~#+Ma(wd2*oihA!X?yb z(gmE}LG=OK`lH#G*DF~F#s^fsj2T+gYgI6n{p0RV^1PqRLB>&gE%p$N8WmMA{=tWY za3!20)H~PrEv)xArKh@(D~mK4fvulJQEUAX1oS^&*znRSNm3t{C45BNRj#q%eilU{ ztdx3wG~k+aN6U`81aVgtqCZv7623%GUQAkLqXnVWrquSf7!#fUs1*xXIbh{I4D4H>Z7d+k$a^HYG#HJMC}>ju!qVtf)=F!au>QU@+jQW}YUw~MaMlY5)soD?~@_=o8wh=2r} z6L><(z;~J|uf{s=-qW-n5lxatd&5zW!4pRgTdlg>x>72I)*VQ5E0C5rJYp}^L#3Q~b1I-oJncIl z3X1YmSAjU13F<4>NT{@rKMN|lYK>*e=ls>Hi^jIH*E?%p&TAIMU0l(#T)Tc)2xHQZ z9$1KA!f`&uam%EBs4zCyRt@RlrHb*5v%)y4xWB248QJ+z$ZRnazgZ{IDlY9NqE*wB zKMc|N@xw6qA8E>fZ?q@i41E4(QjjA&hVeZrb$f^3bge(<9c41sQ(IYI?3 z<4=b!iw@?l+zPHtt7We^VEQPvxXe$A@I8KT2w4uCi7|`J*b# z5I^IRP<#I=2G4^r{DblX8_h~yS*v|>pJj`0p0jDH(E*SCy4|mGHw{S2Qy2x#)f^gQsX@BXNCUj4N-LeZMc}5>Vt_N zJYGloj`q3pybb0!wmrjL)s?>%RpHUJk>x2O_}v!VU@AfiVjJiO#)^i zIlE*?Op<0|7dCqr`x?F+e*a98tyj_&v7TAYl+i94{#E|&#^n&qh3Aljf0oNC@fxR> z#3U#P)oqnBy#fygKauNPYIXk`-#Ys(RN&i`y3!aEw6eL^gw^P4Yu94&X?vMfyKvGP z&s3I7aVs8#G0{osJG^J3hKKJvpX7D!g^cMMtTEF=x5XYW9E_yxgT${!$`EW3^_stJ zURq>=Zb0{HE!v!MgciNRS~V{cZCfN;4cE?x(DgH3EsGn~7zOi5^e*SAI-2o)mbM8E zA4wtY+EOjNtIW#G$}8y8bL<{!PkscSMkgQ}q}6Xo|8{N1T?eQhp*i>#2blUm3QbV4 z6P*Z3&rf0>>(3?*=Z`FceqKp^J(`RTuB}=QZDVpf zurAOous63hFW$!zP(4)?p=I>)Nl`PzwqF%+s=t%Y&_rP_-X>*)!DU%&V z^tM{L6Rf1GShhd7xWHPWC3Me;q{x5pD97pl<_QSj>MYX7%4|tE3+{6NV%p2QoSC|f zhNAAoJg$h65b%!4n^vyLf-RYtKa*Hg@lTd&OlHQzzG+-6iMd*rX%gD=35_Y}-}=vD zj(dL$EIp>H2i9~IOyo?A(43y4K*XQZ0w=G;c9?qyVi5NAkY4Wh_JQ-addcM0$z)7j zNSVB|%-{#Js>sbY?_CKE3T0r;C)^aaSX36|9XAv7(JJusBh8ZxAq8E z^_3s2DbpUarUHO0^$B!y44#W=s5`c{?gy~fjgMs}?C&R(01c%(?j)UL`{qmRWkLo5 zXK&>L`Cku=5#e^63tg|nB+M!JblZ6qaZr_CjG^fm^R|(sjupPDE$nlvD(->{;s>pNg+=CitX}v>UI0Yuc`f)&64Adq!Iwof@ zOkym-%rExaB_C8>ZjgU(%71Iql+mlAS|djM2Q}6C{8q}&Qmtb4OrovzhfN=)qJNSa zr#G!A&&69V8<>UuIDc+NLq;nFT7=CHCKmGBFNn{RD;Xdmeg{U-e7kBdPxH5kSt2#; zMfFf?BCzUa>)R-WUh0yeQ#yYM>hI^x?$_<68`=%_V5-jM+1r^5+c^mRK~F6e%GH8@ z%;W~)bUW6YxKGJ0hQiE@zo7F+FVU4vub)CCBAM)_)5ruDAW3v6xlu|-bR>W2FRx?o zIOLd=*@CugGuD%)b(WLM=(A*E#2`x!yfyDfD97 zy1S!WKN_=qfM|wF%q?sJPw!MY@z9p3lc>CFF=gGIfTK7#N2tVU>svb+Pd{z~D`I3y z%b;A8D7KMFzC=h>jlXweqx;(n4s)uqOF#DuAWbRa|K@h1e9EzPiPyldxDQWL@nS?Z zxL+O3xXbh&HEyB}XWFLsSCF?!y-AF~Uy z?yA*A8dt!_8hBGG{3hL8M8SIPVg=U?&YNPiaOm{Ut`0rMi1;0;=y26ip+9 z%n1cW0cR=?pgnz+)HHVbNBxVMc`)%Po0#=|Fa+(iBv&GnY1HB2yV~dA`O5ew4G}m4 zKXiTFo*bBqpKD2l0#jf$o(nh8An`V>W)RZWu({{zl9= z;>jl2eY5X~D(|dL*_Tw09dFXlK|4gLBPX}`(4LrO_9lVB@0K0JN=n$7SZvP~`X2|5 zF)Wc`qd;yjJaSx0rRNYcxcv0s2|$67RLYMk$43=!m0*>w%S;SzFe}ONXrg*u$sWcV z(*Wz6PEbYYD6DOg++oLc8)=5~Ldla6v#e)k3i z&$Ywb9G}3#!=;lS^QhO(bDjJ@Qt@Y>u%|3;(43Bdy}}ad zo%}&&@NdKc8N5ArVep_`<_+#V-3ylxziCm+nyH!=A`R1?+zXY#kE59&m>$teDl<$M z$^-d~rL@WfQcpZ4YAgq3be;0Ma~M>c3(ocytP4q?F*yhmWMRn=0>k{*%cNWm;ldyV zHxt9xK)hy5)zf2a5*yZp|Ekb!$tmUa4V5Z@1zYYql&+TlYVaM?D;VR%Q!Px)D-0W) zy=}#-WU|w~r<2;-p}3jP$+)b;mvRDG>98*yrb7;D@O2<0S|8dGe*;FLcfS z_~1aI!&=CW(K_bxMF@R~$$q*?0mi=0l8vDLDD%X4(K|r_hH=w(a=cq%v~k_B=<$rP zGkX)NGM{&&y8C8|2q-ywt}^j~SU%27jV|9^oU^s`qv$DhLU743P)SuxBk>GLCIdAGQw+JSQ(W^2>Zl?OtP}(eJl(v>E3@$q~Cf`q8$z!Bfmjm_G@dVrr%!Eo?2C>a|#tttL1`$ z;)}yJ)za%kQqkmU%TP1#;1arEFEn)pSI}B)$;fIUkcrSS=Y)HBf~2~}cD0zwVKQdgqQ6VbBGS86}eMguJ(0=9sjM7GZsjCT=pn)V-077akrFFrI^C`-Ys9tk$Q?Tn}+_j@FqANq#)$dYB zi2O-&^Ihc-`MyO{J#43`Bl;ou^GddBE!NY z1enz&x$q~$@#7`1bkWp*qvxNIG8KTWgl4}$)imgOwPqspdS}pqQkDCc64SVt zZl=giIX0bv$9q;O;K}beqXx-M9BOvB?y6E5B~Sm{yTv1pu4ee5XpRr7EJ{c)@V|F0OJ+Uq?achqwy51+wawyJIZ!%T6yt`3-A3SpVXoS24Ih?+jb_|V+?kOm+VI*O_G zHXZOQt0?^2!Hqw;8P8)GF{u;)pWlrtbz7(Y4BYvoRJb!wz59Cke(~t%W7to68B_>L zas4;SZ|TIf%_WP^{_C5yk?aKS>WnjIgFSCdBF*yB3mU#~CmA&31H%>g)Ko&CQAXgi$p&oEl);Y;o~^InyA`^)xT=FCHXt5}sDo7R zW6srrp1YVDsq?2VLj2-f0CSEyaaabsxa3@W zk^E*yw)`k~&D@VvRzd*gzRsH84|GR5oc~x}0Z;V`8We~>qwJR_q<$8*m)?AZ#wI6mLz(rP$pyV$~dJ0`S<)sm;u0#&*z`A zy$3nHbl^;Lt+UH78|!Au>_HveuFNhNuaJ3ZQuqm`rx;+8~^DDEtyKehXNwe#;V3!P$R*^H9= z1s;Me`EMxvc(yO%J~-*G(2~ce$A&4^3(R^Z^>7K4@1@DKaYj(CsoyJkD7*h0Gn-!P z)dr_Yv}flsLYVUwhwTkcXVjFZ(&<96Jk0QfF*6)#(NeQWdfu$znqn#Arynr4SRtH+fNvg$H&}CU})HG-PP@P4Jh>dfgE4A+-R>{!_m#! z_fu_1voUUw*3%GhxyI#j0}CEhEm&dj`@6a?MYPc~P*HQ3Zt4v(F;J@Kq9=ZD)s_^> z0OrX|xIu}LOjb$zDrlNra(cmCp?akWLN#6}vkeiAGx31rtI*}U%lpDao@FZk_BnTy z$&lmcH8|+~q-S4b;vVsh7YLYin&rSs@ll12zY~85(VrYIP5&5hj@2vJNcyyh8PrrQ z8%l*%wm$I>0`fL(p0sNbH+50Ig78K))0e^cnyyY)3KWF+IrtUbOG{A!83!{d?OZAR z;`g*nIiagVtl%rkSW2Y$c^j+KzbWXePTP@6Vgu625tZ83jy2$^Bv0u?)h#nazpP4> z-|)L??ayJRtVb4>LX4EL0nTWM|PJwnE=Uz{ltzWJyh53kSF5C{j=`QPzi4DQF_sFmW4Jqk7mKd8a(P3a;!f9 zp}UpC$9MAV#a5n8jOnyb1RPW{PA`v0|4^ZNkHTZXDZM}?W{2pG!HhWtlWrM=8BfcY zl<{23gqo>0C_(UH5*x&UQh=3GdZz^P=GtcX!lOiU&OpXJDzCo${0AKxgA%G2*c^~Z zv@xU04mgELJm=DVI~F04D7M4EY5VAa;%!o4pBX>QfEpOlwPQ0!Vh z$KoTIJ?Po5>kn{ij?%6`Yy$%L<|dSB$Mf4CoIsEdcXH}yZ5BJKxP5R0>s6p|5w>3@ ze}6Kj&j3IV*f7Cy72nVd6t9J+v3$!dUZXtA1nmQjz>P9d}Fj z%FsWnhxaerSwRm?xLIFlNmCl{>rE)R39Dm>avJY_iL3Ro)+tj4PLm72Njx0Nz-e%z zZ&Oy(z>D|EDRUn49!I!O@qS%b(v8Sa>?Gp`)u6RLTKrDdHr8Z@14}F^xjtdBr4Bz7 z^B`c1>={L#lp_l8&ttK<{ir``U=-{!9RDLJ%rdR2i7I(J6<8RcB3BFJmuS3l9MPZ$ zSoypX2rmA;k)HY9L3_#hf+I#XivV2*!30m3!)L$vnb);I{YEy|3V%bJ7^Z-+UwrQH zH2wY!22vyN*6E+ii*fEk!o_E*k?p#sbr9g+!3UVa-#uLZ`zBOvd6DpE&e2@m6~Eb(P4J??=lc=}?BG;b)@8PVrIr9#{!96XHM)kL%`W=2s!q2w3<{!p!Av7)pcTwv2b2FOTA5x@K zf_aNGk_#~P67SdFEmVfCiihfN3I^tV?f$KXo^OWg<@(!rg(xMyH*$|^6jh@7@TcPD z4rbk!UW7=J=OyEB4p!x?JYUgJO^>s&RbRXfj&W}_NuQ21d zsTvN75~M0t+zu|#?^3quzQpI`~ ziLN#E=6B4)=uoCHZD+1mytxoRW=;xWN%5 zROIoiI|MmE4AG_5H-(k2Q_qU`K}fq}XpbFQR|92u&bVq}em+uN!($-Af(=tVKPPDR z+JYn*y}&0m{RNG8m^sFoM7IMf1=SmyEC8|>Z3Jr+otmf@G|4kPWh_y=2EedxHc{by zK!}(=Y}-X_T6RksRT1>uO^)YKhX&J3xn7Ej-+sUmq^d5?Whs@M-oSuMn}GrISwrQ} zMxe=C8SEq}WeoPy;rZ68^=K3t>6H)uWfK&@mlH$#Z(d8Te7X{+p;%wKf&o-iFeo*7 zae8Cz(YEc;X}LLBlue}*3?vJ2MiM^#)4MvZ#<@pdV5rih|q?JRFPgA20b4WiwormkU zBsK8;N3Coz#%{Qp`gdd69&~-uthMtfQlJXMEB!+Xo?!Rwk%N3-&ceM0h50+wl&pJ-jC;s9PD+ODHt#cN= zPYdbiDzQNs-UdoGP37iu_@0xyk`f>6++U|Pnx#q@QC*2lSD-RV$)aaX4z zvMA*S??XKkP-HJ{ErF92z7jLP3INh7%1c5mEUYcNiIIGha@yWBJzXTj!cT!Y@Q0@h z@_l3E$AkcZ-HEt8bDy74&wtote*Bq)1i-_>ewI7menOlx;E=T3kRQ=@MIUKDo&kDx zjzUJOdhgQxPGZTmVEZDP#lRy~(uO=UGL-OuMNh?+c@0(Gau*|F^AZG$*%k$52PKG# zGQXRn>;uQTLpT0x5$BcQqc9Ekd^NdH@fy7FFzEq#r^$omWh~9Qq!m1k5C6J=fCE6T zlGesS7%jPy-U0|`fnhDec=u`ky+aKVSayB+E-y?y$N%Re4j?y(Ur(L9Ce?s9xy z!iNTPZv%pUmm6Qc-KF?}UIF71BTZqn0|}T-weUZL=~?nTZ^Go#-!ishy-Tusbv%<* zol%2nt=tlV5}edXo{k@95-ePxj8NmhO=qUm`P^>uknH=pd54aGBs=AY`se#?wTU-Z zhZ3cG#96cTpGg{&oa$2A3KIU#T4`sKzv@6SIBEP`(s@B_sOvQwMDTo3_P)UysniMk z@ckrk1A~mQ1)4MPb9=n>p9H>!jep}Q5Fck~bIImgS*1^V@0L-|_WW0|fyi*EVB~9Y z6TDC!kVNfy5V&lrKsA=`H?qn8PyT$>ZCV!Fj*G|I`nDeDxbUvRuWYSlh6 zBweZ-E^2clQ~k#E!aHyS`595(S129mtk0jlu4kq~x)yc0XZF!0e_|us;YhsN@>lY+ ze$=Nq;4v_l4nPzpYhLqVc;ioctf}|4}Dd z?8r^aa2S7*(gy0m%cF ztLAGQR!ic?H0uAJvQy(liwdQ>Q^yaLAlR=iA_5*4P)2i=ro-uqORPg_fGfnyFyYIg z?NTryN8bFUG0~EQq`e6Lo|uI)7!ri(l5K^_9ZU-}Oi@R-NT@2EX_f5_bjmmizn!7T zG8#rm;VGgQW?P2*5pkIhxZ$?iy$f$EY~f=F*{aIYm)@F8XA1E6y_yLu7r(&b{3&Pm;>g2&=qp z**cPZ^1GXqhubV}FONQHRIWoi`yb71AH`cz09^Fu1Qd*kjW=PK*087~I zZWynzC2PN%b3W>~%(5n3t9>~?zpzdGdW!dJn}#DVar;t@ z3MtiFmio}FY}&ZP*UsEqMF96pRq8Fz7XuCFm=9dfQ&CC4PU#szv+NGhuKb`$6Tu%wNyzrhp5^1!VPI(mIm^A-EAPd zA1EM?Dtb7XC%X{D%t`tNLiB#PrfI=S-v_xc=Ksv>@ksW`u=Ywv&H2fBEiHt#EyV5k z19+5wDAx=Eo5E_FuS%xZsGw)(6SL`~DcIYAf z<&|GkZdB4>wUJaR4`}P>zpps2TYFVo1G-gaxOjfENGy=B_Guy@g zmb|ccmBGsl<@MlfHU?Jx#dsv@dW2Q_>MHKe?c{WVpI}m?MJyNlnSA zZE;;|sWyw3KN#dWsBDIR(?mz;Ooq%Cx@bk)18mO z3^JFcN3>;nHzWJrzzMVapz%Kv@@4MB98F#OR-c8KkjM%7p8XW&-tYcS(}kVY$&7qj znr8D5ZT||134c}HUR7}`KVLs1Mo?S%dqs8{spLX)^IG%M=G3)|y`pSCT^^!aH)@mzkaEvo~Hpb95SI)@(;e zp_Hto#_=YNHv^_eZpIXiwVDp>AQgtxpSm0=3b7dvenAR9jkw(qn|MYZ`TRHw#rhu> zc2N-xoltzi9ZthX#Z5&yUZaBmGs>d(BO(rJd1SyDj-$AgqI^iUq=Xu|&W$)A6~S@M zXVdD%V>E;^vJs)YtVQQ{=+4Dz#G16ub%9P_EqqTu30{jnm%cJC7(||ZEI=BQjNK|0 z-9xRrmT%8Ypl&tJ1(a3df3D35N0@2xF3pXyTRIT0O6qP;H@rO%XLvQ1Tt^3Lt^9Sq z^j3=<{z@Tr5Du%^Y2 zFuhAYx!g~9H`VkGFR1SJxGUy#uVV9osLFJ?Xg@00<8`DT*=Z9YQ;FM zD#w*l*Lv9J@a>7?79knii9KK{kk8M zrUenv4$KHEyn1@_iV6`!TZ`dkS}Q6#0SdBepwZ8};Yix-X#|^!L!8Ny9TgPy?nWU@ zf^rMmgJ}MEyXL=^NF%m7J|1UkYT7vR_pe=tGCgbmUTk~#``<&_n?PXt1_7jw9YS3t zd7e?D-rYiwxA#+TCEb~6uIQc+Yb&#r5-KFeEiFG>?PLSA(l$koKV>(?#Jn>%HU4$P z=KpkP*V^ebU!z=PKJO41q5*Y3Y&5)nqTnkKi`GaoID6Y4_*vxyb3@<+uRj@mWa;w5 zY3I7ow)edhG|^{jKJb{Ax4p`+)@1IO4EuJa9kV3!Ey>LbjR|)<$UWID%GdK zRO%le$>h*Wy*yq_h%F#roQ&IDpZ6PIKP7Z()Wdj;UeiY)$KUjFN6ofQ zg7Gh&cjJ#ixaA`JGJkJ!gyjtA3~;RFdvtNhLHE_i)zQ{Vt-OGh?Yh+$_i1tNLBW$EiR%l1Jp@{M$x?Wq&+b#bwK9fTVA zxx?36O-||P_IWS`((KoL;<-wkp6xhwr`O*fL^C_5e;$Y$K52Dd+Mdt6yg;Bl*`n{X}cduK;bLB zw-)Xe-q20-bhgpy#x%NZ$P>NpZwIX+PssU=Wqa0=pP`9?^_Wi;dYW^6CmoEwbTH9} zVKu$>QZ?LKOGBLflw5q*F>}YtD|DL!;DEI4R^zCm?S7G6qiV z@2)z17#`A~U_*{bO5P+T=N1NIyAU&a`l1GZnFAgac7kcLxX1Fu_+NobVV4b9XW*YK z638Bp-SoG{+J@J!!%K6l>MK82){b)s3T|horV{aW;MR3kK3IonXj|a>{IS3+q|%=) z`aRtByC=f=_h}LGv1m1K`1I|;j7F;Y#FX9GXP69TaP0woY-+^Mp0{KCUXv_PcV^tQ zza76=kwb#$jTRO^oM*NI;qz$ZzP>p+?0sy?^B1 zTOb_$#Bh(43I2yzsYCpE+N}}uA%MRAe9DZ>i&p-XsXU1}=cZcc@m0UnV?F4y_F)f# zh=P)kZoeUv!Zri{+#zlvn^`q=sgxuL({^I6#RAS$it|MEyx@t0~S#XY(QVsYR zK7u)eUp4eU03$)%zHv>U{j5wr)Cv|L_xy9`-9UfFR^~69Kj&W3Yw9&-SC*o%GI#-x zoBGG<>j&Tcjwz{Mzk5%82%bH^BF?UiB`B;$$YtX_3J>fN0V+mem9rBHf8&40_aPA8 z5l^ff;^%%9!3x1B)#n^(1;Hvp#EHj;4}YWn|3>#Bve(eo_fm}D1ARmhnGo-zg^7@z z5IbzFC|3l4$0sMOu5E`_{29{5h{#qy|d!~g7`lZ_@CCF$h3$!Ipn5Iyri}>)ex8icF4+rkk2vay>tLL0X-Q+fAYT0 zk*$AR;DrU<{rm4Ee1jtWfea_|8&g*Q#3Wr4|83AaALu=F=L4glKmAzUyLZpM_WC8= zQ@<-IJ?binGczEE7g7D!0t*UTtCUFOzy=1MkP^1wEVrNl0NbSDG-SxB30ZCG1jqsE zEKV+X<@9KWBsA9na{xKwEBnP)4}+Xiv7kT zw_s30S8@EPBY7{|C>)LEk$`iA!eYtvoY*qrLAsh-TwP_AOU7UF3?UJ zij!?74B0on`IP(iGf!Jw;t^sNMZ_+0>a&D+#UqD|N=pt&9!uP@@=}XoW19vALTVR_ zlhZ2QCl}RfT>vgidXM-yz#NAgh!uK%;k5h7-8)-M;O*Pm&6@^3iFx9Hj6dxxO14z- z#5E)-OzIO49SMy&NI`lW9+7*t4tq!oki^)s0z6(M@cj~?< zKSjz2ybs5Z9e7u33zr=l_vspLYM-xBkdA3%I_1 z;evqG&gOqCBVlXfpj!OhpJ&4(Iw@JJJ6SE`)#5tDf9fNXcpUy86aVw{C-N;ioX9yI zxmuH#Q#KC(b9m-_dJn)HUM;^x1)ytcYH-cO5b8CH-?!enoAl(#w6&Y-2IdYOE_Ibv zGS&t})&EnCl5_8wBPP+(kJRN#>yiI)l!F)2;g(BK6u_KquZj%N@fbi{^5_8_ue~R4 zc1#O2eU{WV067w=bD)M8Lh?@Hm4kN;T14U1G%#`Kh;0*7PAv~1e2E$$h%gO++&8}Q zZ`{*Q|EXk5bCh{29a&y3DlPT%UiVve_=ufaJs~0{a6k*-^)=bgecb>5`;-6bUOaa` zJEj51!GA097W3ao{MTGL2r!3ZWc9`k19A<*DxI1yaXfk;iyIXYgG-n|dyDW*Rh5Ny zu%q|E!(7a*-&rcu_~k&pec?QF8yg$ukpswu*ehZJ0CcRdhz$s*B6)Y5~k)py_w5R-QgsT`N+7w&10+{Bw2G{;YMa zQYHlY_xE;NJQ7BTtqHsoUe-Oab-@YewET0TjQ4DA==Ippu;vS~P2^A{^-jB$cf%XP zp&X1?wH812sQDY8%;RJ&1dpr4-^$7p_Q-3tgKPC(t)5qFTu92y^E%yU<*}ps-66NK zbbZG$YiT*zjjU|dK8x?%Nqh9@u@%}sJHH^~)#49Ki2rQg0qEdALGpR}GdU3-h^)H#7KQw`$sWUdfRm+v z5&uK2-kARYee@0soBe`0Vuo*PF^xyAOTRy?@yuo;NN8MghO8Nu08;{ea*=4MkaApjRITnNNvFgVr2XBiAUETI)rrNxvjL5X+o z+!nGwYo0g^n&p|&B+exc)nvETmnSAa#thE{TTH}vutkt-G1CL>uJIQPX`uAC6{B?X z*TcW~v&H{~Py9~*ehW#sU>S!6?6t_h_Sc}?UwJy{R_wde;~FU4;=hmI1zVxVmL&>7WEtYM@*Wh3BRe^(^7(P{$Ppih@|S_IZPkQ`sfmCbV2?>2 zz#Q?GY%_)SufO|Wx`+HcML9_bVK;n z?CVwk2Q7!%>?HY|@GcCSr^4!!>Jh?NaXO6qw0vO#t(F51;shVDLgN!|Lia@~4RS_t z8ndOT*&9;QFF;b{1kID@4uIgjhKUzNeT3hXA;SQ$1&kMi>i`IHGSYWe+3=r*6o&ci z+?LR@1WBoY;WZ~D6nHUC!;rT%^s<>mFu zegB6aeq>;dgAyS(9sCE(1^!!wn3VqHbf={t5#h<@w5n}QazMajhDRSOM>5?;5q$5E z(eCBoQ%{%c5}@PY6tTfHc_m`ys=7^D_oFQKGnwq4Xp=8AaSKYVn zofE^Y0&$(3bY`nne!yjo`H?nyEZ#;#@R_prOO*cC|V|u1dm?7{V ze&dB>TNRz-^^BM8>KgH1U=HWeCjKXn#ajG6V2-$94*g_g6G-c2$%{>Idh)f{B`1l# zoR-|Mqldh({Yory{``^r+x?32WS?h&eEULr=1z+lc;*0fPz>aP5(;$CVD62(w=G5p z=Hg|T6w_I;1?FcbyoiZTGF|ep^|iOzsVo9^Dxpkn>wgQeI}9y<*Mvzghk7v?BdfCs~-DaPw2+_MB|#Q1U2p~?6*)nei=1{JX=Pv}9gYN)2+tLHfCH=<30R{fEkmB+AvuE91 z=?~&)4zd-Jsol_at(ZKfTcPiULPKv8GskJaQ2r~;f8-&pKjQ-qJhyB5d@L_`G9Z9- z;Jan!*TM(l-~h&mLo-FeT%HUkuK~zv+=bU4L5t+HNz9u<6dLo_k{($ANYJIZ^-L0Y=QXF+1BP-H3m(|wyvc=LHJm%RQ9$Wf^T;6{n6(^CR-dbIL4x<*Z5Du7u1NsLzjb0cF0;yC2NBc3|1 zm_}sWrJS|ejy-Y#z?m_#dFw%gfjRLv@Ya_c)91o-Ky*TQgv=|X{u7%>|4B+qDj4GT zUOad1D-GuKWk%_Lq4_Y8o3>rmC_b}&MFok#f1?8WGgO$d>M?=pW$Z*&nve0(q6UL( zK&Y+NPHbCde#r)*D8x>32*wt(MdY_IVWRwfdua|JE|9;&ttd2GjA{O|n86+Z<}87* z40*2BYNLQ$tIgXnfzT=SpWPKZxWFTGGy-zO!sUZF&1tUdbAE9XUTe{>MVnRh(c%KR zZ#vbK$NRb({}>ilR@LDv2Ig2y_GNl3wiPgEivZ@Y0p|E!4nUAEhpGTDJ_d58cu+d2RU}}J!C*zUUogk9VOE&r z8X`6*FntCCRs_tA_h($Dy+z7wK2c@|%fEQoK5s(7W`W!m*LbqbVQkpsw~yXPe5HZPI&1hB>PHU@Hj9y5nMF+cc@NzI`NE$B!x+#@-} zBNt-yVvk&Q48&LSdP3s&R|(853C#8P^}4b$fw^jdImu0^H=8Fv06Fm!Pd?QhNMcV8 zIns{gfjJFup*a;(Xz=a&(vlmL4mws=Zt=M+RKN~7AeXO$po0W+EXG;XWIEdOz+CX; zT4)vvUlIC}5U!z2uj#b;=_z+}b;a~}wtZQ_9Kt{VH|a;H8~{kOfk?In!XSXAV`X$; zU`~jbd`QH8U|ca2wtb`tOi2*7n9QKrtZLF>48Izdhfp*&p zeaGiTKn38$b`-W+VQ2W;Vzk?~={r*6w;iQh`ujpNFemxx?&*>|9dXnw&2Ie(Tma-+ zY>TGV4Qk?BtyLLL%QOzq=Q+Rz#h+FF5hX^z4oB$G>U-)l#MoeDasjYWZB!Y&0NU~m zT<%|Jq{AV{Ah9=Oi^rH@l<@#G3CuOih_uPb^u+x~juQZvHC~DG2?h%+gjzhZL8*kIY4N$ zt?V0Imsa+J8Y5y-=>G(sAuYa0E^9G!yETTz1R`mLWNJ4QH(iPT<^Sw8UacP%j-v9=}d41SCJ=H$aXUTS8QN+B+>gU}H`5 zcOPJm+=+b|z&xJWYR`X>PqE|q-yoj*7*QU@e=XW6U)QZM+%1@kn}Ipu2hxuaHZv~3 z8i1VXQDlwncT8e6t`H2H{1CZMa%)3L`QsZ8Am- z(%Oyu({wS*^I5<5_E~@5XHC0po4zA&{I;ibOMhQz9?bawUebC4g#V%<;@%$XW#G+8di)PfME{>=Y2n_8;TKLPdR7zh|Ue^7@~qsQ)~& z1v`OvObT?+0-4*i0@wVEfgBzQ^& zDN6c2B_mACDis7a)`&SgSTMKSww3%bdbyFz|Jl7z+|Ya1Wz0zNaP)|bS!Go=MiF4` zJwcoGXCM!@A)Yg4j6rg0wKV~90z#bDv_%YHZd72dUtq2kFehVdU@qo=PJRnh`Y!g~ z49taXzLLYPwyM%KB_5#;fh_tzqW&W<{v;~89JvOtN%r%=oWB+WIduMl9c~)8MZTR{ zm90V_AorG#R(u6C`}(juqy3zw{3102Q`fF;;(x2|v9s9&X}p(~kQpaQ;-O*@NZOUdfJcgi(dND&1v z7Y;z|3e5cu&xdb-IkvgXGl!d0M#`VyW1?$fi>xM}28I(%JYxI?_1RM=D{RZ^x`a8- za}~2ZpY?lhpY`|clnS*%pG(tj+otb`$8QIeZt3p}Ef35ce%4ZAG}LQlDdPr^@G)}T z2ITNW0pJYCVblbSLYXdG%_qQz$xPhYv}9-sIbuswAczSKnBxQ~My5_O%rW)ri^y+2 zn9G@e4*`nxKL&G04js1iADkX*kr4;TVQ>e#daVAd)i1REV~_>R)W@uhOWDp3O96?H zcK{n6XnP;!r2dEPSUen~y&0>a+1*0jSiFFms|lDh(sT1fVCc*%r}^9%0l5I?LX`>* zJ|q;pLdJh7$N?>!#`=5h)FAww2M}xCW!hT526MXaB^fhLu$CPzF))W`E^liOppE{- zkR|%llMJ1%abnePb^C%e6KyFa7Ecun}7!8lPiM}D1Y3+2+&!6$0(I*Dx zyl0xzwPjk2k+P;$_vAf_>c8Y>g55G*X;uUbMO)T0AF*w_k>3d0B1QA6WR-ymyxolK2~M}bM^A;mc2c+nC1Db|KhYlecTBZYlS`=({9_Q?}*252b6B< z?+eYqoW-1V8JHuF9KpK;?OGB_fLy-^LRn*G1`S#8G$%!cYygn(!~uekpUEMD#YuI; z_QJ56288JO=s=$Zlvf@7M{K?DeP7muqJ^=z#JaI*h7(1 zrmThq?Te)@tIB3qUT!3&%0TcA9@5F>}ShT+IIi1#|p<8q5(hM{1H3 zm<#fQ&cq&!3CIohcDde;HrFhjc})H773R2l>GeD?7h>jelw9{cNXWM@ESR&?NHvrj z$_H`jiNI@{3>pmnZr3q$X)t&DmKBE12Xp;q%plu}!oX=jCi*jOq^rwyo~m~hrHA!5 z?e6lWi@OAKTfe)XmiyM!zvSLS%YCje#m)XU`4^gh9>3llZP&76wMR<-P)NxF}9Kd5rAZS9eGd?Uprxh8iGIO!p z%B9$G! zQZ4=W*n^mUtE+(w!f$#%idD65@GTF_2^>)KGdm7;GS!3YeEsR^6eK-H+#-OE$_^w0 zraT?nKb%^{2opPOvTs06*9HY{v_JsNy|i$~y|D?*(Z3vdPlJz_qxb&Wen?-DG{Rc| zbIjG_vLASbkegx2Df4Xxx#3`sXEKUr}Q8=GEtH?dx=m6xrr;d4H9(H|)#mM#b z*}UzMzGwTE#RhSCbpkK`pbtDo-T@DQ2&gG}Y!r|EJO~tnIqcV$8O$vT%o+cs&)|!l zdKSN?Y#|`I871%^&*rGbT|z97GXiszzS<4=~g%?^~XN%-Q<6nOG zkSz?ZzW#dv=F%X}DIO$cU zm28h*Q`_>BPxdzdKKbMm19RP--LB->Bd)Hh)^#+sYSr862D^LRXfOQ*gvI@rq3+A5 z|9x&!%Etg33m3^aUgwESuN&8jbwV_*=c9TY7B2?Gqu$nL*CB;XfHURnYED$RnuafH-nEZpz~*^7$R3Q{<5Z$6&6!q%;NQ z1mxKMvn@a_?$FT%3|WQuAQ$vYnO$%(dy>dq#B~r^vR+ea20RrX@!+l6?SP z9*|2G4$Natta8|a7&$8u)zU1$LS+Z|E1n9-)o3w8vSNq|6oIO%>m=KdUJE<~BKSU3 zFrsuN0r+3m3J~;riI}+v%(0sRm_u$Rr5~wwGbS4C_cSJ18j}1_F@eenfVoE>JxacD zckR(9kKFa^H-sPh1m?xt#l&dV95+AbftOM~m~A69FhY z&3b#?J$LrB8Sqg}dINK|D%F6D@?1iw$=@$y)+JQkE@aVXcGIiN%`o8+=D+VI|T<1C}(F)gE-{iWQ=_lYzN<@A2{cnl- zFR+C75t0EP5cRXYM$o%tyifPvk9SPeEpXe0;ja?#I#%vZXhnNeK(y@8Ay+1aRCZX; zkCa&9aEMxr%uPHGD9pnphqVemQ}G&(UTDU2go%DNK!_PZB`9>!i_IyLlXef49G#cojgFt`#c)ye@Qd_ znQXH&2AjYfX*xnYmw4v&r@**m5HMFSAXj}-K)Z^xP&KyA+9lA!!j`Qv(vS3N4j@C+ z5;mC^^)xoQ27!3IFB_|?>J%_@f346wE=WFwJUczHe z0K?nL%9F0F?5O0uT(VqdWyL&|xg&aAQYsSA$&%&RbEs8E*y5xTM+b{2; z{>IXhWCs2}W819oig>wxWT?H}D&2IqX%VXhCW}mDsTrqTGs&L8hB%@H_)l7fd19d_LU={IgH=h=kaw*UIZn+E1^@=OZ+FO2$7 z7Qh^f&mqZIujH*mbE`$VjT8Fy(xvE7K=3ufY*I0E)Qt|cqjU1klR&-V^m%i;)|YLFnyr9c|5aLX%{y)EO-+J#1j^;)Pe;y?ggIjlq^A zzB4ZO@7;G-uUvDJ<5RAsu~o7TV1o&#Ibr-l*GyOY5rwIy&Mvs~qI0M9`+A+_zxw=~`hIqL z#_T+5$}kgh}Om-P+$ z$UnE&AARIL{q$1-Hp#8zaVv_!U1;?F$c%r7K+=6(G>=Q#wP&awxh)aZ?TbP$joVKmib2GCR5A}W755V02ynioye;h{f z{0L)!zLBno2-#&JMgJc?dK4M1oltV~Y9Hx0sO?GeS!8iebCJ?YoGyG`3-sqCKhG_A zxqe>r_{G!n?xoWUx(DQ6@6AlRg^6*$eUDepfE*{z1>~gnhmd8`k8o-g8zg>m(8ppD z^}0#6s7>I6+OSYpcdzU0>d6wXyO|4_i1eCrmDoD+t6r7;dROx}C%;?icfE(41$l!~ zp9!)E?@fOj{}XxL1DWjeJ+TeowdmdZ_ua~k8)iQ<(hajy5&yIDgASE0J+0RoC$68J zofD87cHevPCAV>N-TlvZf1RBZ$c^v6|BXTv`iA~{?X^qhnJX>Lr8Wx`utUHUMw%O> za3UUI zYAG1D0hlZRIUmo#i6Pq_kRswJcwKe1l-Cg<>rR0=F+&3!TKxT?ooeaJj~_pF|ET`2 z2+&=;c){JczT|GLi`U{Y#CUA1t%;Yb?v@@|MFJk~tgjobiMRjdZ~od!Vhstb5FxQuo#Q1Uj z%H=EW!mF>^nDG4S<*V-Xi?6%o>&xojEy>A-`nRFy>+1K-r2nhA{_8sObm!)((QTuZ z-6RFWsC8+dg+oqCteA{AYDa95_uu08)BhFObT@Mnm)Uz z_eIQkfBmw%toh4{;_Kr5>gtNSb!*+-zAf3mz3w*neaSzv%zZE(+|!0$Q(&Lxw>1vP zJIQl57#H0;uW#}h$^Z51*DbN=60%)n4j3W-OL`wl<;Cl6 zeFfgFi|@Dm{JpLDYyD7Pks-+xWqa;yXujUobv<9x-~9N;Z@FLn>YoMZ9w!o6yqQ=h z6dDGNzGiweu7sE&88gdk24OrfWO{_i@kfjtCxtm=Qd?bRF`NJH-~GAxf7#uH&+uN0 zTS|0s%AbV5@E_v&UC|rxUvptuJmryj@Rsg%eOa=z=Er93#)`&g+1(Itt{cDLmBwF> z#He1D>|D5TLF2tD{qa)+bcN<|F$(R|N1wW1{L|0Xw+*)_S-ZJ{>?ZQB{%=T*H`cve zBj;X!qDQ^_uP$A4|M%bijljjU7AsoFOXqXioNZbRZEr`Xl}T&D9s!JN0l^K9$_^(h zPr7yiy_bLZBloHR0X1T;XbxP0G#@W%US4K?G8c5uS<>rEnm@0+@`~onWr3mVCL^nw zV?3hI-zY-7cUSY9`HM~PGPmL0+_)pTyJK>HYxSnr``2%n9trZz?}q2dy6Jf4gyelm z#JDgIA#55cU&tZ1C?45+%yo?$e1Rm#(<2IpA$lBKtOP84F~J zaZw+2ZCUe@>s))|_FcECv0K+`Dw?cX|7Eu%V_pxc|5~)>^q~5EZOMS#kAC$3(>Qdx zipoky&DFdb#K=BlC-SLxAjYv)HoVdjKL6#v|Mzwu*jppXhUd2)6It={gihtYu*%izqlmaht-$)~ldfFI7BGeI#b9bT4P{7e*t1$O zbdeKhaLA31j#+t-{=SSUyY@C2Vy(ckH47yWAp2s4lG!RLcE9Nc->uO93(x7d``zi; zSu0WWlIR7kEYB~@x$|>cS!yLiu(z!&1w6l_{=TG@4lCv7MbDWh=A5m3$f|v2Zr)1# zOzK`pC^{hF>XX8UV$X?rPar8SR*jU!$r7K_ia#biFMLOrCJ(FAsfkIO$Z-biTyoG5 z@Vq^x1$ei#*T&xh=#U={v4mA$SlxQ^t5NT9NW2cLfJMK)e@}|@x_Cb4db?WP=upPM z+}KdR8_aau)~b1Q@rIbkL`nsZi4+Q;j#Xo8Yn$uV3ZB(vCZlnJdi%xeKJh#w%8f&s z|C8er0&-W}JOAVDtfwQt?@)pMC)WvF&(gz$;%muu^TxjaAR+N7`&^{og>U;M@4->O zl2tFIswi{Af(tK0w%>e4#LE5G@4jbB_T}$>&tx6B5Ar`F`DZQVEM3@47eNyla(ca&71G48JgVnGAV4OD(mN$(3{zy2`dw6J1K`5sHrc z5@|AKRh4dhY()C=vb%r(orw41d7wO5NM4(a1peO_khtys;`={zb0g#K%+#zqJvHN| zN5|dxAjz=@+#tL{b`$R{e5C$1#&%MCqXH1)A6j~D7oyO3{`k@3L_XhF-_%DuJIqhy z$NJ255s%?s?7a_c{;q2Q@#1+rd;Z`Ar+C?M>2BxLs(_s4t;HT1kmGry^na}@FFh)` z$QY3OA8)^tmE+%t-dBGfK*_ay^7DoH`mTN-ko<%1e8)UhXJ%&1>yKV9MBbymAX^|= z!pn|_5nFKXImy*|$<>0JpPq43W8>0A!&VsqppX3GB{x}4bbXKRGst^iA9JExpV7io zwzyYzm6P@)1Mch7*y+7qy@xlRm_+!)Au+tTETZsiaZe@}$Wc6B3sF{n-qYgdj{DKe zKeYO)b2GD6G@s|A0!8${PkIqO*wckB^n`BANJpYG0dkGaO?J4URWwd!8nAu~2N?)$b@(dW*cxBc@Wfw__45jP+qLipPx zuuV;5_x4-9hV(`LG*WT^W0znq@BY=Rqs zfjHFz9p>@K5u*|jpSQo!eewu+B{40pk34(G{o8N-iGkeLFJ6>lirvIt9x!(h?H_*f zmV4p+X|3{F+{j?BdE|!rF<$MiGXZkch|F%!aLSOS|zq)faoH4jV4 zVaCf-nXViE#rwej!{Yz{_N_m*dXRXE#Dt_bzkltnzy!vtzN%XDr&&C26VIEh62M8x z|M7A!|0erTkbTK}cntD?xJ2>~F$a>*5zb+c%n9+I74`9wa;vydb?msEOzSvx%HsJ* zPtdRV%N!>40`Ws6Jtn4$0D89UC>z)zC0|=r;YPKRzrJ)$hA>{4YfdnpF%@YTPCRqH zGR{YIZ)`K6qq0D*(Hk;b3}eWoLy6mg>ZL>HXQthoZ`@73Z7=O#-CN@S+~|Zmb)w3( z)o5{2tHnxXwW~gM!c|DFj~+0nC*grZ#w=TUlL8zG-g_ZxEq9 zbrlsRM5+2Dkx1|3k+V~((zE`ws`tdjKn~mx zUi@cC8%;C<>Xcd4URaTy`^bmENY|{XkQqsV%-%LI$ z_MGjx09~C{meb>7ZcQr#R%Ux?#H?`t=g*&aT>^9c8khkM2q2BP28#Z(&km3au3HE& zN02wGcih)|1#_%Y*4Nfdsgiuv=QZ=E_Q-h8Bk3SGjYX;mi07O{9Fqd)$n%8yJW0BM z0j-2H{jR@D%BZzn-zPxFDxkW?Rac#~$-*OBG4wx6oII?paaGkP#s5lIDWy^+Bgkio z!KtfeONKyceOA}_K9oh}(c^ARt3TY~Y0q3Cz_t~omGo}uNwvq1KXGrpaofFc&V#w3 zeog}VQ>z$p5{ouTx%id6CNvXU%Bn$Nu0ddq$2v{!8n$gt)>trgrNCWPg~q6g)1kGV z|9X$=4q;623!y>kme}Neu?c}Wp z`LB>psi>^5c>pk?)-9)V?Ub%~UaP-v(DP=ES-ZZ!M@k)|FouUNnYWy_<<#()9?7RQ zsyR!_BTj}I={fV9G#YbLlkO&-?G%{XseA+G*xBfkK{_n3$^BR;3LzmfW?3MIE|t#o zwMv`Kn6bz>Ge76<+}ljR)VuCRf!3xr*U`}AnlWCI+giyq zVJXNja$BQ59*<6QzW(~_=A{ZPeeZ$dR_NMZ+T%|?v7M1Kr{`TubEE6(>~KA@10CuY z3ngL?F~A1FVTc#iW8HQ{R3`F#N)VVq)#%{lW{!)5n(X{h(K;nitl)Ak>?=yoT{yYB=c3t z0T>)996;h^Irg_skDTtOL>HAE>hy>cg)&{OA{H@olM@y~z^VGZG)|*#+`47nICLWb zs3Yk=bGKgouhAmyB#Q&-L--!3TC!zxl=%rB0LV$cPf4zuB>z@*CINC*<5~7Qu1qm1 zUQP`Ti8yh~oYg{HHg&@I9FeYZ-QG8QtTBP_$(+WcIzBw2h5V3t{=21vI;4Mc@{`m3 zelah7uX(`2l4S2}U*px>z9H{{eEVF$T>P_zC^Wzv`}Meak7#88n6oqmq5$Ry8b^Rg zv8k2xhD^n{22@|U{ zJ3^lbQ@vKfAx%LX6l%#8MdaTh-oOl)2;oB*S)JMzp@a}>6$r8KmXbR?J7<%bEt$}M zpTHd3V|Q;;Xn9^dZ+87X9Tp=OfE)`CVkO`|UWhc9!#mg5s7Ws(PgSi9V2y!iJ}Z9f zbItlp%zwP0ttbjTpBMjc%9t{bejgiw$#~|TKYPwj%=NPkD)|S@wWZ{rLsOpr#pR#V zg=QQ?%#~1tp6{_!j3Nw;C1lp`kbZ&rH$UpDYH)(h5-tyro`y6vx<;Nhy+5m!JC9UT z0OSFvIFv$d-u;8QE;}_`ExqXvis`=aN=SziW6rEDr_%_cfLO9DR)x(liHYF0=2fY zu}3h+)t$`#Yz%M0+tAqVyD9rItHm^O(bm%H+65+JL+lA7ES_pULOC$kYcX=aiTZEc ziuxBf-|u|>0p{4gQ-ELk0B7+A-vaseg#vRZqX6bgN)Ou#fqYZ3XU@PJBxbZp5W7gRpp_F_ z6~v(+OnA8V(g1VB%q?g#0p0*~P#VYu+6kE3>VB<77cfQyOTT#joTUQ*%#oy$Q!z1^ zn*+#k(n`;*)Dl7_!(peeBurC-BT@u|TJZzqIR5TBY_EIz52G1xh6;?S3-apIWTzGvrW#B(W&_7*$r5P%#j zLV{jBnBMG}i@{v*($&`FfJY(zv-0k4_uD{c#s7_48#a%A9~<+Bpl@P@ka_rGyeTCA zS^g*TFP*X%`G@~_zsIG(Nv69nKH*M_NFL3+oD#qT%uQ>h&fMfPzNV?boSp;l0CQ}? z5_7{L58}A8Z4Y3Mlfg%%KgrpL&NR|u*Lx&lAm=mllRuH|UQVqRoxeK(bM*V>%8HvA zo3L%}R>?3S9xU`4#czVWjpvE3319-x5Zl^#6gdc!HfG!1KUZSfYlD9T-m}ezx5R+E z#u#7`%M7oP1y7s7+`l|bfjN=?m*4#T~`rwsg(UH^poB5v)=JXlaS`G*pm@6PZc^)mv4%DZ4#;H{f1Z=xAR%F2T#(&+1 zUI(C;1FQPn7X7DU%|M6xFVKZYj`_GSHg5A4kZhHnAiW2mn}GtDgR)@G+vM3X&1Dv5 zn(Hhg*;-{G(A>n1i`OLqGsOIdzz=MB7s|#_ylrOS7Y@vYZC1eC$?8fIta_noz#MK; zwp7`YAkPom8YFPE+&?m!1QhQV%&{_m?|7)pM}Kx1pW9k}@Y26G>}^_#0&Sx$)8)duLyYYdRHRUx1t zF=+79#sXgFgE<~~U9ao)bzYGb<-d53^61i7pBMjc3(VnR_-)|9Jnpd(0CuH3Uc-Hy{_loG*oz0J%ZUPr%%; zt|x}q7G5$OY`YRa_uQG&wiwtCnB!z(FZ#3Wh=IB6){+(xwzZ`D>Xc5y8%Hu%PTTSO z85!n6zwg1Cr|rNT;T4<&92d|ydAz~^T(fv~N(&NV78~?v{DjwyGGw9#(SE?3u4H?{ zJNwZd{O+>)KdN!5RR4)*3aOU1p)|8MyobfdU<_yTiul0OO{!1AR_YYWn z44zRuQ+t*FFMC6O5HrZBRSr8K_i6dh8UWFre-t(+Gsh(VlqQ-U8P_}qc26hYPSPZkXQ3{x=u2P>dWHnZ$BN$>9z<2|xi#a1* zM~*mtAI~7$yqxw7&4V>h0nBAzClnfBj-;{3>sw*zy?y~UTw?ppeeM1Ig=-lOZ~hd_Vi zhwVi?TOu&%t5@SqJxDw;XDDv4Gma~9hGT@w1^_-W_z>jt`>ZO{|4klUrNth{4+bD(6V4o zAgxT3yH=AtqyPz?IRvV^wbi_FD8XqB0wqGI?Z)w7^4RP(W{%&#p_Rd)2JYz5qZTg% z^TQy(_^=HVwqhUxFBy#Oz+7l~llgb~lNryVO=jJXfjJ2e#hpn!XuvK2y2vvZ0No@j z1M#I(s{$r7aS~?4GzoY_xNu!JHs$xfy`ScKAW&56DCX|gp?Sh0V$3#O=64~ zhb=NvBIoB%`Tz5l*{qES&GFK;KYNxI>k;(Oi zEZf$BO>}`YcrTv%I*xdRxTbMQUgIU=bDR0!=K3{9MkS|HQbvq}H^vLbe~$V8J~nR* z#DD37OhW8iYbyo8oWZ3XfVrh>*DPI2`H@mP zEqNghhwbYS;7uM zk`2j-Ct{vzr2olgApOs2#FYLIExwN&<@jeY(^?FZUJ5WbCNSsqJ~lw|GU~VJ=e1zq z5ugW<8`bX)31G3+*(tE%^O#A7)n5Z}2I74G1DFV8bz(IhY_l53Ho50B`n+szy<`V4 z#O?x>a54fy=FwH3SP0A}@+jeaM*h7= zj##&_wW|AIJ6rR4R@dhNbb4*`SNFzNs{uLPGc~KJy$z^iyOsK@Bm<__YHuecRGnp9 zlkeMyM|VpjAuZkANJyC=-O?b8u7M~m4G!rR5%^J~Q({PmbO|^*MvdH_`~UKJy%+oJ zv+KU@>pIWlJicq8`VwJ9wKg%TJQ#ko2G;0jcLtXmkrio)QxXD%x`)~;;S~Kp_}YDV z-cPF&}G8;}HTbDsh~Jif%<8fJ-5ja7pmKbjQ7*nKDn( z`D>;)3#)t#Q3@qR5r}7#i1qsMqc8C4AFvVD2GWCcaP{NyrV%}uLu1%ANiq%=t1Hb9+|f)TQpZx2KbSnm z1`7qgu#G&TE^Mkj=g9+GPtRw2dD$%(Z^+qYc#=9W1p_wL!5Gm*@t=O`lwjv=Et=yO zvrZJK6#FiyD%cvNksigPc7>(<`4*TFtyJu|2S3i?WhY=rL;uEZtud4lT#oG`dMNs! zY)JdN9Pgn)2r4jr)sHC@D6{U&-?map`ISRx3c#|ViPq22SU#ghku4wu@Fw{;)1ll@ z=nWeEn{8i}=}tZSqukKX$h;w3L*A?#Zvy9ow6<>B1pm_W@c8C2Y78DOIH9JN*FMOE z@Z$yRmtcjbYl~~Hy2M+VYNUwq32x7|un0MGMh9{H@sFZveEy&p>{c--e^P||*%_q~ zB3GQ$CW-6Q&kT~tR>n^*`sz}`wx#b2jS1|-l#(_(rHlT^z_PHRBZkhnmiUQgFmKF3 zp(J$1bX%%^0Lp_K?Y{>mzlLTO~vHsG|QAi&Lnz(bKiyb%H~(D!cPCo`kprxe}0$gzo@#UNICFA`9(!> zM2+fwUw2SQW@?5R_|w>Tu!#l?yb@%Q`*feaW2l&+AJVzWkMGlt2bSKs>{bsY1e!4S z&maw}e%El@nFCv^!37a$z7D<&G#j zht47P_8An9-J}BpysQ1X-LWc6IaD7vm2_&?{31*J7PVSbDl#WCOle*dA*aw|f7=}h z)ei06gYlxZ<*C)ZZdrV!7O#UNSZwvUBBH(2&>mKU;Mb3OnDgb~RtFN4MKmBe;+=+0 z`I-~vV&`zT2DhQbeqsIk#}>S6Iac#0UW4F(;gx)qY#eXb_f|j= zGAGkQ2Gm-E;7K6r$#eHs=UK3toS|7d=HCn95OwNzJI*vQbOQ2$UEF(HZ zm+sL(Jeo?jY==;eJyEH?o_VAf;pK9(kkkc)@q%Gv1JYI3Zohd<<;2N(R8AEcarofS z$ky3~?Ek^VX!AHZ{&aprBcf5$a%8U>4wwP!b$LhzaMl{h>E^Z-gPwZFoKZkW!lT8g zXwxu^%lp%I`0P&RKU+QK82a(VOE`#C$u}>dbXqK|Kji)UV7#@aa(ygN`=nAot(8ra zQputhGOUkWpUKS4Zh!3LWT#hD=!n*d?A_BkQygIZ;18cX_ z7<>#}(oog;lZ9~RJba%$G_Xpoa5O_*sb8h}rpV4K`Y={GtA55k^xP$oEFR!~7#sWv z`HxZMQQNxjG7TpE=BPI}-whf1gO1(g0G_Aw8z=+kE|k~WRx#b|oZ_5$sV21!ujr^+ zc~f68ID};8iNav!78TcXef~AKdb!^{+_dGxM$iecw1Q2KhJMI<8{zzY z|Cr0skF4h3L>=6P{MxA)>vf4zTLW<7Zn&OHipGeywW4q+g9cScx!>1JviEB-5ZjQW zM5Cy7bc=OAJ*d#U&j9Q5X|F5azOeDsusI%enYRx@;98^;>5qQGdN=jcn83X`iDZG? zKR~X2togsECEaG(sZi-aHoK)+h_NlzVkyE(im1g}F_5Ji5$lJa%o44CpPz~aXv2q7 zzM!@k@kY4`*kO3!8|oB{E9RmU*l2ok*WZ`H{!2d68B~2v@Q-FBDH$vE%<*0lpU${& zLOl=(=NtkWq1&WzmqRRXA_HAIKJ2ySNbv!N6H9dWp^z6E8xfmL(m{Xp4o&m)DMrvP z?QcoU`NQye1L&=W;jy zJ5yBZ4|+D>C`~6}f;&2Z(oXPmT8Zg^P<`Oj9ALU(6lx+_4&~nOzI9A6o8o6YRE1F{ zd~cH%L`-4&75`mp>r2M0#M7YuGTS7{ckW0g1Nny2C!=2Opid_5`Xn+id4k}!F|7^1 zCnrz6Q_1!TY{qfqI;P@|;~bd8LG&~z=dG<1vSgMR_N7XBP16QkcwI!U+Q~*H&36uh zr$`^J6-P1MxGG5~iQ>BM_a3X8Wb%Jjm42&yqD~c_mvYY&UuJ!|P@svB9`2ktfgV8U zM!C<^hCs)5eNi48M&S1r>oQ#JdS$US2(5XZ)m2UFRMaO7M+f^@2;XjzsoGLt&JSY@rZOjT&znDT0e0aiZ&8|Mdz=x`7P_gcOhcR-pftw5ixpABJBN_Sk2t zt=KfHTIAs7(FS@rey%cB`5_=6G?#M!uIL2st~PFhzg{)#A;;~OrC{fR?Bg83t5zVp z=dUOBl=cPHao1>Ym1py)Fy{RjuJ^?$V(@9iaEGa2ckUPLzbp}_HpTtd3`QFa{obdM zZe6FXJuIbv93FSj6aHmT-l#P=OSU^n7bMknNqUYLivEt;|HsBIv#{)eWa1iIOTLFJ zF4rJVShox06LQzc&yo){Xv{|SFH(zb7sg1VX~UJFzjPS(AGGz-xF>H^$V%@~`wdzf1K*;SqpcXd zufkzcJuF``A8Q>NbzKe}Ur*U1ir6`xBA=F8vvY%h9MaAwxRr*9ENo0ZBMExPQ5jC| z6=XbC0P)jjv6COX&o4p9{ysL-?eJ$D?BfR6^nV+lwW)_$h=B!V8cGGO3&ABO{5= ze}`FiX=szTYXo;|7O40iLK&5e{i_)o1u?%E0{3aLw)dYJnT1#W<3_4988p5YMZI<2 z<_GqTW!#^FSRas;<@iY238Qr5euGypzPx(QHB=)TzLJ@l)oPy>X4iFEpGKJjeUu(F zjGfE}{;o|-&u(Jk*JnIog$^ht?FtrBfHD|~JAhchm{ouqJDRxe1gFCF~g>?Y`tm;&G8=q=rZaSBD7$%+K8)z5!0>8YE%-65Q zW%!fF5f7`}!Pncb=gNuSkWY?@MN#%uV{Il6+z&#cG49NmGL_0h8^3(c`nG1rGSgr) z6#7d=*I!r1Pa;QpkmK%ZG05HBPhk<8;-sL(7Xp)@XP_q_lE}pLKeTC86_x=3?dDci zK1k0I&*lHwxcuJ(AM>4ekxXJCWG^(oQ=KatY9`6VKhnv~txa3y`)WWe-W``F#z(b| zvk2V{XZ$KYM(|VwYu7#J?d|7hT3%mO6CGeNL4|mPXX*y8=&O*GS zrmKPE=B!n2ZOanh;OZU|$Dme)r;m+far~PtY`RAG7hZYER)FJQPU=yfZ!@o7M`J0u z(o_Uo5jWdNfjg96h{ljyBDaQ)aUPWRVWj;t*MPA-DKk^QBvKWR8yTI!+-`p#*Qu)9Z_I>EnHA?}e;G`3n zpk5h*9y{5-UxJOpRq&83CnPkX@2c=Jx)}pLy`9iCQM27;<>|T}#$<+7lX4`8BTf(KMRX{-9uL#{bUwbB=nBC+ZVtRm%VA~C`kSi!`(h#M zmGp!9b}C7PMDF_mzJko3)fU!103zMBtqfPZ-77+r!ow4Waz_cUbvQ8*a@WzhTQ0kF zwSNQHt$rPNBD)2O{P+H2VqDKfcbpIw@1W!!rEvOI@OEI>!cV)Df*@)MmSb&dBr$`DWw3iVfIcC%^PFC_~(Fj4ewCAp6$a@0e7mW0|LRIzr&Q z4Me&SNEpVlIe062%#Eah3Yw!I!7@Q0nQt+~Nsxl`pDO-tsY0xfms2F~&6j`5$<%0Y za^%ND3FWYF6eaeYp25M>V-pi?4Nlx!JEf?J_(_%XX*uw;68Ib+ty@BUc!IJD?e%}Z z2Dokw>{XG0s=p)8*;a?0PI>l&0-V~JnHhZ=UcZL@8kiFaGB2Q?vcC1Y1>24v6KuFA z@4jjmNnP8Kf{-u{P6mt_8ZNy103v&_Dqx94^?E`3K6j9}q$_7kXb?g*ALS7ZzpFq^zxBo;| zE5vt0TtHa26dG#q7R5agO*Z@byBEL_$2&Ct05C;m$@=S}I=W!4Vz{_XXF8DTiDu7l z1jolm=CEotrPsu>>2wjLdAWRB;fE)ei>g1{=I4!9;+5MqyJx#cYC91%9q2Z|sVZnz zu$yxWy;!~_uk`wggH*OJQfAs?y(T@W6GzDLn}J{l7YfOkgMD86p3a{+=6Thf|H=+F zG0ev%-PdK;*YJqc3ebj62Ii@DGPjD#XH1nqS^>#ivfC!_qgxm83`+55gLfk){TLJL zsg~6bnCoPW^KxE@3;d)u{89k5#fDjM*r40;zk?}ldUF;@1`+-xt22%K$g)9u+e=~P zUv2jH?VC5xdqGRGtxJ5Md7Ij!44Qec@LB?PpALsSzS@6qB*uVjInNOV-e_Y>Kc>Y;0^F4eV9=m+ z{;F#&ifx4HAcqNMzMHeWpL00tu_&-5CQq=++0_>?_|f}`spQFGXDmu!y5LlK2r^7@ zE1vea#NZwSMs{o5*EV|Gc-)96&n6JK`vvGBFq;5-y^T!sebPp?ERdb5f9l+pe)rt{ z=iZxDlmDvgtjK%@9!`})*{s0FG|LH{188-{ZXPsVHgQMt4cqH`<$gsqbe+(G$i>2y z5G=RrF&}j6#Mm*Gw^1CQKfoVGRQb_Zt(bjUc%IYYIcxEnXLVvoFi;ye(XPNF1H3My zo#*2U(VH`Hr9jw%77%zLg)tM5QW{D*8j`TjfA(Pf?%83+_5DK#iVUt4fX-#!J@5m# z9WzIwOOn-dcsw8vV4JO_#cHA~no)l!`PR4|gq8zjEQ_5Lw9*2)?M~*Ah~21|C%0G1 z7hNHzIj9HDTEB9OI-ig zeEKud4ew2r?oyZ>}0UhHk9_=R%#EbhGX9Hu(V!gi+(U)N&WFmmsxRYD;3dfv# z%#AicOF*8LA2}#R{TzitEgQQQF5E3nPyfh#vH@J|RE16cM7m|{)Pqbxc_3C>+)?CHb$FIOeqbVh>s4>mI&=s%gR6s4hKWLubDNbyTnC@|vTmU6 zXuKPWH#+D`#*bZ)>YHwV`$gk3<6cLb9&!;XCrK{GA_qEK>e5tp=e&2k2?2cq2{F$m zmY2-*Yl@DK4NKM>{urUv%^yni{2uQg9r@t&OL|XF!nUfW zifq{^`<0+0NR|KV^B(`XajrsxO@20ir`B=I#lr(OJtM+?`z<_navgp)+g}O{b>BfW zZ^3S18J#r~-2!MVhAvFr$vb$D%b1+_BSn#5HSj53enNBLyYVekQ)rX+Ih|Ud$!TNm zrPXZE-coj@OBG?CFhwSwZ0`2W!6iZ2g#Hj0t678vr!5IKanof)98*XV{q7qYtZO+V z%GpBHX>3!I)UxbfT?PC6$G3d1x^)(Dr%qHmoTSyl#?#QAR`>Zlt1mXcFu#E?I>8jo zb#+4GKigPp?mHQjDVSN=`FJBY@fr#ucLuImU*DS!3Iv8mnMmvPa>lO(MWFw-!Vv=+ zr~}mT@{dggh9DP0RgU<<81ZJmqFXio zc^d5z1KS1>FEPVl&D7T$-;_em2&pKXJkQIu%(Ii7&uU0W+aV9u!_8qq<{+QXxDs@~ zt}P#pd`_VEcmmnVF*1E2Sx3V$7af>P-Kmw7l%Z3@Wxfqo@ZEJm4Xxj5kSuiu{(Xz; z>N&Dv@=4Yv-+I>ZXt}T&_q&YrlC(VcT5Q=9L-EIVl=*>qXq^^L_%TUhpz3NR@GQ{^0_G6GuM#EZPDHE&gG7(u*`7x_wNalfZW zMxQpmdBgIRMHj)nZWX{R5drT^-Xz^~YmnVkC#;r6%Np4A*?cxXRJGL&BhpE>leWAi44R^mdcX~BELuy&sQ&WOI_tQk+ zCi}mLXc5G!REtcdoS7?eqk}j;TsnxE4ujXN?V8O5!=eX1?43m8dV+jTBaS)}2Wi-~ z^WXk{bMx!fKAWmx7{?r)Xp9BuVt&q;#!xx#s+N3WcVYLt!>dqzpPF6_F%kp)-%@-o zeTTnZISTem|a#jqA4pzT@6Lhsd-Zc7q6Mja zvvknoHQ9od=_omBMH9Wh2CmP#y2_F3TP}UI%jq7Y7@0B^WSjl>VVr2~Bt;X!jm<*8 z2y?!dIzNq0TV|hkO?`cf>yzWIXI(7wY+FbZ@#P{n!V8`BL$?3u)cnyM?AsV8wu>Th zVd@{{Nzx6WBEdpEz+|lX%6fzB3HLMY7*MJzjf=o(+Jeg)M4^K+JgoZrX5iX6v$0QEf-}&KujAs9{`D(KC4{sG zA3hR~F@btT5G!s-NjpukZ3-#UQY;#dt>pkAC9J$yD3@eP5ca0r25~Y=enW4hzE5B1 z+SmHb;WapN-Qz_NOOk z>psbB5IN+p(^;)84SxLfzq-clTx>D`c@L#xkbMygo==fHrLhJnpXvGtM`P0z$^}gF$|}(H?J!% zhAP-1nV9hwn7AjfJ^ZkJnxsOFpI0WWc;DENXQR$)4}!;R3GB8%Af3!}OQmuS1hka} zy1$ZGZis}Rn45LMN{-CT@@F0~5g45cQW;0mlY6n?rj+!v+Uo}i`KY}*PkT4aFpAXa z>XnaFvWrZ)CC`d2B5d->O0iPsbmJUj_P-Rfk9^u_msnVRd5N)%U1c69CC=qA|Bt4^~8 zADyyM@V5yMLADtq%I~I?+z~3QQ-p9v43-bm*I??Ko$GZ0G|JzvgOHR{AyNx(7 z`y}*)NQm#_DzHrXz{XiWM|By+e*F0}t5f{u8O&_1-;tU?bO*eaqSn5OPEs8UwaTzn1D5$94Y%Ug>&Ro$Z;r3YEJ<)by^@> z-YL1Q9EcEo6VW1>g42(uYC<`h_oSw5F@hPC6zc6RQ`isk7Bh7uNQV?i{6?uLq2(Ok z#QF@r66yAwn?B1dUxhU)R`5$AR0uf6N5|TYBXh^+q&Z#Nr2j_Jey>=eNH+G-6}OEm zrpcD>DW9*iu>E=X!mJOn;20yhFkq>iwd zli;OPf3;K;+0`$=3wrwB!uQYAgD~TVK6~|nME7;lQK{B%=}mOv8sU>;HZ`IX7uM5u zXeG%T-tt6W%2Itmie-|@5{|Rqd})nJ#RjqhU_6UNdoRNC(* z0Jn)?eUjA@KA`>RZlQ=_W^%>l+Q;Q$8o>C=%+7Oy1V6~}geO`&NW$f34H#&lfadIN~2>&^T1F1~qN1@(J97KOk4Lk0=qn>h-WH*-+gSp{;edo1We&*Yma$-gM5 z5Z;C^A%Mo0Xfwla#>aIYSUjpq`I-M!vtz@Xq;86D04$A2Zg{I7iCI2iru)EPX8Y_v zDW%G*sTea;PcEC95`%c|5+Y`plHzv>iaeg{QXbjoKznYS`TPz36}F8b=KM`5a@@Fa zISc);`l^lg0N`9-8{qa~BNmJYG^jpWnr3ro;BS`_#!Bs-9QsD3aTuRX6yTGdP>g!J z`nkIPR?R6Rckz_|7Zv$M%|gF}jS#qA)YP$Z^Ei&sRb?2BuUGW5VtZCqTvvwpu4{{K~hMjmSETUAIRf`R_07#HCniS5r4Bp00;kd#2 z{`pAaB&t(~fRa+yEIf1r+%>+qGpR*8^PeY_?_vGIys zW8-5yPMCONh9MBCka3^RITh8yH1%GTV8Pv|>1|WZ#fQosmi$%$e+Gd@^?Tw{Ok9fn zy1JYO&=naV9pzRX=R=NHyKTW8TiwP!YH$P7T zr999@%W)JA8)wue#A~DbRv3+Qh2M7PW?tyY96R;moK#+>bnB50gWVhLUt-Oy%YIp4|1dMv`e*K^pjfqL>k4C&qMLsD{40UlZcH;IszQ{KC z*Fwx6d9(Cj zZttqhUuj4?b>_l^f7(nT5_{V3yv0S_D`#zj?P8WN^R-M9`T~9&<^XVP>8{y~8AvBvOlLudJx{Ltt}tdG1wa-3b?L*rVQs5i=J# zFw+2`)BE1{N)1xLUen&y=ui=z{Pl5@d>Oox0DSXM;cf-{w2*Z_|FP@1^x9eoJs*cz zr6N zy}!IJCYhKuHLw%c0guWx_7U5-1-~Lg3Fp%$idST70k)4aLe--Bw8ReZ&yD-6gOq`e zMj0v7G#kT)G#~E9+`6?;$c;v}+uvZZB@aCe+LM1Z{&J`%ce_ISd39rk&%1B^X4Q~Hub%Zx0cVfe@V@ zhJ|DEOqL*0N3i80aj;}zZ^HzIS*3f-C&hw=Iwc0OxNHnnJ*^6I=69-R86YKYpjN8L zLadJEv|i~4Et+T;R#28jf}nxs**hok@wxEYycFiaZ5E3YGc~1Nri@24yp4F$EAb4w@2F>mz6t2k^{C?S zv0{-MnlDNd5YvfP>|jlPW{`&w;Y+6GNa+rXXySkHdG|T1b7!~f7bX5}aZ}*WpC^^Z zKQXYer#BoJnu-Qj*B_*C4h0S^a`quQ8Y!%oDGsoqb`X>^r1=leDgl(Uj_<9Ktn`G- zA6aQ~(9oPfqZIV~6G6EyV6R`e;?SDihN$8*YA7ndSKE=hS$_;AVG-<~s9oM!o`i6X zA5C1C65|^l?AUFc{fpV~!U2mf^rqO(irOh_5w@PQDr^@x)cG$IiP*FE#78p|>4Ug% z-F2v0{IU9)1fetwID|rpFH2~FR+n)%Gc9HD8ds&btWG}=b~F!*NcFlDD*$=JyD9+0 z>eX>@J4uwBzzOcNzTwxkY$>+u*iieIT4ofA$M`Qw&=XY{uzfwVE=F5?Z>Ep6-?2BB zZ*)l2Hb3~x=E>xH^lQ^X<9iiuG|*fF9(WPktZ)~kYcka}zdAnRH!h-)Fnro(+#k^>%ct}T;cB=! z(;`(r_1Td|eZm3pGlzkqSvwto@H@ES8*r5)aS=wf@x zMydUirQhzUyT{P-a^$HZQ;PE}X9gZsB<6AxQgUrX-r|`s^-ZgyiUNW4tRUg*1=Yv- zh!#~BQKzz1N&iE5N?&PryLNEVFC4iU<~2@wAmG5JKA5|x1w(05qiK^w{R$w3BF~s> zXXML8@lK4LDaxAN#n#ewdsr9=xK0YFFk>7~&|8vwE*@zsqi}RM8G@YWy`fgdEBeC+ zW@y!qjEFSlz9D$3OicA#J3PU0P7Xs~yHR+oK|bur4$<}9g9e&jFD6xKfURD-e+a*E)b2s5g(-)<6f6&+{ww9a`1;Quv{AI$2Kbmlak zepGdDpq2w?2gZIDqn+W zE75c~;BBLRX9CfHqu))64~`ysSYwv#?}f<_Eh@{48*8F#PmbN(RaF~JR2zR4;5re+ zqBZalvk>PB8*;P;$OVR4Si89A)tV~!hO6`G5I03=^sje6gzg9!uB$`u43cj45OF+V znJcW377M@lV|TZY9ed92=Knuj&7K#lwM20?9S;nL6bNK0&Ke)E`V%4mWF{RiQjS{Z zHPyEN)Auzmy3bwGRl{|e9sv2W6Fwp-i$%o6cT5L8+C8Bxa0*rO zf3j2aClsoLqpNZtQEeCDM6u`8pI__8;S-+>*^u|8yo-;|GOikydot+)a04xSbz(AQ zchFg4@SC&A)iu{==QB3K%=5OPqZKRN_W@m=M&%qTvq9Vl07|JTUjpS2sA7AiWv=*h zmmYlSIEl2-NhHqJPMWq_%|i@xzhJd=@%AA~!FjYDR0C23B3Nn`{lYw{S4(cBN>9do z8_jwl7Zf)q@Guh*Q7YKG2DN>~!3=z`_|iXaZLm!Z)TyH|0wElFVM{zp)Kh<5cGCM{ z8T(yySYgGCp(wTXvycAPC2!bOQN7r|y&4dzn(VNL%~ld9e5d=^dbad#{LI>>H=_Uh zty(UN>PIA{N(I3k&BRV2QiTlR-cCE2mq<@yq`F^7SKirwJ#5$*TVdeGgkoBUoB+s_ z;e)v9S56p@{g28TDyXnT@~Kphg}X}ZTm9F?UmG%Rzf$=76jn2Qri*F?w8Yze1;@$P zB1>5qGx+wkk+T~1_D0wSTl^ zxRp%`Vhxno4ed&a#a*%+vj@I$&wR4=9!Mz>kCc0*r+9lklHHp<%N2+)oX~IgH)vDC zqJ)|8#)7Gkp^eSv^9quw<`&u#QcMRHfOk(I2(gUsTnq5O9ajmnc6GyXO+!*<51My@&>2u7P!{a1~jX_7sM>i#5~D2dM@VO*wx-CC;x?( z`-@?O1&2~9>sM?xpf!+ml&+n;GJVONU@2cbAh>uKrA=~5mv*dDO;GX@gGx-iWRFPca?`wZQa!J#s9wA<66gjnQ><1d zp~5uMhhRW5ekHF56n+H%#6C58)2d;_=AU;2NES?1huFe$KR5&&Axo00`Q-hK+nXY` zJ_!*hV5iu7EB-{I{F+9rB;CSwA@NQIf#O);VtEAj+t0AV`@1PAAtszf+jN6_dKJ7U z<#MgRIUlfeNIz^uS_I-?`$Win(ZEFr`j68g!#nC@4CLiK+?bR3cpa*hYp*95KEMH9 zSru!8{)yfG_n$BPOK0u=WYq|@C9AB|KIlZ{t+%Z|977!WBT86wfXnER%Tm&~FbWW| zug1~5d75gqf`>8fS!Qsyf|@M#_$Ke^7*;2dj3$p{nO#!+h#-WM`T4g9Baw#}8Fc4W zcQu9S_|E23esCP*?YUb{6B;Y3l>lM-M3`K3er@49Z7f5Q_UAuD0>2&JGSZ}H4eKHQ zvUMZ1&OEHUw89n1MN<^Mmv2JdW;74}@+ssG8&`{)RBz2p_J{8Q%>@be;8 z;r>Vk47vCMv9B7bG7*N1tJj4k3?Leg8UJm(%L_X&hd6V$eLw7xCXPtj?&%*>{v?t85*%p1F7QKBW_Q1I7G zw^G6T@Y8@U70%4enyooM;-v#ex}cSM4gZLYqfLzr78twapg+`|3^Bb$wR>>2y}ZBl zt!z$C9|{^Y?P13U|9!*9DhCq{Bc|N^gsY|59|J29pk`Nl27+x0ar{Tu!=r&njf%#5 z^l`^Jg3KrtOAbQ$#9dphV-Q5XAA;p`WKe4Gx6z}?tuM!s|HThWN5{_sA|lP-vU5`u zbJOmqtE%Hh4i;uUBCO9hcFISn5VvcX#ecuL|@Z z%v3m5(J}cLhHgwmQ3+dlzace$2J=*?=l962$t#>$*NCbUN~zu>*0i=lEybNqjc+5| zbW6Q))A~jxSs0EO7Ap?&|2|j0J&%n)!Qb}vkVZ~>6Mh_$r6u(SXPh$~9!jr%_Go14 zoW7A`uh_9jCzX7zrI>P#v=?JcNgw?Wg5kn9Nkpl9jnmgRLlNaSDIc|xj)50p??t^N8UD;psS2dFwe z=sc_cR>Js#3`6s?bNrlkHg-A&hV%0CVS&YL9oNMn2Um~VyMaRR7e(;a))xM*yu7?1 zIiB4?rlKL`L~GWtL*ilB+Dv?7S>58MwN9#P;(E*WI&A3l2iKWOW!IU`A{!|!QYDb7 z9;;&tD|QvAEj9gBK~ZfxX=j`k?A)bd9;Cy+uCM>V0Mj!0m(7HDH_dW|6JETSd>@EC z7o+ra$kjL0pIY@WV&4;VSis+=d5fBukk<#p6&qk3f$t>c)NLAcRBO;3?m%5?K zx0_CK3{e2W=w!M1k4SNY|E#R0)EZCJj-B3a`__R03CG$t{FCoX zHmv}P!>3~ZSd8R3PjgdDv`qW^Vs3l{lDy59eR4iKvm+0rqX5Q@+dzYJ)N06y!_6}m zmKz!HBV_(g+u%+iYOVbQpu}>Vk{Dd+)G{ivCg z8Pg|(W590rAkV0^(F(;0$u_p{v(8mZPtXK~;=e+i%*P-wRSL=43z+d3CvTTgRq_m? zdZg3HR3u_Wb3KBY?nL}eIed^W{zMA97=K&+r$uKZ18WdjAW#sE2V@7EKEP$d=J>lR zO@*B`DJokgad=BRS>w`zzyfAs-_OOvHI-nP#L>?PsZ=ZG!1fHqLY>o4@VOk|f>H#%0o{_$Maz9*2 zM80amko2ncr1LZvXknoa0sy!RO&Io3*2O$=lDD5xJZ4H|pu^pY!po?@h{Q|<6++N8 z7W}YO%(E8ZCTsc+Us9FtvEk#i<=D4e%h)g}cD0I&VHR`4HsznX(hAB5^sx#$)4a87 z*VF4~`GG1*tRaKsjH_`3h4{h8$7G@Sc^K|qc$>A@3k6e=i4dOw{Te<}^ zmq7kJ6O{=iB*m$|w{{_p^_JHCIc|4gp8GiZI5NH4y~-*LEATQCqaD^}XG7lh;qTiJ3yZe* zts$~!kJq9WlD3y#`CvlnYrkH0x{Zu@YIFxVd91Elb~^$F&9+V+eu+4_leM;gYYPja zAG-xM1)lX`ZoYPZNLC3Ot>*SPxJzEHXu}jd%mCEk@y(wE`k&6|;vP9(O-A02;MPHV z4zz@{JJ>2qt>t@ng|l+g^U45{DI-ILT0OeJZ7I~R1II7t<^jiT5cG|R0mr{f89iO? z1W6w8t!_bd=h<(8Ir>}Ihb|xPL(k?%^tY(~dQ^`CjiP=aDiR4hGJ4q( zZJ~QYJ>vM5P&3r?)jXfR3Rgtm|5~N7Vs4Gq!>%~qeo|7#+U=GnnA3k>#}o_>*}$}> z&2s#|hgIx*L$7>qrX6!cOt`gosRH3!9%HNR&7N%v&7}#NiroVF)X#BN=fJKm_*S(m zEyrje`jeUDHHTpD@5lRHIz!VU8eXb3&s29G)pwo-`EDA^w$CYhmkCa*%AWp;Vi}a z64Y2a0maiQ+*yTH>xTi%u`zvZPUx?L_B6Nju;GhUzc0OQgHbo^#KE+d@vA+a*=Wdp z90C|_fRqPYzKKXPy1uzHD#uu-DhFBmcr)e+hikNo5q6;Zp%!$QpnfaCk@5A}fESGr z9Mhs&c-(EW(kb}OIdiMo{7$LFS4UptZ;utTrZg)7vqvkl2RUXewKXdrMr5*9{Qky2 zTXgi*Wk(!mj+jVY(XakMTu+2wH58L9y+gg{4@#!12~!sOpakq3#0b@EH<>KF--8|r zsY)INRLlcWeR0N8)c!vBY79~-gNn|A0<;K2ZQl=$=^M6)8T{lh zIE_^PJ$?~15j&|=hwU&!(SM*^JqkzRB6AOvw9FXc3xfp*(_GF!RsNOpR*V)#&T5P> zw_r!nHe{fb!|p4qgMl>kuDgxDcbmgFdYO?s2|fDVOgbGTDQos`BNA@AjIRh6`um{< z+ch=*^SlFwL6R%zpB9Ow(2z?V;^c5Fe9mhBcVjesWSEIKr-`w#c6tQ8X2t4x@b=}6 zX@}{#@$LQq5QLeqGybh2p^*>JG~=NL^Oj+0!%{r%$h+hm>+I^bxJq3Kt30zWj<@%+ zm-Wx3p94(@jDixTf`^C9y#wGC7c;3{Ty zad8>HqShfQ3R>Zz@vpB}!Y)HzM&lSgZ+`?E?hexKxZmQ4JpJbI&zgk6t^i);r)3Z8 zs&_?En_Vdrzi6XHK)SEjMOyc0PLS-bq{z5oznxh2mSo%edKf&AvlrfRF-B0io z#iTqdmgH$}c2r5v^3ySfU#D1X2qLa62yb|Aehg#!TaeTg6h7T$_X$?A;6cR>r?D-C zgK?q4kP9@>D)xzL*s`IPQsK8-?@iLolUZ;aBqN=irs^=7=T^E@e z*uA{IBl}ZHXQOCoDYrZ1g7iqpX zg$fE1|E%6Y!4o@E9d838#t-B=q{B6KZ}<3fR9JkmN6CuU+vSBuv6ESJcaBP1;1wX( z|Dbgxj=I3?_S&4{=#|oiSaHW)N;vua$$H4L(8$J2@`41M=sCP2kLUykqw$pbBz5Nc z`#S6c&2>3O1Floy%gR0Y?HdjIw{-|P{z5N5`HQ+RK}M{Wzh7|Rf5Wz4fbv`1tE~o& zR6BGdU*3M(Vr22J* zZ%axF@xGjQ<$59Z=!}&31IooVDmP{D^HAa<#uM2vWneJIP`K5su^igmdPjEQu!LY` zk%i*?D@gs|>#})M+FG}%+mjpXmL;R3InIzVf6dNqde2|xNly4K#jS*&{fF)wW0ruS zQeU{RWiVIVYx%TETZ~TqxZr2htBloO^vG7u305D>l{sY7Op?QDe*ZR-G|1US&5-2$ zeb#a9-_JIG(6g^08~H(q3E$+H^Y5fjy0%U^R!2DW#zQ+A``>0|wtm|hTCGgywam%z z3wT{JA}Q0ZjD1S8|L4bl1g;$6M)MAVxAGtEWZJ&P(-<2g+Kh#9>k&)iy)493j%K`$ z=U-Gpe=9v4O3($+Z2lihXW>uh`~UHyyG=|t!_+X-F&$&W#4tV0krPKwH*++@Fg3lS zw`s@pFwJpvcb)UQKi|jiU%2n%;^{(y!|O5Whi))#kQZJebpqfz_%s1X_@iCUGn?X%%sajh*ZpU6m3<_%iD63+pP>k zaD|LM+XHwSNcPgNXcuyR#C!MV>t04!iKbFMF*vcm*fh9uBB-`xnX~-jc#z9N#Jbbe zyRJ)xLZMd6D&x6G7`BXJ>OP$Zc{Wc>pMuwD`QfpriAd^70wH0qqrOgYN&S5DuAEE? zRSXs}h!C6f8xE4UaNw7-kB>NgVyAdVQE${=XMwi!hv0R#lV9W~I`p!a4Ue2W>ln!? zcVK-#oftpaxnOvaXFjc1TG9Zv!Q6m3sls^#6PvY{Ex|w+>@?BvL>N|hNhTjMA`3w_ zMd9~Z{juJR3x%a{&RJ#&QlWXyA1AX1Z~b@;q}&h; z`^(C}|L)AJjv$3^;w~j+^`?@eU;y zejgv7ALWH8F~9w{Fq{bX1aThzgHp1hmfE)A)Zb*^Xyujs=mQmYa!}O90QsQIbKJPH6X2(Xc1F>rT4U)3NAgoK5*-h#mjU)&;3!yV3qx_4d5e z&i?0nqQSmXJ*$t3H(BOvX#f1nV_{GIFbl7cx=Tl8BkC+K>1Rp$Fz=d@)}>s)cEZG{>QEH90kAzcg@@xn*?bRz3U z%(B-EuH4H!6vD*sP8rzjm+jkJ1t@I6>NHC=!TG992P zltcNum+J!w{#e(&dj4^)P|?L1zOK9Udn$jOvgCf&M6DwIPFmfH1wNlJR%SJCrZMMM znp{`Y?N?)Tt27-Z^=d>gTsXx@YenBGkag981bw@?L*_3an>W8_W)k&QkrwF!K*u=| z^Z_Wc-^zmZ504FVL*IPNVHPS~tycNLUE|8~l)~UKPQx3fG$t9ZL4u+`>+8={fpa`I z1($d0sT^g*%&-tab=APqy^D62D!m*yPY_wg@k&3aYoyECrjkXjC`1&ZONC7Ri*Ct$ zyaUp2dz3Sx_eFN{da11$`4zB`4}3G%0!KK{+=u&F;hjgXMep;O*3PuWQ5ha)my^LR zFLnKPChg3qqm8x;*6)J7t~y|Nctl9KpzZ3G`uoe4_#XQfn-ffPQ3{SVS@9}8dTh5*i zHBD-?>0veB_ox5V-u&etdbWDfCJJi|%zx!V-eq)1F2cmiY}CJ{EA-aomqn`y29*)1 z)~A$HQIJ%w@MC^64RAOS`_-#ebR~E911qZVYdF?Dgzg0G_XPl!L5ll2o@oZlE&Rf3 zag0Je?J|l{61(YsS?qz3=iB<6plpPCIe3S7)t$+alaZIM7k~5X5>Mpa$-_WFeRZ_J z%i^C9YlJ8PnjbsV2}Fy@R{es3Ymcr^=4K@cjT0jDy`HYjtaz-K+SCYTXA4jp%^2T^ z-0%p|M&8@_R|3b_6!7b~EjUIlp4o_eud^#I)K%?G)x=#&+p- zJYIeTL$AbU0C$>*Ug1Cf>A3<9-MyDXBFn4_Dk*^@tzS`kifNFJsSpaGz@FHd2@$PM z(b_b2)ub5f*3qw(KE+f zSMhnA^27dj8cN zqj<NR={K}q6c?Up4gY2fe^$Q%C9qZ%wil#SC8mFR`SZ_Hv&`b@tupe&v7Fvz zkb<^T-LaG*yqFrx>z3iP`KNPFo{oK@r5yB37SYn$juwDU4X0$vF-sZAnVoc3mFdJy z;o$;^#3MR1#|?1dCKLHZOcuP?8r}2${1)5VToJNw$%FtVR~uYmHP#Sj=oAS;e^n7f z4iNz}Fb-&Vf&qr-cAl)DrYO-qX?+ z_ShD#>9XXnBUH;(=&%(G;x#)qA3`2(k_2XQ=x-Z*s8}-NYB>l>6xneC05RBrIT{XY zD;N4=@BxH?m+%X3$%2<_19HE1YwWX_Rgb2@l91f|SW|Pw!EYObi zJr7R8*jXD4bJU_|G2LmdW@d)L%{pk#uu#VBtlA`=?+BX^su%=MXAuOlvq_A6nfK=| zm|)Armh25YV&uJTKeS$GjPG0ZF%PDDzktc6wv+hdp1gNc-!fjCS2u_;$=RtjX6TUi zhE;=Y#fe{9Y^S?ok-YJ65c3SjY}sm~X*f+E&wPuU1it$4a$xrkkl9y+j_2-3*!Z5> zmPvxz{0?V#7o8?shoQ|t+RJ=E!J)jS*Ce(4r+L9C%V|Mu3cJ0*?D25wi--uSUftE~ zg&#gs!QaV*2ZjtuWxgBOJI{2`_CperZwvmn>#Wn5=0eHiLEoaCLSaq!4mM8DB;IEp zZOUVS4eqhmHs%3+r-&;V^7)#MDS`E-x|=y38iV;G@jc$)K?WLCe%XVrC|l8c?Pw8F z0crr>BvXlkcfm9_k_t`D_jpIn;{hzZ*|>d{{{no^gt^4xJ9o|rLJxU;Sn#*`7ncc&`)fu}z5=nXU9*<)&8PAis z!_)n|&|6Xfj@xcR*VO)}|FaD1`*_pCp9ofrLf|IgzwPFD2y@6;%yHTABKHvl1vww*PxBO`198EzJ$(%w1b|bvz5-|Q zEs5h$YS<4>KbCm0Mmq`8!OtuV2EP)Bs7dO@tGivDoleZE2+(_d=#NWSr$GK2!R^24 zLSbdaQ3&D)eU2!MB3Ae_Ijeq154N2T+)Qz`{e3kW6VfnFa7uOUULfU*kGu5!oUAfq z&c0bVH@q^{E5nVztnoac<@)Nm`HzkcgsQjYqk$1Fex5$*I{CNc0M~Rr6vp#2Y_!{N z)#{JC*atffRvLyzR+VMD17nfpqMHM5?D#Y$#*w4GPTkddY+ANUg+Kh>R4xj+yn3rt z!VYl~+H~}_&%Oh%t(rK=B-8BQygk~5dl~Pg8$JHHH_9mr`(6Aql&;?*8a2KNBuO{1 z`h2g#nP=-frfXch8!}3li^h1i!6iI9@olI>c%uGto6-wX2d8*Q!vM8E_%!UNsb2Sk1UzskDM?dcHWrv*V;nq5RUTLB<% z@(-NX%*31vfk2~HDRDhF144{gf6IgAX>vLnG{kkDKC89NkOh(oW~mhaDENT?@;3(2 z_Delny0>$x)X^mXxbFi2`0WE;0_B-n1@?}R`kSTV6IWN(JjDn7LK0%dSjmZ7Ei}eA z0w~c!b*})x+i~2EzsCK#_P8+0R0)jG+<9W z7aFRZDNT4JN`>IzSI$Y65TeJ@w;)wY&0;xxU8v@p@&EvW0N3wRvnt8dJJzvM*;B8h z59#-u_YOP)$1Hm6XL0xC&LfhiqzXavJ&ZeQxVWN+jsdY%HI>vy0PM90A0BXOmGt|4 zREtTg`#GzH7sP@QfAP=5a@YVs-FwL@iLq)Ae}?gu{0XzGs1>|p(rzX~#O7CmRt0pN z-l#VR&Z&H^@Q1?*H_8d5lX#&towLnr8Y!y}B`NRt)g*gjD*qm;O(%q3*8e1ShSIF6 zYa3=1X%Hv#Ut-40vK_WH6ic({lwK4+8=Z%0$yv7s1WA zKk{z)!|V_Pp>oL|+1XOQO6$cVA+dYg5$zNY{x7#sb_Ony- zPn8!10nh4dwCx*`K@7UNGV;nu zGQ-HrU#`-W4|6_9ZTNxPM*cLYYXJ9bti&zIzVKuZL3DT?3D$rB;frrVc zyg#mqx7W?4ka)VDj*7fNFzBK%@QcdEcZ5$-)slXG&*`;^w(!}XGx?N&M?3PfI}jxi zXyc1Af|LZY~_Q6=Ck*np@s@3a#WrP69>(z}%eyMXiC0x1JK zY++ht*bqdk9ic{)Eyssm^E`pDuR#`)ZdeZQig=qIhUNQ-Z(0e((k{sLj9#JC!clDY zK%u1GG}4Tm15e?MKL87C50Xi7rc?(QWQQk6 zN{GeY-|lUr6=~71bAl&kB)qCmwh9f>CvGFt*b&w<$W`E8&IKWewK*R!g?q7MHkt(A z@Cp0j3(qcWJSEb0rv)2T_gU3y1sAWYNN|5Ff1pKA1{}lFGZ)pg*DS&vQm208A(v~> z9|A}L^gs_|QQ8#T2Getn*HgoS`<=%H z^St7*AWe~wsQyd^&v-Pq%T#pDEtK@z`_|e@bm!yrv`OXK$HKIEG7>_PXUyx*UVMO$ zOLIbmyg|Hb=kjm5)UjZ7l+ea$PM}NJTDzj8018kE&^U<$QTA%E7Im6t`?NIwt2C7H zz(s1a{dHs?4cEHf+}b~31u|X>cubq9(f^b7olA(-Zj!&oAR>6>MbO ziTo_ypzic8d#?}+c9bvqX|m!ObK9uZQ#}C9`Z3ARKc(T#I?;lYLt`mvyN$FcrY{3b4{WZDWF-*?bW^M11)w=sw6^chBxul-3azqN07+S*Edti-7Cump|Q3 zCm=9KS;8(&LZ!$MDXqW)74+O+uriJ=LHf4ePE?1ai$?y?CEHF5QF~|&R4AY%yh>$a zNtcD-|H6X3romJ;!V9GZ!EIS4JH$=&1`#Yp#(>t^pKfMLjq9!r&$jSf`uVHXhm!__ zs*j!*!(2P)6;8(D15!Bs4g|<~oVBlPg5Cu!rK9gd7`Oz_ewvr9VIK)zf!RhOG}0LG z_qi1UXR8l&KlA!>QhA)kpy}T=pmQZWtC^XkWd`a7@u6R~)#ZOttb2Izs8x?+Z(}2M z#diZFX!?kPwar^OR)`-jF#Ci!59uCoDUc?cgS^5(&pIH!AwQS?sTI_XTT2{80y|@U z?wI{kIvcOI@8M7v`@v@?uR?#OWP1Uz{U%#D+=?qbXA9#QR8cu>_lR{2jj;jgCgupp zdy-W6eZ?-EdDdAIpPogrG^2}z-Oova366ESuoRecg&yBfhnZZ?_F8X+DihnZBR z>}0`?K#`3I$Fi855mF5|H;R~lW0-2dyjxE1L-F~rN4YCM3J~#uM$~E4k226*WMOj7 z!mXA76uy;dSe^~HGhgl@X3P%PAO9nd=>*RwR=Nnrm@|ZY);1@-wL)y)^X8_x${@=x z{21cf%0uDwW*zSAAalkoY8iog<38*Bxq>%n9p8^1)2^*=YgStFi7(7-3UJ8Q-+>4* z;C%|fTj;ka@?9v*wda)p(avWa@EP#5VS?#_IgbG69fEu_G}ra0_-+Q$lUBx}k5;ZR z+{oYYRKGQQAPSOPj>n9N|H;_w5lBi2|DbD~8^fn+j|n|1R%G*46NEqTXL#- z4ROX^9m3#Qh*YCb_Fuf(mu1x>c!UXFd&aLzM1yG&5>&HHfFW{gy@s)EFuLWBVROrs zn)^0H;KKM9qziAJ?7qC4vv6yCY;&Z}S%f|U7G%+PPngIbka2sj`=OiUK@lzp>^d3? zsJqWLc}9V8MS53p+K4z1HOB=@39C_fC(Ku1r?_%SQ*hc*hcYfdZwTbj2AZHoCO$4X|G#kPLt>2Q)z2aL{{mRWE!7Yn2?Ff_UvS-1T7BSB^5 z#uLyIE^>zJdbaw%AI8rT_J~1_OckE;%eFRb75#*DJL^FggAzv<%6QxFE@{rz3*ywT zlzvjhd4;2u8H;Jre8NkdAxwfo;7%H_(qwOtWZ;^`0D^&^LnaVQG(}BI)4Y?LKty-B zs1nWT-uJ_6H%`#4U#U)G?%&cRH#sMYDwKuKrZ_t0N}H3ni+gf_aKgy7ys)INP={)f z-~bB?Y=Nre4!sYYkAB9z9{k)V#yBd}9l=rpsqUE8G?`J5lVBZT~0)e2A?TVw z1Pp3ER->?x&lOr6gn1r(w9aM+;LUWQm@@TT1lcHR^bnDT*RC8!u^Yw&>3rVje~i$x zlaR%TTenEp_(R26>mzF!Id03r6hv)V+0aFdTCsKshLon|WT8s3!eDz=IxE_Li!wNU zn}xZ)Tfq7gCm0J;CJc?J;g|M$+X52y)3D;UL{o1VJDxl$*g9|8_QRAT*nwQec3eqL zTy`5*+mVsyI2?YjqJi2h_n+F_JGgO1PL&_p));0!Aw-75872lmNR+Y4(8Ix(?mOrH zoyZ_*4`HNC1cPZXHHSj7H~ra^7%uYCEDV5i zr2|?p*RO8$%fH8%MaQrg+=i3tWQ`iapK|a z(*!f(BQoknoP9)Qm%nQ_$_|Z9mS0}DP7k{S#%}aOHkecyxjVYndD~Q8zk07a?gRuCwX+it zRs$UYWQdHQjl+K>dd#ltkSq+Cu9mHnrezS>$w$j)s3T*P8bM)C%1%KGCinv?TChui zZtBeXwwyHWuo&^S8uDueIjQ!{)a2J{K4G&_gz+CzZ2aC$EEoosUjkk)-;5`Qhjh)8 zPN}&iR}iU?lUfN)kElvwURp+1Jpb#rF9|J-jdN$8aFa@}#uD}JZDi)4qYFF_L=Qt@ zokpQnz=A`T^Yli%*vTf{F-_Ei)OqW*g3QZ7D((G^GtC-8cuRVZa!q$a&LQG3iV_s< zmvhq}?d%XpDzdf)q_57fPRM6sUpaFOzSGsAw73-VYG zP`1mgsya8+aQbc+RuS}iHRO5I`-i$2=Mz?~HdVKmwzbX8Cg5V_crnsF4J2D*2|L0< z^j8OIgLS6%evaH&9>8`7M~y|J7|>jWVQ3ybM!&I;yD@=BV|#U-M%3_N3qjQA(tT~1 z)Xo_5D2$_2;#=h;qupTx`H248eFdG1L}obCiItni?bZg_)mMo83XK`t3Mma-)_?o6 zowmmYJ1gi#hg+{oO2%iy(tM*y&Wfqtn&+zdzd4c~myr9=@;^zsn=vV1w`*Qs8uPjM z0zy2#kh3kUY}D{rzxFgXGTlvLk+qLYG-N*U$`^D+21guE*FPSx!SGDzzEz33m33LD z_U9;g!vSJsyW5bz{k()#PF|TkUyPb^_aAb4!hPK)9(%P8iRP{EPe9G_n6 z?R<9++E}53)LC>^TlA9K`MJ9K%xCnUaB$VWtJ2pbOk7KC%>2?5k>C=N5RFImZgkX_ z@OHqxgJNWh_DkOsw~lG~4jQlsxYgA;01<&_E)&{G*F`q*hN0WlAznnnyPK7Kuw&>;+m!u0m93|=^NQ8Mn zK%LxwvIsPoU=W(*3{N(#P<+8#*&K%wDJtK4m0sYt9VlihkV@{KNBNE;B>oxMV61>) z;-Eq0DvW6x;0`St$s4J#fB4pZUQ~`9@|aC-ON8MpU; ztr===9rVBi@-+=4JQekVOB>Dy24G_eg)yxe$z8ioD6nQGqZfJIL5|$-7AMwQJ;C*y zHq)!&syajz-~Lzq>ioX(nEndQVB6Ng-E&Pp+yQ0fM9^6*l@Spgli&XFd%yh@^<*_4 z7PY>u2GRLvOAI?cn%;tDL{d8tf`?f;6ZFUfhmC=O(fV-m=WLR5v&gjIA%k+7`6b2% zbr;8!07U-dszHKy5zRoKwT^L)x*95NzYbh@ ze<-V*!JPjqxX}i}8>Z;XHY}B3waB*r$r#t95uxGGRA&vi|7)%8jUp^aJMtmbuN#Sfv+YVjG`nvlaud4%?G^{WyZJ)Nb7-ap&A$ z0_VyDTKaHj-Uk%7=JnXwKr)NF0qaSV#%p3^O6EeVn+dm1##25uB{+!!J3|$FPgpoI z<1r}oUkPuB44C$5*App!>D?95BfTq+qx`_b3u7TVbX9Xjv42M<=aXLaU_`Sx`hjlM z=c>Cg5LM3iaPu(I?M-xAiyG6>o}&?9ejf8uWmVoL72uOR+D#{B^VPXz_f+_-hEpwi03N`~-!c?rqEutse2-v#B1(PQY{AFVOiTCtp@wAk980#!8p$IZOP zPQJb*x5et_a0ScPJDhJ5cae0qP0*nVc~7)Pqq3+~%vLelr4siG8U&j-5ozsca0#B* z+K^ig+Nixd^s{(_7MBxyz1y8t!-$TqMnCKl`2T0DW7S41$m#qn4TbDX2IZHhE zgVW#YLBmhFX<@0OkI>TC_}N(LRO>6J4WoVIap9G3#NP3epI@JFNYCiizVMcS-T4!b z1&~>5$!WE@70!ZDa>43ftoV=R+BW}9if0uwTHR2PA>jlFK3uTp=lHgCam=+cbd2HsyG~T-Vxog?@XKei-OmU? zcK!nzFTFMQmK3jdtEr)<(CXz__|D1Q@$~Bk4*P0a@GZ~=YLBP2@RYw_BO@LMY`DjS zkD}rmY@M-Q=8yxkjy~*IYjTs(re~6EN5Mz!hcm{OGgm^enM^}qXwumkGJ;>!|G_X0 zb~fl77jP`1fVol(`t6pr@n7 ze^hk-b|rkXAcT^2EcTbN+k7LsS28$Uk`z4|RC z#H=+N+xL$GE&ku`dPx33v8yoVUP}&&#lJfXLG5+>p1poe^GA^o56f%ectyRfAN1~V z4?PzsX$iDEl6JKmr4W3s=ciW10N{(uuMSo*IeY8_aM#-V+28~*=~c?2)fv{e?cKNh zt?UIJ@~UkPlo}5mk zKg^|(Z(Ucow|QOfH2mvAx>2{zz;l3FKHt;plfNeSZ+LC>t9htMQC zY`b}lA*p;H8FatgtD59rmkf$VCu46nbido*B04`Rrs;~mUFr%;=rND2O0%eW6jLJM z^N#8H7yYx0Hzv#c18c(4KGj#w{8a)~J&^18?(y);oP+NQe!UCrVb5^=5_<0x(k^`F zr#Acef5|fZl9!icJfD|5lumI6663_#@*iFJZ=%T}TUhXmNR3&ivbI-8qia=sv8p7BrYFN<@mNrsIHY3(%g-UXP%Ub%GK#s%ITv>x338fK|e zDjF|0UkUeHEe=2kKVCr}UNwa?Hg|yias2ag@*13#MT4+R=^HWaFX(uy*#og{)lJod zhZH)H1=}nH`Wu- z5(2$p@PTtiR09&Vz3N&n=|$6&!L=oR#SS zDdfTUcCNW1XB>)tO_h%Owq@aKY`K012TKnl{|8OVHJo1@ky($I$>H$IgTG%@7j~0m z6%_#(&G8E!`I`coxY$4`8*NHG?O#NPb_%l~Q4Z6S*A|Xc=o3;50TAG~sD$)GbYXF= zeK+0B_kLCK{NLq;+J6^zoF$P#MZQ(Ick3= zjw{T~^&3+=U+lQTR_uLiaPU6FX;Kc|Noy%wbOKcSE;}XcS&(}LZ;y)ZCZxN%Z-Nu~ zmbRXCl6iLDcB@A4PB_G@#xI>&3K84_+*67R8^}4~=3KDz4+m>kqk=_rADkx^~ z#;b~>SN?y!$$U_;+^{xPApg zGX?Y$K09Awa9{LUxjWQqG1S?YX{V0b*8YrKTs$vjNWBj-_VP2n#ws}K*u2Ga|4aLzH_tM=uj18aC|!)fI!nyv z^K~1pVQhg$5h_0Rr=^JRsHd?dtAY5JsC4&-dgoMyce8|>L(LE$|9`?pEB8prMX|A< z_Ep)8493aMKz8K1NyK6aX~uNCZ?x@UC~iJwc;2noMm(8PTb^Jq8>wweuW4-<(v ziG7BSN65hn{p2Al&-LO3S=(|&dJSxCL*HjfH#{~ym?dbJxW_Q#9#Z$ z@~W&$`Mi*>#Kvy3cDI*cmK2QxIyf&0k#4VX0O$=otjZf$MH@{4tMXhNOk(3yU>F+HJPch*N?=xnkyjRL4hANWonD?n zPj92U9ja(p2YlamE9^P0rxFF=JjA~7mtWnp<+l2BX8ueVp&BS!Yj%aoOBhH#lADLV z?4YpOwYdO-xHVnNN?f88CpmO-F_hlD_RSK{<`#JpKtd_`yLXh$AfzvrdDpHW2)1>nM24DL0$tr;}^qf-^u;A%BYIP$-YIrputOtI)@u#G+6a{$&|7P^d{2v zuLh;XdNzLPtoeX+Bo7WNwSk&<3{ZKCxq&o%(+nOy>3&h1^UpNCaIKV%zj64R=EVx6 zMKu)rm4z~S00pYCIqT_Gn%l`U%?Q{6L+jG~l!G}>v+~IsZUuIPKJjVX{$tkhJs_Fb zg7q9Rq8D}4jrgj1g*amCM*BLMoep0X%Y#@^3@I@;b+i4D)C|&CN36L}^yf)ctB3}p zGkegV3+YQg0|Q?vUylyXm!t3qhM`&gpSQ@9Oywu(xo?T$-e@5c8skcv7{jD z9_(v@+8FQv%tf}dP$@x26`Smkc=z4~AGP=)9-kc42~V=ip7(pFf6W9%Bc@|x*`UNqcg3!OkAYOXLzBGmEegT1Zbj|Nrz@;Cg$*9~ zGG&Fq8(mm8zN=Plfz~((z9ssR*IzSXcwjYn%KIK+QeORd9g3-HOl(+?cjBZaK4u-Q zy@Nn)Xz1=Z;gw=!S!%z3(U5m-; z56UOAl`FU*Ur>^j-J?ODyVDika|-TtbOq|NrqQvr5GgH8ALYMVUb>k*>AsfzNs;P~ z{JQ)Jy=d0r`=$0~hPGLhYa7(u%VEo^G$v@IUPq#i&#HYsviklU|JPPqz-~PxBLs^r;~LCv zXtr7D-XWLk*>$#Cz+(Kegs|V9FT1?y%+TQLdCvcA6}UhQcAAj}&5A|jADrSkBzl^7 z-{Ut10SYe3Bc~6^2(>F6kXS&wDi(Au4b2`VE7}|Qs{G_Jd#!-f1569$uqi(REHOw9 zdO_cjj*7G>@7-IEgMJ8RNBh21_t4N~O8n>*i`5o}*|^}^v`jKg#$nM0^E^#tgSxt| zIj1yvXeBeeL=h z3-L`}GxdK5_5J69s;OJJs|PI=k&gIt#JD!7cCTueq?zYG%Z(%Y^v>7Ca;`7&W&qdp>6Bmq9or)Je6gZ#HRd$;<0kCOj8o1}Nf94= z@sa<0t)9*@?_NngQ`Qz)W7&T^$Nu_kE)ClT>pVt|BPf~<_8!YCCu=fL?h{lPzfRKT z!NdjCP@>qS)siG-I96P?A|^cGkS-thSaZ=y%U%>0IcF-`_oT$CUtuiP?d;B zOSuIH%pa8!J!=wP|rz`3~z(Mjo>Gla<@L+4I6Vfjx+E7Ho9>%WwYo zH%(~-Nk(ZLJf5 zr<+oX`@6y?de;X*o0zL;QE6?YM9naW;MXmhTc z6X8vzNXgh=i%%|?Mtb_9Tamp_`(hP>C0{s|c}4U6{`=h5`v^MK<|OCIipdyZ}ZuLH?g z?$bJDd0SY{UNgQz%>xQ`2QX1r%$V!`DlO;cSF{nZwFG2xKlr`xKV6;mwFU4-%j9{a z+54_X@;VDo<@roU-YNB8W=rtzjF z$J*T2i}L*!#7|t=dd5+HiGSG-vTglrI~X25hDAh4uJ;pvkQMs=xc?`yiZyY#ViB57 z^psNnKlzb=j92sfLPjWuxB?rBc2Bpa;qhLzG&fxKoJzMaO{rX<`9KJ6z+`8jud_2q|=dpEbNp@Q!($b%4UU5bVm z7wj@6R9F3DLVrlFj{r;L_)m}aDPs}MU{8+!Vn5;+Dg`xl-+6xjsSE1tv3v=8i?jQ7b*+tZySj+abPYXAp^Vaf z8SeoxZOQy>ou!}hV?+rckiY7b#EeSzyfD)sXJ&mRUr_wwB5}Y9{t8uIx)?6f_zd5k zyu&ygm2R6>BjS~EGU!W1pieS?)Pm;wcaHijc-4gmHg0M-adRS-q27~cmg;Wa;=!i+ z*&+MW{{)IdQH-+f<__nM;y$ge3BQ(>XFJ9x8L6=0T^NEVM{D*!8p~Ljyi}DyLO|f= zW6NY*BwPWDwPTG`DoVgeX(h}!$%)m-yQ^?6kwTV~4*FaN{&zPA!GlSqa$c0?}){eh3} z>^vsfe{CP}dPy>(T${tBSmdl-%r!_yuv^onW8R&7lzUQzK#AKKXvM% zDINzn{#I}jGGGdD-iewkNJn59>%t3{t}2dtgd;N1Y;RN-(r-AUJnKW zxf}M!GQa)Wzn%zpk!c*NsZ94Xi3m%6>#~2*X0Gg0lduqDX3=rT+-2#HDrYbzG&q-B zpfcD8q^@~(Tg|+OAKaSXvKy3tSAeGGrLOw>syy4pU;-DMOJ@I(n0@uS5=Ca3^wi+% zepQ(}?+oFJT2hPaLJ*|w(QRTx>3#nmqws?4BUECI;{we!b%pww)!|n>aLz_a=aSS7 z9;e1ETqA@Pfv3mBvps)U+CXpuMx1cG(`Vb#n|{Gzl2-v)_7(9v-f{fn01(OP}FOo?2|b2r?dV?6Xa$^ ze?f*7nBOUBiOG-q3X;K@D4;2#{h;*6#V=Llps$?MUcV6r8xf{Z@h**yetyU)ja^{d zuzvUz^L>=T`to^A)+nQ3UowWH6XiHLj<7zzqKI&+sQq%$Og6@EI%R)OV*E-p2j)|N zp?}evTffeuB}t&)idBNQ;I)#41qQHd(Ig4L%It|p-4TRYZ&^jG^pAwWdW-&R-0J~Dix9}8-m!?W-us8I6pih+XGSco4LnK-2SJ$guGC5ONZ9$ zW@-N$r=D#G}zxP@6`njC}4opw9PHd^OiZdG?=aeH5!BnIamOCLKJL z`JPM?!)vrckg0|Cl4<`{d7#8Quq>ADD%DsKQ96MkluXcZE`njkmjsDVwOdcEZfia# z138oRGSU>v=>|QYDxB1qN*R(bEFR<7y>rAws=A!WOy(AJ<9&zD|F>`~)qyuJixsI| zf*OwU;$L-(EMNLOH!)k`v`%L%@W-X8X%`Ji_ZmbXlCb%|H50kQ<6v$GKrC;6LOo5% z*yXBpHCb%z6~f0HHw%|P_i|7Wo5YBWxFyzq$?|fjqO?(sWtRc#J%*2lL;4q|jX-V9Gx}r`GD;d=j#%Kn>$(tn zDEUn6k-76Y9bH9FD3(&g=|-#3-SObX+A@!>b`^h5o&}ZKdl9Wr*cHI96vu62e&g^M zUN3rn3VwU~dMzycaG=A*;7LIWl|nKe7zBF}npeg%gh9ZYj9w=Tn>+&LbC7tsfZLQR%C4Dg!_ zR(cVs{crqK!dd5|w}mOLC7P-L0J`v4=6E@#Yp*_qt%nMaP8q#gFS?ohlQO`aSBB?( zOR^rZRg(1`oOZ!_X2o;mVM&%dmuEP+P440jV51-Y#0ZnR%Y_<@LP+^86FHk&-D_cu zjbNh{F*0~1+9)I;@cWG%EBP}2{LUNn-VB=ZqI>FzbjsXyqstm9ZlWbIx!1d==2c+} zVBy#+de_3O+uTOow-I0^h%{_#*XQ_4BJAhu_SZ*T@)0&z>R9D*iiPCdk{xVWHzU(z z4kuIm5(`-&I<*ilww@xz;l&K|HH)eD#~GYAx78JuOourGYLmfHbu}P}2r#iU1}I;@ z;0+8~K)gabnsyh6bvm~ zKmZ_Y;xaKjm@v|F0}`x+Y!cxW>(h7181!^ml3MN`gO4W%z5(VupuxBn=f8nDo+sDS zr+A<&*JRXlP4xj-YCe)IUAot<~LR&TlwBQOVhV0qpc_{&Cd%v@NEc=b_7uD5F`FlEz^x{&N6jEK#O0 z|C_~cV)FoV{JzDE?LhwPlk1jVMg3<>KE(OuZLO;RTgg9ps$%)yEtsR671bpS%t?P3 zs87J0^*7XK1m-x+iPFayB#&meB0~mY#L{5S0@p=m$eN>A8wrgCOp7pN7&Z(ApP^{D z<;jbV_7^f{fp3K=_b;!-AIfXF3o)20D?MU4!tC^(3~lH?r;p4lA>#Duq=cVDv;oKk zFqZ`qP%@bT6g*<&M*Dlr7*J_|dv6t=yhq4;G>rf>@E0r}P%mvRJD^cTrUymCsz<*-%41^_s z=9KtrU!Dt^WcoBT4^b`C&fqSN=ou%3S;h%!&WiT8t4pY5h+q z%;(%m=p2xP?6t@|a&0Y^M~>5WKxGp?(vZ4;O))Q{~NfFwuyhS2GRHpxSZwr#2J z+eF*6?LJ|C0jvco4B9;XE{{CF(*4_xwrxB71Hc@$dIOjvX3jzm&_y;c z`rU+V2-gP%{4?z>lCvgvs=C^h9nxYz^MP8o5A!PUB=?lZpTaGGId+zgmX|tqLCEzv zD0^nLk_F@dbG9f^za}(CCnV2lFvkwZlmKTgW==X*#GIedd>`q_xWP^j9X_Q?~(sVOz#M>zgtUeDZw5{Lw~7uDd;@dI^KmAR zR!5_vv7T-vaZ50Xq*6S<@Ll0&nJ(6Op7DPc*fQ;RmOYNyk8{gu0W}=1J`Ck}(h%{dkZ1 zE3`C!iji-*XIW!BFEA&NiGJdMlbt#oVgW|~Nd?ue{x_@tS}ZlzX|7hdBZr@MUES># zrtzfo*Ph#ErtGV2lGha33NWI)_rAmp`QZQ)HGSKpR|Y!UP3MnmUW`f~4QVd*w^ItP z$+b)0HA@$s(tJC4?3jD@Pyf^weU~p@%mYI)Z?@wR^PkjO0|ICjCyv?t9nkMnVh^a} zu|h$zokUI=$gYV1a#a%OQQZ@hVL$!fZ(Chmwv`QFj_Lx&e}M$HnD8Pp4j5%$mJ7-W zK0t0rhN_nwXiW{GQ?5t%-lNw&y5DX+c8HHHR6nRX;Z7becPGk9+|eV4wX!+nN)w{y zE8D!~>I412Wljvl5nVs5&r+(zYOa=*S`Ahnd2R0<=Ck_F@?%ym>Qr5WC8WhW$5tz` zapd&sXl7N|Y92X&T=mftcCzr+%1wW=VUKNXZ7myf>A@UZdID=wZdovgNA8rUu}1PG zFqHr~u2a;V&ru1YqodXJqX@#LjLi_1p?I7s^27;CJhT9rCSRzYQ1vm z)=t{ee?40N?H=@81kht1oMxL*}mD;E_XzU9aZa%F0S|H~VX8 z9u*?ra?dcvWZ*v|Fh?#uwt^=|hTX)-kQ);)_5E*mBnWPmTs7fUuCI1gn#+d;=6VG5 zR-`|^2+d2$4qHA$4y5JeHGb}?7?}GawY~I*@QCH5CG%p}NVl|W{!q)5Inu59(JH-g ziiNs#Oois%QFQ#_XWgMc`&0LafADWygY4~vzyEvpAkQ;bfPYboUp@Tr19zR;u$pf; z1G)tsM+DZ!@hY>Rk_-nBXNUE)K=Cni(oeEolUlG%CZ0O;C=Rg;;otdKg$*idT=}6gEz&aX+NG;s9Wb|(7I!1p6%Xdv<|Kf*Lf{4^>eFAaHI}U8 zWdv|_Qho!2K;ZXyPeul;#hsg)b}QGex%ck9WB1_cVIHxS=!xea9#1KVN=oBtNH;V0+1o#mFVpaH`gwYN``x^INK1quK+6cdJ#PA07F$)SeWfq`s25I8Aq7s1oTX2}lgK?p{hx&N93@FUGioF?*5SSBS<8&eE7AT-k zX{LUGwVrJMCC7Cq)&G-Ld$&}JF6QWkix=G6(!YiJnNQ3g>EVZ>2YRmlv(5YAhaw&m zB9SqtYy%NOLmtR9@g2<7$B!QS)92BB?X)3VpNfCX^I~(nAn{rKK04yl$Di8w#4S&D zd9MhVqu-D9_aA-qk-iK4Q^;-wdSCs69wdFu*ZJE~+<*R_t$m(9ew^@+e(th;^x;SD zt-Eiy@4xh-Ibas1C)|0>oiIOUCq^x16pt@q2I!kys6n-x9v^e7%gfe}xCQT`>izhb9Z<0ke;|H8F&H+(~=t_#_Z z3=XIn5ZblE(;$^vFpo+v66a@kq?cko~8>`b)R6bj@u@DQ#>(Yg%ot z%1A70ps%|dHx}K}^{W;ehD&x);EzPPoPxP<@m2To4_|hzZLL+O^dc zcU_<7H38t%rzGDUUcy`JxAc15t*x$ELR9i-!6Q;IuqADzdmvWpN^&1pb#K?Wx1~k5 zcwMB=htFLTSmu5qyZ_{~#2Q@G{r~xoUUnIQrq;#=31_DxAJ3!=l#!IWudABy-&QYp zS@6hp2*?e)zx&JoLxB2<+mKN<(!Fhn_Zv5Lzk0m6dc&>WSaLU(uDYdbm)*51m)zA$ zqRW@v)hiLHKi3lCIdnzWFB|DO_d&ny-mmJtEAFzsBxwaryla`=Jm(g64YLjXB{u!HSXJaUa9KoeVg5J0L;fGQiS1%CkuP!ahD7!7N# z%**ipr@#CUp8v*ok@)RNV<5V@lJH-=TY`s|#ar?8ns|2cRmuMkzVF%u;;GBa;S=Bg zCiPKrE(K;@xgh`c9$snPoBCcaU_#s-UT2Gu>+O-epcIL7P5LhYXCN*BQ2{&ybDBG+ zv#CkqZI=9)84OJTEB1c!NW&2Q^k+YF%bF*zyz+|41B=5z$cV`avSf25ksa~N%a!;b zzAP`_aBGrXfF+(n=IAYCLv#10WMEzL!a=J$$VWotw_Miu{^$Srms%W*xuHy#7H9&7 zG8!ye`g*j;=nxQU1_+6V$$0y)j2c%_QEA)5Kl;&+-0QEu?&q}in>nDls@Lcg%I$f* zm7B*`^qJQ$z2??8*4;n-;^*#>07vZZslp?h0d z)*M`utV&A|;t_i5?p^oKzxag!-6P#qxUcw*J%xAD z4IunaKmWN~(|o^h;iBZn>lwDbndeK3e(o>nx!0w-uJ^AYQ?I>dI{p{`^m75i$H_O+ zkXvLpM+EijNtS|a10;X-tN-SH{ML`%@(szL?h6@2k1gNudf)3B{bs^fWW@RciHGQV z=&E>(j0ag~JV?8hZwu(Z#!3CZr2b=Tey;mx9?>7`ebm2n;|iDUEfGNWSHJvc_ol`H z{jx57Lky;$AF_McU)koRE9%cB&CS;@xhs-&e*3~Je{VMNXFvU^{eJj?~&h+>N6@X5*${Y{^Yk1Brg%*HKHVr*$HN){l>v4uq7U?VO9Tg&o zsUGa=cD?N#uA|9&*Nr7ipiH9UUtNE7IVJn*?wR{1KF;%@+n)Dn^^FH%NZ&yL;c+GblL1hX@IRZb0RD@JiDMh@ z%+!Qi7C?LVo&WCd8+!1*?pvglWW1{Uz*dzay>I*wFZ>E~Yhnc%sPOymi+*E|{8qfW zrDkNV4>9@GHT(z2!T%BQ9}nJH@t^#2GZFv$#eZ^{^$CP9f$=008h}R-AV*>6TzRV^ zU{0Vd9CF~1m^z-by~U|vRZ5tf(MOVH2z~SaXYWtj29lDk9^96v({|hL(|yjl&;10~Bmfdq6;J@G0Fabye~u%` zl6+p>x5pgZ_k}nUU|V$D|8K>Pow0Xi%>{s>8F&^lb7y8{#M&#?`mYr$R*a2l3?kou zqVI#IZ-@}v29vpI&AEBaxfS>FIZxj^x9Yy9*WX)(mfcHwd}(#ncHFX2gPM5fmKN=N zTp~h0dgFonME9-SvYQF8O0j*4r3k(OmUEv{ocR-JvYPB-om2k{rTBBH!XlM zDF?`YTfaLj+3@-t`=!1lk!Ex~6!;$^(Y#OnOUUFa?LTKQC&w9Hcu`>fe#ZXCb1&bx z5(138&1WpKDNu!-L(iad{TyLl#d;@8abz(37XR;uLgROFypf9`$*MnrLXNL=kLgbI zk9cECs-mEeLb?a!kM^3e++_6cq>>koliW=a z%VIwVZFjrAUKA+aZ=-8$IOR^Cu6DI`FSzR37aX}*EDuzRs>sW#J?R>n8U*BYv-JCx z7liT>h0+W>M{#k?5d~?xW#BqmI^3DsGxEfz?QGRUH!+9r&uSt!ovD}N>~aMO5RdIG zt#(8amF??lYHeAD!l<=zPLPPPkONeuu`s48d(L(LxteOdU+r_yc!USFdjE7?jcaN+ zW4Sy4xirThA={Z}ybt{M_kdlJfVm+7UzF`%zj0sVI6~6d(`@4Zz0G@WW_sE+ivLX9 zFoE;@H{Oew#5~qiRogvjY+wf~(cE4GbS5vz56*$8OUB$bM38R;pcC0<2lCnENN~=u z?Ru6>lc#9%&pp^l{tZmaXu^NZ8_)lLN(OZBwz;+C#-!+~Bqx41H)8;d3ZNQwoBVgS zYb=le9Ge|{9XSEHA_a{{48)~M6r$g$0tL(^8<c3<` z_uhlggaGn5ElK3Ip|Q!;)YbYNR>=@~tmL}VN2nH^E8SC5^_;8K7|uvPHJv%-+NF29 z+gn^gJSz5fxuHI&+mhui?^Z+(Zb^M8>UmM%ADJl$L~)c7xt^q|+`4gHfFUYvVF|EV z5QWslS3-MV0R7^n%dSm2{h4RJ?VdgHy!bEOTE%>?(_F99qjWEGT~sSNBb|Dh9L#6G zYpEhPu3eQekL5T2`+>I0F2~prk(<%nXgqz!bWTTWo8|u2>-DKxeqXxgr1Uv*q2D($ zz3+9r0ogvPT#(Q5Irw($4& zL!sH(u$!BXR0F`>ZkoHXi^7 zkPBe0O<=B8JSFFqNaH})f=_wc?&z(!cMlfX4j5^mC|6-L#q^S zYa3oP#@BnEMlx{SfH~brp9IN#M1isoub8V>7$-{4P%;8R?dmWY?(1 zO;pHs-OBr>?%OQ8e8hA3PAJ-T(V zmKx5A{{ZOy@SpNIP>D=ae^}pVA>N;n-76sZk5{yXZ)JVxq>v3iTk}i^?!cNH9p&>Uz#2S*0 zn$|Vy;LS*O*d5%b-zN8%G=h&m+#i_Zo!IUCK=$X#)oZT5FzCK3aC7>M`r0BJAZp_= zn)?`VO3L)fxU+$+UH4>Ze$L(H_dkl$1P%h`KDKm@m4zk!?N;gJ9^1Udd_(sHJ!Aby z9_=~0KOuH&m-*jf)RO3Z`wViG=|4N#<*YVgzvkVY4I<-Z`3dt*|0P#^&tp1nKo|b* zekrt1KK{^_bzfdtm2=x|a^nG;r=T}u{YmNvIw*iS(n8R`2IM4bKBtdj_FnJV`OZ1w z9srJsbY8#qHJGyon7c1zO^E`QYbXU^)tW64F&HzSqzKs!5#z1uItD|;8o96MG-})E zhf^@;4QNM4i;R;$U*F0ZEe>iAg4uu&Xy5mpnD`Fy)tb6yx30H zujhp>8M(GjcYcM^3WV9CFm>`6w=hA{iIOxTlYqIG&YiP}5I}o?t)+hxLaF6TlVU7ameKd}_NR$?b z(MZp&#EWzeN28%{ho4zEMRj*T$rO`PIRjSXE&2&Uj^_oj-JO6Fd35G_j$W4jZK*Ygbezk>vwWsE<4vvZtQBA zLIccQyMDtJOT+GD6$iDG`XJrjrSS{!*z&UGG|?FD2b+Azqar_aP&{Iz3}=(Z%d9)= zA09o07Qo!<;*#BGY=G$=bc%it{gc-@knumcH#m;yd&}$Q{-EzgcAvPW_pSeuDR%U8 zt|(^%v%{YaVk}c)heJ#I81=I}63;(Q!3kh4`q-fxf8rn%8hrOfuUB134kl%=LT<4| z;8OYVWEBAtFvltZ@-#0SHznto6_VkBf^E(KRNML9@L#;+G3GzOng}UN-{jHnF7?eE$J&-Z%sU;m;~%LJy{AeUhk- z5hkJ%a1@}yIt5H5=U)Cf>z1=tlY+oW|81j2Mt+c| z@=jKEg$3d@fDSM>BE!P+$b&mF#=C&I_(3tlmtIyBPxMr3O1zz+CPG3W5_J z^m_`j6XYk5=_kq9jOEA;S{+DqbH8|JJ68k$;UTZZ!@z$co-B2fDR1c6V_V>Czz!`uI@D>1EL{`jI@3#}7i$ERq zzpQ{O%9oobA{x;{SXz_2(9@?r4!ALSHBgb#D1bTj|0rM%&un>N(Uw)rBTp2Gfd`a4 z0>y+D1?3tjGsz`v^xG2xC_}&)be+GM_P(87reFLB~9b-fU(8qWyhk$BBN<{jkrWh;0Yh$P zCdb_5xWJ6S+=UBgt+dEt^|$Z;EjJ~ZJ9FlYfdXWiKE)s*qh}HdV9qu~0OZh}j2$vC ztJg%M^}5gpkSoaH7LX$fH!b}Qn42M*i%v(c1R&@2ya#id3lnm50!>a!?j{XPkz-A+ zHM^nXWlru8VpAr)wyR|d4KR28#+n-%Axc0+>60 z&cH+#%*DUpTP)A<`)s&jw>+D#$eAO_p8Jo^i5-vc`K92 z5_(DRnLd(yaa1Ckx5)iv*ExC2J(`yWS=nOc65l!?zV@nnhUC|Xf^;5oogipZCZ zkV4hXLa7=M(v7sG)ovLwJM@3pajxg|kUX27)6T0aE~x6QXzm$HaB|9ini%_aA^<_EHEt2fiA?XDO^Qc}2S-BVy;TiU4yYC{xSK zFY{%U>62~n^zdNrxcJZe<`t*>C#upW{h3|2o$ zG$k-c-qDL^mnDBk19LZI%tmC)Y6RxmTGi(+a(2qgOpL?&FCb^TZUyeG|3Q94vHUEF zf^5YUkCD75lG!b1E*Dv`L=C%7$%TD1KKdjnH26p94Jy!|s;job!|0qmm?ILG2Xl7B zSR^~<`G+~%*5P{f*su2}TudYsAjb~Q`Dtpvjkv)=k2`-(U}p1<_2V$j_kZ1uYo6ED z)tQkBGQKC6OZ%VIuc_0l=XOMz^fHb%D<^iulH}J4EaRB4)GG3utGu2s6S9P(z;SA` z`uwb%nHkC6q|KvV{Wet)?%ckmaqO;tcDjFnxf^n3M$DN3%&{b_aU^n&6BhW71B2WX zY~aB4VF9F6e)szQNcY702M|E{8LAbq*?}Cnpnm{z`{RH4J)VdD^LMZXtTd21GO0e# zik}P9Gmg`6N&=(Q+{AvdTRXJ0k5NB)76|PMnEM~eV^~yv8tsz=%)NZh?`EYmk}qtJ z&hfg&JIJ1RjqT(9ak2}kBIN$!XmbLL&u#YnGa#3Mxjg^>MS{7|VnL3L?I&VF8O-&j z9{;>1v)|FmkLI`**zwO!Ng+%k|SVw0(x#`6r?yqZ7d7@TfL;9 zXaRMtQmh`#S+Y9B_w?Bw{SBfLEKRaqnM42a4rgWjhI-@~FRxe)D#{sz7LPl$?D)%{ zKnU>6rewg`HA!M60)#MGbWp#YmP*lc3_w_x2@~BsV4Ju^P{aoTH@rJQ90vmTb#|-& zGQ`Cp^fFZz2r+}Y&?cNhNe0p`lQ%D(Ht z+zmG}JZii4+FNCS$r;M!$XWkOMK{AzulnQb52``gr0dkyAO=J$6KoNCnZB_zvaX$m!pb(kMgSp*kuNMF2eke5C z%^JX*?o}Sl0pRRR_Zbmmm;RZP4o3gr5DZI>SaBeYfl^CWaX>sZ{)^zJ-2-?Z$v&G4 zsU$Hp{1pUqd$sJ%h`^jCfe(|i0ixH3v2`<`G$}mEAp+15p&)mNdNR{8XyZeyb(63t zqYKkP(upxUiFd-Zud+KCS9iF11 z@nkqi^PZVJV+j~r(Akn6`p*QV-{i3HNX|{1W0QJqBJ;xZ`HHx=AUxzP1)SS>Vpbdd@RGdW*$& zKXll382;N4R^(PDc|tzH-7hC$zLoFLmYSI}$WO17RxJP1Y=Xh5n(_T1D(*LD zV0du`y!-&<0+^%!EFY5>xS)B=oCcHtY&rIh6H{*ATF)8dgM+!fTK@A#rO*rv%NVn( zjnWb98uW%Y0zD#|w}H@83Gu!eV;l!$PO{gdc}+x)6EemHaxL>|R)1 za-1M@6fg&vr*;`-QP@!%`jr_&)aNpV_xZdBazrDEN*a*kSSL#<@Ia0f0iQk~*^nM5 zg(gj%$%8qfbjX_IjFUu|GsqEk0f(Q>4=wfec4Ec)4H?r+X_EL3?cQwsYr22>o0NoM z{xkP|M5{09e>h&x_nm%PX`r4iJ7MK0D-(b@c0$<3i_C86 z{on|oyZAmffc#&J$jNTa%3++B6HjClnv(ruGsJ$uTxeYRGJ!d2+3f`8yzV3oM6x3= zhYkwzlQ}C{{9^@$BMJSAo_HAXKSa<2F@M=P%vvFg!B@6ZBvGw5X6k z1k@#?YDv@TmyZT{!9v(r(hHF|i^drV$O*&_v9wwoQvb=nBGf$V!JK#-0|yV}A~0u5 zs{(UUTmj4h>;QR`#Tb>M?rf^Jqf<84kG}$TEVlch!?ryCTN?4q;lJc5<$sUozjz$L zT&h$pPY4-8e!L9%V!CZ^Kn86nslyiJ2N1Ukm;>Y(ufFs7C{jvo%+i14Cl^`qIwN^mp~Yj_d2veKQmf1IDjE?~3sFTHVQ2=x36zh9L^ffq;=Y3>19IdWisqzO0C<48u*_O1XD+7Dc!u@% zfbO4-el6nqZnRgc^qad;Xa?rk&6;k27`C}$PGlhIAc8`iEXAfXo{L z`SYbsf14hU`Ja=2@%vvSn5%Rn_53D=~$Xhp!G7)JsMPy)369i+-(vlTKEtLcwN2O$>a4@Wp1jOoOg`6LG zHdKZ`OhX7P%r2!3m|&R?AQ3B66DB6K`ifD=@20d!3dEQ-p-G&kdfYgZyS7SRI80e+;rgZ>Wvr!oOL#x~5D{79A{hdgQA5PFETE#xPhOYQ5(^~z>Se#J**H$;@d1EkCB zD*uxAuQZt3#_;gZUdQ=N5V+pA444yx32Af8izSCAV2&Iea_A^dI;lxCI?!)7j+`5o zBS?g`s1#_LTptn1+g$241lR<8GKo!Diadx2V6F@_pcKsMd+?!O&skb!$E`)= z#sQ$S>i?_+d`A73paT{HU_kH_V_XIk7!i!INY6t=4j?yH=y&}R{D#^p-LH~cGtaoJ z%=R;R;}*+JXtCJlDbzO#yQrYUHgAl{8594BOkvF6z4#mm@C<+pWYIX={p=|Pb9i}r z&+5oYenurfQ!;3H^|2#hd`|$}itdGxp2uJ=y*K&}#$;B8WXgb?jCir%ey8qKjT_P5 zzkVZo0zf5x1U}{8BWH-5sc{*~Iw_~NmL?D6G#72xstgwf)#`x-AP2Bhe?s)ca{3ba zF(7C1MC1hIMvFu0KfKf2o93YVuyKUrs>)yvXFmmVk^I;>$T`Y4t}t5w zayDyp!GAWIOX+;#)4S8Q@9jaM!S^zl>$Q?KCO?TjB0Yihmc0C=X;~4FGe_KXxaWJw zvxms3XWoWf=_cvPs+uZ+xuJhS%dC5}N1uISYu@LUm&}MTkx=?fV7z#q+l^q2yT9KJ zNWoBjyPI8C4-Q8^~Em5;C^ zmIfpkLpFKYaDl=J9wZT}IrV9zr^o7Ky{XCY@YBzd5gn{q1^)G$6~UYb5n1xd(_X=* zidJ4(hrUO3Zw!MiulD&8DpN8tGsE)GnA{=`5T4aUp40C^^YY%z_{#9&#RT%6&9uMH zcn!!6T12!YCDz^6>`qs|U?*%9oQJiUPZ%GBURNP`tx2@%;3lnI%;Na!>$sA`G^@FESvP zddZ)Rix4U#rbM&Y;Z3;_pFWQ`t>XB(@&p{{yA!ce=O6N z21@SvXPX479m5o`>3KVZ9!m65AacN2Vx_P*%d4YP_ue- zc6r5Z-pTHU7F;r298BoxD>4FJV3PwCF%~pekf%vGkmUTL*T|6r z$l*-lfTSQ!JhqiNDADIoMgEJLS{eoBP72JG1m^yQZGhOhePLj3P7|lO{){6Tk>yPo zkMbu%Kz>AzCU9G0qiZ^S%GJw*I#pHW>Q0_?r%vio&pC6B-FS7?r;IpPuli)It9qfv zRlnfRwc|5&`V3pZ{aKs-yv>F)XAGUEM-<6u&W(?x6PMjqoP=OC*HA|AUAao}@ve$jK3wNZa*J!l2&rO%8nvK$(_7h>sM^u)k{o%v&8ZVK6u|bL@bNYoq zWpjh8IeEe&MR)IPBqKRmdm3QQBBL2FC;mrZ4$x#pq?yDhSHN3RWSZyRWAjS2N7sr2 z{T9lfK}N(=@_hWRPfr+Q4D;&vRGD&M&VU?IJd4Wts20F*SYR3;$7vrNMR&6Lc{eP> zdHc@oWHg6s6uljjaXKY1*RQcpSpPW)U1OLUb5!aNhRo)K0XYn{H*!-fIWb=)O8^o| zHVn(Ce*tsof#1{ynCt53(RhB_J$Hihk2z;mx<_=fipLsT zl1WKMySkclHcz@*y>1m>ICpeHjw}%$bPc(xR_l>ym1JpY3_ypBc#uCUpk0!@y>xcj z{rJr{lAau{5t&8beDj;%G(ZQa2t*!T{JKn0|C<`kNRCN94alXtR&f9l5GM+$8!1S| z5s;isYTU?<=_X`IvQyHd2mUgo07uz|Gj*Jad{TO+%7EOrzVS^tvK_Wed6afzBa_k!RyT{8Q&g5P+C+BBG_QEzmQ0ML_V9s{aO8-m$0OtIP03ad(Y&<4l z!XE9t7KuOp5s3eQV1}2vib#A8X8O@!(Ra~$Bq8{^Uv-33<%+bSavMahZYWH=V~B6 z&*%Ps|M;$fx&QEQf7i`ul5^JHOXttY<2+|OR9Jo`YPU2uC&MzCu6q;t7%d543=O+c z5xap{>KGlC*CDTj$Kleb8!8TqhAbyxln4PgcXZ4iSz6=0ei-gTd7Ob}y>De$Bcz4Pw7?zPL8t^c(G zWE=&RM%)6J6IoOaASVUVt$wnU6P9WEHBlKK6O*&{&db|+`RsWk>fl{iUUlb}R&;&U zy|{8#*Unl*@q4SQ>c6h*I{*g~^jQ*P(+SJlkR=^!>?rD?La!T;0U^1+O<=B8!aO`w zbeAq&bnm?LPC6!*?&2}-L_uC2J$h78VZ<#K<0k>;Y+`F7$6$^l;Ow-JUhV@CQr#0K zyNFy1cJGm629OK+o`7V3l$9sI91*#*GR$Y?HLuD@uO<;X191_M15jImRLR|_{w_eV zx0hwR4%bYWzxJdn4Hw--@&D}u@W1^2hwh!X|G~X>@uJNs4lc)$nw7(1Q3(-CtekyJ zgxXGGiNKuI2-D-)`8mrS#XCl+rj(h#v+4Zh7_&i*g_>-0b29>SSKYhszHRryNcw@@ zxiPT}TP9xfIX?~xhnjx*_`|Y}(PuK0T<3Fv!rvzE#(&rADbrWdTWl&YKJoa0WL4J# z54lDk-qrjC%q`9@30O#n3>4iEdPTa3Qw5B8E$|i7uy`;82-f@|KZ^?VQ$s_xgc^2` z^SF!yDSfpxhTKSACa2vha-lgnEXV4?%A(s?m;QP0y#whTi2lE)?*Zl(78WGy?RGXR z`Ez+<88%Cy|03yz5z&Mk0xLfvnMv!&NnVf}i!^FHmV+zcM7j#skf)W|8QVyP40+j+ z{?{V~fvF=muX)6-RU*?v;!~+u)LbjLcInCm=`L~>xeq~pDvcFFUhFg6%jDX7Z@=T# z1O^w?2cmw=1IoV;kuxAC83&xwPg|kUdlXqW{!16Xw7lr<$r(Bdmu0g&U!Jm z{KuKDl4CI>{d?`J0_GkG$o=w{ztG=!AfdeB?#N5ICve7js~Ot5YiHO2+#t5o-;xrd z;G)r{e@!)SazO5H-ZkPquHC+Q)7_HLuWRDoxO&xHzjDRhxN=p`ues|YLhaYCU6+@3 z!-zZ<9@^IzB6G1;fdW4udWM3T)KS8 z{r>O&zAMOcXk;fVOUNPW2AGqA_2=$s0t?_#^URLh(dQZ)8eLyculv1!{~z3?S1;PG z#Jd~f|6TET^PXtS-Mb@R-@fZMH^fIhvRQ*1zXyDV{;jRM|Kl(J(f~q1y}q53GPlhq z0@MpLG8UQ;vl=J67|DSt3dnIBPoDq{XN-2p5I5AHcKv-l?)QHG_cV^nHm)^IEQms+ zfFyW){krEnB``>~he$fUBoINt-k<#BC$`+YTZ_ebM=-aG^4X~|32)r+IYTuy)viqw z-Pa`)SkpxIV9uZG%LyUfJ-R=DIq|_Fa(cg8&pB%q2Ls>*5BI+? zuP1Vz=ReQ6FP8-b|L70A{1ZXr;QV>(|CIVKV6W%wo-{BQ0Xbez$}3%&n|A;8&;PUA z&~K-6U2+x3&)*FzKXOYlzm6h^Uei6JSntNhEjt@E)-P{B>c<=UeIw}+uXofZBlJ<39^Bh< zZ`{{>(IY!UH#KMP+}g182ji7^xF&gBGd_CVfj+r>>5>6Ch-(*Lz2vS)Cy_&gE`qK? zyv`8g@H*?YORu^=`;$L0d6^JMAtx^E9;X!03eF>h6Cl}Hg(MpQp{det)p5LlJW z@|)88SFXHneSH13*TwHwy1y-zgirsM}( z@|S=1X990CZdCjyEyByb<}GqAFo*mHxrdeoNQul10p?bgq*DQNQO@W7)sFy;FFHLY z5Rd+8Zf-K20|6u~LIijNXaFPt7P`j!&2p$Yr}vNl=nsuIoFud*-rc{uB|hF45ATVG zThjmHr{2RZkRQkKU6doaDgM0i;0^bSU;M)KZ_u6joVmEA*Lg0&{{QUfKXZ4sZo7+@ zUv*cmz9#v;B0e)u{oJrzUq^YfN~Je7bsyf7o4OE`Q1T@~unaA_eg%{n67cRK-dcG=8 zfy1k3XJ_4{6xf(PhxY{$QXiI)#zQYj0Q>s;G-&}32vk?Ou9>dkEvIL#>NVG?n}=7* zaxoFPi?6)u-u}P;!Nz0!vuJ2Sc%eDs8VRou5yd;VZrMFyyEgY^Udn7nD(W&m1% zA-27vNG#t*_q=?$aJh%0IbrzYo;FXTQ3a^ba?e}TCQC$Jnq{iI-ST=%l3rph%n zHJC#gbZeONHt(fx0>I<_#)dOin&_IqEq2V?PWT6XEIt3Rc=wT!>3k@$3-A?w@*RNO z7hkZkpsYV*id+8LN3#ES1+JD?mrNHGNX4P{tL89sm3d1(E`+Wb(KRCTf&WBAiQK;^ z%)tD`4iV9h=PQr?wZ{?unt#o_LH?;D7ou_KO`jvzXQ@+`AIGvPxrOi#zKVzN)WDqd zJ;ZCT?_0cX?b2sije&Cf=N{G9pLR1dQ+AvmbK&tf_#Vi&V+C`BtU=lnx>=`%R59`c z{XLdQY9wF+GKNS{B!>nfq}@QG19*EqC>e?iaMvo1R z4W?Mrk_HJ`-kh$-#7;|g>jLIDv0zGy5pV1$?QeekWB2ll=MA(?uv1IQYFzhos5Iyb z+$+2m2{1w&=NAOwuWzik@tkB#wbiahk2cO~pC3dqPI4BjPwKs@8p~I#df}w|pZ?Xq zww<^{N8cAH4^8SKc~)+*7(Wg$2SBK!dn59l~h9iT-- z4j@O4Tscn;D(A@==^BR2cB%?&EeXsm3e4FO8XzwKImy%v4Q_a^bIg6 zLg}RZhp*Lj;=L!Ix21a`zI*;x*^b>h-J4UItISu*gOE!CkRuvv22K5=ujO-9W%MjM z;Ug3fIg|qelq~bT^~QbU{b3uPJN*9UH^1RdocNCV{DLiER0~|Q$-^G?x~htNw3Dt@ zGR8Tm9Bfa0C=%m~J-u$Ik9^QxH>~+L(yd3)P{&$(|u^G$O|SOGXn``aJ=$bC;hlDd`b zVzs(!;&~dCgNSaKE*dogBmtPvRTwWe0`zJ8rg!B0acDkgt#U-y_I$T$%Z(#P4jn_Z z>L~4R|N2Mn`!d8u8BRb>*$GbcC%Q6~DL*IBvqd?k80jCs`BrWsAFL61WB2ekzxmse zpXVhf=pOPGH4pSyqd9=?@p;o#?zHr7qjYkcbaS_O#XPeTBmxAMW&&T4bICk%A0pBV zQ1W_OfW(8j6@fX<7A`xZ2bl`!A0j(|9%Q?@xiQf>9yDb2kOv|bMbb6uOcFeK^Nk0| zUprb0y0a36mVb?N!s-&v?~F|2t$Wn%si;e_QxvuR5Q{)8Km`-;OsjCzMYpe0gEc(680!5g-70Q)Yx@ zYQmooOh@r>ornV!;K_*~%=+0=+RgUpvxn}Dtt|s{gHkT+#>12Jp06gZ6z75ronL14 zIdg$fszl~E=4D!h7mxQxPDj7IY@%pH)VA#kYZb`|vBQl=zl2I8$VcKJfE%wfz^+}_ zMBM_N7!e8#lQVMn&K-By-J}m0|APna!i96LATWpblmfXzU+S@>Kq8@Z0*F{{WE@Qz zPh)eFYa$_+q-Bkjt@a#I)0*rihS;&oF1RzNPP=J=ms?WCI0d0eT_n%SEf(YB26M48 z#WN0Gae18F9}nm{JIGUMx8>#1V8L?a2~1#oX8=v z-K|N~g3of)44x&*4WLB<>nxZPC1B1+=o0>muZ>MD8UwoykvZ{MROWw^o;RlFhjOSi zMS&@zN&kaF+}?k`%u4QD*_f52P&*CGkq+_MCx_cj`0(MUw)8S6UY+3&>bLp{ zwMvfkh=Jq2@EH0Y^Bqp>MM%a+%qk`Lq3}6pF{^u4UeWf{3z2vJw|r; zQDl2SppG&>)P7@^xb2jWs7=&xrrtgG>FJ@nU3EjW`z zv8n}vko%xpO}|Rk(M3Tgu_}V>Lx7VNmU-`O9s2%-7WC#$v{NGw@#?iJ7Lj}Qx$n5s z_0jwdq6{e>908`V&q?o+BZuySa7fVyU<;h! zKGJ32qj;F7RF{eZP|NE4eehp^5B}d3m?!`E@i*>6Am5H1%puGdR#)7Bgqylr^V1YK zrCL439zCON2?~-y^SkrpP4@QK_wa1uvl(4-SbCNc!OHy04{hfb3nmmA{U^8QMfC## zqfU*ThslIi->oi^fa$!hFX+*G#)+4V(&BSc0(0`{h>{V`4`9x6+XTW4h$WFVdkt^{ zpaIlaK7;g}_gPX+msJJW(kj$??oYMow6jV0CbB0Ivxe)Fv`3?B_qeVlX#~@oJiWWrGZYsBz@BJB>W#J z+ympk00`7B-e&o)&*|P+{{_PK?7t}OKgLcD8auqrnCY_^ZI)SIT$M2)G7&8^q;gi_ z-**0gV7WCc%fNq>zc1Pe&l5#!ij<8h0&&tY2IAy&;6PE;og6=l9vW|nn0w+R69W=9 zk3G%lInEc+Q#&ViV#>~2o*d$cpOOrWKy)uV-#Asq*KK5XxSgz`*LF>WGeRjLmaoah z&DS}LN4b5}{qvIaPYUML&q`p<03G8Ig=iQ3pOze4B`SA zn2RV@uvQ#cAgEnn$e*#tlB(W=Fe-Y)$P`%?l2-#LI)C<@B|W1Qc50Qz9UAw2OUht% zby@wBp~ve0$f^JNV#T(jR)U_Al#VZz;``5d;{J13wE+oHFovQ3EJ=s{-^*1XS4Wd4 z<;Imj(nW^=bCkXaRDM4X<}5NNFvkQ&nFcV&b35WqWA%km2XxN`ZY1Yn*BfNZGYOUD z$JfvDfDXWcv*4FpLj;WXh#mptSaP7|VyJ_ZF7tM^2*^n>3d|9ai%+1~o&S;@{VjGO z_v`b;{+@&NUqFsrC?3t2>3Uk{%yNb*fVqm4d?3UB?O-miNNs5&QKaN`j>|JAw-ZGk zmc`8Y0w9>1(ldd0ZSQ4BV-wFkfR--85DX0ZQYzv-MYoYxYBmPi9n58m9y2~h7}HK| zS1`AYyzHa|5S1e^L2jgg=z!)_>_q1EPONL52$)OB^Sexw`rN2KzxUaoSxP<-an!)v zwH%l;ASd0V`{wm1HQ2gr$u0m1Y!PzfbK~N^L0dR< zN&#G#qt0DQ>L~91fVJdIeBF=mhA2gg;B$qlR@5nUYRG89~m}_2m$0qeN@7f6hO`* zLsCe3pJjy6Bq9fpV+kca_&G%566z4O>lz8VfI7?TfdAZ!4F4rVdQSg)MFkn#Qh|D4 zoJ`^S@4;Lm?@`|~{Z9a$0Xaz5J(y#eEXf&)?q9eE+bQ`#hW{VfGOJ%^^88OrGbDz9 zyqAK0Ye?R(uYm`U^UB=#D1G9ip34LG~#-)oYH@L=uq$kOim3;%#%i8eG^Pf4J$a5mop2{E&vU`#^Z6T)@ z{9q9}-9uLVIN5YC8#O2F$5H^sAgR zQKq1rVnR{P>yb+N!}9C_a-5CF@>Wo!L5PTS@yP1{w%I{|OmUyr|IsOwP$u0&^tmvYVA<4m>e{9C@HbwTQ?8UB2EA|FF8@9W(Z`+$b%s@ z1Af6bBY0@hDgc8go11{41Q40iH8o+ShA3i-VP?(}DJ7-CHZSSE+Q~BdEx+?k08WO$ zPF9J)93T$9Lfe;FV=$z#+W%$BwCDmmemSV!z+A7-ISUcSpksVFkEDn+U`RlY(_F~; zBiE04McP70$v~e3{R74NCD7vmbM(Kc{%66Q?PR6zA}{k30?WjYGaNC71JI+t zzdS!@)c}qH=JFdLc9MT~oU;RTPW{0d8x+6KuPj>WuDmm!=U>dz{m_2fzWSf=pA-_C zuMw|#&11S!Vf-(XeO4fj(mm8a4LXyRJ~lgW&a)kwuixnD^mYel7P+UaS7rInf;pbY z(YPJ;Pa;38#0CD7GrW}p^N+7_Ujq4dykL$nJ7CUo&bl<O$M6~cxJjOc+&`@ z7(%F(YV(vRxtlAxxF0YV4{Mi?r7bJ07pz4bay^OG z$*523rg8)sQ6|pD1Hhn2+EFMHB%)OYZuGYiB!nsexFBSf4=1wE=D?6ewe%X`Ge$x; z9{J?7lkO0LaIm$H#8cscO0?#V~8Yz`p%kUmSf1Ix`x%Tx8 zb-|!uyh7hY|7{HFcieyG24^G}n7@lMCL22&<1F!}eZW3PV|g+Lb5@$6ox-W!BQ`~9 z9c$s@B<64bXedJgIRJeXrVcE+D-6g<<~gN;`)y!O@^8yD zB6CPY=A1y{GZCQbsv0|>eScssdKHZyC-%YSZRww7SM2SS!IS-2OH8I~5_%k9&Ne{ESwJslS1=MVr+JSPGd()yh6{tP zLx6Z**EiN~x{uzE^?zAr^38Lwd>t@H4Y{!d%(2k{{R=OAL@ow$%tgro^ATA=&aJP^ zQ?5xq^xX0*6Z!XG4%q=vkfQ~V(3~w4>?p~3y+>)4k3Pr-Blg?SKkEWRlT3^$YB2d<@p!$bU(D;#_s~=cI|%zuzgxi?g$ig1}iYvbQkB!`l1P z`baNi^bH6IjTB1;fB^hzO zaJc$m8yhfa>MN87bJl;!zbR8GRg@|DF1ya(a3A8k!_$R86n#&!dw;~jl#T!;JtWEZWcLO z)NErn=r&`TA^s0h;XuB9{Nb;pKNBz~^xzvHQ z{zZLHD9B8p0Ooe;|9+e4|E)W=+=OwP+5yaQ-&kU`WOenQGBC{?CnY_*e*K2kJPR$I z!;zendFd%MufGK5Mg-=nJec!9u1mk+msaD59CBbz`7ZLaZT?FBZJAHw@cqY-_qgWM zr`7*aD}?>w2fs>sM7PWLcdwQOb1(REJDU3`5VDAzKUpK>x3b(jJyJ4$hsa!f|MI-5 zMESPY`#ZHtU@qT(`0s(7m*q49hmB1ru{9Y_{Vxq!_33o+Xn<6wYyElGwIxDbhCG z_*vZ`PImb4{a6_H7N>Yvdw*J=Nfd;qSeZs(P7^dl<{%Pv@g$ZF%$55;qlq+89FRfd z{7D4L?|d`Q0EHh3RyPI~gA3r1F^+{Qjbw>1!e&5{zrkyO++csfa$*2-bLz|Dg%cDx!;jrt!F zj>BdLa{NO77p7)Bm>U^0FlUiP`u~0fFlVIK5Z4nrZZH>=DPWFm^yI4rAVj^QG2Lr` z9Ln8fS@M8E01O3VV38qYM$c1YAmCfvb2gKHLn=uj`D}+#&>UoV`Ci1t_e(}8VwTiWC7VuT7GQ0Pc;eR~*M! zg?3OdXDb8bj8;9L%72ImdHGkrY&C$sh>+u9fqB4$)_mW0U!N`e;ziq~d{0fHiy#=>_kM@O#* zEZLru1@zlQv;^c9C-gWz?PiBY-B4GbdwKb+yMKE#lYp7$&2IdO!5on}a)ErPIstQ? z0JfE|kzv z%}x{uV9v^SXnfRp!*H@J$Ndj-Yz3tg8BgUrAu|Y&3;_xl@C5l>8zORS{us2gNjWqh zAQ$Ju#km}izvks726DU0PkYk;P|$cJ_3C-F4LDgrHacp>bnR4x-2F%?8jHVm^OGJ3rM%buG1<{Q zqYfB}^z<%D27V->D%tYyh(UC-XPo|4Q?hM}S-$sf#Jdy~(~P&ws!opv$jh0OTb5NdUz* zB}iwGl_#5lIZXzRAR7S8$&>}E zpF@4BX}t#!9g$Z+^7nv*q))=ZdOctcFWC&Lkr$ls7!&VXev^y^M{@y&$cy9qwnVAt zEUgYlORGe)0CNlD>d)Aun<YoP=0J^*(gET%SN)F5s9isnzGBRw=zypt$h8F>I6H}6fNjD`hTI}g}FRh+)_wQ^8 z%ti92?uGl5lD}-k*@1z|BT=*OWXD&j#qY;pu1?Ciy`|ZJ5Wt?LMDjB*24QK{0D=qw zV1iN+ey5=aa;Z_^Q8G_NE&wPZa_saT85*z}Zxo&E=|VR7{4jg1jvyuL_~|o1iR~q ztW;Vit8^c@6wg14%n8il+1J%p+wuk;aoDxWJOoUlORU5N_e08*4Gx^h;*Yt4_kd~< z{pNKtCU(=$V*GF-(LLfl%g%t&;ME5*AP0$m-Vl@>8RQ=M_xYmR!5o$FLql4>;Gf0` zQ8#lpFo!X)4G`)VI>wAgV&E_yEUnJS`I*ps8ZNNoS&l##%d3DnHd~ct1Bwkg8Z<_jk9Nc|9cJm z*Hu@k|0O$5INN{qkPgSRL$m%Tk-1dOc*H97S2iT;@- zRYMry`(HIM$C~lk#Rb&-=K}FPju7e+g{T(GtK`YCYnA*mqhSekNqrNI z_ZQtjTbH}Auxw!N;ireI08ZubTQ_f}kvaMU&@=;(7=hiqe#k(a`V643@*{l(@r#oY zQ07czmWF*)ab7@lessc33(S=Qn7b=5_rXqJE-4`GFB^Gd>1jXrez!&i`CB*F4b0(b z6RF`o8xYdHCqipr!hoCBn*=d}M;iD0zcc z6j;g<$I9lS9&r*eV0gr{q(Wp!*Yw`3oW)u3Ip`h(a6@vwI4?5MJv|iv)ZC>KJ^7KX z5m6Qe;?xp5IYGoJErINW6CTC$Gxd$`#B(RzfaLu3D*_|iz}&9|42_Qj`?`djX2D_fV}(IC+*@!1T>|X_Z(XgDn`YgAQEM}&9Ar;oIWx z1V?&tMk@!`9|g>9-Q93!)&D*@9^??ujIq&4_fF1>=YJtt)|Q@-j_s7}G}Sk_7oOGc z3!GjP82IFq!`YvQ4?lA^llj|l>Xb!n0+2xV0TUQxkQ=a>clY3VrtX0TRd$M}x7vOU~G*pB_&B(Z76uKl1OXXph*_g7|%Qao%lm z(0>HxBz5ke^!Pud90Tz>5YmU<+>P=rYd_1MKyJ8y^dE4`{iP^#IN5>z8}VFZC$)$; zn>P@rE(JpF1I-MLnEX?+DJws%+4(EI$cmDk_JMro@C5YtgR|y0)#o)mBIP z1rkYp8Pok{qnPdVH>bqw$BfcA)qZH@J=@pP>_!)nD0x`Jq)Z(eW@U(OxYp zjAbzQ(MRvQo9j2+q;A%kQ?-tKDLY42Hx^>249hX()3i1;xW-d;*8fvgCtcmi7hJ88 zo>x^H7~wE^Ul!RS7FH>|%uN&%4*_n`dt>l!X=SS*suv>kR zH;zIt>aoz;>00aRrJSbR{o8kCBlg3E%8e5wLIN>BlZa2cG#r7s0OTx3PLDp9NFYyS zyH<6bTpr3L06vMrQK264AdUoXyt7G7)UgQ6WtWK=OSn%MLyK_eE_2ryWdL%}aWugE zxBwbw2KH%Ocz^(TN?#C_vWS%?GR1$b-k=^Se_@6IBOv3zBsZYMgx59md+Nb4jEb&?SgXOdRcNN%cMa3`xo8TqM`{G75J zNA6kUnKJ^R?Ph3(3hWvV{g*dvB%aeZ_0b{|meb^;Zvn`$qjeU-;87+1N-pd6@QvjPaUn0(tJlcWs%Q%Jz(fdB~=uK`Gin@r)c5 zmNrnLqw2@7lzT~lxFkLn^%<6(h*sbY^3YYKKFwA#Syc7c~$2bzi&0>((<3uA%mn^iGZRjqdwN>6t1o2es9l z#Y=zvxvM-6#OwSuD4fm8yuNtxVrH51AT8*Bq8R9Q03E=&*dO@cCjQH4)}Imo)pzl{ zMzZ|;vnSlQpZS)p0&^W>oI-qxm@k;Br`P;Zf&0OU9)nLI0U&X8epCXx3g0Gr6> zt>y{NnK?IlZD4MC(f}Qi#ThvT>|zJV0VaqBk;c#}=L)^eF4{XX=0|COQI1ZmB>&Vt z9MJC~|K!Md8JA-sJ~xZsQ<~4~lAjoiBY$u+26Ma)6!hp$#P`ELYkJ7q&*Zuqa`W12 zmt8^k{P}0U>)M(c#V1w<%Kaxd72c7O#OmF!WE-+GljVdW=bY2ad8^31ov|FreHO8at(Dx{`MXAb?glycuSJ@-fjB?hbZd?Nj&uU$RQiNfhD${^4sZ@Y4oVyV zbAa_o^dAR)UceOn^V0I7yLUUgoB#2(aEHqLKUOgJ$;Y3#AL;x5?svW~Pi)w&%+I(N zSC*~*6iL18_P~2soSm^`Y1_pouY-sj=z3{xf4f=ZVN{~M+D^jw$tNGVx88in&PpeJeTpL2<`|+0tpn2idep2rx;uR z0}bmM^^i~ioTbPTLrITE{j065HE$*b zYYCVO6o6cK-;%;x+tSETnqxKw2$+(0OEgX(PU8Z^1!Adqh7BA7bCxrgt24J3n2U*} z)<>T|vT^6fwiA8$A&-3aL-+1GZ@bqoU$jZweCD)`0msDhJSay1kOS;UHaH0+>|70= zJkK!%ygw@?02uPeV_{6fh6hc2DT)CBEh2JZ3%n)V3XG6D$8k7AEW?fs8x4<2W&nWX z#z@AvKgg7qpE1eLnEvLlFI3&*3k{<@N$zJ^%lc0_2;+a!|AYW_|8fEVUx z-MO=p@w2Pa9h!ejOBS`F1j9?KOYVDm@B6E(w!HDO6zK)&mh+I_zo7TYJ)=wpyDQJ> z+VaAzm2)7skGaZkl*A(*SsG#&EktRWVeuQD59#@k#vD^g_dTY5@x4VrZgyeO-MW3p zZ97gc0dbYV9OT<4nxAjIao_7t^$}ged8KS9yP&bJ%+1;66Lx)$Nxu-SAEqQpQGFhg zER2jx-;8;Eqkf`uDiQC;#F?xdyEi}2LE*RU{v4*E|KAGwU$V8jI4Az2zu^C()nS|0 zJj(K4b3smDM{B!VoL{ir=#S7=G#1i(Lc^mhi@?$)5{iW5j z?q$h0^wP5Mf#%P7NV4wVU-j?lk!vRZQ+fHx&tEUo6ppSW`!+B1nLtDOPSCAGkp33L zW|k@GLdwrrZgHyjhf}?e+^i7o)!!YG&b^@dy0ww5Gx+#gxI^XpaI9eN^GBb%zyIYg zHK8BKL%8PdZme4oQ3}Cs-PPmW4R`nUEdy*fZ>+hsYu7AC?uq~e5jhGj{_H0|agQE8 zO#UKW-7YloFe=erEeNBhk%U_5G4;+=~DWJPazikYj?rv-({lAg+|N50H z?)ud${yC)UB;vBO3L=jKqJ~o-Uf8mcIyVbzH4+}eZF;b&24V#{d;>>k~lwz5n9>sNP>AIX?x=Hjat-5>o>{g)!bgP#y+Bw^bxt-@>gpY&hA%#4+; zv8jg$B1@>03L>&XF;vD*G?C|csN{}}NO@A{uwR~YkKKQP_?9-;P~YJC`wH%d`u)qV zzb=_t^L+GbZEcb3B=x%?EarW{h53C=usk(G)buB778+4mfWlaqkn$+i(k06 z?n{5_chEKW?)o{+yts4omfKigm)vr{)i3D^qpRxsHRM2Y9_gF?5=*PEzWS>8zTtlQ z)1SIWnf`BY9O~U;6A8{pWYZcjLc)`}NmeH`%4{>?U7d zzu_)lx@7Mo2h2^IuZjGivtrre`c1B1eck=#pZ+JeD8R^a9Ka3vC!&rsg>27q4KSC0 zHQP|YX9V=-iOlIS)S2^}9TEp-NWfvB&rV<9NIVkl+uB-P8>=)eMAVxEiU-{v{NW$E z*RPc2ANgVa2KlFSikE-i|DgL{6A!5I37A9vnGC90dkcDw zt&&$bD}`yrmZcCafmIVCC{JEn!AJoNKpxA0EMfcOa5Nb{jF;K{eTiivh;X3LK9bzs zmeO0$q@u5b0yCqUfJCsox2Ew5=uk&45U-&zjeSBq2t@e~TaFPQeZR9r4w)}N>vL)> zs--a-7}A($bZtfea9U%W6o4JoZx;s(uCEUe=cAc{$mL)epj0Z^G8d7piZZbWz4P`v zZe5^mb$;FzG=3{>p?>Yue;=99J(y%8N)ovcvB7~OvgQN=XZ0D*J_R7MY*i2lB_A@B z>tItrXNTkkIq2+m1B3FC^*2VuhZ5hhNTNU>e8+PZk4)~wZ*ptGBbz|ZpIbFRM}&^? zAlKxvvM~vn2$4LQ6=7~evG3a3h zAbStg_e76*{)_iHA~FRiTV7tYWOjCWv$J_v@-r$qp=8ilB0rR`vG?@ID$2BEny8=E zAOoC9hLQb1L{>t2fkoa#_8J|<>H)-R2vKa?>{hO0HX@lGl%v&0L=L?ur#7UUc+zX> z!Y#;>Eb?SJuD!Q9vF z={LN%87a1g)8zcMxZWOevhW}qTtj`GJ9Vnc)zrS=szo*A1d*SW{SV>KZ8|D%K)7WH&Htjm<)MOmkd0LjDo;YW`1ch0uJWs>N&u|9=%6nWnQFw zIf?}^cV3eLud_0k^RH>K7)O_FqF$6o-=_XQ^X+fC6E8fcv6k~C$XTqeI%x$tjWlNR zEKb!{yECHZGj*=e-R^hc38Y!BSPskua1=HLK;Z-kpKGSct#M5Y2u+D5qznL)EGPBL zAoysU3<5j^5GP=cz5zIonsf6vZ@nd@vf>8yx9x0C^~;ukQ~t;O2Z#c+F@OSdGJpU% za*I%6q!Iw+CIG_ff1$6>qH%tQw(mcuf`nqy7&IcfHFb5CTXwR#%AFLyDN{fZ(KHvW z`gx7_Ijf~rN1lt`d+yoqm^XZTf|tjQ_0`eCAS z9X#ro`AD<}a?*o;}{Ui6{`E$0EZeUKj5Jz{O)0VaYIVb^h)R|)g#N9hz zgSoHU(c8n%J~c46%5L2DRw@c`OEVmBc?5@7BUi3ob%ntJ_v~{g+?fW(nCxn5Zm}Jp%~G}` z7PquC+Hqa%hGJKgKc=hO@4y=$Nr0U1KaY@k_||u#j^y32RO!Kym0l1T0Fp776rdZ| zm`4OuiMSPHWGLNYKrZkw0dwRglCTSyTVG$dU2TVHj~;#I-rU-9FE6jSlK$?jy#A2S zXMk=8{`*~iKCdW%IHHRzGf-cN`^t`L%AWXWtiS&;nCk@mGnV#t*VNMN$##md>sCBB zY83w^e@$ofct-qhlnk+JyUn#WHdrn#OGytu`y?6B*X_&PjvLUio1A4bBG>@A`ZK5e z4#ku-Z#8#0S%5@!<}aHN{AQnm&(YN!Lau|n$Fw7uOMqOQTL+NybwxJu~FaYJ1Fv}w3yL1V_asKH*pRcYyUMkwA z9X2jdwjiyqCJJDV{`$VlV-uADoyIHhXQfAo$jLB_i3cp}4q8O6KLK)5_@NJajKLhy zL%bbL%zunnI3kDhB?FMdm<bD)R&4BtMz*BgnG>G|kHd#HA#eHZW%(&Oh36tbsW%|9)xJ zZ}OqWA$9OLy{4z5+dDFnZJWE&9VYvd+YZS;k@m21k>(cbGbaD&)D+uPcwfJ|-zx{PP=7tg=QTFWeqU)ymwg6l~LPk^$AZN-jB0Eul z!nC`R6qA%vs55897)5xgeLcOdSQwDer*o$?**dLwVojKL&|U5X!4-vfoH+)iLF z6a^-#H6dQGn~J(!eHs@zavo6X_ah2@qo4E_@ONY|CuL;E>1k}#b=(jC1DJz|%mpAv zjvU3aSQCd3ZyfFFNiEr2=lC|Q<|!Ca7^ZD*AxKrWSG$uD5ez*?Bc0n8<25$QlF zm`jcrBNDB7%WiF7kXDYcbX_+&p^@Cztu%zf3`Y@KH`TyNa2M~`R`LPQ%qq7!AJj4paY646DQ=s}`0NTNjVy%P~Z^lr2; zqeh7mEny6z*I_Vo_W!)^`F7Uw&GNz8&))mlzvsHIyJx@}uTG8Wm2|m@@!@suDn`7~ z%veJ3Da^u>>G#vgy7!slpLk(bjg|A>RTT=dC9#J9u!DnD(3K66e7K-xP35sVa zb0DYqM2>!Pe&x;<7ZdFwOh}f}Lecwtjt)6 z#GBVX%oVX8tQmd-fcPzzF-_XxFY4R@z>NlAx)h_>XE2N zf1iDd{`=H_07T3=U)$S8OzALg0*v^Gxp&%>BYy4EgN868>v0!8Ve{I#)FV|@^ARNJ zA~YivD`A^ZE1AYQxf5v08ngdd7Cy%4Amyy!H5=(4-Prd7lI7z@CDn4`uiK}hkcaKB zX3fQkU&*?FymL3-ECMzi%)#9)m(Tk%1YyGH4d)%#pl((g<@kVijNs32q;1Cb;MD|m z?zuO_uSTf*YfCv%cMV9r?rJ>~wC>G6t&PCjl6+t5N z(YK97h{(K(8;%y_dxuVZ9`)!GW@Lw9q)2w6CQB+^=#$&)s{#B($1$~Z)Thp>PS zly}(Zo3#;@!jBxm%U*QlheN{tfiS`j_W`WoEp5LGTO=ifDY&k7x~C-QX1hBlJVtA4 z0k}j$(@!FrXFS?iD3`N-o6Rokg(E=srbQjN`TE_}eV(mCh^K#7Wbmqd0QsmJ8L54n z^?6gPwBbF1t~xtuu_XdOdkF47`u8oQCa5>mI(Z~CiWKR&6gZfD_kNvVay%KB)K*SA zG(6c?0;5Iby}j+O_h+O#cVOSJ>_DfbSqftNP27fFBlLc`@dqQeo_egVSWh1Sxvce; zWYB{;J{r>_Yu_VV-;3?w&}eEBdCJ81#6VBieNd+zi8rUexYpi$Vd@0>P3%w7|1wGDQblPCqXu}V8eX-&jcKRAU>~K?a8I)v=NoGzsh?vAOdqB zzI&laGESL!+@9r2;cZ%Shkm~d?QQ2%(rM-jqE$2OSf_Z*$vuSikZ+D}Hf81>YR+5M z+7kiNJzDnh`gG(Uc(oR26=C_rXmxTl`tBUi!Wa2X%S#L>bI4#gddIV?p6>ZifVTC` z%s=HC3NNJa(;jz}oU%Lc_seWauX#{%ZBlgTbMuk%lb`-5sDA~h6@3%qHQgrf7wMm*NNFBuojMVSM z)pnc7g@r0SN`3M*_T=}`vlCZ_YC6+K%fsN zwx;zg+=7ex9=4h8JueA*AMslDVq!xw34+q+18W)N=F#Wef4mnQ_2pJp8RAZyseQjB zNR)qBHyXa+!27w=%%Kbc5BM5aupx(tI=WsMt6For`jL6$R*p>y1US7u%`rB46JzkK zm{w@nuYUTd^+A$W$;_BjgF-L?sISPf+cPlonDj#9f*;-k3uFl-v&GNXPlrc=yu*a! z)Q;Gly)ZnJ6+Ap(EdohmNd%8_yjF4S=FD|itAbW*`N;d49*eI3d)dmndazaPu3*xU z)0-nnf$wq3`nON=Q z8&#eyn`)y+jZHGFBQ#jbhFJqR>C%ua{`%>5{Ofjw0#Cm*Rap~51#W5cQi;i}v23^Q z(vqn^_BXZ4>!J$nO-ylJoSFMGM;Wk!7QYy2@f2$lVfIPcA_3S%L00_MI(SJ zuP(&XRS-g-P>1oC-47iyC6cAXOb?QdjC#h^ej$*rIyR9&hO%NAFWs=>9F|{xyr3K* zlT=IWFdSoJ1;=;f+!2QjlM;J(a*RAZms`rq36)#;_TP0Rj^eQ;Pqbr+$_uy53vmK= zz@!JZ7d@ds8hU>@#dAvfHbVa0DDc4vVX2b<@>+sg#<8oi8m1y!77=$pK88acB{104 zVG*v#|NjLh(2#pSJ1Q>}Jzb9)aR_At2&V>K`7l*=+LGbpCBR(P)z8I{bX!7k0Q0^$ zO`1#6l^%ksTK6rcGZq(UjpQXXmB?qc3vykOqcfQ;bWa>(PLHM=lGbVMyV=66Uwr-i_-S$I4gVh@lIQ)_#X(oWH{k}G^)9kedhE0#7l$j~ z>)naGtM0+)c9i|&{;H%$2<}kb$fN&~b!YS(Z*vQXR!#DAunhFjni*Uo*pW1p{WNFv z7uzSpDffe)T5TOadJ>eksFeN@b!ta4__T+Ol~N&7$Q0_k4V_R|W+NZ;`WR0AeX;s- zKaAxlMV()jz{h;p(k5&>nE6gW;+rmGC|gp36N=`_;YtFY5-xHCx`^)?!y{m0sZ5T`xF;q zB(1yj8dfBGFEM-%GKUDjJMM9nQGpM?-#^xX!F|WkaEO?-)xg~0$S208;SBeCZ-SG< zq@;gMmhs8|J{BUwJdkpO;o8^@h2FPHn3!8`{5CtF?UbG8vvbw*;G-|GiFLChxvBf9 zTx%e6$<{A5RF1k`q^kHy*@;}`!(3mam!Ou4icdV3GSX`eX{>4t3V1RtoFW<5_%cp1Cq%L3hykH7i-*NfSew}X#u6vHbZ$ltycO^+Y_@xvA{81+>pnU5PzVh1_wO2Zd$vlHBS)tP0 zxlMXWAjp~+R+YBf-U)dpFkmsJGOZ`K;lnkR?;`aJy$kpS);l#VfA`szJVjAS<52K# zSqbZ|C!E~j0*A1=H)B}H0$_Qfo7thY$FG}XYP3AONf}|aM%kqX14(zn{@NOaeDHs) zE`&-du_ul17Jll3Vshe84|4N;AX$(+t1{v;#-_P1E~ZKLJ%YT0;k}gh-vd!1$gl+Y zbmMj-dSTqb(C5RFfz8wY zQ7&h3i07+WgJ)rVKOeOACFZGJrJ9$8lra+OT|ymJhHT<#ZYjasHN6}K<+$w=U$bGo zNf)HSTFThW6fJ}2d2jpLe0IO?n2=&@bL$z{tAAienrnExt&0XwL@u&3mQHVwityD^ zmv0`o3tfDxM%}6#D@Ge1Hnw3tqj^6tJveTbqm6ct`Jxsc9r?*qtB3jyj=CX{K}J7V zT2Or$n)Jq8!YoNF_%DyAw^6!OHmNbO!F|Cf1;O;=sDFpqI=kpEh3Z6J`f;cK_I)i? z5U059jNOsWpS0XNp%7YjG1}Bc)JCQ2V(OFHyh_SU9!Xij;@nRHR+S$Am=ky#1^{(B z(J}J2B$!tz*7LxJ6diD1{^#=Qqu*uZ6SqP^gYHIHT_gXi;iLz59 z0K}AMII%$JNkj9H%g(HyF4G;G=*U5xE7+`eV7+}=#YAI;b*%!Ja|Zr(-sB(rsMY6b zBv7rJ=tZmkTR2&$P)3L&GM52)E+mN`x@!nbzuK2#goL#1xyika{LTntC-3CP$h9Pp zVYEZ9_Lw!LesZiNEITrTZQ_f2-u-%>JSwx0s(cTmo20G=o)VCA95Fqz)|e`L6@xcG z{YFcNGPjD-0+jCyTZyd(=!!$Mx zi;q?CSstzjM6Ql#=!96Pf|ApzQ8)FYGNI?ZQp7pA|Cf?Ql&EZLt~x(p{j0YD#25io=K=`q2oym(bgEeR30{jb3> z>q8*Xq_;BryS%y2mOFc%B$i7rDl5P|`bszZy>-PkAu=*8xT$w9!v6qW!?64d5y25h z?2r(AeHnlxkc$R1x8828I{5#x+_NT}5zq#+d9|Bt6n(~5>18uL%OR&_Cc*UYDh!K> zCJJ#QMn^5moFF^-OgpE{M_wgIbDy$*sy7TN)Ba;jbaDOS+bE4!m{b010XU}M^!uK4 z`Ea~HcGM$es*&iC0cr?9TW9jn|Z-u?8Uy)|{QK8QK_a(94 zPAi&=I4l>!oxgy!rV%5_q~|I$LkRlVZ8H@&O9j>N8eUASXITSMZGua4>h zx8o>QDT4^3?vb=|?8WRNy>|c$E;MADh7QB47TVhCv~^vfEi1Ah%VjPr9C#yfJI$^B zAtQuTBzeji_45l`q`cSX0zJEqups#t;uLC7_(`kAWAVp#XMu>`yOn?kf^q@b<*1FjFe zu}0##50&c_hXY)hz=N(Y^If!+KZBLk`pL_-wjng8)u`2zmOBHM$r;3cIch%{B%hSK z>@b<<<-FTqVqSuZ7iSp0@?4^jO`H>FIGg=reUyJat<{GSh;gy zCIL7~S0J>uLRg{L6Y;o1#07?Rj{f69>(Z zVtF=Wz?fYCP3T9^mBK?D)bS4aesF=}8OC7|LCTk(QxQy^_|5m&B>~*tMgdfz0e|DV zobGbVh41$a;X_j}KX>(^xxz+}4&vkl-Lp8z8G_z(b8BN3%k@_KK{Umn0zZhlDmDRK zi;32>WVnvu{D-B{8#}$liipB-gddYxE%t)r$8<&cW5Gmv`>e7Tql#$w+b^#N{GQ>c z{W;i^cS?kKT5IGe)Md0D!eUF+1f$%_hc*>;7eEc#c>My>3+BxF`*}zi5M}BlA!oLx z9UipdhB7KXhE6KpwvIB(&Y#`xz>gc5`V@-O^;$%&+puzx1n3DO{rQH1MUjLOExILU z;ayJmn`~btJis9tE9IP9FCUyj2#@}rLc6f>?TsOQ_HoDuNiC*fK#_`9qA7l3(T3X# zI2wAyHFooJD(${?R}iZ6`fOpf9KqQmv#-g?mvBOKiGW`Bz<^ZnH=FqQtEF-L7%f%T z+r#8`pVP11KTdDHVCCi}GVt_%( zKE&c0m1pDb!+WZ=?=PloxA`2VnE;^0L8N=o%lu*xJH&1Jm83Y3R2XzeQnJ9jp7Cym z$^8trE&TJs@$(}5dK~U})5-YyW7FQUK{Q{tyyOh4?CjF0G%jS+3vHDmi#MscN^38} zh8#^5%!Mr!vGl>Q;?zOeIh4`*D(bw!R zb#BX?To87}@RL;|V{M*9$t;3S!^26cpTB=u*Fho~FUkA@ABjM#V{C^-^s8&}4Pldn z^Gm{nJ>)?4mI56kunS3uV#A&ZKrc{5>-$M;71sD8=Dktby>iDHZ?bIuWt43 zi;9!+*~LjWiz+QnH_{wZaU?aX?{OsvUwSQz*w1q1YpEA_YkXDFwnni~w-kKg>V+NlEHgqglCMP0;H^c{eZi%BMM9LR}6cS3l48+=Whd5H41(^V;DaQv<=Uwa@68 z<4nu^MON-+0CSoAxD({KeAH4g>&v&`>j5M+t`t!nz~Q7cepw_g<%k|BbfG_+7);-O zYhK&sLu~nxb^7HeZ?Hewdove$&45CHc#fcPC9Gksu~!KJ^8&Vm@geEA+!?~Bqc(VdGi-pVmjrS*r0m6Uc*~~t9 z(eC(TC20v@&Q+WvlFX0KS_h8qMbE|{ zpR^dZLF*)ZI8Prnb=Dxx+UCC$5Uw^p51zR%2u#<8L%MuTB0T*)QMDxTI_G|}{*vPY z+}x@`A)X;UAoi#;@wliNbC1q-{1W2Q*WJs=3K84)@84H|5AdNn3UG8NZB?qKWa8$( zl|-+je!v2ndIcwZ+5K`|P*BiJi64{SM>3=|vv;(z9a`!A#mOJtf8snH$P<=v70N;> zrF|k?l+2Lv;u#&UjjYH|lhn`x>r8K1GVXbud^pp`bAW@58*D$moJidE~54#I{a0RaJp;OX*ilqE$F2< z45y{z@8mGi_^zp~*9IX(L-WW-tFAS|wqZ>;g&~Qz_km%69*CVTH#hTRmQ!Fi-_wb&c_63 zV(w0UebxrS%HD0^qnDaH7q^g{*8!J$QV=g+($cdCzVWcA?{f;8)z^V%T}l~7E%`yS z=p}T4me{2Ver5JDGAVe|a*K|ww-dcWBF|Z&hWJj&olDdC0Nlg!LoDC?-3G62jhZWE6y&>_M76GQbDP!fL zLX1NJp2GaUz~p2@75qJlTt@P#>aPBZ)q%hdlBb4*Y4sYvtmON5(VwU-@Uq|ff0jFG zb`;yMRmACt?9#D7zOHv|;lGsUf~Hoqt(3o{_t3{;E%58z6`yI6cEA~}U)=XFmWy5l zG@c~|6Q+n}|5%jH9E~YAEND{T8xDKy6>5+x_X?sL6#r%Df7d+>cE@J#{;pOwwJ;2X ziTXKj@Yv_0HsxGvDYv=N$J@%XmcngBlqVm5_+v{hu_q=W-rh=hOciHq#&}*mTP|f- ztf0P(Gv(9XP)W*Q#hpcaW|(BOMkqu_FjhNkIZfbNto3>~;Rm7~_5)$SQeWJSkadia zw0h$F^F)E%dy70uo>j6dk_4!!iXonIGy1l2KI754uY|SyuZ>|eEu~u1roAa$;b~I- zY@%4%HrhZs@6o!Mbn_!~GvV@|M+#*v{tX+HW#g#f+fM`OxhZOks%NP0J>5zmr9N8$ z9^u`$lGK|1`v5W(74*^|vc&0y2-;u6^oot&Nmt`X1kL}wLQ%{&bVwfcpWOWd<%jS* zDR|m^@~*wIM&2$oKB||3ShDE(k&x~3e&jc|_9yN@H0923nG0aXoN{>sd3b+=4Xl-Q z`>p6ZS*l5?PFDk4Zw<8)01z3-`&w0hrSKMyN)gztHA8z}s>X}92Gvm|)7TTfAB|H= zB5~kUH1Fru=-Mk^j_1I-`dfP2pX|d^Y@F&z8m4Cbc?4d-n<%8d;nNgtVhK4IoWTa< zM()q6v(zXg)=ye3aiFC?CA^bXqELMQ4nQ{zI3&k+^P_k2Z&Ku)?@^lEvyt5ii5c)H zcrths1L85Mv3U3XBN2A7UcjO+D*(ZBpUa0*T2=-?U@hM;@~(GI-DAwB;ChT7dzFm^ zmfPfH^4*2MxQc%wrHjL7ua@MLpO!6sJUu-ftjjt05{IuZ4M@e4VCH@WWJZ_-!Ci(G z7)f(UpV0QwNdsf0ofmPkO3GZ4*wxAKz&F^Yz;mGa+xlwMIYH@qq|+Y|-aDOs(+^0_ zB=YhZF|@AP{`G1(`NOisGdfIWGXS4>UXujxwF`8u8O#=ViB#$Pz|BtQinT&zr)L)Jo6r&`1skEV zM-MMA?d>TpMZ&d8$&{6KKnZD4QGwv}ln8QiOW(k9b1RFtzV0hyn+P4S5a!xF)k(gq zNS8A6QlH{&I|^PHq&{XaK_A5}>koyi_yW{)iLD~k@ITOWz z_Mhl%(w!V$o>63wOZ_^J8buP^2OFt{fq{K!_jw7GR95)tRHZmg^~80b;uu$-BI{QQ z5)Qa=wp)lkcc*i@!`z1@tI7zBiQ(5vB6o=>T|xhv=L$6EpPyr+%xc1j$&dCMTh3nG zJlbAv@}2X=z%~{Ks;;Z`+=0bGi+M@KA9UkiX`lK6v1b?ipEwn9kh3wp)rUuK-B78N zcmB{(V3dpyC<%F?@hF~1kSd5x`Dp@alTl|)%NVn6MrctvB_>~;V7Ja9^yJ+A&UZ4* z0fzqdzvLe_?mll{4j~zyKJsZa&~-}V-4Ux2zCh}X-QCwr!?QQ84>rf$FLf>**Hq~@ zET!ICS$gXl(Y;nGsi46{aXHsH?e?zxTa>%{vnUwx><|w}k}8;D)d`j0aWCVVhti+o zW}2@CH>kqnr6RqIczTGaIzL_~N3nl~FD_ z+NGLu68#_nYHr=k9N#j8t$3=!-r`UJXe5bK_SwCLC^k?$!>taIu(h9G@g>F!({Nh1 zeILHCmWia~oXnpJx%ZmmMC!e|g97?}if8W0*Ky_7cW5e#d@9YCZ+E^HKq)ooV4(-> zpPIGNf>S<0Y8l+E#|UP;v#KjH3iYG^GO-KxOl6s8l0v;}et+HSI9W)uW4tlAX$j3) zXO^2>&xqVoEcTohrz%&`+dgeMK}LmYYPZ3Zo068!Uwps&gn28NEvOP!fem;2Uf+aT zSDi`9DM2D|s$&HrR00h-SM?uS9geYr^M+d zEhjz2p0#lo=7q-L0u8SDBh&Q7*3)(D;*(on0dc<@7-uq!a*5xau$_m*VGs~|_`Cp_ zDkB~7T%LotYGBIc;M@c!(EM{BI-Hn9s`qj6}2R$%P)g7 zc4IfZwiB9cjo=q(fd(DB#kly&=MNpVPh_5Scn$y>m-uzI+#9h(!+f44krKPpf8;55 z)Q*}e$uLm^AC2{0O)Vl~!>gTWGz47~j&Z~R~SzHqtmE@Y$^Y# z=8iM|rNq@qe)8jbW%{a&bG<2;^ska~W-_UfL$z9@%ikJ~{0At%!j|W4npD?x4J%C< zS0zHQ)6Fn8aIs!d`aEgt&mYA?L;OsofdOTK)cr-?UIBvz$9k$tXIz0ZGTkCdzcy-7 z(BSl|KUez?;RVms;42x|55>#zcQc0*RFr9z-3rI{h=M2{8@4(raxxR<*A>3BYDBZ` z_XCYMN1Jsvj}Ee)@%>{tdcARd6Ya@P5%-!?-VSAM-*t?;YJJ|^NR}D1VeP;&{^+5V z4m5B-vu828d+{|f=C@ENq}W@W;vnLC-31YFsiD4OZf@=l-4YCvW}wp@GozClw#0wd5|9mKLA^ zC?r=18=26@PqreglGZ=(jI)z4-6%`w9T%q9zBgW0ko8i>~{r4tJ|4WPVA^F{fzc0JOj-~WD=|H`N{?kXCG*4cBe+@ z7y%H$mD1|#zkj$SSy6yzs{()8Ini?yKKPKf1U;aDMxEb`%yM!WSkNlnsY;HQXH+mGz0jY8fO9J%>QT8N{PO%e;xzQHn-fh)bIi7hj!rv<% zsG$K~_QA-Cz_0M@x?GRLh+Mh!XKVP#O`adw!34;B7_Mkit(WWlD!jmN+Kt|m*pPl- z>Pk%hIMH${kPUX@y8{oUR)1Pp?gkw0;d>L!Uz=yl;O_c%PUhveYT?%Q1@5&p2L<`< zj#MCCjF+4gtW{c4Q1%NS&U#PSjMPIl7ELeiySHO%?l^kC?`Dcy z`5BjuQLp+|d|O-FTiN@u@nN@493Bn;_e;If9v+s)68@L9mG(Z54)b>+;skaFHTThP z9J{&CWz_E$Wk&t>WE(Bq-goteF>fp`EieX;-mCB2^laYoYc_s;5O*)cwI5<^4)f2g zRb8JLvsoMuTRbM>2I3DorW&;csOwr4CC8_nJ9w+jss}rj=fj@Gjr#(5(eevoOw8#c& zYj-QwRGd8b6s0X#g%iOU=GC0z_h+nEh6N?jxTQ|iNxAvN<%dn6yu&dZ~Qe)BpXG8bC1 zN}|FJ(*$K+r&V98wf-=(N&O3F5-kfMgb=GN*1L&U zMgmbhU*{AZL84rtdF(BDMec_P{i~Wg1g(BTd5%=`T8nRx9j6F>Pjp4rjwyYsOb;-< z2|bFF0y_*CDK@sqxmO&HIGKC>aqY{5Ulc5_Z=_uME~WB7V4+2c?Y0rF;*bW*qgY8< zF-shUhKHsumYpYE^apRmw`7TWquV(7^s6d_{={Y;4iP8>C+0JFHS0={Aa%pViJl?= zwh==*G{sVTNZ%>FGhC=!bSw=3>%DM@{nU&Low;OK^n{)ZcWx2DP6h`Zu>`B0TY7{n* zqI3Kk!XMwLp^s4(f1p@-axVqqy{;e|0}i0uT)3WG9B7k{Rv_~VfWL^%%gIiML3RgD zv&&|Gt=}0oeRMl>YQMgc;SC8gnkDWq&N|Y?llT(Y&KVXH+QT3Z?CXU*Ac!EsIHT1C?OqmlxDG;Oq zGT{(maK(9t5bdhKeo?e5x5vIRrxk-}AI1uH#7gwBe6Ob=!#J)XKg4FRJPggXhneZP z>P5uz{+()+UcF3QW4!sPH6r3|M8UNxL8IBl{205R&3C7sHPvD0sJb)kA$J&;T1AeR z)&zw^K}oDc$+w%{pw5q6iQZBb{*TPq9vWWhS+3*vCzndopkcSmAHbUkcZt2wfB@M_ zEkueWKpND_mZ{6FraparyRv&_GZ80-uOv9&jkBEyHnhgJPa&P>jZuLORUhdnemCyY zVhX=kN)vt?n-=U&(@y8zbSvMd5Z}oAtB}dSg(db()L4HgrphiA3rQ-ZWq}Wm>UXmx zaqd67O{q#C`Axd~yPXUNCbY5EVM{YkEPadz+FwK_!k1PC1qnRSSMY;|?%b^cd2)J~BqUm7WiMdyosU;*`p?s|vCl5Fg8;QjS*}gEYru zqXtH)`k&4RxCdz3xQ}!%4o%jzcOIU1=Pr?UR*DP2u5_eenSK#uqSlG=9zn%$_08n)3$}p3QyuU^;RIpri1etvKwH z7c0P!%k$wAq6vn~BNMdpc=iP)!kcj9GKa#7>OM7E8%I7j)-I`;M zRC%cO8DH10PT2O@B#18Qn_V!3LgFp!@FsbBxCE{JFt(&-g+$#F&j7cJH=u|Q8xmyr z`o*Eeykv&-b@=m1!t5`?`}e?b=fQHp!C&R}rp}(ly=OBp`9_j=<*Ex?mmGlBvKmZ~ z6I0hisnGg+6~&v%Z8O|bF^##>Y?dqQBZ-hq)a|iIwu3!Y3{x4h0rAS!Vzg0&L@VpG zD`-{mW!lAl58L%XyvhkDSj)1L>vV`m;IdW&0COPi~kZMc1dwlgPfHi2lQ%Cg-(bobf2xNTRr zW8KQ&>FwKztg6vbMGVH|7)&{A2?#%MW|54T+Kax3Xm{GTSfCmq<6&c%g&TJ-dY-H> zCWf^X#tvOMNcICAyey%u{W)AtvmH7tzzh;>r8rP%5^ip7>_!~O!_0Dm@O=2_^_sl( zCP7(dCiSl8d4}7`g3k8i5a5IC{!eXQ(I{-(LJ=9|H)u0gpC(T1e1GNs`PT&c($f@5VEnv9z~@$!J_{y4g!&7sF?E0@@}>q4L^NFt#o}~ zQtvIrp>W`IHK2fj&s772*QL81M}{<2RN=0ldrCk2jZ7yc7rNcF7fji+n3ZkDa$z7l z4gI4@p=%5NL~1`0aGIJ*r-A$Y;YqnLOjNi&St^5wgyJV{B$4;6f=Z@ybRhcM|H3PE zG~$Cr+l)6cQKCK#lg-LSN51(-0?KSn1Uk-;uc$Y(4_@;mzM5s=(;+_0Uea}XZPvT+ zb*1Lf;Wz!g${IUrS~^U=;~JVAUG4|QH@Ezcwn?mo2z8MrBwVj(DUNOU-8atBMsY~V zZIs>Q6cLpeN~#>M&?Yg)mUeV+lgsp_PHn69p9}w($4TBka|{oaE>EQ7!`{=7o|bRl zj_jYE&?y=2N#q-#O;~H!b871+}h|5cn!Gy9`7@!!| zbSi6VuN8){8+I_Ug1hBh?Jo}%+<g=o5&kqtn)y1kCmM z$mjvO$0A!wz_#SCvPaGAO7zv>x>h0q^b_P2Q#YK3hI$|MDXkMubFcQBfgEV+*}-3d zNoYP`AAEI%719O#KYj1iL6vhG-oXFi8DbuZA;Ep=teB8-Xw)7|k!Sz%+`g&s$2Nh9 zUPvzNk-7PL!|K|neqO`1Z``47` zXNt7H;bw8#Z?-1+sOq7|BU0q|L1lqYgPL}v!&D4pm@|91Gc(XCTSGvWei7dD|2(J&^|oX z&iH+$(nSZWVnn^$zMFfSsXt;xK7tbMpQk6MFF2#&_Cw38IfZd$dp6)2JSty`5hRJzo+!nBlUL zEr6^Wcx#s9tc1D{2TS`c9?+5tmunc_aeQF3S=`!q5^l`|W;Xj~;=@CLi^nhD=P0{A zucAnXhe5&~cB{9|t7G3xdNERwqj7@4Dpu)!?(1qVF+6~SlAj8bY^$$4k_f(l~CVu64{6-HY<1SETNDi5fq=n4dTGz5XqY&Bqz0j^i$iI2cx2 z9{5oOUxisMz%~hkXBPx~!v60W9A^+A@b-85W;y8gn6|{L+<8WokA62}jOeJ}qdM(m zZ<)6p{$x72SYV8sUb#tQ@T^$JW{>J{H|d;$^Kbc~OsrZ$!RDy|=hS{e)&AdiXI%$h zX60`MFKDh(0d5fNvXr>2tZcIfo-X>PQK)d^*w|>hIji14U!INEbi^VTJom#<*uZg^ zA2Jt+bscU?advr}Bt_jqObjM&K)q6qGA@(hc?V~lD}l3a-)c}&R+1FmpA1s$w0X4) z`-^WMEk`3y-=2TDmH#G&nsm4r9p7>G+W`xl#Ft)QDkJXPU+^$IZ1i0T8C*(~su!1X zd$)~@rlf}qXA#Y9b=7u!dZorGqVIV8A-(+b(#MY)z=2a;pp*ZPPTsu!tlEu?^uhv6ehhh~SP|E3d-IXNlT}t$*`=$+ScoQ?m)`Vy6x#&5 zIX}CM)zQ5|DZfRp52_CAXY7E%H_c^E+*EJcENJGGQL2MGtBNUgjUC| zmz9+gOzrA|Nndrj^Pu-9cybCp+qqgfSN~fk`*iv={R)saL+H2DKtF+g9|J>?v0nPj2;HobUw0b@=5$M!2JMviEe5Ugioptt-I!AB;w`-nAX z@r%M5gmSz$6C27r6-JqK?~w-O(=ZDggXL~h%AfqOdPfCwI&{l~!ho_M;T~VWF7BP( zIqKg7mX}Lk+@TWT7WRQ4Nfp0)w6)( z_;v)@QsdyLe6uU_M$XaAkc(k!WTBEyKwy`xp2Dn5*gjU9CVEv|Fa=1F{<@oNtvF+08v3`9F z1nPX3mRtA?|HiXV^zvxkNt${LWB_qjZ6S901INF&YuaOQ!AgXb0{k@X4jq;cdZrBI zk%QjDJvt7%b$AzBgQvR7HV`1ibHP4Sencz`2&@4A4`vj%6`IQu8cuP7FUCs@%g=(O^>wuBP|are1?u z|D$l+jqLy(QC+*2K2{S;-zIv|!ByBeFy}ulZJ_(IJ!I4`*jpcaIn%Zj=!dFye>djpzrGH+0Uxc2rz;&O-lx`#THlMT08M*#(Lv2M5 z4K>r^f9{&70+VkAa*hYgtB~t*S}^J6XTl=M9xIj+jAe%7%H37SVfKY!hX)QyTxFEn z<0G#YOXd90r{UFN#3ygvEXdzzuUuLab_|z9uJy;F9I6**dB&T0vA!NlUaZlJ*0UZ- zoTRl4>gu>AKdf;IK`WV1_j|oHX{jto$XX-XI6G7amnsFWvweE!G-ciShz>SAYZ}(p z;Li4x^U(k8_m$8^_{BH@wKRRbXe%l%AmeXu<z)WL*Ys6*Legnb$*#1O3?11+9OqDddR~&pm)y6(6BKnLuRzf-l_p;zxibW1?L~ zSq8j-bJj5lf@m0WqE!Tf-{#Y08;nFvmQ^VF@KD)Ld)}CG=(aJ~AVEO@h+XZ2(4R>q zzjbB1?u5@XI-0rck(ij!V0Zq?PpJyQi z;_u}%oPJP1sWBa1ME)Z*T{Z|EB0K#r66#n}Oxhm`hNcv47rTCpG5r5JDV;ACOB zmy|4`^U9~~W2=V#2rCoIqq_uXLz(oz_;t)6o|pBQ3EW&9sB>LH_WC8*hH;QG z`CIbam<`Bh>;W}u3ot!;!kC#mMq)fP50=m$XIHB%k883hHnFD{d2|p84|DNF!DhaL|gHn#vI2x96r((R+ zlzYghhqPOFf@OB{m(og8kb7d?{W`dAaJC~K;M zCqsu^e|+{$z1zqC)5~ym-UqrG7Y~v+x@&8UoBHOHH^=pW#|7T^9KX`?Z}~YPNdrpG z=|pz_9(~WGT%zf=uRESYBP9CE)#I}@=+z%zw{^14@UH07gp4v_Pg~W(jEBC~k9=qH zW_j)$W-u{bb>!tXT)I!Z;pXMe_a>n3XofJ^LuE)GMXg3K*)nf+-jV=XdmNm=UxBnaiQvwT<=AAoexAb-YtqHG&05bGVw07NvhR+O$?M%jy14(9^ z@c`oa9@h>q_ZXf{}(%9HKW<>%M8n zE4AWy-fL_XgrCsCTuIRO`wXGfN!u^X&0UWAhZYwISg8F;;MWa}eb!(bd%Fl`)a8EX zb$q+XEuCkG(hFUh(KjEsQnQ*VJ!^L4)c!JvQ;ePL*@zxc?UZ2kii3}B_A=8=DU;S- zS-!OJdT;wXHJ0-I%jvk<vf?#Lq#Jkis@w=^(4|s+1&CPCQw(y0a=o|?)@%KqJ zLE^K*{ceyO#kBfNoK0t_&mW%8?~?1lBpE-%a^0@GeA`(dHGLAKJd0%c1Aa5M!1^b9 zne}Hs+a}+{Q!69$dU<1Wx9C`xS?y3UET@ACon1gKjhM5Ua@k+B_UyuRE(ZTWp-^Qa zloa-aao`uv{{JEBEaRGd-!@K3NP|klXb_Mw5E$JdB?g_+Aqb-zX(dL3l(dMF3XCpc zzz7NH9;3T!`|tO8UOaobz1(?U=XIawaU9>0_J+QADXWpnw&LH2;JNgxWr;{Xojyl1 zg#)i)(yGeRzwwV^4Cwyc7Wr9D-ap-uI|?Km;x2poUT5zaKBS|9Jj!$X#Dx%EtCYt;w7XZ@_q<&s9>P^AKkIS@9OD#_$CYV00v7ERC>0Qb4u|kB#!Vbvo zoU&R}7BqhF;yHjVibxjw#nd%U|KNi=&X+rxqjfGP$g+_&=Areqr2|v>RrP34OlABU z`tw=y_ni{`pH&6m;KAoZ_4Y8^rZM+q0Rip!#J{JYV=4Wj^(}V2$sW!a$`3c3VA|V? zw+*K2^ONSHIEDRrow?JN8_PFFgda7CiGEYYvhineE@QobxnZ!9Lzy}lZXQ9?)p5>F zXvs=}ZO_NSjkwf?Exr8)fIj7ud#i5?(Ev|nT1zJN;r8!pn{@}BU9GUG21=FWj|mJ6@ zEs*LThQ=DSj@)5!*1AW{AMcVh&_txNReGnKIN(rvX`k3B4oajH_)p}+9S{8m1--hb7GuX`gvGT<; z(EcQLo%1Jtt5HMS-Pt+Cp(n##-s6XT5)bQtzRx9c(^&o7(snsg{nu_0Bw#rL@@CD# zT_=BOmFAaUXaho(XuVo{b=jXfQ%X^^5snEB2(;9DOvtQ^;kDQVnC<`V(ffm$KiJ#L z-F@%oQ_MK=i@;9po>DrEXQNb`tCxcN5l)L6T!e!IR&f}5F^g3X%9sr;m)~90_hQB+87@B#`N$Wzi3R9mcrm>u~z!?)vOmp_#KV)#gp6%7; zrzl5RhyZwlU&m=561-zToavQ^gENxZLOdn!=}dSSxsK(ivQp7pgDhJgjrziw7V3mAWV8fH<6 zLiBvlj3WAdek|s74`Yli>+I#pVWz=A^6num)x^E^^mj@gTTU#G-5-RLNmUL0P726O zY2Wm<;Ngup^U6jOLWiN0yw?hSb z_S^2SGCm|FUGT8J_wE6L0mHp{RB#r1{}Bed_PMj781;0TC1=E0?Rpb$_!yhp8lf-3d2ZN}&sg858p`V}!5`IAts(~FXB-S-Q!mbWQ z7_d*!PY!Jy!09-$VkIt$z=%io(a73q_am7I=?mY%Va&(#HayJzRnhK%!`kSquP+z+ zGGRF?G($nKN3Jx^Rb9b@63Vt%V0`Xva91!DtdQ^ej><{1b@gSl^{Y$!HwuA{HOr50 zjvT!)r5Y_N$B})~F7L}6o%7`6?Xf4#wEH`JM6$BMc+mIna{NH9nhBw(2XO_2xhdbo zRx$$R1goFZ<2`Cs4O#h(Ldo1cW+*7$Y;`!~eaN3s*AqBQgg@@-BRJb)*ean+7-nqe3Ry;LPK53**so$J088JiaP}N^4=8bvfVt(+u(vGNIZ6Kez)=8HVhlzgp>%@?2*M!DA}B%9w2eW=j1(bqNbj?);hn1`cv&`4|y5_zxLB>L^dQ~G%=@ljWSv( zv$Q97n*nP;m6K6jn;m!pJ@m90JB%fGOs`yqk>j8XGiy1c?u8UV3@o4FdJ@W=N#H<2 z(0IrjvJWE~5_M~K`fN8`;LEiAK$HcR!iq=B7W^iI?TYi69eRVw5U*>~2%Qv#@hDKW z2$7-x9r#rQnxlrEjSpj<5}S#C`3NfThQM>J7~MX#uN;E(!$BD}^HM&0z1e`5Otb~T zm5s`fvWX6bVsOtJfB3$7*sKZh6$WnNGE4EjylQJw|Bp+3nmWt&D&n(RS+eF{L_bmwzsGDJWyjLKX)lyH6h=Mlb!g}#3tlSKy z>$~4DAod&gH{~A4`8^FyT;90EO^=*DZVJLAvypV%fL)UNu&Cz;v^d}wIK=SuPp``E z`CjATXa&g`Mv*N3iBto>c!C3Y{?^;g)^Re!IJCZN;W>Y4O47j9M;&ztY|S^*4F#yz|i{7MWU2d1RjfR&>1wN<)L)_X(A7=t8KpMK3aSW0cB z`RO>_<}}gfR6f{-;_Z7DQUE7RK5uVlHAId%hvgnLrtj9sIUbC&d6A~=N>tlmqd=I~ z44V<`_mHvlaHD(?om!F9rwzN|YbdP$1o1Q+HtDxP%-JugnyMVpfb6F*5SOxrxaFIX z_R#|kq47Gzhz(p7nP?o;$Gzkly^-myu&|f%)Qha91}YX(DGRkYC}nRwAv%fhGL+#^B%Lf&uAjU?!yx)xGbJ2ZR(4OFhFb-ys$I=xkR zCW+S6jx;ST=Q+4bo)9lawr3T&UBG2W;Fg$~t*e=Ik`b|R$Ev8GsxVJEU$hdZ%OvxS*wqizLQ$sqVMpH>b$ z45mO6(8}s_TZ0=VC6UVyubL9Z&*FSHnDW{1A|C_68oZPEfI6R`_WVady|l#Uifl_%Id>aPO9P`Vd11^p<6(>R98=V!VI?#iyGC*)?Qv^4pEfJ1a51 zk1uNXT4FR#V>cKkB5_Ge+~?29?9fYHow*WNrr(4gknzFs^94Cbc?rND708@4UG zZ!-l>p2y#j8eLwROwQngZzyArtlkL&=`sx8$2|t5;Cc=WPz>C0e;hcl$M>vQxb=sz zAh?5cZx4$-MFVVex1y%F2joXO+0W$*7PQbmSx7PX9@vq$^pAdha5*!}+;r;aEj6n| z8QA+1{H)YFW_kp*kKSCqm0QQn<`6Lo&R>Je6(O?mg{s>8IzEjj^tei z-DC3>$1$I*4xl%i{2yT-M3LE=S^eA#6-wk0UBuV|QWXTo{5_yeHGJ}9A+OaTn<2Km z=})yF$m2dbJr@Vz{SZ-`_VDYvqe$#Gv)anhgmXG>0{Rk12R#lk*0JN*E8p8{umM}3N)T-x!q|1o%6F865Zpi$4u|E4b-#{5XJw3h9 zl%~RBRRz<3h@k65qUY3N&>;hr3U$b?>FlSQuj>dXvrN<0EUj3%R-Pg7i~h04B%2u> z5P?hJm@J%(yx()mPb03h#qgA$@WttV)t-QmaTkXpO#g9S783!>FRy%p)TFd8-H5< zVj1x#LKt5eyDnxYnly^1j;(O{$H?KYg-K(tn=Pr-a=Af8#y$7JRmHW6_XWRh%-Gs6 zUY*RU<{mu!>L1bBP;^{ZE|>zIlfZsf0AGVLv5YOGv$Kx1^>2Uu=7xjmqB4C$daW5> z!(fMn68MOFV}Zt=eHX}%Ggk02(T2QMUNN4E>xH5kHZ6&Kr^Qz#Xj$M=US$od;QEd7 zTV`g+kzg?}O=NUJQr8JeCA1Z(two}$kYDchw*i=x;MCBGdkYLcYV0-~bA~0F)^YU% ziv;Y;cov3R?+nwBJ-^r2F(o(h)B}2&C!&t0SthlTpA57a&~I1d6-MA!!q@B$6hPi3 zee!iatC7p)2$%=NUZ%65K83O{G@ms~3(EhzoNw29{+Ir@xUfGF>?wFzIsd$s%f3KK zPXs009+GYF*!Tc9Mm9}Z5#GOkeP>%FL;=FgYg?8R&K@t?QnO!nCn%m;J=2#7upsm` zn@Av5P>L30iRkN@If`#F{j#uzNNWi`Rr^;juQHV6EBsLCBA$q=WY1_A2Nn;SvK@=G zXOhfk;FWyokA9NhMcv8#z8oFZm!73mk6zZHa2^eZbz;1fBl(WlM*ZHw4=q?~B5lG< zD|rNwie}k^gJLgdhSN~mcV!Xa;fm&+r_!cCE-l*YhDGaFL2&%&sZQpH*t-A+59p!@O&<8gOE?}FB$S&qSE7d;j zI}sZmPC{$Hi3vd!abNE|;)HXI_IPNg_M0#3n&O?zQReqz! zGB_M5a&xDj?l=ENfZ5U`&P;BEgRnuAgh(#T5i~?2W9a1Yb!O|`t|($V^5jPTsGxfi z$s_)+z=!sR^+9ieRMvbt2JPzG7s`CM8SFFs`X<&SgNP7PG={|`>1bRG9VK-x)b11@ zJs;>mTCtl+Ah7Y1NEwbhmYengM^gGDkA629q5GHmaT6xSg(j44Us3kTux}L zuS!B`x<#}x`?}o4B!Bis#Lr&(Tv)8C_Yos+tSdg`i`A32e{F%-5dF{a zw3xztW40(T_T|2$50Lf%(q5Hauu`V+9IJVD%~reoGPo2&1VNwbRc7BUH?8)0>Fs{k zoeTeK5TO2o0-#P1q_!fcQk=kb*fsN|>+u6%Bk+d{$LWs0JR+4qQ2$dnjcm_a;1g_{ zbx(WBqzzQ_8(QKE%qOyW9RK|J*X}xB98bZx%Pq(fl$=Y!t#^0}JwIaSXl7;M36y=N zT(*fUBmg>8;wGb4Z(7@FaRALR^^C^jn}YAId^inxPx!17lkE9#eP#B^P<;aQ^$K#| zK|j!RSQ&lD{`bdtA&f#yST$lg0<5tikPO4_&6*@Ub6?!!S9P@LMH_*XxW4NsJi~=p zPg?`q?PIeW16awhVaLU5w7e0$7s`T(j+E%l&fbvgQHD-d4UPOMjL$&3a7^iRisfz# ztIlTRv=atK;kSE^)pCKC*4;&f&y0mJ4}>v0S}->3c;uSWNekYN60~hzrnP#e(lDqG z#&tUHsBRg`1HW~N>aBK94HY?n>g)~wwZ2ZOqP*Lb9OG}JaQLZqM~9jj2^E%RxYo>P z!u-K1n7lm+Z7HiYLnz2mXR^BGK;X2{?c;T}v%iTq<)=6|ys#hnUD9+Du=!tT{q7V3^Pcu)GS+uz?ZtRoem|R}b6ceK6 zzI-d@w)r~nYH#1SnE58jgYj_|HFdVA;`HV{%`5-eflg*xh3+)94O^8T^cA=;>RtIE ztw)Kja&K+&|2C&>>&vd+`CS%`t#r_p*@9|v?QN(ERW=4Zo-il9nPFvP_3SBClukWB zWJhB9SF-mfJI0!5_}muc6Qkd861G$Z9m`gwDp){^ z#l*tcnP{M?G}>Wi&b>w!G{f2&*1FDud|Cr)`GT{Og)1uK81|E4E?O+7ck$@uU-K59 z4GpVjZr6uz%YKLmlr#8U_s4F;-8w21shB9TPlP5Ke%iRyY}gwN>&y)^f#w0^8^p@c zOwf8X<&~5b4r38NJSmLX)=D?}8P|7r(Owd)0{rQ*Oj+^i@?o>8eTCD`?iWI!VyN$7 z2NA@aBnv<20}G%(=&RW0%uu#u9-+R@k~3>#><){EYjegBS4Lj1-ZqD24NZBA&OB=z z*srWy)I?KOPd`1C*2DH->OUV;=&%{S1)N9nL?}sdAU4?FB!sNc&LG3{DyDyZOn#$p zx1S7!g(W>i{FKtwr8nH1`AOYCUf(`it7v8e5JBb)=Sy;KLtzhQ}LLBUq9RyjlcG%Qa z7gY^A4Of37iRigEg1h9@xJ08sssAyqbDFe%gf8sq_~fAqzl5Koy^ z+qY6aj6Fe-7RNmvKZZSQA(BT_)nHbMjYsru`5^oFvUp@a!e__Q@wj{))s>sccBAKp zWm4}DYld`#BNkHmasMVOBGs*wEQ~vN?2>py%gMaF@wRY0SmD>Hgfbp!IYeGz()>8o z4iW#R-jUsbbX>`v<0Y_{?ajQKlPlt#$A(sJN2ao58TP#TC)eK>cm@w2R!^APOx2vF z&!UCqWStFFsT_I@pX7=Wb(>jTih`9UqnIZaxYZqN3|lifelwSgGgvd&;M)+wk0MJo zjO9QnN`D+}IuTa>pSqZ-rF?)F@K`2jYJDU#Z88wR8?iAVdKXQE?^y(95DhJgx3oBS z$O0`#pjV~k)T2ttb2WB5Lh#2-1&)TgR;RN%^lcX}*6j{37lCHigFe^aG%Q~tx+FyH zeGg{TfHa-MSrv!$A6Vl`XcKBmxrfb9h=^_i{y@UBotH!LAs!>gw60s2pYxzTtv&nw zU);fzNG^H$cR7t4=z3SlZ|FJ3}Zu$h^Cky2gKhQzWVe{5bM@ z$jvP=`{7THQ5z{j^n8`++2_5myn{}oc$(|R($^goysoaX^2)#FKH~vW`xIK75BC%Itr}yxfw%yQKcZp%5T}E?!P%3d{YwP6Wx_*2Ua%HLl|g*@v!n zpndG_IdSxWh2ICsowTva3D5Q4OZB(w^ELz!JlX{^@-pTpgzyCaY8-1CD5s3`;G1q+ zxEN9N0e!3ME=d&4`cJS=$Jxu4dhl$hU@cYke zX7JtlD3}4-Mm^l94o_hX|LhF~fYMK?I^D+f85B38Qim}9 z1y2vN^+x4Ps{B(M{S(honXDDASX{Logv7@+#xW z@k!*j$>q6)r=0UB6O(y!7wu-$^62YI7Z<1BX3``1z4JUA;j70AlMzj>SU2oj70=_3 zRke}ULsg&;uR(jY2dm&x(lJfs40JC1z?xzV^CeX{t!p9tZ1ng!O1LyT17-hb`U$=? zVixF*k8_ettPqAYj&3SM|N0N}(uCbf$K)TTiC#425J4LE!kio^T;o5J&H>+8{~;|zOYOm5xU=`S2| z9Ek!_Lmo=hE4-rzKvI3<-<|{lD-Ub9!m4i*# zxu$g?N(~LyAIaivdtkh5it#cYt3YvCRUxa)XIT;77d}1^>cALbcjKaELqXceW9Sct zlxJEX5LatPy3_k9QvR&Z5V<VPN#gU&bXBJ7CO*fY5g>S$Jwku4_PP+VHz}v1w&i-WQ)r zl|8$@jnd+SdHevMdpC$TEX8T^UlRJ2731MHy1QQmo-ob4RH`1z{%XGhS-zJ@`5W;1 zDUO9-lnkxvI@!FEZ;Jv$-Tns4wXoyTBU|m8KYID|L1Vt`CsNH1mgaI8%_p`e4zzU= zq`gl{DzTeX!{8HtL+}A8_%hcwXH+i=<-!n6$hWg3^#)m&X7kv-G4f#_ClUUbPjFPTTeFJb_x)7w%w2!PqI`!C z#ppp^SOlM^mp3B@J+!fs88XDG%**rwn2T;uG)BehIVJ7~{Y0}5HET-K*6oBKDs}b` z+cx=-U#4%TPVpezzJcpy0k0A-n18S&V#56v`HVT{P(z=uSia*<`oHKT2-U-m-ASz| z)T22GnRY!seIcLJ7t3CDKohYJSpSe0Ms$`V#Nxj_5k1#LzyoZus6Deyj?)$L6j3 zRJbTfjK8DbjJ}sFKI$TC=6K!$?QYs8dG_q2qY<5~{d`T^0A>vyp02WoSor>vH={(( z*G7P$6;Yahnm}2!xJUvJJiW7rB$=JCw@SJ*SLigkGiS(nt}T7Jd}NUYdf#2dqu7`; z=`K7fOw2D_sV8vJ)ZAqIs49;xdA(~Kht=*y>p#hv?4jdVW3Y_}jdj4?C-&tFXC(^T zjsppUHhfP4%wuqty6=9Zk(A0}RiD2g_48kAXRm00mw&Lytg<(Ig}2D!q@Mvux|* z+*q?po|A=zc%l0C+k<(YF+o$>{e{msf7wE=1kTs-vFV!*2cLz}n(I=6S*Irvu2u-; z#8`icV$C-aAY!;4bF!#i^`^=S77E2rAagr25rYGnwBrOpG)Fq64_j?y$b){uLlYkR zlM=AWT_ZU!uQ!wKWP=|jpxv-hkffWV&Er;GSX}9Ro5O6Lx=i2OMNGZcDbMI57>ZZ` z$(FsTt+KV({ZYCa-0giL+~a$kwOPiqSdzBS7iMzm7hCGas-;?a`X^CIuQ)(qPxT#VsWR!-?=Uu%9bW~AeIKKgW#V{K$I1Gr zES9|eiACsL@&LnWX3@`O%#xP41RWhpF!T|+`V(d=GkaTe=snB71uNqpM$A}Ix5CI- zQs-pI+330>f-;_=?jxGA4^iZqlAVP?7-qzHgvC{P5hET@(eWWRBvUL1A%cb18Z60R zlS)E)on?p+@I zj6Eql5rN6OvBVnH+1EoA@5;BDh(7G6B>CV9n0o4jnUSHSXo2c~x2?Bx-nSH9W}%Pg zr3WwvH|2i}sBj@$UAvFJ^S^QX?>RY+fNA4>wX|2Q1!a@a&YJ{dWu8>2jctpq$Bh2x zoQy%-K)P?90+#B@=rad-Z{Oar>1XCXSQ2X-%$ERo$as8r(D$A*e?CyHQI#nmSb(GL z36OvpOR5KUyL?St=o^0C*zPmD*c76AAG~NDe4o;CwS(zz?Jhu{@$U2&m#C+k%J4AJ zaVZc%Z#PCm50?BsEPEClEX~zuH~_*xDk*%_lCg{O#A82yKi?GyE;&Rd;s{D$C)>}8 z07ond@7GbyH=&C@BP(&WVyB;E0(d}70DuDd_2<>|#NOqmn`Sx8r~CJPm|2GcXAPCj zuY180v7%PbLNZDAHyl(?{t5wORx@bB?i@itFpg&fx%mlgm>D6$>Ex#LtzL#9=f-j( zu12RB@L~Ae^NN`-dgwoF_p6le&2n;5=&0{S&^crq*VVg0x-uOwpPsh!KK#qej;pBK zprl(&6Qk$lX#pm$#n*k}U|`==Vk-39IGDUnG0Fp(v-a;&+4&4trNE@R$-$S-ZYQ5*a+mr2!{ zDD*_ZU2RTYZrZqjPv_;XD=R=9tgF7srtA@hr4_vg?_)!D4V9 z*WJUJDhd8qMa=9RL|I?CD7AV^{I3>+Zr_&8_LZ~B2H9R>)ZG^{4`BAsMZx({nXdp* zX5?t@?`gF!nQQ0GSI&?}a-Ut%o|H6bNZ!Y)NnB;Q>_$WHq-qQQ;WqRf_vKDy=x_J? z(P<8()?!&M^tt+Zu8XhuzxRot{I8d?+kw6%m**j+=nkxT zfGsR<|kJ~5w^6oaEwd=W_kB&Gsx|26#;s(Kq-J^1xU#{FOw_w6C zneiC;M;IdWVxVdzswwYWki*0QK!KANwuQ6z&HkmK;bz~1W=X}J8mng+7^r>U3*^C# zdfhyH(DpaDVXIr1DC>61W)bL_FP0tHJZ_hAGE(~SKPTv$*v3*|IG7;2G$Rk{^tFw# zKrtEjA@N(9#fQ|-oTsCvjZ++sx^4p=4djeKTcbafTn33fEu;)7mBS1!;lDhXn)cH^ zc8G(w9j}Dn<{fsp&Zosi;>6>xzJHKJnnW$9tn%8(;HK-+qJacs!D!sGUNMQG(m5sQ zV3z^$41Sd1c!XS83EL=i?qeIkj1 z^Sm9fLFY8)9);Q|-eu-u<_|+h+x#)@1M?G(aGH}CUqtYR1<|2IAf_z{dsb`IS=F(n z22ZPJfR<^KbD5A)3olcKWrH2#deUPr-#uKuj3m3+Re6K+S!Gx=T!Epi|1metGw$OY zbJXe#hrkH`OZB>1)d&?8s=tao$Ztj=RY*0~=J3#Dq18Ag+Y9XcukS8c>-2K@e&q6e zz9$6z!a^xh6k!{LxIL#@m%>@=wPA~s-c-e2M$oJy`I2P@1woiM0DR+9g z_nkqA8H?*Ziv=G^A7O3MFY!u4R&bl z9v4p#e9d*mhQzQ89PU{{74M97cvWh+s{r<5Hd}?@bNfPy3zCJR9pD-$6|N z!i8a7O}y9pNwzs+q35R7BYnutYCZ|~bu?=8Ln%7OKNd{{7ZMg`bT_VLpL;-#<*!ZH zc$W3`p9PihEy{oEPf;B#>-F79t2>*o?xt8hT8b99gK53@&7gr-tcM)K=;`l zvb<7->9Tt0U4S7V-%>4Z20;0)&zsMLYojg%h}s zA2)av=(|#dWj4|09XAbWZ(>^fj^AEZTHZgsc1brCj6OC$KY{3-Kt{0dzoWd|E4XlS zJY;VS4l;|1{(C|PUiWT@ z-{JM)sXiV9#>EAJZ`u;DZ`G3B;g)?dEgvw{*3`UnV~Y&>Lf9!pgz^(IrnDN7ci@Z+ zW5Y&T`0%y$B>Ic<;68)fh*TS0vYxc$VO0ts-z>2tPaE`7t49xNHQPi!bO_dH(JmM& z0*lsW*9tlyJ1MTE#tjYtYpJ_f(!AY zq-8+&!|!o>A3RKmrO*;>$Wf=oZ?}d5WX$|Do1T2=apR6>>7`KSAy~#o1pCY^no-I> z2Vz^mm|0FtGnR zpeKS+AYTU$31tg2$f9Bxm7~X{2GhL%^7Z|fm+vo{$yV_E0lZ^8n|QOm5XKB%=eWx? zA+2VSE{Ce}lE5z6+F==L%;7?s18*_fTiP#>>pD>R2EUrcj&d2-;W4KtiN{KZeD4phm;Zcmj)5QBHEyKXMeVZ%ezk5E6UPm28$U)TMTbl1|s zz6|BGdzki86yqetgZgX*W8NYWq-Q@lp zGsAmDV)+`q+g_6+URqeUC>4SZeTuG*!}JiMOdjiE52^L>eepc+gV#D-Nfk>s zHtYrt7nLKxdvsd2D$y<6J+*g-KSHI*Fq3blf(ATM^oV~M(!8TzY@W{;=;Sd!WUCX1 zF;VjQ$I6Ae-sJlFdQ&X|7hx_hl{FN~$?B7F*YV=8w^!b?HRLDe_06U*)&}##K}}}5 z{OtJNOCn5C&rUcJ8Q{r9tOq&8^=NN^R@W<^-&W{nuxb)G7_xy?_6`IG*SG7S&tZ=v z=ao<>7Llv zs7p?hgJh3jFBdZ6?@mCdnUNUOFPXvYZCh~kINz5;fu?f=7r;Mo85Frmn)S%;c8cY4 z@j32||8Z6}L3PrbOH9sh=bt8(Exu}857(0pEEZc@45o7H(a&A}{h(+QA7xIuiPz&A z2=)WTaOh*$$qAuN1Ap0nU&cNdyDgP1C=l#C5!;rkEr32?jqB$iq9G)4$GKO-$eMs+ zw4;W3A6t!UcSQW)O*|34d%TThF18U#^^Cwhu?V}x&4;4!AbBNhNN~NaUJe^Z#!e!Rs-s$e8fd@LEQc2Ca1$b z+nP~Zo|Er>FYPh7Z8MqI^Q+T_yh7#ri~cx1;NYEk_VzdVI;ZESpt{-BhCL#!N+)*8953;(R#(CaCd{pIP@Q^H zh?wn7f3PxY#wbjkf`$lJf+qi0s3EU|Y-0tQ#TmmoW!W$>C$Ht0>w-}cel0z?$!c^P z>S|46!x8s(6P(jLMQm2k>8F%II>%ZwxhTvb0gB9{Pm#f<0UK5|-_PG3*aYkG`I~M~ zXI?#Cr}Ie66wBVFx=z^WsJq`52d}ywdCdOw?AOc?UR|oc9L+^6E_J*YCHp9q?M-$; z>1SBS2zBWs6&n=VD(jxj0y?LKpC3-7U5O`s?0HzASYp(wU8oj4#!xZA`w`Akij3lX z%|j@PC&&KaNe4GKzkMsOzAa8Q2_Y}#QY;}QVb?2Arc8xV9VG!s-E2Y8mcpH$U-tux z=xJwVRAW2?Nq$@wVv8cx!FcsW{L8_CQ7E$9@?;_cvBkIoh~i!c z;N@|zxuC)0<|+0!|B2OTig}$Yod&`F-n?ZPf`p)v(5Bay8vjHE3M0raJS&|M-k>^L zSw4HXmGc6=V7&pjmH?IeXzM}sTjo!k9>(SpMsuWeh1<^fdBqSB>V(wD@-XdSa4c+) z{*=WdB!J`DR^H$8;fP?p2++0#eA(~^Z=4w`86DkwhH%cOwBc7&Fsx&=x)ez@|taQ~>UFor*w*tTfw zg0lG@7OD$;_mXEy7eHI94v)>Xpmc&#p7%!}kc)dUAqA36ze)mjR!NuwdUD#4=i5yu zDZz43@H?cD$#62P!PuBOj(7{3WVvwcT^mrQD#SkI_4 zR$2oEFBJKRzWe8(hyobhohDtI3a{04J9Gn{9J%kj!Ku(90-4Ld7$8*-0e&7>C`og+ zQ0a~}^CYwbctj%wU+AHlRZujeW{I=BdQUU<@YPV_{{+W=Hv928C>P88Snj(oc84dV7nL@jW~?MXP_N~{bp zA3x7WL|w(b3?0wWcD4s|j(3K`bC+R!-8k8zO6B4dT<`Qp*#l72kK<0EBA@ItTr;ff z?@ORyO0kk(dQaKO1a5{N^|M1-*@oo2iMgTRaol8yp%L*nIpz1(a5yu5gk3Y+G?vgY zti}N9p~NZ=*d;(?t9~^j7lVDj&IJd|R$X7|PHRv~Z`J~{*wx8Ue$B$wH1*0j7pYpP zhQ>?{rSXOT`tWfVF&aP1*(uffy;&&0pAT5_Y zwC=}!i(ikiwo|)c1JR{A*55ma#xk=L`1D$gqy09Natz!;+d?|`JMw?Y4`o2X(x=An z*=WJBXO2op`?q@HbL0xBlEz!cP)`9Z=P`~onvS*0#)gK)Tx5sE3FWl^hySY)#K6MH zMMF+Oj&H&_xq-*iAfV_ld|``kh}l6Mg|{~UECzcr9OE0QpuDDJXm=KXu`C-ceEzE| zIl=twkYdhPK8MtwaABljh~$CLZ!JA-UQV;`P!y-}8(J4~FH~>@Z4<4gvk8o9`>WPPp*8KLa@uCD-jB&n@Iln7!#4@B=5!Pe@|NDM^V!I@VMUHz5MW8l`% zvY427GUX?CAPY6rpz=N|1810s{Xm9M;r&O4lT|v~r&Pa-ame}iQ+qx@Ls;Hu>(R`P z{u-o17QA_YOy|IT%KG|bFxiJ-3=IaA+T$>rl zp>)o>dn!pO7n!U@SZgC8z>P}M-3H*kDqB4rphv4IE}gB;$F4*Lo)bPN_*`b~hOc~YWz%-cv*ALZG!B6Il@8gMZCOYX!4&bsd20zS}HXmsJR&=jt zVDm2N8}+uMQ#!f&sk2r}v%K!UJD16R0W~b-p0(vi|JzXNv25etn8>+~{*%#^20@7s zo`$Dtr6(dC9WW<;-JPcc^5LomU8=fx5 z2P(IIsv0!E0Ttd@-Y_oGC1jH(N-mDLC#ut9GdtOEif2}Vi<6Sg^5969zwQ_{j_0!A!TQDq zm<>wPF}-ZQi(bI#r9#Z zH(!kUTh9omz3fl(a&Dm$=H`^PiFrRc$X1yRVsrmAebR;o5W7nerN(eB#SWPKGwPv{ zb|4epl1l2;f41%McMjdv7|I7H_a7`fZ}UzmZ?K;o^_kTR2R>?bN5`tln0%*Y7rW6( z{IM2^PlG-<91KzKVB0W zk~}uMTX&ONJ%(%>?|uVM0@v=Zu01n={sQV#GLk&+&!Uiv<_;}eH`UbR{fT6l_dPoD zpt4NuM7YKC-vzJ0Bxh%)C@+Ng)YenQsIJ(z@JPhvRV&t*?&c0r z?#>!^rKq;NXitWnn`XFwUJP!UW#>o0W1XxFTvcLO3OJSoU4$H=dDPpsM{AG5=l^8u zWG`RtXR$xZnSJD7K!zaccIAP>0P^rBTvb73?igP|7&Whm3=mo=U#}TYrUhi>AZsq? zo|})KaICsdP#A^taeKt~j&0ayn0_&q8?hbvwT9Vb+y8P{81Z4j^Jp2u{jb^xjrmQM zO)By!#3`o>00k4qZd3cvQo;(CLfA~>j%^9!SL2Z@0D@acTGpbG@8{Aq1bJ!1>{`=K zRbVWU=)q?aYOc~%r98VfUXsgHZIo-a7J+ncJVRk3)oy)lDLO z8=lBG7IyJp9W9II=CZj6eYTKe0CTl%C^ek<99w+mWd<0fTcV_I?_I5!U(IJH1oiG) za$$)@08i#+@SOa&im0x|EKRZGbElKOK{pV zzm+0uRsA3el}8`^5Lbw_{@j1nP;XlO=1N6;jDB{|8?bx{7+`KO7S7~`IK6CFkfEDK zsmCn(xhL)Z=x~(2@sZ@adSr{0dv9IBxgBt8zQ_0@Rgh|=DkGFte?f;kpWtTOpz0}h zXXX4q#DDC?Q`lZjLRFfXvrp?8DQ){RoWgeCg@X;hzK1hssaJ^}!xfQ)MDH_g)KuC$ z!s!Kf!73vs8QaGI5ZycaI7_6JOOCPl^QP-r28Psg^;`#v>_NgX8tnQ0d08WWqAf~` z|0GHvJH-F$RW>5otv3~%=w*u3ubvf>8gTn1_fA|D3Gnz5m1^G!&$VTz3ZWDhRg}Z~ zC?fmmKF+(*NbVkKGgUy&oT-A6dIjo#C1C5uULn6?arEM=UhfA_wUeu>Sksp4zFMMs z4&B$fr?MMxGns9W2JbeL^vk6=%V0Yd-BDGfwuM6g7JYoQy;@7HsQLk)EEUoL-qCZuT z9tMt0`1$>tuDw>DT~f4)qpiGfb(3`9d`fX~3Jh6b(d$v!FEGm%na;4o#&g;WuVw5} zlP~}nJ&B5?rgbRM-gnfEc62Se-%g5vFGM(F{O$nuBN+yPx0C1}y&opoI!37>^%qS* zu+214bHEhZa1wp{B`q%lQ5*j9u3Tr`P#3M|9$Ke_Z7}|wwpD4_eG=4FwK);-!+vL1 zxAg!>Y%mXc!>#QVN$9@*&cA<62As+%X{QEbv*>L2_IwYDl)xnH?E;*`O_F^l>fPhMtiYrQpy_NP zY2eH!J>mPRpiBya+PklSFS8yspskegncIOn*CaxJ@zt7^znecfscU&X#pxY0`Z`xg z7Mk)S{D4$N7cmHIgq5^rVu>|FvEuOe7PFo|&0?cV)6s}tsCrWsT)>d8XJ+05iW1oc}vSAZ#8Fp*7hVl!RW zRMNkRrs16GH`Jd+QWr%yc+H=W3ijfp{8%=5Wm>h>rd6k2S*NZTsuPoXLHU*Kigj($ zF;wH>lBkT+dYuig(|^UHiHVDeKzRRt-eOIy|9SW^^_s6Hw_U2@EEJlK17@3S>j*ke zL551`p-MOvecRf%BvKu=`ASGJrgWW717YLn!`?aLOC{g{uRAMN~aI&Lsd{ewL;+=x8_0ag(A9p z5Z{C%*w(pdT4B0`8y##R%7=$(M-R2jJPmq%MVGnY&Z2An=+Sb?Cyd70U_OW}G*lquhsI!b~@_pmBgoHGxfFKc$$4iA7d=JyyEOh0F!( zl;(X*01Ubm3kII`SP3ek&l%D3iAQRJNkWFd?Dm;n1HAYC|CThs?!m(D!CP9>yX&EP zW8qJYoA{;1Mv1K&sPQb^$$%r52|e;Fn$gDjgI}QfL0c?8A$n{4$LKCNiBeyJMPIW= zg-|_ks+9PF`W_9y&G2^bQwM^T)A0heX^Zp7|KV>2=( z=UfR*TP9%iQke}=uMO%&E-*+)^5BP>zd=#93LN#irCI;#B+C9YI3u+;Rlr(yEF2FNVQ)WIIuyM!4?2eU-(GY$aqJjy`(u~(S`2>h5?I~e zN~!mi*iv$zieeAw`oLe`GKi%-dIzgD1z8oM#KQd| zNLM&`nbH+5>O`A|G)`5J9asCO2!=!hnfnbAb`SO&%yypth*zD$4(TvsG(QA~Pk~LA zPd8(xfn1A7;^9jooXRhfCnRnhb85Tblw~9#_ByfpidL%yy{(^U-e2)r-hdaNzB;|%|Yn_QFrkd z4i6~Z4h`-XYD#X}YJdN&Z>-bM<{1OO^-y1H=1necsk8yeR88Cl?N>4OZ*y^>w9+0K*_=Ci?{9 z|2=|+QcWwFB;~EF{08Jn7Ekr1$5^s0M?Jv=!tYk*~9qc}3{ExjSNj1^Q9ZMLCa|A@pE0txtHH)~>J= zuGPO5kpz>EAHDn+w+zzU*ZjiYvS9zbzL?YOed0U9TbeZ|-A}hPSEJVQ$UnX3dzH-> z3C@@CE|{OrJK3cr#Z)C^+bILVy9>{T)f{Y~x!(VE!w$L@&D(BDZUt#iJ@2SjZJRp< zu>Wl+AwTC<=e0ZbIJPdGtvA#9)bDOVmrhwZ^;Gyg5$r@yANE=k`H-(8 zE?co(mM~j=_za83mjc9Xf;o!^oj+pzdRzRya)BW70pQbSPlfhY(TJjO^|N7T@v2M~ zA9i=$iQ`^&u~NufPj8*CFR#~2$jh3|M~4jI!y}hdo4?{(x(OnLvi?PBaVIs`p+)A- zO3S0;i-Dk#xHVybcjk%9GkAj|@vYS`kbchg)X=q#_M{(df1ssRajnq4Qd$4|u~qGt z(LG$GG^wbPP9Be z_|UcaR_#XXfuCn`$ZC{|kKBq>NZ8mq@Y72Z%Ab!Im_B}dW~%sCS!>~$iCxrwLIn+r z%eIe|ztUQFQiqGus?aY7_L~vQ`5{(t7_pYr_U}BEjU(z|3(4xAn#d!lx{ESmPI|%G zS9sBJ;!W~buj7=ui(X~Zs^$($qx-yjoqJflsHmFreBUej8R;6>&q@+#+U_OcehbPR z@8;qB>og{B?}n*#NaIbxLwh3eCY!uqrS{_+Pxf(an;Z0XSc~lGC=5w+6YNS|ds`x# z>w&UYLkkx;gnhZ~z7Q3A@L#G?&U!LgPGrziT z(~LF&!vpWu2T=Xzv%?piM|mCj7cLWYeZZ>rl5boqInM;nGh;zneX$ z$KCSEO0Kb4Gh$(Z^UpK2f!7uZu%nOgr4c_hYK|$zw^+g2^s^|JtG|W${$MrIARZQSzu!SCNSdbXuZCvNbw#?X} zuyA{Tec$=H*JAeoj|K^9aIgkTtn(XpdAPH=p-ZY-1YL&AWigw~bMO;$nI?x-r_0}m z+TbbJ?(fx4TzE3tLH8?!%ybZ}cU06$wrpPXn2>j|V6EQ9mMt|;9X40MFzuh8=|o0G znhBt|yfGxUHS<9{HOz%%Qx)o^--lxQC+G`owDE$On)TyS!=Tl@5)AdS1mwv>6(Vue zxy>SJ&3SJDQ30UyX@ePAy2ojJJLzw(lrABIX-6-kZ!$j()DXG5T)mxb)4VfhZmWcK zrQMEGn2mQ~-zz7f>>+}HsJ3!`{+8d(KydrZln9}7F*@c{sW=^b!CXg z3T#cgM`V^eZ{JwfF+kq_2eWO1&($O_$Zz(6`S>c<40M0;WWDBgrNqX@7iMaj-Ppu; zmiAR!hJyP-&reclx7`BI%tc);&VWe3LPMjrbh>L0CRW*gk=g1$yI5IM)$oSp#6snPdToo#0I#l!RtbO_(AnE~|NMsqp+&savlhAo%7If5}9uE(soFCPpUXJd* zx&j|r2JfEzyg9HwpQklnp&bBAv2YWU^Urf9B}#fL%AJ=rHi*TY2+W(&By_?Twd^N`$ZPFKp8Twyo#_4f+xaxh_ zaa*xCzwA-j;kUd@In-X?pdTtimG;;#-r<-Q%f)fVq5tQ`{@ua-y{u$FK-t>+{rBYN zfJxt@(UoZ)^NyR{j@yA%%nW+Byb%iz8hh>BIRU$ICbn?wZ#nb5mHxMsU?mni0#V+e-0~k)?TUj$&y;l;<$H z=<65sGc(JDUDm|Oqf5G`=B-}KURG2dRTTrX=B>_>!axU4bNnppmOrxGj7QmsCjXX> z&h|~O#)dNn2Ni^&ZHtHh=n2`zZy(`nsXWe~XEQT}zblE+AdSw^2`Q%K^LQ=vMI;Pb zTG{c%-SWhp2e&c=&3968L(g+^eVti7PPOQOvWL`q3{$pniiYUaZLBV?#|ll4gu zW%5%6oMhKvBB&E4Q{Yk=5p=rZvago4H(P1kNr_kA(ZD)Cmn1djy~}QD4Gc5lO@vM~ z+m;3VUW@+d=A(wm1Lx920JP{{=V1Dks`O1p&Oam!{gP3Qa2B0x(a1nKpMxZgx zdX3Jy33MGoD4f54jx!npi(DDnOsgO~^1flBa<%P+q8oz3{%$~~_7BuR=dHz<1!?@i zY3W_FCT^MSJ%PYArf@R!NG?KphxB}P9PQ{-!gp3us+Zn1>za=)y+q5=EAO$EyZn0DgWLs{<)~c(&4Guxou0Q1 zsDp-jys&To%GF{ILDS~JXMR_rgq1N+^t{f!NlKOF?8KC#FB_{n!F^{#U z$+ea~D*sVYRb4W_>&q*ZUa1O*zddWOZ){|3{N!-)fwr{Bth2t=WewBR;Co7TDI0_l z21f!jbYX|8pIsF+u6w%7 z;NJODv`W=x7-4?H%JNO@OiZ%oG70Faf&O+tdhpGO;~+ZSW&fqb#_fY^))}l>d0@Vw zQTY$FQGM}n_dG$SGa`OkMAs#0$Wg1|S|9i9EOY-dLFWGQkVW=V>kICiH+QyYI0%&V zzxy1?MlJqg3V_91=|5r@xdW0h+WC8D53jW@KP_J3%Y;3T_Kd>J|91MU@pTM=A^Ug8 zfQlD0OK-oAplbGBxxNkCTHP(Xr)IhQxkL*NJY2qvOR~)Jq6dLJVMOOF2hq!6Oo6u= zBM;N`|BW^}cNTZv$7B24HxURU{jx_?3fH=2LkOQ60^9hv1-5qrM&3p+B%6ksUw=5=tCqtyGUHaw&IFEcWBltqQKPJCh zAY#SKj$*LDYj}yW!yT0Zuu_rKu3Y!4h?f=;hK(FcMbyF!cRoS1ocjdY8&92 z^;rA#Q#(7}x$mTla4Xl&#SvzD29qlpvp+*tk-AX1WDO@DS7_T)ctZDgxkv}5zx8Y? zsw$2^n-885g6;R1+ZAEORVCqzYy*K{`VyvV-v17#d3RT;&f4eP1PIP$8YU^J0Fu+p z)ZsO0$m>LgE)U7qQdSlAwy){NE=7dNJI%Eto1U_pbY5ai8;ftu$2Chk+b6AF!*2^$ zgX`pHYP2X=ZAS>V3FgRWi#e!}-$x^CB)O+C9B{-7x&_&lBzazD-*{*u;W*4mPTqp) z%Q5w?`cfxnqWnK;wtphwJ#csPu&Yn77a9qQnMT^tL^?H_4ps|Vweie{=?m^AC(<$s zymL)iKM!nemv(zXhX*0W!X9>t@S#knPF$ZLBjFn!I8xdtVE{Lg0f5Or1nES2Ee5(C z2JY#cDg|Ww+$V|nKZoInsvJhlrmo2v5HlC%b+h*X7D1SC<~_54_m#f?5V8L_6AKcE zB=(q#Wtsl^PJ^aq&6N@k*Chi3X^u>)B;MJfR|Zg6Bh#)iduGR<3BobHaQDzh|ty0Bz#%Sf<&w3qstHOzX z)#Stz7qcERqo=n;SAkN$#D5)SV^&*=?v0&}D{;*x>H3aIC_nbE9$%{72FlPlw%p%A zlA8w#$LMh5b;+Zi$WXB}5a9j#DahvWVh?%4H%z3utlUtD%?y=)IsYRrU0%idErIoq ztg9HJr%_|}ZmjzgVNm%U7LQzPN{v47vr>Z5Z&@lF=-XYehx2WV&=2W~=IXvQaTeMi zgD#^$Hjz&S;Ol(vi|@>AoL2$9v$NB4{lR9#0ltn-&R^rn zXqO`-tQNmy_q7xEQU+W$)AIKJs4Z2kO`W{!@VMVI0C8`)8rf9*)fy5cq^3=xZbo>r zxII-I@bH2gDQM=A*gvx>yI|(41EnuWlj@iAl~<@-3Ke%BxN&)ar;wP4(09$41&61j zXTvT*i_%3w#TB|B`dtp5u7Q&2+)C<_W#x9~7T4~2k=IQXX-{WoSDb+}U2^HU-ZzGY ztkUGW=SdZ{lO9PKtT@+)j`m)(C8cnhVfZ|=<=N*)Dd72HV(*{GHbld?RdzJh?)La@ zTrR=Y9Jh@3&ztOBSz8+v)z_9MYJX>LTB4W2`}RE>UvnK)iW)GFVa~qwiJxEj6I~P~ zW*CN8|Bl|Oq3cW#oh_8%B(KMWer-%^>dnl?P=^`vH9zQmB`PA4wau3#%I<+H@wbqJ zUDt1fBl>c`{%dh_F|3@ovZ--3NU}LACH4N?yVG5u(?@xA(KffKdc8XwdTuz<%GCDn zu5gUg-@4jgs-)u}C#RyixNmyOv?^ohR6ScSx{-rREbU$*#IUrb<%yrFDhpvu5~paXXe6-Q=2AtRayiP+^7A8EQOlhTgB zoOmtE>OhxDu|3Rh59=7oc>>r}g6Md$`psU(H5EGpJ8zAYgA*HXidJ9SnB@ufR@s>4 z48|=Jy{-fnQ<@{BWptPUKV|cHH*41Qx-Ut;AYSFCKQ>7|`=9sfzCXZuE@zXU-`rPE z;)I*aK}3W-eQ`BB#1-c}>2V)a_dX3g?xW2#LK*KxvDL>&M#2lY7ec)4f-|3Vef;4GPwVz2b5e0*4{4ZPI97LP(BdkYEkz zUs3fS*09U+dhSTL8;7YTG6U;om4-X>QZ*BJSyxNeHS;}ejRhBJpELL_8}2gewpOu^ zlCLsdv@Tk~cR!L=RF_gpTi7vzH2yrOR^m|0TJ`}hZ-;#nVd``ck<;}>1?+LaIp13kpIgFPy#2CIfsu7oJI=B%m8S;gi1#0=K7MjO zdq{opd3O6Mpp5(Yk%D+y;&)C2h@;D*1uG?e7c%>J&IF_)rk52~$?RKj6chXVSZTLKLhwh>#SkxD z5>8ftWII@>Pw@0PJXfe7=`qoBjaQNYm1?2r#bRCm2!$%t!JBc-H~{8GKJ7{sHm4SOphbF6y3OyKSK=d;3^3Q9KijjyrO0**zA zRJ?N1>KPIOfx$|oJCeliQE>?JXNkMCZ$3B1zL-Tm0fUW1#pRHOH+{wr$61>l$O~IL zFzanL(c>(>PX)MrpK?ao|5TtT_PMQ1ACxU9FF;T0tivr^30t{kV<73|YtQRnzhWau zBP4bC`Z`8E#cQ)Uh1{n1g}lOAT-CpN);XqqZH0@QxdNqq)mkha3`<=VUedNW|%y! z8?KuM*Sh`wlx4*C`?L4-hAx_DBX7nfrs!AZBBdH~jkI;UbkmrQ22aUs@Y ze5%NvZNZ6#+geapMXGS2o8-gyuaJ-_3m<#W@%lzfO-T_RRJA6G;|GWLV|9fvR*6>- z$uHf})H|8U&EcBNF>rgq+6x2oaJpu}j6S;{uQdDnffV?sShKr!HiZ}%qlRr#Gm5`6 zfEmh|Lc9>R+@^x~I+`TDFs$?Dkxj*e5ogj?vOt1>6B&7A3$NGScuKRYXpPQ-6ZhN4 z|FHpbiL6?@mWArI%-#U*TdSh1Kd9VnKY*$s&h-)tx6c+-AjXcL(;X@stcie{;0Gp* zBDqriom06L!eZkes*k7Z%cs0E&KKI{Ja;*sYgZe@vnKtXp<_i5Y;2m7nCj3 zlnuCNORKH>`nn(lHW)rJ-gY92iABIHNJkqP{ec}BPX|oXFE;07OP`k2K_*y%a#IP7 zbtS*DTx}Pd9=GQ|k%7$n4C<*ODQA)>P%P_YhpGN~JoIO>1hQN%#0d&W+>jx8g6}w^ z{yTSabZrXzAJ3Jns;c0u57UH%pg(@}hG-VVj(AEVq1hNwN+4cj>LpFsU|9w|V79`n zW8>oTLPr^SanZ1JGLh|IUoq?0v}`*-_aV)YkM)Jn*BI8CmQp5)Ncc7BomWd3QTBmV zJj^7RiZX~Qv@l2WvyTdSMORs zYAdz#>mWHU{diT8(KMWWLtE3I$dHRq{WDXWB0C=MnTNVNnNih&1yor*cFJ;y*ytdW z7BbROJ2#SxOVg>Gi(SWt|FNLJbq*F) z=k~9IK3O}iiJFbehu`V$jL z>?OVt>q<&K$~|+$3uSE8kAbkOB>bMv4iqrHx3fXH@f1IQ_3cRDbn=O;2X=J`GwAs4 z!j{zEe13mFdsj&?1QuJ3CQNDe5-vnWXi(C$oONBiJRE;OH(fjq{%WfUr|KRM+l2=*ojdaZ{a~s!{|9ehskrHzr*=iM}vIT4=RH! ze6u*YyvP{9d)B^O_Mm!6oPN4Ft6SzM_`goXbMwo;sKcuW7t%MVC(?J?oZ-4L@N-v_ zGy)MRYQ^?;XI|iIDQ^`4r`RZARu8U2wny}k49cIjY@4g*f^1^8t^D+Kuxn*!p$TuP zG#lrSo?I^UEm=!>;Gf6u#DH^$ehZn)zx#X}c>rz`-FJ0c7J%)=)f>4=Jo+skp0?7- zP^Y>#CsoxrJ=(=`Go1GW+#bJq@S%y%D~n+4UQx@d`$^Io096Uj5jC!LAh%?ARf7AG zXN3~7O*K*Q5h^U6rcBUvN0!Ndzc+4STwnKfF^~tKx@$m>W%20i3@M9Pwx$GvJt2DVyMb1GJ5`jF ziFnu8@xBRz1*7Et1%4l}Cs}o63{NJH{KAu9ZFR{MR_%+x%1;+yqLR^+bXX5i(JKNQ z{+wPq2#qd4?DwTOB2#f&gfdp{^|W~%jjHI3OYuFkEu0awPI96cIxB~aj!}@c2GDlZ zyOwmlbxC)qsPyz`X~0@6WUTlL^(*cMXVF?o`^c># z1nz5vXGG#>Ope`goOBF7k});QA-d-0^K1ZYIgv|`VM&$jUfk?1%5#N@lds-O=9Z>o{i1;FSd`{h0c}!2(!|#s3s(jG9-^ODj?5l#zO^tf1>tI*;Vial;5vu9G&i~)De`x(h z$b-#;o1TEyW&moFmrQ@*@#AqALbBn{SU_Y1cQjF_X#p@&RfCfkh+ zxP4+#%M%w!t0%UI)HKX~YaTRP9Z5oJyLqQCb|H(H}mdmQ(ROeDZ0>x;PPb zfr?Cjc>2*=N$PMy zzPZ#g#wxRA-*U%{w7tNNcu~? zg_$(3@@$m7A%-w;!r2`_8#LwU4vRWWS+v#pPfH(kTMWX-V6uk|6}(WU=^Jn&ESh%Cn$8NR>3 z^6qaqaRExbMM=lGrXda8^8G2@W$pDw1%()^c398!6A> zg0N`$9YbW-AAn*%4Xq#-Hi=|TmlZP5*x0BcWv$9bmmg2Y9BfkF-K>0>!e6Z)N2tm7()t6$S&{!)UEe(7dm=NwIU`1+!RLeXuEaNq{W{J^+K>o6mm~wQHn9{+)&ILryQ;h~zG|2F9 z^Zn+-#KCjyuXAi|7e&K5-=ahJzBnaUAJ&Ec`9YzR^}Vva7$)NIz@f=-n}15b70Z|# z=mn0n8P#W6MtFPx%BISlok>lfwjrf@rA8cBa6WtpNbIOAoEgzYXevkR+F6-k*Np_^ zA%jg*hMV<^xksb?B~}E-o8L3w)tcDy2}r4d{nXH_mAvoqJ!M2WALb6S-7O2OHpn45 z8py?jUvF$8@OACr-{4vfM;3)nl9$OTFa3r|)?tjE008$}u~Gpykb-J>9K602iB$2% z@^|rY@JBqL_z-oeQ*&YQS2V{~0zrN=vM z{}7k2BNT7NUT5eOoAZALOuxL{95p>Zp!ml-i+R9+|D~F>d*#9YTdiZMnZZAk+f~wh z@xv;+J8wIm-9MOyy5L zim}ufKV$!BhQWjE?R^#jT$VPjzWL&TZNytgL}1ZD50N^w`~mZb?Waa*9&B{UU*2vE zz7!8d{`ZC}J!PaI{J(B`-XBas!X7__Pe}V<-o2C=Ki7Ha zf3|uK3Ur+vu|=<6nm70~P51d;*4SSA#F|ZPrlw+*ovs=ly>Xfl!tft1R&cI<)qOYj zfTc7Jte#Q)TVG1QI}^WW*XcVlK=3wA%Tp^oq}}$?$wqQtPj$HbE)~=KPM1hn?&g0` zz>cb{#E1Jy0xW4JH@>it&F(5>1(zyV zTp8VU0fe?Gt$oDljXCzY$D{*81fL z93h?A0vU}sMvc8$nHt3^vN^-@c50!pd&PMQ{zg&5NeYn;)0*mqq(U`3i9o* zu2l0BLQyFpr=3*=_4Zl^%2@n|Ux1Gef|2ur?scdpMTE)SueN%RVsD8uveSGPHX7oo z8fEh~HBAz5*ln-z;uQn9H+5qUURr~C4o`jiM>hwV^Ae8#JUUka$=vSOA~1=wn1Bn8 zOXk>nv_QF5^>((6Vq_FuUjrfcEqdbV{YF?(G<+QVKMZ7g|7Ln`_F(MD6HM}$BT9rK zv|Y?+YP+j2x@!bk$oC=X4(x>V_VQZF!fCOcoAjg)l#5%!pc)pFsh8&$g#e9>?f+&( z6c?6PCNu*FuQxZeSFeknUwgj9WXhxy&dyLTxi>nWNZ<)kJ)n3-RJpmg*Ap4H zkcPr8vCH?{f%U{dM6~+4NVOY*^fnRwLPW=X6zGc3VIbvkc=92AI#t=k+ROwOfROc- zDl&NGFZ;~+!fq!2OzV0G&Sg5bi~pt77}c=g!)&-%EP$WZg{vl?Yz11aaN5ho<|5w3 z8$+@@Xz;=SExcir++rwO5m&9jodhn8(!gcFT2f;ZKV?$}^q-%qLDt@me$IRw_yINH zPlv;^=F^3Rk0u^^`9$Ycw|ku!4XTeYTu%j+uM~}(v^Z@IdySX-jK)Y4LW6LEL!d0y6$w-I|(lH>MNT>2` zAPmhuaU)mn_A7@OM3!dl+!TB`9SIwJIbSE)Qx5rZQL_#FL=8PV!z_+s2A$p{T>h&? ztc)j0|LaRQv(mVM1~+=`MIz24Te0wi@yGTHthKlT*@{hyBTR^LfBg3;YL)$du%f`p zkm;vfD7H%A!*!oOezHzWM7*jl>Gp>ypadCWBCD}&1kT)P^2Kw9XyRCJ8@1j!xT6&1r?cW(Viui2m z)Y{r^$@B0hTK)6>VxHgf`&$yRe}o9726yRF9Y=4gMcolp@9a1T2B3&{g zTrV(}D1?fA07m|A;+0VD9J#0zBgZ|PM^bBbh*@KS`WWawE3fr{ZysxE-XFVrzRdoU zC#$B91D{-NfGtF{jX!Y9_w%B`Zwkgt=0>NuCiL}EX{A~1-r_`cV7z*qfPc-NYK`o( zbh>XV4HqDRSbX*h*f9Ddt zRAc+giH%rMcaZoc2hQ)8f+KM8fwoH$>*2Ue(jB zxz+@t9VMlNhCROg(Q{d*4(xy3l_v(6wL(Cp%y2@agy?of?B(D?<14mI6gO6$ZsTnk zI6hBxb#xX`p*JBNRT#r*e;yuZ&mgn@*}Up6S=u(PlaEQ&vuU!lh)@Fz_zI?>s^n{K zVP*B-;PNXi{vyGfFdCMx&u_9W$hGU%pg*)F`K;dCxCJ@)n|2hmlmzLUPxDO4F5!8C zjt4ox1QgmbU3%vOvRAoez3?>!SQ>E(3E^WX5gwGYo=}4yKBwLbk0IC76L$9dIEKx% zi+MMUQaw(H&s4QF!y9);GPVi?I>F>v zA=UjXhFPDcDLC%~m=wKCu1UD~)~YrZYriIKT+)Y|xA{${-3OG-MuY2cq?(g;q?)_4 zve>|!xfJpQHhNs2%tNC{BxzhEYAy^q!^HtiF%IaJp~~zz;XYH>T{0S+HUVbPS*1~{ z>XqSv>D2w)3}g7l>IbDWBjamI_d{B_)>CL;UctTMy1%Frl8dW|&$gnN9?ijDF%WIy z;?lVnF(!{(0De&QQnN|ea;L6OR5v$#V;A;b96aE{0^aAAc&m+R7Uf|GE0>QlYjaoj z3!E;0b4iz zM|}9PxtJ$b{#@~85qDpYq!81GZuZMP^ZNxfEblI+{=BCrwEo|_Mdnd1e8GZQf>u6!dylXpEh#aXZhmDDSg|mz|DlznMZa=1xW7eW zc4lg)WpTkI&vpr|dxkT-Lh$=aQLYxN$BDujMnn^{J&g#^HZ6}wS)G&YHc_#A1QlUX zI+k$kUDGHwPvR)(6Ml(am~0qxs~W3Y7_owdmkaI&slDCm3@iCiqwEiXx&5)q(c=KC z&ts%QMUvrqB3vp;2m)oq4HTgrm%SUN+P4d)8j?fI?Nds*Bmt#7D4Uo@AfHruhDz5D z&#r?2e>L0&oM2U}Qevc(fo#Q73^mUzWOXHhlyV=PRC)4 zLnUxQMfk9H=dGzXrp?9_&sfVTr}UvnXrJ}2#If%5hYE~Bxr2RKqlHge#^=VQx4yX{ ze3Z?P!suc4w+o8!vFFnWM{5EKo@ygW1!2wuBMCLuP9HF~{qkkV86TPWIXDUmZYWgS z5HA@SFt|}g5L568m4=g9*gdGWs{_u;M@MZ5OL6mGwB8>}Cg)gspAx92Br*$oeZLJ_ zAVC`>z&*VPMzdLxQPzlp?VW%*5c~Q{ zWzziCxG{wXfk|!(NNNfdO(f-K+ddBdz8~({^e+{ojVx)IR8=EP!F|i%868}-(8Dva z`7%GiavDsZDm@R;B3MMPc;G#kP-7X*KFO<{zQK z8Xs>eKR^F7aDHdvB8Jxpdk?I)qSPXD(rT& zCjM8RsztQ1uFDza1Ur7W&{@})Cjl7n6L)@3C$@-idRjPwpC+ss|IHyMZ2MMuWq<8R zZcXX&T;xcFYRy!UJ)e@cu39%NU!-z$xcarEJa3w93=nj-KBl zV0uN0x@0BNw?&qeCXOAOOR7#Upw^fT3U&$mf|`G2YV zEIgt@>NfL;c?8Uy!u`|e^o)!ugHyR`y`&w7wYRuY@LnJ`K4l}Ci(g7%N8ccAIX6gF z6#3iRTl}sQ;Kd!$d6>_}x6V!ea;t+qs;Beso2&UZM14b@+#Wvp^AE;hg@iC!JU`Cs z?Xv0j7_Guj{?ti4<0Fi=nn}y%NkNFOEXOnJ5XD(y8q4_r!;~TU`CJ*QS47HC8oP5f z%980 zF;w8hYSc95?)h;Sw5xCTm0O&sY(qC+B&T_PoY7psIpJo8EI6PybReSf+YA7g^l7n}9_ z)!Vc}92)@_%J2mgb@PhR4LpCx)J%ix6F8`g60>4#JfbCJ{Vs=$(;TqTCYU0>75j=< zT#a4|R(ri|aWh}e3Y00%m?d_%Y#rnhYFoMb*eQ<)2c9pU{fW;0Zuh=+^JhoU5QFj{ zj`7Ez{C?!H<3YH^KC!VXE|CfLHI)`)4TwsQ%#~s2 zly`EHM{4#k!9ZF$ z4h~`B{?}1T%vzYgx?c>nQ}6N#CkR2j7FPFobc9z7fw?e-l{8CmQ_%c#cIq0pDA;Hi zn@38%A{c$_Rm=-vpn^z7po^!NDO$7NgGQ6#)$1W%PGzOw?3lL>H4hpy==ECnZuKf% zrU-p@tpM11tPR7FK2&!#sg5iN=>1idZMnk2?yml$HTZ`I!7Is&yLDJDl#lv#ai=L= z%EY4=Lc+q54uB6RO$d;U@Y0XP!@wY23Q|hx@s=3-5=s%$lFt7E8Y&|Xp=R-D$E~)( z(-lm^=~u>|`ynS;*qp62B{zc#U6A1NNRswPcq$>^X2w`bxhpzXxpbY=a4SAv_}#T{ zHhH+HtAU+b#v{t&D<=TVvgZr15$Xbp_MjAauOaJylR5gwYz>oBzr*RlJUU2Sg`!J5 z$Y04W_aZVRr_BrJ^$FbtOjh!}Jxta{`+Q3#rJK~0$WF`sX;qGh{rNzb9xVY^y|9vV zKnWY97Qfq1EALp0MiI@%TaF!wO74pba#ygv`a^ONmcbDEJEq#wzEGTUZTov@z#37disb%+IwzJW8*H3_7 z`=^#?p1`V_?}fk%DGSVReq(&*wqD%a$}Qe+CN5p{w>WuyF7EtsTr{MgWh+8#5kO@9 zy_`wt+F%hYp464UJ4hYkDPs4~(aQz0d+fpHlRr#9E!s#GKOVF+q>qcCvbvmjus9~d zQc9!#s`a&qQ!EKMi}odSxL0@UqRaa6QlRCIL^f#(n4L9Y*z%;s%W2Ah1k=2q`6C zCFr6`2@f`Z^r|3mAsT7#aQ#TY7a!ZCweCz6NbtmBsdrtf6so( zT_)vijWm={R6u5QjbWe^+@^AC&;ynK3_mwZ!T^Jg$Doerx44ijQXBqc&<$r%=aVg2 zmu)=&ZIZV0U6UX-Qm+(~#fniEwQK@)?Q3W7KHcJ0!Ty|VGzeby1ESUsx19b-zZBt)VWeHV@vXv)R{R`)MFVpmb2%C>rKBAwIk7G{?>310K`V?z!F!eXneHEC^?vQq-IS+TD3F-%=+Aph}3HLo@^ zZi1F|zx3RqUFUQPd{A962@HHJP6?!6jE3Tf%6+E>T4i%cqT9XP!?CFYRKR8KP70ij z=Dx#!z)OqEpSO=f#-~Key>-0_DAIgCCpI9t8UABHm4 zAv0+A-6%djP8zyhmm!TWdbYcDjZ~i0Bc!$qhWSBR-;K5I|7V>wYo7PK_3ZuG*|H#*cJ0O?u|w)V!N{6AT|Zy9 zJ3|AsAh;jK_ppmqocZ<*`qeIW^wJl?b>k`1AzoiMee;!S$p#i?pBH~LVweO;VuoS~ zza0%MFz)dtEc&3NhtRz|hiWybXzvfe2Ti*%v;gsq7Tg&>|9)WS?7Fdz^SmKMn#e8m z=)*!r_=l6VtS8XQMDz}lquB^pir;`mc?*A3O6-WKzq~;Bu=K|zu3O>ZFV=Q}s!jC_ z?Y=&e+h#q*?np^!hRSUdPRDKIHcH8EcnYO$r5G>iBj2}OrqT|!-nhufBuR1Sk7hT^47{>8{K$o z@@9v!&Rr`gRCHSP-FsG;!20u1N{wwH!LNkj{8%Tztv%A<9=rK^P^}{X2vZN5VZSfS z*D(B*DB>u47^dW&v2U;Qa8`iU5J?vtt&NeCpZtx9@mW5X4)Bx@mPaa&>Sw z581?I!Q-|%PKNTzbR0(7o`O==kDijf;ePN)46J=tO%wF5j^O3=N?p0>FxNBZbHr!~y%6pY+@zKi7Aw4EloP*Xv9kEG}vr!DFhsv16*~6ku!mP%R9P zM_KZ1Gn$Z8d#9$=?SdDXEN5ro5R3oJ{>2Snh6=OuJ|p0b_HPTK-(gw3okDwihqzei zw_B@>U3`bv8@PQZyb}G{iK~3){?EMSEfwKWB{qQ!V2KB78uF+&L*oq900(O&-Nz>g%r3o02t_RoPKFjeA>P zpJ5FcQs45Y5nXx5XHGGmN9r-#%I=#T(aN>MFAC6{?y(Jxsxej_n;R_C$rV?Gbd(2W zIuCz=lJKS1Wu1xpyfMXUipb1fD8j3ch~Gwp^Wo!svVcVNRw?FF%LIRTG|{{gl-PZYW)!+-o^JurTQO&>=G6dupkRL6?D# z!IXof@rlg#fzhQ`s1PG_K>#_z_wxa$od0rtqlh7cpy9_U(-Ub07IH$H{Zk=gg{bBd zd0*ELb$s|)l{h3z-(^}O^oYU5Blv?>0g(=~H55t4Tu4g0A%57?shRX4S9h`jl1Kwq zD>inw{GM+FQUCOH9aJ)7zEkVY3sLEOX2|F4jUv^YN8c@@14IjC`mhvU;$QUQfWuua z8!{hN83A$(pH8D`I13xhTkmtgI+yUlwo8E3`fIeKc)*)JSdST4rss68%_l2Suu$SD&|eiZ6Ovz5Oncsz9il(sljZ*$&A;RmsA9y@54+u z6*J1qD{5ETJ+wpTI1!mA{DeZUoByqxXU)kzlv4el`3(#fH4`wTcigl9ot5EJs-`IS zLp3c4W4pdG!@64wX8;WeUn+;HOv9I}oHsFKrSBfWdnndnbCJ2!@Qb=?mh=myIJW6? zXr(em(DE|xf``iEQ1^a8Fh)8B94lakqgJ3uwW}LA64||;Oc6;V^P8jI_O5Qwt)KCU z&U&e_{l-x0;SZ&3T1BgE{lV{fngPr3h)igp%h!1s=lbL7DfP^@(<5bmHOtfq zekqo-=2g_vYHHrB1$sZ*s{+67%kDcx4Y`uPda-2}Xe9N+ZL&Ma_=mvZ=~cwg+-p3z zSetNx%rC!zkpb!fcP7~LAl?E2SYppaLi36;l$Q!+F8O>-ZOcpj-KHxmtQ(znl#C*K?b3H3dp|m5D+TejCaVf6ld))M%K^7dw3oOIOD#i+TH*K7CoQj>CJ(>lC-t1yO z|3#0=XxLr4Co_ov4NYhqR*Q1j>!n-Dh;#tQV!@#xFhpLCzjRZrGK;7tjLqGl3yA;A ztVbDJJBhO+6vF0Bg62p04rH2DAOwi)5zw1 zprsAjH|?Jd0Cr7$fj|F*J%_Hfor!O<(Ho5TVKVxr!>X|9#fi|EKlZBK4w^sv@Q&{I z8RkY2XD}q*6(33e z!B9qYCuIDsr>#^Xah zR+#rjQy9JZ1bIy*)>|t>LnFtpvLp5up%gC|jtO|Jb>hl8U!97_U9O)n!HR7kBmqg@ z`TF+*CnwL1Z@VKlhiSNpj7e;B+J{aU0@2=a;=ZxQ)vboKY*5~uBbH_p78GE|%1^Mi z{ut$xS2Vw#g~+4e@IIw4757$hEXELGsriZU zU)!3dtQCREMsw()>!56;`GUm_ z$f9GM-3(28CR>vIgFl@*Aur%q7KH~gXfM+<3dE<%hHC94(7IN)_7Ls)r{LUqEP?hY z>Nx}Ld*5A8PK|%R6D>h|Y~PyNhRLsHMl3dVtc?Oh{d)W39vdvpT)g7$9&SS1-YFMd z5Uxy0UQpXVCTounS-<-F(g7*qZK7YaFKH>%Icn-cEJ5R{Y@gM8Ewrv8lT`sip{LsU zC!9nbOal1Dj(p(oz+!(+6AwHOP|YOyOZE3Q{Jnbe=*mysk;trP@Hsv`Ep3W{@02ip z#$LrGXqRtP+^@;dv%?rm_8d|b(D}lkNmGZ7K83gZfo~GwBqTCdhEa~O6=6sKmHk+# zr?WE(fQ>&h%C5IcnB4v!RL}+$C%Z#87Iu0D%>=7=#Oyl5o`33|Xby0IaucTM)IYZd zpRxXTxFTC~&_xr2z0S}5K(MzoG*C*v4BDlHLw2f|eyqB38nsJ04(uaH`PB|9@yIq> zOd{jn1)ORkwvZ+sgV4L~bj$HSFD=};`S9mi(04%WnO7oBQWa0oCfg*h8rbDbm3V#J z9yqh)eIzVt(^QHMq1`M%eCjaXa=`XuZCWCQR5cbB7Gd#+1OYmzZZ3|cT7>5?K&7e=sCT$rIxz%Y;C_# zZCkygw$`EPWm{A2y2-fk$dyrc4)QiWjm;tg3RN8A#f@b9^FAUIKRTKg$wEq@t7!K3GtJ3LIN{VlcQLatQDa4KYb z+fN(8DlRoO-IG*3zUC8xDi@MLwPQBpKwI0n_JUEjwkb85+}p*kTdx{x#de-s7ayV7 zbx5p!z2M&?7t8eVuvG2aO=plqV zQBt2sDmm%t=`F?Kg4~6Y-Ok;N=<3r@w{Na?>PE*K#8tK}#sUBcOkKCBs-x1c_ak;g z1DYZKeGf^$KL3td_rH?d#^ZVY_wWsvx;KEIT1akpGVVefO=t#!B{nW?I0Yf#;+2*> zx(@v;pVkciWz9))@SHhkqW|}*OQqew_JFVnR}o%@I>-#HI)W?F=}B#mQaajp7^^ZJ zVzNV@?d^Qs!kHkd>Kw@2Ovqz1;FWF)ueJT=>KeFNs_BqSz`Ebv(9E#mfx z?!u;A{aZmH-kXoUv!8kU5Zcabze6o4`zR*Rq_4YkvGt(g)$6e(%vd$=fNhV!Qaz`% zoAnTDW6$FD=DAG9A2#hpE1iDVIiMx6D3ofhucd{Ihvnk9#oP=YlW5r2+brVug+LbokdW#Gb6h%dJZh3` z^*g>A$zE8PtIrpqa%h+qT?|`>==G3Uyuw>G!Igp-Ley4Q20Qt7fmF-@i;L-Rzf~P} zTbG;A-|ow0?_mVTX+F$-v%xP4EhDiS9F*de+pk(lr5${}QfDq>F+ zhpYs(dsriWTWJN7_jVd<4OSY3v(F}{O#?@dIA$m8yV5-*B_*Bg?YZo&=OOWplVRSI zOy>XTipW};dd;8RSdFH??LXu)l8e|SJS z2k@?Cdx5+~po>;Y>s>zy$?<06?W`h|;%db}(_v8~;GDt>C0yTm%oA?d z=$;cYf0trntx~zvVw)=~GO4_|2t<0b8k z$7tiNAu=5qyUg+2+}f|lajz9VC4Apbdz@lrF1q5qWE_ap893uf!gM*h6D}w55K!Uu zE(ow^=ex`7s+AdC@kR+(8SWdVd=oqMQAXCZJo(9oT+u;wbqu5}>q$3@?yH^hAb-ld z&vMRhUF#@pl`Lv43!isAD%uac2y5kB^xg<-z1kN(*zjVNg)k@vd^)SD1;AG@?_dOK zLKc;DkE{xG1jn`ErE>^=vQlh&M}Uxx%J-TREK69RH`w+sO%Le0&gnF_p381` zJ&E9K({L}*My*>&>c6U`Q_~4ri*frINGj^Kl$MIhJvR0o3%>WR7!FI9-vM{F-e&NP z39X_K8O!LxEF$-Q4uVc!NJdlK;|er|F6q%Pe=wH1B8(|Fa}dsmMFPS{crG5#(2$mfLZsKiJs$D-m@TH? zFOg^jifl-7H8TVQa#P4L#J@K`7Vlq0UpNY1vZczftS7^H+4ZEo|K{G3QA0X$NjtLWb z?)_fn60Z;W=|dE5+HKsEvwOO!-vlJuzud7qMj6uCBDcs71S`683W|mj1ai0G6!0gl zYJ^3LS~kJyb@U+_T~_0tPD=JQ#SSJ^GLsXGlb(Z^T|PZ=Rm=wym*S}i=DSiS5e#<` zNzD+xz!hY%vTSOm6e>6RDqzm;Z6K)BH9$`HtZyzgXs2+sh3cVDM{?t+wySoytg^!9 zd6$Ew$r~9-Nqg$rbogrNuYCR=exQf>{e4T2`4AW|w#Ud}r%!zXP#MSh@uwobRqtaa z^FN;c2*{=8RN6e>XPW`_D9bt7&}LI;i!g;kmDEFX*f4cvZ_*trmMB8c?@#M>LKZz2`H3e^uAgCUfYo<{Xj)S0Z_jjZ~4grVD{ucv(rx8 z!}cbcD~-h?!%k<`O&X^0-sJz`b%efkv}$>_?|h=I#~hF~Evj(oHHq9H(SgXdBfYL( zoce7^wc=6AJRu_x8(Gq zZt_xS*PpHw+|Y8hK_|I$@j?QE4Btm>*Ldb|?t6k+YAKao$Qo*qOKn@p1ti6_^<;yD zB8gIXne?SxW(H6Bx2$X0WCx23)49jHczyACX8s*LQpXuIizn@jK1BsN3?>>0C~{U* z{8I3TnAmr-bJZ1}Q!ib{BzKX}xPjt6B6F^@n3`IP3`^fu$KS!v@DKe@@jDQ(xzN;C zmk@Ytf3$j#f0tT$`SL^^_dVaO@z);ZEVs zZNb3-bvzrh##3AT_ku*!(@hQh(nl%64Mrxp9fRBO?;`>A3drqm|BLjuiVawi%Lpw6s-{r+~g=!QFls6v=nr5jjz;`quBm&U^VPRVAZ3$ z7v8Kjom_WI>T@e(=3&Ks4oTyShslPSIW<$y`k;M_{0y+zw$i|V?WvC6AG(*SYeQy; z@1wcTK7yYfIue&9ZQ}dfYbhPuNQ_tmQ4HGPaMKOWP=xW1GEe$LK5wblD}-hKMII#V$)OIUXK&j{($<72Ls=;3Id9TCd1g%hZj`3tAL!=|LZ zpWR=yHLA!m)0Hp3w-++Z4vnJ{M`UCbS_h5YULzQRYaI**X#}&96Evt!=GA6FGW03Q z9-jo865VzTu;Fxeu&b5G(b#9yeCP0v=S;X|XCD^!?b}7edn`&(rWp-;i*~?4;3|Do z@hDzFx%{^g*-kHYT01=tgH+>;+)2&k>{b$M5-3)2ZDE06%*kVTc=-A5K)MH=2ar~x z^FEd4`rpOQqG;!BcoFGLrLkytz=y4w&bzOO-DlAds_7wLI&;2P)QRtDc28jb;5V#R zTmDuZQnhozZJvaa-r?Dc=YGS)&iftni=rL3c*o5!x{lcex)}s1u+;4u~aqmFSxwF(+fmlQL>dHA9 z|6MaoN4WCKFzJ#%f!MlQk|q-NW>e|rD8}WTX8$Xxv+UT*n&yzEDP5Aehu{WX(cH73 zG^6PDL}R?(X0R<&KqF*DJohA3YV(%pc&j3E+SK$Wv4%IaBy$unQR;;dat+dXd?(ko>aFOW>(5c zlD6Ux_e6$N6_}rG=-+S1(FC7hw9AA0V6C73M7j{o&1uo;$m)mKLZ{9ON*F=Fa zZ#cTBoRhZT;$b!rv6zeP-Q+Cyi0jekF@6wyy!t-;b5X+vsgk7H$I0N~E>G(7j|oAf ztWkJH6+kbFW*pXmS3Aq4g%e4eP|MWTH0+v(SNq(2qYaOjAPC2IB@PZ0-|Zx4*??%WvbxGf=1 zVd=;(#?XZ3wKe(crJatAeOg{S&y^qd6y(hWwG&15S>P+y-^YoB!jLx88U=1aY1P(J zKqFw*sIU8*cBUj4=X-qHX~d#6I0vsFe#sd@JqYIbnsW~cI1cdfTS+3A6Gvc|5}1Gf zilL^$%VGvqNYcRlsP?YfZ+0$*#3I)l{G{f!a~aCS#H4f<9Z*{T_I_}A49)EvaCST3 z2{Z2$X>5RovkRwJ34>GPh+-&c@>?tqEaK@h$Y$U6^J=fpJ2d7WUL_xX!nh{m$MJ?V zET8g@zO~V?u)^g{j~euZD$3w-qwy61f=2EN!_zyALfEF!6ImSlz-Ic- z?oB_R0)u*4r&ZvLGXi}T&4gB-;Xa>^rT7y2L^{h!Mad7Uxp7f_>`?&m?}I02qM2zy z3XLuN)=4#dGJ#YZqoM4u?d|2d!YN*YbImF%8Z5=Van^orX3f`!tcxNbQc`w8C%IIW zcR^dO>)#|Mxv+vW0>aGtf9{IDzQ=tA6d=wk zp;F1@sZiLw6ixCSP5e&G9^OEyV$^|t5uz8S8JN?<9sG1=1bYh&6~Y)L`>@_Q>tU&k zDnWBUp{V}jdH$)APb$iry0k9&c??NLD*Rv*vQfQDjiOge+Gvqs>A_$Q!GESoI*P^Q zuJcVbu5>AFPUOIKACMYqKdjR$3)vn# zuP}|!3F0Zs={SvYvrv`OYEL_i)tUvX%0&7UE2V$Kr$}To!#kQbYh~zazOwg&r}iD+ zFL`J$B(xfvB{lFt3}+NT!MnQtmHLZ#orZlX)gVw*9Ld1nOpt_$SXABO&|sf;IDPE; z(Y9^6aqdKx%B z-t-n6xjDg&>jm<#RF>z3Jyiqey7A$4pk*;?R%SP=Yn)EIrwJVS7c?tviVD|BF^;yr zJa8506D`s1G{g-Ti|FhW*Z7p<2Kz>FY#~B+L*Gsf)wDWFKTU_(1NLG)E7?_c4Iv)QZ)ld@ho@Az%5*XRW@C|Bd}M@d@>2>`0LN+z%!)c95bkA7LN6(mq|A zfK=bi@aq1Bu~r02de4R^OI{W!h=VBTcOSK@Vl~-$4c*&Zau(oD7hemoHg2kbhYo{6 zlg|2XCA`ffoKQr6S3(&$Q>P$G#N$*WFOlK0gR}T%;W|M+& zEF~vXxhSSDq4-}U9%YA1gvf=RhDg5we_pJ4`zD5QS$}^T@4b)0e&8f|xtSCd;G~~p z68U0DWYxQzV5do{VjRLugoTM4Pk_-{Zt$IdbYw$rdwoey!Il4$=9li|ce=fZHAh9= zbyc~9obPn<+xh|iE4SS!hwg7StM4PT;^8301o3iN3QUsY!Q!cJ zE`mJ{+f?rPK+AE-A6N~GAr|kd`bNpYde!-DS2I*S-Z^K7F87KIvhxDH1^q}K7QpAd zd+9}!+H*4q$_Rcf%zlpQ7NpF4F}W}=SlpRCM3%1~IYe(%i&i=j5pinXD;4lMQ>Z`K zbMgZH2#Rz_DhObAO&f~pO$V`22c8Kfc5Iijz!tGvb>|Mp=4YY5C?YZm-m{GLl{`^U z+DT?pY}ARdC2ya~uV7SnvZr)d6<`Qs_@nn(EY9g%am8r6URJn(m%RZ;+aU#-=cAEygr2q|I@r`frA2W=nB0EUm!6SU5ZRbN^EJ8KVvQzvk=0X+-7NZdcZTr=SH8rzOlK!M% zGNLrwo-UJSY<3DnKEnxiCxt&b&+*>WKRUg7y6}gp?|#9BY za}o*7q#S?p8J&g0TpF=X?U7I?^H2Me zP$zrX@bHLwOJA5oY)+QbC-*T|I}N4<+;XpV&A<9;4u?UAW3|Mbq{Qaj1?3rM8Oqhc zxx{9u)lj95h$JZ}+>2N~1W^c$AdbSdFqsfPGtCN_`4_tynR#tPO-8fI8uos{@y%UA zg5t=iQJdUa5I@peocDtiJ?enq&#uk)3ugtkPF3KtNV;~mEMSEV}BMQvln+#%@eZG$H>9}jW?+H zkLJS3cWwhwUKcw9bhuBc;M$NPEO~PkfzQ}ufI?;&U5y!HT<&n*z46>#5O>BrlRo{v zcYG2XEWid1=3rx^Ak&x6Jz?7L-XXX$`IzY?xsYKwuvq8j?W1`VKg5tRq%))cmeL|f z-mQ=KUpE~*3H`^jUx^ub^A+Cx$&s{0N++epu8?O9OQ8VvTN2{dGm}_j7BMV(hk{eH zcUw|!h4?@L%SK&(<~b1a(-zD$-}Ni;&UBEatC?Exaajzc9rPO?XVt{(2$OUqbp#>S zFj<{nNIE+H!`ZE>q&yfV;C{W$uCB4|*&w?3>sJf_Z}JMol6HE${<`yRqyj&)Fq}-*4`=Hi!)YhDc}T@2 zPbk*p6Vi;I9WctFChqp@8ORilB{2$F@I9&v(B9A3R?8Z_z6!#W(n|x~NZzB~f4+?1 zdWvPi6#R|eqSO-+`&wzF&8>_P`7$w&Dwt4uKTR+xr=o&<^iPu3Lw<@rQDKKsZHNH# zOeVZ}A4vURa%D~4Du`Y)Vaz9|9d}PxakLPCeS0fy2Tqk#t0qjBB;?>hXt<_7xjpqw zXGRd!KHJ>+fuIv_01_KaMY)G-BMpRBq2D9;4D0|j(h`a-(xMlMk+UZ}h z&zX?g)+`q1Z#emSPrg%F#|>N5e+Z&IJ{BgQnOU1im<BmrB7Po|# zBV|@b%-zjo@9Vjataqd*8X{)|e?R z{XTREd2qqU%hR+lyHfmR2tFJCiGLGi=WJ=K^5{`F=VR^9|Ez+wHU?J|HzPV};azcc zKVLFuKZ9q`zKSTwgg;pd4d%^Qf(p__Bz#t61 zw6lm}y^cEP2R#Z#)Rf!wMi?0dLLeE^&sVWL1b_2`zfGg~C2BWn&UrdK!CfWTJkXPW;u;2UAq$(K=oLd!?TeFnPgA2zfrmL zQWa}Sxq*wxX^WCp3xIS}73yG}+Eg@;Cp2&HQYZNBSUk3$ zg)J) zllPZgAA^T#@_Oe#@)s+<+5Fd(0T*Avv%MEQzPc_)&qcn0da4W zN9VeqkWCLZfm0wAvRM4^n(7ZvpPro{t zo+MriPC@{6Y)WtESJj`yOtCH|G&hGHO49rsmX1{hP@l{M6wBNo`EP|(a0|+KO7@^} zFygn;h?N-m3ybM#0h3^{(0CPoK3e;MwTYY{Xk7PaB5vWS9U*GF8g%cNK}-}OBQB{kUEdfkNAT8Hxowqq z=P^U{IYU`r{yiP&{jAb}6SknFojXdEfJDgIC}R;5&3EbO89Jgm0OM@H19iHjDkmFE zu{Hz1D!C3As0L6{f7(<$z=k6rjWQyBTc^3^&+WBv-+1_3as~3(rU+p%=B7)_% zFHLHWbG0oziuY&6m-ovi0Zz%%pB+`{$!zF};x>R(fLEuv=Ac7<)}D2X$YLNXIAAp4 z6xDyNG(Akykt2$Aos*LP6Fb?Rwr)iXB?c?K4x~*UBpebD0Hh`dpE??g`;pNIqDX}6 z@mfK|VhktyV3~H9+_n|cU%?!gB zk@j*o$c6CHF0hmnv{H;pmJ=y!Fpw<34jVdbo&RXL>+7%`wL`U$$~(ZpfNM$(c!}Z7 z8;Q+9b%{B2>6(FZ9awwB*uY|;*eVwEcfk}mc#kc3c6t-TN0XXjhQ3Y;(D-5A8kO7qNowvnQoWLa#z}=1 zl;p`E`hOk=6Onc$*~=1BU{TdVhinx1S*h21qa}NXq#dCnF}CCwkAbLZUcx>Zbzb># z&TWw?2Ove$6MS_YX%mTvRoG;GF+mQsV!P-i!WT$a`$DkxrcG}M_urMZmF%6L2W}mR zn4Y~~M)W}fM14P0?&M(oWVd~ zS=snO(_DD)Lxt9W3|WeSs=ojGzDRe_=122JVi z#+**o_%#S~RZ?e4H@fWfj`a%`ngj&vK45ep^k#yp`}dQZG$h`{>>;)ilw6B^2&c5zd%-xt*Ei zQ9F-OM}IM7$4@l8(k8v`3w7qsJ`dqkWh$>j`B#ZT{_VEx%W{khary7~6$|UmQm-k3 zSiZBksS44Dia=F3E3nW&D3ysEB)cx2vvHoY4G{SvMIQtbN+igeNFEr{GHL~=88Fw z2B9)Ek*BGkhq}h}So_vIYK`1=Wmfvi>kwr~E^$ z20xX9;}7u>35T-s3yyC}O2i?I_;l4-_{xTyp z2+t{TKihxe&BSn}xeb21O1EL@m*YBQR`WQd}hX==_%>3eC7N#_GS z3LUiJassHk(ov|E)a0QGg(AtJGi^Wp)@n7;Wse}>}xKyY#H3xHgWIHA*^ZMU)b)B zT_$SyuO5ppJk@x{NsFi)K{}BIs}r~xTIAbTcE0#h?t#2(j~3RcRR8lfQ_<1mt7b;7 z3vp%^PHHFR{$nw}sq6z9YsA#d^q#0vB~8X<#$>O5{=IcjWUQv%OUl8M4oz`JhQzuGi7=>XbTStg!>hv%upE zWKw+^>Q>}+2cVPpPBz~Lc?d`LJ2((GfdrTr_6q+40s^jywV&|0|=IGh3{Pw8|3DQU5+rp1-*s=EL8OulAh(~a)#Ab}R!GdFw z#35Ht${zOj#ij-Kx3tP-9l(WlF2wHsf2vH zZZtVX$b_)N7oxy`lr-W%!V zo0xnY+j+h;_0`hws;Q;zkazFy&#$&*$LV1Wjr1TgEYp6kQdoq}x5;`=qHm^JSUaC3 zT#T@+9xq`H3Sdq?i@~bgyZE3#>=K zdwdf^+&%$mUB^J)N!^JYL)5A-+1p25c#NM+p>Z2+R0*Xs`9EY!KJ2iR$mX;MK6H2; zUHJb`ViXfh(va54HejUQo?P*Vk!lQ}g9qG_K|@3Xvz@Hs3mx^_GEIIbVo0=(s7){600@1dwr8X+5+uF2d{q3}aSU+L~>&Wnl!9#;3T^ z9NmDDlLhC_t^bfljclcsbGhZIe^=PNY%RNa_(qz2_IO*_|LT}0oZ=FZ5PcJcT3V_? zFaJk_)|#U+sq1Y&xY0wHNSlHid7FpQm=DzO9e|6^0Se=6agEGV7dZO+s8qgZQH{!D zY#OlMATB;~&c4bR=5>Oun-@mRC{H&O-ppWM20t81qn74}XOoUM53Q%#64%;7QRM&Xu zA~Au}BSlIq)3(7=gB}XX^}*Po8lxY|4xNz4yo$Tz&PI6N_|TDK#iQq4i8a45fEKS5 zj3TkrY06Az(cJlflNm;ceS+RLZsbz9-bdOW_YG%EH*KQdyi@PU zSkd&K)=~Cr^O&f>oN_ik2^J=bvG=XQR;3?Q2<%yLs&w4-5?LDAP6_bp->2)Dfz0Ue z$X zKyTKCfrx;nRMU<)_ z{zx4|FwdViG5>eSA4jX8t{P7w$J#ml+e%N8P=DJqj*p!NQp_gCG!79&sD^$(Zmtpl zsXxG+v6OWlU^vSx?0kCFQJH_zxIE^6bK;Fc9!wXVv|rPL+#&ss(iIy_o?`xLeKqtQ zP_;6M2Tm80RP8;F1YBwD?Nh=c)2-dz0oO@6Xv*vPgBe!6eZW2_88)BYGdnZAtl4^h zwURKrw7BRZ>fCl50Enk1Sp&w2u05J<;mYT~=XllOVyl9j&}H%Unuy|1C~u?^s`24Y zkT!lS@~MbPF5W^BRt#UG(;H8U&jNV<5nB@U7K5urYbo9F1L%w0i4^wag>mD}nLZ}y z?EbHO(!Lk5#h;&j7I0LvSO!Ffol^yt%dzC!z3l?Fe^F=OhS{;&rCA(V+*s@zEOg=n zb{xH)$D1(0n$tQWdVfRXbfhyCVgd!ylfLlGE=U=5qs_~I;o^Hr07cr;Arp@#n{?*J zPmqvoe-u*YXXk9=@?>JdNevYmj_yt!C)<8IKo=Xz3@!S%rp#!N&ww+ez@@N)tVzDy zh!?sSfBJ1;-%IuuF{-P5D$!naEj#H@PN;9f8D5K&AkC_awr2?=)i?$uiT)%zh$`8*yHIDZCk+wQ0MRy<|z)<}l5+iLmC z{Roz~bOaOmOj|?L`?Hn+S|bE#s5JH{eW1 z?<>*ZA3rdD4&Lzc^3CPC8{MweSu@N2TSDDKzJ(JSb5E_f-QDFmq5-D=I!PqzrEk($0Jz_cc>)fN|MRxdPiwwmzo|g ztr@6lp$QinF|G-TFTAZ`dpqz3Ve$OD^ov+caJP(Tkq86j+T*k|no<7JYj%BC8u$GD zP*>#dlhwcH}d8g82}!3sDG*D z?xd6nHu`6#HFs=?m>L>6Y~$qAu*LPr*+-p_l|wRtR4i@{UqI~z7<&Bv*?#=a<6k|I zq(FsfBs@D%6xTuFYj zINO!WV=$KD@Z8o;#sqbyDWI8IP|Y2Y8j@BsUq%T41lui?88c#LEn|bRW!Mp+Tb0MW zCv2EhULzKVb|*je=eGOUXIyHQjeoS7)|B+(Z0$opw?1n=Ku~Zg`pyZlm}D5>3?+6Z z6L5EkV&Y%Pf8(zlvm~x(jBGp2gkFjpOBVN2E(YGkKP(dwUuLA96ripPDElfF?(b7L z2-7XF9!s*To+vgvf(|o@6F_-MCEUv7cWE;AUlEoq-hR8Nd?{DeY?a$?pY5eHHQIdf z=qT_EfC)J?ti4{`V6wB+U5Dz?@kXo(Br-$-|a=;3ks2I&0RXL0f2;)YgV(U~bj0=KLy^w1H{ zy4O(NpabadRl(jZ3ct}(276Iw84ysiBuD~n%Kj-rewn-eZD8lY(UEXr?>&~;i({29 z4xg7k1J@U9GEoYsv$t!p_6`n0J-?(+sZ?ymds~@Tnp}IVTJw_Y27N+-?rbXyjEn2J z=@9tf2mVJU*y~-n^-`{19P4x*pio68xlnxwBaWN6UbUf1VyRbo2w55BQ zms;{%v6ey_D^w5TwlS?8FJ>3X-wL}I#=pEWpnC^2-WCe!^Ezs}{jYC#7IV=lh2NFg zWQ%zq0k_TY|I{QPHzbmh8(%tTwsLx!eP(*z#%AWCGEP_0w*+mTm64Ivu+@=t1$=>H zkd*z%3-b$tR-JImK!=$!6}dNyk53DJ?daL-`85CzbgSGeBAc3q>!X$VX&W1R=kb-F zbA1@<%hc4n9*0Vnx05Ov_(lXuyT8cG`_uL?H_1;fkJ_cLw{|p2{*^6r!>aaWX2r-n zf1Rgsz+78X6B}6o7H33t#@8lUc33|%jExIa+u4f^rp|=`JwpN}&y?jb6h^HjH~ocy z)?ZRemDyqxa7?!~P2wVRj&GmM0@u!6_(71MzOgTFCVcDva^gFvQ#O{}RMYe*#Tz z!2$od;D-_7Uw5@@1*XI>Qxvnq1_vAR#o1w;vzG}{B-o?pk^->LLwm^CQ{dVZbcUTZVebb*rjl0A3GGj{)p@S5f|n=9vX{j0Z#5|@sfInm6)~6FqPx| z4UB9IZCF@v!yE%TvB~?kV=L!~yBszkc0;Y)dxOcvJNi-EPNMM_`pS6Lwe}^Nw|C=4 zw&mq&-`*a5avWIX$O$mN?)=$gYCtMRF*OdE4Z|CV!q>*#EY?0}1R%v(YGpfFzRP)6 z$D{`Kd_My<;_q@BwLL2q)(_JXRtsxl30Z7BKguyV=aXH2J22}B?YDWo&CAm&{fmwT zY%0R?Z*Y#N(wpFAihfI6$UhvkBKyS{e)`(=gJifSK(}04ezVZ2tW@5)l0z|ame_oy zCs`}_l}b!f1;e~Zrnaf+(YXNZlSt4E3yel~Hg9nIk2YK!wd7d;U^%zKz&_D)D3r}V z6r+LgG=nG~sWiNwD`uXX4w#!(pBt4xp$qz|kQo|tVEcc9TP`-7|KxAgy@OtS0B8p{ z*RPV36=gL$PXB%{yPcQ)wr<_$_uTIlF9<)=C%nM>w|tsCCUD(u(L*F)uOvJo7l07)Hz{^hajKBxr*Ew)dAm08eGi0doRF z+ibh&S0<3J3^iv#oT;r^QMr8A=x%$=hcemMD0geYZ2y7l6SKRtc9L|9B&-@&alizA zxC;PyyT^rE1yE$~GYQv8UU1~*%qmK0Lkz+F(6@Jzd??2s&iwJb*~V&DBU;%e#jEuL zvWO&ckb43VB6B{6i2M@sh%rYeYR2}1(ooJJ(^BSBfTwaGx4q3airKcknf;Gfcie;U z7dz3YVsoEDdhF~8|AcJpyT3yccz?T9e?Gld7q#E>?nSds_LT{ z?HaHXLtY;WIcXc=U62W-SxOnh`Wy5 zKJ5GN!DQ~b^R|-Y|0*%Vk%1E-kU!FGvq|_qWHwDMEaF*jS|(?@8iIzQNp8^%8mIlr zyQ0BjT17$q!pgSKo0Lqt1kK_25Q?C4ReHVsSt@-)n4wib^4j$S)~P_;@*?NDm8R#2pNsZo1xp;i#IYVQ%$-dp6kKi}VT z_&dro6hHXNQ)s>3_+2Ay-Yd!gWIpCL z1b39D1*9mrpo!K1I%7tk=NM1!OgddCNqJ?gKy95?nf^p>JDa>SE7XQ0&IS4T3UrqQ zvmcFy6GyaG0=0b<2+r8>fa)H8bQDwdbB^_`pHH;4eYQae{^Vb*_Ze}ac?O?WQ&tw~ z4PQ`V72EGCSOIn3DyJ`!k|;(kdb_nJ@TN-ixnzQrxMJmYlJ281e(^{6ooPg}OyG?V zbsrVC2&&TIa0JWxdm36VyEn4Y_agQiPho73;gzr(T4Od(z`U5|)I}*bxg@QE{gi?Qg@ArViw#p2f1^l-MS*Nww2%VGa3ClBRl3J|xEb0Q?#51`#pn!?9U zFU;(uJY1hYn^>n)SqERNtbJ&+Q6PkCcWf(SIPzJfty2FSGqm=-qV1*Ip-1-hJ`-PJ zHo<-IkG|R2-D?5_3@P~ty271{r_5tJxqno-5x;6Pzo6jJlp%~2zG#SfdXsNG00iuh+=02MQL$r;o9Z?=F zYBY=sDn>0H#i*($rfQ?UM(Vp-@cg6XFZaL@+1J=|AYG+Gw?!Ifjw5-#F5sY2ecz#5 zZ?eDYjwtAF8?DaV;%uh2wLuEn_J$(Z#&-+FBnmazh(S+}X3d1+1xGQtbvJ$Qeq%O6 zL<7|8cir{|MibXcZ={o&C{8{oUzuCltH1UW&VcZApcs!>d1PA8AaT&n=v1-ku#RZ9 z<1`oC8|P=W$WM25xV!+9#BulY$`h_cKXJA0BZVL52etK2#TzfD%^Ju+mj`U%zOOe5 z!YZK8rj&wB3QI^?GZ{*RdFt)g8GQq-^_9j3cTTT%g%wYZh)tx%OZAps+6+Sfe0`9@ z0TFml1QdU&@WF*lnQx2xs0P`vFH~U#2KT8|N2^3JdHetDp96l6%Q2o4-0r=9IfT}> zSXSSB8tM7$GlrB261D%9e?~gMM7+fC*pbZ(&jE8>7&|TPMh2mLLD)pzTSPlBjw`ia zpOQ0icWHHtpY%Rr@_f;4;30WzbP856dcDXo+>8aZ08l8<@G^`UA+M&Vsz)S`>MlhQk$DEp zyq;U@dEU@)dddS;pIo$o{U&VnB+Jzv#Qr5h?#ubI_A{&OF>MTA{t}x5>3}5I@E|^!atyvk|jxzxyR{C0H)u4B3>4~sax4}B1m{8wd2HgeLk{{$*=@=N;=atz z!h3S@H7P-=RoNHw0?fQWDpin|?4Iq^z2Tn@(YM6*N)4}0yV;x;=W5s=5-m;{gSl0Upemj3x zlrA|{(d})i4zV6>;mqiSA<7~=!D-8x1IpB)e=8ZMz;U@dwG@)h(0R@IqBQvKf?3>y zZ?uSQ7kY#_Eh69zNsvPD8szFrpu>k@{6zaA!8NXOx%{qqh3LYrEg zpb8(gy&r;U?;3xp8LX~0FL;#9{22NC+N#@m7i+ti-RBHg5{x;ZYBy{zINsqWl(buA zpWRjN;Zs@DTjKlvLMb>3v5En$2=+q(fE4qe%>I3KE}^B;osC1SO=dYfFg*@s=-K?@ zNRT@7O^2)=8DS|aWDr*-PlG+qmcFapPkfZrF)0{U-h(@lu6TDStT5&E0z7#|1aEp3 z-BtGrLB$PiP8ft<$Xuc5QA``YR#s+UI~6976&{sO;9GG8X*<8Tv_C2s2G?I^Nr0j* zavWC+JeJ{7;W9kX`e~&w`m{$5BQY;#zpgdsVtyH#?mbG`eb_ zww_-j(58G=@JZ87b==7c7GPNzrLuboZ2m$K*icVyJmH!3Bv^Dzb#B2R#V|xhgjL6!0oW=?ILBG@TU? z)6@xZy19lkFz*<(1(@u+OZ=W+zLK6*y?AY5>QeK6z7bvGRzu)KmExoqrex&qt8=URQuk9KygW0> zN%g+i?4~|}vkRf%uj%QL)dv{1j#OZQFq5kJC>krFSUZhIGY*kkIS0jr-+%pCD=X{g z&tpd-l+k&SmezVNAU`B0CG!=^3rjSu(gFKCgt!k{TD?ZYrAAo*@u?#tGkG7K_tgcM zpzisKKy0Ly#53{Nvqrc)0+sv2j%_}>GsVM>YdOxX40Rh>bh#xGRLuVp4*`b3J3$J1 z3wz60z}T=RWSj~0-ms<~Zh9?;%yAitJzcj&`_%e_$V5YOcV%2{&VqiA&TajC%Agm8 z-rd{z>U`4I1o`?2?dD$EgxJ)ada^GIywFvKgdC2{!Be zmdLY;1o14bZTRXG*KY!{0NqL@D=#JgVLPt6 zgOLRyz|~+Q1lqeQ?-@Ik<>by}wPw5D0ztptOp$uF1C+kdFNZ$Z^e|`bk`cu8KC{}g zyBT}5Yt2(9Wi~wqq4tJ@?N66`XSG_A6)qvii6eWi+p7<*9{;aYDsUKd zIv#Y6aQw&gdT{Avvk;%vw1f9*t`H2dZG%=Q9#L|Dg33$%nG3o$N1iO@?89BX%z?Uq<#zI`1*)dA z=oZ`>7E*k6@u^;5-T7Wt<10VE%;6~SGF?c~OD)k{#JOYbggP;`^aM&4jFzKXHV>;$ikq}u@QwQuv zsaH%y@`P!Ic2TbiLUjI8^73T|ogtX--*)W>>32ha1N!5CRu6~%Ha1IoRBSvqmfW>{ z;T@hqAj_Jx>Muy{Tpw%kYVL*d`VG4E_gOAhCL#M}x+b0C?aZ_Ok?Rj)mwfQANo*C? zo$lR=5|?e)=kffoX(x6lQ1^8Q0QGfGpQSmGa?q^Q*n#QsG}E3WN(GH*-aRe2og+Cn zI+G7w;1u;7-s2Lvrr+K+JT>)+-&Y8}cKC#}PP(O)@dMt?pu`;_+EiL8Tg4>OFYu&t z_S9Ugpdj^TC|5&PrGtpF6X35K=AQg?38#^e5s+eKc+bfsTp*o)#oq>O!Z-o)&GcWO zY$A)i+S1-+5BfTFIkv}J^hN=D3RIMw7mfC=2iaN0BC&G`Zir;LQbGOok0g5jnXzOY z=l2GG>R?8JBl~8DWlwdiY+qM@KSjFB_Fh;3>pv@a6A{W9M1&x&y=)6O7pS8Ug<9@1 zyF)b2G_hF?=~Lr>ND)|a(SX3kFkzHZh_I8^dV4eO>viOL@OJR!I&(wtF+~G^*ZY7E zgTzJHHn$HgL^8k1<&B7&+mT2ow#V=~*SNRrT@umk&hLpA?l(W|*dbr?68>^pcb{?j zaz@a6WopKv;m7wNP>-C=h>3m)-RT`qY|=(czmxIgToCCEHfyWBt*jZysE!*cHwg8d zE=iqA6a86qB~9m>nC}&2k(jG@eE8C7W^QJIvqa20cDtn{c*cuS!sF-S!h2-UzQk6a za1x6N+_tBYCEVa6SbqsoQs(K_t?10NR&z1vTX45@TBOQQpicA{95(SrY&jddW<4c0 zuOy@+?lZ@HD(954VAzJ`tPraVi@!n!Z2*D~j|C&_KJT+9)^^W+Gr#M6pL5 z(?Zgm*=)|Fruw9kh`^IA(L0q<}R#F0Zoa>Uc+eL2lz50^*MN zm-%6#3jdUAt)wC!hs2fzn0wXoU>B!fr&7Aj(mek+cE$sKBA4eb;eJfb_6?jCW ztf30nepuC7Qo)$Y#;U#I^jRTALUsXvPb}D%_x*1thyniWjsit)}3Gcf>8tj$e7J|+#WoTor+0*3)Cw%!k zdanwm+2RCVw-leF*Gr2nC&uNs-}3&)GO&XAWz`1U!BU)&fPA%AdjqN!&N;7>#)bGV zTYzs~j0alg8(yU#m&p8Ly8DRp`Y-pjJwz!#x1wd9;!I=XDqz0*AjiINGsb4{=T?}X zuD|3b2PHR3&A~7i#r{XIL52W0; zq8&Lv$Z;NzJIJ~|6<&OSoHMp|<#B6wAYC;!JS)R`ENJcUo@F}>93k<&a02yn^gFn3 z@FqS}6U&X)s_RkCb#q?L8%s2&QN09;>1kQ3p?Ug=4@h$L|LyNpUd$Ly6JJF_21{R| zb>mt0oT#q;4w69KP>T z9Vt;|7+r=Au^i&8&xYa7Vf*b6fPXbY=T|m;}2xMMbr=rZ(a_JR^Q36Rb_vaj07WiTldu0Gtb`J+d2*p4esSw|NU3|Uhvb2*DFGCnF9elb7JNfG+I^r+UDXd zA2%Q{*ra8Oo-!CM#t*g)J*Or-^$4VmirfJ-wB-ZtyB;1znYd@blMC|D!p{x-9y~j4 z)9_t<^WVSsoSb>pu~X*p#nH~w{L=>GVUV9jS6I+IE@LLp)^R{^XsB8H%M?Q$j^;G= ztT6Ua7PoX=0hq9wInDZa^h>jIyWK!Y^Ek9gwL+%Pgj)$sWN4P2#MmVF_utz*&+kup zzU2d;esGepfSGCrDJuP=^|6;sWeseISBWtKq#48DA7m40Jhol)ZSFbRs^v+Uvp@Bf zU?qY&c~2dINA?i=@E%K(bsIM2`j8dZff^pTDGe~JXH6W*Yrt7aSn0UJDsjF|tyqC6 z92ohkSiT+me4XbmV8x7OF#X~^j=gd)(f{|4O7`8qdR{N)b#{t>d9WDN<*hA=EMu|q zg4WR)O^YP|b$oE?n;VsV-TD(0aKYxWcltvWS+V75Qr!s57FI>;AH*}M?(NOD1b^De zdtq)y`TY7)ruTVWpP^^ceX~bQ`k*t$kqAJJ-J=w zbYdou89|HrqisRTbvw(<3YbZ3iInwjZh#FUs_xS3P;ah8DZ6ImuJ^Ay*rA@S*QOQw zgs~aT28&D0=_V3bcYX7kt-l$yNcA^3caRv$xPsg~z$mXo?!&NM=0Q>5jqOv0jE`tI zu7qFo`zDRlNl9>n`Tlfu1o`GWnEs>33OesfR1xYeeZaDq(nfs*9^e@FoWx-K!e&_^eRyz+_!+*xW>LDtKyZUQw5Gq*^C&d!<_ zazKFu36P9>?l!hbd`%Mj`?N-`z0eeCs)ZpXcXxA!Zjj}$WRJN*g)i%QYnGy&yd3-{ z@*{ViJblB~5oYJ3w5!h|l5Nm18~dh`EA~q!2m6bSHImB%>1q9Mp&_b{1pasax^4cP zW`%q$OycRxFQZk`Cr|&Vgq?un5SO1E|FI5KM!wj&9=#nYSNt!n zFADGB^kf1{05?xxg%H3Exo>iXCDL7WFMaVQWp6uUCvV5?^v-nQy=Loa!G5#Trept7 zFk|?!_S{_Yji_#RBS1YgvC66nVTR;9fBL*mO z2vzxggsK&G6i+tF283*J&6Ntw?v3%$koYKNO6S3drgwXHCUZsmW@McM z7{91oYr`tB2rR5qnFW2@x6A6cpj>R6%?Xz}9(G`42ZMof{Z_V>Mm>$xrVE=_KZEEq z>3@#BK%57fQD94ru$K_ko?aEO*N$up-o7P0)$}%>q{a3Izb~?U{Y+f!?DkIs?zgK@ z)}NZkJ>t@&y!<~F-xWY8?Q0wAmR~v*#-d_>(iJ{6=b@raW7_T=8$#G+=47e@^jy#*m=Ig>Fj@wPfE_izA(6JDtBI4u-9Aihz4$a5X++FxmBhNY zUFFX%X`}4DjMiq6Th1A7<7;Hyhtq=XQ`t>P_{EVx!{EA{FN1FRp`|T}@-Ti$| zwsR?(S)Wj516SvL_oR3AAG9=N97LMuqGs-;-sT5qU+LuHk?}ND)XvNGo+8-Cs{m)H zpo?Q$O>yT^-W$Yv8U(<_%jT%9kF94$(>&8KbfbaiS&8V2yNtdGm}DM%PnL}lXH~}$=6pD?@27GSNi7!$6@FsDUG%*W<@NaZ)`)9 zN(1|Q>Uf8t5YO4ZECf)bu*>4CPB=!PMfFz*riP{g)$Q*3%}RJn6N`85g1LG6Iydjg zBe%P@DiZ8w{|pp=oBG`O?m|aY;^HI!T!5mQrk`v9&YtMu-ysPd$5DPC!9=}IEoE%UU4k#8_GU6@p#IrPIN_5uj-1+A{ zs-`YV`nmWYWX4i(z+;eWvoPh=P}bGJYkS;b={Icr?0>g-+%GqsiS5>ps-O$)c1C~{ z$NHms+%4!noKZ81i7%FIR&Cu?qAGG%=w&vwmk1}bY+UepvApD$shy5)5ctFEYctpE zu6O@?E$FT9?YK43r_#Iegs_2J^r#)BAp<;%dMLT)dn|F!57qOQ+RvRCL>zaXaAe2y z3>6)Rjxfw;66B&LmhM=EX+%*!8l>Y~?UI%Y9eqHT&g=d(Ro+fbtAT`%b(`D_P&mY<&esP z8*Lb_o^?*tHP9*B0hS?s>D{U7pq~-wb zQyP>XNs1|UlwSz(XCTu`er94UmY;>n&98aiOSoWC5Rs(r`95u)m?JlG$w|` zR`13V?J?XzSg-xF$Li}m2jtu&nSDfY0Vq4*+BBBX-5|W&sQYyEC=vBa9xr7Xj0-U2 zvtVlsc9O~7cr33LaVx>bNnAlv_Q<%zg$+vga3g$BA=%El2m2f_+&<-=d)Z-lPy1na z#R{U!W!Up2JKl`!JR65seeKWadtTWrp43Mz z_4&Fhp(>MDpG`)E(xLTZ^4{%jj=xENn^`G(zrCxzt}Ia@^lHiJ+oROm>NtDP2#@G6 zc?;u|o630wyK}`IGGY(=H>=G*%KG1B@i2hWui)7!#{S^~b9-@61Vv-XSelj&56_%5 zc6T&0r&&t^jA3#kt_i8dOS$RHaB_-)0?H`Vsi*Xps{-?*JfCj&!lN!ICbB;b6KM%w z!xYw@KcUA&HtG-m>jBhU$7eMLFqiX?Qmk2AJ~m!uedU8f_1U8Fwf;uG1;YrN7f0ND zNPjVn%=^bW$#MwJlZeB_-;ARm5ZnmoTb|>|!7-OnPXpnjmQHC1-Dj;(Ko!Ie`Y$@& zAq_8|WKy*yG!be-qd}r7g!#*{NTqGDjFxqL#e+v1F6jZ{dOXZzNl>n?HO9~0r4j$8QZ?=G&H@7` zQP)-m4ZD7Xv3?2C)Q3t~XIbn*!ymvBqVD!U==&Q+R9~P<`8<|lGkmMh z{!f}0D_NkIUPV4Mk1j$JG~8aV2desNlq5CWE8BPr0*qTfeIW;RXR|~5#6!3g_1Aal z*`OFH4)NNm_RcGrxTMu*EfR1z8!t*F0GC(4jH>wb6s>gK2knc@3H~}`6$&7MpzRh5tACvz<4&lsPf@y1q2ot18inpcl23;y9miL9Q2>BsHv_T zpsHGDD#W)mI z%wVfuJ6{`K;RqnEBcIVhH_^oQAfqpSPaYYavTMywcE#{BjD|vbzxuAB(|EKV-5+0? zomiw&H3{=l#&oFS61JWHpo48MHArIn-Wo)stI+h53Jl*)O3_goOXG6)z>zezP7l%p zqbMAD8R(=8xS*ClsRo~t6VuTF`T>4z41{;5RHy%)8jr|7hQNyS2mKi=hwq1;8SwqZ z!}}+vsj6fwg15cjwfX2|%_f`JhCGO>{+DoUk6ZRkva0&5@^$?67%kODbWi?p>)t<^ z^W0{A@{^{l37!wm&ci+;>vB-_{m?L!1wDj|$4kI1{U%cLon63K+=G4#J5KCRl4eRW zraFfs_qye+mG8544l6Z0(CQWrFM-w5(^}TQw`?kFJ5;;-*Bz*^J@40aTZf@a5(2am zQ-akw_0^J1VAbKlgw*UDWWQl{`jh$Ib2Vc|o&y_JDx(;dKQdwdP+yHAf zR9)GW0KQrzhJ>1^y1zJmpitRd;$f#OQPE!G`7Pit*0;?7X+!th)ApOE+1bZRA(?xx zuXF{3_=Cc=sBu>@=;uB6l293rQEhHRv<2-JU4;Wmc_jKwq#wC;VlZNJVjl#W?7=iRd|6C>fGm(M~pjUJNxF7^i!4C)hqS)5LIdqbDZD5N0A+Of=IWpM4u) zc}-Q1;D}ITCdC#^93oT>i&hu%4S)LT^2|lsvHsFw;-UeF`B5weGuF3!)&-*(>_Ou9 z*Hlm_3uT@xVsL6LlKXi%P()PZMlx*QkKQXdDnBQ@JoH+{KRi$i9&0^v{71Geq9QEU z_4^)1DSzIGb_laoc@|F`*0ry2ttth89M*w$6q&g{l^U0-;&XYK^sV`$o0uPAQm!K9 z#(+3LoE=)NuUxD?JP6auzoQVvQ*YF9oBw!EzXr%b|GOf((bVDn~ zU;u!CI6vT+oc+swO-I*MQ>g%OQs?t$2xUa(W}Udot$n^#^{!yJWPY#!37JaI_*Y00 zV7-J~rzSLUIZ}crX9}wH-In{LU=;-_WWKsG;S`R+fd^NyVkDQ@_gO`PMT({Mwc6R< zZzXl`y|6O;m;DL}Fu1PVR>92_p~iAq@Fp;KLen4zbe;pc`r=WX2!8vYB;ss?!XkU1 z36Rr~PmV_s*U4jfXD~^gHJ&s96_LxdOw*W>$ew(MON+=~x>=_)$~puUdrJ4XZ1Dly z-q8UvoIJ*eBBy2As!&h-4YOoSP| zSWVBJhL#@UkG>KmyzhV;sd}%P^tYe!e0(^?c}4Y`g_HXzDf$v#ldFp4XLTQEfU1WQ z4JU{m=AocLz4sCRVnw;7k7NrX)t}Mr)mgUQ`zz+|;5p_ooLy6>c* z1=|yUaQEv@*-GLgk`B29yM#m|KXuBoC2L{saw@Y_6h~`9f!o&@G(v|r3Zq{<%_;NoywuN}Aon;wu0Q7LF`(DrJRK(M z{2lM2Eb&>r=NAV*U+KTluZ~30nbW)P*i+Q{lcOgqW>R+%gAE@F^yQtOLgMoO z>{fqDtbqVFMhhNXvo*~h+wrEd-6p>f(p$2#8GGEe$z152V7s06e5WakX37i+J#g zTw#*&MZ0w_1(QVJO*v^z)8tOmw6I5F15>>}#!|nmTkX8isJKEKF8cUi<+++4c8z94 z2;#m|3+xY*dM&hgc+rR>n^^@GiYP=&9gAKFn{(@o)glELTqvryDs>=ZCKtV(M9v8R zd(p2d$aTLV5cW2pQTeV_iT;br(c_p>FPMC%xH$euP;>3fqRZ7#zR1MB;(G6RAs}FT z0c;2kp2}tTW4O4ws9DFKYi&C1voPSy;NfObSzF@#wi;soj0i?CHd(cmh|?gIZ<-o@ z5nKsli%}U{A)>OCw^ss;Pe;pU{cCj@=aS?ZQB10FiWi+9)!lh4-IGIe_Xr^FYNr&c zSCv2;z4z?Bj~M($On?1}hwtNuvUXhI4hdy)u;CZgzaz=x&=EI^rJ$-^tpRdpk%EVe zG?wSY6Je892y9O8lB1YVKShggy3m;OnYb+ycgPMAvaY^npCASIX%c}D2d90c;rAI( z+c7heD2kQ>e}@EN!6>vFbEnv=TscAnCk)if%?+(;RVB@uU+w+xxB2S_169$*wQwzR z2d~D*hdfEg*I0F!(N7;k@T-6i#?W>S0g+Wl>yDa&CqmIQ{2OcPbQ(TP142uOJh}W} z?YGooXIlYRIr*&ld0hE-%68pS9!4k2cFQu0Ghk+A^w%}q{T&=kAmu7&?=;Sn<|6k< zny88%<3244`&deae^duucBvQ!wGa4QI@mIk!SyhU8e-CXHb50hN+!wT-jcT#kJqks zsRI7LLN+Le3S>PJ&8{F$6VP$SYZZNXl$6j&;B~~=edPiXf@iP#`P3vPHa*}WEE8v; zNxywJt01Ekc|Cx#coq5)T?dMJLoz?n$Qm&B$Ejj95u2}IN7Te0x))C;<7ga79l+{) z2fNzzJh<8sI3{;=Lv}z2BY-}F{}GdJ=_bexgdNQcqBN5~>OB&dc;fj)oL@XX#lw~S zEgN(vN9!xciwFkW-k3uQF^>PZeV61)TIg`~ryqL)zBN(C=mP~{t=Hgb35}HoaC3K@v=97QscA`M4 z(GiKEAr2?4o+kqXbzw2iKJ!$rc1AS)T;KndkoormdUEaE-q?Rr%gcmfg#D z)$!>?C;&_dD_@4&u%%D9U?Sx|q2SWLwgt`zITy>tc~W=}^SiNZSfb3td%uD7+i6a} z#e3`J1vV4ka8#y=wNaTkgBVuk0iuN)oWEEq53@Q_&q9_b13Zo0=!{8A)i^??!cUwh-P4Aa;@g>=_e z(b3W`Js|qQ7CcO4#jQmXIvm<@r?U1@0EUOyB%a;7k*0}^rU?wus|br6Ord1+A~>fZ ze^CBmOMju>kV0H#p7~0Ub(W6b>+Y6ND5WxU7s{NbKS1s(kj)Fj#2AL67|bbJ5aR$6 zGslPax9vqpB3b9_u9@u49Hn0|1f_XsC&hJ1*|w4&JphM=IvJWCc?D=?DafbLk407g zD_vfEpV>No6s|TWh_a|fzxVCm=bEEtYQ zJ@r@fde~h`A>UKZ;%VGwOtCbZ&mhAymO(~4*|N&4o3|&-n`RT5I3jmjy1HZ(*;|~i z!zu`&twn}l+)Aa^^dvfJ_%xh0dR$qmp0{%t{aK|{C%!!3hon5BMv@Bjwmv#t z-Q9qBXn164{L$%PQYd=bi~P5XqcBVBS%mZJQ;8S(>iXeNQ71|muH-pK2zB_!O(p<-h`5_D%A#yVKdsu?#J(@)>6T z0O%!lhmf;5LVZ;>B_L9q&>zoD>?oqQ>MJXY&?e2CneIc=Ol~P%hdqQ7CyvDx%QqO~ zZXn;Mqqii7(Fsv05P(|P5Wb5{Q%Q5h^jl;Uk8r$kw*zSyA#<)`R5!iXH&E|%leXS_}8rtX$HRR_kE^Ot}scxQF9SBK!t(j zi@v9^)6{UO6qms4aXgZN7Ub0|bXat|2@2U|1?0)*N%;L#K4jJRLs)3)KRS^EDiz8K zP(71Z^ldNQGX+iUo%W8rQ(HW&>LSQjKif#5ruN&ZzAA>G;rD)FA#Jf$cdM85{ZmJ< z*>~h8M)81tq)peCiumZHugX7+hcnO)EmZ)G(%|7E8B(J^oa*+_KvVNC3c2_aQjuw5 zMLi*hrUby}aB4JNAxw|Sxi2Mrgut7(YWn@ryJcJT^f|G0bQL^s{iSW)DLRT4{ zBrbYAeVMv7^JjEvCY@0LI2j~)@fzI^rA=k?i=QT7lxF)_?NsuRgLJW3%i4XGA zwxb2Tcc^6Z8ls@sn}d#+6Yn#6EFmQ0MA7p2K#FsEs{-+eMLVVHO$`%V+osz(ExGli z7zs?oXL47p1JC@9V*B`g2!5@<1c6g&zUU3Tkx~56LQG&uCt3Vm3#(rGySMk-_091} zqDP=4cUp2t(nDfS)W0G~&eqMn0vtdX=>@%@4=EfjN0jF#l^EdwAd!|)m zS`|8W_YX6Ovx50D>>d3gnf!*Ky;fqC;S)=R=hv{y9;b)UR#}COnQxDDC#X_k(=ieL z{kRWLLnvl!PA)eJ;Yf;EU34`gk_N*H4jC>W(i5p*#0-&Uoa5;Z*6Y}4(_MpX7>TZA zFS*pd{AdfrB3-bTy^IwbvV(nmD1D7s%r@-oERtJ^;0#X1!^m8%a2PG0PgkuO7z(tL zhgn@r5a`S?v2N_Xt4Gt1%W30aNyAOaUD)dVT`GhaxJ*-5vhzogkpPqfITm}CZ@DTd zm0r5^Mq?&JvKh}R_2YIRRk6;~VZtj-E}B_kFC(y$UbanpkM5h;#kzOSS2VCs^hu* zl3*X|!?*F+tH91hC2#x9M9$RD;rmU5OrhgHCUeX`PjMb~gUy6TK#I?MQ7vIk1*ZAQ z$2wAxUv-(8Ib6$twBu^eBT&qf54r3AqniZNWgMUWU>X16R9cX*G9y*BmJnD_Uq4~l z>T9_BCk;gA7_5nHV%=KgJb9#Q;T@E3+Iw%+oDFKLD0c1-#M@qfGdVwYS0?`E@NI57 z3J9`(`{Pxa&p?7C@ym;`5A-4E=wSP)Nj6@v~EigQ;P%;euhWrq$WWSr!`I*Kn3q=Na2Z! zP`R(fhIL%}YQ>Y$>{|7clQiM3h8iewe+UO|Z`*erx$)Y{o_oEDK!ezz{ZOCXO!`ZN z!S&vr+qU_D?<9-OvX6a6tw>bc?TokBFWmAX4&L(0)Si%lFUZwdjcuH$Vm8#3Tst(= zzx!TTRYX4fDyqfpp+WXx)Va{tprDArP-;nW>8ZORG5+y9Zy3%G%+1mRMpFP{NuAuA z3CLc?2`uA`9wg&;jaxu55t3aV}x>^<~sGd+EFDdH$(gE3v@LVLTTGkrjj&2pTSbcG)uaEx=H?Hfv+i$Wz zuu7D6*MG;1_qQBiTU_ZGGX|X3_Vz~JWq{`qI;1-U0L6dZrOle7W@Of|tbts#w!54p zL*kH}>#>caThMRhn!)~m&(wn{-{3s{-0t?d<1Q>wOiBIyn)>U?;vsmLztsd9Y6ARt zstUk9b=kMOlNuvOe58UTBGCFNOx5dvjr+~_?iY2lZk)!+G>@|;>rB(IrW^s>KJnoW zFT{OhXT!O4s_V&^C=fB_fo3xxID76yj(4SmnaeyLloWfL2Hk<%rxZu@=1_iip7r`X zB^STS!QK5XKf%z^t%U>9Ivx8g58pG`zZb}bl*nuE9UXn{`F`N58Me2@@ye^@-j|2l z@BKXg935LsY>)e4W6PDagoO#)ge_iw`!IN~#@*I&bVx_@0>Z`<7GT;NbCuZm^*&9= z)jMA=O4`?sHV@!)eHcuBdgi!CvC!aHl7Go<>gd(>w{cj%<;v}Qh1Ao=qJXSl=HWC# zzPzt~+C~>l-2&0}z%f?)cXr_Oesyb2pa2p_hmfST~ zt+8G&F`0BVDU&E)*q5h-Au|6+ADRvt#Y?~g_p$E*d|~$mFV?v>CuyRhdunHF2cUQ7 zdzR-jr`tRm^3S4C8CQ>aprXGFpZiw1JjMSmXBDvf4bY5WPtMJn`8x|)Hx!XHyj=n3 z`!GKn)>QsL>0Zryr)@z2i)|Mx4<;*=yw$2Z{2ESh-2M1VQj;m<$L`LCSL||@UjuV0 z@=XuK0#D%(7Vrk)gu2cdVwv-r!H-;K;epsewVa%<#R2_0=Ngc9?^83WK|h%m za>gl}Gp@9YT-@SPsrFuv?yHB{K4QHBN06jf(N zSx&$!roHwVUtBHWSwICF?0f;aJ+a{1HB+gZ^p^N#O1&Mn4zfRL>2nYU3Z<~iSG3#o zcJ|jgGpeUe&-b?;9)~RmKHM5Pl2Tv!Lv^yhw--0gm%NHv>8ezKLKB6jvpr+=9Y?B) zM<=5XHMUQq5A6ce4_4$c|HbaXah{$Y-){rofIUo7HAfOX=Q z^YU!+A}Hf5e(`w(+h5NtjdqEDuY}axQGF=jf-(H}kalq3bwCiMh?!Q$_5*yGN)E=# zCybS!1z)8ZW|Jc}k{6$jru_4xwD=O@M0qXs#H=+KYcjnI)ARmF_KTNwTeP!~Y{&Zu z1f!4}c)$7h;7p2<(>Dlri{%`U%_cioi|L;$L^$aYe7-j}(Hi>bE{DV~X&+@S^e$gV zWx6QK)r~&v$ogqc+uJHJ0T4CeFF$7~jV1n-l)m1X=GoVa?|>MZ&y$YZ;c{D#fWFF> zJN5JB3mflz>@v?9E=#RE+(?`2^CqQSU%%)ni#2z*w>*8_Vr%mkkIi>sD`V_V4;Pyp zNt?$c6&|dmy?syIq+)m1twANI_%6x3`gS%Oix$+;H!uArD5Yu0 z=DBI(h`)Gw=F}U_d;eVWJmE`|G$rEtgi~9ZoMz9}-OC=^HarY_FkP34R*stfVoPLw z+LLfQG;%vL<7FE5D1up^WJIbXOJz#pd41Hjl2BAUp@bDO7qs@wCHupo-(*mEdeb!6TxibN~ zF0tP%({Mh==+WvJ)b?dTlb9eOlG!qE*d|?lo(}vg2-lE}Gu5u@3JJZrw()pLc*6x2 zFe-ouz3mGDP#2Zn&OWS5WElyq`*L~Aqaks4R1T1+;pIE6b<1m@GcPFdlW;tBuc(LC1<^sFs16RF2V8>0ljT&Omwld|~ zDU}l2fOC>`s#1unx;~g6E)$gH<4C<85PWM2bIx)WzpYe_Z126&Mpyc+(JHPKs1i>R z)jyTnygjSH4U{c5=3c$E7%$t-Fh|-)33hRli6<+MxqB74FN{l zqODgPmR-Pcz^l(s`EIKzWm6FZW(=zfa)c4dsrS~Kz*3eg55o!5FH`{xK z3fTYbVDBhmW6PP9Q@b_$sz#YJv$`**r0nWvEZi*1(v4dxiud)j)_-T82VXOuPoy{K z3MJ4BE3{J$)G3I1)#6GjZh!3^XMVW7eYMMqyvNs%nv;s?m`4d;RzSs2A!Y=`saF z&Mz!#PEwI!u-0-iQ2!tyDf3Js%Pxa{!mU>MP`#Z!zSr=p(kl+(7?r8uURTBnir|~| zt6P>SiFcWv%cql8HQO=PC#%ccuVzb0hEo8td!y!*n7idf?Pl%DaCWlB64=B^h3D1l z9x)<#01k_*Agd*@3PXSKgamS>1abj?|8hHJNkEab|D>&A22fktY}rB;p zPYy|y{;~a)dpns|uORjq#k62RZt`P3A@V^hCApsII1a+b>!7Xinn|Rrxtm3$m1iue zx%5rM9eB$J;dIc0>+I$~4Wf-_egZ2*d>l&nkvwMAD)H=Mp?;Q@S+oAqnA_^Fzu!eX049DAikqMwc*v5cl9%a`ltS zp4sT3`g`wbaJ*ms9hZ?JU6osYu@eRyz~)>XamrV?Df2t=Z$UG5*n~_n2q+Qx!}8Smx$XkD!tZW4@j2PdhNxs{dp$nQ!NFpZ0&WA5ng zPG)3HKgiPWiBhAwJ-pa=nUmpTXf!%Xz`|q zZX0=9GEb+vm%pnYpcKrY{`UF$%=2~0B&ML6A10gjt)-8|rE>BFGFSW}P;0Y`lTwi@ zatQSu`)e85Re{tM=dRUiwo?iJczC|kpOLo3 z4HA{+eQ)*FAjzx>u($9eDv^N=O-?_G`pe$&yp#QP^{X`!t4%@8Utf$b{AT9Xe{WX7 zZ06;)%0=3!TWJt|UNC-8+OUr2q-o|S&8*||E00r1?jW+hC2OiV44KK?LP6nJym^dtZi z5|k1%-M0Io$8XeDBSv2f7y!9aC%EUjgcv;$P$T{>#H>nbcX2@%dj3f-)Qpdja>}=3 zr+y9`@PEI|JOSAGwsmt!>Py|MS3F#Kt=vZ`xe*T$O;&S!xEq``%xpuPwe7G=r&A#kiD;KF)+0kEz&)uwJqE z%4Dtzk|wj$Oykz1O}!UV^vzySut*(uYi8U3H+|(d+wuZ5Oz!UP!!KC}DAucn{QnG>+hgUb34?(0jr zYnj8Nqh{ihsIwak9j;%#h4Z(**C(kTvA!%FHr*b@m#M5Qch{mXU>nm{OhQKdw)|(x zIym*SlC1k*zcvC(vo(Zb=!95FWru6ydQ^0A6ms4+JF|LYX7pwTXvSIh&#+E^#F0PYHLo|An z7(pdLq_Gwp(pUoq1`r&xVkmrBJM520KIv%a=lN~d7eJ9yO40MYDb{GZlj6T=R~;XH zT#uXxTEWCQf7nCzP33Fn1VF~^Vm6iDJ&k?97m*u*O!t0VMj{l}5P2VHcsZuqdoI&7 zIgIYN7G}G|#krbmhWt<3xeq|0*Mk)W>njL3HvhsPoW2< zEP0Bpatbw-%0#awVQG$=Xs7DaJTOw+n9&{FsBGyI(-sgAFg6}c)0`#mdFsJp=1fForhgGI1pFeY?@_uEk=%>afuSnii>UAa!G6Qn;t#Fv$}lc7uK+1 z_B%-aC5K~d@^-NnISrF~)|slO#f_%*-D)sL%;pQiYQ2%8_n+i>hh^?U+I-f@PH$Oy zL`)ss*@)nOCK2~0m&fzE3Wr(ydz4-jk-mK25!-DK=c}Imp3b|&{YU9j24hg=b!wvT z6Vglag7a}f=yBKDFP}I8~xV_cRbS^GVTqYZdq&9e~y=xPY&= zXdTWTfD}JiWiU_hvI1W6L`7wO_9>|>8c!u3L_b%u_N$$kl9iq8D}LuH5X`LQo?Xa% zZbHO@Cl$(A#k;Rg&f}W%=F5R;_s*kbN~dAn6_QZmDy@e<8={yww(y?3MB7FM0F6J` zFJJa^O+OUbb=-O#X-4h{0Zb7B2=DLXzH-#1J-VM)Ywpf3_7xF~bvos+4O!L{3=k<` z`}zCeW!=P8DYSo&p!7qa%jzd@Dtf9iWOWw8)}1E}VXs?dvsmPTA?B%tXn}$C(Ti*i zJtJdQ2{6d(70Xv6ps6q#O~~t&g`DC6u5Am?%zCFj-SLYv}E{AT)U-S15Xs(eDnb z(#^}^Pye_a9!vNzGFeB9G70YX1N7OOBvo-mO}LT*vk|LoKk{jkO(#>w zmYdNo`QFALSQ6&e_JZdl5r1&E zU75J#eO@bCj07ib5x3s=UDFIHOm zGz1)0*+8Yd_Zcpw>N;kwTHD@5%1`Nvt)rWc=!YYvvr0D@2j_nfb7@Eb(#G#*Vn7oW zIsJDb8$y7FA~mpNl0+*c1ST$hPUY{yLC*=1-B%rf*j2_NO5#Qc|4GNR2PSujmO}|D zNB~6;c8C@EQN60!!@feC-2+W%XH(AtKLf8-gL(u=`Z+jEu7@P%;f_o zM=>swln#|}DchQ6;vp@qd4AXNi+sIT5)jWb>OMz`}|}? zX`>pa4pf`SiABa~9L0_J0UEf?s~9A*N%lh>Oo3{B>=4Zo7OC3&8%u1_qc91TF0EPaSGoEL#ExRiX!jHH*|N*cV>LDIRQZ*&b*cMsmhx?m%hced zMj~dQ>${t-BN`Pisl+A?`k|)HYm@2Gv5j5=^mAavt6{eBiY4sJK}WD_fjdBDHw!`x z-&04JEwhJdi-`vFLcS()C3Pnt#AtjzSs5STaTW!1%Vz~<(JN2QphXWKC}Y|h#7Q$R zSoIMGVC@9o{ldwLr@g%p{jzPKXQ8tcK;?PFW&sb$O@#EDRaI^Pz+Rtucboea5ew)F zl-xwSCuqA|MOD_2PezsxB=7#cD;_&~YVC4;*7^nMl5~3pej!{4L++p*XoJG^g$rXf zTcjl8!YrCUI+((m1Vo8}+7~)q?pz*@$B^}PG4q~Uv2kO>%;$D4Xd*6{ZsRW^Qyjnt z7qRj^CL*IE6e}JTh%q%T&rGVr%@BQ;hloET-)rv7%rBzmbPaYqGrd+WN0tDqhT z489o=_3q(--@rEUeN3_(B(-MWsC_ND+%)|94NQ)p4^wh_Wic6fe}6Oy6(0h%V1r+ zDMgqWm{ta2vXNOe=@MKJ?wbVu(Lau!1TOBWcrEH>%-M}pt?rIo`-#De4I_AD6Kg|q z8k7 zjygj{v1~feT2lltEeNPm0V|S~u>xQgAg(BU3C8`(({`x&Wm>kr!aGAL!%GX9f|>Lf zXcfEoDI7*%V{lElZk;`>$#$I}<+Y*{BPQrjwcxmNwDRErvrlX)4SA zq^G{+mPuhAQn$!{40scRoPEo`q2)D{JN?S@(m6}_PmbZ%kherP?;2SZm4v?8<+d6S zrU^Vs;PvP)raGnkT*a6~#rYZP=_^m*fvD1Am2v_DwO{I}y#yGnw9T0CenzgszlR=u zaPrcKIZN%5F~6rPocnmg(!j>%|80<-{617vI_$Mx0>|#>W1mGf$8K5xnk)DVe(Cm~Mi0@I165{MvfkmOaH~qJw&|9W>k= z*m4O5$IJXwnH=i#%CSKOdK}pTUyQP`O+PnQLBV(-weN|jSV7kJ`!3or6{RjY1hAU= z&_^YD*3qJtWCpf_G=DYRztynv<=B6FjNu|DH(jxzjf_QTA+$B) zN){D1Ug6@$GpC$jO|CGB4Afu%f#9It{T@BqY5yuiKD6c+;}1~Hn)UAod(Jd|j7eEA zEMiIk|9Bxe+rNLou_IjwH%Ec)cUNaPOj*Drc2J*jQYqML!-~FhZTI_><3A~z_-1cs zPlW4Coq3yeP!Ha}%OA?!`z3bdQrZI}Fh(nM{H}H6_DJ+T6y^@%)+`4lb(Hrrk2B*O zA7pr}Y+N*eY}?*fA%Uv6NrICUTjI+rP*PJZJ8!}+fquk+MIw{1h`1@X%1ZOBwEwv< zzp{;Eo;9PMH8N^-wxhCVHxOGE)S+PWM5FwsC#j?IF~AD^!gO%g232ei+wfME)&^V&djvVoN10VSzK#(dZ_}~)D(Y!C(D_7!nhLeopQoU z8`AB!7yR~s-+T_l0QNv_7DQtdaM%5~Yujm02k3=<>0mD!>Bl>V-BcWq>E&?xbANZOUoxvXkAM2hCUes16jtRB+R8}*t+=5uF*(X(+)WAnrII}no-T2r075;9 znvLU0lDJe|nyel0;sy^63^8r%`_TDwiS?II1%}NvbE7?{VM9rxCA`qW(2&u<(LI zs0LFLnSH_aXyE#wG-8r;c)T?MGH#sR-2V(rYZeHbmfNxY7o)!)81VFTL<5 zq&TPK4lg90GtQrSBdYyy|L#HF%jAYMQO0F55Vxl^2Ly(&%>zX}1Zww2@sUV-2ov;3 zT65WEYrfrxp>zfgKRGED6C6o#1nG88spw3nbF&Dzzpox$tz zH85L^bU=1eM1&CU2|#5^juZ4VUmAt#O1dX^ z5R3;^;XGyX8{7@5Yjofvx~KN8{D8UHWEuC&(lfYJ z>7^VW;L2(|w4$vcPYk|yCYBm#HfSSQt%dH)U{%Ygv)R#c9IYRu7|R=8iIH(9HP7f-DH6Ep`qlLF|G&tc@4zpV z3$Q^(WDgwTqTpLJoZ{dFJX^5#aA`lYemQ<6Gmx_zVH?BpsP`ooV32D7APv!>hyrg5UnWW%Dm=aWYaMAu8YgLU7d1V|1ol6P?t=ceyGI;9$dx zw|*H9j@{bpAnP{^`GH|f#&D#jGYrJdv8m4B!z4C3D6W037+`<+|4ck*ZHnzy2IA^< zj3er|<6LI>>9f=y($g_@>a+HG-MAX@%WYuwKhm-9nHXHOn=~}8qA;Ncu@DY%we}v9 zxd-3dc_Vd&R~L)yNtciT825S?9pF_b9GWr}YH8>=AFX~?T{>MctD|Qs^Gn!^&0dGa z0Ldu?wPPCDNmjn&B{sPvH zFunOV6;+l`2yxrcaJg2|ql)f%e!5HxNYjMm_oi%QZEQSZC6;`!R(I2)WS<)k!;m-N z!}YVaoo$9*=J3ZFr{Rf-qNE;BHNE%vC;a;q^dktc#TGpbpr*HS_mCujS=C&hP@OVY z4S$G&4KOM)QgZm~eKPw2&FUSoeW=|_`|D!}AEg+lJ%#p~!8gHSD?vb7+6SzGsF>lu zh?HW3bzV7+t9STSZ`|r@PW`4@u_A+6y8+r*ZwhW`l;;D4XbDN{Eyg;Sk*+DdD_$z- zEn=Y>_BvPlp6a2P-n0!jqQ+s>K1?2nZ|kU`1*ht$CQSbx z=(G~bALPEdgMH_S5wz?2ZI>t^bZ0W%+@N-Pq|bB~!(#V)!Z98}9K#6_$s+{2`7i#7 zOlWp8l}CwvF@6rN_;7dPi*NPkm)3UfcSTfu6tZf07q|cK&|j~Xeb3_LQH6_m0X{9> z-r(ForHu#h0p~Ic8d(KSt2xe6Lx*M2{!CAT<2eGC;O^^SCOpX_zZ`w397bNyA&%e3 zsE=l?plq_3eVn`HyUkgTbDp7QVJBuJFim5mAs+b9o4@5om3O+?>8T!5 z8$G{^OKMUixO}}^y*NVvCm(iT}4|762 zfdIm@5XMiE_oH%l+S#g-!{|Bt-fG8IG1GK$KMt9Oc8Ggjyz;4g>(tK-=!;m{ubi7& z*Z{ry6$Kp9iyK)50_Z9G&0_IGj*+SfBOH|~*k;}f8Q+&g)b^9hZz|8tSzZE%_J#vx zLop7B4~ihM`xmJmXqpP9%5+I*I{t#o$hU&mL!K_U_j>Df^9B_AV?$2pxPO+^)EUPtX1?SH+drN8k0j89jnVn;<(#_SNU@S^|bjwR!= zyVLD@aE{e9=f0k+S9(j6TQADYJd+_JoR9z@s@be^?w8-j1BT+B;M4ToEkehiX>n}b;f2_QTupm2~oze(ZH!M{-{>JAkug*Lc zCG&9^GfPf6pMkO7`>Egi zbG1JuLcBiv&qQA;PR;n@A$V`ZX zkbCsdcA#krQxRxc;{-cYl+WO{k6P$EYBmi`l-(I#zaIKP^TsV03CBp_lxqRKomAKJ zziG_xGI2tBIp6U%%udbDKf5}E!Y%mhhfE~LoyOtH?;kj%CXET3M-8XP8R0pa(zMHb86Kh13VJ~CM)j8WE?kAth*a6J_Rqs zT`MUimUWZ~!>A;QOxe9axa%&a%5(Ms?+$~DOJmV=T@0e((80SrU{X8ZC`_7Css9H9 zD?DVmD2U^5m<-l}9%?}<-Tu33-?9iOAHz0Cz)RVmOyj<=<*w&D+>bi2-vYKa(-usj zCrVeBmbaa4XG*Jt^RyFMUZ2oH&<_^{OGh1-Khgc@=`8e0Ur5CZD6BNq5itGvRvd_0 zs&)v8q@cMs?~u)v1FoVzj*ASX5(d3;HRxITdSa?5O8t)h4u*&FxUnMgT z<^q&^8uCSD$gOL0??{a$OdF)g1ywz%m5kWgnLU1;^(UoWBs6NR7W~j|0xpE06ciGi zkuBK>loGIxg#~PHbHph7rEeu2DeeA3G~OjHLH{K#jSEXtdx9xgXwMNpt0NCYA`e=* z2rsfoAoY$OsmotE>h|=C#7E{2SS7u?&6|FEEAGKjs_cI4P)y)e{rTtk1Ht3o46pl@ z)R*gn4d?H&JRW-SJ*ZCpEz8?_K9;aRqm%iPkp}PGfJhqQL1)0m%X6CMzL=QD*K9Ij zv2CRApt}@S*p(8Y3@aV$=$;Nqf+|V{nE&#S^4ZuE0qs$T7{pGx))84kx{9muf!i;m zER9OZZ#bU6<{c9+#I0n}tjV{Z#l*~`?a6@-IeE14*y_lvW{d4)4}v+Xv_gc_+hV}~ z==gV;RN)>dLDtK7`qPH$NRHAW;y6DorbI#2TghJ>vQsHW1Axks&$h1^*AJa%xbQI?B z2hn^r(Lyz1fjVEia*HEvLL;3D&a`uwj7(^Z*}b#y+p*mXy&t_&qVuKrh-wCNvEmhI z|0sU5z4BjxV;_}C#^lzov`ba40$9pwg(%d!BVi!~7MJ{RQuFUm7&!<9Bq%|($# zt+7+30gXc>T>o%0%~Er>X6nLl396PO<-Qx1k(uGqaw$AGx7v(uF;5^U2~yBEhR3Ur zbMgZ0h&#Ao`clzq)m-e5Sx-l9FVLDII+%3rm)+vqc7=t;ykMvol&0q5m+hL}Tlq&Ve9jOMqo|$FW+n z@8?$69jzC4bJg846z#Uyfz4WWAHJP(YldFTOfRwpo(W&|CCH$#^s9F#Gvclf{$+8t ze_y_f*oCbLm(H^V?g>wxF&QpHF^fmdcLz|6IHxB7l}Os+t&l$yrSdO^2a1uk>)e`! zKMKI}PT%UXIz-*dtYph8`cE8x%dkbF>|8`Wn#Eni&$(B8LyXxWIu=d4tP=hcptG_R z?x9!%GiO;j*N7Bd;ogaW>SDaBWkmjY#7#%`a|p|`RMBN2GaUg2aSXmBnZp-dNfk{k|2pv)37aOjt@+ zeutmAZjLE8RD1NB6Qmi%S}6efzxOO0Z6|nfX4cp(k;%UeF|uX% z)mGFw{cQe*Ny-NmD;0pMl?r(G+V5}HYphIGz^u&GLe1gL#Z?IK*(9~5ZN>x6t0Rkl z`d5U*((6Ne=t{HJ?d-Saq=tP1kBhbW5S3oxPRX}9ttf>>Bf}T(IM-w7hfT?)KVpB+ z-peK#Gr0#-!rJ8JRcL_=8wh_428MhJ=x&9wwoX?D2r_Xiihf7mQgod2AD-{%!*44$ zHZ&GtZM#o8A@S~kX+zoW9VdGoc3?*j-?t!Ex7y{kID>i0X!o7Fs9go>^!;Ii=!#cJL^4nr$k_4?odoY|( zH`APAhDJA`ZB+XFOefTDd>$HgW;#$(m&)IUl-Zq-pdbI~5DvYu3k-=C_UTN9*{Fs6b^Fzw-*1e8nmbZ>3fEF<(Z@LP5JbbV3@oOct zM9@Oi0xrUGZz-VC8aj^Uv$WnTZtb`RYyVBPvtng9cc8z0MZo>Lk}d|}X9rY#X=ea_ zky3l}__#yp=ysC-(DLr^sM%5<53|{F=wW%i!MotLZM$l&T!bW`Z)9>>iC26M zwN{{4PAf}~+Wn7Y3>%gyi+L|FqI~Ba)ZYWpn`wU@>v{$z;$*iydaXgNbX%{g8>FQI zFrYu~JUaD1c$)|pC<=+9N9UHChXn;+G-?2taV^Vt_<*a4I^IRDK2|^i9@h&=;ra?j z9!k&7tr=nY?O0l}bVAz(#6mvemhte8px-PHAA{pge+&4x8p)j_3v1Ag`_}8yGmkj_ zwQFi3uedmVvrhc&Emx6#z)25%xzYz(+dN(9zE_62h)`-)WYN!|>C58j$__ifTMI%* zd+D3$r9a9lt#dLK{M1ZgRXrOxcn*Klt>&XY(*PmvjWk>fQv=sTD zeU4Wn@j}Wr#eBrhR&RyYF0|1l9#+rW^{~+)NX&BLgV3l7_{n^GWhk z<0XIlZ1o}Z{Hg0T0on>3`e2yI@Ko zXEU|%*qW?ryOyv_~JxxuVk)~^7P@}9G?zhB6W!Feb4!v99k<1qhJ(N3tGjUg7Z~+DN z71|e|N5_SZ{Y6JC^j>m>7&X$~wBx_`a~)!_c;~4?;jbfF^RVnm(8l)raq$c)<98k^ zc3aLPpWEFR`S#~H6q7_&noTr&1An-&!w=JMNTl~1Fou@w9m@6vka4SF?`$g(~YS@q~wQOo#&(-KWmYSLDb z{8QgDV(iuC0UIVf0Oe%q)$!@d{BT4?b`6_-%(FW1+b9fL+mlO9)$#mRY1QcAu38}U zdPr(5Hrii zWiFjm+9CPdyu~|%%KF>RpLg5)CkQI0`YSBj%*QE4RXLJrcl#Bow_)cih8Rs!|0P}~ zD|W(^kCW)90L32^D2^@Vx zeq%(#qM@#K&Rcs}x~(cb>+XaC+Znh!^QWRAxt3j4Fr0_vfC7&($S7B~D!#0FQ4?^5 z_>OCsu+vznZ(VqKHbw%gq0rFjj;}q4iLa$y*tcULGhY-Jw+0jCPAjxfQL|@YSNR*M zg0B76x!;bbkw^tfRMAtHd)>Pi3bX4L7g^?6E)p0w#UrgdAKY}JZ|N}U@Mx}PJ~5_W z&?K~Y`SpDFiwDW$f)xodw!Cht3c;hxKYk=qC>#(`EeHQ(0 zZvvNAa&H>GTX1>UBf+EwZ+(=Nak{Emj7t(JyxV>zx*ecwxl;#w$sp zFz3gu6c1EqLpoY%iE1H%f%LD;w)3)^uwvtdzD;UUW7IqRHU;?XujZDvanNsrfYD(2 zC{jG!n6Tu#Dc%ZGY8#+OgD9pO9^ne38!0yTg{F2)EmhkF7sc ze0cfM*S#xhq4C@q#PTGcv!}MRUgBY%Jp)(xpW@i{sGizib4Y?GH{^zC)njQr#9`zs z?(y5z>*mdtx#RVP8ZsW)-6dz_xm;U;1ay=V1Wz)jXQy1jhtErinObpRgca%+HGxiG#H@<*}5G(l0dOZC69(B^|Yv zg+Gzl1@>#MqiKMFO4u(FHEbzGxqqvRv7hr$fo%Qpt|PW$`(5QPBgrPFaks z9*{8}9gDM#XCXV9rjs({FfJKQEcQGq3?j!#H2JO#D{CrWv^%ec;h|{k$(4BSZ>w@+ zt3$BZ-MFji&kF;bRVZw82h58|cOL2#LkPG$5?@bBbyh$5nA5AWSiC#DGO9QK;U)BJ zA6kds$RUjD)6fJcKW(M~(4RRlMr%Z6QanAX`)UKiaq~pgQP{Oey3osvt7RuviKvCU z<8d}f2Sy+Fb5AR`u9o(& z#~I7N!kL;L1pkadwsF`hV#l9CpEUce8TZqGUAu0Qq#_=0s`RN@zcr*;ow9@ptH&`0 z;DH!mcvao%VT#8$fB$}wYOLL#Go3G67jS*%{mh%dAbV5m=d!oJ&LlW%_IoJq9sp;-L6z-FrJoyV z=NsNez!vQ7%*sW$RR4YM;r(W@d!{rK+3lS!yXO_wz~A2n%U0&JU#UBHB|4UFWs6=g zK4un~Bp^0!dONdy8%hBv^V<5i@a23f_dL=Q@78cm7mg)?sdfizeZ|tAcNjbFB*Snq zS%*}xu{s3vaU~vHp9#E5UFEJ>()+{m+1-4Ezb5iy$?Zw5Thgsx)*O&BW~YPTj|9f3 z$Z`S`#Sm!=cAeXk1KxN0N+o#?_4UGBZTqw}$6KuVgg3sMw6QLhRvem)=GEBGt+K-` zRvV5-tK!X|MYck|CZiphs;{W;OS7We#*$prtMeVaZJ(Xq7n~yAz|8FXw-;=NcPm$7S2!`v_9OvbhS5k1k)3rc5ujKN^&J12hDe?C z;i)~hJ%PM@SKb1Lhen(hg?8y4qUAOZiV{K=Lw^I|@PgSqaC_elylopTDI1EI=N* z@RFE*JWh`>m2;Yw&+T?Bj4OWIW%sfd&$0R7AxW1VGj$YFKaH}9n9-Sa-LZOrzcjH) z^w3-vI&#Me8$fhB-sq3qS(g;(z>rjV#xcm?l#x|Fj{2AhF5i^Dh=p>!dNV8xS#{5r z43iKgrDrUwu_M=Y4f1%^DTZNtn}r+pMydWMP;sOGlu$t*(7RGg0B2H-%H)|~p&_O| zL9X>YR86q#4klOd^)v@<`({&1tc@C+cwS}E z2Y**h6SqIE^AQWv;*rP$T&eR8NG^U-OY7fzDi@7s#4!$VE1=sgd^64&?f^`r_1H)E(C=+;~>H-9h#t1e-Cfl0c(yH%rsVib*I| zMj@Ga-y%v86c3+$UY`=WLI;J!ZOu;p5wc*aYZOC}-oLB=cpnhi;9}Mnd%hh=))_le zLYBcx!dZ010U-fx6nbUp4|#(a7#mUq^YCzSg3;qL_d)d+=n0XeCf@|k*w#(Tr98}l zEXA%Ua7NlAPf4uKk=qr-t|naif#btAl-&i^h$93JKG{z9+nmr&e;`CH5tLD4Rjra} zw_DE*3AmIl28~t33`xyWGEoE;R#ZELP_0olTWH5A<`ujKRZTxvc0{smkI1&FkehsjMs;aMGdpxdZP~06 z3oqw?YsMfJaC#lXc2z14TIBm=uZ*}qx-)pxr25Z&Bgj?%1#&{%zf~IAGiYoA{*|U2 z$fMX@_}D%6I3dfFaC8>|A~S{Ws~kb_C>@uKoHfVUMKS(I>YP_nn+^KH0H2Lt8_<&X z02OML(}}?$WOExJzFypJ+sek?l%DZ9!}xP*r*O?gmFn;Al3vk7;flRlb;ogyw1!M%ERl+X>M7pzqt!DhQwA8*m3}D<5l2B9gCH|3H1yKZ z1EekG)gD%1Pl7?VZV8aHBG{STV_u{_5WJ2Ndl+kffLq4Kru}flh!= z4?;@}Vr*h#M9)n}$NlD$o8S-NB8vC-(tfZe{#IoD@q5K0LM=J9^TDyvi*hy8GwlDa zt0IasSfff7(2$K!`85e9!6$HP&;Kln+0?$E;_U5Zx8p}7;`}|#p&!bH+Co}M%lzZl}fU;h|`V{{s)hJJwv-3#A(ksi({+V#p6?^DMvWMns8;O(oJ5o zJ;`UsGL$w+WsD1ejti0`=hs0XnrJ=wan}Wr+(ewQlrdJfUgzwxWG}^@*!^m9*|fx& z@LC1K>t<qnEfZ5uL=4|C|3ty5_1vzueW*)8Z^s$4Mv4~v_L5CtG7^`_C;mtL%n~$ zUj&Yq>HhMRU6$lNqX_w59PxSo62Sp$N=lDoPWroL8Th*2?42{=fA)qg2S(T*FXw9B zZ9{f#JV4;vQ(il}nttX-38P5LCk2d;Ie3&Vx|!eZ0LjW4%8Epyyo9Epk;t#OE9Aub z*qmJEe!aYJrgPWuctgczdFfbl6Lnnzl{k_@UHm*(@eKh9N8K%XHN z$daHu!)6xP?hlKq7+l8z0g5NW2hh40<{)UezijmHi^k!m2KGyhBSH*}dRfsv86@s* z&PKR9@o4s9yBVorPsxFkm>iT9Dxc4U=PBYIx*(+l7bqm&o?Gi8ufp~s0Ze|{x8<;$ zmn7nn-lIAGlc`4Q>ka+=Bg(rdboUz1CTmGW>WaxU@Dn@6Ci5oV@A&w*2sp&rp{Tlz!_tZ4>>#R7zp$`C>;AeZpakqH6ac(D zA;?umo)a$qw*yg`ac@F?Gr>u~H``sIhkwa9AylQXCVwM5ga3W%&MCMY*>e_v5sv8< z+dJ{!49wTF1Bw0h+%x1SA`dx_21J>;#4p6xa(qnQafOEN-HQl!1 z9!;bc0~4!Q<%UHP>L(YjVUN_>jTP&_ZDY44Y~-0EOo9&T%ehG?`ISLLXCw9=4>$_@ zfWj0XD=AP;iBXO44ZIPEVevf7pIf+3_5Bs-1&;@19_>lv`?wp5h@0_tE?CVk;z=G$ zsCn|aOsG~H0jD?*XAz{e=$n6^la>Eu1I3MY#yheL4f*<&zfw6m(92jQ}J`9Q7*^lkXrHrv2w=Aim z`jki7`_?#_^zogd%+zoHfpT@!j~BqQhLp+oGEw+#9QQIm*>)qp8%<5^+zSz|vvS*6 z?=C(v`P^_#)5^qr#T`bVE% zYv~KY6DMjq0Dy*{xA^~8YDN$e9?V_s&#gb@$uZ4Fx>Vi9A)_^Iblg&~Xt6gX(4Tix z1P^nlV^t`mdXKiHX40nm604PTY^#*iH#iwXRtAf)kL9C0wfyCNUvXvsb0-g=(uu7m z(+ae6v+%qWf;Z92}^Pne`5)Y(xtsjPW>gC>x zOO&W@7)$<`Duip^72wK3RbA@-1)uX~T|k=py{0OT)3JpzCnwi>gIvZk8QC=b*UfX94-!dHmJia~U+!35gx+BeKkpJT`lAmT{)mei zPW`kmx4tm42g%@?HL|5fRTZ`~`!~z`dc$qyMXl&dsrq{%GR#s}4U*F2q-!HWYas}B zou_{1Nx=k5B$6^?)|AU?#so}DHIF2fb(d@Q7Mkq5LT;CeynjNFN8u1UqkQ~C z{#F&B5!9_gFZ7M|l^!SD>P{7L|ANoE)^?>8S9=wSs2(wZLs(wVEZ3-GtE-Ulzh;7m zh_6?0pvWqrgTSk$tzKK+k!7DHKi*I4rZ{f9-#=Lm{C&M}p6|?uA=Ti+rNT%po!NHRSg|)K6UOKX9w%;X z7Pikjc@KS0jPJQCXWd_>iD^zh)*MdOwvR*_P-<{P2)DM(R5W53;~Bl)$#$?i=y-D@{;}o8=;=XmW8E7ie25Ant@A0Zn?E3^8jgY5}wl+<9wal>9?QD1jJm=1<4n z&E8?=?y#fm#`5UY?oB|*t*G(g?uQzKQUUJ|OXJ|v#TuuE7E8Re;*Kzhg}<9~$i0yMw#h^<0pi;>#T=47 zB?j3_ryqXO;-OGncu%Js9bTPA6o{{A39mSUzRvFb_JFlfMd^_Kx4B z@SnF8@*KVtKY$1ZWOyZf^K`pxEPN9w(}KUqX84oKZJ(_1u8VNNoULQtE9Qt9dV7*V z3;EI(e{4J6zo0A{5e{dZ{u$F9h@AN87gk6VdtM5}y&LqB6So{9k)qlt!xv^Fh)-RT zWA36qB@DNVlL6H9oqLTg{dP$b=cvDvrH99(T!k~SZ(k-#Xp)SD()vDRf1?u5Ts5>& zkY)j3=^Ve$a8g0Ai$*zB?p-q-HiNcOS41ZqWWsMO4KO8yOb7Zxh1xO3IvB`>fSJxG zmldzqAQ@7(_OEh91nEn5j@w#+sJ6Xnqc#;=o+YCVZ}S{z%+bVEaP=~O_%7B+sKdEL zrv12S_zOc^lafY^*k+i;>V-^eYkqKV>ptFi292xZ>E~d4Dc`d#V2B;ey;=VIvw&dv zbz0qqV+7KHy{7Tkb}Idasm6eq*Wc#`WAVV_o8#|Fm#iyhQ4934cYgC9I&{&v?AcaC z=5Fm!IdOiJW0^^`}ezds>rseEoNj)Q+>+ef2$DuT!r+r>VwMYMQZ1-tmUecKH^Ne+&-aWzJP{Z7(}Lsn zK4Wg)=dGG?k<>pams#}(v?|H|X;YR*$%M!0^2VdOyX~#}Y!_LCld>qDf!Ta=LyAO% zRGkD8xZ0V!-12Gj%g$PyP;C{FrC1iyoDMF}o>eX=wyep{u_1Wz7e{W*yI*MHB2^h; ze~9;kTG2jPi5tS6Vj7KfF+`ee?#jSzzMU68F{lIu(1Pk`WgS9)`S{cX7 z7*6eT0*1=Xn)chT{<-_?A|04^3|IGOnYD9d4_K$82spdFrJYN zI!Ti9xrq%x^%pIW49f^97LoJ(?^cs5x~ZAPo~-wkTTGNhy}Kyl0!!7@VjX0fQqTSW zW%^_vvBIJahB)qZ(OyrfwqwQsKmEn^xU2F-yT1v5vf|_I7{1R=$Zp_atdx&o zvpXtfgYf)j!9=4JqCKsr5WP>96hOY(C}~|NA!OFdE~Dt0CO|-*LA|+GW!=Y>C^St1 zTfdp+?=Z#@xV1%lolRD}31GxTz?{egzugADj6&2?aVc^8t2$kPJLV?fFq}TyM@Q}= zMGA70Qn43u?%X5a((bwQV~5m3S+2?M_ai+_T&Gf;DO6An(YWx0R5y zdEbZ}o4G+paY?Zw2^pr$2e8M*^up?Q#>@Csjk#os%#WrXZ{r~NM;$vuW&2}k3KNmW zSSFvxzhjpy%;9hL^QJ9_(}Vw-K9#=fxt{_NHR?~Pqr5I2gn1iY^>f<0(Rb$Qc0O_C zrSIAiBVi7%IO~1N6!drI!gKQvvn@+dt4Ju$3dL&*3Br`lk*reb#&{Zt=ydEgaEbQ! z=4zf#DSjrps`4F7ptGlB{5H0*gpFB8_D1gAM>W{0Q?IP&=tIdj(uuL#=RWlSDXE}> znGblGT&bQBW8eP?4izd}^O0qk3RQm4#0Hy>pDh1chCNPVMPACuE=-J6`>(_TV;O{O z9>dL>iw|Jy3QVj9qs~!foU0*Fg=KU*Z zRXk7PSriAGPz@ozyqNB+lqH)u@Th8{Tq!AdBLl+8fKc;GoQe6|r#eWvFUPzo@p>Yf zDQTcwBSCoNnt)~w!x|D`pX9T%v5sLnh$wN)t-Q;&Nr-kw&QuMxWuJ3+)3I?s;}29mEiG*iYQyG%uE@FY-aiykfTI;rdYjKzxP$vwH*sd;w zwqK+mu;R83GvWh-E*!KNy?MB>oeCJyg2A%j7x+^8s=i-hbHF)tFDP+&Q?Z-VEBUCD z9>^W+9hZD8DoQ}&w=|UoDus3&ZvMV8wmZ}{2)}P_kjy#mNV?=#5&F8r+}`~@%>1Nq6K5ko6{)GEMmzhA*)8qLz1qCIRo?%s)Lwk1bysB;mKcvT&$a|1 zG6BukDo}P#;)#XNuspt?z3?b51T~EM(_+=?Yg%z%^0+sMbwx}WoR||Dt!>Bll{F^E z&>#i@`D?w%1M;noMHN1|&B6;x7y0}Eqx?eSKHq7c<^wsf2(Rb(qJ)@Y@EnBHb%f4yN+%?r=jnp(=ekmm*k46g9ngvaioTP8E zEC9YPIBpsB41a`L)#JaGhf8%7G9_NCjSV9seNcXNMZ5Mx!wm#o~6xf@h951uB{1?y`*G$ZV~fZ9XNQUt(IDrks}kJcP!t z+zYj2QeYHwu07fQb-}~gkaB8Z-X5=9xuPG zM2?&Dod{R}1w?qILhV#hS_5HSDRLj9b*H-x4T9p%9sudn*AY1JKgfxD)*?t~mHPtA z#KD~b5%R{eVR|vMu5+!7c$(f@f%BC=4=Q^?-(=qqesokC*9Tg6`4sidgigqdVfT?Ed_|NUs3mP6?z&(LRsF`A!++4(w4u)5xwRby{>NG$c9U zO+Gl0oGvad4h`!XWY(T{!sUgYhkgnnpI-L5IDx#}GahEbOF(zWGGNc~vbRf6$fbIVlJSs)M@1az`ZU&hrF z61?es?9GApI_mk>0+#(j8sJ!GD-nChbH7Xr{X)b?pc?v&#}mcObhRsuA%G9TcJxtSY^BzQOQvy-!5maQpUPHvz$6t;_L9Ix?T4S` z^-PwL72>BSF}HraXw%lHTcdhD%6PoYnYwVK`x9qjfR8&9x}-KMGs822rb_~M5FZsA z$o&UPn;cKyg37by9ZCw>+#y$rk4!f=Hy>*x3cVUXVZ+%(YN5vvitd$H7aheXLZwOu z=KGhskCWjUPumgj*@Wj@fGWRuG%Fwv%bKN!<+rcm3qBBccs=2PMeFsc2tLo5G(g*# zvhwH{4#|313OVeB!fB!K@4Q(i5~K`oj4BL8(EI$t*Ng_3OzUd-?xmek`O2ljqqVjg z!%-jUz-=z!%xm|Ol@j1(h(DZ`*7X@tXNkHM1)GN+cM9$Wxt`fXpuYP5mDaGdG7XIS z%f-j3o}U|%koJXowd4n(5%GuZY*WD`OhZ&fzyobg75PLw`WnAhX2j<#pl&}qdDs>Y zg*0tIw2lQi`=hc@IZeuLx7)|GS!3v<^8~~m&a?B1w!zAOX#~q3u)vfLw9V_Rhy5yW z?8sP6l6 z;6)qkEX@LndfD+uz!OR2g}yhb(~m{L7RZ<<{OYzRc>+moS>OBaxqHXOoiP7un?e>- z#n&zN(l|u=|Z5JW1O8^b_>)R|f^w?Uzjf!gF7aB(q{VE-a@^X zldd<$#np2#MM>tHM_A2HtBp6ftMD*F9skf4QFwS}9Nm-p-E&HafvlTZnLg%iv>Nf7 z?DX3>GW+Ge5;2CDZ;Wl2gB>wMN5K2I{_Io7fPev$irSe@+YPl17xrRatFGu}N4bQ~ zHHlV^5UJOEt%%%c5O#Dy0 z8*FGCX7#IDgE}g`M;v;$JY6LzT8AZW(ZgBK`ut2x`8|6wYHN3sBFwrxTOi}LsvG8e zDOR>;PT7Wk2{Q_N`!vPLGA6t0qZ-61KF<=D(wBHsZ;j&|d*Fb{VQg<%8g|#eq2%=6 z(8W^hn$m4}JnH+ac>1D4L#^*>56mPNYdX|(jAgR!J#dOqo>3cwJ7W|7FJ zp-k_KGp%XV-aQK-zj(hmZ3~~#dI$$#KPGtoT6K0PRSAJ!M&56oZ^@5ljVnSZmeWMw zqf{me=EyKBcq|2aj(7DEO_7pyD~p-WoD9APkvG~tNM9n7N?Jk-|CWs19x+X;@YnxTuWT-C;9 z^fKpndo<=_k)xxQZQ_mL85WJ&vW=fcklh;nmKBq~&aQ?2TFMdlk)Vcg7=$1mq%|y6 z8KZz&%H-OmAxSAQQrIoLn{qa5Ty#k%FmvYvrFXZPAT6bZV`P{u_A3dm(Ue=NOk&e6_^*otb70ye%jX+ro!6mRcO5;~-X^>WTxc&sq+S0ayaCM0 z>2;2-Y)j7IncxSvo3HV+gix(2{C-gF$USZWzTqB@`ZDQ=C@d#w)hSMSjSt#Yq)QWr@{Xn!j-h5cepUGs z$ZPVkn%!{{)nIA~beWqdGHFsK?5fw4p9NPOr(u>G26rHI++%0H%_R&z*8o-$_ThFE z9&z&K1s#kZ72^t@LD-8Uvn$Y*>gW~)82i>)+)F?GhXRJO4EH@BCBwZYom+5UJF<*Q zs}9jn_`B;9|JIqx7;dsst%(8d-cp7@&}gyaYS%NgZU6Fs)_q{1tU*oW4{kvDr^w++ zF-YiEUDMCO+n<3lDP6*mFX%;eJqMSe1lss#0+AZ1%diE*+YBKbflYT{S=DO4Hj?Tdf18+f6!Qq_ zR(}$q>EZ?nyaamwg-vLalJ+`3bG$n~z$nm<{=AEr#fY*k#_zla{tWZ+>UVrF&iN} z$>%9m^~z?IhS#&N`|z=Yn-*B4*$39D8S}&Rf&LNnXK_{2yoAI)Lw?nL#`j<2{s`HB?vn;cC_tO@;@8TjUaKKdo*VR6M zYHdeY$n^x2y$x3c!bbu^-ne)i|F6lrM-jgPYz=gyxs%Ept2 zsYlY{vdnafjWACBZ?+Ppj;>@zjsy(!_Gb^>$c3xOd#3ER zY$$cSVXpvoUsnyGVBeaFfMw)@JyfQa6-h9lq1)j~Xpwnqk|A>q039*(bCh&eS|MEI zWPp^pKh~-hvR5`}@?no>&6nnACAij;MqH@GF>%u+s2MEgIXTM|Tj+<+(nh=G7+US> z-S>3Q5IZKx;PW(0X%=AnCOr*x+I627ATn?#LZ_Eqx>_8VJ5hnhM%&(S>NKs{JeF?e{O?xTdq z8k5)*8D7B&%n7@a%0eBxfTyatBkc3$jB%U$ zni>XZMj!k3txqAitp=ez9^g{2Vh(1LE`ta-l|q1U=q}TdixJ-9713c5;XlpQB>K&M z*m}A|pJ826fN$#tXO5X#1ga)eqP_P8X3DqbT z3*tGNdAj9i|NgDB+iA?3lf9WJ zNdpSL^om%ZNH1}gxxomzP+#e*)pAr~4-Ekp;?5!#XG2co=NEqW$-lScV#n95*udqQ zg!=h9YK;^`PF&-_uOm_(4|z8e?T%KnG3*%NTQoHlxp*SD*MT!dF0^SaWNR&;uD@mc z3r_r}m7)kCUK&KXJC|oqze&05Txxf@(d0Z`Nxd+RF1kNG*EYN--I#c)ut$Rbg}~Z} zb)NO23e{*olrt>6E^I+dMWgPGeF_GZF(W34 z*HcNWKf7|G{?)L`Y(&)B&;Ex%CrkeKPK~4oH0iGd?mB@DXiM}ZHh}l3LzKeFh7mB& zy(njpmA|8FPI{X(RWtFFzx=g*4cT~UIY&3uX|xuHj7PUsyGM^~gqaD0sqy#3=_;Fa zLdSd1H=`f=&LPYEqsKOgt5_&}*a*@uSD|Di9c2tjtl3HJA=T~c5kg7l=#IUSy-$^c z9l0Z0b-UX2RcbWZv9$l%4eW88s5Z+ID5$tnbeidVz%H8|-Uf&c^LyqQ;pvJAdkp~s zB})Dq13Sa@Qe5iC<5umTdWtM;V{#UpqRFlN0I_Q^O9kjMd0zFMde!=4`<`jIl?8*W zC?)55lXTu?-i|<_*)pH43fjOXa4hH?YB2wUdBY35{Y|d%lNRUR+b*$G`)(C7AuFES zkj=V0&l!W$2U8NMs>uXXz&tSe*t`!b~YoSqF&^Q5+-+&#$ zTPx={f!Fh|Y#whT1BEhKSX$M`_rXh?mX@^&xw|REPwIpj?$Za%Rfr42HX?&=NQWTa z-zY$h+oVmDp{nCTgVrbhvTXRsU+Js$#geV|vd(f67&8NUtM3Xh>&8D@3kzXV?VWqBm~1J|?Jvm0HFeML;S@dr9@06Eb0je>q&elWKIXOeJy2GB*#bxE{ukF<*2lon{sv0ZWikbHEbjNA@#tX6Dyv#-kRQ=k9AQq&-+Y6 z)3+>I!!1=*Ac3_v>gQnD0D7)ebKE@C_(N}y>hpS(2ea21zvL$?pDWwQ;>{b)RcM`z zj=7k<2AD1Lfcy+l)QX}1*rE!q%zWj_Y&e`1m1nKjzi@OdFc&J5La_{Vy4ggb@Z7-8 z^r5d1JVcda{gaCPwuc_LHwELg;jgUWqmghOZV+vjBv$bUJq8L@#V5<;Z3+(LT^V}! z+jPL$#thGc8EPyc2Q8Q5o7PXl2B=^{Nsm}esrQ6`J^y)&MMQQisoE*!pKyvUC{r%@ zs(HWcpWuJ7PvbCK7DdMN_T0QDGgVAFf445Dmpvi4-zONDW3G?maJEmnsCE6_5k4N2 zkk*$#{mql?{gLQanKJ#Ol%3~+*EsALT`FUmOK&+2&3#$87tDjC^ct4pZMCUW{Rt7GO^NbN9R1*icM*`DDtVe?6w}bZwZG7VRjPl3Igl6N- zkro1;K*yPuWw>75b7F=AqR3ghKU?CUoP=WHfmi0ncAdO0o28Gpw}Wi%HbiZNsFIjZ zP+#veO5P&>%v}Rnf?I%Fi=JgSO)^ z8~uXE-jWK2R?eRl*Si@7+eAEcTP~aT#3aL=<@f`;`TH&u$C73cF9XSEVB)ga?Vq_G zqVmLNmH0xus>4Qrg;OS=aL04_4=!@Xg$>_~sv%N6oW5r$@gdJTX6Z^qx83uGeYL zOkZ158!jU(o8m{gsTLDNw~hbRZi6eGBy6d04rlB~HwxbHjAYGF6xj!yA)hjkEW{(5 zSDm3Tum9$7$D$O@Gms02J0Rb_z6GozP7L~hp@pM!j^kfO^G$tHhCab?MhzZ?c+@KA zb>FRq!$3Zdj?0=P<5akkO&Dr+_p{pUa=CFFXlE>a zk8!fl@e6eycj4&3f0rw6_jc$q!8G7|AH?ItXX z2^Lr_g69TOC{51Ji<`_|oPz2Pt*=It+60ZT-=9wv9?GJES_w;mKHTg=r&;v1c72I3 z#qXxuh!S#nQ-Sfnp6sI?mMF^%hnzdGxX%+%Uy)mgPEY3Zsh-5@yKXKn6S$E2;H^<7 zX&$Tn$;~7VxrZJBLkRGB*Zjsi)!1mRk8k?CxDQ>}p{_3oHHX_wW$6Q~r+MAfie7us zj|aN%r@Xau^O<}6ys0`hDm@*AsYY%XkwmeuJPzN!Rhu^~e^IbKnjku9>ZjVzvGMqi zraD_>hECkIbL-~_rL2#Liv6|`xY$>{kgPP3At1S7!n1pE?@6DlX5MRx1 zd!Uu0PTcNzG+@>z`@BiYd)+UWU-o?8vlWBr)9W__DrG6zg{Ld6j49>+`s@e)^7d&c z6W=w~M2jW+fJv8(Z@1LCa#=I^T-`PP`J`Bu#)qoZQ|&cG)sT3e7K918#E7kv!{)d2 z(Cfg+1vH!|mzCZz>79UMG<>tgR4|BGT$DUpSX#oowy=FL0C-hjlnS@a5>gmBRF&)DaQc}~#L_cBMbc){3UJ~UG>rc+N+7`PrFg}64`;8Mq z<;|{>fv&h5+HK`&f{7F#{_U;ao)~SV3R#n*?!xPCFAvm#?zLkY9#24HAz+_lRVE+| z$tnmp=l4EQY0L}b2G%;pJ4MV|H@GCDE#p}qEoGgytIPA?TLCTb592VkYCg_Xz|+VN z&GUhz@h+b*xP}SnZpHlCie{$~o1nkzaQz(PIPI69$aZR~ zayE>~{4D>ajL`3R->i_%|DKcPelbtQhVZ{7J6oWn7nw=1lOM&p6vSvLSd)5@YG+Va zZFD@+7^ts(xm*=|%mqX{>X?xn6i?*+UR9b`{pRmI^!8OxfW3DM-8c7sXAKXQFi}VX z5B1qDwu5PJv(#{bC}C!Bza@<~oE49!YM|CppJKesHpWArtdiKxWoEqi<-Zq!+{|!r z^^)K#yD`h2KDv@S13RnJ>ft|o4u)M&QdTIAv%O8#bkaEcp4%h2VihVb= zEp0vhR}!&gqrRH=fK? z)#Bv0Uayq`DdqcCwxYvA-WYU57;;-IN54WHJt7VqUr)*%^z3p^mu362r->`D#1`&T zZazwX_MNgl-4KFLOn7y|r17kh$yayv?*v_;HK=MH&)Ua(f-8yz*vEW3%NfYY5~H7N zQys$Z4?Dxy4x>>q1q`C;q@c|@wrcv9WccJCH-`m}_qT80n06LO)XY9_-#+;H0&ihV z43zkHmy=r@gvGR4@Dt5Os{ikv;V6;e_~I7S+1>q)=JwF`T*xYKoy6$5Za+F++ikJp z4`$^m-U3P}3WKqm0t2|n6q&&jJ1%&e;{ysGcHE`jcUBoUTG*p*)Z)h|?j6dXV&2qZ3)n{d+$lkti-!X$e0=h-BCgXXlK9K{6PDmRz4=Z2FMtJMGjz89Xa1jzKg$cUznYJpOEN#IV7CiL}g7k z&^!`i?huTmRTG&=NNk+Bu}MGt5)l(&n`9jy;O_fV?#FH!>F;_G_>5s=_{*rk^v7Q{5-VR46P&Nflm>!?^W~VdI6IFUMGJnNJe^c8C8DTZ z?!fr31^+#^Z)$6EQTyC7Wkh81k^l9x@`wyA?N@}ii-PfXiZGhWse8Qh?)GyLR@6V% zW05WZ)W)&YEe4Pj|8cxvM#&XWJ}7afL=V>`#*j@loJY4k`D5(@k*f0py*B?v!WxSe zM!2hgSi&r}xMtBsR)057n#wJFX_;9j@Q(A}xMOTrDm;f8O z1}MZ7$z%Tn)a1+9zkrx5GdKA3G_PLDs_oZN^dJ9@wHWc+SZLA>fXICrJaFb~Ty+qO z3er5lmnPz;fT3R_nObe8afI6wN4otCN=`@NyNskW=A6@0ZNnN%V*0cf^9oeQ1|Ka_ zWk^^rI%*ANGE-u#p*Nxp1sKgY)4ai*p5Hg`_OYv@#}cX4_%tbjXh1;(0wgx2n=lG5 z%Bh)@3F6u@KvbMC!@A6X8R@Q&B`Xptvl=P zy1TS|QZ69i%xC%i7ePRi?;pI(At^}2neI+IOhcTXt8*s+i{t3eY;i6DYf5=6s-32H zshn6(H%=^1h~|i!p!KPT8*o~BOuMmwG)IKWmbKn0kBv4L-UNqk;sw}ffF4&sW!j&0 zuHk#omB8moUjYJ{bZaba&Kx}iu>kXVBmDA|clR@vEjdjn6YH}RubGc@xqYExZ^>8I z7TW$c^C_7LcxbGJs&wS^TMFD}XcOUQ^m&|eFOaU+P~*PCgc(Ues2SfepbdUgxdrb2 zsoI(91@@n{MN<_g76SOL3d22AG_32J27laW&%ZHff^+gyp?rCT(v}kI3CH)grLicn zGg->h1zE7xizm-NIxEO~rjZa#Yi)l@C>7WxBh(Zl7hCS2ryT7$45-jRMX1dZ->ck*Q!lff?8 zuv;v`bnKmfx_h29u=QIy%s?Tbz{LG!vMvCCu598I_h^uXbvcu49Ug*Jc*@1fUS2XB zkjPd2toUQ=W7giz07~zrh7v^qi$Qfflh~81r2^R(8nek9vNmxxu`0XdAV*FQ>0w5m zqWcQauB;xXMiEy2V_k;2rk8fv18vk7hB9NtSN_AdZIcpO#EMLKJ(5|ypT2iwgZgN_ zkpnE`(bXPbVK;Y-4e&bOeK_akqSZu1Vr|Q0)?nKke^eit7v;jgpbBwedqyAPGkTZs zt{CLnk5!?T$x62{7$|jYKRv+yPbOIDf zSy=`6u$HEayE0j?D^{WF4V;6#Rqj%?1Ph~wI4W4H*LGVEEu*S#yyZfiGwoE z2zya}IlHsNxjI;s3fH=i99iZEiOoFv&0|Ljt!wjmKoUt|=Zvxji`*R-I?kR{LG#5% z$a@lXXh4pSw8@}zUWbb^%3O@$Cx;96<2ABL0X5h7dQm}NGvIygK-%}G`Q$|_H+v5M zV%PHVyS{;YAy=Zv4AdV~OVJ{bI8cC=MWOT-DZq(ry&d%hRmU5p%7D$@e2+#aPAF28k0S#NU>#;dXM^$I~f-n=$bh-ksp5bI5WyQ-&Z6e&lgUoD&d%!VDRxg(*X3+gx1wYA4+8}#Z>!bTPr>9^;ca@-p=H=2GM`IgkY~-?zHgby#1COpl+mavKd1K zxJ_n{Dw(&5S8c7YfTb0^=UMg+sC#m(N%G%VQ!e^OOa^Sgykhgb4zvnugw=v*+PJNr zHA3~=o$kPXe?ME^qfhNG@%)QX``5h8!hl30Sy$MUVsuGEj|#I*w8%F`e?FFejwFq5 zH8O1Sv|FESh~I3+er9k_ZMF)$_ix(Yd-5|F!vFt%rvn4z>=QnX2U7m(p!AUGnQ`ir zDwiSUz}7%5@K6-%Li}!$Yl$II@1Exaad7C~l}p{kW02U$qkB)tsd|florbWEBlsB8 zo;GLd78K%cKLp>MojE~tr1?YXr#;B1+`UNOunX&kF5KGL0_BT6& zEyOx^YZpEj$#HfH#&C7yOw$p9n)xcn4DJRe`)^2VP-gsQVPm+V;(1IL?kWMyteaFz zvUH2ZRDF0D7?OETD7K{oP1b0BOV@e@ee~(IdXxFRvvAwoQLv3NvnCH;Lh)*H7dIsiS`>C&CzNsgyTnEYcB)Kl?`Ri1ulr ze^CCUE?H9hz@gAB*XuNMj%LFp{RUghK#EO-0OHKxy7t=A54z;@38Py;p_j*_x3m_4 z#3>zgbb^3J%BN8Ku#$jV9gx4rvHLZ1{J?~~zwKkPbU&SpZJC*Jiiohb0stcbn!qD) zl=$b4vq+Ztv9@6!pIjsqPTn33u$$Nle-{R&iAffSik;=UT%@Saeo1~OcwZ>^q7E%eom4Zh4QSZxl6 zmd}D#zii!&W!Og|#iX@{+N)lTsE1j(EV5@lIP4&s?^x4Pe&O}#!f{x{L5;sn$bJDJl>-<0?~y5G>m#wS-* zz9Pc0LNGFk=P-im(Bpe*9LO(QO5jS(obA=Z!qO*ES>|ha3p&`k^su(Uv(R_Uzn%hz zxyCeX@ zszTxJis;~z_Q1t-wZwMsKFtNC%aSB>OSbUDyAAB549zz`4KOHk$plWwFlZd^HSe4m zDHY=I^_OVPgK8WhQfrGlEk#CFo&lbxydxYSLJ~d%Krkp{bT+IhfK}5)+dAH^W&m~W z0*Zm!51V6W2e}qmY-5G7$G+pV8$cb~k37TM<#)L~>j0P+9eF-r9yYc(AZkp@$C8ko zV_HX0ZQOzT4_o&QUE3UTQG^W+wnm=~a04ubMAvAI3W6eqR!-83_#>gY9MFOYc!c_*g|hHGhk$<#vo^xXs_YXO53SQG^N$V*XnBcV&B=5{L@Q-nd*=NG$6q zUqYn-rT`?6X{WNTTg%kEZCPj6e^U&C%hk9!FY^pd3tSENT`Q)z#yC8J5R2y-0c$wG zs0PpmSYd;YOQG%NpGvvp)Es7`d$46oi##Akli}54w0Ki(S zX9Pdw_o85^{6n^!PWkZz!v<7`AqiqCZ~}R;NZ2+YI%0NxufAOV*txWc3n%c7mlJtY zWW2rj+!gydsK6M(1Hm^{WHw8F>)xrvcqGT{k~UN3z#^L+>7eR8ARXOv`Es{?;gl~W zxr;KziuA<8q1aDyxmMnjMg4x7+Wk4niQwq)Y)D}50n0L%hr*dCc(QGxGT#Py>;D@$R6C3hmK2ZS;~8O zopynG5j#&~Y8I$Lo5M$t*|O}mIOHHPwtqQQ#&)Icid;coFIp|*s!srtLRLl?-BsSS z%Sk>E;5Qj3M$dR;$FrB3)Hxo ziv zAgn!|sNN4*YP`$e-Zuz&am<~3b$JiMkQRE?+A4edpYA1tS24r(5tHu6nnD)XWs?Ub z6=>5=X|^ntlcd;G;f(V7_x1jrgKaT`d)tDwJ)~aG)Pp{AM9@AY$MwW&%7Wx=8QRXr zXXg!wQC@%c0q@?}Uio9?xzY?747Zs3hJ|WgGo)ZYy85!5fpiW;N1 zrcdSq?aucjnTC8esr0)Bzze7d0B)^EXa?J`woxC z;BV2AB?Drwd$UwsK_`84IBNEbvw-J{y8s=6HiDBU7F_uND2!)ndI;0;wv|8>cYOK= z-6xk4Q{2OJU|FmzoKt1B-LGWj=1|gO9~&BwG1R&nAoE4S% zL3tY;!wmw*f)V5vc|CzOzQbkxq&)tH@64VW~7DCZ8L z5q~NzWRI*9xLKIK&_Tc)G(!aPuLgY=x7&|nZ0e<-GBbbLPsKJ@u`3FFvSsYV z_8e4xUbgezaSsW^JYM0#X8nd#wBXk-G2S*)zRDZH4L_&xgUbY0?75E8P16Er064SI z88Wh(@E>0&5&P+gzwYX(9^$xz6S+Xi{ps82WME3yZcC)8YoN$lb?L98>&S%g>8iG? zAAnsU82wgCQF4Qs#bIGpRR=Tj-QM?bCB@?P>ya9nL3+iq(Sy^8@VAx%H$=(HkXtD0 z;0ycI??LW4E1wiKb9)USI}8jh3>H?;IR;k4q86ZGQJivR)q~f|&Z*AzJ8Sp@EGH0- z&l6U>s4TBvfB(rvEr0uM-m7#K6ZgFMdJ3bR7w@Vz{K5H$>DHf044b5m&n#&y$&Bzw zr5+1+5ANF&$wV7%LNa_f2*<#F#P2Nn-`)ajW`DM4%Cl0hjuZiR*5|+{WJQAHi|O0j z-XZ!-e7>h!FX!36;+`6gbYhnw%Lx4WJRx(61dIg|e`c2o9vjjA?!~6&LCz$@59eVj zPG%Xu>V=FjY25nN#(yLmUhAP+r{T%my3Q{u~Q7&X) z{w5#kY5HC@uu~ zlGb6--dL6caX3%Gu7z8{6S#m%K6xI^@k@NVOeMk}?Is11Qq2|crY%nqzI{V!vUHP` z!jc6{3KFzevar-+*zg zz4A|TUX|0&8#~*TLtI@foutro_?mQBK|4AqNn|NtJQ!DnU+kfPgp1v)8!lCC=6dQ9 zM9z2U2sw9jP`$7=xlbzlukA{HP0Yjj*$)}!U9YQuAInTXS<&h5$OWJ2*m&Hk&F2q7 zxHFC&iReBCo`rfY%J$M_ixoN~W9T^F#O8KTjAM` z`TjvUTw?<*2=TO1+mgVZ4~oL2h-;LX3T^^C@RD+c60@%~y$<>@@ZKG0 zIYQF)06os&Vk}J?0sEWCb$GC7A$y>wc)1p5Ld?6`zr>J1C2y0b+KY_I8oZYOUgo#^ zkklXlM`{7i1Ce*NQee{?^`}&u{aIEb-DvKg*x2$70>st}G@A3o+(}?F$a5LG<`o7m?oG$zC*To0zcUtZqC=F%VNmR z7(u$a-6xx8`g5J`Cg9k(K5Ud~#N2U??8>W6-22O7Q+m}t_e|pHZ{4?NpSlo0UHQ(; zP-_$|_eZit1!m``ZyzZ}xxSv%%0_1KE?mA6^izyn{gEg>!6JG$_b#3FFzN$Ma6yu9 zieAalt6Fl}W5xQmcOdnll^NdZFCjhm?2r3A|3wUcnv3olWaHiZEBa-iotogeOWqMh z7~vfmViWS)sLuN@?+pIvK1$YQrylIrAn!*LJ=v8SrkO}fytmlrhu`fStmUQ;kiV{b zxgz$2RI`uqjWv8kMjfPyV$8k6OrL#+#P6b~1LZZ)#_DIGW6$}mB>)e3iG%p4;^^RA z;+8)6hSR*ElZ5HR<91#?taTSQDVUBAJEBTw9=O8Ad|=Khopf@vSA=zM2#l^&@3y-l zXq+Yuufo=H+s@}~cCj`Uw~nwj0o$5@0f(`rNN9SZ8>JuR5|)(8Z*tqFyokpj;?=<>=T4-7%ge^LwTgsNg@-m2h9t<_JtMGqDV zhV5AApSKLmBQ2ZVtWTDz=PYZGcww@y{yMuBPq&dY}ovQc;;NV8>>I>45W)N&|{CzY5n& zSU(RQkh@HW9(C&|^PJQ)Av3Kp%l z-_*)qeQ~}&f6aD18tD5_p^!8rtZX~FbX_jtFCT$L=w;(_%2m+Kbea?WLBwsrv&RVo zL_rO-WD$|25!I{w?(q3IZM1)!Slm(W*Tq&pqIBNyYDnwX!Bhili7|wQYc{#M5Y+CW zoDN+oKvJY(#*==oxaT?lDG`q@s5Ta!ChB+ElF5cp=o{&U54>tE-es;%mAOiueBqTU0V z%{T7$R-!CV)tE=@|8Q!LYx9RCa~rNln27WN1=mA@^nbgmp~8^CFo&-2e%HFinedU| z@z3onzKq&ito@@Z9t?&D#zosB*1rPNGEJrhqSZ z*mR1W+mdWtZwjMp>cvVsmmMwQflO%vD2XoZNysZ@x7U_6f&KA2>d*2T9dyp05oOo+ z)g(HpEKWXj)(705C`Jqh zKN7C}_723T_wX5K1$n8RztD~NEv%g;#ZFp55I`4T{0km%%I;;yPf^>O+Faya`)k$Z zmV9doQ2(ccN4KtXl$Jd-{;b=R$`?K%c;pGDn^>ky@ic*+$Pd)mhXjF5KnRnN9-X%` z$%7gj+1-l&TteE)LFH_^vjXd;UmD$yO%V3imGu99ysUjnem#BgnCgYFmoP6yS+(zD zAime}XlrO&`W_8G6xDG{1|+K}-JDsQ_WH8obk<(iFBEnNVY(+XNBN0 zXz1J2@v>IR6-CTqRm$y~r%zev4 zRtVfMu342Y%kj%eEj+KVEE{|y_HL)>p@ymedx8u$&mQ{ekaRT-nt;9~v8*;=RA@W2 z{yjS7f6@bz$Ee<@_6V>5Bx4o+Lli-@rGrbpy?DP$80L{ch59`ED@W6lgXLf7LBD$J zY%ysUG$z1&e||2f^Njt4_ZyEBdN#kugbs*F)!B{x!bNralYlnS7RFU{MaZN1gEQ&x zL+%@2x#vT&cJXK_j-R-)S)3Xa12kQ1g7YO!9#DYjvy;E*`j8DDb7UvRjth_ROSt9l zA#c)#)P46Z7>)pAx0YoY)t)FnxoVCdp(A0b=F^+gmGN?NH)L0$2Sc`yAcol8TjA>5JF3{xN}I~ zTYOG%jcPS+wG4AEX=LogzXe?;`_5VmF*Ek-Eh6NXl;cYf0$)0ps z+$AbO61j0K@(D#+s;VwAOfI|rF4z&Foj>PBhsOpV*AJtVqc(nO2vE(*j zXW@tJNw7v}W3|&cE%KHde5o~1MrVU5lZDmt+tbBFFs>(rlP`$n**IJmY-kM*v4XZ) zgO{3?XP!?+oU0u$BOPD&Y-J_!SbP@=*?)QamvAt7iTi|`hgxI?@_-Rm!~~nh!4D9{ z_vi{DWR=JjvDK^8ClzU1e^6+t9yd)iB?p&e^x5%-&$esU*AV`rX8Cg7H z(AP-iGTgkYHD0QFrK^X}{_MYTAGel#9qk#}CxAOjxuleCH^EKt7-lxK58~6bX@7E> z^#q8fkaEN85XJlK)NgIkvZ!8H7xP;n`TIf5et`biG(LrV77CToU&H>8GlO1MnXuo} z8n6=Z>r<&v`k)2mi3H_kj{sqvAa4$mRn?m7MSWcUS1qRITfyd{;bW_8 z{6U*u(_EJ&*Y|@q+5IZ`HhTZ1HeW}uW))xUpI-+AX8`=*SAAdJzAn_}vN=TgaL#}t z>Q4dO`V2!3^g)$7cwqj$ASI4{)$F&|X;2Nd!bU3C-wHfVWBRQ4lP-yLKbyn;{^ZX- zpje(W4wg}rAqhCS{FyS8DSq+nXHGQN)QW6oHp{=t5QbEq z(!VQ@FU(`$xXO#!0Ji6wAh$$2@jyH3pWalxqb-jWc%3L~C$N$tutAo)CiL2k>kLfO z5h=C)KGM}|y%pHu-SE(C{XI3lT{zJ6F86+(RsHZ7G1U7`e_iI85M7kP9ct2(-tN$) z@!J)sP6c!smJP@nN?+`0&gs0B zp+K1_qDOt?$=ljR7zo=@%Vy#LN%>r#+}9i!+sB4~CiHk_J^`I@T_hJs7~;9C)_1wj z7I%`9O4C}1%j|%A>AvLUkXROB?z4oa@`oZf`5g!@S4qgM9>%w4JgPy-yrw!n2>bqBnFA_j$;fu=u?i#u-Jn&(oIv5J>H zSaA;wHxi@$os-Nf!N}ewl*%jd^#hITbtZy??d*Xi(EG2FC_Ll}=Q|`gDuNK)8ybH1 zbvGroWPhc=q32PO7>-U?Ts3$Bxz6b>7TqMO>|#}ZMHA^@APig*?JBgSzdC>Z@3Ru3 zkbi^J_(%?JXal$>Mp-fkBL-?4S)Lx{;Cca^b+j>oTFM&0j3vlrx5euia>5LIpYyM3 zvKJvgd-ftz~gcTY%sSL*^hK&G&_G7$w*><4+IM^$*gaDVubB&Pa*an z|H!eS<2HRPZii8&^xc(pn&0+1(+y83Fdjq>)pg!og20By$EOK`q2a$`PBj)TG`4Vq z$;(lgl)X!yMsP{z#+tbF{QRt+v}X)o=Mp|q`U5~7e$YfonW*EP+j$p7z0{fy)X}Wu zaw~|FD7>?CTt{D%6^7I4HT0j8NP&Q9TfpOE#KgT3__X3^FsmgJ$*243rDa)fMdBU( zF4%~2PLwUHDK@&X;%CBmG94mnVK)IiSh>owl+^ebn*L6Nir9N1ea6ogt4?l)XGBFm z&AJZAG1s9m7ko@DpO4h|_5HXi9QpPKEn5BMlg77&Ua}jeMAwN3`*@70E!8x^7RcG- z3*P?(ikHeY*)9LA6iI3(-A&OU4OkyYB+*fjDXbNUtCysQ|DCRfG7FYh%;9!FM=1W{AA@18cmYLcerjtAk%#^djRZKIB*X! z&@z=D)4aV{_QX?XYp>vPejcWMU|WPt@S1jhHK+4vlLG7OhW+WH=*q-^^|Ay7eOCK^ zUo!`39FF`XlT0BKc|0cp3>ctCpTo^kh+Nd447OLGYW#`xZ9&G59$xAm5S6%T3 z{!{`>1u=OTY^a~p@YLrSRTP+Y<{O}<(As@}MrRgQFogBaYoJd?;cJUmP+NUF6RFlyfP_&9KVz_X zFqnb$RJ0M3siKM^@c=d##-IkLYZ6ys`gj2y#Gm+?oRN+S9?tLIP9L;}b-3L^vB`Un zgG&)5oW!1iwflhwXOq%rvL{kJ50C(r5?_C>!;svCf+M;-WCrFKqd9pJ02fm$b_2$3W9 zuX3#WnH9=ngf0;7lPXz}v8Bs%VE-}%@YMDL!0W&$So&UX!-Mm-EBLzzE#-NPsa=v% zj~?=IG+3}VU(i*wFS8QBvs4@vlr-;RvlZq(+=5YynS@wXc;avIyR%BO-zX^y{Tu#o zn(`}UlQ~6nffGHpk0=M^0R*wT@3^%{%Iw)*KIn`+bWBTfGpwHBdJ7Qs2^-mEo2uT^ z%X>~QUFTmr*8nVboO%|w?G&QPc)l)&(;`~>;U=TB^zRfh9vU9nMrDGtx)T#l5V%U7jcB^l|DTrdmIuMae$OJGNng|%5j zZ4e*eer=K4mApoUJ!KDFLpO5GyO$NH850<*$q8F$Tvv#8)&l!$0nUv1R{y8?1i_Sl zaDJ|F$!)lnk$kT&P@kSQ(k&>MDP3Bw0Q)wo3kEu~aq)8@2Ux4*xL!kTr^0^V(*U%) zZ(6;ldI@)pl`(-?&^ist$ZOVsFGq6*6D?B#g?cyEO`0zZ$(YhkVyN`?nXp+FFTAYlip}Rz2irrVH|-g@Qyo`10aG-suj4 z%;M^uAtTEdVQW%u!5hxEJw6lywdFHp1?GiWDWa^ zwC$tI(~W0Fw7lP(l?1ojuW&Sq-&bRNXMC0TxADM32bH=A01OoveWn{2OVfasr{iVc z6{KdFQi?+cVv($jBg+qX`OY>kimp+_aXwkji!cs}bNYVu zc(_P+hNquCrroJz>9J{6Na`nie!r^@DXcrx<`S-fTYDD!iZ$#d|A8JEIu)qA+ou=A zBTjm>4+;u9-!2KPlKfTKIkK>BsNaP(lN(QcV#)J9iWY?EYHi*NkcD-NONVV|b8YWG zxA+#XBe(u2gNA&GHK&dKl;4%IF=;`U?fIJ=AlHcEj_s+>R&W^mZ(RXGIWrqs7! zKa9P=!qV~!D`N3Xh*vbdIg|oj*Pgn{bm#P)rE{TDSj|JMsVYyOU-bj?(wI}x_MR`> zi*GMGb5@D-a5O@pDf@R-79z2+Xr840 zTs|uQ5{3VAu=^~pS08}9MnND8MZq(Qnh>c6PwQ19e*75!VXG5q)l3H#)v*$RNY#gE zeZL{-8Sxd2{84@f#hGHkC1+|X`GT>>Q5}B%utvX(T}7Bn6p-?u zu(K~>yk8_@^%MnZ`Hctyg5)^Qtwh=#_~`U}eP{d`q~3U5>GK}UYU`Pl^%Pgn^K5zL z;O!@5LS>=P_a~dMcni~nfUYZYrXQ=d%W8*|uZph&8JETWtF*^*00tbTnJR%GG$5Px z8*XEi?&BHdQ$C9ZK?Wrsc?ZSIU);`CprDdj_l=VMum$pe6gjsfAl=^6(Fz8d>Rz)h z6?Hg;h8oC;m(aVRGV=ox=UaD9kr9@kWYY38Ie%>1TBRQ3&5d7YV$Nf)I=ussnXXdtTX z8?g6Z@FYpTjyFB1P*teojSf@44`H>4P3%eHzZlk4s>jhIbKL!V?JxV5G($c<`Ws!N zd1-sJ(;eL#axD?PR)ldJAHk_!KqbBvsc)e=iH!<+t01VK0&(-)BJch1kk?1L{+^~K zp<`#%yAPL^7rtgQDk#4@6AXH}#YR?_=p|(LRc3L1ZYT2|Ppz1&QDcR-CC(q0aMXv# zV?!mxs~WLpx1m{gqVnM5lnp)Sxk^yL7~RtXu1GNv4CN?A&=$3)FtS^u3?}AGwiuQ_ ztbz%P(04G4WOf%gV$6i6jry)VK3cGztD>)77dW={y6|1iX!>ixn7(oyqAz*NcHCp+;_1bMaZl01M3;yra@NjTM#P?N4`^c7p z80fhuaOcTF|CYu!aQ3~#Q4-SSANbru&zOlppXcbl>E2s*_WiC-lSA@{EgjEFb?aYy zJ&W5ApbwA#KC2)(3&c$|K#=?J>klK-VBY$P#gxW&2%a zel)fV3Mr&EYUCb?a;B@vp64`oAUk`U`z<*zD3;J(zG~62R zzAgG9%A%Rel2Rj`V(j;p_%QXVfUI|qc6N`8Xo95FgMA&LkCiYR^qv#maxc5V-Z96e zd;cD(if0kKoQrVQ&#SX7?kjugZP}=%k}Z|r#igW~fiV;%o)6idU)IJx%rcDZ4Z_ET zR584*!KkpT+mbj!iqSWoY}qS04L^POT)RB3rr>_Jk2Jyx{o3&TYJs?n+6@PNo<}$c z)kXabp~r9RZ(x53vxelc&FooE{Z-uWV&gpr^Iq$79LE&&oE|PNt+JjNh2_y&R1Ok_ zeG|KxV<1S8U5RVA4wBlkP1CbNA>&YgEU0-$o! zKTuSAj~$3Uja)w};$QLjk{h2{GQYl)C*tR1c{r>cy_v7aI$^79B4D& zWIhQ!R}SEtof9Ig=c+m80Id3Ym#dS`{|OMx{!f5ld5NmqKQEqMBJ%; zJxJ}GaUH(ICw{7)AU<)U7+s9#nfL+mHaq`<$lSaX&Pdo`(s*)HE) zk?kg*alALBO0qrui~iht8_gPA+y>cAzlZ|T4lhigpRr@dI{I1NJK)UB-E5t^D-sf& zIh;HiicMvfpf;0O3JDjc{IQQ2;nX_kx(^K0g8scz694jpCWWSeZA*fkiEGEi>xo*W znTm6yuZI-~*Xi}GrBoNWdr_>aX%+Nlbz*l}L25fWVMi2e%<^yYx^T^&62pa*zKweUQJsTBfi=j`lM_XIw{{9Wo9kjT;#)qM?}I zrZ(%*J45W>5D(P^Yl!YYCtsaD>535I4=N*EZ%M?YGOCqBdx(4)hsH_5DO^{ACIipi zjVRinUnVXt(H(unjB+Y`+%v5szjRE~{TeEAw%$pKYd-kw!)Glrq1V&l-Ac9S59}4_ zRYm(9cq;*FM#s5}>eA`(AD`H{`9XPkDt#UxTf_ihlyq=1Z76a+7U?V)Dbrmf_6pBd zLtjppMGiW2NB-DA>Gl5?dKzHw`*QCJa<7K#r1s};2+s+Ao_buDAhqFD^wbn6uwWoY zmq|t>6+*5B?B{FDof&&-()XLy#`^K%CcC`kTo%Yc>oL4@jc;J_A^OAO5hKdvB~E-) zZ8swIB!zS;Y=rRMO)xkkN-js~bn6V}|7N*{>g+R>@|Hd3N5(QdgY8Uw7sCgn&!%uj zUvlknywRHyEgP|rgHeJ(c600|Fz(<%z2H2Es zuzG&wedom#V1%1k>JA+7QZ1+&|PCcV2UP9V@z>z%5{`+3#B?_z|?#@_awnBzgi^1@sh?pfx7Y8 zXoQzn46g)BQ|>7XR&IOwvC8m1s6>$S>_!Mdh@?IJ#{+M*KJB~Z9^jdDz)Gd(s3*6J z!=gLq-UyE+wRle4YxhCN`_I=?(g32%?FH)R0n`5Nx(mHw1xqU}W2F$}Dk;W3Z`^P7 zZ)3pxz4!DBD{!Z0&2*og(xdo+p@NRIMK47R5)uE2Eu1@U zG~@BmLp|)W*lOQf#$j#k)B4~x@NaTSuTFK{{TMXPvrA=Q^N#@#(> zFJpb!E^pLz7d;_Fe}<+}1s8F7Xo-`K+?_>=u{(<`g7qxiMmsrS7Uio3(n%VFz{%20 zD2;L`+R&*VSS6a8e>`!Bo1$JROZFe(oDkfx)WK3}YrTkXH7ht5`?37vkYdhRv;1Ja z_15~kWSa8Y&=okx+MpZrq>7B*C1S;`eFW}qn&%Vwyr6q)3#tK^aV>Aic=ZCnN})); zr1X3F`?vA?x(0=t^qABwh}G1Lds!F7A};7Z#k1waBO9xCUncW#{pHGG<`2@0N-o@U6sj6vYkRV2(5{MZ}I1+=g{W?lehkxM{cpxy`KYVp^dY z5ff?)1_j!GunbNsth0uuQ-GdQc?^GCU%y__YC{Wqmfj|j7TpAo;#l881qG=@WS>(s zG^%+K(PuSM#^HM5a_)Za1q>HlS63m-^OESk@-QC|pPD&>~ZI!6- zh8i6$DUggX2&6?nf_heS<^JY)O(J9b;2x>&uvRaqFwFBvf%l+rb*nfq)-tv8bt;Jk z*H7wKV{=vm+gL0BH(ftF{1PYefjO93McSDd-@58aZf{RcslgISh7epTy9f)d!S@2& zG`kIv=b!pC2PIQlMkG&@iA(4Uo5@8S8)cqpeNA;UyjA;i;7#P_3zB79O^7`tnQ&s*07?63tJq&L9l>wW)WDQ>Iy}LlryH*EmX%8B* zicduvk1jmgSe)sfY%D)==NFapqy9jT`W7|F!gFGu!J;#0wDp_VHtTwN_G5NuQS;ln zuE&JefOP!bp=OdI?f!%wQm!XK6jlquO<=#!Q9cySDd+DYBjbcqF zS%Jywp_mNSgO^}qr>&({jN4+zzQ(5Sdng-S`dEEtMlzLGwxs=tMF$UpoBCgJucyXs zFkN&rUXsWG6sSr^im)(}(BzU76e;RpgBj{`e_1!`e?&1m;Z{Ht;iylqW0k^4`#A7H zc2$NPEH0+r61UQWYB-bgVKn@|bFu^}MW1DMlozP0Kb1+WzDi@xV5dRyJx^B(zuo6P z>S;8XdGM;q>jP8amWF)n)-uiBAPHvbjLhoeWXkWHm&s!Osr+5I*=aq%T10CE`oCivbzk zw`VuS+*=u?CPHXPZ%L)qC~%lr1eNaf04;{eP^Hh2l93vrfrN#JA>91~wDcKm=e&-3 zIu1R$ifnq$`D#sf%Nz|h)Br6dgjP1ETY~9vIrmQ9HTi~V=Ac;!IGkEaQ2VN`+BrRC z$i+5gHi&~=Sy-XmjP%W5?$$O#Bp<^5KUE<~iYCDg!)VCoqG()njtMwmb(nXXqxf)` zq)Wfko$k`0^Y0ZWL)Nz$Z*h0b3N<^?kWU_NJH8+u; zCSCt}?-t1fOqC^^Y3|7rw`<*?hBbdRAp4K zn#;;Sn52YX*+cuvM%mK!H?--`Nr1<21I`xt5YKUvd<8@UE@iz74rWMSni zZcq@chyf-O{RH}KX({}zHnYASQg+r-jl}Z zy`(X(4JKn?PRs3J5lq_aXs}MV&YBZN&6tsMudD3!06b<*Mnx%X`q#Vn)E=Gi-e78z zcFpxd>Ldsycw^k}{;w|f$%F&HT zx_n1`0c|YOQ;>3@D6(uX_%2`xx8+Wz~H0bvrF= z`lxBrJ20ld^;yN*(n=mEkZ}kzU;f`5!dGOT;n<;gkR<}yeMY|b%v~+x)o$2mRr?es zjz@Y6@D={oqmcTa>y+KkRoN&n5#Oe_*>qWZ$ud&RGp&$=)Sy6(fB-w1v&)>1U9JM{ zgWCHn9LLjPUznLfNpS`$v#lfcybJRSsx&Vg$uip#t;Z4eUre{9sI&g~=FFc3Nqb(3 z(dbOW$S<;g+cXZYww>bJKoBX-9zWS~I?p?IXte0U4i^FC>^wi@4&QX!i~A#X5(`{^ zS&>}qicPhen(s-arH4bdd!HWZ{rTALB)hq8k*-Ci*|j_6!6I5MZl-U5c$Mj%_~6dS zgK|58yAn%iFhy&kz+dI11Wol30ky#r#^R9&E`i|3;-7B4e*bio%0Bg}xwNjh1}990 zq}m7hZobdr_z1*qqg9?nQfr1cfw}UkB9cMn3p*E%`-~YuKpE2^W zR9{JJGH1{A-n7@GmDW`P6iP6BP09P_81Ik}T-KM@E{gM3Z8vDV`5}WDxgPG?;5)LL z|BdM5&YQ3$3+>HRt;|e5Q@Vx}HGz-eKqa2>DnLYf`15oEN+E4xsJYV-8!z(VBVn&e zO}))CrXmKbS=2UUFwo%})J9+R^=NCuX$p0it>EMcIGfc?<`g?gt>1W?JkCPgK~EZ|l@ zrQisU7f<8Wb^_+)lP;YP6jkqUTQk~Vll`;~?nZ7t6L|q=R2a!wYl$%=W&QKWlMdK* z>B;LDu=(Sdg2>mo3cE$Y;6D6pNc(I@>`U{bbgg&dp9Jd03OCo% zzCZBPBh69Q|KRy~wD8g9)XzXyy&r`X(ys&(iUFoWXFPQp+gG>)g4-Z7r$K*%XgJu9 z%v`27^+h&Rh=?=A=P_P5N`NUv`l{hgb%4rk02X4z^ny+w5dtRm!hL=Z@qdROKI1?E zW@`KQ&9g_&8dDoRQlH_+3a*<^W%a*A8*F+rD)cD)f7)sgwWl!y-$$%mi! zRp7Xyu3UAI{Y)4;*BP7V4`pRUugX@WueR9KTf*Mvefa29-o(0jqTRmhORvo`k=1pR zBN?nkhpkv^kD(Tnm-2dvbZHj^gunWP!uyTwbv^Jau)j9=@K+PL7T;vTdzz{{jOG=E z%2SG@0-KKn%|xlG_yfPT75&^EsCvr0kgU#QnKj}mYzxT)_f}G z{f5~mHxc*bhKr{=2r?GsnWcG$)bV6(vYAjeDzXQ;$wn^bnzot|k+Jpc8;Z2il;3~k z57KzWM731z9gj3(Ov2Jm)CW%!dfH~K4$nFqz%&ECE)i3OS)77$0ppR;{_h~?JTVuwKEvETb!C*H_?$yV|(9{$7y;3`sQUV5nOzd{!3l(Vv=?^xxN z&DTW;JL-b8bIIrdQ#@v$a^C*(peDpyNr+U9HTR0fQRB1B&hi>Fv#sSFPt<90g1Tx zxT%w%GOvcla@lU1+6D%t#bn@mmS$=U8F96~5%o^(2OxZ}Uj#hqIg>+jCIp%syX=gi zoj)nuHTP%XDIB&0VV*|(!-YbC@3bNeK5RnR17W53fE}^OG@LrTX=nDGn~h@bJL}%2 z0$`a#B~^c#=|UMAQ)r%{Xn=K=BEQ;wdb?<`ii5o%Zaw>3&^9;^PcuW4_I%vu19s$5V-mL+ILecsr3Vei zX`~vkWPB|k89Dk+tVQ!lZAF-R~tD?LLKcty4VS$ z6b9FA&PMvry-o9XZ*u8G`j%Tm#5H#`r`byJ^KM+dRI)Sv*3iFj8e8dC`eQFTzIx_yYf(&8=r&EIr(&F^?xI3@mU8D;#6qe!{GsM)-He{W8AwhINWmg zBxW-we(>U)6ITA)io~9}DeH7TI<50>P(}ywRe&%|?7MGeNLF$ebAMw#a)kkB%AmUs zEI1o}M1`VMYq)N_+=NJZWES4HO4iPLEFnnw8OWQ#*FIhY%sRUOoX;ZP;$v>avNP6= zmwBflVkTlHpomt&3!dG%;13E#6yJ}KuEtwy)xOcaCkTQ>svVU1NjW`RpMy*38M)3` zJVh?c@k6$u`)Ya@8fq^ywX*_tjnm@Eg4ML==(iQREXQPq(N7o^P=d*~@_po2(r(} z_(-bb_?cAlwmyy9&%)C}&PlSL$s|RK*(5re2638AJEndh>3Pxr)|hi%HF#mtJ*w~G zSwQ80F$c7@#E@YK_Gd6>R|J0i$dlo(sb}_R%(v45-*!q^9;5lv?~}xB_^+k9K3$%` z&xGF3TdOPJmjzO50A`K&y7v3vv+tj%b$W>0o{~i}ogw{LVM}#;o-&tquaOrl7fzu9 zMYgTjahxvwY3S|6xA{nyyeY_6@5|vH;ozqCgU@^`e)y7!vu_jIhq&RV3to(Z1_&u>*NfSQmB*x)AA ztJGh@sBTDH=T6(u2Y*Kf!pV()Yeeug34WeR{d2QnC`-ljOVc zhPX$OT4_uBdHvrPKhc80{=zz>iH_7WUJ`=}VP}}OGcP)y8^#9x)}A z?U1Zh!>=cq^(OPHD3`6AwbUKDe38t|<}S9~u~Q#}79-`W^PcVgxPQNf;{FvbTN3C* z@ucWg&+;@25z{*T&D7hLHLVkuYcN58)Ed#WFx(d6lqRdJ=v}WQdu@idg6>duOD%*t z@oxjEf`HWP+n#Nbu1bLVC?afU`HD6NKz%JmG?o)7QCG|}FkXnw$^>WC6;ef_F-IA5 zKPI6xTL8u1lgqeFF~nOFyt|Bo_&t--sxuK>-?RF zK<{95wcpAI;kYC+X858~@$KyAeDqo-&^X?iCV58fZsx|fIDx(tqGROd-qWG_dIxCe z%MLUiyNoE@fJW{CF>Z38{qauJ%eMBGr-WNab}GMkQC|x+0^5%YP_efU)?E2KanHY$ znc>|izuzX*Eyc#K4aGb~9>jNZ+xfUhvYdo-ztfn1b#&WVeY-FD6%X659N~4(R=E^& z=WF&o(snuW&k}YXE;`@-jh3xj<@$L^L*uMvI)KDsXcb{5m!~rUZsLL;^A57UN0Hos z)WsxjgcD7mEHa|4md<;9dmBwd&=;0GWPtI8JtG;^qck=C)```ay?y~k7Xe$ z`&Fex-M()38cVLIF6b_!#v2uEWi5%LfR#m@BhL}-FfPOl3NP@g-d(GY8gNZ|)BD45 z^RtpxX0N2#)cTrI>C#eDo3y3DXDgqw1GtQ~_%?l1^9MDwK6LwCXK2;rLMdX*=_0Eu zKIZwvH^-bdPm%dxnGL>;)M8XYQ2TD$@G+8k*C@B}8?cc5$!x0ZvMPItsn8s+7tr|Z zcB1%GO`WSV2Qz_Y1D3Urf^$ly=hy#E64Bo`Fs3^gsciT^2;A9^^J=})I78|e#}V=Q zMqkvSY_Ea@&g+3kz1bCHwIpoStK=KH58W%V#MP368SXXtiF-n@v-^P8QW9Je{1Q@v zx`pE2PuE?=7aokLCgE%Sp$mH<4U6}?zz6dDi*v2J6IPCDkol51V(8Joxe;g$^+*@Y zravC{a*;H&Nvvh9rKCE_Vfb>jGD;`%vs}*2%OyY50oEP!X93RHLFr*A7PTQrP&(=x z3qgOzsjY@%*Pi_j`>!yqH#dCLwbVxTfG5}AebQ%X-G1H!!%{CWfO+Mik=1=3Ie+Nj zKYx#YJiy;u`p*!Z*ui$ohINba!qaB6?cSGoJFYtl1ru%!N4P*t!Nn-QjK@%kH@8<`N41`Z-w?OECu8oMy^y=Z^2g12O7x*sf+%$LLE$(EC%!g9 z6`iwYW8d_NeYt>aR(BBd1w(tRT<007+~-k4+cxsMdpgq8)Yzt$=1UiHJDjMY`YUpg zf0Y!89A8*1_7!abnCfo|#4fTzS|aa#jv+QW%2}s5=3a;jrR5bO8wWRFCWbJkCY_{i zZaN#8ysEBTz0;zD=60~V|Nm^_s#+R3wKq|CPHDq8a{-|bECCUQ9up$|r;uui>*xL@ zJD;#0&~lyQlYMr&-($=Z{d>ABo-lsW-5ohL%?GK>N-Z(S2-?1S5WlsTBPLdgc zs1^t+WD$A)@dxA%N5@guhn31xn3pY?q1PWWxxx>f&Kw5Izu2a;hP_@p4{67+@7-q5 ze9U*wGXONr?}sf|Q8AD@UzqHAb`U)Y`*z#ViaKccTjzv-U*rz!P(*?_oz|=tJpwxyd1yRHHc&EaP%Pi zqVxif!OC0Xi$Z|wOY5#v)zR#oZTL>+d~9)y5T@DYQbceu=3K1WP1%XOdb~JvE$X_1 zu~QB8=qey2qU@3xyC!1twzhnKIy6Sx??(O#-{FtWX-}HfDn0pqDfLqdPa03!h%3U# zn_aboqtsmuXeb3vo+q{I?}gZI2D~)f`1Mvx>^{d9*)iun-+S&kIq9ekzr1#RUUphm zRMCr^kkFXFG7Ad(JfT^ahJ>QaEU(}0fB#W(H?HR!XTa7eSM$_e5EbptT`B+G-@I<5 zTK=#{oZia2(3yCOp2mb%3_na-Gl((WdSITFJU_3F@|4zlbNTdRIq{X%$V2W4hk{*h zu;X3AyrazgJvcL~mr6pjMQ!`wL^Q*BQsiTiyw=^aS($g|wnRrF=sKgh8iAO5NwXUb zYliM=x`&aZr)dcjF4?uXNbW4iM+cA$ZsWgRc%#uoIbju4vA0nip*%pNsDF(EJ-siWUsB z54qtdl(5pyQ~@`m??{~gS6t79ZL~aH+Z_n;ygai+K}I@)vZkC^Po=xG=@${-+d{XqN?~4rw@WYlw`NrcE zE1w29nNAxh@xbp!j9Bvesm;-(wFr5{)rFF4Y@`GiSCREl0sc(`o0uPjq*2hH7Qb zy_KtbS6}j_Vg6)8=J{ca?NOq6X2umz_oMmPQ*((EfVMAZJK6^UJ(qsW86KTyVB@gc zZ-QDj7ha$JpFhFXZ?!`(K`okBQC~P$`}&D?i(~-bw+3)2$L>kU+1R>W>*;($Jguy%XTMm; zwdaq7%ld|h)=cYsnZ>{@+S>AW2E7+V?d(PmMgzyW6oR9Y&ttIJ<0yKt^Ezl5>ywdL*xp=KK{V%#b*Tmg4sOSQR;E2L&d~h{KPUf|7ls#i`;+QwZyy0h(&{H0Ty*&_){O-qMGjMA0A%~#(4HN& z!nzIFQNWjDTCV=k`|ct22`%|6Y0~@oFKmpf@})Ve{`XMor}AJSfb>jaO}fP3#6`?! zB&rU*C(3%2NP2ti-+LhlmkK;Q+UJo@v#`PV{WqW2;3FMBEBEE)UopYzDTmB2a6Zo6 z1+BYwFW@(COB)838(K!+{P(2*c+Z;s_-(lI%>>XzT=BVfen~s;K0rGLhl2h(%~ad> zR6MVFE!z-g`6Q|$t#W@M(olQ#xB8{e>i{VFHT1qTS^{k<0D&GI;Z)EQge$eMBRC-@ zJnH`jlnLs;(c`;yDo=p(bwII$?Y*9dgiAD`54*00Uq7Dv-v|7^;b(%n{99+eOu!NidA=dYtLe(%ovzBWb`nvp1=6&An%ZSQF;++T=PHT^Audwo*Ll|GV(HIEm zBL>d|oWh?c8kmPB0_1Dk`-aZOz;8b6E6FiiUWfuuira|h5s3*Y|sw{s{v zX9qjjLBKZ?l)b-$4=w8H&%c?V?ERYy?EP9O`&^^o`@UoN4*2#z@rb`eAM_nP7ryyV z^!huJX%70#cl>9*{jGnZ&m_>XZ+%EHSlckVNj?z_D|?>^Gs+vj#axXayr_ucN!JMT2y6&_au=cFh*X9qjj z!47t?gB|SP#^Ejj{!$CPU-r31;eYS0J3sF37CwI0&l>Kw-_rYc-R183xSs#4@N;@D z-2JmaTrQvi&-{$r zCF~bQ@A?^cq;jqHUIzs07*qoM6N<$g6?3P Ax&QzG literal 34870 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 From 40856a35cd6aa5970b11e14b514efa0b4da11e44 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Wed, 19 Aug 2020 14:53:01 +0800 Subject: [PATCH 13/26] upload doc img --- docs/images/eventmesh-define.png | Bin 23415 -> 19431 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/eventmesh-define.png b/docs/images/eventmesh-define.png index 496b0f3f7d0e1610816314fb889fe2b58a43c49e..0f28170127806d796606db8d8e32d51431256dea 100644 GIT binary patch literal 19431 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 literal 23415 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 Date: Wed, 19 Aug 2020 15:13:37 +0800 Subject: [PATCH 14/26] remove logback spelling --- build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 6850993d8e..bddbceba1f 100644 --- a/build.gradle +++ b/build.gradle @@ -177,7 +177,7 @@ subprojects { ] - List logback = [ + List log = [ "org.slf4j:slf4j-api:1.7.30" ] @@ -205,9 +205,9 @@ subprojects { ] dependencies { - compile apache_commons, guava, logback, fastjson, common_io - testCompile apache_commons, guava, logback, fastjson, common_io, junit, assertj, mock - runtime apache_commons, guava, logback, fastjson, common_io + compile apache_commons, guava, log, fastjson, common_io + testCompile apache_commons, guava, log, fastjson, common_io, junit, assertj, mock + runtime apache_commons, guava, log, fastjson, common_io } jar { From 46d056021dcbc962aad90199f15c9d6099f3676b Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Wed, 19 Aug 2020 15:54:00 +0800 Subject: [PATCH 15/26] fix README & delete gradle-wrapper.jar --- README.md | 2 +- README.zh-CN.md | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 6 ------ 4 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties diff --git a/README.md b/README.md index 3d3def8349..b7dbf114e4 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Dependent components: Key components: * eventmesh-emesher : an middleware to transmit events between event producers and consumers, support cloud native apps and microservices -* eventmesh-sdk-java : support for popular open standard protocols and APIs, including REST/HTTP, AMQP, MQTT, Websocket and JMS, gRPC etc. +* eventmesh-sdk-java : currently supports HTTP and TCP protocols, and will support AMQP, MQTT, Websocket and JMS, gRPC etc. in the future * eventmesh-registry : automatically routes events between applications and services connected to seperate event meshers, manage eventmesh-emesher ## Quick Start diff --git a/README.zh-CN.md b/README.zh-CN.md index 09711b1183..f8a482f8d9 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -29,7 +29,7 @@ Event Mesh的一般功能: 关键部件: * eventmesh-emesher:一种中间件,用于在事件产生者和使用者之间传输事件,支持云原生应用程序和微服务 -* eventmesh-sdk-java:支持流行的开放标准协议和API,包括REST / HTTP,AMQP,MQTT,Websocket和JMS,gRPC等 +* eventmesh-sdk-java:当前支持HTTP和TCP协议,未来会支持AMQP, MQTT, Websocket and JMS, gRPC等 * eventmesh-registry:自动在连接到单独事件网格器的应用程序和服务之间路由事件, 管理emesher ## 快速开始 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 62d4c053550b91381bbd28b1afc82d634bf73a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58910 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 1581427f9a..0000000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Tue Jul 21 17:31:52 CST 2020 -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStorePath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME From d8873e8aa407f695dd28bbb2010c27a92b7a6b96 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Wed, 19 Aug 2020 15:58:57 +0800 Subject: [PATCH 16/26] update quickstart --- docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md | 2 +- docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md | 2 +- docs/cn/instructions/quickstart.zh-CN.md | 2 +- docs/en/instructions/eventmesh-emesher-quickstart.md | 2 +- docs/en/instructions/eventmesh-store-quickstart.md | 2 +- docs/en/instructions/quickstart.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md index 2f95577eea..b75899b317 100644 --- a/docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md +++ b/docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md @@ -4,7 +4,7 @@ ``` 建议使用64位操作系统,建议使用Linux / Unix; 64位JDK 1.8+; -Gradle至少为5.6; +Gradle至少为5.6, 推荐 5.6.* ``` ###下载源码 diff --git a/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md index 7ed5366bae..b7bbb9e961 100644 --- a/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md +++ b/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md @@ -4,7 +4,7 @@ ``` 建议使用64位操作系统,建议使用Linux / Unix; 64位JDK 1.8+; -Gradle至少为5.6; +Gradle至少为5.6, 推荐 5.6.* 4g +可用磁盘用于eventmesh-store服务器 ``` diff --git a/docs/cn/instructions/quickstart.zh-CN.md b/docs/cn/instructions/quickstart.zh-CN.md index 659ab70f59..6ab50786ef 100644 --- a/docs/cn/instructions/quickstart.zh-CN.md +++ b/docs/cn/instructions/quickstart.zh-CN.md @@ -4,7 +4,7 @@ ``` 建议使用64位操作系统,建议使用Linux / Unix; 64位JDK 1.8+; -Gradle至少为5.6; +Gradle至少为5.6, 推荐 5.6.* ``` ###部署eventmesh-store diff --git a/docs/en/instructions/eventmesh-emesher-quickstart.md b/docs/en/instructions/eventmesh-emesher-quickstart.md index 0ffa9fec42..713de8613a 100644 --- a/docs/en/instructions/eventmesh-emesher-quickstart.md +++ b/docs/en/instructions/eventmesh-emesher-quickstart.md @@ -4,7 +4,7 @@ ``` 64bit OS, Linux/Unix is recommended; 64bit JDK 1.8+; -Gradle at least 5.6; +Gradle at least 5.6, eg 5.6.* ``` ### download sources diff --git a/docs/en/instructions/eventmesh-store-quickstart.md b/docs/en/instructions/eventmesh-store-quickstart.md index a5b872ead9..8ba16d99aa 100644 --- a/docs/en/instructions/eventmesh-store-quickstart.md +++ b/docs/en/instructions/eventmesh-store-quickstart.md @@ -4,7 +4,7 @@ ``` 64bit OS, Linux/Unix is recommended; 64bit JDK 1.8+; -Gradle at least 5.6; +Gradle at least 5.6, eg 5.6.* 4g+ free disk for eventmesh-store server ``` diff --git a/docs/en/instructions/quickstart.md b/docs/en/instructions/quickstart.md index dbe9f771dc..63e57c96fa 100644 --- a/docs/en/instructions/quickstart.md +++ b/docs/en/instructions/quickstart.md @@ -4,7 +4,7 @@ ``` 64bit OS, Linux/Unix is recommended; 64bit JDK 1.8+; -Gradle at least 5.6; +Gradle at least 5.6, eg 5.6.* ``` ### Deploy eventmesh-store From e9179838f892af2e9893d29ef1a45afc9483159f Mon Sep 17 00:00:00 2001 From: lrhkobe Date: Wed, 19 Aug 2020 16:11:51 +0800 Subject: [PATCH 17/26] improve start and stop script --- eventmesh-emesher/bin/start.sh | 6 +++--- eventmesh-emesher/bin/stop.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eventmesh-emesher/bin/start.sh b/eventmesh-emesher/bin/start.sh index fe463adefa..30eb9b429a 100644 --- a/eventmesh-emesher/bin/start.sh +++ b/eventmesh-emesher/bin/start.sh @@ -59,7 +59,7 @@ function get_pid { ppid=$(/bin/ps -o user,pid,command | grep "java" | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) else #在Linux服务器上要求尽可能精确识别进程 - ppid=$(ps -C java -o user,pid,command --cols 99999 | grep $PROXY_HOME | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) + ppid=$(ps -C java -o user,pid,command --cols 99999 | grep -w $PROXY_HOME | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) fi fi echo "$ppid"; @@ -116,8 +116,8 @@ export JAVA_HOME #JAVA_OPT="${JAVA_OPT} -server -Xms2048M -Xmx4096M -Xmn2048m -XX:SurvivorRatio=4" JAVA_OPT=`cat ${PROXY_HOME}/conf/server.env | grep APP_START_JVM_OPTION::: | awk -F ':::' {'print $2'}` JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:MaxGCPauseMillis=50" -JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/proxy_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy" -JAVA_OPT="${JAVA_OPT} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/app/proxy/logs -XX:ErrorFile=/data/app/proxy/logs/hs_err_%p.log" +JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${PROXY_HOME}/logs/proxy_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy" +JAVA_OPT="${JAVA_OPT} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${PROXY_HOME}/logs -XX:ErrorFile=${PROXY_HOME}/logs/hs_err_%p.log" JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow" JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch" diff --git a/eventmesh-emesher/bin/stop.sh b/eventmesh-emesher/bin/stop.sh index e11ac010eb..9bda9df513 100644 --- a/eventmesh-emesher/bin/stop.sh +++ b/eventmesh-emesher/bin/stop.sh @@ -20,7 +20,7 @@ function get_pid { ppid=$(/bin/ps -o user,pid,command | grep "java" | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) else #在Linux服务器上要求尽可能精确识别进程 - ppid=$(ps -C java -o user,pid,command --cols 99999 | grep $PROXY_HOME | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) + ppid=$(ps -C java -o user,pid,command --cols 99999 | grep -w $PROXY_HOME | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) fi fi echo "$ppid"; From bac1954955ea16e208ad5c8369023be85f6b1f96 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Wed, 19 Aug 2020 17:34:09 +0800 Subject: [PATCH 18/26] remove Internal component dependency --- eventmesh-emesher/build.gradle | 52 +--- eventmesh-emesher/conf/log-client.properties | 26 -- eventmesh-emesher/conf/log4j2.xml | 23 -- eventmesh-emesher/conf/proxy.properties | 6 +- eventmesh-emesher/gradle.properties | 1 - .../webank/emesher/boot/ProxyTCPServer.java | 10 - .../configuration/AccessConfiguration.java | 24 -- .../configuration/CommonConfiguration.java | 8 - .../emesher/constants/ProxyConstants.java | 18 -- .../protocol/http/consumer/ProxyConsumer.java | 8 +- .../protocol/http/producer/ProxyProducer.java | 6 +- .../tcp/client/group/ClientGroupWrapper.java | 12 +- .../emesher/threads/ThreadPoolHelper.java | 2 - .../src/main/resources/log4j2.xml | 274 ------------------ 14 files changed, 23 insertions(+), 447 deletions(-) delete mode 100644 eventmesh-emesher/conf/log-client.properties delete mode 100644 eventmesh-emesher/src/main/resources/log4j2.xml diff --git a/eventmesh-emesher/build.gradle b/eventmesh-emesher/build.gradle index 79c8434fbc..7b0243766a 100644 --- a/eventmesh-emesher/build.gradle +++ b/eventmesh-emesher/build.gradle @@ -32,10 +32,10 @@ repositories { mavenCentral() } -def env = 'dev' -if (project.findProperty("env") instanceof String) { - env = project.property("env") -} +//def env = 'dev' +//if (project.findProperty("env") instanceof String) { +// env = project.property("env") +//} List defibus = [ "com.webank.defibus:defibus-client:$defibus_version", @@ -72,26 +72,6 @@ dependencies { testCompile defibus, metrics, log4j2, sl4j, junit } -//configurations.all { -// resolutionStrategy { -// force 'io.netty:netty-all:4.1.36.Final' -// force 'com.alibaba:fastjson:1.2.68' -// force 'com.fasterxml.jackson.core:jackson-databind:2.10.0' -// force 'com.fasterxml.jackson.core:jackson-core:2.10.0' -// force 'com.fasterxml.jackson.core:jackson-annotations:2.10.0' -// } -// -// resolutionStrategy.cacheChangingModulesFor 0, TimeUnit.SECONDS -// resolutionStrategy.cacheDynamicVersionsFor 0, TimeUnit.SECONDS -// -// exclude group:'io.netty',module:'netty-tcnative-boringssl-static' -// -//} -// -//tasks.withType(JavaCompile) { -// options.encoding = "UTF-8" -//} -// clean.doFirst { delete 'build' delete 'dist' @@ -137,15 +117,15 @@ task tar(overwrite: true, type: Tar, dependsOn: ['clean', 'jar']) { } } -//uploadArchives { -// repositories { -// mavenDeployer { -//// snapshotRepository(url: 'Your target repo address') { -//// authentication(userName: 'Your user name', password: 'Your password') -//// } -//// repository(url: 'Your target repo address') { -//// authentication(userName: 'Your user name', password: 'Your password') -//// } -// } -// } -//} \ No newline at end of file +uploadArchives { + repositories { + mavenDeployer { + snapshotRepository(url: 'Your target repo address') { + authentication(userName: 'Your user name', password: 'Your password') + } + repository(url: 'Your target repo address') { + authentication(userName: 'Your user name', password: 'Your password') + } + } + } +} \ No newline at end of file diff --git a/eventmesh-emesher/conf/log-client.properties b/eventmesh-emesher/conf/log-client.properties deleted file mode 100644 index 566382dc3a..0000000000 --- a/eventmesh-emesher/conf/log-client.properties +++ /dev/null @@ -1,26 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -logserver.client.start.up=true -logserver.client.open=true -logserver.client.env=test -logserver.client.system.id= -logserver.client.system.dcn= -logserver.client.system.org= -logserver.client.system.idc= -logserver.client.memory.full.loglevel=error -client.ws.addrs= \ No newline at end of file diff --git a/eventmesh-emesher/conf/log4j2.xml b/eventmesh-emesher/conf/log4j2.xml index 1b23cdca05..653b6a66e6 100644 --- a/eventmesh-emesher/conf/log4j2.xml +++ b/eventmesh-emesher/conf/log4j2.xml @@ -21,21 +21,6 @@ - - - - - - - - - - - - - - @@ -110,13 +95,5 @@ - - - - - - - - \ No newline at end of file diff --git a/eventmesh-emesher/conf/proxy.properties b/eventmesh-emesher/conf/proxy.properties index 926940e78f..2feed25aed 100644 --- a/eventmesh-emesher/conf/proxy.properties +++ b/eventmesh-emesher/conf/proxy.properties @@ -15,8 +15,7 @@ # limitations under the License. # -###############################PROXY ENV################################# -#### proxyEnv -> proxyRegion(Region:SZ/SH) -> proxyIdc -> proxyDcn(1C0) -> proxyCluster(Cluster:LS/CNC/DEP) -> proxyIp #### +###############################EVNETMESH-EMESHER ENV################################# proxy.server.idc=DEFAULT proxy.server.env=PRD proxy.server.region=region1 @@ -27,7 +26,7 @@ proxy.sysid=0000 proxy.server.http.port=10105 #######################defibus################## -#proxy.server.defibus.configCenter= +proxy.server.defibus.namesrvAddr=127.0.0.1:9876;127.0.0.1:9876 proxy.server.defibus.client.consumeThreadMin=2 proxy.server.defibus.client.consumeThreadMax=2 proxy.server.defibus.client.consumeThreadPoolQueueSize=10000 @@ -62,7 +61,6 @@ proxy.server.session.downstreamUnackSize=100 # thread number about global scheduler proxy.server.global.scheduler=5 -proxy.server.tcp.traceLogExecutorPoolSize=5 proxy.server.tcp.taskHandleExecutorPoolSize=8 #retry diff --git a/eventmesh-emesher/gradle.properties b/eventmesh-emesher/gradle.properties index eee41aabaa..0cee7dd653 100644 --- a/eventmesh-emesher/gradle.properties +++ b/eventmesh-emesher/gradle.properties @@ -18,7 +18,6 @@ group=cn.webank.eventmesh version=1.0.0 defibus_version=1.0.0 -messageserver_version=1.0.7 mavenUserName= mavenPassword= diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyTCPServer.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyTCPServer.java index e33f44ab13..8dd7c36f68 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyTCPServer.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyTCPServer.java @@ -65,10 +65,6 @@ public class ProxyTCPServer extends AbstractRemotingServer { public static ScheduledExecutorService scheduler; - public static ExecutorService traceLogExecutor; - - public static ScheduledExecutorService configCenterUpdateScheduler; - public static ExecutorService taskHandleExecutorService; public ScheduledFuture tcpRegisterTask; @@ -208,16 +204,10 @@ private void initThreadPool() throws Exception { scheduler = ThreadPoolFactory.createScheduledExecutor(accessConfiguration.proxyTcpGlobalScheduler, new ProxyThreadFactoryImpl("proxy-tcp-scheduler", true)); - traceLogExecutor = ThreadPoolFactory.createThreadPoolExecutor(accessConfiguration.proxyTcpTraceLogExecutorPoolSize, accessConfiguration.proxyTcpTraceLogExecutorPoolSize, new LinkedBlockingQueue(10000), new ProxyThreadFactoryImpl("proxy-tcp-trace", true)); - - configCenterUpdateScheduler = ThreadPoolFactory.createScheduledExecutor(accessConfiguration.proxyTcpCcUpdateExecutorPoolSize, new ProxyThreadFactoryImpl("proxy-tcp-cc-update",true)); - taskHandleExecutorService = ThreadPoolFactory.createThreadPoolExecutor(accessConfiguration.proxyTcpTaskHandleExecutorPoolSize, accessConfiguration.proxyTcpTaskHandleExecutorPoolSize, new LinkedBlockingQueue(10000), new ProxyThreadFactoryImpl("proxy-tcp-task-handle", true));; } private void shutdownThreadPool(){ - traceLogExecutor.shutdown(); - configCenterUpdateScheduler.shutdown(); scheduler.shutdown(); taskHandleExecutorService.shutdown(); diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/AccessConfiguration.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/AccessConfiguration.java index a45e48cd3a..cb0481b832 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/AccessConfiguration.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/AccessConfiguration.java @@ -44,10 +44,6 @@ public class AccessConfiguration extends CommonConfiguration { public int proxyTcpGlobalScheduler = 5; - public int proxyTcpTraceLogExecutorPoolSize = 5; - - public int proxyTcpCcUpdateExecutorPoolSize = 2; - public int proxyTcpTaskHandleExecutorPoolSize = Runtime.getRuntime().availableProcessors(); public int proxyTcpSessionExpiredInMills = 60000; @@ -125,20 +121,6 @@ public void init(){ proxyTcpGlobalScheduler = Integer.valueOf(StringUtils.deleteWhitespace(proxyTcpGlobalSchedulerStr)); } - String proxyTcpTraceLogExecutorPoolSizeStr = configurationWraper.getProp(ConfKeys.KEYS_PROXY_SERVER_TCP_TRACE_LOG_POOL_SIZE); - if(StringUtils.isNotEmpty(proxyTcpTraceLogExecutorPoolSizeStr)){ - Preconditions.checkState(StringUtils.isNumeric(proxyTcpTraceLogExecutorPoolSizeStr), - String.format("%s error", ConfKeys.KEYS_PROXY_SERVER_TCP_TRACE_LOG_POOL_SIZE)); - proxyTcpTraceLogExecutorPoolSize = Integer.valueOf(StringUtils.deleteWhitespace(proxyTcpTraceLogExecutorPoolSizeStr)); - } - - String proxyTcpCcUpdateExecutorPoolSizeStr = configurationWraper.getProp(ConfKeys.KEYS_PROXY_SERVER_TCP_CC_UPDATE_POOL_SIZE); - if(StringUtils.isNotEmpty(proxyTcpCcUpdateExecutorPoolSizeStr)){ - Preconditions.checkState(StringUtils.isNumeric(proxyTcpCcUpdateExecutorPoolSizeStr), - String.format("%s error", ConfKeys.KEYS_PROXY_SERVER_TCP_CC_UPDATE_POOL_SIZE)); - proxyTcpCcUpdateExecutorPoolSize = Integer.valueOf(StringUtils.deleteWhitespace(proxyTcpCcUpdateExecutorPoolSizeStr)); - } - String proxyTcpTaskHandleExecutorPoolSizeStr = configurationWraper.getProp(ConfKeys.KEYS_PROXY_SERVER_TCP_TASK_HANDLE_POOL_SIZE); if(StringUtils.isNotEmpty(proxyTcpTaskHandleExecutorPoolSizeStr)){ Preconditions.checkState(StringUtils.isNumeric(proxyTcpTaskHandleExecutorPoolSizeStr), @@ -234,9 +216,6 @@ static class ConfKeys{ public static String KEYS_PROXY_SERVER_MSG_REQ_NUM_PER_SECONDS = "proxy.server.tcp.msgReqnumPerSecond"; public static String KEYS_PROXY_SERVER_TCP_REBALANCE_INTERVAL = "proxy.server.tcp.RebalanceIntervalInMills"; public static String KEYS_PROXY_SERVER_GLOBAL_SCHEDULER = "proxy.server.global.scheduler"; - public static String KEYS_PROXY_SERVER_GLOBAL_ASYNC = "proxy.server.global.async"; - public static String KEYS_PROXY_SERVER_TCP_TRACE_LOG_POOL_SIZE = "proxy.server.tcp.traceLogExecutorPoolSize"; - public static String KEYS_PROXY_SERVER_TCP_CC_UPDATE_POOL_SIZE = "proxy.server.tcp.ccUpdateExecutorPoolSize"; public static String KEYS_PROXY_SERVER_TCP_TASK_HANDLE_POOL_SIZE = "proxy.server.tcp.taskHandleExecutorPoolSize"; public static String KEYS_PROXY_SERVER_SESSION_EXPIRED_TIME = "proxy.server.session.expiredInMills"; public static String KEYS_PROXY_SERVER_SESSION_UPSTREAM_BUFFER_SIZE = "proxy.server.session.upstreamBufferSize"; @@ -244,12 +223,9 @@ static class ConfKeys{ public static String KEYS_PROXY_SERVER_RETRY_PUSH_RETRY_TIMES = "proxy.server.retry.pushRetryTimes"; public static String KEYS_PROXY_SERVER_RETRY_PUSH_RETRY_DELAY = "proxy.server.retry.pushRetryDelayInMills"; public static String KEYS_PROXY_SERVER_RETRY_PUSH_RETRY_QUEUE_SIZE = "proxy.server.retry.pushRetryQueueSize"; - public static String KEYS_PROXY_SERVER_MONITOR_IMS_INTERFACE = "proxy.server.monitor.imsInterfaceName"; - public static String KEYS_PROXY_SERVER_MONITOR_IMS_ENABLED = "proxy.server.monitor.imsEnabled"; public static String KEYS_PROXY_SERVER_ADMIN_HTTP_PORT = "proxy.server.admin.http.port"; public static String KEYS_PROXY_TCP_SERVER_ENABLED = "proxy.server.tcp.enabled"; public static String KEYS_PROXY_TCP_SEND_BACK_ENABLED = "proxy.server.tcp.sendBack.enabled"; - public static String KEYS_PROXY_TCP_SEND_BACK_MAX_TIMES = "proxy.server.tcp.sendBack.maxTimes"; public static String KEYS_PROXY_SERVER_PUSH_FAIL_ISOLATE_TIME = "proxy.server.tcp.pushFailIsolateTimeInMills"; public static String KEYS_PROXY_TCP_DOWNSTREAM_MAP_SIZE = "proxy.server.tcp.downstreamMapSize"; } diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java index 9161d3662a..4695925464 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java @@ -31,7 +31,6 @@ public class CommonConfiguration { public String sysID = "5477"; - public String configCenterAddr = ""; public String namesrvAddr = ""; public String clientUserName = "username"; public String clientPass = "user@123"; @@ -93,9 +92,6 @@ public void init() { clientPass = StringUtils.trim(clientPassStr); } - String proxyConfigCenterAddrStr = configurationWraper.getProp(ConfKeys.KEYS_PROXY_DEFIBUS_CONFIGCENTER); - configCenterAddr = StringUtils.trim(proxyConfigCenterAddrStr); - String namesrvAddrStr = configurationWraper.getProp(ConfKeys.KEYS_PROXY_DEFIBUS_NAMESRV_ADDR); Preconditions.checkState(StringUtils.isNotEmpty(namesrvAddrStr), String.format("%s error", ConfKeys.KEYS_PROXY_DEFIBUS_NAMESRV_ADDR)); namesrvAddr = StringUtils.trim(namesrvAddrStr); @@ -181,10 +177,6 @@ static class ConfKeys { public static String KEYS_PROXY_SERVER_NAME = "proxy.server.name"; - public static String KEYS_PROXY_DEFIBUS_SERVICECENTER = "proxy.server.defibus.serviceCenter"; - - public static String KEYS_PROXY_DEFIBUS_CONFIGCENTER = "proxy.server.defibus.configCenter"; - public static String KEYS_PROXY_DEFIBUS_NAMESRV_ADDR = "proxy.server.defibus.namesrvAddr"; public static String KEYS_PROXY_DEFIBUS_USERNAME = "proxy.server.defibus.username"; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyConstants.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyConstants.java index e5e2f8b685..6343155a6f 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyConstants.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyConstants.java @@ -23,10 +23,6 @@ public class ProxyConstants { public static final String PROTOCOL_TCP = "tcp"; - public static final String HTTP_DOMAIN_NAME = "proxy-" + PROTOCOL_HTTP; - - public static final String TCP_DOMAIN_NAME = "proxy-" + PROTOCOL_TCP; - public static final String BROADCAST_PREFIX = "broadcast-"; public final static String CONSUMER_GROUP_NAME_PREFIX = "ConsumerGroup-"; @@ -35,14 +31,6 @@ public class ProxyConstants { public static final String DEFAULT_CHARSET = "UTF-8"; - public static final String IP_PORT_SEPARATOR = ":"; - - public static final String HTTP_PROTOCOL_PREFIX = "http://"; - - public static final String PROXY_SERVICE_PREFIX = "proxy-server-"; - - public static final String REGEX_VALIDATE_FOR_ENDPOINTS = "^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{4,6};)*(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{4,6})$"; - public static final String PROXY_CONF_HOME = System.getProperty("confPath", System.getenv("confPath")); public static final String PROXY_CONF_FILE = "proxy.properties"; @@ -61,12 +49,6 @@ public class ProxyConstants { public static final String RSP_SEND_PROXY_IP = "rsp_send_proxy_ip"; public static final String RSP_RECEIVE_PROXY_IP = "rsp_receive_proxy_ip"; - //add for mss-trace - public static final String REQ_BORN_TIMESTAMP = "req_born_timestamp"; - public static final String REQ_STORE_TIMESTAMP = "req_store_timestamp"; - public static final String REQ_LEAVE_TIMESTAMP = "req_leave_timestamp"; - public static final String REQ_ARRIVE_TIMESTAMP = "req_arrive_timestamp"; - //default TTL 4 hours public static final Integer DEFAULT_MSG_TTL_MILLS = 14400000; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java index f632fdfdcd..3842c39ab0 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java @@ -101,12 +101,8 @@ private DeFiBusClientConfig initDeFiBusClientConfig(boolean broadcast) { wcc.setConsumerGroup(ProxyConstants.CONSUMER_GROUP_NAME_PREFIX + consumerGroupConf.getConsumerGroup()); } - if (StringUtils.isEmpty(proxyHTTPServer.getProxyConfiguration().namesrvAddr)) { - wcc.setWsAddr(ProxyUtil.buildCCAddr(proxyHTTPServer.getProxyConfiguration().configCenterAddr, - proxyHTTPServer.getProxyConfiguration().proxyIDC)); - } else { - wcc.setNamesrvAddr(proxyHTTPServer.getProxyConfiguration().namesrvAddr); - } + wcc.setNamesrvAddr(proxyHTTPServer.getProxyConfiguration().namesrvAddr); + return wcc; } diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProxyProducer.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProxyProducer.java index 8d711e9bb2..45686406ea 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProxyProducer.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProxyProducer.java @@ -90,11 +90,7 @@ public synchronized void init(ProxyConfiguration proxyConfiguration, ProducerGro wcc.setHeartbeatBrokerInterval(proxyConfiguration.heartbeatBrokerInterval); wcc.setProducerGroup(ProxyConstants.PRODUCER_GROUP_NAME_PREFIX + producerGroupConfig.getGroupName()); - if (StringUtils.isEmpty(proxyConfiguration.namesrvAddr)) { - wcc.setWsAddr(ProxyUtil.buildCCAddr(proxyConfiguration.configCenterAddr, proxyConfiguration.proxyIDC)); - } else { - wcc.setNamesrvAddr(proxyConfiguration.namesrvAddr); - } + wcc.setNamesrvAddr(proxyConfiguration.namesrvAddr); MessageClientIDSetter.createUniqID(); defibusProducer = new DeFiBusProducer(wcc); diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java index a17481c6b9..fe19ef45cc 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java @@ -230,11 +230,7 @@ public synchronized void startClientGroupProducer() throws MQClientException { DeFiBusClientConfig wcc = new DeFiBusClientConfig(); wcc.setClusterPrefix(accessConfiguration.proxyIDC); wcc.setProducerGroup(ProxyUtil.buildClientProducerGroup(sysId, dcn)); - if (StringUtils.isEmpty(accessConfiguration.namesrvAddr)) { - wcc.setWsAddr(ProxyUtil.buildCCAddr(accessConfiguration.configCenterAddr)); - } else { - wcc.setNamesrvAddr(accessConfiguration.namesrvAddr); - } + wcc.setNamesrvAddr(accessConfiguration.namesrvAddr); MessageClientIDSetter.createUniqID(); defibusProducer = new DeFiBusProducer(wcc); @@ -378,11 +374,7 @@ private DeFiBusClientConfig initDefibusClientConfig(boolean broadcast) { wcc.setConsumerGroup(ProxyUtil.buildPersistentClientConsumerGroup(sysId, dcn)); } - if (StringUtils.isEmpty(accessConfiguration.namesrvAddr)) { - wcc.setWsAddr(ProxyUtil.buildCCAddr(accessConfiguration.configCenterAddr)); - } else { - wcc.setNamesrvAddr(accessConfiguration.namesrvAddr); - } + wcc.setNamesrvAddr(accessConfiguration.namesrvAddr); return wcc; } diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ThreadPoolHelper.java b/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ThreadPoolHelper.java index 617c0f4524..7485f66e97 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ThreadPoolHelper.java +++ b/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ThreadPoolHelper.java @@ -71,8 +71,6 @@ public static void printThreadPoolState() { printState(consumeMessageExecutor); printState((ThreadPoolExecutor) ProxyTCPServer.taskHandleExecutorService); printState((ThreadPoolExecutor) ProxyTCPServer.scheduler); - printState((ThreadPoolExecutor) ProxyTCPServer.traceLogExecutor); - printState((ThreadPoolExecutor) ProxyTCPServer.configCenterUpdateScheduler); } public static void printState(ThreadPoolExecutor scheduledExecutorService) { diff --git a/eventmesh-emesher/src/main/resources/log4j2.xml b/eventmesh-emesher/src/main/resources/log4j2.xml deleted file mode 100644 index 9e60f7e2fc..0000000000 --- a/eventmesh-emesher/src/main/resources/log4j2.xml +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From a22dcd0d149fcfa63e220dd40312d67c5f2c5c98 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Wed, 19 Aug 2020 17:41:39 +0800 Subject: [PATCH 19/26] remove Internal component dependency --- eventmesh-emesher/src/test/java/client/impl/PubClientImpl.java | 2 +- eventmesh-emesher/src/test/java/client/impl/SubClientImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eventmesh-emesher/src/test/java/client/impl/PubClientImpl.java b/eventmesh-emesher/src/test/java/client/impl/PubClientImpl.java index 30ee3ded78..86e97915c2 100644 --- a/eventmesh-emesher/src/test/java/client/impl/PubClientImpl.java +++ b/eventmesh-emesher/src/test/java/client/impl/PubClientImpl.java @@ -90,7 +90,7 @@ public void run() { } catch (Exception e) { } } - }, ClientConstants.HEATBEAT, ClientConstants.HEATBEAT, TimeUnit.MILLISECONDS); + }, ClientConstants.HEARTBEAT, ClientConstants.HEARTBEAT, TimeUnit.MILLISECONDS); } public void goodbye() throws Exception { diff --git a/eventmesh-emesher/src/test/java/client/impl/SubClientImpl.java b/eventmesh-emesher/src/test/java/client/impl/SubClientImpl.java index 743ed4dade..b44c4c6834 100644 --- a/eventmesh-emesher/src/test/java/client/impl/SubClientImpl.java +++ b/eventmesh-emesher/src/test/java/client/impl/SubClientImpl.java @@ -102,7 +102,7 @@ public void run() { } catch (Exception e) { } } - }, ClientConstants.HEATBEAT, ClientConstants.HEATBEAT, TimeUnit.MILLISECONDS); + }, ClientConstants.HEARTBEAT, ClientConstants.HEARTBEAT, TimeUnit.MILLISECONDS); } public Package goodbye() throws Exception { From 60101e4fe25ccac3de2981a66027938f4714a111 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Wed, 19 Aug 2020 18:11:32 +0800 Subject: [PATCH 20/26] update doc --- README.md | 3 --- README.zh-CN.md | 3 --- docs/images/eventmesh-overview.png | Bin 23805 -> 0 bytes 3 files changed, 6 deletions(-) delete mode 100644 docs/images/eventmesh-overview.png diff --git a/README.md b/README.md index b7dbf114e4..3a25754021 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,6 @@ This figure shows the positioning of the event mesh relative to other similar technologies (such as service mesh) in the application framework. ![architecture1](docs/images/eventmesh-define.png) -Overview of EventMesh: -![architecture1](docs/images/eventmesh-overview.png) - Landscape of EventMesh: ![architecture1](docs/images/eventmesh-landscape.png) diff --git a/README.zh-CN.md b/README.zh-CN.md index f8a482f8d9..2307ae86b4 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -7,9 +7,6 @@ 该图显示了Event Mesh相对于应用程序框架中其他类似技术(例如Service Mesh)的定位. ![architecture1](docs/images/eventmesh-define.png) -EventMesh的概览: -![architecture1](docs/images/eventmesh-overview.png) - EventMesh的功能全景: ![architecture1](docs/images/eventmesh-landscape.png) diff --git a/docs/images/eventmesh-overview.png b/docs/images/eventmesh-overview.png deleted file mode 100644 index d3c6515a6d9952d00cabf05bdaa6207bb9da4bb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23805 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 Date: Wed, 19 Aug 2020 20:06:02 +0800 Subject: [PATCH 21/26] update doc --- README.md | 2 +- docs/images/mesh-helper.png | Bin 387161 -> 127224 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a25754021..930f052408 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ This diagram shows the architecture of EventMesh: ![architecture2](docs/images/eventmesh-arch.png) The event mesh allows events from one application to be dynamically routed to any other application. -General functions of the event grid: +General functions of the event mesh: * Event driven; * Event governance; * Dynamic routing; diff --git a/docs/images/mesh-helper.png b/docs/images/mesh-helper.png index f1a16876cadecaff829d8a6133b70a21dfd6a0a9..0419d98609c23c8ecf419d75add70935597e075c 100644 GIT binary patch literal 127224 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 z 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%0A-^1;GA!9$vB$w4*Ii-N{8v+)y|k=fky+# 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

-T7nyR!FbP)L75%nLkAX+_U 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 IM6N<$f>9sveEfX}@0KO&h(w#Yu+Q(nrwmy;& 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%0DRdvVg_5ehk) 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 Ax&QzG From 91812436cb3eaab936db2cbe03b4add9be419fc5 Mon Sep 17 00:00:00 2001 From: lrhkobe Date: Wed, 19 Aug 2020 22:34:59 +0800 Subject: [PATCH 22/26] adjust package path --- .../eventmesh-sdk-java-quickstart.zh-CN.md | 18 ++++---- .../eventmesh-sdk-java-quickstart.md | 18 ++++---- eventmesh-common/gradle.properties | 6 +-- .../webank/eventmesh/common/Constants.java | 2 +- .../webank/eventmesh/common/IPUtil.java | 2 +- .../webank/eventmesh/common/LiteMessage.java | 2 +- .../eventmesh/common/ProxyException.java | 2 +- .../eventmesh/common/ThreadPoolFactory.java | 2 +- .../webank/eventmesh/common/ThreadUtil.java | 2 +- .../eventmesh/common/command/HttpCommand.java | 12 +++--- .../protocol/http/body/BaseRequestBody.java | 2 +- .../protocol/http/body/BaseResponseBody.java | 4 +- .../common/protocol/http/body/Body.java | 20 ++++----- .../body/client/HeartbeatRequestBody.java | 4 +- .../body/client/HeartbeatResponseBody.java | 8 ++-- .../http/body/client/RegRequestBody.java | 4 +- .../http/body/client/RegResponseBody.java | 8 ++-- .../body/client/SubscribeRequestBody.java | 2 +- .../body/client/SubscribeResponseBody.java | 2 +- .../http/body/client/UnRegRequestBody.java | 4 +- .../http/body/client/UnRegResponseBody.java | 8 ++-- .../body/client/UnSubscribeRequestBody.java | 2 +- .../body/client/UnSubscribeResponseBody.java | 2 +- .../body/message/PushMessageRequestBody.java | 4 +- .../body/message/PushMessageResponseBody.java | 8 ++-- .../body/message/ReplyMessageRequestBody.java | 4 +- .../message/ReplyMessageResponseBody.java | 8 ++-- .../message/SendMessageBatchRequestBody.java | 4 +- .../message/SendMessageBatchResponseBody.java | 8 ++-- .../SendMessageBatchV2RequestBody.java | 4 +- .../SendMessageBatchV2ResponseBody.java | 8 ++-- .../body/message/SendMessageRequestBody.java | 4 +- .../body/message/SendMessageResponseBody.java | 8 ++-- .../protocol/http/common/ClientRetCode.java | 2 +- .../protocol/http/common/ClientType.java | 2 +- .../protocol/http/common/ProtocolKey.java | 2 +- .../protocol/http/common/ProtocolVersion.java | 2 +- .../protocol/http/common/ProxyRetCode.java | 2 +- .../protocol/http/common/RequestCode.java | 2 +- .../http/header/BaseRequestHeader.java | 4 +- .../http/header/BaseResponseHeader.java | 4 +- .../common/protocol/http/header/Header.java | 20 ++++----- .../header/client/HeartbeatRequestHeader.java | 10 ++--- .../client/HeartbeatResponseHeader.java | 6 +-- .../http/header/client/RegRequestHeader.java | 10 ++--- .../http/header/client/RegResponseHeader.java | 6 +-- .../header/client/SubscribeRequestHeader.java | 2 +- .../client/SubscribeResponseHeader.java | 2 +- .../header/client/UnRegRequestHeader.java | 10 ++--- .../header/client/UnRegResponseHeader.java | 6 +-- .../client/UnSubscribeRequestHeader.java | 2 +- .../client/UnSubscribeResponseHeader.java | 2 +- .../message/PushMessageRequestHeader.java | 10 ++--- .../message/PushMessageResponseHeader.java | 10 ++--- .../message/ReplyMessageRequestHeader.java | 10 ++--- .../message/ReplyMessageResponseHeader.java | 6 +-- .../SendMessageBatchRequestHeader.java | 10 ++--- .../SendMessageBatchResponseHeader.java | 6 +-- .../SendMessageBatchV2RequestHeader.java | 10 ++--- .../SendMessageBatchV2ResponseHeader.java | 6 +-- .../message/SendMessageRequestHeader.java | 10 ++--- .../message/SendMessageResponseHeader.java | 6 +-- .../common/protocol/tcp/AccessMessage.java | 2 +- .../common/protocol/tcp/Command.java | 2 +- .../eventmesh/common/protocol/tcp/Header.java | 2 +- .../common/protocol/tcp/HeartBeatInfo.java | 2 +- .../common/protocol/tcp/OPStatus.java | 2 +- .../common/protocol/tcp/Package.java | 2 +- .../common/protocol/tcp/ProxyClientInfo.java | 2 +- .../common/protocol/tcp/RedirectInfo.java | 2 +- .../common/protocol/tcp/RegisterInfo.java | 2 +- .../common/protocol/tcp/Subscription.java | 2 +- .../common/protocol/tcp/UnRegisterInfo.java | 2 +- .../common/protocol/tcp/UserAgent.java | 2 +- .../common/protocol/tcp/codec/Codec.java | 18 ++++---- eventmesh-emesher/bin/start.sh | 10 ++--- eventmesh-emesher/bin/stop.sh | 6 +-- eventmesh-emesher/bin/test/asyncPub.sh | 2 +- eventmesh-emesher/bin/test/asyncRRReq.sh | 2 +- eventmesh-emesher/bin/test/syncListen.sh | 2 +- eventmesh-emesher/bin/test/syncReq.sh | 2 +- eventmesh-emesher/build.gradle | 7 +--- eventmesh-emesher/conf/log4j2.xml | 4 +- eventmesh-emesher/conf/proxy.properties | 2 +- eventmesh-emesher/gradle.properties | 5 +-- .../impl/factory/DeFiBusClientInstance.java | 10 ++--- .../controller/ClientManageController.java | 24 +++++------ .../emesher/boot/AbrstractHTTPServer.java | 32 +++++++------- .../emesher/boot/AbstractRemotingServer.java | 4 +- .../webank/emesher/boot/ProxyHTTPServer.java | 38 ++++++++--------- .../webank/emesher/boot/ProxyServer.java | 8 ++-- .../webank/emesher/boot/ProxyStartup.java | 10 ++--- .../webank/emesher/boot/ProxyTCPServer.java | 28 ++++++------- .../webank/emesher/common/Pair.java | 2 +- .../webank/emesher/common/ServiceState.java | 2 +- .../configuration/AccessConfiguration.java | 2 +- .../configuration/CommonConfiguration.java | 4 +- .../configuration/ConfigurationWraper.java | 4 +- .../configuration/ProxyConfiguration.java | 2 +- .../emesher/constants/ProxyConstants.java | 2 +- .../emesher/constants/ProxyVersion.java | 2 +- .../core/consumergroup/ConsumerGroupConf.java | 2 +- .../consumergroup/ConsumerGroupTopicConf.java | 2 +- .../core/consumergroup/ProducerGroupConf.java | 2 +- .../ConsumerGroupInstanceChangeEvent.java | 2 +- .../event/ConsumerGroupStateEvent.java | 4 +- .../ConsumerGroupTopicConfChangeEvent.java | 4 +- .../protocol/http/async/AsyncContext.java | 2 +- .../protocol/http/async/CompleteHandler.java | 2 +- .../http/consumer/ConsumerGroupManager.java | 6 +-- .../http/consumer/ConsumerManager.java | 10 ++--- .../http/consumer/HandleMsgContext.java | 16 +++---- .../protocol/http/consumer/ProxyConsumer.java | 33 +++++++-------- .../http/processor/AdminMetricsProcessor.java | 10 ++--- .../processor/AdminShutdownProcessor.java | 20 ++++----- .../processor/BatchSendMessageProcessor.java | 36 ++++++++-------- .../BatchSendMessageV2Processor.java | 36 ++++++++-------- .../http/processor/ReplyMessageProcessor.java | 42 +++++++++---------- .../processor/SendAsyncMessageProcessor.java | 42 +++++++++---------- .../processor/SendSyncMessageProcessor.java | 42 +++++++++---------- .../http/processor/SubscribeProcessor.java | 18 ++++---- .../http/processor/UnSubscribeProcessor.java | 18 ++++---- .../processor/inf/HttpRequestProcessor.java | 6 +-- .../http/producer/ProducerManager.java | 6 +-- .../protocol/http/producer/ProxyProducer.java | 21 +++++----- .../http/producer/SendMessageContext.java | 8 ++-- .../http/push/AbstractHTTPPushRequest.java | 16 +++---- .../http/push/AsyncHTTPPushRequest.java | 24 +++++------ .../protocol/http/push/HTTPClientPool.java | 2 +- .../http/push/HTTPMessageHandler.java | 8 ++-- .../protocol/http/push/MessageHandler.java | 4 +- .../protocol/http/retry/DelayRetryable.java | 2 +- .../core/protocol/http/retry/HttpRetryer.java | 4 +- .../protocol/http/retry/RetryContext.java | 2 +- .../protocol/tcp/client/ProxyTcp2Client.java | 28 ++++++------- .../tcp/client/ProxyTcpConnectionHandler.java | 4 +- .../tcp/client/ProxyTcpExceptionHandler.java | 10 ++--- .../tcp/client/ProxyTcpMessageDispatcher.java | 30 ++++++------- .../tcp/client/group/ClientGroupWrapper.java | 32 +++++++------- .../group/ClientSessionGroupMapping.java | 26 ++++++------ .../dispatch/DownstreamDispatchStrategy.java | 4 +- .../FreePriorityDispatchStrategy.java | 4 +- .../protocol/tcp/client/session/Session.java | 30 ++++++------- .../tcp/client/session/SessionContext.java | 4 +- .../tcp/client/session/SessionState.java | 2 +- .../client/session/push/ClientAckContext.java | 10 ++--- .../session/push/DownStreamMsgContext.java | 12 +++--- .../tcp/client/session/push/PushContext.java | 6 +-- .../client/session/push/SessionPusher.java | 20 ++++----- .../session/push/retry/ProxyTcpRetryer.java | 20 ++++----- .../session/send/ProxyTcpSendResult.java | 2 +- .../session/send/ProxyTcpSendStatus.java | 2 +- .../client/session/send/SessionSender.java | 24 +++++------ .../session/send/UpStreamMsgContext.java | 6 +-- .../tcp/client/task/AbstractTask.java | 8 ++-- .../protocol/tcp/client/task/GoodbyeTask.java | 20 ++++----- .../tcp/client/task/HeartBeatTask.java | 14 +++---- .../protocol/tcp/client/task/HelloTask.java | 22 +++++----- .../protocol/tcp/client/task/ListenTask.java | 12 +++--- .../tcp/client/task/MessageAckTask.java | 10 ++--- .../tcp/client/task/MessageTransferTask.java | 30 ++++++------- .../tcp/client/task/SubscribeTask.java | 18 ++++---- .../tcp/client/task/UnSubscribeTask.java | 14 +++---- .../metrics/MonitorMetricConstants.java | 2 +- .../emesher/metrics/http/GroupMetrics.java | 4 +- .../metrics/http/HTTPMetricsServer.java | 4 +- .../emesher/metrics/http/HealthMetrics.java | 4 +- .../emesher/metrics/http/SummaryMetrics.java | 4 +- .../metrics/http/TcpSummaryMetrics.java | 4 +- .../emesher/metrics/http/TopicMetrics.java | 4 +- .../emesher/metrics/tcp/ProxyTcpMonitor.java | 16 +++---- .../threads/DelegatedExecutorService.java | 2 +- .../DelegatedScheduledExecutorService.java | 2 +- .../threads/ProxyThreadFactoryImpl.java | 2 +- .../threads/SharedEventExecutorGroup.java | 2 +- .../threads/SharedExecutorService.java | 2 +- .../threads/SharedNioEventLoopGroup.java | 2 +- .../SharedScheduledExecutorService.java | 2 +- .../emesher/threads/ThreadPoolHelper.java | 6 +-- .../webank/emesher/util/ProxyUtil.java | 12 +++--- .../webank/emesher/util/ServerGlobal.java | 2 +- .../webank/emesher/util/Utils.java | 16 +++---- .../webank/emesher/util/ValueComparator.java | 2 +- .../ConsumeMessageConcurrentlyService.java | 2 +- .../ProxyMessageListenerConcurrentlyOnce.java | 2 +- .../impl/consumer/PullMessageService.java | 2 +- .../client/impl/consumer/RebalanceImpl.java | 2 +- .../impl/consumer/RebalanceService.java | 2 +- .../client/impl/factory/MQClientInstance.java | 2 +- .../impl/producer/DefaultMQProducerImpl.java | 2 +- .../remoting/netty/NettyRemotingClient.java | 2 +- .../src/test/java/client/ProxyClient.java | 2 +- .../src/test/java/client/PubClient.java | 4 +- .../src/test/java/client/SubClient.java | 4 +- .../src/test/java/client/common/Codec.java | 16 +++---- .../test/java/client/common/MessageUtils.java | 12 +++--- .../java/client/common/RequestContext.java | 2 +- .../src/test/java/client/common/Server.java | 4 +- .../test/java/client/common/TCPClient.java | 2 +- .../java/client/common/UserAgentUtils.java | 4 +- .../test/java/client/hook/ReceiveMsgHook.java | 2 +- .../java/client/impl/ProxyClientImpl.java | 4 +- .../test/java/client/impl/PubClientImpl.java | 8 ++-- .../test/java/client/impl/SubClientImpl.java | 8 ++-- .../src/test/java/demo/AsyncPubClient.java | 4 +- .../src/test/java/demo/AsyncSubClient.java | 4 +- .../test/java/demo/BroadCastPubClient.java | 2 +- .../test/java/demo/BroadCastSubClient.java | 6 +-- .../src/test/java/demo/CCSubClient.java | 4 +- .../src/test/java/demo/CClientDemo.java | 4 +- .../src/test/java/demo/SyncPubClient.java | 4 +- .../src/test/java/demo/SyncSubClient.java | 4 +- .../java/protocol/CmdAsync2ClientTest.java | 4 +- .../java/protocol/CmdAsync2ServerTest.java | 4 +- .../protocol/CmdBroadCast2ClientTest.java | 4 +- .../protocol/CmdBroadCast2ServerTest.java | 4 +- .../java/protocol/CmdClientGoodByTest.java | 4 +- .../test/java/protocol/CmdHeartbeatTest.java | 4 +- .../src/test/java/protocol/CmdListenTest.java | 4 +- .../test/java/protocol/CmdRecommendTest.java | 4 +- .../src/test/java/protocol/CmdSendRRTest.java | 4 +- .../test/java/protocol/CmdSubscribeTest.java | 4 +- .../src/test/java/protocol/CmdSysLogTest.java | 2 +- .../test/java/protocol/CmdTraceLogTest.java | 2 +- .../java/protocol/CmdUnSubscribeTest.java | 4 +- .../src/test/java/test/BasicTest.java | 4 +- eventmesh-registry/build.gradle | 2 +- eventmesh-sdk-java/gradle.properties | 6 +-- .../client/http/AbstractLiteClient.java | 16 +++---- .../eventmesh/client/http/ProxyRetObj.java | 2 +- .../eventmesh/client/http/RemotingServer.java | 34 +++++++-------- .../client/http/conf/LiteClientConfig.java | 2 +- .../client/http/consumer/HandleResult.java | 2 +- .../client/http/consumer/LiteConsumer.java | 16 +++---- .../consumer/context/LiteConsumeContext.java | 4 +- .../listener/LiteMessageListener.java | 8 ++-- .../eventmesh/client/http/http/HttpUtil.java | 4 +- .../client/http/http/RequestParam.java | 2 +- .../client/http/producer/LiteProducer.java | 32 +++++++------- .../client/http/producer/RRCallback.java | 4 +- .../RRCallbackResponseHandlerAdapter.java | 14 +++---- .../eventmesh/client/tcp/SimplePubClient.java | 10 ++--- .../eventmesh/client/tcp/SimpleSubClient.java | 6 +-- .../client/tcp/WemqAccessClient.java | 8 ++-- .../client/tcp/common/AsyncRRCallback.java | 4 +- .../client/tcp/common/MessageUtils.java | 12 +++--- .../client/tcp/common/ReceiveMsgHook.java | 4 +- .../client/tcp/common/RequestContext.java | 4 +- .../client/tcp/common/TcpClient.java | 6 +-- .../client/tcp/common/WemqAccessCommon.java | 2 +- .../common/WemqAccessThreadFactoryImpl.java | 2 +- .../tcp/impl/DefaultWemqAccessClient.java | 18 ++++---- .../client/tcp/impl/SimplePubClientImpl.java | 24 +++++------ .../client/tcp/impl/SimpleSubClientImpl.java | 22 +++++----- .../src/main/resources/log4j2.xml | 2 +- .../http/demo/AsyncPublishInstance.java | 14 +++---- .../http/demo/AsyncSyncRequestInstance.java | 16 +++---- .../client/http/demo/SyncRequestInstance.java | 14 +++---- .../tcp/common/AccessTestCaseTopicSet.java | 2 +- .../client/tcp/common/AccessTestUtils.java | 16 +++---- .../client/tcp/demo/AsyncPublish.java | 16 +++---- .../tcp/demo/AsyncPublishBroadcast.java | 14 +++---- .../client/tcp/demo/AsyncSubscribe.java | 20 ++++----- .../tcp/demo/AsyncSubscribeBroadcast.java | 20 ++++----- .../client/tcp/demo/SyncRequest.java | 14 +++---- .../client/tcp/demo/SyncResponse.java | 18 ++++---- .../src/test/resources/log4j2.xml | 2 +- gradle.properties | 2 +- 268 files changed, 1104 insertions(+), 1112 deletions(-) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/Constants.java (98%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/IPUtil.java (99%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/LiteMessage.java (98%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/ProxyException.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/ThreadPoolFactory.java (99%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/ThreadUtil.java (98%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/command/HttpCommand.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/BaseRequestBody.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/BaseResponseBody.java (93%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/Body.java (78%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/HeartbeatResponseBody.java (91%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/RegRequestBody.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/RegResponseBody.java (91%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java (93%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/SubscribeResponseBody.java (93%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/UnRegRequestBody.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/UnRegResponseBody.java (91%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java (93%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/client/UnSubscribeResponseBody.java (93%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/PushMessageRequestBody.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/PushMessageResponseBody.java (91%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/ReplyMessageResponseBody.java (91%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchResponseBody.java (91%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2ResponseBody.java (91%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/body/message/SendMessageResponseBody.java (92%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/common/ClientRetCode.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/common/ClientType.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/common/ProtocolKey.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/common/ProtocolVersion.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/common/ProxyRetCode.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/common/RequestCode.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/BaseRequestHeader.java (93%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/BaseResponseHeader.java (92%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/Header.java (77%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/RegRequestHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/RegResponseHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java (92%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java (92%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java (92%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java (92%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java (94%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java (94%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java (95%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/AccessMessage.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/Command.java (98%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/Header.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/HeartBeatInfo.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/OPStatus.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/Package.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/ProxyClientInfo.java (98%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/RedirectInfo.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/RegisterInfo.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/Subscription.java (96%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/UnRegisterInfo.java (97%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/UserAgent.java (99%) rename eventmesh-common/src/main/java/{cn => com}/webank/eventmesh/common/protocol/tcp/codec/Codec.java (93%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/defibus/client/impl/factory/DeFiBusClientInstance.java (97%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/admin/controller/ClientManageController.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/boot/AbrstractHTTPServer.java (95%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/boot/AbstractRemotingServer.java (97%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/boot/ProxyHTTPServer.java (87%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/boot/ProxyServer.java (93%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/boot/ProxyStartup.java (89%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/boot/ProxyTCPServer.java (92%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/common/Pair.java (97%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/common/ServiceState.java (96%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/configuration/AccessConfiguration.java (99%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/configuration/CommonConfiguration.java (99%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/configuration/ConfigurationWraper.java (96%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/configuration/ProxyConfiguration.java (99%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/constants/ProxyConstants.java (99%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/constants/ProxyVersion.java (96%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/consumergroup/ConsumerGroupConf.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/consumergroup/ConsumerGroupTopicConf.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/consumergroup/ProducerGroupConf.java (97%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/consumergroup/event/ConsumerGroupStateEvent.java (92%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/consumergroup/event/ConsumerGroupTopicConfChangeEvent.java (92%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/async/AsyncContext.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/async/CompleteHandler.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/consumer/ConsumerGroupManager.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/consumer/ConsumerManager.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/consumer/HandleMsgContext.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java (93%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/AdminMetricsProcessor.java (83%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/AdminShutdownProcessor.java (79%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/BatchSendMessageProcessor.java (91%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/BatchSendMessageV2Processor.java (90%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/ReplyMessageProcessor.java (90%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/SendAsyncMessageProcessor.java (90%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/SendSyncMessageProcessor.java (91%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/SubscribeProcessor.java (78%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/UnSubscribeProcessor.java (79%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/processor/inf/HttpRequestProcessor.java (85%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/producer/ProducerManager.java (95%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/producer/ProxyProducer.java (91%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/producer/SendMessageContext.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/push/AbstractHTTPPushRequest.java (90%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/push/AsyncHTTPPushRequest.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/push/HTTPClientPool.java (97%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/push/HTTPMessageHandler.java (93%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/push/MessageHandler.java (87%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/retry/DelayRetryable.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/retry/HttpRetryer.java (97%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/http/retry/RetryContext.java (96%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/ProxyTcp2Client.java (88%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/ProxyTcpConnectionHandler.java (97%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/ProxyTcpExceptionHandler.java (88%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/ProxyTcpMessageDispatcher.java (85%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java (96%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/group/ClientSessionGroupMapping.java (96%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/group/dispatch/DownstreamDispatchStrategy.java (88%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/Session.java (92%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/SessionContext.java (93%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/SessionState.java (93%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/push/ClientAckContext.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/push/DownStreamMsgContext.java (93%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/push/PushContext.java (95%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java (92%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/push/retry/ProxyTcpRetryer.java (94%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendResult.java (95%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendStatus.java (93%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java (92%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/session/send/UpStreamMsgContext.java (90%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/task/AbstractTask.java (87%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/task/GoodbyeTask.java (78%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/task/HeartBeatTask.java (82%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/task/HelloTask.java (87%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/task/ListenTask.java (85%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/task/MessageAckTask.java (87%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java (90%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/task/SubscribeTask.java (85%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/core/protocol/tcp/client/task/UnSubscribeTask.java (87%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/metrics/MonitorMetricConstants.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/metrics/http/GroupMetrics.java (92%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/metrics/http/HTTPMetricsServer.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/metrics/http/HealthMetrics.java (93%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/metrics/http/SummaryMetrics.java (99%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/metrics/http/TcpSummaryMetrics.java (99%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/metrics/http/TopicMetrics.java (92%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/metrics/tcp/ProxyTcpMonitor.java (95%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/threads/DelegatedExecutorService.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/threads/DelegatedScheduledExecutorService.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/threads/ProxyThreadFactoryImpl.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/threads/SharedEventExecutorGroup.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/threads/SharedExecutorService.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/threads/SharedNioEventLoopGroup.java (98%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/threads/SharedScheduledExecutorService.java (99%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/threads/ThreadPoolHelper.java (99%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/util/ProxyUtil.java (97%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/util/ServerGlobal.java (97%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/util/Utils.java (95%) rename eventmesh-emesher/src/main/java/{cn => com}/webank/emesher/util/ValueComparator.java (97%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/AbstractLiteClient.java (94%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/ProxyRetObj.java (96%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/RemotingServer.java (93%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/conf/LiteClientConfig.java (99%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/consumer/HandleResult.java (94%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/consumer/LiteConsumer.java (89%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/consumer/context/LiteConsumeContext.java (97%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/consumer/listener/LiteMessageListener.java (79%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/http/HttpUtil.java (99%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/http/RequestParam.java (98%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/producer/LiteProducer.java (92%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/producer/RRCallback.java (90%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/http/producer/RRCallbackResponseHandlerAdapter.java (90%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/SimplePubClient.java (83%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/SimpleSubClient.java (88%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/WemqAccessClient.java (87%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/common/AsyncRRCallback.java (90%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/common/MessageUtils.java (93%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/common/ReceiveMsgHook.java (91%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/common/RequestContext.java (96%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/common/TcpClient.java (96%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/common/WemqAccessCommon.java (98%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/common/WemqAccessThreadFactoryImpl.java (97%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/impl/DefaultWemqAccessClient.java (87%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/impl/SimplePubClientImpl.java (90%) rename eventmesh-sdk-java/src/main/java/{cn => com}/webank/eventmesh/client/tcp/impl/SimpleSubClientImpl.java (90%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/http/demo/AsyncPublishInstance.java (85%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/http/demo/AsyncSyncRequestInstance.java (91%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/http/demo/SyncRequestInstance.java (93%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/tcp/common/AccessTestCaseTopicSet.java (86%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/tcp/common/AccessTestUtils.java (90%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/tcp/demo/AsyncPublish.java (69%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/tcp/demo/AsyncPublishBroadcast.java (69%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/tcp/demo/AsyncSubscribe.java (68%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/tcp/demo/AsyncSubscribeBroadcast.java (68%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/tcp/demo/SyncRequest.java (69%) rename eventmesh-sdk-java/src/test/java/{cn => com}/webank/eventmesh/client/tcp/demo/SyncResponse.java (71%) diff --git a/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md index aa255bf1ea..fb7abd3c03 100644 --- a/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md +++ b/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md @@ -22,7 +22,7 @@ sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} *启动消费者,订阅上一步骤已经创建的Topic ``` -运行cn.webank.eventmesh.client.tcp.demo.SyncResponse的主要方法 +运行com.webank.eventmesh.client.tcp.demo.SyncResponse的主要方法 ``` @@ -30,7 +30,7 @@ sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} 启动发送端,发送消息 ``` -运行cn.webank.eventmesh.client.tcp.demo.SyncRequest的主要方法 +运行com.webank.eventmesh.client.tcp.demo.SyncRequest的主要方法 ``` @@ -48,7 +48,7 @@ sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} - 启动消费者,订阅上一步骤已经创建的Topic ``` -运行cn.webank.eventmesh.client.tcp.demo.AsyncSubscribe的主要方法 +运行com.webank.eventmesh.client.tcp.demo.AsyncSubscribe的主要方法 ``` @@ -56,7 +56,7 @@ sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} 启动发送端,发送消息 ``` -运行cn.webank.eventmesh.client.tcp.demo.AsyncPublish的主要方法 +运行com.webank.eventmesh.client.tcp.demo.AsyncPublish的主要方法 ``` @@ -74,7 +74,7 @@ sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} - 启动消费端,订阅上一步骤已经创建的Topic ``` -运行cn.webank.eventmesh.client.tcp.demo.AsyncSubscribeBroadcast的主要方法 +运行com.webank.eventmesh.client.tcp.demo.AsyncSubscribeBroadcast的主要方法 ``` @@ -82,7 +82,7 @@ sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} *启动发送端,发送广播消息 ``` -运行cn.webank.eventmesh.client.tcp.demo.AsyncPublishBroadcast的主要方法 +运行com.webank.eventmesh.client.tcp.demo.AsyncPublishBroadcast的主要方法 ``` ### 2. HTTP演示 @@ -98,7 +98,7 @@ sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} >发送消息,生产者需要等到收到用户的响应消息 ``` -运行cn.webank.eventmesh.client.http.demo.SyncRequestInstance的主要方法 +运行com.webank.eventmesh.client.http.demo.SyncRequestInstance的主要方法 ``` @@ -106,7 +106,7 @@ sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} >发送消息,生产者在回调中处理响应消息 ``` -运行cn.webank.eventmesh.client.http.demo.AsyncSyncRequestInstance的主要方法 +运行com.webank.eventmesh.client.http.demo.AsyncSyncRequestInstance的主要方法 ``` @@ -114,5 +114,5 @@ sh runadmin.sh updateTopic -c $ {ClusterName} -t $ {topic} -n $ {namesrvAddr} ####异步消息 ``` -运行cn.webank.eventmesh.client.http.demo.AsyncPublishInstance的主要方法 +运行com.webank.eventmesh.client.http.demo.AsyncPublishInstance的主要方法 ``` \ No newline at end of file diff --git a/docs/en/instructions/eventmesh-sdk-java-quickstart.md b/docs/en/instructions/eventmesh-sdk-java-quickstart.md index 321273d32e..2a79694f6e 100644 --- a/docs/en/instructions/eventmesh-sdk-java-quickstart.md +++ b/docs/en/instructions/eventmesh-sdk-java-quickstart.md @@ -22,7 +22,7 @@ sh runadmin.sh updateTopic -c ${ClusterName} -t ${topic} -n ${namesrvAddr} * start consumer ,subscribe topic in previous step. ``` -Run the main method of cn.webank.eventmesh.client.tcp.demo.SyncResponse +Run the main method of SyncResponse ``` @@ -30,7 +30,7 @@ Run the main method of cn.webank.eventmesh.client.tcp.demo.SyncResponse * start producer, send message ``` -Run the main method of cn.webank.eventmesh.client.tcp.demo.SyncRequest +Run the main method of SyncRequest ``` @@ -48,7 +48,7 @@ sh runadmin.sh updateTopic -c ${ClusterName} -t ${topic} -n ${namesrvAddr} - start consumer ,subscribe topic in previous step. ``` -Run the main method of cn.webank.eventmesh.client.tcp.demo.AsyncSubscribe +Run the main method of AsyncSubscribe ``` @@ -56,7 +56,7 @@ Run the main method of cn.webank.eventmesh.client.tcp.demo.AsyncSubscribe start producer, send message ``` -Run the main method of cn.webank.eventmesh.client.tcp.demo.AsyncPublish +Run the main method of AsyncPublish ``` @@ -74,7 +74,7 @@ sh runadmin.sh updateTopic -c ${ClusterName} -t ${topic} -n ${namesrvAddr} - start consumer ,subscribe topic in previous step. ``` -Run the main method of cn.webank.eventmesh.client.tcp.demo.AsyncSubscribeBroadcast +Run the main method of AsyncSubscribeBroadcast ``` @@ -82,7 +82,7 @@ Run the main method of cn.webank.eventmesh.client.tcp.demo.AsyncSubscribeBroadca * start producer, send broadcast message ``` -Run the main method of cn.webank.eventmesh.client.tcp.demo.AsyncPublishBroadcast +Run the main method of AsyncPublishBroadcast ``` ### 2. HTTP DEMO @@ -98,7 +98,7 @@ Run the main method of cn.webank.eventmesh.client.tcp.demo.AsyncPublishBroadcast > send msg ,producer need waiting until receive the response msg of consumer ``` -Run the main method of cn.webank.eventmesh.client.http.demo.SyncRequestInstance +Run the main method of SyncRequestInstance ``` @@ -106,7 +106,7 @@ Run the main method of cn.webank.eventmesh.client.http.demo.SyncRequestInstance > send msg,producer handles the reponse msg in callback ``` -Run the main method ofcn.webank.eventmesh.client.http.demo.AsyncSyncRequestInstance +Run the main method of com.webank.eventmesh.client.http.demo.AsyncSyncRequestInstance ``` @@ -114,6 +114,6 @@ Run the main method ofcn.webank.eventmesh.client.http.demo.AsyncSyncRequestInsta #### Async msg ``` -Run the main method of cn.webank.eventmesh.client.http.demo.AsyncPublishInstance +Run the main method of AsyncPublishInstance ``` diff --git a/eventmesh-common/gradle.properties b/eventmesh-common/gradle.properties index 9c2064832f..df9d8705c2 100644 --- a/eventmesh-common/gradle.properties +++ b/eventmesh-common/gradle.properties @@ -15,8 +15,8 @@ # limitations under the License. # -group=cn.webank.eventmesh -version=1.0.0-SNAPSHOT -defibus_version=1.0.0 +group=com.webank.eventmesh +version=1.0.0 +defibus_version=1.0.1 jdk=1.7 snapshot=false diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/Constants.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/Constants.java similarity index 98% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/Constants.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/Constants.java index 6451da47a7..75615d562c 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/Constants.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/Constants.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common; +package com.webank.eventmesh.common; public class Constants { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/IPUtil.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/IPUtil.java similarity index 99% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/IPUtil.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/IPUtil.java index 8ea7c0a690..e0b7826b64 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/IPUtil.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/IPUtil.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common; +package com.webank.eventmesh.common; import io.netty.channel.Channel; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/LiteMessage.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/LiteMessage.java similarity index 98% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/LiteMessage.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/LiteMessage.java index 7fe682660a..e0d9666bf7 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/LiteMessage.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/LiteMessage.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common; +package com.webank.eventmesh.common; import org.apache.commons.lang3.time.DateFormatUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/ProxyException.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/ProxyException.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/ProxyException.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/ProxyException.java index d8d32e25de..7c5bda8b25 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/ProxyException.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/ProxyException.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common; +package com.webank.eventmesh.common; public class ProxyException extends Exception { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/ThreadPoolFactory.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/ThreadPoolFactory.java similarity index 99% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/ThreadPoolFactory.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/ThreadPoolFactory.java index 6a92cebaed..3edfec776a 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/ThreadPoolFactory.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/ThreadPoolFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common; +package com.webank.eventmesh.common; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executors; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/ThreadUtil.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/ThreadUtil.java similarity index 98% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/ThreadUtil.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/ThreadUtil.java index 1da061d4da..3a25b806b3 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/ThreadUtil.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/ThreadUtil.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common; +package com.webank.eventmesh.common; import java.util.concurrent.ThreadLocalRandom; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/command/HttpCommand.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/command/HttpCommand.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/command/HttpCommand.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/command/HttpCommand.java index 47ab69b621..4ac40a0b99 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/command/HttpCommand.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/command/HttpCommand.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.command; +package com.webank.eventmesh.common.command; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.BaseResponseBody; -import cn.webank.eventmesh.common.protocol.http.body.Body; -import cn.webank.eventmesh.common.protocol.http.header.BaseResponseHeader; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.body.BaseResponseBody; +import com.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.header.BaseResponseHeader; +import com.webank.eventmesh.common.protocol.http.header.Header; import com.alibaba.fastjson.JSON; import io.netty.buffer.Unpooled; import io.netty.handler.codec.http.DefaultFullHttpResponse; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/BaseRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/BaseRequestBody.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/BaseRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/BaseRequestBody.java index e321f37273..23107ffe08 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/BaseRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/BaseRequestBody.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body; +package com.webank.eventmesh.common.protocol.http.body; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/BaseResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/BaseResponseBody.java similarity index 93% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/BaseResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/BaseResponseBody.java index a83b3ddd6c..4f17ffe57a 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/BaseResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/BaseResponseBody.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body; +package com.webank.eventmesh.common.protocol.http.body; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/Body.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/Body.java similarity index 78% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/Body.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/Body.java index e03c078044..6750e25f63 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/Body.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/Body.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body; +package com.webank.eventmesh.common.protocol.http.body; -import cn.webank.eventmesh.common.protocol.http.body.client.HeartbeatRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.client.UnRegRequestBody; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.eventmesh.common.protocol.http.body.client.RegRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.PushMessageRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.ReplyMessageRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchV2RequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageRequestBody; +import com.webank.eventmesh.common.protocol.http.body.client.HeartbeatRequestBody; +import com.webank.eventmesh.common.protocol.http.body.client.UnRegRequestBody; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.eventmesh.common.protocol.http.body.client.RegRequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.PushMessageRequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.ReplyMessageRequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchRequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchV2RequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageRequestBody; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java index fa87498852..115e91c288 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.body.Body; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/HeartbeatResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/HeartbeatResponseBody.java similarity index 91% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/HeartbeatResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/HeartbeatResponseBody.java index 0c00ee3925..fd49b5df8c 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/HeartbeatResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/HeartbeatResponseBody.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.body.Body; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/RegRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/RegRequestBody.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/RegRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/RegRequestBody.java index 5561ceaefc..8739590bf6 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/RegRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/RegRequestBody.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.body.Body; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/RegResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/RegResponseBody.java similarity index 91% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/RegResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/RegResponseBody.java index ecaa3e9a7f..cffd492eb6 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/RegResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/RegResponseBody.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.body.Body; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java similarity index 93% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java index 89a3322511..690995cf8d 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; public class SubscribeRequestBody { } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/SubscribeResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/SubscribeResponseBody.java similarity index 93% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/SubscribeResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/SubscribeResponseBody.java index 3218491184..b0249e22ec 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/SubscribeResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/SubscribeResponseBody.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; public class SubscribeResponseBody { } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnRegRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnRegRequestBody.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnRegRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnRegRequestBody.java index 4924e9660a..f0e0b7c111 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnRegRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnRegRequestBody.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.body.Body; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnRegResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnRegResponseBody.java similarity index 91% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnRegResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnRegResponseBody.java index 7ac28d0bca..3b1a033b6e 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnRegResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnRegResponseBody.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.body.Body; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java similarity index 93% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java index 3bfcd7d04e..c6b6e30571 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; public class UnSubscribeRequestBody { } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnSubscribeResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnSubscribeResponseBody.java similarity index 93% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnSubscribeResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnSubscribeResponseBody.java index 40239067f2..1ecfb884aa 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/client/UnSubscribeResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/client/UnSubscribeResponseBody.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.client; +package com.webank.eventmesh.common.protocol.http.body.client; public class UnSubscribeResponseBody { } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/PushMessageRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/PushMessageRequestBody.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/PushMessageRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/PushMessageRequestBody.java index 9298dcfd34..dbd0ce45c0 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/PushMessageRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/PushMessageRequestBody.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.body.Body; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/PushMessageResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/PushMessageResponseBody.java similarity index 91% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/PushMessageResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/PushMessageResponseBody.java index 72b2076a53..8b1f28e5a2 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/PushMessageResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/PushMessageResponseBody.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.Body; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java index 6662fa8df0..ebf9a69ef8 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.body.Body; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/ReplyMessageResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/ReplyMessageResponseBody.java similarity index 91% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/ReplyMessageResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/ReplyMessageResponseBody.java index 3cdd5371f4..99b6a42939 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/ReplyMessageResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/ReplyMessageResponseBody.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.body.Body; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java index aeaba830b8..067d398c06 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.body.Body; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchResponseBody.java similarity index 91% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchResponseBody.java index 309ecdfd9a..45ffb0dd7b 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchResponseBody.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.Body; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java index 0c4683b375..3532da883c 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.body.Body; import org.apache.commons.collections4.MapUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2ResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2ResponseBody.java similarity index 91% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2ResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2ResponseBody.java index b94c796b42..bc5d9b1b5e 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2ResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageBatchV2ResponseBody.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.Body; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java index f7b258f211..d123b61694 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.body.Body; import com.alibaba.fastjson.JSONObject; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageResponseBody.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageResponseBody.java similarity index 92% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageResponseBody.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageResponseBody.java index c05b1fa6fe..375878439c 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/body/message/SendMessageResponseBody.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/body/message/SendMessageResponseBody.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.body.message; +package com.webank.eventmesh.common.protocol.http.body.message; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.body.Body; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ClientRetCode.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ClientRetCode.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ClientRetCode.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ClientRetCode.java index 9b343a6d8a..2da7563072 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ClientRetCode.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ClientRetCode.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.common; +package com.webank.eventmesh.common.protocol.http.common; public enum ClientRetCode { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ClientType.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ClientType.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ClientType.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ClientType.java index f5fc613d9d..4ddeb826ab 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ClientType.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ClientType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.common; +package com.webank.eventmesh.common.protocol.http.common; public enum ClientType { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ProtocolKey.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProtocolKey.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ProtocolKey.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProtocolKey.java index d7a86f4917..aa4bda3133 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ProtocolKey.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProtocolKey.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.common; +package com.webank.eventmesh.common.protocol.http.common; public class ProtocolKey { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ProtocolVersion.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProtocolVersion.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ProtocolVersion.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProtocolVersion.java index 27170db721..9c3e14e05a 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ProtocolVersion.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProtocolVersion.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.common; +package com.webank.eventmesh.common.protocol.http.common; public enum ProtocolVersion { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ProxyRetCode.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProxyRetCode.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ProxyRetCode.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProxyRetCode.java index c3ec18a646..b9b2e908b3 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/ProxyRetCode.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProxyRetCode.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.common; +package com.webank.eventmesh.common.protocol.http.common; public enum ProxyRetCode { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/RequestCode.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/RequestCode.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/RequestCode.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/RequestCode.java index e65369f452..dd6c4341b0 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/common/RequestCode.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/RequestCode.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.common; +package com.webank.eventmesh.common.protocol.http.common; public enum RequestCode { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/BaseRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/BaseRequestHeader.java similarity index 93% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/BaseRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/BaseRequestHeader.java index 0094e8bb38..962c2600c1 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/BaseRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/BaseRequestHeader.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header; +package com.webank.eventmesh.common.protocol.http.header; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; import org.apache.commons.collections4.MapUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/BaseResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/BaseResponseHeader.java similarity index 92% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/BaseResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/BaseResponseHeader.java index 5254f183fe..30cbbbdd7f 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/BaseResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/BaseResponseHeader.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header; +package com.webank.eventmesh.common.protocol.http.header; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/Header.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/Header.java similarity index 77% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/Header.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/Header.java index 33edb5e05f..c4fd267728 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/Header.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/Header.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header; +package com.webank.eventmesh.common.protocol.http.header; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.eventmesh.common.protocol.http.header.client.HeartbeatRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.client.RegRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.client.UnRegRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.PushMessageRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchV2RequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.ReplyMessageRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchRequestHeader; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.eventmesh.common.protocol.http.header.client.HeartbeatRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.client.RegRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.client.UnRegRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.PushMessageRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchV2RequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.ReplyMessageRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchRequestHeader; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java index 10a65aa4d8..263411ab7a 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.header.Header; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java index 162a6512eb..14e0d30493 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.header.Header; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/RegRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/RegRequestHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/RegRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/RegRequestHeader.java index 4b21501099..1ed7bc3643 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/RegRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/RegRequestHeader.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.header.Header; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/RegResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/RegResponseHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/RegResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/RegResponseHeader.java index 0da3c147f7..09fdbfe5a1 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/RegResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/RegResponseHeader.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.header.Header; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java similarity index 92% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java index aa70e5cd11..418164b845 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; public class SubscribeRequestHeader { } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java similarity index 92% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java index c9753e69aa..11d73f01dd 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; public class SubscribeResponseHeader { } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java index 67da669235..ce6fb8e22c 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.header.Header; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java index f9cfcc95a1..0a61cbbb63 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.header.Header; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java similarity index 92% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java index 3d746ad8d7..e1ee35bde9 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; public class UnSubscribeRequestHeader { } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java similarity index 92% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java index bdfaceeae0..8eda4f4d5a 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.client; +package com.webank.eventmesh.common.protocol.http.header.client; public class UnSubscribeResponseHeader { } diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java similarity index 94% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java index 17800e53e4..9a885b68db 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.header.Header; import org.apache.commons.collections4.MapUtils; import java.util.HashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java similarity index 94% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java index d31dfd24ab..fa0af32fa5 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.header.Header; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java index b5c132f2fa..0a22a8b071 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.header.Header; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java index a1e2feb41a..6a681079a1 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.header.Header; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java index 622e7bad54..041e6ed4ce 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.header.Header; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java index ea44ea0c9f..8fc000da7a 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.header.Header; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java index daca252db0..7a2972612b 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.header.Header; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java index 88afd18f87..93a033476c 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.header.Header; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java index 52fd0f42e4..515f0dfc3d 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.header.Header; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java similarity index 95% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java index 3e807e9a4f..9272371a67 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.http.header.message; +package com.webank.eventmesh.common.protocol.http.header.message; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.header.Header; import java.util.HashMap; import java.util.Map; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/AccessMessage.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/AccessMessage.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/AccessMessage.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/AccessMessage.java index edb1019ecc..64c4e57359 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/AccessMessage.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/AccessMessage.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Command.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Command.java similarity index 98% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Command.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Command.java index 9af620cac9..f713d7020f 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Command.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Command.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; public enum Command { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Header.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Header.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Header.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Header.java index 7d1fdd06cd..70a51075e3 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Header.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Header.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; public class Header { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/HeartBeatInfo.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/HeartBeatInfo.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/HeartBeatInfo.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/HeartBeatInfo.java index 36559fa68d..0e421eb966 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/HeartBeatInfo.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/HeartBeatInfo.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; import java.util.List; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/OPStatus.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/OPStatus.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/OPStatus.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/OPStatus.java index cce875180a..56089c4e39 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/OPStatus.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/OPStatus.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; public enum OPStatus { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Package.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Package.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Package.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Package.java index 07e2d548bb..051c3223e2 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Package.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Package.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; public class Package { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/ProxyClientInfo.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/ProxyClientInfo.java similarity index 98% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/ProxyClientInfo.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/ProxyClientInfo.java index b27d54b7b8..227b394390 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/ProxyClientInfo.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/ProxyClientInfo.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; import org.apache.rocketmq.common.DataVersion; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/RedirectInfo.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/RedirectInfo.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/RedirectInfo.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/RedirectInfo.java index ea3f1654cc..40a19db587 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/RedirectInfo.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/RedirectInfo.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; public class RedirectInfo { private String ip; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/RegisterInfo.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/RegisterInfo.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/RegisterInfo.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/RegisterInfo.java index 725435b360..0e5867506e 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/RegisterInfo.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/RegisterInfo.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; import java.util.List; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Subscription.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Subscription.java similarity index 96% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Subscription.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Subscription.java index 85da1b5f92..2c965bcc36 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/Subscription.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/Subscription.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; import java.util.LinkedList; import java.util.List; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/UnRegisterInfo.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/UnRegisterInfo.java similarity index 97% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/UnRegisterInfo.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/UnRegisterInfo.java index 422635d680..6c0626de7a 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/UnRegisterInfo.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/UnRegisterInfo.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; import java.util.List; diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/UserAgent.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/UserAgent.java similarity index 99% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/UserAgent.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/UserAgent.java index 987a54b23d..07200a70d3 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/UserAgent.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/UserAgent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp; +package com.webank.eventmesh.common.protocol.tcp; public class UserAgent { diff --git a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/codec/Codec.java b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/codec/Codec.java similarity index 93% rename from eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/codec/Codec.java rename to eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/codec/Codec.java index 95381a37f0..4935522986 100644 --- a/eventmesh-common/src/main/java/cn/webank/eventmesh/common/protocol/tcp/codec/Codec.java +++ b/eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/tcp/codec/Codec.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package cn.webank.eventmesh.common.protocol.tcp.codec; - -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.RedirectInfo; -import cn.webank.eventmesh.common.protocol.tcp.Subscription; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +package com.webank.eventmesh.common.protocol.tcp.codec; + +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.RedirectInfo; +import com.webank.eventmesh.common.protocol.tcp.Subscription; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/eventmesh-emesher/bin/start.sh b/eventmesh-emesher/bin/start.sh index 30eb9b429a..305889137b 100644 --- a/eventmesh-emesher/bin/start.sh +++ b/eventmesh-emesher/bin/start.sh @@ -38,7 +38,7 @@ function is_java8 { #0(not running), 1(is running) #function is_proxyRunning { # local _pid="$1" -# local pid=`ps ax | grep -i 'cn.webank.emesher.boot.ProxyStartup' |grep java | grep -v grep | awk '{print $1}'|grep $_pid` +# local pid=`ps ax | grep -i 'com.webank.emesher.boot.ProxyStartup' |grep java | grep -v grep | awk '{print $1}'|grep $_pid` # if [ -z "$pid" ] ; then # return 0 # else @@ -53,13 +53,13 @@ function get_pid { else if [[ $OS =~ Msys ]]; then # 在Msys上存在可能无法kill识别出的进程的BUG - ppid=`jps -v | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep java | grep -v grep | awk -F ' ' {'print $1'}` + ppid=`jps -v | grep -i "com.webank.emesher.boot.ProxyStartup" | grep java | grep -v grep | awk -F ' ' {'print $1'}` elif [[ $OS =~ Darwin ]]; then # 已知问题:grep java 可能无法精确识别java进程 - ppid=$(/bin/ps -o user,pid,command | grep "java" | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) + ppid=$(/bin/ps -o user,pid,command | grep "java" | grep -i "com.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) else #在Linux服务器上要求尽可能精确识别进程 - ppid=$(ps -C java -o user,pid,command --cols 99999 | grep -w $PROXY_HOME | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) + ppid=$(ps -C java -o user,pid,command --cols 99999 | grep -w $PROXY_HOME | grep -i "com.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) fi fi echo "$ppid"; @@ -154,7 +154,7 @@ make_logs_dir echo "using jdk[$JAVA]" >> ${PROXY_LOG_HOME}/proxy.out -PROXY_MAIN=cn.webank.emesher.boot.ProxyStartup +PROXY_MAIN=com.webank.emesher.boot.ProxyStartup $JAVA $JAVA_OPT -classpath ${PROXY_HOME}/conf:${PROXY_HOME}/apps/*:${PROXY_HOME}/lib/* $PROXY_MAIN >> ${PROXY_LOG_HOME}/proxy.out 2>&1 & echo $!>pid.file exit 0 diff --git a/eventmesh-emesher/bin/stop.sh b/eventmesh-emesher/bin/stop.sh index 9bda9df513..8476636c13 100644 --- a/eventmesh-emesher/bin/stop.sh +++ b/eventmesh-emesher/bin/stop.sh @@ -14,13 +14,13 @@ function get_pid { else if [[ $OS =~ Msys ]]; then # 在Msys上存在可能无法kill识别出的进程的BUG - ppid=`jps -v | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep java | grep -v grep | awk -F ' ' {'print $1'}` + ppid=`jps -v | grep -i "com.webank.emesher.boot.ProxyStartup" | grep java | grep -v grep | awk -F ' ' {'print $1'}` elif [[ $OS =~ Darwin ]]; then # 已知问题:grep java 可能无法精确识别java进程 - ppid=$(/bin/ps -o user,pid,command | grep "java" | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) + ppid=$(/bin/ps -o user,pid,command | grep "java" | grep -i "com.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) else #在Linux服务器上要求尽可能精确识别进程 - ppid=$(ps -C java -o user,pid,command --cols 99999 | grep -w $PROXY_HOME | grep -i "cn.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) + ppid=$(ps -C java -o user,pid,command --cols 99999 | grep -w $PROXY_HOME | grep -i "com.webank.emesher.boot.ProxyStartup" | grep -Ev "^root" |awk -F ' ' {'print $2'}) fi fi echo "$ppid"; diff --git a/eventmesh-emesher/bin/test/asyncPub.sh b/eventmesh-emesher/bin/test/asyncPub.sh index 28b4c8c798..c3db87c008 100644 --- a/eventmesh-emesher/bin/test/asyncPub.sh +++ b/eventmesh-emesher/bin/test/asyncPub.sh @@ -85,6 +85,6 @@ proxy=$2 topic=$3 packetsize=$4 -ASYNC_REQ_MAIN=cn.webank.emesher.client.sdkdemo.AsyncPublishInstance +ASYNC_REQ_MAIN=com.webank.emesher.client.sdkdemo.AsyncPublishInstance $JAVA $JAVA_OPT -classpath ${PROXY_HOME}/conf:${PROXY_HOME}/lib/*:${PROXY_HOME}/apps/* $ASYNC_REQ_MAIN $conf $proxy $topic $packetsize >> ${PROXY_LOG_HOME}/proxy-client.out 2>&1 & exit 0 diff --git a/eventmesh-emesher/bin/test/asyncRRReq.sh b/eventmesh-emesher/bin/test/asyncRRReq.sh index 55b652d85e..fa9a30ed3b 100644 --- a/eventmesh-emesher/bin/test/asyncRRReq.sh +++ b/eventmesh-emesher/bin/test/asyncRRReq.sh @@ -85,6 +85,6 @@ proxy=$2 topic=$3 packetsize=$4 -ASYNC_RR_REQ_MAIN=cn.webank.emesher.client.sdkdemo.AsyncSyncRequestInstance +ASYNC_RR_REQ_MAIN=com.webank.emesher.client.sdkdemo.AsyncSyncRequestInstance $JAVA $JAVA_OPT -classpath ${PROXY_HOME}/conf:${PROXY_HOME}/lib/*:${PROXY_HOME}/apps/* $ASYNC_RR_REQ_MAIN $conf $proxy $topic $packetsize >> ${PROXY_LOG_HOME}/proxy-client.out 2>&1 & exit 0 diff --git a/eventmesh-emesher/bin/test/syncListen.sh b/eventmesh-emesher/bin/test/syncListen.sh index cf1e2eb16d..32d90ef26b 100644 --- a/eventmesh-emesher/bin/test/syncListen.sh +++ b/eventmesh-emesher/bin/test/syncListen.sh @@ -84,6 +84,6 @@ proxy=$1 topic=$2 threads=$3 -SYNC_LISTEN_MAIN=cn.webank.emesher.sdk.demo.InstanceSyncListenner +SYNC_LISTEN_MAIN=com.webank.emesher.sdk.demo.InstanceSyncListenner $JAVA $JAVA_OPT -classpath ${PROXY_HOME}/conf:${PROXY_HOME}/lib/*:${PROXY_HOME}/apps/* $SYNC_LISTEN_MAIN $proxy $topic $threads >> ${PROXY_LOG_HOME}/proxy-sdk.out 2>&1 & exit 0 diff --git a/eventmesh-emesher/bin/test/syncReq.sh b/eventmesh-emesher/bin/test/syncReq.sh index 3a146cdb44..da9cb03b77 100644 --- a/eventmesh-emesher/bin/test/syncReq.sh +++ b/eventmesh-emesher/bin/test/syncReq.sh @@ -86,6 +86,6 @@ topic=$3 packetsize=$4 threads=$5 -SYNC_REQ_MAIN=cn.webank.emesher.client.sdkdemo.SyncRequestInstance +SYNC_REQ_MAIN=com.webank.emesher.client.sdkdemo.SyncRequestInstance $JAVA $JAVA_OPT -classpath ${PROXY_HOME}/conf:${PROXY_HOME}/lib/*:${PROXY_HOME}/apps/* $SYNC_REQ_MAIN $conf $proxy $topic $packetsize $threads >> ${PROXY_LOG_HOME}/proxy-client.out 2>&1 & exit 0 diff --git a/eventmesh-emesher/build.gradle b/eventmesh-emesher/build.gradle index 7b0243766a..239d9b025e 100644 --- a/eventmesh-emesher/build.gradle +++ b/eventmesh-emesher/build.gradle @@ -32,11 +32,6 @@ repositories { mavenCentral() } -//def env = 'dev' -//if (project.findProperty("env") instanceof String) { -// env = project.property("env") -//} - List defibus = [ "com.webank.defibus:defibus-client:$defibus_version", "com.webank.defibus:defibus-common:$defibus_version" @@ -82,7 +77,7 @@ if (project.findProperty("buildNo") instanceof String) { versionString = project.version + '_' + project.property("buildNo") } -task tar(overwrite: true, type: Tar, dependsOn: ['clean', 'jar']) { +task tar(type: Tar, dependsOn: ['clean', 'jar']) { extension = 'tar.gz' compression = Compression.GZIP archiveName = project.name + '_' + versionString + '.' + extension diff --git a/eventmesh-emesher/conf/log4j2.xml b/eventmesh-emesher/conf/log4j2.xml index 653b6a66e6..9f18a6bd3f 100644 --- a/eventmesh-emesher/conf/log4j2.xml +++ b/eventmesh-emesher/conf/log4j2.xml @@ -64,11 +64,11 @@ - + - + diff --git a/eventmesh-emesher/conf/proxy.properties b/eventmesh-emesher/conf/proxy.properties index 2feed25aed..f7e04e117b 100644 --- a/eventmesh-emesher/conf/proxy.properties +++ b/eventmesh-emesher/conf/proxy.properties @@ -21,7 +21,7 @@ proxy.server.env=PRD proxy.server.region=region1 proxy.server.cluster=COMMON proxy.server.name=EVNETMESH-EMESHER -proxy.server.dcn= +proxy.server.dcn=010 proxy.sysid=0000 proxy.server.http.port=10105 diff --git a/eventmesh-emesher/gradle.properties b/eventmesh-emesher/gradle.properties index 0cee7dd653..814794be96 100644 --- a/eventmesh-emesher/gradle.properties +++ b/eventmesh-emesher/gradle.properties @@ -15,10 +15,9 @@ # limitations under the License. # -group=cn.webank.eventmesh +group=com.webank.eventmesh version=1.0.0 -defibus_version=1.0.0 +defibus_version=1.0.1 mavenUserName= mavenPassword= -env=dev diff --git a/eventmesh-emesher/src/main/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstance.java b/eventmesh-emesher/src/main/java/com/webank/defibus/client/impl/factory/DeFiBusClientInstance.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstance.java rename to eventmesh-emesher/src/main/java/com/webank/defibus/client/impl/factory/DeFiBusClientInstance.java index 842ab19e9f..12c3afe395 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/defibus/client/impl/factory/DeFiBusClientInstance.java +++ b/eventmesh-emesher/src/main/java/com/webank/defibus/client/impl/factory/DeFiBusClientInstance.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.defibus.client.impl.factory; +package com.webank.defibus.client.impl.factory; -import cn.webank.defibus.client.impl.DeFiBusClientAPIImpl; -import cn.webank.defibus.client.impl.DeFiBusClientRemotingProcessor; -import cn.webank.defibus.common.protocol.DeFiBusRequestCode; -import cn.webank.emesher.threads.ThreadPoolHelper; +import com.webank.defibus.client.impl.DeFiBusClientAPIImpl; +import com.webank.defibus.client.impl.DeFiBusClientRemotingProcessor; +import com.webank.defibus.common.protocol.DeFiBusRequestCode; +import com.webank.emesher.threads.ThreadPoolHelper; import org.apache.commons.lang3.RandomUtils; import org.apache.rocketmq.client.ClientConfig; import org.apache.rocketmq.client.consumer.store.ReadOffsetType; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/admin/controller/ClientManageController.java b/eventmesh-emesher/src/main/java/com/webank/emesher/admin/controller/ClientManageController.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/admin/controller/ClientManageController.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/admin/controller/ClientManageController.java index 89d1f50e1f..9e0cd32bbd 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/admin/controller/ClientManageController.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/admin/controller/ClientManageController.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package cn.webank.emesher.admin.controller; - -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.ProxyTcp2Client; -import cn.webank.emesher.core.protocol.tcp.client.group.ClientGroupWrapper; -import cn.webank.emesher.core.protocol.tcp.client.group.ClientSessionGroupMapping; -import cn.webank.emesher.core.protocol.tcp.client.group.dispatch.DownstreamDispatchStrategy; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.admin.controller; + +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.ProxyTcp2Client; +import com.webank.emesher.core.protocol.tcp.client.group.ClientGroupWrapper; +import com.webank.emesher.core.protocol.tcp.client.group.ClientSessionGroupMapping; +import com.webank.emesher.core.protocol.tcp.client.group.dispatch.DownstreamDispatchStrategy; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; +import com.webank.emesher.util.ProxyUtil; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import com.alibaba.fastjson.JSON; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/AbrstractHTTPServer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/AbrstractHTTPServer.java similarity index 95% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/boot/AbrstractHTTPServer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/boot/AbrstractHTTPServer.java index 6f42446c8e..7a6d06102b 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/AbrstractHTTPServer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/AbrstractHTTPServer.java @@ -15,22 +15,22 @@ * limitations under the License. */ -package cn.webank.emesher.boot; - -import cn.webank.emesher.common.Pair; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.eventmesh.common.ThreadPoolFactory; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.body.Body; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.common.ProxyRetCode; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.eventmesh.common.protocol.http.header.Header; -import cn.webank.emesher.metrics.http.HTTPMetricsServer; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.boot; + +import com.webank.emesher.common.Pair; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.eventmesh.common.ThreadPoolFactory; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.common.ProxyRetCode; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.emesher.metrics.http.HTTPMetricsServer; +import com.webank.emesher.util.ProxyUtil; import com.google.common.base.Preconditions; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelDuplexHandler; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/AbstractRemotingServer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/AbstractRemotingServer.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/boot/AbstractRemotingServer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/boot/AbstractRemotingServer.java index f35e944067..67c4264195 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/AbstractRemotingServer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/AbstractRemotingServer.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.boot; +package com.webank.emesher.boot; -import cn.webank.eventmesh.common.ThreadUtil; +import com.webank.eventmesh.common.ThreadUtil; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import org.slf4j.Logger; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyHTTPServer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyHTTPServer.java similarity index 87% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyHTTPServer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyHTTPServer.java index f3d3a5aaaa..a6316f9553 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyHTTPServer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyHTTPServer.java @@ -15,25 +15,25 @@ * limitations under the License. */ -package cn.webank.emesher.boot; - -import cn.webank.emesher.common.ServiceState; -import cn.webank.emesher.configuration.ProxyConfiguration; -import cn.webank.emesher.core.protocol.http.consumer.ConsumerManager; -import cn.webank.emesher.core.protocol.http.processor.AdminMetricsProcessor; -import cn.webank.emesher.core.protocol.http.processor.BatchSendMessageProcessor; -import cn.webank.emesher.core.protocol.http.processor.BatchSendMessageV2Processor; -import cn.webank.emesher.core.protocol.http.processor.ReplyMessageProcessor; -import cn.webank.emesher.core.protocol.http.processor.SendAsyncMessageProcessor; -import cn.webank.emesher.core.protocol.http.processor.SendSyncMessageProcessor; -import cn.webank.emesher.core.protocol.http.processor.SubscribeProcessor; -import cn.webank.emesher.core.protocol.http.processor.UnSubscribeProcessor; -import cn.webank.emesher.core.protocol.http.producer.ProducerManager; -import cn.webank.emesher.core.protocol.http.push.AbstractHTTPPushRequest; -import cn.webank.emesher.core.protocol.http.retry.HttpRetryer; -import cn.webank.eventmesh.common.ThreadPoolFactory; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.emesher.metrics.http.HTTPMetricsServer; +package com.webank.emesher.boot; + +import com.webank.emesher.common.ServiceState; +import com.webank.emesher.configuration.ProxyConfiguration; +import com.webank.emesher.core.protocol.http.consumer.ConsumerManager; +import com.webank.emesher.core.protocol.http.processor.AdminMetricsProcessor; +import com.webank.emesher.core.protocol.http.processor.BatchSendMessageProcessor; +import com.webank.emesher.core.protocol.http.processor.BatchSendMessageV2Processor; +import com.webank.emesher.core.protocol.http.processor.ReplyMessageProcessor; +import com.webank.emesher.core.protocol.http.processor.SendAsyncMessageProcessor; +import com.webank.emesher.core.protocol.http.processor.SendSyncMessageProcessor; +import com.webank.emesher.core.protocol.http.processor.SubscribeProcessor; +import com.webank.emesher.core.protocol.http.processor.UnSubscribeProcessor; +import com.webank.emesher.core.protocol.http.producer.ProducerManager; +import com.webank.emesher.core.protocol.http.push.AbstractHTTPPushRequest; +import com.webank.emesher.core.protocol.http.retry.HttpRetryer; +import com.webank.eventmesh.common.ThreadPoolFactory; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.emesher.metrics.http.HTTPMetricsServer; import com.google.common.eventbus.EventBus; import java.util.concurrent.BlockingQueue; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyServer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyServer.java similarity index 93% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyServer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyServer.java index c3a021f80d..0ac4dce619 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyServer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyServer.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.emesher.boot; +package com.webank.emesher.boot; -import cn.webank.emesher.common.ServiceState; -import cn.webank.emesher.configuration.AccessConfiguration; -import cn.webank.emesher.configuration.ProxyConfiguration; +import com.webank.emesher.common.ServiceState; +import com.webank.emesher.configuration.AccessConfiguration; +import com.webank.emesher.configuration.ProxyConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyStartup.java b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyStartup.java similarity index 89% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyStartup.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyStartup.java index c5ad336368..7cb732f30b 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyStartup.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyStartup.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.emesher.boot; +package com.webank.emesher.boot; -import cn.webank.emesher.configuration.AccessConfiguration; -import cn.webank.emesher.configuration.ConfigurationWraper; -import cn.webank.emesher.configuration.ProxyConfiguration; -import cn.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.configuration.AccessConfiguration; +import com.webank.emesher.configuration.ConfigurationWraper; +import com.webank.emesher.configuration.ProxyConfiguration; +import com.webank.emesher.constants.ProxyConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyTCPServer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyTCPServer.java similarity index 92% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyTCPServer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyTCPServer.java index 8dd7c36f68..7ff488ed5d 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/boot/ProxyTCPServer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/boot/ProxyTCPServer.java @@ -15,20 +15,20 @@ * limitations under the License. */ -package cn.webank.emesher.boot; - -import cn.webank.eventmesh.common.protocol.tcp.codec.Codec; -import cn.webank.emesher.admin.controller.ClientManageController; -import cn.webank.emesher.configuration.AccessConfiguration; -import cn.webank.emesher.core.protocol.tcp.client.ProxyTcpConnectionHandler; -import cn.webank.emesher.core.protocol.tcp.client.ProxyTcpExceptionHandler; -import cn.webank.emesher.core.protocol.tcp.client.ProxyTcpMessageDispatcher; -import cn.webank.emesher.core.protocol.tcp.client.group.ClientSessionGroupMapping; -import cn.webank.emesher.core.protocol.tcp.client.session.push.retry.ProxyTcpRetryer; -import cn.webank.eventmesh.common.ThreadPoolFactory; -import cn.webank.emesher.metrics.tcp.ProxyTcpMonitor; -import cn.webank.emesher.threads.ProxyThreadFactoryImpl; -import cn.webank.emesher.threads.ThreadPoolHelper; +package com.webank.emesher.boot; + +import com.webank.eventmesh.common.protocol.tcp.codec.Codec; +import com.webank.emesher.admin.controller.ClientManageController; +import com.webank.emesher.configuration.AccessConfiguration; +import com.webank.emesher.core.protocol.tcp.client.ProxyTcpConnectionHandler; +import com.webank.emesher.core.protocol.tcp.client.ProxyTcpExceptionHandler; +import com.webank.emesher.core.protocol.tcp.client.ProxyTcpMessageDispatcher; +import com.webank.emesher.core.protocol.tcp.client.group.ClientSessionGroupMapping; +import com.webank.emesher.core.protocol.tcp.client.session.push.retry.ProxyTcpRetryer; +import com.webank.eventmesh.common.ThreadPoolFactory; +import com.webank.emesher.metrics.tcp.ProxyTcpMonitor; +import com.webank.emesher.threads.ProxyThreadFactoryImpl; +import com.webank.emesher.threads.ThreadPoolHelper; import com.google.common.util.concurrent.RateLimiter; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.PooledByteBufAllocator; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/common/Pair.java b/eventmesh-emesher/src/main/java/com/webank/emesher/common/Pair.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/common/Pair.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/common/Pair.java index 43ed61351c..08e1dba8f6 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/common/Pair.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/common/Pair.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.common; +package com.webank.emesher.common; public class Pair { private T1 object1; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/common/ServiceState.java b/eventmesh-emesher/src/main/java/com/webank/emesher/common/ServiceState.java similarity index 96% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/common/ServiceState.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/common/ServiceState.java index d3918fcead..8d9167619f 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/common/ServiceState.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/common/ServiceState.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.common; +package com.webank.emesher.common; public enum ServiceState { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/AccessConfiguration.java b/eventmesh-emesher/src/main/java/com/webank/emesher/configuration/AccessConfiguration.java similarity index 99% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/AccessConfiguration.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/configuration/AccessConfiguration.java index cb0481b832..ae16163b44 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/AccessConfiguration.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/configuration/AccessConfiguration.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.configuration; +package com.webank.emesher.configuration; import com.google.common.base.Preconditions; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java b/eventmesh-emesher/src/main/java/com/webank/emesher/configuration/CommonConfiguration.java similarity index 99% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/configuration/CommonConfiguration.java index 4695925464..f0e7216024 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/CommonConfiguration.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/configuration/CommonConfiguration.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.configuration; +package com.webank.emesher.configuration; -import cn.webank.emesher.util.ProxyUtil; +import com.webank.emesher.util.ProxyUtil; import com.google.common.base.Preconditions; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/ConfigurationWraper.java b/eventmesh-emesher/src/main/java/com/webank/emesher/configuration/ConfigurationWraper.java similarity index 96% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/ConfigurationWraper.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/configuration/ConfigurationWraper.java index 6294ed39f2..89fa278f55 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/ConfigurationWraper.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/configuration/ConfigurationWraper.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.configuration; +package com.webank.emesher.configuration; -import cn.webank.eventmesh.common.ThreadPoolFactory; +import com.webank.eventmesh.common.ThreadPoolFactory; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/ProxyConfiguration.java b/eventmesh-emesher/src/main/java/com/webank/emesher/configuration/ProxyConfiguration.java similarity index 99% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/ProxyConfiguration.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/configuration/ProxyConfiguration.java index 9144e178b5..3eccfd9a18 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/configuration/ProxyConfiguration.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/configuration/ProxyConfiguration.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.configuration; +package com.webank.emesher.configuration; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.RateLimiter; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyConstants.java b/eventmesh-emesher/src/main/java/com/webank/emesher/constants/ProxyConstants.java similarity index 99% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyConstants.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/constants/ProxyConstants.java index 6343155a6f..9e6725e5b4 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyConstants.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/constants/ProxyConstants.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.constants; +package com.webank.emesher.constants; public class ProxyConstants { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyVersion.java b/eventmesh-emesher/src/main/java/com/webank/emesher/constants/ProxyVersion.java similarity index 96% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyVersion.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/constants/ProxyVersion.java index 060d6e7de4..c32c613213 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/constants/ProxyVersion.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/constants/ProxyVersion.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.constants; +package com.webank.emesher.constants; public class ProxyVersion { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/ConsumerGroupConf.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/ConsumerGroupConf.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/ConsumerGroupConf.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/ConsumerGroupConf.java index edb879e8b6..0a4613d509 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/ConsumerGroupConf.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/ConsumerGroupConf.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.consumergroup; +package com.webank.emesher.core.consumergroup; import com.google.common.collect.Maps; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/ConsumerGroupTopicConf.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/ConsumerGroupTopicConf.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/ConsumerGroupTopicConf.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/ConsumerGroupTopicConf.java index edb170b628..9235862d07 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/ConsumerGroupTopicConf.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/ConsumerGroupTopicConf.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.consumergroup; +package com.webank.emesher.core.consumergroup; import com.google.common.collect.Maps; import com.google.common.collect.Sets; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/ProducerGroupConf.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/ProducerGroupConf.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/ProducerGroupConf.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/ProducerGroupConf.java index 2f869f7cf7..5a5d771f31 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/ProducerGroupConf.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/ProducerGroupConf.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.consumergroup; +package com.webank.emesher.core.consumergroup; import java.util.Objects; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java index 443a89e7cd..2c5b1ac18a 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.consumergroup.event; +package com.webank.emesher.core.consumergroup.event; public class ConsumerGroupInstanceChangeEvent { } diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/event/ConsumerGroupStateEvent.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/event/ConsumerGroupStateEvent.java similarity index 92% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/event/ConsumerGroupStateEvent.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/event/ConsumerGroupStateEvent.java index ae73dbe935..c9a351d757 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/event/ConsumerGroupStateEvent.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/event/ConsumerGroupStateEvent.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.core.consumergroup.event; +package com.webank.emesher.core.consumergroup.event; -import cn.webank.emesher.core.consumergroup.ConsumerGroupConf; +import com.webank.emesher.core.consumergroup.ConsumerGroupConf; public class ConsumerGroupStateEvent { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/event/ConsumerGroupTopicConfChangeEvent.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/event/ConsumerGroupTopicConfChangeEvent.java similarity index 92% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/event/ConsumerGroupTopicConfChangeEvent.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/event/ConsumerGroupTopicConfChangeEvent.java index 83bcd7e5d9..f5f1ab221a 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/consumergroup/event/ConsumerGroupTopicConfChangeEvent.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/consumergroup/event/ConsumerGroupTopicConfChangeEvent.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.core.consumergroup.event; +package com.webank.emesher.core.consumergroup.event; -import cn.webank.emesher.core.consumergroup.ConsumerGroupTopicConf; +import com.webank.emesher.core.consumergroup.ConsumerGroupTopicConf; public class ConsumerGroupTopicConfChangeEvent { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/async/AsyncContext.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/async/AsyncContext.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/async/AsyncContext.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/async/AsyncContext.java index 5a70db244b..45611b3363 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/async/AsyncContext.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/async/AsyncContext.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.async; +package com.webank.emesher.core.protocol.http.async; import com.google.common.base.Preconditions; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/async/CompleteHandler.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/async/CompleteHandler.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/async/CompleteHandler.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/async/CompleteHandler.java index 19644b4815..abdec1a7c5 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/async/CompleteHandler.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/async/CompleteHandler.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.async; +package com.webank.emesher.core.protocol.http.async; public interface CompleteHandler { void onResponse(T t); diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ConsumerGroupManager.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/ConsumerGroupManager.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ConsumerGroupManager.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/ConsumerGroupManager.java index 4ba4170bd5..b2c49552ff 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ConsumerGroupManager.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/ConsumerGroupManager.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.consumer; +package com.webank.emesher.core.protocol.http.consumer; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.core.consumergroup.ConsumerGroupConf; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.core.consumergroup.ConsumerGroupConf; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ConsumerManager.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/ConsumerManager.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ConsumerManager.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/ConsumerManager.java index 050847273e..7ad9e74e70 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ConsumerManager.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/ConsumerManager.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.consumer; +package com.webank.emesher.core.protocol.http.consumer; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.core.consumergroup.ConsumerGroupConf; -import cn.webank.emesher.core.consumergroup.event.ConsumerGroupStateEvent; -import cn.webank.emesher.core.consumergroup.event.ConsumerGroupTopicConfChangeEvent; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.core.consumergroup.ConsumerGroupConf; +import com.webank.emesher.core.consumergroup.event.ConsumerGroupStateEvent; +import com.webank.emesher.core.consumergroup.event.ConsumerGroupTopicConfChangeEvent; import com.google.common.eventbus.Subscribe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/HandleMsgContext.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/HandleMsgContext.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/HandleMsgContext.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/HandleMsgContext.java index c0bb524b62..c2db6949ef 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/HandleMsgContext.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/HandleMsgContext.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.consumer; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.consumergroup.ConsumerGroupConf; -import cn.webank.emesher.core.consumergroup.ConsumerGroupTopicConf; -import cn.webank.eventmesh.common.Constants; +package com.webank.emesher.core.protocol.http.consumer; + +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.consumergroup.ConsumerGroupConf; +import com.webank.emesher.core.consumergroup.ConsumerGroupTopicConf; +import com.webank.eventmesh.common.Constants; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java similarity index 93% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java index 3842c39ab0..9dcc8aad7b 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/consumer/ProxyConsumer.java @@ -15,25 +15,24 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.consumer; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.consumer.DeFiBusMessageListenerConcurrently; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.consumergroup.ConsumerGroupConf; -import cn.webank.emesher.core.consumergroup.ConsumerGroupTopicConf; -import cn.webank.emesher.core.protocol.http.producer.ProxyProducer; -import cn.webank.emesher.core.protocol.http.producer.SendMessageContext; -import cn.webank.emesher.core.protocol.http.push.HTTPMessageHandler; -import cn.webank.emesher.core.protocol.http.push.MessageHandler; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.ThreadUtil; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.http.consumer; + +import com.webank.defibus.client.common.DeFiBusClientConfig; +import com.webank.defibus.consumer.DeFiBusMessageListenerConcurrently; +import com.webank.defibus.consumer.DeFiBusPushConsumer; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.consumergroup.ConsumerGroupConf; +import com.webank.emesher.core.consumergroup.ConsumerGroupTopicConf; +import com.webank.emesher.core.protocol.http.producer.ProxyProducer; +import com.webank.emesher.core.protocol.http.producer.SendMessageContext; +import com.webank.emesher.core.protocol.http.push.HTTPMessageHandler; +import com.webank.emesher.core.protocol.http.push.MessageHandler; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.ThreadUtil; +import com.webank.emesher.util.ProxyUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyContext; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/AdminMetricsProcessor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/AdminMetricsProcessor.java similarity index 83% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/AdminMetricsProcessor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/AdminMetricsProcessor.java index 8bbe4d0d51..60b1a71adc 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/AdminMetricsProcessor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/AdminMetricsProcessor.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor; +package com.webank.emesher.core.protocol.http.processor; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.eventmesh.common.command.HttpCommand; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.eventmesh.common.command.HttpCommand; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/AdminShutdownProcessor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/AdminShutdownProcessor.java similarity index 79% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/AdminShutdownProcessor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/AdminShutdownProcessor.java index 3d34fd59a9..4cfb840105 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/AdminShutdownProcessor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/AdminShutdownProcessor.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor; - -import cn.webank.emesher.boot.ProxyServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.common.ProxyRetCode; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; +package com.webank.emesher.core.protocol.http.processor; + +import com.webank.emesher.boot.ProxyServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.common.ProxyRetCode; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; import io.netty.channel.ChannelHandlerContext; import org.apache.rocketmq.remoting.common.RemotingHelper; import org.slf4j.Logger; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/BatchSendMessageProcessor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/BatchSendMessageProcessor.java similarity index 91% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/BatchSendMessageProcessor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/BatchSendMessageProcessor.java index 145f042254..9fc95dbaa6 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/BatchSendMessageProcessor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/BatchSendMessageProcessor.java @@ -15,24 +15,24 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.emesher.core.protocol.http.producer.ProxyProducer; -import cn.webank.emesher.core.protocol.http.producer.SendMessageContext; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchResponseBody; -import cn.webank.eventmesh.common.protocol.http.common.ProxyRetCode; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchResponseHeader; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.http.processor; + +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.emesher.core.protocol.http.producer.ProxyProducer; +import com.webank.emesher.core.protocol.http.producer.SendMessageContext; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchRequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchResponseBody; +import com.webank.eventmesh.common.protocol.http.common.ProxyRetCode; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchResponseHeader; +import com.webank.emesher.util.ProxyUtil; import io.netty.channel.ChannelHandlerContext; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/BatchSendMessageV2Processor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/BatchSendMessageV2Processor.java similarity index 90% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/BatchSendMessageV2Processor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/BatchSendMessageV2Processor.java index 22610c1270..c4b9c4323f 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/BatchSendMessageV2Processor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/BatchSendMessageV2Processor.java @@ -15,24 +15,24 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.emesher.core.protocol.http.producer.ProxyProducer; -import cn.webank.emesher.core.protocol.http.producer.SendMessageContext; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchV2RequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchV2ResponseBody; -import cn.webank.eventmesh.common.protocol.http.common.ProxyRetCode; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchV2RequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchV2ResponseHeader; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.http.processor; + +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.emesher.core.protocol.http.producer.ProxyProducer; +import com.webank.emesher.core.protocol.http.producer.SendMessageContext; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchV2RequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageBatchV2ResponseBody; +import com.webank.eventmesh.common.protocol.http.common.ProxyRetCode; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchV2RequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageBatchV2ResponseHeader; +import com.webank.emesher.util.ProxyUtil; import io.netty.channel.ChannelHandlerContext; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.producer.SendCallback; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/ReplyMessageProcessor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/ReplyMessageProcessor.java similarity index 90% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/ReplyMessageProcessor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/ReplyMessageProcessor.java index 9b9e2c7744..b410815b7d 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/ReplyMessageProcessor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/ReplyMessageProcessor.java @@ -15,27 +15,27 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.async.CompleteHandler; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.emesher.core.protocol.http.producer.ProxyProducer; -import cn.webank.emesher.core.protocol.http.producer.SendMessageContext; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.LiteMessage; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.body.message.ReplyMessageRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.ReplyMessageResponseBody; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; -import cn.webank.eventmesh.common.protocol.http.common.ProxyRetCode; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.eventmesh.common.protocol.http.header.message.ReplyMessageRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.ReplyMessageResponseHeader; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.http.processor; + +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.async.CompleteHandler; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.emesher.core.protocol.http.producer.ProxyProducer; +import com.webank.emesher.core.protocol.http.producer.SendMessageContext; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.body.message.ReplyMessageRequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.ReplyMessageResponseBody; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; +import com.webank.eventmesh.common.protocol.http.common.ProxyRetCode; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.eventmesh.common.protocol.http.header.message.ReplyMessageRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.ReplyMessageResponseHeader; +import com.webank.emesher.util.ProxyUtil; import io.netty.channel.ChannelHandlerContext; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/SendAsyncMessageProcessor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/SendAsyncMessageProcessor.java similarity index 90% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/SendAsyncMessageProcessor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/SendAsyncMessageProcessor.java index 345dacfa21..bea1163e4b 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/SendAsyncMessageProcessor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/SendAsyncMessageProcessor.java @@ -15,27 +15,27 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.async.CompleteHandler; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.emesher.core.protocol.http.producer.ProxyProducer; -import cn.webank.emesher.core.protocol.http.producer.SendMessageContext; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.LiteMessage; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; -import cn.webank.eventmesh.common.protocol.http.common.ProxyRetCode; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageResponseHeader; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.http.processor; + +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.async.CompleteHandler; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.emesher.core.protocol.http.producer.ProxyProducer; +import com.webank.emesher.core.protocol.http.producer.SendMessageContext; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageRequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; +import com.webank.eventmesh.common.protocol.http.common.ProxyRetCode; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageResponseHeader; +import com.webank.emesher.util.ProxyUtil; import io.netty.channel.ChannelHandlerContext; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.producer.SendCallback; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/SendSyncMessageProcessor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/SendSyncMessageProcessor.java similarity index 91% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/SendSyncMessageProcessor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/SendSyncMessageProcessor.java index 74886e3395..eac84ffa42 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/SendSyncMessageProcessor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/SendSyncMessageProcessor.java @@ -15,28 +15,28 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor; +package com.webank.emesher.core.protocol.http.processor; -import cn.webank.defibus.client.impl.producer.RRCallback; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.async.CompleteHandler; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.emesher.core.protocol.http.producer.ProxyProducer; -import cn.webank.emesher.core.protocol.http.producer.SendMessageContext; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.LiteMessage; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; -import cn.webank.eventmesh.common.protocol.http.common.ProxyRetCode; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageRequestHeader; -import cn.webank.eventmesh.common.protocol.http.header.message.SendMessageResponseHeader; -import cn.webank.emesher.util.ProxyUtil; +import com.webank.defibus.client.impl.producer.RRCallback; +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.async.CompleteHandler; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.emesher.core.protocol.http.producer.ProxyProducer; +import com.webank.emesher.core.protocol.http.producer.SendMessageContext; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageRequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; +import com.webank.eventmesh.common.protocol.http.common.ProxyRetCode; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageRequestHeader; +import com.webank.eventmesh.common.protocol.http.header.message.SendMessageResponseHeader; +import com.webank.emesher.util.ProxyUtil; import com.alibaba.fastjson.JSON; import io.netty.channel.ChannelHandlerContext; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/SubscribeProcessor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/SubscribeProcessor.java similarity index 78% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/SubscribeProcessor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/SubscribeProcessor.java index 7356123046..2a923d59ff 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/SubscribeProcessor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/SubscribeProcessor.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor; - -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; +package com.webank.emesher.core.protocol.http.processor; + +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; import io.netty.channel.ChannelHandlerContext; import org.apache.rocketmq.remoting.common.RemotingHelper; import org.slf4j.Logger; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/UnSubscribeProcessor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/UnSubscribeProcessor.java similarity index 79% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/UnSubscribeProcessor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/UnSubscribeProcessor.java index 98517bdafa..a25507ffdd 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/UnSubscribeProcessor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/UnSubscribeProcessor.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor; - -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; +package com.webank.emesher.core.protocol.http.processor; + +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.emesher.core.protocol.http.processor.inf.HttpRequestProcessor; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; import io.netty.channel.ChannelHandlerContext; import org.apache.rocketmq.remoting.common.RemotingHelper; import org.slf4j.Logger; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/inf/HttpRequestProcessor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/inf/HttpRequestProcessor.java similarity index 85% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/inf/HttpRequestProcessor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/inf/HttpRequestProcessor.java index c1f637d2a4..d7972a556d 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/processor/inf/HttpRequestProcessor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/processor/inf/HttpRequestProcessor.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.processor.inf; +package com.webank.emesher.core.protocol.http.processor.inf; -import cn.webank.emesher.core.protocol.http.async.AsyncContext; -import cn.webank.eventmesh.common.command.HttpCommand; +import com.webank.emesher.core.protocol.http.async.AsyncContext; +import com.webank.eventmesh.common.command.HttpCommand; import io.netty.channel.ChannelHandlerContext; public interface HttpRequestProcessor { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProducerManager.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/producer/ProducerManager.java similarity index 95% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProducerManager.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/producer/ProducerManager.java index 8d8b27eea9..d4356bc6df 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProducerManager.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/producer/ProducerManager.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.producer; +package com.webank.emesher.core.protocol.http.producer; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.core.consumergroup.ProducerGroupConf; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.core.consumergroup.ProducerGroupConf; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProxyProducer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/producer/ProxyProducer.java similarity index 91% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProxyProducer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/producer/ProxyProducer.java index 45686406ea..dd1528d94a 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/ProxyProducer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/producer/ProxyProducer.java @@ -15,17 +15,16 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.producer; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.client.impl.producer.RRCallback; -import cn.webank.defibus.producer.DeFiBusProducer; -import cn.webank.emesher.configuration.ProxyConfiguration; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.consumergroup.ProducerGroupConf; -import cn.webank.eventmesh.common.ThreadUtil; -import cn.webank.emesher.util.ProxyUtil; -import org.apache.commons.lang3.StringUtils; +package com.webank.emesher.core.protocol.http.producer; + +import com.webank.defibus.client.common.DeFiBusClientConfig; +import com.webank.defibus.client.impl.producer.RRCallback; +import com.webank.defibus.producer.DeFiBusProducer; +import com.webank.emesher.configuration.ProxyConfiguration; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.consumergroup.ProducerGroupConf; +import com.webank.eventmesh.common.ThreadUtil; +import com.webank.emesher.util.ProxyUtil; import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.SendCallback; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/SendMessageContext.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/producer/SendMessageContext.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/SendMessageContext.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/producer/SendMessageContext.java index bca81de7c2..1a542cfc6d 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/producer/SendMessageContext.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/producer/SendMessageContext.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.producer; +package com.webank.emesher.core.protocol.http.producer; -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.core.protocol.http.retry.RetryContext; -import cn.webank.eventmesh.common.Constants; +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.core.protocol.http.retry.RetryContext; +import com.webank.eventmesh.common.Constants; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/AbstractHTTPPushRequest.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/AbstractHTTPPushRequest.java similarity index 90% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/AbstractHTTPPushRequest.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/AbstractHTTPPushRequest.java index 1f8860f598..b490e55287 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/AbstractHTTPPushRequest.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/AbstractHTTPPushRequest.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.push; - -import cn.webank.emesher.boot.ProxyHTTPServer; -import cn.webank.emesher.configuration.ProxyConfiguration; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.consumer.HandleMsgContext; -import cn.webank.emesher.core.protocol.http.retry.HttpRetryer; -import cn.webank.emesher.core.protocol.http.retry.RetryContext; +package com.webank.emesher.core.protocol.http.push; + +import com.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.configuration.ProxyConfiguration; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.consumer.HandleMsgContext; +import com.webank.emesher.core.protocol.http.retry.HttpRetryer; +import com.webank.emesher.core.protocol.http.retry.RetryContext; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/AsyncHTTPPushRequest.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/AsyncHTTPPushRequest.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/AsyncHTTPPushRequest.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/AsyncHTTPPushRequest.java index e9f56d56aa..5f358fb759 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/AsyncHTTPPushRequest.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/AsyncHTTPPushRequest.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.push; - -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.http.consumer.HandleMsgContext; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.protocol.http.body.message.PushMessageRequestBody; -import cn.webank.eventmesh.common.protocol.http.common.ClientRetCode; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.http.push; + +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.http.consumer.HandleMsgContext; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.protocol.http.body.message.PushMessageRequestBody; +import com.webank.eventmesh.common.protocol.http.common.ClientRetCode; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.emesher.util.ProxyUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/HTTPClientPool.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/HTTPClientPool.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/HTTPClientPool.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/HTTPClientPool.java index 1fa4ea67b2..674e0955ef 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/HTTPClientPool.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/HTTPClientPool.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.push; +package com.webank.emesher.core.protocol.http.push; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/HTTPMessageHandler.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/HTTPMessageHandler.java similarity index 93% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/HTTPMessageHandler.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/HTTPMessageHandler.java index 886fdf15a2..7c6025a88d 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/HTTPMessageHandler.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/HTTPMessageHandler.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.push; +package com.webank.emesher.core.protocol.http.push; -import cn.webank.emesher.core.protocol.http.consumer.HandleMsgContext; -import cn.webank.emesher.core.protocol.http.consumer.ProxyConsumer; -import cn.webank.eventmesh.common.ThreadPoolFactory; +import com.webank.emesher.core.protocol.http.consumer.HandleMsgContext; +import com.webank.emesher.core.protocol.http.consumer.ProxyConsumer; +import com.webank.eventmesh.common.ThreadPoolFactory; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/MessageHandler.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/MessageHandler.java similarity index 87% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/MessageHandler.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/MessageHandler.java index e5dad70d07..0d52466b80 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/push/MessageHandler.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/push/MessageHandler.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.push; +package com.webank.emesher.core.protocol.http.push; -import cn.webank.emesher.core.protocol.http.consumer.HandleMsgContext; +import com.webank.emesher.core.protocol.http.consumer.HandleMsgContext; public interface MessageHandler { boolean handle(HandleMsgContext handleMsgContext); diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/retry/DelayRetryable.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/retry/DelayRetryable.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/retry/DelayRetryable.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/retry/DelayRetryable.java index 61685160a0..db792fd429 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/retry/DelayRetryable.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/retry/DelayRetryable.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.retry; +package com.webank.emesher.core.protocol.http.retry; import java.util.concurrent.Delayed; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/retry/HttpRetryer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/retry/HttpRetryer.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/retry/HttpRetryer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/retry/HttpRetryer.java index 081950e10c..f44b0fdfd4 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/retry/HttpRetryer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/retry/HttpRetryer.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.retry; +package com.webank.emesher.core.protocol.http.retry; -import cn.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.boot.ProxyHTTPServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/retry/RetryContext.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/retry/RetryContext.java similarity index 96% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/retry/RetryContext.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/retry/RetryContext.java index 9da277ee96..93cb63b250 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/http/retry/RetryContext.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/http/retry/RetryContext.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.http.retry; +package com.webank.emesher.core.protocol.http.retry; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcp2Client.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcp2Client.java similarity index 88% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcp2Client.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcp2Client.java index 789c3e9e22..b7143ff1ec 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcp2Client.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcp2Client.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client; - -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.core.protocol.tcp.client.group.ClientSessionGroupMapping; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.emesher.core.protocol.tcp.client.session.SessionState; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.RedirectInfo; -import cn.webank.emesher.metrics.tcp.ProxyTcpMonitor; -import cn.webank.emesher.util.Utils; +package com.webank.emesher.core.protocol.tcp.client; + +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.core.protocol.tcp.client.group.ClientSessionGroupMapping; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.core.protocol.tcp.client.session.SessionState; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.RedirectInfo; +import com.webank.emesher.metrics.tcp.ProxyTcpMonitor; +import com.webank.emesher.util.Utils; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; @@ -37,8 +37,8 @@ import java.net.InetSocketAddress; import java.util.concurrent.TimeUnit; -import static cn.webank.eventmesh.common.protocol.tcp.Command.REDIRECT_TO_CLIENT; -import static cn.webank.eventmesh.common.protocol.tcp.Command.SERVER_GOODBYE_REQUEST; +import static com.webank.eventmesh.common.protocol.tcp.Command.REDIRECT_TO_CLIENT; +import static com.webank.eventmesh.common.protocol.tcp.Command.SERVER_GOODBYE_REQUEST; public class ProxyTcp2Client { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcpConnectionHandler.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcpConnectionHandler.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcpConnectionHandler.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcpConnectionHandler.java index e6f9b3e0a9..529f1c3499 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcpConnectionHandler.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcpConnectionHandler.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client; +package com.webank.emesher.core.protocol.tcp.client; -import cn.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.boot.ProxyTCPServer; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.timeout.IdleState; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcpExceptionHandler.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcpExceptionHandler.java similarity index 88% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcpExceptionHandler.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcpExceptionHandler.java index f785dc8c37..8fd7499226 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcpExceptionHandler.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcpExceptionHandler.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client; +package com.webank.emesher.core.protocol.tcp.client; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcpMessageDispatcher.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcpMessageDispatcher.java similarity index 85% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcpMessageDispatcher.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcpMessageDispatcher.java index f16bc72477..6fe18dc2cc 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/ProxyTcpMessageDispatcher.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/ProxyTcpMessageDispatcher.java @@ -15,22 +15,22 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client; +package com.webank.emesher.core.protocol.tcp.client; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.core.protocol.tcp.client.session.SessionState; -import cn.webank.emesher.core.protocol.tcp.client.task.GoodbyeTask; -import cn.webank.emesher.core.protocol.tcp.client.task.HeartBeatTask; -import cn.webank.emesher.core.protocol.tcp.client.task.HelloTask; -import cn.webank.emesher.core.protocol.tcp.client.task.ListenTask; -import cn.webank.emesher.core.protocol.tcp.client.task.MessageAckTask; -import cn.webank.emesher.core.protocol.tcp.client.task.MessageTransferTask; -import cn.webank.emesher.core.protocol.tcp.client.task.SubscribeTask; -import cn.webank.emesher.core.protocol.tcp.client.task.UnSubscribeTask; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.emesher.util.ProxyUtil; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.core.protocol.tcp.client.session.SessionState; +import com.webank.emesher.core.protocol.tcp.client.task.GoodbyeTask; +import com.webank.emesher.core.protocol.tcp.client.task.HeartBeatTask; +import com.webank.emesher.core.protocol.tcp.client.task.HelloTask; +import com.webank.emesher.core.protocol.tcp.client.task.ListenTask; +import com.webank.emesher.core.protocol.tcp.client.task.MessageAckTask; +import com.webank.emesher.core.protocol.tcp.client.task.MessageTransferTask; +import com.webank.emesher.core.protocol.tcp.client.task.SubscribeTask; +import com.webank.emesher.core.protocol.tcp.client.task.UnSubscribeTask; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.util.ProxyUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import org.slf4j.Logger; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java similarity index 96% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java index fe19ef45cc..5b90c1dae2 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/ClientGroupWrapper.java @@ -15,22 +15,22 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.group; - -import cn.webank.defibus.client.common.DeFiBusClientConfig; -import cn.webank.defibus.client.impl.producer.RRCallback; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import cn.webank.defibus.producer.DeFiBusProducer; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.configuration.AccessConfiguration; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.group.dispatch.DownstreamDispatchStrategy; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; -import cn.webank.emesher.core.protocol.tcp.client.session.push.retry.ProxyTcpRetryer; -import cn.webank.emesher.core.protocol.tcp.client.session.send.UpStreamMsgContext; -import cn.webank.emesher.metrics.tcp.ProxyTcpMonitor; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.tcp.client.group; + +import com.webank.defibus.client.common.DeFiBusClientConfig; +import com.webank.defibus.client.impl.producer.RRCallback; +import com.webank.defibus.consumer.DeFiBusPushConsumer; +import com.webank.defibus.producer.DeFiBusProducer; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.configuration.AccessConfiguration; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.group.dispatch.DownstreamDispatchStrategy; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; +import com.webank.emesher.core.protocol.tcp.client.session.push.retry.ProxyTcpRetryer; +import com.webank.emesher.core.protocol.tcp.client.session.send.UpStreamMsgContext; +import com.webank.emesher.metrics.tcp.ProxyTcpMonitor; +import com.webank.emesher.util.ProxyUtil; import com.alibaba.fastjson.JSON; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientSessionGroupMapping.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/ClientSessionGroupMapping.java similarity index 96% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientSessionGroupMapping.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/ClientSessionGroupMapping.java index 1eb92c0085..b5c1107fe1 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/ClientSessionGroupMapping.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/ClientSessionGroupMapping.java @@ -15,19 +15,19 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.group; - -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.ProxyTcp2Client; -import cn.webank.emesher.core.protocol.tcp.client.group.dispatch.FreePriorityDispatchStrategy; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.emesher.core.protocol.tcp.client.session.SessionState; -import cn.webank.emesher.core.protocol.tcp.client.session.push.ClientAckContext; -import cn.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; -import cn.webank.eventmesh.common.ThreadUtil; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.tcp.client.group; + +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.ProxyTcp2Client; +import com.webank.emesher.core.protocol.tcp.client.group.dispatch.FreePriorityDispatchStrategy; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.core.protocol.tcp.client.session.SessionState; +import com.webank.emesher.core.protocol.tcp.client.session.push.ClientAckContext; +import com.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; +import com.webank.eventmesh.common.ThreadUtil; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.emesher.util.ProxyUtil; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/dispatch/DownstreamDispatchStrategy.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/dispatch/DownstreamDispatchStrategy.java similarity index 88% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/dispatch/DownstreamDispatchStrategy.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/dispatch/DownstreamDispatchStrategy.java index 5c09eb10d0..f12570b416 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/dispatch/DownstreamDispatchStrategy.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/dispatch/DownstreamDispatchStrategy.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.group.dispatch; +package com.webank.emesher.core.protocol.tcp.client.group.dispatch; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.core.protocol.tcp.client.session.Session; import java.util.Set; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java index 8d5629749d..2d44cc6fb6 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.group.dispatch; +package com.webank.emesher.core.protocol.tcp.client.group.dispatch; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.core.protocol.tcp.client.session.Session; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/Session.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/Session.java similarity index 92% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/Session.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/Session.java index 0025f981c7..1bd12bface 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/Session.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/Session.java @@ -15,20 +15,20 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session; - -import cn.webank.emesher.configuration.AccessConfiguration; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.group.ClientGroupWrapper; -import cn.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; -import cn.webank.emesher.core.protocol.tcp.client.session.push.SessionPusher; -import cn.webank.emesher.core.protocol.tcp.client.session.send.ProxyTcpSendResult; -import cn.webank.emesher.core.protocol.tcp.client.session.send.SessionSender; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; -import cn.webank.emesher.util.Utils; +package com.webank.emesher.core.protocol.tcp.client.session; + +import com.webank.emesher.configuration.AccessConfiguration; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.group.ClientGroupWrapper; +import com.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; +import com.webank.emesher.core.protocol.tcp.client.session.push.SessionPusher; +import com.webank.emesher.core.protocol.tcp.client.session.send.ProxyTcpSendResult; +import com.webank.emesher.core.protocol.tcp.client.session.send.SessionSender; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.emesher.util.Utils; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; @@ -44,7 +44,7 @@ import java.util.List; import java.util.concurrent.locks.ReentrantLock; -import static cn.webank.eventmesh.common.protocol.tcp.Command.LISTEN_RESPONSE; +import static com.webank.eventmesh.common.protocol.tcp.Command.LISTEN_RESPONSE; public class Session { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/SessionContext.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/SessionContext.java similarity index 93% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/SessionContext.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/SessionContext.java index 57aa718bd4..9a5f4dcc84 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/SessionContext.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/SessionContext.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session; +package com.webank.emesher.core.protocol.tcp.client.session; -import cn.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.constants.ProxyConstants; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.concurrent.ConcurrentHashMap; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/SessionState.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/SessionState.java similarity index 93% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/SessionState.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/SessionState.java index ed8538f75a..9d0ef17a5a 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/SessionState.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/SessionState.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session; +package com.webank.emesher.core.protocol.tcp.client.session; public enum SessionState { CREATED, diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/ClientAckContext.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/ClientAckContext.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/ClientAckContext.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/ClientAckContext.java index 36d313f95c..6a7113aea5 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/ClientAckContext.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/ClientAckContext.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session.push; +package com.webank.emesher.core.protocol.tcp.client.session.push; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.util.ProxyUtil; +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.defibus.consumer.DeFiBusPushConsumer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.util.ProxyUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyContext; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/DownStreamMsgContext.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/DownStreamMsgContext.java similarity index 93% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/DownStreamMsgContext.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/DownStreamMsgContext.java index 5418cae9f8..fabaf80829 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/DownStreamMsgContext.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/DownStreamMsgContext.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session.push; +package com.webank.emesher.core.protocol.tcp.client.session.push; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.emesher.util.ServerGlobal; +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.defibus.consumer.DeFiBusPushConsumer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.util.ServerGlobal; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyContext; import org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/PushContext.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/PushContext.java similarity index 95% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/PushContext.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/PushContext.java index 70ffdc9768..5b5afdb6fa 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/PushContext.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/PushContext.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session.push; +package com.webank.emesher.core.protocol.tcp.client.session.push; -import cn.webank.defibus.consumer.DeFiBusPushConsumer; -import cn.webank.emesher.constants.ProxyConstants; +import com.webank.defibus.consumer.DeFiBusPushConsumer; +import com.webank.emesher.constants.ProxyConstants; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyContext; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java similarity index 92% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java index 026844dc96..2a556504be 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/SessionPusher.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session.push; - -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.tcp.client.session.push; + +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.util.ProxyUtil; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import org.apache.rocketmq.common.message.MessageExt; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/retry/ProxyTcpRetryer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/retry/ProxyTcpRetryer.java similarity index 94% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/retry/ProxyTcpRetryer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/retry/ProxyTcpRetryer.java index cae8abebc6..71ab84dee9 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/push/retry/ProxyTcpRetryer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/push/retry/ProxyTcpRetryer.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session.push.retry; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.defibus.common.message.DeFiBusMessageConst; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; -import cn.webank.emesher.threads.ProxyThreadFactoryImpl; -import cn.webank.emesher.threads.ThreadPoolHelper; -import cn.webank.emesher.util.ProxyUtil; +package com.webank.emesher.core.protocol.tcp.client.session.push.retry; + +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.defibus.common.message.DeFiBusMessageConst; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.core.protocol.tcp.client.session.push.DownStreamMsgContext; +import com.webank.emesher.threads.ProxyThreadFactoryImpl; +import com.webank.emesher.threads.ThreadPoolHelper; +import com.webank.emesher.util.ProxyUtil; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService; import org.apache.rocketmq.client.impl.consumer.ConsumeMessageService; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendResult.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendResult.java similarity index 95% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendResult.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendResult.java index 5d38cee4bf..c38bdbfd36 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendResult.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendResult.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session.send; +package com.webank.emesher.core.protocol.tcp.client.session.send; public class ProxyTcpSendResult { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendStatus.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendStatus.java similarity index 93% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendStatus.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendStatus.java index 9c10100ccd..4c6a6f66db 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendStatus.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/ProxyTcpSendStatus.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session.send; +package com.webank.emesher.core.protocol.tcp.client.session.send; public enum ProxyTcpSendStatus { SUCCESS, diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java similarity index 92% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java index cba8c2d01e..eb5aa63020 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/SessionSender.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session.send; - -import cn.webank.defibus.client.impl.producer.RRCallback; -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.emesher.util.ProxyUtil; -import cn.webank.emesher.util.Utils; +package com.webank.emesher.core.protocol.tcp.client.session.send; + +import com.webank.defibus.client.impl.producer.RRCallback; +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.util.ProxyUtil; +import com.webank.emesher.util.Utils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.rocketmq.client.producer.SendCallback; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/UpStreamMsgContext.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/UpStreamMsgContext.java similarity index 90% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/UpStreamMsgContext.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/UpStreamMsgContext.java index dbbe7613a9..f1b0b0cb3b 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/session/send/UpStreamMsgContext.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/session/send/UpStreamMsgContext.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.session.send; +package com.webank.emesher.core.protocol.tcp.client.session.send; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.session.Session; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.rocketmq.common.message.Message; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/AbstractTask.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/AbstractTask.java similarity index 87% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/AbstractTask.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/AbstractTask.java index cc3274432d..a86eb644d0 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/AbstractTask.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/AbstractTask.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.task; +package com.webank.emesher.core.protocol.tcp.client.task; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/GoodbyeTask.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/GoodbyeTask.java similarity index 78% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/GoodbyeTask.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/GoodbyeTask.java index 0de4e1e2d1..cb5c31e96e 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/GoodbyeTask.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/GoodbyeTask.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.task; +package com.webank.emesher.core.protocol.tcp.client.task; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.emesher.util.Utils; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.core.protocol.tcp.client.ProxyTcp2Client; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.util.Utils; import io.netty.channel.ChannelHandlerContext; -import static cn.webank.emesher.core.protocol.tcp.client.ProxyTcp2Client.closeSessionIfTimeout; -import static cn.webank.eventmesh.common.protocol.tcp.Command.CLIENT_GOODBYE_RESPONSE; +import static com.webank.eventmesh.common.protocol.tcp.Command.CLIENT_GOODBYE_RESPONSE; public class GoodbyeTask extends AbstractTask { @@ -58,6 +58,6 @@ public void run() { }); //session.write2Client(msg); } - closeSessionIfTimeout(session, proxyTCPServer.getClientSessionGroupMapping()); + ProxyTcp2Client.closeSessionIfTimeout(session, proxyTCPServer.getClientSessionGroupMapping()); } } diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/HeartBeatTask.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/HeartBeatTask.java similarity index 82% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/HeartBeatTask.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/HeartBeatTask.java index 775f86d154..bad4a2fccb 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/HeartBeatTask.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/HeartBeatTask.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.task; +package com.webank.emesher.core.protocol.tcp.client.task; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.emesher.util.Utils; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.util.Utils; import io.netty.channel.ChannelHandlerContext; -import static cn.webank.eventmesh.common.protocol.tcp.Command.HEARTBEAT_RESPONSE; +import static com.webank.eventmesh.common.protocol.tcp.Command.HEARTBEAT_RESPONSE; public class HeartBeatTask extends AbstractTask { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/HelloTask.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/HelloTask.java similarity index 87% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/HelloTask.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/HelloTask.java index f90365097b..bbe26dcd16 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/HelloTask.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/HelloTask.java @@ -15,17 +15,17 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.task; +package com.webank.emesher.core.protocol.tcp.client.task; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.common.ServiceState; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; -import cn.webank.emesher.util.Utils; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.common.ServiceState; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.emesher.util.Utils; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; @@ -33,7 +33,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static cn.webank.eventmesh.common.protocol.tcp.Command.HELLO_RESPONSE; +import static com.webank.eventmesh.common.protocol.tcp.Command.HELLO_RESPONSE; public class HelloTask extends AbstractTask { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/ListenTask.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/ListenTask.java similarity index 85% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/ListenTask.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/ListenTask.java index 2c75c792c3..77ce58f5b9 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/ListenTask.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/ListenTask.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.task; +package com.webank.emesher.core.protocol.tcp.client.task; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; -import static cn.webank.eventmesh.common.protocol.tcp.Command.LISTEN_RESPONSE; +import static com.webank.eventmesh.common.protocol.tcp.Command.LISTEN_RESPONSE; public class ListenTask extends AbstractTask { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageAckTask.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/MessageAckTask.java similarity index 87% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageAckTask.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/MessageAckTask.java index 4098c8a1cf..5bea141a90 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageAckTask.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/MessageAckTask.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.task; +package com.webank.emesher.core.protocol.tcp.client.task; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.core.protocol.tcp.client.session.push.ClientAckContext; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.core.protocol.tcp.client.session.push.ClientAckContext; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java similarity index 90% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java index 781fd0f87d..d635c71f90 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/MessageTransferTask.java @@ -15,20 +15,20 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.task; - -import cn.webank.defibus.common.DeFiBusConstant; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.session.send.ProxyTcpSendResult; -import cn.webank.emesher.core.protocol.tcp.client.session.send.ProxyTcpSendStatus; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.emesher.util.ProxyUtil; -import cn.webank.emesher.util.Utils; +package com.webank.emesher.core.protocol.tcp.client.task; + +import com.webank.defibus.common.DeFiBusConstant; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.session.send.ProxyTcpSendResult; +import com.webank.emesher.core.protocol.tcp.client.session.send.ProxyTcpSendStatus; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.util.ProxyUtil; +import com.webank.emesher.util.Utils; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; @@ -40,7 +40,7 @@ import java.util.concurrent.TimeUnit; -import static cn.webank.eventmesh.common.protocol.tcp.Command.RESPONSE_TO_SERVER; +import static com.webank.eventmesh.common.protocol.tcp.Command.RESPONSE_TO_SERVER; public class MessageTransferTask extends AbstractTask { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/SubscribeTask.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/SubscribeTask.java similarity index 85% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/SubscribeTask.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/SubscribeTask.java index c34d114216..79e5065cc7 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/SubscribeTask.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/SubscribeTask.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.task; +package com.webank.emesher.core.protocol.tcp.client.task; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.Subscription; -import cn.webank.emesher.util.ProxyUtil; -import cn.webank.emesher.util.Utils; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Subscription; +import com.webank.emesher.util.ProxyUtil; +import com.webank.emesher.util.Utils; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/UnSubscribeTask.java b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/UnSubscribeTask.java similarity index 87% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/UnSubscribeTask.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/UnSubscribeTask.java index f9db7a6815..2526808e2a 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/core/protocol/tcp/client/task/UnSubscribeTask.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/core/protocol/tcp/client/task/UnSubscribeTask.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.emesher.core.protocol.tcp.client.task; +package com.webank.emesher.core.protocol.tcp.client.task; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.emesher.util.Utils; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.emesher.util.Utils; import io.netty.channel.ChannelHandlerContext; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/MonitorMetricConstants.java b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/MonitorMetricConstants.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/MonitorMetricConstants.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/metrics/MonitorMetricConstants.java index b8b21de830..3482a0e3d5 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/MonitorMetricConstants.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/MonitorMetricConstants.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.metrics; +package com.webank.emesher.metrics; public class MonitorMetricConstants { public static final String PROXY_MONITOR_FORMAT_COMMON = "{\"protocol\":\"%s\",\"s\":\"%s\",\"t\":\"%s\"}"; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/GroupMetrics.java b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/GroupMetrics.java similarity index 92% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/GroupMetrics.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/GroupMetrics.java index 915e3a25d0..667b97ddb3 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/GroupMetrics.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/GroupMetrics.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.metrics.http; +package com.webank.emesher.metrics.http; -import cn.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.boot.ProxyHTTPServer; import com.codahale.metrics.MetricRegistry; public class GroupMetrics { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/HTTPMetricsServer.java b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/HTTPMetricsServer.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/HTTPMetricsServer.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/HTTPMetricsServer.java index fbaf5440b9..52bc2a7b43 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/HTTPMetricsServer.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/HTTPMetricsServer.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.metrics.http; +package com.webank.emesher.metrics.http; -import cn.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.boot.ProxyHTTPServer; import com.codahale.metrics.MetricRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/HealthMetrics.java b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/HealthMetrics.java similarity index 93% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/HealthMetrics.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/HealthMetrics.java index e648480818..a36a375ab4 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/HealthMetrics.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/HealthMetrics.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.metrics.http; +package com.webank.emesher.metrics.http; -import cn.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.boot.ProxyHTTPServer; import com.codahale.metrics.MetricRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/SummaryMetrics.java b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/SummaryMetrics.java similarity index 99% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/SummaryMetrics.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/SummaryMetrics.java index 604f32bcff..237c6f9012 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/SummaryMetrics.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/SummaryMetrics.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.metrics.http; +package com.webank.emesher.metrics.http; -import cn.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.boot.ProxyHTTPServer; import com.codahale.metrics.MetricRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/TcpSummaryMetrics.java b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/TcpSummaryMetrics.java similarity index 99% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/TcpSummaryMetrics.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/TcpSummaryMetrics.java index 3b060b3455..08461655dc 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/TcpSummaryMetrics.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/TcpSummaryMetrics.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.metrics.http; +package com.webank.emesher.metrics.http; -import cn.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.boot.ProxyHTTPServer; import com.codahale.metrics.MetricRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/TopicMetrics.java b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/TopicMetrics.java similarity index 92% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/TopicMetrics.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/TopicMetrics.java index c21e03dbfa..a72a7d9d88 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/http/TopicMetrics.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/http/TopicMetrics.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.emesher.metrics.http; +package com.webank.emesher.metrics.http; -import cn.webank.emesher.boot.ProxyHTTPServer; +import com.webank.emesher.boot.ProxyHTTPServer; import com.codahale.metrics.MetricRegistry; public class TopicMetrics { diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/tcp/ProxyTcpMonitor.java b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/tcp/ProxyTcpMonitor.java similarity index 95% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/tcp/ProxyTcpMonitor.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/metrics/tcp/ProxyTcpMonitor.java index 583e251698..4d200333f7 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/metrics/tcp/ProxyTcpMonitor.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/metrics/tcp/ProxyTcpMonitor.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.emesher.metrics.tcp; - -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.ProxyTcpConnectionHandler; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.emesher.metrics.MonitorMetricConstants; -import cn.webank.emesher.threads.ThreadPoolHelper; +package com.webank.emesher.metrics.tcp; + +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.ProxyTcpConnectionHandler; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.metrics.MonitorMetricConstants; +import com.webank.emesher.threads.ThreadPoolHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/DelegatedExecutorService.java b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/DelegatedExecutorService.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/threads/DelegatedExecutorService.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/threads/DelegatedExecutorService.java index d027503afc..4dca631be3 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/DelegatedExecutorService.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/DelegatedExecutorService.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.threads; +package com.webank.emesher.threads; import java.util.Collection; import java.util.List; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/DelegatedScheduledExecutorService.java b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/DelegatedScheduledExecutorService.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/threads/DelegatedScheduledExecutorService.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/threads/DelegatedScheduledExecutorService.java index df30455823..1e9cd1d534 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/DelegatedScheduledExecutorService.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/DelegatedScheduledExecutorService.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.threads; +package com.webank.emesher.threads; import java.util.concurrent.Callable; import java.util.concurrent.ScheduledExecutorService; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ProxyThreadFactoryImpl.java b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/ProxyThreadFactoryImpl.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ProxyThreadFactoryImpl.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/threads/ProxyThreadFactoryImpl.java index 55d83860e7..233adc88df 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ProxyThreadFactoryImpl.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/ProxyThreadFactoryImpl.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.threads; +package com.webank.emesher.threads; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicLong; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedEventExecutorGroup.java b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedEventExecutorGroup.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedEventExecutorGroup.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedEventExecutorGroup.java index acd1b11af6..00c38ae953 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedEventExecutorGroup.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedEventExecutorGroup.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.threads; +package com.webank.emesher.threads; import io.netty.util.concurrent.DefaultEventExecutorGroup; import io.netty.util.concurrent.Future; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedExecutorService.java b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedExecutorService.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedExecutorService.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedExecutorService.java index 148e5cc0eb..07b5891747 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedExecutorService.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedExecutorService.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.threads; +package com.webank.emesher.threads; import java.util.Collections; import java.util.List; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedNioEventLoopGroup.java b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedNioEventLoopGroup.java similarity index 98% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedNioEventLoopGroup.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedNioEventLoopGroup.java index 6bf5cc324a..ccead0e316 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedNioEventLoopGroup.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedNioEventLoopGroup.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.threads; +package com.webank.emesher.threads; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.util.concurrent.Future; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedScheduledExecutorService.java b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedScheduledExecutorService.java similarity index 99% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedScheduledExecutorService.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedScheduledExecutorService.java index 9d00c7ffc4..a5f9776b78 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/SharedScheduledExecutorService.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/SharedScheduledExecutorService.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.threads; +package com.webank.emesher.threads; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ThreadPoolHelper.java b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/ThreadPoolHelper.java similarity index 99% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ThreadPoolHelper.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/threads/ThreadPoolHelper.java index 7485f66e97..9225262cf7 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/threads/ThreadPoolHelper.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/threads/ThreadPoolHelper.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.emesher.threads; +package com.webank.emesher.threads; -import cn.webank.emesher.boot.ProxyTCPServer; -import cn.webank.emesher.metrics.MonitorMetricConstants; +import com.webank.emesher.boot.ProxyTCPServer; +import com.webank.emesher.metrics.MonitorMetricConstants; import com.google.common.collect.Lists; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.util.concurrent.DefaultEventExecutorGroup; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/util/ProxyUtil.java b/eventmesh-emesher/src/main/java/com/webank/emesher/util/ProxyUtil.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/util/ProxyUtil.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/util/ProxyUtil.java index dc303d58ed..c9dae00589 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/util/ProxyUtil.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/util/ProxyUtil.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.emesher.util; +package com.webank.emesher.util; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.constants.ProxyVersion; -import cn.webank.eventmesh.common.ThreadUtil; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.constants.ProxyVersion; +import com.webank.eventmesh.common.ThreadUtil; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/util/ServerGlobal.java b/eventmesh-emesher/src/main/java/com/webank/emesher/util/ServerGlobal.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/util/ServerGlobal.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/util/ServerGlobal.java index 51d2dd46f2..9de9fd2c57 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/util/ServerGlobal.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/util/ServerGlobal.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package cn.webank.emesher.util; +package com.webank.emesher.util; import java.util.concurrent.atomic.AtomicLong; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/util/Utils.java b/eventmesh-emesher/src/main/java/com/webank/emesher/util/Utils.java similarity index 95% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/util/Utils.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/util/Utils.java index ee7c2d76b9..ea9d9c3886 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/util/Utils.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/util/Utils.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.emesher.util; - -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.emesher.core.protocol.tcp.client.session.Session; -import cn.webank.emesher.core.protocol.tcp.client.session.SessionState; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +package com.webank.emesher.util; + +import com.webank.emesher.constants.ProxyConstants; +import com.webank.emesher.core.protocol.tcp.client.session.Session; +import com.webank.emesher.core.protocol.tcp.client.session.SessionState; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; diff --git a/eventmesh-emesher/src/main/java/cn/webank/emesher/util/ValueComparator.java b/eventmesh-emesher/src/main/java/com/webank/emesher/util/ValueComparator.java similarity index 97% rename from eventmesh-emesher/src/main/java/cn/webank/emesher/util/ValueComparator.java rename to eventmesh-emesher/src/main/java/com/webank/emesher/util/ValueComparator.java index 01ef6a21e3..a01e38605f 100644 --- a/eventmesh-emesher/src/main/java/cn/webank/emesher/util/ValueComparator.java +++ b/eventmesh-emesher/src/main/java/com/webank/emesher/util/ValueComparator.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.emesher.util; +package com.webank.emesher.util; import java.util.Comparator; import java.util.Map; diff --git a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java index a2b96774c0..6024513fb4 100644 --- a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java +++ b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java @@ -16,7 +16,7 @@ */ package org.apache.rocketmq.client.impl.consumer; -import cn.webank.emesher.threads.ThreadPoolHelper; +import com.webank.emesher.threads.ThreadPoolHelper; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; diff --git a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/ProxyMessageListenerConcurrentlyOnce.java b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/ProxyMessageListenerConcurrentlyOnce.java index 10e619da7c..04dc09ae5d 100644 --- a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/ProxyMessageListenerConcurrentlyOnce.java +++ b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/ProxyMessageListenerConcurrentlyOnce.java @@ -17,7 +17,7 @@ package org.apache.rocketmq.client.impl.consumer; -import cn.webank.defibus.consumer.DeFiBusMessageListenerConcurrentlyOnce; +import com.webank.defibus.consumer.DeFiBusMessageListenerConcurrentlyOnce; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.common.message.MessageExt; diff --git a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/PullMessageService.java b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/PullMessageService.java index 9fce0eaf73..b2a004b9ef 100644 --- a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/PullMessageService.java +++ b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/PullMessageService.java @@ -16,7 +16,7 @@ */ package org.apache.rocketmq.client.impl.consumer; -import cn.webank.emesher.threads.ThreadPoolHelper; +import com.webank.emesher.threads.ThreadPoolHelper; import org.apache.rocketmq.client.impl.factory.MQClientInstance; import org.apache.rocketmq.client.log.ClientLogger; import org.apache.rocketmq.common.ServiceThread; diff --git a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java index 0256f5edb9..4369e3ae4f 100644 --- a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java +++ b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java @@ -16,7 +16,7 @@ */ package org.apache.rocketmq.client.impl.consumer; -import cn.webank.emesher.threads.ThreadPoolHelper; +import com.webank.emesher.threads.ThreadPoolHelper; import org.apache.rocketmq.client.consumer.AllocateMessageQueueStrategy; import org.apache.rocketmq.client.impl.FindBrokerResult; import org.apache.rocketmq.client.impl.factory.MQClientInstance; diff --git a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceService.java b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceService.java index 7e0303586b..dd3289bd24 100644 --- a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceService.java +++ b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceService.java @@ -16,7 +16,7 @@ */ package org.apache.rocketmq.client.impl.consumer; -import cn.webank.emesher.threads.ThreadPoolHelper; +import com.webank.emesher.threads.ThreadPoolHelper; import org.apache.rocketmq.client.impl.factory.MQClientInstance; import org.apache.rocketmq.client.log.ClientLogger; import org.apache.rocketmq.common.ServiceThread; diff --git a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java index 352fe7857e..d81a877928 100644 --- a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java +++ b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java @@ -16,7 +16,7 @@ */ package org.apache.rocketmq.client.impl.factory; -import cn.webank.emesher.threads.ThreadPoolHelper; +import com.webank.emesher.threads.ThreadPoolHelper; import org.apache.rocketmq.client.ClientConfig; import org.apache.rocketmq.client.admin.MQAdminExtInner; import org.apache.rocketmq.client.exception.MQBrokerException; diff --git a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java index e8be3ffdf6..0e73195b57 100644 --- a/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java +++ b/eventmesh-emesher/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java @@ -16,7 +16,7 @@ */ package org.apache.rocketmq.client.impl.producer; -import cn.webank.emesher.threads.ThreadPoolHelper; +import com.webank.emesher.threads.ThreadPoolHelper; import org.apache.rocketmq.client.QueryResult; import org.apache.rocketmq.client.Validators; import org.apache.rocketmq.client.common.ClientErrorCode; diff --git a/eventmesh-emesher/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java b/eventmesh-emesher/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java index 00168d6a02..92c4cdb46d 100644 --- a/eventmesh-emesher/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java +++ b/eventmesh-emesher/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java @@ -16,7 +16,7 @@ */ package org.apache.rocketmq.remoting.netty; -import cn.webank.emesher.threads.ThreadPoolHelper; +import com.webank.emesher.threads.ThreadPoolHelper; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelDuplexHandler; diff --git a/eventmesh-emesher/src/test/java/client/ProxyClient.java b/eventmesh-emesher/src/test/java/client/ProxyClient.java index 522593f489..0e6a6bc43e 100644 --- a/eventmesh-emesher/src/test/java/client/ProxyClient.java +++ b/eventmesh-emesher/src/test/java/client/ProxyClient.java @@ -18,7 +18,7 @@ package client; import client.hook.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; public interface ProxyClient { Package rr(Package msg, long timeout) throws Exception; diff --git a/eventmesh-emesher/src/test/java/client/PubClient.java b/eventmesh-emesher/src/test/java/client/PubClient.java index b3b2491459..90c8c57ef2 100644 --- a/eventmesh-emesher/src/test/java/client/PubClient.java +++ b/eventmesh-emesher/src/test/java/client/PubClient.java @@ -18,8 +18,8 @@ package client; import client.hook.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; public interface PubClient { diff --git a/eventmesh-emesher/src/test/java/client/SubClient.java b/eventmesh-emesher/src/test/java/client/SubClient.java index 1137d8fccb..a15ab114f2 100644 --- a/eventmesh-emesher/src/test/java/client/SubClient.java +++ b/eventmesh-emesher/src/test/java/client/SubClient.java @@ -18,8 +18,8 @@ package client; import client.hook.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; public interface SubClient { diff --git a/eventmesh-emesher/src/test/java/client/common/Codec.java b/eventmesh-emesher/src/test/java/client/common/Codec.java index 24494aa9f7..4ca36a9b32 100644 --- a/eventmesh-emesher/src/test/java/client/common/Codec.java +++ b/eventmesh-emesher/src/test/java/client/common/Codec.java @@ -17,14 +17,14 @@ package client.common; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.RedirectInfo; -import cn.webank.eventmesh.common.protocol.tcp.Subscription; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.RedirectInfo; +import com.webank.eventmesh.common.protocol.tcp.Subscription; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; diff --git a/eventmesh-emesher/src/test/java/client/common/MessageUtils.java b/eventmesh-emesher/src/test/java/client/common/MessageUtils.java index 6d8345e674..e96188f85c 100644 --- a/eventmesh-emesher/src/test/java/client/common/MessageUtils.java +++ b/eventmesh-emesher/src/test/java/client/common/MessageUtils.java @@ -17,12 +17,12 @@ package client.common; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.Subscription; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Subscription; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import java.util.ArrayList; import java.util.List; diff --git a/eventmesh-emesher/src/test/java/client/common/RequestContext.java b/eventmesh-emesher/src/test/java/client/common/RequestContext.java index a85b01f004..149b4b4e0d 100644 --- a/eventmesh-emesher/src/test/java/client/common/RequestContext.java +++ b/eventmesh-emesher/src/test/java/client/common/RequestContext.java @@ -17,7 +17,7 @@ package client.common; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/test/java/client/common/Server.java b/eventmesh-emesher/src/test/java/client/common/Server.java index 9923f69bce..6187c49249 100644 --- a/eventmesh-emesher/src/test/java/client/common/Server.java +++ b/eventmesh-emesher/src/test/java/client/common/Server.java @@ -17,8 +17,8 @@ package client.common; -import cn.webank.emesher.boot.ProxyServer; -import cn.webank.emesher.configuration.ProxyConfiguration; +import com.webank.emesher.boot.ProxyServer; +import com.webank.emesher.configuration.ProxyConfiguration; public class Server { diff --git a/eventmesh-emesher/src/test/java/client/common/TCPClient.java b/eventmesh-emesher/src/test/java/client/common/TCPClient.java index a27de87d1b..ce23a09868 100644 --- a/eventmesh-emesher/src/test/java/client/common/TCPClient.java +++ b/eventmesh-emesher/src/test/java/client/common/TCPClient.java @@ -17,7 +17,7 @@ package client.common; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.AdaptiveRecvByteBufAllocator; diff --git a/eventmesh-emesher/src/test/java/client/common/UserAgentUtils.java b/eventmesh-emesher/src/test/java/client/common/UserAgentUtils.java index 0e1182c8db..92a65e2273 100644 --- a/eventmesh-emesher/src/test/java/client/common/UserAgentUtils.java +++ b/eventmesh-emesher/src/test/java/client/common/UserAgentUtils.java @@ -17,8 +17,8 @@ package client.common; -import cn.webank.emesher.constants.ProxyConstants; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.emesher.constants.ProxyConstants; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.remoting.common.RemotingUtil; diff --git a/eventmesh-emesher/src/test/java/client/hook/ReceiveMsgHook.java b/eventmesh-emesher/src/test/java/client/hook/ReceiveMsgHook.java index d27bfa5aea..bd6622c88b 100644 --- a/eventmesh-emesher/src/test/java/client/hook/ReceiveMsgHook.java +++ b/eventmesh-emesher/src/test/java/client/hook/ReceiveMsgHook.java @@ -17,7 +17,7 @@ package client.hook; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; /** * 业务回调钩子, 这是针对所有类型的消息都会进行的回调 diff --git a/eventmesh-emesher/src/test/java/client/impl/ProxyClientImpl.java b/eventmesh-emesher/src/test/java/client/impl/ProxyClientImpl.java index 201a816e3a..625b670722 100644 --- a/eventmesh-emesher/src/test/java/client/impl/ProxyClientImpl.java +++ b/eventmesh-emesher/src/test/java/client/impl/ProxyClientImpl.java @@ -22,8 +22,8 @@ import client.SubClient; import client.common.UserAgentUtils; import client.hook.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; public class ProxyClientImpl implements ProxyClient { protected UserAgent agent; diff --git a/eventmesh-emesher/src/test/java/client/impl/PubClientImpl.java b/eventmesh-emesher/src/test/java/client/impl/PubClientImpl.java index 86e97915c2..2cb8f3238b 100644 --- a/eventmesh-emesher/src/test/java/client/impl/PubClientImpl.java +++ b/eventmesh-emesher/src/test/java/client/impl/PubClientImpl.java @@ -23,10 +23,10 @@ import client.common.RequestContext; import client.common.TCPClient; import client.hook.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; diff --git a/eventmesh-emesher/src/test/java/client/impl/SubClientImpl.java b/eventmesh-emesher/src/test/java/client/impl/SubClientImpl.java index b44c4c6834..0f578567b1 100644 --- a/eventmesh-emesher/src/test/java/client/impl/SubClientImpl.java +++ b/eventmesh-emesher/src/test/java/client/impl/SubClientImpl.java @@ -23,10 +23,10 @@ import client.common.RequestContext; import client.common.TCPClient; import client.hook.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.OPStatus; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.OPStatus; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; diff --git a/eventmesh-emesher/src/test/java/demo/AsyncPubClient.java b/eventmesh-emesher/src/test/java/demo/AsyncPubClient.java index 888c344e2f..115537c4ec 100644 --- a/eventmesh-emesher/src/test/java/demo/AsyncPubClient.java +++ b/eventmesh-emesher/src/test/java/demo/AsyncPubClient.java @@ -22,8 +22,8 @@ import client.common.UserAgentUtils; import client.hook.ReceiveMsgHook; import client.impl.PubClientImpl; -import cn.webank.eventmesh.common.ThreadUtil; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.ThreadUtil; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; public class AsyncPubClient { diff --git a/eventmesh-emesher/src/test/java/demo/AsyncSubClient.java b/eventmesh-emesher/src/test/java/demo/AsyncSubClient.java index 37086f6a08..4145841cb7 100644 --- a/eventmesh-emesher/src/test/java/demo/AsyncSubClient.java +++ b/eventmesh-emesher/src/test/java/demo/AsyncSubClient.java @@ -21,8 +21,8 @@ import client.common.MessageUtils; import client.hook.ReceiveMsgHook; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; public class AsyncSubClient { diff --git a/eventmesh-emesher/src/test/java/demo/BroadCastPubClient.java b/eventmesh-emesher/src/test/java/demo/BroadCastPubClient.java index 1e6fab0ff1..e0e2841873 100644 --- a/eventmesh-emesher/src/test/java/demo/BroadCastPubClient.java +++ b/eventmesh-emesher/src/test/java/demo/BroadCastPubClient.java @@ -21,7 +21,7 @@ import client.common.MessageUtils; import client.common.UserAgentUtils; import client.impl.PubClientImpl; -import cn.webank.eventmesh.common.ThreadUtil; +import com.webank.eventmesh.common.ThreadUtil; public class BroadCastPubClient { public static void main(String[] args) throws Exception { diff --git a/eventmesh-emesher/src/test/java/demo/BroadCastSubClient.java b/eventmesh-emesher/src/test/java/demo/BroadCastSubClient.java index 3ff2d68e2a..30c2e01c67 100644 --- a/eventmesh-emesher/src/test/java/demo/BroadCastSubClient.java +++ b/eventmesh-emesher/src/test/java/demo/BroadCastSubClient.java @@ -21,9 +21,9 @@ import client.common.MessageUtils; import client.hook.ReceiveMsgHook; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; public class BroadCastSubClient { diff --git a/eventmesh-emesher/src/test/java/demo/CCSubClient.java b/eventmesh-emesher/src/test/java/demo/CCSubClient.java index f373ead9bd..6c1e21fef9 100644 --- a/eventmesh-emesher/src/test/java/demo/CCSubClient.java +++ b/eventmesh-emesher/src/test/java/demo/CCSubClient.java @@ -21,8 +21,8 @@ import client.common.UserAgentUtils; import client.hook.ReceiveMsgHook; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; public class CCSubClient { diff --git a/eventmesh-emesher/src/test/java/demo/CClientDemo.java b/eventmesh-emesher/src/test/java/demo/CClientDemo.java index 2c886854c8..0792d7f3bf 100644 --- a/eventmesh-emesher/src/test/java/demo/CClientDemo.java +++ b/eventmesh-emesher/src/test/java/demo/CClientDemo.java @@ -20,8 +20,8 @@ import client.common.MessageUtils; import client.hook.ReceiveMsgHook; import client.impl.ProxyClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-emesher/src/test/java/demo/SyncPubClient.java b/eventmesh-emesher/src/test/java/demo/SyncPubClient.java index bf7d6af7c5..927dce9cb0 100644 --- a/eventmesh-emesher/src/test/java/demo/SyncPubClient.java +++ b/eventmesh-emesher/src/test/java/demo/SyncPubClient.java @@ -20,8 +20,8 @@ import client.common.MessageUtils; import client.common.UserAgentUtils; import client.impl.PubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Package; public class SyncPubClient { public static void main(String[] args) throws Exception { diff --git a/eventmesh-emesher/src/test/java/demo/SyncSubClient.java b/eventmesh-emesher/src/test/java/demo/SyncSubClient.java index e1882479ee..50a62adf8b 100644 --- a/eventmesh-emesher/src/test/java/demo/SyncSubClient.java +++ b/eventmesh-emesher/src/test/java/demo/SyncSubClient.java @@ -21,8 +21,8 @@ import client.common.MessageUtils; import client.hook.ReceiveMsgHook; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; public class SyncSubClient { diff --git a/eventmesh-emesher/src/test/java/protocol/CmdAsync2ClientTest.java b/eventmesh-emesher/src/test/java/protocol/CmdAsync2ClientTest.java index 758d2a1a48..774f1325e0 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdAsync2ClientTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdAsync2ClientTest.java @@ -22,8 +22,8 @@ import client.common.UserAgentUtils; import client.hook.ReceiveMsgHook; import client.impl.PubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; import org.junit.AfterClass; import org.junit.Assert; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdAsync2ServerTest.java b/eventmesh-emesher/src/test/java/protocol/CmdAsync2ServerTest.java index 07983dfb69..7c3b1ae979 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdAsync2ServerTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdAsync2ServerTest.java @@ -22,8 +22,8 @@ import client.common.Server; import client.common.UserAgentUtils; import client.impl.PubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdBroadCast2ClientTest.java b/eventmesh-emesher/src/test/java/protocol/CmdBroadCast2ClientTest.java index a750815865..ddd2afbcfb 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdBroadCast2ClientTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdBroadCast2ClientTest.java @@ -22,8 +22,8 @@ import client.common.UserAgentUtils; import client.hook.ReceiveMsgHook; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; import org.junit.AfterClass; import org.junit.Assert; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdBroadCast2ServerTest.java b/eventmesh-emesher/src/test/java/protocol/CmdBroadCast2ServerTest.java index 2067042bd5..928a76fed0 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdBroadCast2ServerTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdBroadCast2ServerTest.java @@ -22,8 +22,8 @@ import client.common.Server; import client.common.UserAgentUtils; import client.impl.PubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdClientGoodByTest.java b/eventmesh-emesher/src/test/java/protocol/CmdClientGoodByTest.java index 5d767bec41..b0a3d51de5 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdClientGoodByTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdClientGoodByTest.java @@ -21,8 +21,8 @@ import client.common.Server; import client.common.UserAgentUtils; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdHeartbeatTest.java b/eventmesh-emesher/src/test/java/protocol/CmdHeartbeatTest.java index a30d98588b..978abbd159 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdHeartbeatTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdHeartbeatTest.java @@ -22,8 +22,8 @@ import client.common.UserAgentUtils; import client.hook.ReceiveMsgHook; import client.impl.PubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; import org.junit.AfterClass; import org.junit.Assert; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdListenTest.java b/eventmesh-emesher/src/test/java/protocol/CmdListenTest.java index 4a66480012..300bb2b469 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdListenTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdListenTest.java @@ -21,8 +21,8 @@ import client.common.Server; import client.common.UserAgentUtils; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdRecommendTest.java b/eventmesh-emesher/src/test/java/protocol/CmdRecommendTest.java index 087b0271d7..6973511611 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdRecommendTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdRecommendTest.java @@ -21,8 +21,8 @@ import client.common.Server; import client.common.UserAgentUtils; import client.impl.PubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdSendRRTest.java b/eventmesh-emesher/src/test/java/protocol/CmdSendRRTest.java index 1813565fc9..2516437d96 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdSendRRTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdSendRRTest.java @@ -24,8 +24,8 @@ import client.common.UserAgentUtils; import client.impl.PubClientImpl; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdSubscribeTest.java b/eventmesh-emesher/src/test/java/protocol/CmdSubscribeTest.java index b14d4bd4f6..3d6a3b2e3f 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdSubscribeTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdSubscribeTest.java @@ -21,8 +21,8 @@ import client.common.Server; import client.common.UserAgentUtils; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdSysLogTest.java b/eventmesh-emesher/src/test/java/protocol/CmdSysLogTest.java index 5256b2770d..caf8fce570 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdSysLogTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdSysLogTest.java @@ -22,7 +22,7 @@ import client.common.UserAgentUtils; import client.hook.ReceiveMsgHook; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; import org.junit.AfterClass; import org.junit.Assert; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdTraceLogTest.java b/eventmesh-emesher/src/test/java/protocol/CmdTraceLogTest.java index 328e13d7ac..7255adc3a6 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdTraceLogTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdTraceLogTest.java @@ -22,7 +22,7 @@ import client.common.UserAgentUtils; import client.hook.ReceiveMsgHook; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; import org.junit.AfterClass; import org.junit.Assert; diff --git a/eventmesh-emesher/src/test/java/protocol/CmdUnSubscribeTest.java b/eventmesh-emesher/src/test/java/protocol/CmdUnSubscribeTest.java index bf9bfbe778..4210655195 100644 --- a/eventmesh-emesher/src/test/java/protocol/CmdUnSubscribeTest.java +++ b/eventmesh-emesher/src/test/java/protocol/CmdUnSubscribeTest.java @@ -21,8 +21,8 @@ import client.common.Server; import client.common.UserAgentUtils; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Package; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; diff --git a/eventmesh-emesher/src/test/java/test/BasicTest.java b/eventmesh-emesher/src/test/java/test/BasicTest.java index a78fefd047..38a4ecf404 100644 --- a/eventmesh-emesher/src/test/java/test/BasicTest.java +++ b/eventmesh-emesher/src/test/java/test/BasicTest.java @@ -25,8 +25,8 @@ import client.impl.ProxyClientImpl; import client.impl.PubClientImpl; import client.impl.SubClientImpl; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Package; import io.netty.channel.ChannelHandlerContext; import org.junit.Test; diff --git a/eventmesh-registry/build.gradle b/eventmesh-registry/build.gradle index 11bbc47bf2..508f08e747 100644 --- a/eventmesh-registry/build.gradle +++ b/eventmesh-registry/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java' } -group 'cn.webank.defibus' +group 'com.webank.defibus' version '1.0.0' repositories { diff --git a/eventmesh-sdk-java/gradle.properties b/eventmesh-sdk-java/gradle.properties index a6e43165e7..a2e0433d14 100644 --- a/eventmesh-sdk-java/gradle.properties +++ b/eventmesh-sdk-java/gradle.properties @@ -15,8 +15,8 @@ # limitations under the License. # -group=cn.webank.eventmesh -version=3.0.1 +group=com.webank.eventmesh +version=1.0.0 jdk=1.8 snapshot=false -proxy_common_version=3.0.1 +proxy_common_version=1.0.0 diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/AbstractLiteClient.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/AbstractLiteClient.java similarity index 94% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/AbstractLiteClient.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/AbstractLiteClient.java index 5b9e9d1b4e..546b50bcf7 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/AbstractLiteClient.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/AbstractLiteClient.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http; - -import cn.webank.eventmesh.client.http.conf.LiteClientConfig; -import cn.webank.eventmesh.client.http.http.HttpUtil; -import cn.webank.eventmesh.client.http.http.RequestParam; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.ProxyException; -import cn.webank.eventmesh.common.ThreadPoolFactory; +package com.webank.eventmesh.client.http; + +import com.webank.eventmesh.client.http.conf.LiteClientConfig; +import com.webank.eventmesh.client.http.http.HttpUtil; +import com.webank.eventmesh.client.http.http.RequestParam; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.ProxyException; +import com.webank.eventmesh.common.ThreadPoolFactory; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import io.netty.handler.codec.http.HttpMethod; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/ProxyRetObj.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/ProxyRetObj.java similarity index 96% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/ProxyRetObj.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/ProxyRetObj.java index 2c6f6b1f32..7209a31a0c 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/ProxyRetObj.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/ProxyRetObj.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http; +package com.webank.eventmesh.client.http; public class ProxyRetObj { diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/RemotingServer.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/RemotingServer.java similarity index 93% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/RemotingServer.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/RemotingServer.java index ad005385fc..b4c498312c 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/RemotingServer.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/RemotingServer.java @@ -15,23 +15,23 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http; -import cn.webank.eventmesh.client.http.consumer.HandleResult; -import cn.webank.eventmesh.client.http.consumer.context.LiteConsumeContext; -import cn.webank.eventmesh.client.http.consumer.listener.LiteMessageListener; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.LiteMessage; -import cn.webank.eventmesh.common.ThreadUtil; -import cn.webank.eventmesh.common.command.HttpCommand; -import cn.webank.eventmesh.common.protocol.http.body.Body; -import cn.webank.eventmesh.common.protocol.http.body.message.PushMessageRequestBody; -import cn.webank.eventmesh.common.protocol.http.common.ClientRetCode; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; -import cn.webank.eventmesh.common.protocol.http.header.Header; -import cn.webank.eventmesh.common.protocol.http.header.message.PushMessageRequestHeader; +package com.webank.eventmesh.client.http; +import com.webank.eventmesh.client.http.consumer.HandleResult; +import com.webank.eventmesh.client.http.consumer.context.LiteConsumeContext; +import com.webank.eventmesh.client.http.consumer.listener.LiteMessageListener; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.ThreadUtil; +import com.webank.eventmesh.common.command.HttpCommand; +import com.webank.eventmesh.common.protocol.http.body.Body; +import com.webank.eventmesh.common.protocol.http.body.message.PushMessageRequestBody; +import com.webank.eventmesh.common.protocol.http.common.ClientRetCode; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; +import com.webank.eventmesh.common.protocol.http.header.Header; +import com.webank.eventmesh.common.protocol.http.header.message.PushMessageRequestHeader; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/conf/LiteClientConfig.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/conf/LiteClientConfig.java similarity index 99% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/conf/LiteClientConfig.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/conf/LiteClientConfig.java index 0e8ef9e154..880cce5e99 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/conf/LiteClientConfig.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/conf/LiteClientConfig.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.conf; +package com.webank.eventmesh.client.http.conf; import com.google.common.base.Preconditions; import org.apache.commons.lang3.StringUtils; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/HandleResult.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/HandleResult.java similarity index 94% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/HandleResult.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/HandleResult.java index 9442cf1a12..0b88101989 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/HandleResult.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/HandleResult.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.consumer; +package com.webank.eventmesh.client.http.consumer; public enum HandleResult { OK, diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/LiteConsumer.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/LiteConsumer.java similarity index 89% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/LiteConsumer.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/LiteConsumer.java index 4242fe2456..996357631c 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/LiteConsumer.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/LiteConsumer.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.consumer; - -import cn.webank.eventmesh.client.http.AbstractLiteClient; -import cn.webank.eventmesh.client.http.RemotingServer; -import cn.webank.eventmesh.client.http.conf.LiteClientConfig; -import cn.webank.eventmesh.client.http.consumer.listener.LiteMessageListener; -import cn.webank.eventmesh.common.ProxyException; -import cn.webank.eventmesh.common.ThreadPoolFactory; +package com.webank.eventmesh.client.http.consumer; + +import com.webank.eventmesh.client.http.AbstractLiteClient; +import com.webank.eventmesh.client.http.RemotingServer; +import com.webank.eventmesh.client.http.conf.LiteClientConfig; +import com.webank.eventmesh.client.http.consumer.listener.LiteMessageListener; +import com.webank.eventmesh.common.ProxyException; +import com.webank.eventmesh.common.ThreadPoolFactory; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import org.apache.http.impl.client.CloseableHttpClient; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/context/LiteConsumeContext.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/context/LiteConsumeContext.java similarity index 97% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/context/LiteConsumeContext.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/context/LiteConsumeContext.java index 564b5ec43f..b6b4f2658c 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/context/LiteConsumeContext.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/context/LiteConsumeContext.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.consumer.context; +package com.webank.eventmesh.client.http.consumer.context; -import cn.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.Constants; import org.apache.commons.lang3.time.DateFormatUtils; public class LiteConsumeContext { diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/listener/LiteMessageListener.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/listener/LiteMessageListener.java similarity index 79% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/listener/LiteMessageListener.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/listener/LiteMessageListener.java index 63af336ee1..3e2aa367d8 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/consumer/listener/LiteMessageListener.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/listener/LiteMessageListener.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.consumer.listener; +package com.webank.eventmesh.client.http.consumer.listener; -import cn.webank.eventmesh.client.http.consumer.HandleResult; -import cn.webank.eventmesh.client.http.consumer.context.LiteConsumeContext; -import cn.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.client.http.consumer.HandleResult; +import com.webank.eventmesh.client.http.consumer.context.LiteConsumeContext; +import com.webank.eventmesh.common.LiteMessage; public interface LiteMessageListener { diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/http/HttpUtil.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/http/HttpUtil.java similarity index 99% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/http/HttpUtil.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/http/HttpUtil.java index a6194cf8b2..05f9a266cf 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/http/HttpUtil.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/http/HttpUtil.java @@ -15,8 +15,8 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.http; -import cn.webank.eventmesh.common.Constants; +package com.webank.eventmesh.client.http.http; +import com.webank.eventmesh.common.Constants; import com.google.common.base.Preconditions; import io.netty.handler.codec.http.HttpMethod; import org.apache.commons.collections4.MapUtils; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/http/RequestParam.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/http/RequestParam.java similarity index 98% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/http/RequestParam.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/http/RequestParam.java index f783857d65..ce03e0be51 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/http/RequestParam.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/http/RequestParam.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.http; +package com.webank.eventmesh.client.http.http; import io.netty.handler.codec.http.HttpMethod; import org.slf4j.Logger; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/producer/LiteProducer.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/producer/LiteProducer.java similarity index 92% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/producer/LiteProducer.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/producer/LiteProducer.java index d06a31b907..abfe612d1b 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/producer/LiteProducer.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/producer/LiteProducer.java @@ -15,22 +15,22 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.producer; - -import cn.webank.eventmesh.client.http.AbstractLiteClient; -import cn.webank.eventmesh.client.http.ProxyRetObj; -import cn.webank.eventmesh.client.http.conf.LiteClientConfig; -import cn.webank.eventmesh.client.http.http.HttpUtil; -import cn.webank.eventmesh.client.http.http.RequestParam; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.LiteMessage; -import cn.webank.eventmesh.common.ProxyException; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageRequestBody; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolKey; -import cn.webank.eventmesh.common.protocol.http.common.ProtocolVersion; -import cn.webank.eventmesh.common.protocol.http.common.ProxyRetCode; -import cn.webank.eventmesh.common.protocol.http.common.RequestCode; +package com.webank.eventmesh.client.http.producer; + +import com.webank.eventmesh.client.http.AbstractLiteClient; +import com.webank.eventmesh.client.http.ProxyRetObj; +import com.webank.eventmesh.client.http.conf.LiteClientConfig; +import com.webank.eventmesh.client.http.http.HttpUtil; +import com.webank.eventmesh.client.http.http.RequestParam; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.ProxyException; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageRequestBody; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; +import com.webank.eventmesh.common.protocol.http.common.ProtocolKey; +import com.webank.eventmesh.common.protocol.http.common.ProtocolVersion; +import com.webank.eventmesh.common.protocol.http.common.ProxyRetCode; +import com.webank.eventmesh.common.protocol.http.common.RequestCode; import com.alibaba.fastjson.JSON; import com.google.common.base.Preconditions; import io.netty.handler.codec.http.HttpMethod; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/producer/RRCallback.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/producer/RRCallback.java similarity index 90% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/producer/RRCallback.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/producer/RRCallback.java index e08cd00811..53fbaea84c 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/producer/RRCallback.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/producer/RRCallback.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.producer; +package com.webank.eventmesh.client.http.producer; -import cn.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.LiteMessage; public interface RRCallback { diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/producer/RRCallbackResponseHandlerAdapter.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/producer/RRCallbackResponseHandlerAdapter.java similarity index 90% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/producer/RRCallbackResponseHandlerAdapter.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/producer/RRCallbackResponseHandlerAdapter.java index c0dc77bb0a..a70f8c548b 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/http/producer/RRCallbackResponseHandlerAdapter.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/producer/RRCallbackResponseHandlerAdapter.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.http.producer; +package com.webank.eventmesh.client.http.producer; -import cn.webank.eventmesh.client.http.ProxyRetObj; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.LiteMessage; -import cn.webank.eventmesh.common.ProxyException; -import cn.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; -import cn.webank.eventmesh.common.protocol.http.common.ProxyRetCode; +import com.webank.eventmesh.client.http.ProxyRetObj; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.ProxyException; +import com.webank.eventmesh.common.protocol.http.body.message.SendMessageResponseBody; +import com.webank.eventmesh.common.protocol.http.common.ProxyRetCode; import com.alibaba.fastjson.JSON; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.http.HttpResponse; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/SimplePubClient.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/SimplePubClient.java similarity index 83% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/SimplePubClient.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/SimplePubClient.java index 76242df2b8..ca1953bfe6 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/SimplePubClient.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/SimplePubClient.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp; +package com.webank.eventmesh.client.tcp; -import cn.webank.eventmesh.client.tcp.common.AsyncRRCallback; -import cn.webank.eventmesh.client.tcp.common.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.client.tcp.common.AsyncRRCallback; +import com.webank.eventmesh.client.tcp.common.ReceiveMsgHook; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.Package; /** * diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/SimpleSubClient.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/SimpleSubClient.java similarity index 88% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/SimpleSubClient.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/SimpleSubClient.java index bf77b357d0..98075da0bf 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/SimpleSubClient.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/SimpleSubClient.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp; +package com.webank.eventmesh.client.tcp; -import cn.webank.eventmesh.client.tcp.common.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.client.tcp.common.ReceiveMsgHook; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; /** * Created by nanoxiong on 2017/4/26. diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/WemqAccessClient.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/WemqAccessClient.java similarity index 87% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/WemqAccessClient.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/WemqAccessClient.java index cdab833449..01f0532189 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/WemqAccessClient.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/WemqAccessClient.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp; +package com.webank.eventmesh.client.tcp; -import cn.webank.eventmesh.client.tcp.common.AsyncRRCallback; -import cn.webank.eventmesh.client.tcp.common.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.client.tcp.common.AsyncRRCallback; +import com.webank.eventmesh.client.tcp.common.ReceiveMsgHook; +import com.webank.eventmesh.common.protocol.tcp.Package; public interface WemqAccessClient { diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/AsyncRRCallback.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/AsyncRRCallback.java similarity index 90% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/AsyncRRCallback.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/AsyncRRCallback.java index f70b4dd33a..b198ca28f6 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/AsyncRRCallback.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/AsyncRRCallback.java @@ -15,8 +15,8 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.common; -import cn.webank.eventmesh.common.protocol.tcp.Package; +package com.webank.eventmesh.client.tcp.common; +import com.webank.eventmesh.common.protocol.tcp.Package; /** * Created by nanoxiong on 2017/5/30. diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/MessageUtils.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/MessageUtils.java similarity index 93% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/MessageUtils.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/MessageUtils.java index 69c82c928e..71ccfa1159 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/MessageUtils.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/MessageUtils.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.common; +package com.webank.eventmesh.client.tcp.common; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.Subscription; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.Subscription; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.Package; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ThreadLocalRandom; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/ReceiveMsgHook.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/ReceiveMsgHook.java similarity index 91% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/ReceiveMsgHook.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/ReceiveMsgHook.java index 1773936113..2ec8b89059 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/ReceiveMsgHook.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/ReceiveMsgHook.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.common; +package com.webank.eventmesh.client.tcp.common; import io.netty.channel.ChannelHandlerContext; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; /** * Created by nanoxiong on 2017/4/26. * 业务回调钩子, 这是针对所有类型的消息都会进行的回调 diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/RequestContext.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/RequestContext.java similarity index 96% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/RequestContext.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/RequestContext.java index be909dc5e5..47b510f679 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/RequestContext.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/RequestContext.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.common; +package com.webank.eventmesh.client.tcp.common; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; import java.util.concurrent.CountDownLatch; /** diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/TcpClient.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/TcpClient.java similarity index 96% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/TcpClient.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/TcpClient.java index da34523e1f..e82ef75be2 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/TcpClient.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/TcpClient.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.common; +package com.webank.eventmesh.client.tcp.common; -import cn.webank.eventmesh.common.protocol.tcp.codec.Codec; +import com.webank.eventmesh.common.protocol.tcp.codec.Codec; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.*; @@ -26,7 +26,7 @@ import io.netty.channel.socket.nio.NioSocketChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; import java.io.Closeable; import java.io.IOException; import java.net.InetSocketAddress; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/WemqAccessCommon.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/WemqAccessCommon.java similarity index 98% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/WemqAccessCommon.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/WemqAccessCommon.java index 1c8d47e88d..76ee0bf701 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/WemqAccessCommon.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/WemqAccessCommon.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.common; +package com.webank.eventmesh.client.tcp.common; /** * Created by nanoxiong on 2017/6/8. diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/WemqAccessThreadFactoryImpl.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/WemqAccessThreadFactoryImpl.java similarity index 97% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/WemqAccessThreadFactoryImpl.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/WemqAccessThreadFactoryImpl.java index 74a425b9b7..3033c07986 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/common/WemqAccessThreadFactoryImpl.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/common/WemqAccessThreadFactoryImpl.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.common; +package com.webank.eventmesh.client.tcp.common; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicLong; diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/impl/DefaultWemqAccessClient.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/impl/DefaultWemqAccessClient.java similarity index 87% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/impl/DefaultWemqAccessClient.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/impl/DefaultWemqAccessClient.java index fd672d646a..6563d8b27e 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/impl/DefaultWemqAccessClient.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/impl/DefaultWemqAccessClient.java @@ -15,17 +15,17 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.impl; +package com.webank.eventmesh.client.tcp.impl; -import cn.webank.eventmesh.client.tcp.SimplePubClient; -import cn.webank.eventmesh.client.tcp.SimpleSubClient; -import cn.webank.eventmesh.client.tcp.WemqAccessClient; -import cn.webank.eventmesh.client.tcp.common.AsyncRRCallback; -import cn.webank.eventmesh.client.tcp.common.MessageUtils; -import cn.webank.eventmesh.client.tcp.common.ReceiveMsgHook; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.client.tcp.SimplePubClient; +import com.webank.eventmesh.client.tcp.SimpleSubClient; +import com.webank.eventmesh.client.tcp.WemqAccessClient; +import com.webank.eventmesh.client.tcp.common.AsyncRRCallback; +import com.webank.eventmesh.client.tcp.common.MessageUtils; +import com.webank.eventmesh.client.tcp.common.ReceiveMsgHook; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.Package; /** * Created by nanoxiong on 2017/5/24. diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/impl/SimplePubClientImpl.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/impl/SimplePubClientImpl.java similarity index 90% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/impl/SimplePubClientImpl.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/impl/SimplePubClientImpl.java index 97f7405fd2..308b2f776f 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/impl/SimplePubClientImpl.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/impl/SimplePubClientImpl.java @@ -15,17 +15,17 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.impl; - -import cn.webank.eventmesh.client.tcp.SimplePubClient; -import cn.webank.eventmesh.client.tcp.common.AsyncRRCallback; -import cn.webank.eventmesh.client.tcp.common.MessageUtils; -import cn.webank.eventmesh.client.tcp.common.ReceiveMsgHook; -import cn.webank.eventmesh.client.tcp.common.RequestContext; -import cn.webank.eventmesh.client.tcp.common.TcpClient; -import cn.webank.eventmesh.client.tcp.common.WemqAccessCommon; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +package com.webank.eventmesh.client.tcp.impl; + +import com.webank.eventmesh.client.tcp.SimplePubClient; +import com.webank.eventmesh.client.tcp.common.AsyncRRCallback; +import com.webank.eventmesh.client.tcp.common.MessageUtils; +import com.webank.eventmesh.client.tcp.common.ReceiveMsgHook; +import com.webank.eventmesh.client.tcp.common.RequestContext; +import com.webank.eventmesh.client.tcp.common.TcpClient; +import com.webank.eventmesh.client.tcp.common.WemqAccessCommon; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -35,7 +35,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; /** * Created by nanoxiong on 2017/4/25. diff --git a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/impl/SimpleSubClientImpl.java b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/impl/SimpleSubClientImpl.java similarity index 90% rename from eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/impl/SimpleSubClientImpl.java rename to eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/impl/SimpleSubClientImpl.java index b901f3ed9e..245048cb96 100644 --- a/eventmesh-sdk-java/src/main/java/cn/webank/eventmesh/client/tcp/impl/SimpleSubClientImpl.java +++ b/eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/impl/SimpleSubClientImpl.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package cn.webank.eventmesh.client.tcp.impl; - -import cn.webank.eventmesh.client.tcp.SimpleSubClient; -import cn.webank.eventmesh.client.tcp.common.MessageUtils; -import cn.webank.eventmesh.client.tcp.common.ReceiveMsgHook; -import cn.webank.eventmesh.client.tcp.common.RequestContext; -import cn.webank.eventmesh.client.tcp.common.TcpClient; -import cn.webank.eventmesh.client.tcp.common.WemqAccessCommon; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +package com.webank.eventmesh.client.tcp.impl; + +import com.webank.eventmesh.client.tcp.SimpleSubClient; +import com.webank.eventmesh.client.tcp.common.MessageUtils; +import com.webank.eventmesh.client.tcp.common.ReceiveMsgHook; +import com.webank.eventmesh.client.tcp.common.RequestContext; +import com.webank.eventmesh.client.tcp.common.TcpClient; +import com.webank.eventmesh.client.tcp.common.WemqAccessCommon; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -36,7 +36,7 @@ import java.util.List; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import cn.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.Package; /** * Created by nanoxiong on 2017/4/26. diff --git a/eventmesh-sdk-java/src/main/resources/log4j2.xml b/eventmesh-sdk-java/src/main/resources/log4j2.xml index 3de93b304b..e3f037b9cb 100644 --- a/eventmesh-sdk-java/src/main/resources/log4j2.xml +++ b/eventmesh-sdk-java/src/main/resources/log4j2.xml @@ -28,7 +28,7 @@ - + diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/http/demo/AsyncPublishInstance.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/AsyncPublishInstance.java similarity index 85% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/http/demo/AsyncPublishInstance.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/AsyncPublishInstance.java index 34d891c5bb..11e3266ffa 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/http/demo/AsyncPublishInstance.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/AsyncPublishInstance.java @@ -1,10 +1,10 @@ -package cn.webank.eventmesh.client.http.demo; -import cn.webank.eventmesh.client.http.conf.LiteClientConfig; -import cn.webank.eventmesh.client.http.producer.LiteProducer; -import cn.webank.eventmesh.common.Constants; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.LiteMessage; -import cn.webank.eventmesh.common.ThreadUtil; +package com.webank.eventmesh.client.http.demo; +import com.webank.eventmesh.client.http.conf.LiteClientConfig; +import com.webank.eventmesh.client.http.producer.LiteProducer; +import com.webank.eventmesh.common.Constants; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.ThreadUtil; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/http/demo/AsyncSyncRequestInstance.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/AsyncSyncRequestInstance.java similarity index 91% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/http/demo/AsyncSyncRequestInstance.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/AsyncSyncRequestInstance.java index 454cff815a..3e82662d20 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/http/demo/AsyncSyncRequestInstance.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/AsyncSyncRequestInstance.java @@ -1,11 +1,11 @@ -package cn.webank.eventmesh.client.http.demo; -import cn.webank.eventmesh.client.http.conf.LiteClientConfig; -import cn.webank.eventmesh.client.http.producer.LiteProducer; -import cn.webank.eventmesh.client.http.producer.RRCallback; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.LiteMessage; -import cn.webank.eventmesh.common.ThreadPoolFactory; -import cn.webank.eventmesh.common.ThreadUtil; +package com.webank.eventmesh.client.http.demo; +import com.webank.eventmesh.client.http.conf.LiteClientConfig; +import com.webank.eventmesh.client.http.producer.LiteProducer; +import com.webank.eventmesh.client.http.producer.RRCallback; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.ThreadPoolFactory; +import com.webank.eventmesh.common.ThreadUtil; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/http/demo/SyncRequestInstance.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/SyncRequestInstance.java similarity index 93% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/http/demo/SyncRequestInstance.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/SyncRequestInstance.java index 9280d7feef..58058e827b 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/http/demo/SyncRequestInstance.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/SyncRequestInstance.java @@ -1,10 +1,10 @@ -package cn.webank.eventmesh.client.http.demo; -import cn.webank.eventmesh.client.http.conf.LiteClientConfig; -import cn.webank.eventmesh.client.http.producer.LiteProducer; -import cn.webank.eventmesh.common.IPUtil; -import cn.webank.eventmesh.common.LiteMessage; -import cn.webank.eventmesh.common.ThreadPoolFactory; -import cn.webank.eventmesh.common.ThreadUtil; +package com.webank.eventmesh.client.http.demo; +import com.webank.eventmesh.client.http.conf.LiteClientConfig; +import com.webank.eventmesh.client.http.producer.LiteProducer; +import com.webank.eventmesh.common.IPUtil; +import com.webank.eventmesh.common.LiteMessage; +import com.webank.eventmesh.common.ThreadPoolFactory; +import com.webank.eventmesh.common.ThreadUtil; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/common/AccessTestCaseTopicSet.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/common/AccessTestCaseTopicSet.java similarity index 86% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/common/AccessTestCaseTopicSet.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/common/AccessTestCaseTopicSet.java index 8ab10f1c99..bc1cc66fe1 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/common/AccessTestCaseTopicSet.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/common/AccessTestCaseTopicSet.java @@ -1,4 +1,4 @@ -package cn.webank.eventmesh.client.tcp.common; +package com.webank.eventmesh.client.tcp.common; /** * Testcase set diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/common/AccessTestUtils.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/common/AccessTestUtils.java similarity index 90% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/common/AccessTestUtils.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/common/AccessTestUtils.java index 86cbe2c4bf..4d57b53569 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/common/AccessTestUtils.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/common/AccessTestUtils.java @@ -1,15 +1,15 @@ -package cn.webank.eventmesh.client.tcp.common; +package com.webank.eventmesh.client.tcp.common; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Command; -import cn.webank.eventmesh.common.protocol.tcp.Header; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Command; +import com.webank.eventmesh.common.protocol.tcp.Header; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import java.util.concurrent.ThreadLocalRandom; -import static cn.webank.eventmesh.client.tcp.common.AccessTestCaseTopicSet.*; -import static cn.webank.eventmesh.common.protocol.tcp.Command.RESPONSE_TO_SERVER; +import static com.webank.eventmesh.client.tcp.common.AccessTestCaseTopicSet.*; +import static com.webank.eventmesh.common.protocol.tcp.Command.RESPONSE_TO_SERVER; public class AccessTestUtils { private static final int seqLength = 10; diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncPublish.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncPublish.java similarity index 69% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncPublish.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncPublish.java index 4543485b84..0e8da98386 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncPublish.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncPublish.java @@ -1,11 +1,11 @@ -package cn.webank.eventmesh.client.tcp.demo; - -import cn.webank.eventmesh.client.tcp.WemqAccessClient; -import cn.webank.eventmesh.client.tcp.common.AccessTestUtils; -import cn.webank.eventmesh.client.tcp.common.WemqAccessCommon; -import cn.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +package com.webank.eventmesh.client.tcp.demo; + +import com.webank.eventmesh.client.tcp.WemqAccessClient; +import com.webank.eventmesh.client.tcp.common.AccessTestUtils; +import com.webank.eventmesh.client.tcp.common.WemqAccessCommon; +import com.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncPublishBroadcast.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncPublishBroadcast.java similarity index 69% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncPublishBroadcast.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncPublishBroadcast.java index 8896b35401..57dc0b6a5d 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncPublishBroadcast.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncPublishBroadcast.java @@ -1,11 +1,11 @@ -package cn.webank.eventmesh.client.tcp.demo; +package com.webank.eventmesh.client.tcp.demo; -import cn.webank.eventmesh.client.tcp.WemqAccessClient; -import cn.webank.eventmesh.client.tcp.common.AccessTestUtils; -import cn.webank.eventmesh.client.tcp.common.WemqAccessCommon; -import cn.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.client.tcp.WemqAccessClient; +import com.webank.eventmesh.client.tcp.common.AccessTestUtils; +import com.webank.eventmesh.client.tcp.common.WemqAccessCommon; +import com.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncSubscribe.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncSubscribe.java similarity index 68% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncSubscribe.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncSubscribe.java index 9794af83f0..c910150497 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncSubscribe.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncSubscribe.java @@ -1,17 +1,17 @@ -package cn.webank.eventmesh.client.tcp.demo; - -import cn.webank.eventmesh.client.tcp.WemqAccessClient; -import cn.webank.eventmesh.client.tcp.common.AccessTestUtils; -import cn.webank.eventmesh.client.tcp.common.ReceiveMsgHook; -import cn.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +package com.webank.eventmesh.client.tcp.demo; + +import com.webank.eventmesh.client.tcp.WemqAccessClient; +import com.webank.eventmesh.client.tcp.common.AccessTestUtils; +import com.webank.eventmesh.client.tcp.common.ReceiveMsgHook; +import com.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AsyncSubscribe implements ReceiveMsgHook{ +public class AsyncSubscribe implements ReceiveMsgHook { public static Logger logger = LoggerFactory.getLogger(AsyncSubscribe.class); diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncSubscribeBroadcast.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncSubscribeBroadcast.java similarity index 68% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncSubscribeBroadcast.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncSubscribeBroadcast.java index 0677903fa0..90614a70b7 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/AsyncSubscribeBroadcast.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncSubscribeBroadcast.java @@ -1,17 +1,17 @@ -package cn.webank.eventmesh.client.tcp.demo; - -import cn.webank.eventmesh.client.tcp.WemqAccessClient; -import cn.webank.eventmesh.client.tcp.common.AccessTestUtils; -import cn.webank.eventmesh.client.tcp.common.ReceiveMsgHook; -import cn.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; -import cn.webank.eventmesh.common.protocol.tcp.AccessMessage; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +package com.webank.eventmesh.client.tcp.demo; + +import com.webank.eventmesh.client.tcp.WemqAccessClient; +import com.webank.eventmesh.client.tcp.common.AccessTestUtils; +import com.webank.eventmesh.client.tcp.common.ReceiveMsgHook; +import com.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; +import com.webank.eventmesh.common.protocol.tcp.AccessMessage; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AsyncSubscribeBroadcast implements ReceiveMsgHook{ +public class AsyncSubscribeBroadcast implements ReceiveMsgHook { public static Logger logger = LoggerFactory.getLogger(AsyncSubscribeBroadcast.class); diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/SyncRequest.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/SyncRequest.java similarity index 69% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/SyncRequest.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/SyncRequest.java index 96cb070469..a4ff5ed713 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/SyncRequest.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/SyncRequest.java @@ -1,11 +1,11 @@ -package cn.webank.eventmesh.client.tcp.demo; +package com.webank.eventmesh.client.tcp.demo; -import cn.webank.eventmesh.client.tcp.WemqAccessClient; -import cn.webank.eventmesh.client.tcp.common.AccessTestUtils; -import cn.webank.eventmesh.client.tcp.common.WemqAccessCommon; -import cn.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +import com.webank.eventmesh.client.tcp.WemqAccessClient; +import com.webank.eventmesh.client.tcp.common.AccessTestUtils; +import com.webank.eventmesh.client.tcp.common.WemqAccessCommon; +import com.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/SyncResponse.java b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/SyncResponse.java similarity index 71% rename from eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/SyncResponse.java rename to eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/SyncResponse.java index 7ba4d9e2db..962d10c2df 100644 --- a/eventmesh-sdk-java/src/test/java/cn/webank/eventmesh/client/tcp/demo/SyncResponse.java +++ b/eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/SyncResponse.java @@ -1,16 +1,16 @@ -package cn.webank.eventmesh.client.tcp.demo; - -import cn.webank.eventmesh.client.tcp.WemqAccessClient; -import cn.webank.eventmesh.client.tcp.common.AccessTestUtils; -import cn.webank.eventmesh.client.tcp.common.ReceiveMsgHook; -import cn.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; -import cn.webank.eventmesh.common.protocol.tcp.Package; -import cn.webank.eventmesh.common.protocol.tcp.UserAgent; +package com.webank.eventmesh.client.tcp.demo; + +import com.webank.eventmesh.client.tcp.WemqAccessClient; +import com.webank.eventmesh.client.tcp.common.AccessTestUtils; +import com.webank.eventmesh.client.tcp.common.ReceiveMsgHook; +import com.webank.eventmesh.client.tcp.impl.DefaultWemqAccessClient; +import com.webank.eventmesh.common.protocol.tcp.Package; +import com.webank.eventmesh.common.protocol.tcp.UserAgent; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SyncResponse implements ReceiveMsgHook{ +public class SyncResponse implements ReceiveMsgHook { public static Logger logger = LoggerFactory.getLogger(SyncResponse.class); diff --git a/eventmesh-sdk-java/src/test/resources/log4j2.xml b/eventmesh-sdk-java/src/test/resources/log4j2.xml index 5466c31dbb..99f79985fb 100644 --- a/eventmesh-sdk-java/src/test/resources/log4j2.xml +++ b/eventmesh-sdk-java/src/test/resources/log4j2.xml @@ -28,7 +28,7 @@ - + diff --git a/gradle.properties b/gradle.properties index 0f01d9b8a2..36bdf27fde 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -group=cn.webank.eventmesh +group=com.webank.eventmesh version=1.0.0 rocketmqVersion=4.4.0 jdk=1.8 From df2b012774c6d816a241d4b06fcef7534d20b7f3 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Thu, 20 Aug 2020 11:49:14 +0800 Subject: [PATCH 23/26] rename docs --- {docs => doc}/_config.yml | 0 {docs => doc}/cn/features/0-introduction.md | 0 .../cn/features/1-request-response-call.md | 0 {docs => doc}/cn/features/10-flow-control.md | 0 {docs => doc}/cn/features/2-dark-launch.md | 0 .../cn/features/3-circuit-break-mechanism.md | 0 .../cn/features/4-invoke-service-nearby.md | 0 {docs => doc}/cn/features/5-multi-active.md | 0 .../cn/features/6-dynamic-adjust-queue.md | 0 .../cn/features/7-isolation-mechanism.md | 0 {docs => doc}/cn/features/8-fault-tolerant.md | 0 {docs => doc}/cn/features/9-publish-type.md | 0 .../eventmesh-emesher-quickstart.zh-CN.md | 0 .../eventmesh-sdk-java-quickstart.zh-CN.md | 0 .../eventmesh-store-quickstart.zh-CN.md | 0 .../cn/instructions/quickstart.zh-CN.md | 0 {docs => doc}/en/features/architecture.md | 0 .../en/features/request-response-call.md | 0 .../eventmesh-emesher-quickstart.md | 0 .../eventmesh-sdk-java-quickstart.md | 0 .../instructions/eventmesh-store-quickstart.md | 0 {docs => doc}/en/instructions/quickstart.md | 0 {docs => doc}/images/eventmesh-arch.png | Bin {docs => doc}/images/eventmesh-define.png | Bin {docs => doc}/images/eventmesh-landscape.png | Bin {docs => doc}/images/features/RR-call-p1.png | Bin ...stributing-architecture-in-financial-EN.png | Bin ...-distributing-architecture-in-financial.png | Bin .../images/features/adjust-queue-expand-p1.png | Bin .../images/features/adjust-queue-shrink-p1.png | Bin .../images/features/architecture-p1.png | Bin {docs => doc}/images/features/broadcast.png | Bin .../images/features/circuit-break-p1.png | Bin .../images/features/dark-launch-p1.png | Bin .../images/features/invoke_nearby-p1.png | Bin {docs => doc}/images/features/multicast.png | Bin .../images/features/subscribe-nearby-p1.png | Bin .../images/features/tongchengduohuo-p1.png | Bin {docs => doc}/images/features/unicast.png | Bin doc/images/mesh-helper.png | Bin 0 -> 44009 bytes {docs => doc}/images/qqgroup-crcode.png | Bin docs/images/mesh-helper.png | Bin 127224 -> 0 bytes 42 files changed, 0 insertions(+), 0 deletions(-) rename {docs => doc}/_config.yml (100%) rename {docs => doc}/cn/features/0-introduction.md (100%) rename {docs => doc}/cn/features/1-request-response-call.md (100%) rename {docs => doc}/cn/features/10-flow-control.md (100%) rename {docs => doc}/cn/features/2-dark-launch.md (100%) rename {docs => doc}/cn/features/3-circuit-break-mechanism.md (100%) rename {docs => doc}/cn/features/4-invoke-service-nearby.md (100%) rename {docs => doc}/cn/features/5-multi-active.md (100%) rename {docs => doc}/cn/features/6-dynamic-adjust-queue.md (100%) rename {docs => doc}/cn/features/7-isolation-mechanism.md (100%) rename {docs => doc}/cn/features/8-fault-tolerant.md (100%) rename {docs => doc}/cn/features/9-publish-type.md (100%) rename {docs => doc}/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md (100%) rename {docs => doc}/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md (100%) rename {docs => doc}/cn/instructions/eventmesh-store-quickstart.zh-CN.md (100%) rename {docs => doc}/cn/instructions/quickstart.zh-CN.md (100%) rename {docs => doc}/en/features/architecture.md (100%) rename {docs => doc}/en/features/request-response-call.md (100%) rename {docs => doc}/en/instructions/eventmesh-emesher-quickstart.md (100%) rename {docs => doc}/en/instructions/eventmesh-sdk-java-quickstart.md (100%) rename {docs => doc}/en/instructions/eventmesh-store-quickstart.md (100%) rename {docs => doc}/en/instructions/quickstart.md (100%) rename {docs => doc}/images/eventmesh-arch.png (100%) rename {docs => doc}/images/eventmesh-define.png (100%) rename {docs => doc}/images/eventmesh-landscape.png (100%) rename {docs => doc}/images/features/RR-call-p1.png (100%) rename {docs => doc}/images/features/a-distributing-architecture-in-financial-EN.png (100%) rename {docs => doc}/images/features/a-distributing-architecture-in-financial.png (100%) rename {docs => doc}/images/features/adjust-queue-expand-p1.png (100%) rename {docs => doc}/images/features/adjust-queue-shrink-p1.png (100%) rename {docs => doc}/images/features/architecture-p1.png (100%) rename {docs => doc}/images/features/broadcast.png (100%) rename {docs => doc}/images/features/circuit-break-p1.png (100%) rename {docs => doc}/images/features/dark-launch-p1.png (100%) rename {docs => doc}/images/features/invoke_nearby-p1.png (100%) rename {docs => doc}/images/features/multicast.png (100%) rename {docs => doc}/images/features/subscribe-nearby-p1.png (100%) rename {docs => doc}/images/features/tongchengduohuo-p1.png (100%) rename {docs => doc}/images/features/unicast.png (100%) create mode 100644 doc/images/mesh-helper.png rename {docs => doc}/images/qqgroup-crcode.png (100%) delete mode 100644 docs/images/mesh-helper.png diff --git a/docs/_config.yml b/doc/_config.yml similarity index 100% rename from docs/_config.yml rename to doc/_config.yml diff --git a/docs/cn/features/0-introduction.md b/doc/cn/features/0-introduction.md similarity index 100% rename from docs/cn/features/0-introduction.md rename to doc/cn/features/0-introduction.md diff --git a/docs/cn/features/1-request-response-call.md b/doc/cn/features/1-request-response-call.md similarity index 100% rename from docs/cn/features/1-request-response-call.md rename to doc/cn/features/1-request-response-call.md diff --git a/docs/cn/features/10-flow-control.md b/doc/cn/features/10-flow-control.md similarity index 100% rename from docs/cn/features/10-flow-control.md rename to doc/cn/features/10-flow-control.md diff --git a/docs/cn/features/2-dark-launch.md b/doc/cn/features/2-dark-launch.md similarity index 100% rename from docs/cn/features/2-dark-launch.md rename to doc/cn/features/2-dark-launch.md diff --git a/docs/cn/features/3-circuit-break-mechanism.md b/doc/cn/features/3-circuit-break-mechanism.md similarity index 100% rename from docs/cn/features/3-circuit-break-mechanism.md rename to doc/cn/features/3-circuit-break-mechanism.md diff --git a/docs/cn/features/4-invoke-service-nearby.md b/doc/cn/features/4-invoke-service-nearby.md similarity index 100% rename from docs/cn/features/4-invoke-service-nearby.md rename to doc/cn/features/4-invoke-service-nearby.md diff --git a/docs/cn/features/5-multi-active.md b/doc/cn/features/5-multi-active.md similarity index 100% rename from docs/cn/features/5-multi-active.md rename to doc/cn/features/5-multi-active.md diff --git a/docs/cn/features/6-dynamic-adjust-queue.md b/doc/cn/features/6-dynamic-adjust-queue.md similarity index 100% rename from docs/cn/features/6-dynamic-adjust-queue.md rename to doc/cn/features/6-dynamic-adjust-queue.md diff --git a/docs/cn/features/7-isolation-mechanism.md b/doc/cn/features/7-isolation-mechanism.md similarity index 100% rename from docs/cn/features/7-isolation-mechanism.md rename to doc/cn/features/7-isolation-mechanism.md diff --git a/docs/cn/features/8-fault-tolerant.md b/doc/cn/features/8-fault-tolerant.md similarity index 100% rename from docs/cn/features/8-fault-tolerant.md rename to doc/cn/features/8-fault-tolerant.md diff --git a/docs/cn/features/9-publish-type.md b/doc/cn/features/9-publish-type.md similarity index 100% rename from docs/cn/features/9-publish-type.md rename to doc/cn/features/9-publish-type.md diff --git a/docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md b/doc/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md similarity index 100% rename from docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md rename to doc/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md diff --git a/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md b/doc/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md similarity index 100% rename from docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md rename to doc/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md diff --git a/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md b/doc/cn/instructions/eventmesh-store-quickstart.zh-CN.md similarity index 100% rename from docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md rename to doc/cn/instructions/eventmesh-store-quickstart.zh-CN.md diff --git a/docs/cn/instructions/quickstart.zh-CN.md b/doc/cn/instructions/quickstart.zh-CN.md similarity index 100% rename from docs/cn/instructions/quickstart.zh-CN.md rename to doc/cn/instructions/quickstart.zh-CN.md diff --git a/docs/en/features/architecture.md b/doc/en/features/architecture.md similarity index 100% rename from docs/en/features/architecture.md rename to doc/en/features/architecture.md diff --git a/docs/en/features/request-response-call.md b/doc/en/features/request-response-call.md similarity index 100% rename from docs/en/features/request-response-call.md rename to doc/en/features/request-response-call.md diff --git a/docs/en/instructions/eventmesh-emesher-quickstart.md b/doc/en/instructions/eventmesh-emesher-quickstart.md similarity index 100% rename from docs/en/instructions/eventmesh-emesher-quickstart.md rename to doc/en/instructions/eventmesh-emesher-quickstart.md diff --git a/docs/en/instructions/eventmesh-sdk-java-quickstart.md b/doc/en/instructions/eventmesh-sdk-java-quickstart.md similarity index 100% rename from docs/en/instructions/eventmesh-sdk-java-quickstart.md rename to doc/en/instructions/eventmesh-sdk-java-quickstart.md diff --git a/docs/en/instructions/eventmesh-store-quickstart.md b/doc/en/instructions/eventmesh-store-quickstart.md similarity index 100% rename from docs/en/instructions/eventmesh-store-quickstart.md rename to doc/en/instructions/eventmesh-store-quickstart.md diff --git a/docs/en/instructions/quickstart.md b/doc/en/instructions/quickstart.md similarity index 100% rename from docs/en/instructions/quickstart.md rename to doc/en/instructions/quickstart.md diff --git a/docs/images/eventmesh-arch.png b/doc/images/eventmesh-arch.png similarity index 100% rename from docs/images/eventmesh-arch.png rename to doc/images/eventmesh-arch.png diff --git a/docs/images/eventmesh-define.png b/doc/images/eventmesh-define.png similarity index 100% rename from docs/images/eventmesh-define.png rename to doc/images/eventmesh-define.png diff --git a/docs/images/eventmesh-landscape.png b/doc/images/eventmesh-landscape.png similarity index 100% rename from docs/images/eventmesh-landscape.png rename to doc/images/eventmesh-landscape.png diff --git a/docs/images/features/RR-call-p1.png b/doc/images/features/RR-call-p1.png similarity index 100% rename from docs/images/features/RR-call-p1.png rename to doc/images/features/RR-call-p1.png diff --git a/docs/images/features/a-distributing-architecture-in-financial-EN.png b/doc/images/features/a-distributing-architecture-in-financial-EN.png similarity index 100% rename from docs/images/features/a-distributing-architecture-in-financial-EN.png rename to doc/images/features/a-distributing-architecture-in-financial-EN.png diff --git a/docs/images/features/a-distributing-architecture-in-financial.png b/doc/images/features/a-distributing-architecture-in-financial.png similarity index 100% rename from docs/images/features/a-distributing-architecture-in-financial.png rename to doc/images/features/a-distributing-architecture-in-financial.png diff --git a/docs/images/features/adjust-queue-expand-p1.png b/doc/images/features/adjust-queue-expand-p1.png similarity index 100% rename from docs/images/features/adjust-queue-expand-p1.png rename to doc/images/features/adjust-queue-expand-p1.png diff --git a/docs/images/features/adjust-queue-shrink-p1.png b/doc/images/features/adjust-queue-shrink-p1.png similarity index 100% rename from docs/images/features/adjust-queue-shrink-p1.png rename to doc/images/features/adjust-queue-shrink-p1.png diff --git a/docs/images/features/architecture-p1.png b/doc/images/features/architecture-p1.png similarity index 100% rename from docs/images/features/architecture-p1.png rename to doc/images/features/architecture-p1.png diff --git a/docs/images/features/broadcast.png b/doc/images/features/broadcast.png similarity index 100% rename from docs/images/features/broadcast.png rename to doc/images/features/broadcast.png diff --git a/docs/images/features/circuit-break-p1.png b/doc/images/features/circuit-break-p1.png similarity index 100% rename from docs/images/features/circuit-break-p1.png rename to doc/images/features/circuit-break-p1.png diff --git a/docs/images/features/dark-launch-p1.png b/doc/images/features/dark-launch-p1.png similarity index 100% rename from docs/images/features/dark-launch-p1.png rename to doc/images/features/dark-launch-p1.png diff --git a/docs/images/features/invoke_nearby-p1.png b/doc/images/features/invoke_nearby-p1.png similarity index 100% rename from docs/images/features/invoke_nearby-p1.png rename to doc/images/features/invoke_nearby-p1.png diff --git a/docs/images/features/multicast.png b/doc/images/features/multicast.png similarity index 100% rename from docs/images/features/multicast.png rename to doc/images/features/multicast.png diff --git a/docs/images/features/subscribe-nearby-p1.png b/doc/images/features/subscribe-nearby-p1.png similarity index 100% rename from docs/images/features/subscribe-nearby-p1.png rename to doc/images/features/subscribe-nearby-p1.png diff --git a/docs/images/features/tongchengduohuo-p1.png b/doc/images/features/tongchengduohuo-p1.png similarity index 100% rename from docs/images/features/tongchengduohuo-p1.png rename to doc/images/features/tongchengduohuo-p1.png diff --git a/docs/images/features/unicast.png b/doc/images/features/unicast.png similarity index 100% rename from docs/images/features/unicast.png rename to doc/images/features/unicast.png diff --git a/doc/images/mesh-helper.png b/doc/images/mesh-helper.png new file mode 100644 index 0000000000000000000000000000000000000000..05e0c293591b032307cf4ca588ce87729b2746e1 GIT binary patch literal 44009 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%0AS1)6{mxcO znBCvZzyQ_cE7T5`5BM@~j&pMJE?`2&yAflt01uPh9ZB~J1Jkh`sp;r{tVpaiQ&n0n zrr#19WfQ~i<3PH3f6>)-;n7X>7fT7kjRi= zNy1F^2d47u(NjEodrPk#y~Lw;Z;6Ts*Q6Di39^A}e*B{!*}t@CK4ualT2lb%Gr$O; zz&T+IQjALic8ie;FdvPr%-{<1_mR`*+3!^c7Cm7)!_b`BbD_vEeh$p98`>pHer~oZ zAsWen*+`!!H&_b}2|Q=NSGvXGA|voU&cQNY0_LSHD;1LCs_%VQ)~vm>DoX3uZIH{p z^Ic#)PpuCZ9uxwmFV&#VLJasmmwhp|Zry76I)N|gKW6{b0CKd{G7<%hfoDmFRAS!i z_ZeR|-8s>QdvQ^UwgS|b02{8fjm?G*?BB1}0X6AhLel>l8x|?)z{FvGf%1UaR2WR< z+PChA+F+%zQvmHLLU+p|^ zV~u|UScaJD&7Z$1Z@lqy%};&c?t7&M%P&i!)S^oUz zKbPP9=C``-R0Z19QVy*a_ttuTBS-4q7tE<$2F!c*{9ntuwQHm_7dTWIE)UD!T(uJt zXK@Tzf3Fk+-p1{wfRXzEtJUKf==I>v;I5MHAQS^`EJ((np?~tE2XudoU%vGVVCA>f z_DJfKWKTUQdHFfO;4RVu4VH0{V@8coyWN;kBV{=7b478H`i>b+#jLaBRLf2o85J(~ z-*0KV=OedFH~E1Fu+(Hgc_^^=XYJbK!0O*+kaV>G$()&V-6R7T$3Y{d-76L1m-RUq z-^O}!##d`-2{1}*T#Pa$Lun|nVj*Rc;^K9um`5B6=oqH6I>`EiIT|65U|ix0u=F?8 z&`rg7vJzdo33R!^a58XcT1K)i@yy9c1h&b9qETPPnjaNXhx7CC_rBfEl88HH`}%sT z?XNIDPoJ~4pio_f)p%c?U!bvbY%lXcsW>^(eq1jf&)-bDBbd9QxJ>JhFproez7{UD zLYWL5IlNzT6{uHgt(P?}K!4}1-Qwx#tvM#T6At>k9&n%mla(dMxQ~Y;vB;!9RuD$J zWTJ1Exv3m#7>>kkvwHRJiR(v6Ap}7!6q{-Y6YgZm`gK+4ryROQaV>f!m|wvt7P`=Cp&!g9C45jA`h+88dX_H5x^mFxzPNV%}(W7M3Z@ z2E{7S47s;eL3);)IA$f@nCncNGF8Koxb!j{NMp;upoN&_c^O#>gh}Tzopl9Dx`@zV z3zOASb%(@7$IuAO+)(c7OpIjhuWH5kvtCF(&ToNM%fYInl7!`#KFqE5<|0O#u3WiX zf&%@qQeaBj8+~x|S?XT8EA7XGvqNL;g zt<^ZEvM5g$**i`1dWzS0=qDB(JNk(Dc=gu$$8FWX@tCxYXg3RBsxKIf#i(qJThwJW zO&PADut*io8TOV2=OedFcjxW5N=#6oq{Kuj)?nde5*x|JnFboByKCY&i3kdkB!Ec2 z-o3;Nn2)ho#3#gjUcGv&#L9pM=X+yMdHkev)W{NGkVr^CO+2QJ4h%s7jm6Vz}>p?|U+7l5>38=8fwm5Q82U87fy3 z!(mc85{6kFifY4~bj3q8nD+dnlmm7X?jif_Ki}3T7$q!n~-{LmJN954AI25fp1xq_1qTHAOSvjN6;gqI zo&8Nb62vpKkI^p108Ylk8#;H$asK=7$ra06 zQ~Br*f6#WCs1fFnDi+4~ufF=4Vqx|XfA`a$;(Qn1Cv$h-c>Ps*6X$UZwrts~wVr7c zZ3E8g3miwutP=(dNBF>~WX8+I#SydO+XyAQPcg*mjKYNK?Tv#hGL}p5|96sdiTb(m^j(R?d!Jv)IsKRne=Y1oV z#|C0bNHH3RDd|{fh9(I|TEAuu6pJ)mze?}NI(BsO6N9R>B~Age*I=nGz-PuI!EkQo zrW(V!86?F;So+Q3j&YpmE66~e%gP0AhT1TI`DO>0o>kmwhij^<)k)UCB^4N&n3dI& z45m!a$Q14$kp>J~fl0_Z&Wk#Ixu%U)RTp#pOKv}ib^LfPiFUhGNLY>+tDfF7;T!l~ z|EKAJ`yQ09X05X^b>f7(q{ofjB{@Dp zl4IgDl7qjc7RqcT+PR3A=o=*_UA}y|{Y#7H&z&tnK3;l#*3at=?CGib09FiIWN4_= z5Trxma-R%trAe}w?ZN}{&FJiPUGKAM0`e~Ok6RyPlSO*Onq)E5j>wtUQzxn1{z~ zNqI$y^doL+ZIMyKhpGMQ799QibjTr>B8&XH9QdnWzdpcOt)1uJeA6iD-?xwKu}w6* zJ`XaS;z9d{eE!$bwl{zNy1WgXMQruiIc4WeTr54ja+M^|gP<5L zKz7-QINy}EZr&*QV1AlK_`1`CHtGK&OP4JbUq2sUzG$_R)fAUXC6+M;MPvX=t##RO zZq1ri;_Krn@v#w-my-zwESB=3eBGuq1IyqlyE;3sPi@lN$1vTc(#c1Ut2?nCSg#h7 zyb=u0Ixe(L()X(Q!AWr#-zY8iT?59fvfIxbkl7d5X6f|Flade-Db)ok>vA7PYo|Xp9WaA_iTt z(s?=GxN#jYnKziMP-_6!R+Osd*#bLp+?T zea${y9yxkMGU8*jNM#k4JjMs=-X643re*^FLFoXqmlYMN>#?)_HMJVFIr#$Htv`PH zl%^c8fH}2h2FCIpthhygGXp=E1XPOaGisY25R1BCy7711iOx>dQdKDlNpjlWaL&-( zcipW_MCUZ?lwD|fz4_*wiLNA ze3xHwh1vvp{Z%d&{7WU4XJs%YqhW&s{LU%$wQc)$jY8JSomhfPGP5NGSSuD7>x%DQ zru)-65^Jj@fC(7BRaaRGD1bo+_K6J(k*hENu9j&a@mU?`L04pW(jCTp`pG9G6WVum zc?lRSS(9=!Q707&hGwB9gW(FGfLTW0@|-+LiNwkk7ADtTeU;pFft(30uNqklhGR|R zn20d(>~$6wvnFx{qmrttq!3Elw5i5!XP9ouxlA|tzWb#DS_loSDY!Vb6OxfEth^Wv z2BCY4$u(`wO)~bDF>)Ik+qa`do_pR3XE)u!n6;N*epxXGZBxszoHFP2wox}}Eweql zc540rZCNh@lo||Ye!pewCK)=QpNs_tx*f-@qi>QiH{T?K2Mm&$s#@8!aTBilx?caq z7hgOF!?_Z7zOI54=!bjv0miy{#0b6aZM^<1H_L!NZBkyGFX^e=-YE{}R_VEYarEog z&$g2ltH#U}zGVv+XuUYvD1ZFpA9vc_O#64yBaxP-%Uy9!hHyi=&huaRv6J15#N}%c z@bv9B-6Xe;8YN@L+$^I4IF@_ zxCGZr*ZOm}1CFt7$xnawQ?)B@-@FCbJXJO9vfNymVk;Jwls*sBO`kj&jmgo3<#gb% zr%W=my&T?q-+dAl8iu7LO=IHei>xXvkTT#K?y~aON#_mdTxrqlSz4))Gb{-+>||#> zy0gRqFu!N`c7Ae_lmmZM7352KNr9xNBmg7Dh*xiK*|qc1Fx*@y9)1D7_ zuneEKA}`0fJ_jtr+CQHVA|4PU0az#o_hWos4J2S4o|(SdJWMiIuY;5VXU%*m&K3YKn_*^U(f%im_Nlp6#!| zlE#9CDM?uJ@O)&rjC7`vCQCWKZvr#a7xNiPr4ZjQUU+V8lK(i29@7otAqCC#D~rHz z8N6PK;`F=jx!XR|qBBoFE2+S9gb)mOpZ1W&bY^ccx6A9a$&1uH0l6T79+siN= zQwkHKW2HDV517CzU!cCu>PldVSOu~q)9s2s9PBy^=ggC$j10|v<=TJLrN9l()8E*C zFI%)o2bURQ^}s{9+4NpmTZ9J&1_?`Rk<2|D#@j6|S-M116A7SOZNDOuznQ&736`Cf zqP|~VpMKiR^ejyN2TCXVyYnYp$t~bSz^J+xxfb{rSp2&<5JFNV~BdvpffV zm-N#vU%XU5KOY_3vsbd>6QvpLVX+*ob%Ng!&d^soXO5K|{iW@QegqgeBLU~v)JSb< zxmCLal17X7U|F>o50e~|s}WMW4$E#G&SN+kH{&86J256wE(508iJ9F=Za~W1nKLBB&sP$`(8OQ|-R$F_%wxY_isiTv zN&+q3EbhnntyCu4;Na%GrhOMnQzlIk@18vr3@1fJN;0G^eT>o2*u8uA6z+53;o%L8 z;w2uvdh4DS45*~Ltp-e4i-Q}Bu>4jyB+qhtYfARdxlc=v!Zz^*-X!+95*TjM1?*V# zb?2s}YBUEUt7*8Vi;K14Lc@c#oUS7sJ#FCjd3@Ht_^=Ye)=>p zA21~_ALIOJ4I!ED-7_7uP3{;-%f6?FhnzU>y!_FI_S(;WrkLc7*Ivi#Pc?t?wO4;8 zKl&>@h(SrH99Xh2fOPsQD5+gjaaQ`4I)2m$y zQy)8WLykn7j)O}cCr4Frfo=;`nxBW66%9$T$NuGi zhqiCtqR2G(#}Nsxq%Y%JU1Mr6!?&TtlM{U8cIv08cGlSu4%wn zdv-YoVY-sFZxx>4>o0&?EI*{V7Z*sr*JrbzWy{7jk_Dxrp|TPT4u%6TX9yN+_J)Ln zoKyXrZnNx!Bs_1GreQ9Fq#*Hog$?$3=cBEgw<^VJ(c{NogrplZXsBFs-L+PH z7%uW#p&uRu2Ou}%hO9DG#)Mw_zG%27_J`LnjTp8!hmNO3e*)@+dR?0 z%Jy0v*%fWt@UZx!FVxrB+fx{m=iv#==jkbzeebf)piM(Nv0Mf8>Lt;Tg2ZrB?Whaw zBYR-FA{G=13<$J>Spg+jPAnoU1mHYIlEd)qU_knstDww8;U3GDIlGzm@7*Ui0;?s* zb6`!{Rim&1Z0vo-*`jq zL~p$QhCIA_m12n@ti#*TAe%OC0S2@DsLVB;Ht8YFN2S)ulJYFaz{F-^K7Suy+2OE_ zl6&IQgXwHb*G?>F4QSJ#0fVJ~pFVQyNZ^^#BV_C?H_5Oe10m@)$eTa^IWXQ&ZjLz_2m-YCNd4V2r*5Mu$utzV}(BtNnHk9i;@!{8?$Jt2epbO7^> zmfL{KZl@jYrcuCD12I5Dfv;+H{|jo)td>4?>J-hZeHHkNxwWjuo(b)pX@3ccSaPx4 z4jDQe!eX$rHa5xfrOPx=m>7&PjJv@k^m`8;G)S77n>86-$!3B-VSHbH=_Ng%KIxy~ z`CdnV^ErR`!yjrap_1Kx?i2P3`r*}|;#{xTiOIT|ZaijgAeNC6F3b1A zg>x~pgCs64R(gAQ${x&IM_RRPxtd(+u(Z}f(s8%HJV1dIU>Mr5OehoEWIDo`xXj=g z>~9w=TqJ%z0h)7Al$|SO1$k1Dn=9qOi;SmpXNPm7?OQiVa$J=DE)BSJ6PT_m;`Z&S zQ4t#ONE}*(*VKeWiH(WVyb0F*qajx@EVS2$T|6v@4jJzp4+ta(wWXMn<49+wPcaz&YUg<(6kz> zE0iJV&tvTo&fE+D)pTGo&4I`-P)BrUwwHa)nKPzHcv!IFCMK@1a5U*l+x)V8@nXqE zhZA!!oJPxa;cs3yFevaW(>Y8IMub=NZzFpGUjyRV#ZrA{A zJx1z)ImvL0EJ=Wt9UUAjSAO?9GRH1LXnyZHSX-gpa^v4h0CDDuaI4R*XzjzR#iwU? zi3$l8UtmQ~#`8gUi~ zT;k`L-9?N=3`!q33m%=1&euo(P5MSmw{+PuX=`r>1{nlg)?e!pkG*NM+(EzG;DOK{ zcc>lcC%`-}zVu^x33!1A*Y}rz75SdI0Y3vKc;ST?&cTe+prUhIs5CGW?Qrc)&2q=B zw*n)MkqKkRYMo;4x|j=wqZxtbgygg&wPP`rv7@6^lZ$R2Ge&Js#w}+$bH~n|(g5r; zbjUDZs6o=vVqLEWz`P(WO_nWMpmwR3Uw%o>Ja1&tKDA=Irh)aox3H# zKM?n0v8fJRL^32FBb6<(?yz|A5->?9q#Mqs9}?GR0BKWorAF0I z`y`!hUDrfykO~YXuGY>Yc7>EK0Yfke`RsDXC7CutXwEi>@9YD#$S&pXR>7IC}s-q+utzT(8laE**ffHp~t#dx^+3(i(CGRN8BKbO|5StH;5?svu0 z%Tu*&?(TMV9)d9Iu=RND9q(Rg0g z+oLzb6ypgC56AO5XM;Wa%+r`$F;ZDlfc_1axi)6KSfaCl7|{#;|AQa=K<>E1d6&bd zpL|L@uKB(sMMp|#fG=RtP5Qa9^SRYt*R5V7qlb-ceu*~M>X6iOZ>_o=Sy?}Fg9`h*ZOC=Wi z=_{|uPk@zv`jb}_C-E~HPnj3M{kNDayLsbAV9wX&m6u+YpW%FBtDoXtFX39u2l>Fp zaMs{c&*i_f#F@_g5cUT#4NH~LhRC-33|Nej&;^jZb&xt)fFEnjE{F7RsPwX~XI=B` zJ45Gw;{4gcz565s*pcB?#hF<$ZPFxQ&^PsYX*XL0Ngf&&X(<`NnhkYTGI8wfGVYc! zGXA#PWmx}yS|likP#_^uigBG$H;s}(z~e)3&`wEwJ`R}g4*X^;#%s)&o7J}3zh6I@ zJ$sJ4@{^y)kJ0aplia#(t28$^0>iPc%Shez@^$pXPl@SYcv0)LDA|(Rt)zS4p8M48 z#Cm7(Xml*F0rv)tjf&P7x~f8Y0E(p=Sf~o3y$Vu@d6%h-+rlgNQi#KP9}^X$wKIxy zb2P4s0gR3F)o0s{PX5By6ZZpFz0G7LE7Zj5^` zB8TFvS%kCGnFYA@CQUiSOk8HjbdI!l`wq!Mf6;KAlawMGY)NO9mv2jl_wAL8*ciP& zqfu74cq9&CJbi&#GqAi`Tfi6U?$;&2!DWC%mB8TnX_>&xRtXQQhBH=`*eHzzW(ijo zk1XMDFm^>b*}8`Y?TEoaAy`iDweMuniARr#k5^CJD@U>tW96X-tSV6FBezUPBDEzI`moi-1-j(X@Jo!v7%qlHYfUzsPv&Gj;Mx*mJ}kY3h0;L$1SVy2 z3K@tDN}x+SQdh*SF1cxkIiD8xiy^}*3m43ja4f&2XajwsPN7$BNOMwwxm-;nhUjZ0 zfTrDx@omQUYG}vit&$bbqJdSCiix#+`MCvaz6~APyI)JJG2b^0lXuo^XNUWqJ-~c^ zzUs@aE-zMhStSl`5U5HR?SULCU{FSiXqhiy&!WP7EZ5}~iQYyY`rIxeTzU3;Bk6b~N2OtfUjM@DP>TpVx$ zqeWP0-OtNI_nPpAHsb|6L#@W!qc_&_K&>y5fb$c=A|xpy5}Iw0))4l@`JTW7#010! zuF24@G~^WUO_`>?zMQ&(aFbMMuqE|TuC6OSsMtpVn%A`Z?#>2td(s$qE9JI+q9pZ1c zrzA67rd=Sh$1T%w?}0PVJtsf<(U0UuFT8-)7j*3=R(knG9KcDhy!4{H2n@p{4cgjX z;JG-g_c;GWoP+Z%T!rIh+Ms@nbDr08%(>41Lve2}MoIQbg&)75&%6%HYez>r+BX>Y zYXCfOcI#a#9X@zSlCT_dDdcvf<{by(Qm zA3kr5mo>H=Gpn7iyu$IKeeh@MJE#3K3lfmwRcTn|xY{wCECS4Xk8NBwQ8OQ3vlgAy2;pg$tX6e2wqymFi)=Jj%A#GP*V#fT&jq9aX?;esEA1hH|A?Kth zUMlSarV9xSwnEaeEYdz11x=jsaEvf6E6js}$6SUyHHj>SwtgwZ(r^KR0eXGbb|J&* zmZo^mNMWX+l1%?HXf`n>R?4t+v%bv43C^KRuH=^KC?CwBgf|wbwhl+E(|K5@b*lE} z(9b&0H`g?0yC;^$B32?cB!=7LQo75P$aLm>7R=#J*Cf*^t5+BGV^^HmqMOK>>bNydbq%JGuIs z(#{<_B>;*H?SXt|7K3E4CheNU*p*tV}TEG{6%QM~RU&)~iiA6x7hqM%^6Y zp8c#*OuHkl&#XW86^-$cfJqP7%cr@<6OTWkN@f-`Y1SNe-Lv17{-2a|G-lGMX_C2* zyF{V55}7U>IFr6efByie@Rp)r>_RIc>8M4Q0UR>~oO?_trh!zv?6S+wapNqUKUcha zbpr+p6rbKbB?9Mj0Mc;%0Qy!j=$ArVUgM&oq=wNpShm)FTc+E!Q~W83sN{hmm@`6) z01d-6z*XGfxfY6E1zu^-n`#GHT4KP81Ui@axy5uxj~r3$*Z6i-%8~K#J`q@Q;X-G- z-|5q*ZQpKhx%RqiW$4hM_BZayEz_-Ay-LQ67zRu;M(()%RvCBuZJJy$YSc*Jpy4un zGb2gq~JT3Y}Z$wc34BrpPfugO@F2K4PC6UW{mhsS7(?0*a{N$Ba zWXeO6B?efA1Du2C--kfCZ98+Y5SGXAz(1yRmFw6QQ%$U#>s>`?vT-=N6DO7vlZX}5cu#}j3xKhAo1x;n;pq5)7^jf1j$Z{ zm!hn61)_9!(UHydnmCKtCYG-dr5RYZihy}on7IgAQZas0oSiKx@o~_G?DL^HvW^C8 zqhutf;+$+L%gMrPhC~Mkc9xMaz;rs8E)<%dx{?ZVq#T{fs^O*CSrQi#F8g<%-4vL_ zD3DNSYZ+K(sHJi1N|O10*^;GNc7hc?x%_T(*%|vnv}WxZ3BfYYk`df`O8vlS3p4wR z@T?5!ro*56SorvOcb0SQWRk6$wc=7WT~xr5YggN$N_Go3Y}^d&>WTh})19c91XP-p zsdlpDm}ptN@T`Y~vh3q z*o4R^+3Qf{h%{&REXxju&PWH7@3nIzjHH`Ce}ROBgrWm8RN*if?kv{Cc|6s=pu=0G zl`ED@NN@n!L%SDoUXe-?7J#Nxn^ne%tB8L>fGwBVDT3zyJGO1XB#amC9mYf*RyZJ; zLEf}!v*tu_Kiuk4D{-Bej1kf4T+Zwo!RGuOJ9mgbn45L=DB&vX{$cbq^A-pp7>}nW zj>yQ)8`t+eXkcHw@f$rf%~NZQmeeEK(m8FfFHa(dW*M*mw2c>&O<`cs5nTE_^=2_pD>9J z50j|SK=Jpo?QlE~nqhDHBRxHIkJuQV9~vRKU|P<4*1KT->w*2Y`UrID>TAB?nrq~iF*oby=K4pE0@L|=W94A-lO@TcuuO9w zi)bA5+vYGB7wwEjpU@Y7Dde8%?!O;5N|#*Rj9M3~i__lr+;h)$9xQ~%IvhU&F8VRn z@*mUY^TX%mxiin;d%W_zGiT4I?e4`Nzo0(T2cU8@vpf&t+t1rm3o(<7WLP+Fjsorq zFnxMbqO4f9RC79svj|!{YlYb7FI&7wvJx$mNGX=?q5b>I9b@m5Q6opmn9*aTvb<7~ zaUDt{)=%r()+!V4yc78IHW@y2h*P{B+1|`}L#)Me=FGGD%s=_*PqfSh8IKh(HSrsr zZ*2^cED4G6x@Yag3B3NTG6r~e1D0pnDOnTbhv*|J7X1edl#wGw%FUxkOW*c3DZ$`Y zLb?^8jngMj(wyKQ0#iQmeX8%Tw!jG+%;jG*23c$Gw*|iziCY7 zbF->?8KmGXW0>nPM#kMaR`r0}fOYQ#=DYc((XxD*vx&$p(>?g$gOUJz!MsHuZyz~z zs_R`0FO}xco2M!^uh0C*gDydi3xLsb!E}{{#ab=%m>Um*GKVc0mo8qYwL)0;gEi9% zvVlRdj1fo1LlGgvv4dFBmHt6)K%58cN!Sn_9-@ggr1LSID{b1i5mF@-?Wg;QM$=S{ z>0>F|A}sNYQ{#l0R7B4pvl7I zy*dtx(M-;6@%W_>lJPS=_?~ZUqEs@9!qkVRNEBuuF$W#zhYnbn&YZpwOqY|Kpf!JE z0fhJLaWD?!Bwj`DVRz!PC5t2j0G&1}f?VCFfw&V4!8}{+F5Su_rK& zw>NN3pufaLg#m|#NCNOvEM6l+0yGC=iR~NZkX+33?bxwHf`HGcC^3LEA~H-X6C{L3 zN&@bkmz1RTGPa+%iREZXW`HRvW5YP8bjBA+KAx4e>LP(ze*g^ExmTCNVSY;@)1^YI zWyEtdCND9kBkkY4N1}qmFbON5D5T4p70v+(7oz6?B@)p;jM&Zv(=A%;j6t7z_G#(u zt*mjJMYydw@f#FBA5`B%IHUg2Ms8XU~}fZ1a-ZjCefv{29x~2s}mG8xQ(M zpFeX(PGhNf?|sX6YF!O8`S1}LJ#?syzx{R@&p5PkcgpR+DL0KCA-CRki_}!tsNIiR zJnOS@gE*~I0*v&NmtWEL)0C8h_J=`%S!!>KWcqK{wr!Fg4Mhn{YF-L3+?2_h)5`Wd z{`hI#^MYg;&OEmvt_+EgAi21H1fJIf92h&?kwb?iDJlw#P%I_6xoTIO09?kHxtnet zB_r@Ua`Y(cZ@i9XF2l$XatD^ddnVo~!&yrj*CsPDEUg?`?yY!!o`1`jTXcVonD{8k z&&yJ`B1@W8V1h9co4Ua0QKQvQe+GU3R3eEZ<{<8VA>2QeDSGzFc^#2YS2+(GdXQx(eoe)eqcGZBeF#qtZx=g4#> z)ZLMYSqPX32mGNW@47%)i3`!H6-yxvL!=0jj2jL!sX0C_MxxOtv^gfx(2Qk^CA^5s zwrp{ZOy06}tEDaDdv3sIJRW9J?b-sS!|$r{p_wNn$hy_enD0VF$g339Tp!E;#x7+3F0d^HNlaWE7zRgdjK(~2|F)RO2q;ELQi$cS5Pe7+WL17K zBsG`U3@8iGQh}|l^J#aD5#2iuQkpeSXf9)+MJ5Pwzt_9(wtTbaBlk=<{tk(v!#g({ zKsZ89*-U4KdP7IM%mFhk!?D!O!Oxf5@9)F$EVMV0VY&w=Jpc(2uAn;s9dQgQI_WE$ zt*1|)j^)>KgQ@S;FdYVs*D%*HWZYmp-znMJKG&5=FGK|X8Bj!+cTk39gV7emg&He} zgGOe$gfwp#1G3%@wK6q~89>1NTVg)?YFQ7DWa_+7(y_pfns^f8W#J_{|;e#@7dX*u+9a6^Y_#@vtPb{5})Bi*obSG{*gWX^@Y>cl0LZ zWLO>z7A=a4ipDiO(HGtt-9jA6Sjy;-5Mbjl;KyL`_wv^Gyz6efUWN`IrtLT%xn;Wh zAs%xu8_0At3Z61dXAjWDFrATt%5?U=1cvG6K$7J^LeRvKz~$Ah;$*&OEw|H8JT6Z^ z^NgGU&S8f8tz*W>ggfq(5krQ`Gfz4f)@BSo%TqD7jTnymt=@X`7#TPA4!IM*8Gq+E z8GGC9GG_G6(ieEewT#6PJpahyBjnCI?^L_erVSf(Bi%E&-cwIKsd*F6JpHs5^nUu8 zr{&o*&&c!7J%{6YO+um_&ygtUf>qIAa6zanU*T*5p>Ox;r=HNZvd!z(ua_ZsF52t{ z4II!}(ZCSTVU7w5hTjgH$(TWI8_)Q*@bC!T1=5i|{P0703hkm#`$?DfGlp)#g85pB zR81T>?gpItDSgp+rk7s)vAXdXeM8L3E!S!Cpq-ZOpe>Ntlh4odpTm1%x2J&JI9`uG z@r3Rf))l#Bx=HulE4iuZQU)$}oINCIv#kc-(D85AOWE|B9u;Ld$z3FLFLvUMqB!Vq&k=p9+R!8!7noBT56kt%)^ zX8JaJTc%4PPDj&vF1JB}z+70CVu6L$uCbpVlhzi7PDD7+yH_vZ!)OT)34*rh9L2#< zEk?yKUXYkFInl1uhoz6c?ZtMs*ZHpRO59pAJdhR8izOYJ_FQ{;HgxjD3Gsq>>VnHHjiu>me`QG-z-^)KYd{8|i6a0reB)+kHx)NON#P_Y zEt4c@l^fSP+wGhP9}v5-osLU0+iU(}rApf2N&&K|#hOim_1XBUf1RaGn>I>dfUm~G zv7X%u7h^A(j`mDqIJFJpS*XMmu8x5l@D>0-bLVZQWz zM~YX^-ZI&iMA~=y?p)&Mh82z-J1U70p&B5O0j<@wz8$MP5gXG++Y^{|93TowpAi=^ zP5{Sez7#qS)7>X|=~$YuoKdVlYD+qEgAE-WZkg^Zvt5Swm&wx0z9aYJ?=!|h|AqC~ z^JdSMwD?4Imeb>5vcVi@j(JaFO}3|i6`pze8I`*4+3|0t6Zh}mE4PdsrT$dL>TTV; zS@9Ne40AWQ*$N%g)ZiEo*T1b@9++^KOhjjn0ghrV4`LLa&)RXn``z#Ky5{=Fj~~^z zv%7Hq1mMKGCXAP{cibVj+;R&r*r3jBr%eBFPlhK>KMqV~VV`YVw#rRt7tbGq<7VK~ zTY!^@(e4D+?2k!Ygr$rnUCDGS7uif;Ptxt%w}I*WgrVr%e)FEY?vj^ZdfCEkk3S*5 zvhzw!dx@?3_UotjV{We5LCAbhYe9Tih;X}nZZpL_ZCRrA=3BjPc3Y#o0LSy>#tt99M=tzLi7hKiZa}t_|W87813|Yv>B6t zQ8zrFz+7!(z2^N=%ZKOYBl(_N3dn6U!@>-wbG*^hK`%2JMPy zQt8p7hvGe&oLmc0lj#zpBGqHUt*iDqnFzGxO33` zP)xcaw@f#2`~=G(4^d8s|M5qinQlFpZmu%dd6*8&M#g&>?^V*-io_STcW?6Khcua6 zna&qXchHt}`u~NAh=M|Z(vY+iGcy$($4Ucn=*%596PfR6k_Zb624>3DaH?`BFx)tW zv1f6RfZU~#;6q7%qC}oR7%VJdfv7;&FpzR^KGUm7)!42?=VN3J(sHtFO93=FN3B zfiMy0nk%o?;0MocH_AgUlFOA?0l{FhZr!?_Q;&{8peCom%g0kfunJ@{&^9eat02sD zsiuA*Vh9%Pe5Fu?axp0;-}?!B@Ng2Q{U^^`(KFZNPG6~mfLQ=N$whd zr|uoGWy?l+_RO^p!{iE=E7Sg7@ z@>yUkZY1){U;M(plSRZ{tXItY@wsUN;{Dh@-jjAuN8&yfly+uJl* zOm`uca8Lhcc`V>0(t~&?R!FDuF&wj=)x=4vtzN|C=V8!dfW;Ul9vTEmWk((xnm2DY zCX0t8#KmZc&+eVhzE~QM!$TP4XqizMED#eFrT%7a8^w-ijS%jA%1rsqo2=#cVu{9K zVm)FccbJdi^hwY_%b-1`0^dDs`=$+XIqlh_o3=kJI7k*R?0O#vnpBA45+E@dwc}ck z?m~3@_%SeDfI0(c%9_=gJ?5Smpg}K39#$%bKIK7puu4@i6rp%v!@KTu4rOvB_e_Ub z&*+KVtQ?6Ai;z<%&l-ox6KY5M8tS(qNhxFHu--!l21r@x9A*XX;BK)>8g>3|)`K zic=0umIJ9j!`}Dee01uulM+Y8feeR9%I!5ZISH!+qfsV5)b;P(GTl8`lUe(t0)vnZ z>@#xcP`M9k^zC=trkLlpvA4z!k6QG3_D_|4r=Kxiww_pZC3jEqx1;jOpd zhV$`y$5_QEJg2#?LAd9Bc`hUs2A}b3Bx@$)6$fXb!GMe$X8iqK<0r~}ci$_0TiYPg zGd1&`p*C%8tug`9dF(B>$xXvYX#F{MB#ZMs{q$3^Zp~W7J8aK5oLARaud)4fcxR@h zNPbo}CRn~|v}u?Oa{#27KR{dC<4-)U1#=i9M*r=w!9&j3wu<5Ww8OFH313-CjChLJ zj^?J$`fN7sgyc;Crp*S!GpC}Vz7Eo1qUIH_F9){wmBREaXtYey$&ik=cDWzQ0Q+&s zh~ek>W|_B3gD&wKb4Xk}0)+n7Am3#@$G@X!FX&`E;EzZM8{|~^~`u&H!D}lvht)X zJ722=9W_jc!$>-ndUhjcLsCSAhD#POW=={v7%mG8M{Uc(WQoa18eX5s`e|OivTv6& z#-jt9Mrhi}h*i1Q7B{nFo-DU^<_mr8s0?h!9wG8*Ue(5LwrKQcH?O3_gfa{v9#rNCT?2K3nAaLtAzE>D3Hk;-B_ zcpjRPlHwC}hs+#67w+jc9)gI}CDTp9tYQ=h0|054Vij|iF|}gKQdPB1&q$R5U=GHc z>7YTx5@Rv$pA5leOMQjF8H~1|9f(jr=FrB2R7}@Kx=`gE{Gup%0$rw+@XUWgaRvVdVe`R5jB!KBm z&0#}~a*2RM=JlELumQ`nBeDFeBZgbPyz2rv3|D7B0NY~PPxDbBn4XZv^iL(=M={#Q zjZ8SW)b_(8BQ!Gl+YqCAVk5(~_FO5RyP8>a7&q=`5dkdxpq&SMKB5L49Y#A}md4|; z$PV`h(YzEeS{^4bWAYeK0O)f6{mv#Ew@f#B)JO@y%w{}RfUl3{xpFr|9*iqvjWfoR z(O1csu&5x$_lHPGAmh(icg~7A^8&{3#^LF0#h>wfV#Mfx5M5To(DAgZZLzB?8HTf1 z&60Mc`|rD7JbUz%P+Z^7(_4J?9`^OoKE{bLQHHy1_qgUd*|64`X=v3+kFvdBf7BvTW^QJV5T3_|USs93PB z9na@8Fh(yFeGwfTCeeZDBP?A}?4N)jeO_-oFZ-2k|NalIIj6AnrP6L_&o_Mk2O1B@ z@d(Gg{k_=^54raGYh}zWW9&2C6YYQ;H|9Yz=Fy7>#@HKU!u|VchvfdU%$Q@_ZyGtu z{-s53nU4EivHTM;&0~0FXcKYEDZJ-F+(7(5e<*!_eE%elQ>RYr`FifD$29npho1i= z&gZ$Ot>5tc$8kRI?O031k?D*$W^J{TCr{}4r%qb!G1qpwKCb!bvE%aYyUy`#tgUhE z*fDLFKF?{|+MYb8{ikt#)~YjmT^ZuuRWCI{UNp7308bvWgS&Ec=*B2lucbb-BF$-y}B6YMMok@Bf$n|4WA9 zNN$;q%bMe1e!%}#64`jm=^XoT{9CxkynQc&(exbJ^LQP8uHRmmI`3`XoBNoyIkd^~ z0o{?~xsHcv|Al`4ZOPnU`^dhP<7ez2eMWw+-~M;WjGycCcDBL(`3Fy!WjeZ1 z{+Irj{!h^>`!~sVilJpRG&D$EUETk0j{5p~x1ay-@hy*fH=kY7QLp>?>UA10P7NF< l@)kdrC`~CI5+^YL< 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 z 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%0A-^1;GA!9$vB$w4*Ii-N{8v+)y|k=fky+# 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

-T7nyR!FbP)L75%nLkAX+_U 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 IM6N<$f>9sveE Date: Thu, 20 Aug 2020 11:50:26 +0800 Subject: [PATCH 24/26] update doc --- README.zh-CN.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.zh-CN.md b/README.zh-CN.md index 2307ae86b4..181b9edc2e 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -46,4 +46,5 @@ Event Mesh的一般功能: ## 联系人 微信群: + ![wechat_qr](docs/images/mesh-helper.png) \ No newline at end of file From 63814477a18f92f89e316e97e194e154dc00486b Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Thu, 20 Aug 2020 17:07:27 +0800 Subject: [PATCH 25/26] update doc --- README.zh-CN.md | 1 - {doc => docs}/_config.yml | 0 {doc => docs}/cn/features/0-introduction.md | 0 .../cn/features/1-request-response-call.md | 0 {doc => docs}/cn/features/10-flow-control.md | 0 {doc => docs}/cn/features/2-dark-launch.md | 0 .../cn/features/3-circuit-break-mechanism.md | 0 .../cn/features/4-invoke-service-nearby.md | 0 {doc => docs}/cn/features/5-multi-active.md | 0 {doc => docs}/cn/features/6-dynamic-adjust-queue.md | 0 {doc => docs}/cn/features/7-isolation-mechanism.md | 0 {doc => docs}/cn/features/8-fault-tolerant.md | 0 {doc => docs}/cn/features/9-publish-type.md | 0 .../eventmesh-emesher-quickstart.zh-CN.md | 0 .../eventmesh-sdk-java-quickstart.zh-CN.md | 0 .../eventmesh-store-quickstart.zh-CN.md | 0 {doc => docs}/cn/instructions/quickstart.zh-CN.md | 0 {doc => docs}/en/features/architecture.md | 0 {doc => docs}/en/features/request-response-call.md | 0 .../en/instructions/eventmesh-emesher-quickstart.md | 0 .../instructions/eventmesh-sdk-java-quickstart.md | 0 .../en/instructions/eventmesh-store-quickstart.md | 0 {doc => docs}/en/instructions/quickstart.md | 0 {doc => docs}/images/eventmesh-arch.png | Bin {doc => docs}/images/eventmesh-define.png | Bin {doc => docs}/images/eventmesh-landscape.png | Bin {doc => docs}/images/features/RR-call-p1.png | Bin .../a-distributing-architecture-in-financial-EN.png | Bin .../a-distributing-architecture-in-financial.png | Bin .../images/features/adjust-queue-expand-p1.png | Bin .../images/features/adjust-queue-shrink-p1.png | Bin {doc => docs}/images/features/architecture-p1.png | Bin {doc => docs}/images/features/broadcast.png | Bin {doc => docs}/images/features/circuit-break-p1.png | Bin {doc => docs}/images/features/dark-launch-p1.png | Bin {doc => docs}/images/features/invoke_nearby-p1.png | Bin {doc => docs}/images/features/multicast.png | Bin .../images/features/subscribe-nearby-p1.png | Bin .../images/features/tongchengduohuo-p1.png | Bin {doc => docs}/images/features/unicast.png | Bin {doc => docs}/images/mesh-helper.png | Bin {doc => docs}/images/qqgroup-crcode.png | Bin 42 files changed, 1 deletion(-) rename {doc => docs}/_config.yml (100%) rename {doc => docs}/cn/features/0-introduction.md (100%) rename {doc => docs}/cn/features/1-request-response-call.md (100%) rename {doc => docs}/cn/features/10-flow-control.md (100%) rename {doc => docs}/cn/features/2-dark-launch.md (100%) rename {doc => docs}/cn/features/3-circuit-break-mechanism.md (100%) rename {doc => docs}/cn/features/4-invoke-service-nearby.md (100%) rename {doc => docs}/cn/features/5-multi-active.md (100%) rename {doc => docs}/cn/features/6-dynamic-adjust-queue.md (100%) rename {doc => docs}/cn/features/7-isolation-mechanism.md (100%) rename {doc => docs}/cn/features/8-fault-tolerant.md (100%) rename {doc => docs}/cn/features/9-publish-type.md (100%) rename {doc => docs}/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md (100%) rename {doc => docs}/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md (100%) rename {doc => docs}/cn/instructions/eventmesh-store-quickstart.zh-CN.md (100%) rename {doc => docs}/cn/instructions/quickstart.zh-CN.md (100%) rename {doc => docs}/en/features/architecture.md (100%) rename {doc => docs}/en/features/request-response-call.md (100%) rename {doc => docs}/en/instructions/eventmesh-emesher-quickstart.md (100%) rename {doc => docs}/en/instructions/eventmesh-sdk-java-quickstart.md (100%) rename {doc => docs}/en/instructions/eventmesh-store-quickstart.md (100%) rename {doc => docs}/en/instructions/quickstart.md (100%) rename {doc => docs}/images/eventmesh-arch.png (100%) rename {doc => docs}/images/eventmesh-define.png (100%) rename {doc => docs}/images/eventmesh-landscape.png (100%) rename {doc => docs}/images/features/RR-call-p1.png (100%) rename {doc => docs}/images/features/a-distributing-architecture-in-financial-EN.png (100%) rename {doc => docs}/images/features/a-distributing-architecture-in-financial.png (100%) rename {doc => docs}/images/features/adjust-queue-expand-p1.png (100%) rename {doc => docs}/images/features/adjust-queue-shrink-p1.png (100%) rename {doc => docs}/images/features/architecture-p1.png (100%) rename {doc => docs}/images/features/broadcast.png (100%) rename {doc => docs}/images/features/circuit-break-p1.png (100%) rename {doc => docs}/images/features/dark-launch-p1.png (100%) rename {doc => docs}/images/features/invoke_nearby-p1.png (100%) rename {doc => docs}/images/features/multicast.png (100%) rename {doc => docs}/images/features/subscribe-nearby-p1.png (100%) rename {doc => docs}/images/features/tongchengduohuo-p1.png (100%) rename {doc => docs}/images/features/unicast.png (100%) rename {doc => docs}/images/mesh-helper.png (100%) rename {doc => docs}/images/qqgroup-crcode.png (100%) diff --git a/README.zh-CN.md b/README.zh-CN.md index 181b9edc2e..2307ae86b4 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -46,5 +46,4 @@ Event Mesh的一般功能: ## 联系人 微信群: - ![wechat_qr](docs/images/mesh-helper.png) \ No newline at end of file diff --git a/doc/_config.yml b/docs/_config.yml similarity index 100% rename from doc/_config.yml rename to docs/_config.yml diff --git a/doc/cn/features/0-introduction.md b/docs/cn/features/0-introduction.md similarity index 100% rename from doc/cn/features/0-introduction.md rename to docs/cn/features/0-introduction.md diff --git a/doc/cn/features/1-request-response-call.md b/docs/cn/features/1-request-response-call.md similarity index 100% rename from doc/cn/features/1-request-response-call.md rename to docs/cn/features/1-request-response-call.md diff --git a/doc/cn/features/10-flow-control.md b/docs/cn/features/10-flow-control.md similarity index 100% rename from doc/cn/features/10-flow-control.md rename to docs/cn/features/10-flow-control.md diff --git a/doc/cn/features/2-dark-launch.md b/docs/cn/features/2-dark-launch.md similarity index 100% rename from doc/cn/features/2-dark-launch.md rename to docs/cn/features/2-dark-launch.md diff --git a/doc/cn/features/3-circuit-break-mechanism.md b/docs/cn/features/3-circuit-break-mechanism.md similarity index 100% rename from doc/cn/features/3-circuit-break-mechanism.md rename to docs/cn/features/3-circuit-break-mechanism.md diff --git a/doc/cn/features/4-invoke-service-nearby.md b/docs/cn/features/4-invoke-service-nearby.md similarity index 100% rename from doc/cn/features/4-invoke-service-nearby.md rename to docs/cn/features/4-invoke-service-nearby.md diff --git a/doc/cn/features/5-multi-active.md b/docs/cn/features/5-multi-active.md similarity index 100% rename from doc/cn/features/5-multi-active.md rename to docs/cn/features/5-multi-active.md diff --git a/doc/cn/features/6-dynamic-adjust-queue.md b/docs/cn/features/6-dynamic-adjust-queue.md similarity index 100% rename from doc/cn/features/6-dynamic-adjust-queue.md rename to docs/cn/features/6-dynamic-adjust-queue.md diff --git a/doc/cn/features/7-isolation-mechanism.md b/docs/cn/features/7-isolation-mechanism.md similarity index 100% rename from doc/cn/features/7-isolation-mechanism.md rename to docs/cn/features/7-isolation-mechanism.md diff --git a/doc/cn/features/8-fault-tolerant.md b/docs/cn/features/8-fault-tolerant.md similarity index 100% rename from doc/cn/features/8-fault-tolerant.md rename to docs/cn/features/8-fault-tolerant.md diff --git a/doc/cn/features/9-publish-type.md b/docs/cn/features/9-publish-type.md similarity index 100% rename from doc/cn/features/9-publish-type.md rename to docs/cn/features/9-publish-type.md diff --git a/doc/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md similarity index 100% rename from doc/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md rename to docs/cn/instructions/eventmesh-emesher-quickstart.zh-CN.md diff --git a/doc/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md similarity index 100% rename from doc/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md rename to docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md diff --git a/doc/cn/instructions/eventmesh-store-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md similarity index 100% rename from doc/cn/instructions/eventmesh-store-quickstart.zh-CN.md rename to docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md diff --git a/doc/cn/instructions/quickstart.zh-CN.md b/docs/cn/instructions/quickstart.zh-CN.md similarity index 100% rename from doc/cn/instructions/quickstart.zh-CN.md rename to docs/cn/instructions/quickstart.zh-CN.md diff --git a/doc/en/features/architecture.md b/docs/en/features/architecture.md similarity index 100% rename from doc/en/features/architecture.md rename to docs/en/features/architecture.md diff --git a/doc/en/features/request-response-call.md b/docs/en/features/request-response-call.md similarity index 100% rename from doc/en/features/request-response-call.md rename to docs/en/features/request-response-call.md diff --git a/doc/en/instructions/eventmesh-emesher-quickstart.md b/docs/en/instructions/eventmesh-emesher-quickstart.md similarity index 100% rename from doc/en/instructions/eventmesh-emesher-quickstart.md rename to docs/en/instructions/eventmesh-emesher-quickstart.md diff --git a/doc/en/instructions/eventmesh-sdk-java-quickstart.md b/docs/en/instructions/eventmesh-sdk-java-quickstart.md similarity index 100% rename from doc/en/instructions/eventmesh-sdk-java-quickstart.md rename to docs/en/instructions/eventmesh-sdk-java-quickstart.md diff --git a/doc/en/instructions/eventmesh-store-quickstart.md b/docs/en/instructions/eventmesh-store-quickstart.md similarity index 100% rename from doc/en/instructions/eventmesh-store-quickstart.md rename to docs/en/instructions/eventmesh-store-quickstart.md diff --git a/doc/en/instructions/quickstart.md b/docs/en/instructions/quickstart.md similarity index 100% rename from doc/en/instructions/quickstart.md rename to docs/en/instructions/quickstart.md diff --git a/doc/images/eventmesh-arch.png b/docs/images/eventmesh-arch.png similarity index 100% rename from doc/images/eventmesh-arch.png rename to docs/images/eventmesh-arch.png diff --git a/doc/images/eventmesh-define.png b/docs/images/eventmesh-define.png similarity index 100% rename from doc/images/eventmesh-define.png rename to docs/images/eventmesh-define.png diff --git a/doc/images/eventmesh-landscape.png b/docs/images/eventmesh-landscape.png similarity index 100% rename from doc/images/eventmesh-landscape.png rename to docs/images/eventmesh-landscape.png diff --git a/doc/images/features/RR-call-p1.png b/docs/images/features/RR-call-p1.png similarity index 100% rename from doc/images/features/RR-call-p1.png rename to docs/images/features/RR-call-p1.png diff --git a/doc/images/features/a-distributing-architecture-in-financial-EN.png b/docs/images/features/a-distributing-architecture-in-financial-EN.png similarity index 100% rename from doc/images/features/a-distributing-architecture-in-financial-EN.png rename to docs/images/features/a-distributing-architecture-in-financial-EN.png diff --git a/doc/images/features/a-distributing-architecture-in-financial.png b/docs/images/features/a-distributing-architecture-in-financial.png similarity index 100% rename from doc/images/features/a-distributing-architecture-in-financial.png rename to docs/images/features/a-distributing-architecture-in-financial.png diff --git a/doc/images/features/adjust-queue-expand-p1.png b/docs/images/features/adjust-queue-expand-p1.png similarity index 100% rename from doc/images/features/adjust-queue-expand-p1.png rename to docs/images/features/adjust-queue-expand-p1.png diff --git a/doc/images/features/adjust-queue-shrink-p1.png b/docs/images/features/adjust-queue-shrink-p1.png similarity index 100% rename from doc/images/features/adjust-queue-shrink-p1.png rename to docs/images/features/adjust-queue-shrink-p1.png diff --git a/doc/images/features/architecture-p1.png b/docs/images/features/architecture-p1.png similarity index 100% rename from doc/images/features/architecture-p1.png rename to docs/images/features/architecture-p1.png diff --git a/doc/images/features/broadcast.png b/docs/images/features/broadcast.png similarity index 100% rename from doc/images/features/broadcast.png rename to docs/images/features/broadcast.png diff --git a/doc/images/features/circuit-break-p1.png b/docs/images/features/circuit-break-p1.png similarity index 100% rename from doc/images/features/circuit-break-p1.png rename to docs/images/features/circuit-break-p1.png diff --git a/doc/images/features/dark-launch-p1.png b/docs/images/features/dark-launch-p1.png similarity index 100% rename from doc/images/features/dark-launch-p1.png rename to docs/images/features/dark-launch-p1.png diff --git a/doc/images/features/invoke_nearby-p1.png b/docs/images/features/invoke_nearby-p1.png similarity index 100% rename from doc/images/features/invoke_nearby-p1.png rename to docs/images/features/invoke_nearby-p1.png diff --git a/doc/images/features/multicast.png b/docs/images/features/multicast.png similarity index 100% rename from doc/images/features/multicast.png rename to docs/images/features/multicast.png diff --git a/doc/images/features/subscribe-nearby-p1.png b/docs/images/features/subscribe-nearby-p1.png similarity index 100% rename from doc/images/features/subscribe-nearby-p1.png rename to docs/images/features/subscribe-nearby-p1.png diff --git a/doc/images/features/tongchengduohuo-p1.png b/docs/images/features/tongchengduohuo-p1.png similarity index 100% rename from doc/images/features/tongchengduohuo-p1.png rename to docs/images/features/tongchengduohuo-p1.png diff --git a/doc/images/features/unicast.png b/docs/images/features/unicast.png similarity index 100% rename from doc/images/features/unicast.png rename to docs/images/features/unicast.png diff --git a/doc/images/mesh-helper.png b/docs/images/mesh-helper.png similarity index 100% rename from doc/images/mesh-helper.png rename to docs/images/mesh-helper.png diff --git a/doc/images/qqgroup-crcode.png b/docs/images/qqgroup-crcode.png similarity index 100% rename from doc/images/qqgroup-crcode.png rename to docs/images/qqgroup-crcode.png From 04da184a69c7888d52aa260f05a7e99f2483d038 Mon Sep 17 00:00:00 2001 From: nanoxiong Date: Thu, 20 Aug 2020 17:16:17 +0800 Subject: [PATCH 26/26] update doc --- README.zh-CN.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.zh-CN.md b/README.zh-CN.md index 2307ae86b4..181b9edc2e 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -46,4 +46,5 @@ Event Mesh的一般功能: ## 联系人 微信群: + ![wechat_qr](docs/images/mesh-helper.png) \ No newline at end of file