From 0b98ed4a45e85eeb5b37232d0790366a0108cae3 Mon Sep 17 00:00:00 2001 From: litiangang Date: Tue, 19 Apr 2022 16:55:06 +0800 Subject: [PATCH 01/12] timestampdiff code Signed-off-by: litiangang --- Source/BUILD.gn | 20 +++++ Source/include/tcpclient.h | 30 +++++++ Source/include/tcpserver.h | 23 ++++++ Source/include/utils.h | 21 +++++ Source/src/tcpclient.cpp | 68 ++++++++++++++++ Source/src/tcpserver.cpp | 49 ++++++++++++ Source/src/timestampmain.cpp | 147 +++++++++++++++++++++++++++++++++++ Source/src/utils.cpp | 11 +++ ohos.build | 13 ++++ 9 files changed, 382 insertions(+) create mode 100644 Source/BUILD.gn create mode 100644 Source/include/tcpclient.h create mode 100644 Source/include/tcpserver.h create mode 100644 Source/include/utils.h create mode 100644 Source/src/tcpclient.cpp create mode 100644 Source/src/tcpserver.cpp create mode 100644 Source/src/timestampmain.cpp create mode 100644 Source/src/utils.cpp create mode 100644 ohos.build diff --git a/Source/BUILD.gn b/Source/BUILD.gn new file mode 100644 index 0000000..85378a4 --- /dev/null +++ b/Source/BUILD.gn @@ -0,0 +1,20 @@ +import("//build/ohos.gni") + +ohos_executable("timestampdiff") { + source = [ + "src/tcpserver.cpp", + "src/tcpclient.cpp", + "src/timestampmain.cpp", + "src/utils.cpp", + ] + include_dirs = [ + "include" + ] + install_images = [ + "system", + ] + + part_name = "timestampdiff" + subsystem_name = "distributedhardware" + install_enable = true +} \ No newline at end of file diff --git a/Source/include/tcpclient.h b/Source/include/tcpclient.h new file mode 100644 index 0000000..ab549ee --- /dev/null +++ b/Source/include/tcpclient.h @@ -0,0 +1,30 @@ +#ifndef TCPCLIENT_H +#define TCPCLIENT_H + +#include +#include +#include +#include +#include +#include +#include + + +int TcpConnectSocket(const char* ip, uint16_t port); + +class TcpClient { +public: + TcpClient(); + ~TcpClient(); + + int TcpConnectSocket(const char* ip, uint16_t port); + bool SetSession(const char* svr_ip, uint16_t svr_port); + void SetSession(int sock); + int RecvData(char* buff, size_t size); + int SendData(char* buff, size_t size); + void CloseSocket(); + +private: + int sock_; +}; +#endif \ No newline at end of file diff --git a/Source/include/tcpserver.h b/Source/include/tcpserver.h new file mode 100644 index 0000000..0998c6b --- /dev/null +++ b/Source/include/tcpserver.h @@ -0,0 +1,23 @@ +#ifndef TCPSERVER_H +#define TCPSERVER_H + +#include "tcpclient.h" +#include +#include +#include +#include +#include +#include +#include + +class TcpServer{ +public: + TcpServer(); + ~TcpServer(); + + int TcpServerSocket(const uint16_t port); + bool Accept(TcpClient* session); +private: + int listenSock_; +}; +#endif \ No newline at end of file diff --git a/Source/include/utils.h b/Source/include/utils.h new file mode 100644 index 0000000..f171a1e --- /dev/null +++ b/Source/include/utils.h @@ -0,0 +1,21 @@ +#ifndef UTILS_H +#define UTILS_H + +#include + +#define BUFF_LENTH 1024 +#define NAME_LENTH 64 +#define INVALID_SOCKET -1 + +struct TimeData +{ + uint64_t t1; + uint64_t t2; + uint64_t t3; + uint64_t t4; + char hostname[NAME_LENTH]; +}; +static TimeData timed; + +uint64_t GetCurrentTime(); +#endif \ No newline at end of file diff --git a/Source/src/tcpclient.cpp b/Source/src/tcpclient.cpp new file mode 100644 index 0000000..58a1a4c --- /dev/null +++ b/Source/src/tcpclient.cpp @@ -0,0 +1,68 @@ +#include "tcpclient.h" +#include "utils.h" +#include + +TcpClient::TcpClient() +{ + sock_ = INVALID_SOCKET; +} + +TcpClient::~TcpClient() +{ + close(sock_); +} + +int TcpClient::TcpConnectSocket(const char* ip, uint16_t port) +{ + if (sock_ != INVALID_SOCKET) { + close(sock_); + } + sock_ = socket(AF_INET, SOCK_STREAM, 0); + if (sock_ == INVALID_SOCKET) { + std::cout << "socket creat fail" << std::endl; + return INVALID_SOCKET; + } + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + if (inet_aton(ip, &(addr.sin_addr)) == -1) { + return INVALID_SOCKET; + } + char ipAddress[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &(addr.sin_addr), ipAddress, INET_ADDRSTRLEN); + + int ret = connect(sock_, (struct sockaddr*)&addr, sizeof(addr)); + if (ret == -1) { + return INVALID_SOCKET; + } + return sock_; +} + +void TcpClient::SetSession(int sock) +{ + sock_ = sock; +} + +int TcpClient::RecvData(char* buff, size_t size) +{ + memset(buff, 0 , size); + int ret = read(sock_, buff, size); + if (ret <= 0) { + return false; + } + return ret; +} + +int TcpClient::SendData(char* buff, size_t size) +{ + int ret = write(sock_, buff, size); + if (ret <= 0) { + return false; + } + return ret; +} + +void TcpClient::CloseSocket() +{ + close(sock_); +} \ No newline at end of file diff --git a/Source/src/tcpserver.cpp b/Source/src/tcpserver.cpp new file mode 100644 index 0000000..495ef4f --- /dev/null +++ b/Source/src/tcpserver.cpp @@ -0,0 +1,49 @@ +#include "tcpserver.h" +#include "utils.h" +#include + +TcpServer::TcpServer() +{ + listenSock_ = INVALID_SOCKET; +} + +TcpServer::~TcpServer() +{ + close(listenSock_); +} + +int TcpServer::TcpServerSocket(const uint16_t port) +{ + listenSock_ = socket(AF_INET, SOCK_STREAM, 0); + if (listenSock_ == INVALID_SOCKET) { + std::cout << "scoket creat fail" << std::endl; + return INVALID_SOCKET; + } + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + int ret = bind(listenSock_, (struct sockaddr*)&addr, sizeof(addr)); + if (ret == -1) { + std::cout << "bind fail" << std::endl; + return INVALID_SOCKET; + } + ret = listen(listenSock_, 5); + if (ret == -1) { + std::cout << "listen fail" << std::endl; + return INVALID_SOCKET; + } + return listenSock_ != INVALID_SOCKET; +} + +bool TcpServer::Accept(TcpClient* session) +{ + struct sockaddr_in addr; + socklen_t len = sizeof(addr); + int acceptSock = accept(listenSock_, (struct sockaddr*)&addr, &len); + if (acceptSock == -1) { + return false; + } + session->SetSession(acceptSock); + return true; +} \ No newline at end of file diff --git a/Source/src/timestampmain.cpp b/Source/src/timestampmain.cpp new file mode 100644 index 0000000..947653f --- /dev/null +++ b/Source/src/timestampmain.cpp @@ -0,0 +1,147 @@ +#include "tcpclient.h" +#include "tcpserver.h" +#include "utils.h" +#include +#include +#include +#include +#include +#include + +const int32_t TEST_TIMES = 10; +const uint16_t port = 9000; +std::string svr_ip = "127.0.0.1"; +std::vector timeStampDiffs; +std::vector transCosts; +TcpClient tc; + +void PrinResult() +{ + int64_t sumDiff = 0; + int64_t sumTransCost = 0; + + for (int32_t i = 0; i < TEST_TIMES; i++) { + sumDiff += timeStampDiffs[i]; + sumTransCost += transCosts[i]; + } + + std::cout << "averagr TimeDiff(server - client)(ms):" << sumDiff / TEST_TIMES <t2 << std::endl; + std::cout << "timed.t3:" << res->t3 << std::endl; + std::cout << "server hostname:" << res->hostname << std::endl; + timed.t4 = GetCurrentTime(); + std::cout << "timed.t4: " << timed.t4 << std::endl; + + int64_t timeDiff = abs(((res->t2 - timed.t1) - (timed.t4 - res->t3))) / 2; + int64_t transCost = abs(((res->t2 - timed.t1) + (timed.t4 - res->t3))) / 2; + std::cout << "TimeStampDiff: server - client =" << timeDiff << std::endl; + std::cout << "Trans msg between client and server cost:" << transCost << std::endl; + timeStampDiffs.push_back(timeDiff); + transCosts.push_back(transCost); +} + +void TcpClientTest () +{ + if (tc.TcpConnectSocket(svr_ip.c_str(), port) == INVALID_SOCKET) { + std::cout << "client link false" << std::endl; + return; + } + char name[NAME_LENTH] = {0}; + gethostname(name, sizeof(name)); + std::cout << "client name: " << name << std::endl; + + for (int32_t i = 1; i <= TEST_TIMES; i++) { + std::cout << "-----------------Test idx:" << i << "-----------------" <RecvData(recvBuff, sizeof(recvBuff)); + if (ret <= 0) { + return; + } + std::cout << recvBuff << std::endl; + + timed.t2 = GetCurrentTime(); + std::cout << "timed.t2: " << timed.t2 << std::endl; + timed.t3 = GetCurrentTime(); + std::cout << "timed.t3: " << timed.t3 << std::endl; + + char name[NAME_LENTH] = {0}; + gethostname(name, sizeof(name)); + strcpy(timed.hostname, name); + std::cout << "timed.hostname: " << timed.hostname << std::endl; + + ret = tcpc->SendData((char*)&timed, sizeof(timed)); + if (ret <= 0) { + return; + } + } +} + +void TcpServerTest() +{ + TcpServer ts; + if (!ts.TcpServerSocket(port)) { + std::cout << "TcpServerSocket fail" << std::endl; + return; + } + while (true) { + TcpClient* tcpc = new TcpClient(); + if (!ts.Accept(tcpc)) { + std::cout << "accept fail" << std::endl; + return; + } + std::thread RecvAndSend(TcpResponse, tcpc); + RecvAndSend.detach(); + } +} + +int main(int argc, char* argv[]) +{ + timeStampDiffs.clear(); + transCosts.clear(); + const char* optstring = "s:c:"; + int opt; + while ((opt = getopt(argc, argv, optstring)) != -1) { + switch (opt) { + case 's': + TcpServerTest(); + break; + case 'c': + svr_ip = std::string(argv[2]); + TcpClientTest(); + break; + case '?': + std::cout << "error optopt:" << optopt < + +constexpr int32_t MS_ONE_SECOND = 1000; + +uint64_t GetCurrentTime() +{ + struct timeval tv; + gettimeofday(&tv, nullptr); + return tv.tv_sec * MS_ONE_SECOND + tv.tv_usec / MS_ONE_SECOND; +} \ No newline at end of file diff --git a/ohos.build b/ohos.build new file mode 100644 index 0000000..f299f73 --- /dev/null +++ b/ohos.build @@ -0,0 +1,13 @@ +{ + "parts": { + "timestampdiff": { + "inner_kits": [], + "moudule_list": [ + "/foundation/distributedhardware/timestampdiff/source:timestampdiff" + ], + "test_list": [], + "system_kits": [] + } + }, + "subsystem": "distributedhardware" +} \ No newline at end of file -- Gitee From 3dbc38cd1ebc287f9da64336c818377086671e0a Mon Sep 17 00:00:00 2001 From: li-tiangang4 Date: Wed, 20 Apr 2022 16:15:47 +0800 Subject: [PATCH 02/12] time code Signed-off-by: li-tiangang4 --- Source/src/timestampmain.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Source/src/timestampmain.cpp b/Source/src/timestampmain.cpp index 947653f..e44bb64 100644 --- a/Source/src/timestampmain.cpp +++ b/Source/src/timestampmain.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -51,8 +50,8 @@ void DoCheck() timed.t4 = GetCurrentTime(); std::cout << "timed.t4: " << timed.t4 << std::endl; - int64_t timeDiff = abs(((res->t2 - timed.t1) - (timed.t4 - res->t3))) / 2; - int64_t transCost = abs(((res->t2 - timed.t1) + (timed.t4 - res->t3))) / 2; + int64_t timeDiff = ((res->t2 - timed.t1) - (timed.t4 - res->t3)) / 2; + int64_t transCost = ((res->t2 - timed.t1) + (timed.t4 - res->t3)) / 2; std::cout << "TimeStampDiff: server - client =" << timeDiff << std::endl; std::cout << "Trans msg between client and server cost:" << transCost << std::endl; timeStampDiffs.push_back(timeDiff); -- Gitee From bc936fa30aea64bd7c5aaa4eae2557b555a0e91a Mon Sep 17 00:00:00 2001 From: li-tiangang4 Date: Wed, 20 Apr 2022 17:03:54 +0800 Subject: [PATCH 03/12] timestampdiff code Signed-off-by: li-tiangang4 --- Source/include/tcpclient.h | 1 - Source/include/tcpserver.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/include/tcpclient.h b/Source/include/tcpclient.h index ab549ee..da5ca6f 100644 --- a/Source/include/tcpclient.h +++ b/Source/include/tcpclient.h @@ -9,7 +9,6 @@ #include #include - int TcpConnectSocket(const char* ip, uint16_t port); class TcpClient { diff --git a/Source/include/tcpserver.h b/Source/include/tcpserver.h index 0998c6b..9cd4e9d 100644 --- a/Source/include/tcpserver.h +++ b/Source/include/tcpserver.h @@ -2,6 +2,7 @@ #define TCPSERVER_H #include "tcpclient.h" + #include #include #include -- Gitee From 5f8b337d9c3665ca14d253b02c4f602bfc2cb5e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=A4=A9=E5=88=9A?= Date: Wed, 20 Apr 2022 09:06:15 +0000 Subject: [PATCH 04/12] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=20Source=20?= =?UTF-8?q?=E4=B8=BA=20source?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {Source => source}/BUILD.gn | 0 {Source => source}/include/tcpclient.h | 0 {Source => source}/include/tcpserver.h | 0 {Source => source}/include/utils.h | 0 {Source => source}/src/tcpclient.cpp | 0 {Source => source}/src/tcpserver.cpp | 0 {Source => source}/src/timestampmain.cpp | 0 {Source => source}/src/utils.cpp | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {Source => source}/BUILD.gn (100%) rename {Source => source}/include/tcpclient.h (100%) rename {Source => source}/include/tcpserver.h (100%) rename {Source => source}/include/utils.h (100%) rename {Source => source}/src/tcpclient.cpp (100%) rename {Source => source}/src/tcpserver.cpp (100%) rename {Source => source}/src/timestampmain.cpp (100%) rename {Source => source}/src/utils.cpp (100%) diff --git a/Source/BUILD.gn b/source/BUILD.gn similarity index 100% rename from Source/BUILD.gn rename to source/BUILD.gn diff --git a/Source/include/tcpclient.h b/source/include/tcpclient.h similarity index 100% rename from Source/include/tcpclient.h rename to source/include/tcpclient.h diff --git a/Source/include/tcpserver.h b/source/include/tcpserver.h similarity index 100% rename from Source/include/tcpserver.h rename to source/include/tcpserver.h diff --git a/Source/include/utils.h b/source/include/utils.h similarity index 100% rename from Source/include/utils.h rename to source/include/utils.h diff --git a/Source/src/tcpclient.cpp b/source/src/tcpclient.cpp similarity index 100% rename from Source/src/tcpclient.cpp rename to source/src/tcpclient.cpp diff --git a/Source/src/tcpserver.cpp b/source/src/tcpserver.cpp similarity index 100% rename from Source/src/tcpserver.cpp rename to source/src/tcpserver.cpp diff --git a/Source/src/timestampmain.cpp b/source/src/timestampmain.cpp similarity index 100% rename from Source/src/timestampmain.cpp rename to source/src/timestampmain.cpp diff --git a/Source/src/utils.cpp b/source/src/utils.cpp similarity index 100% rename from Source/src/utils.cpp rename to source/src/utils.cpp -- Gitee From 85c767b7124fbcd61c519340fd24f2f3d388b898 Mon Sep 17 00:00:00 2001 From: li-tiangang4 Date: Thu, 21 Apr 2022 09:35:23 +0800 Subject: [PATCH 05/12] binary file Signed-off-by: li-tiangang4 --- binary/timestampdiff | Bin 0 -> 34688 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 binary/timestampdiff diff --git a/binary/timestampdiff b/binary/timestampdiff new file mode 100644 index 0000000000000000000000000000000000000000..c108c7624123f95e38e7efce7b472c6357b4bef5 GIT binary patch literal 34688 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 bKU7aGAN56_Hvz;;`Lv+kM@j-%srP>XVp^U@ literal 0 HcmV?d00001 -- Gitee From 48cccd5d68bfbd2891df5a4193a806206b213c75 Mon Sep 17 00:00:00 2001 From: li-tiangang4 Date: Sun, 24 Apr 2022 12:56:42 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E6=A3=80=E8=A7=86=E6=84=8F=E8=A7=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: li-tiangang4 --- README.md | 36 +++++++++ binary/rk3568/timestampdiff | Bin 0 -> 34900 bytes binary/timestampdiff | Bin 34688 -> 0 bytes source/BUILD.gn | 35 +++++---- source/include/{tcpclient.h => tcp_client.h} | 8 +- source/include/{tcpserver.h => tcp_server.h} | 13 ++-- source/include/utils.h | 4 + source/src/{tcpclient.cpp => tcp_client.cpp} | 8 +- source/src/{tcpserver.cpp => tcp_server.cpp} | 8 +- ...{timestampmain.cpp => time_stamp_main.cpp} | 70 ++++++++++-------- source/src/utils.cpp | 7 +- 11 files changed, 132 insertions(+), 57 deletions(-) create mode 100644 README.md create mode 100644 binary/rk3568/timestampdiff delete mode 100644 binary/timestampdiff rename source/include/{tcpclient.h => tcp_client.h} (85%) rename source/include/{tcpserver.h => tcp_server.h} (72%) rename source/src/{tcpclient.cpp => tcp_client.cpp} (94%) rename source/src/{tcpserver.cpp => tcp_server.cpp} (93%) rename source/src/{timestampmain.cpp => time_stamp_main.cpp} (62%) diff --git a/README.md b/README.md new file mode 100644 index 0000000..8170e8a --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# distributed_input + +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/binary/rk3568/timestampdiff b/binary/rk3568/timestampdiff new file mode 100644 index 0000000000000000000000000000000000000000..d71a7e2b88191284237152787b7f835e51eeb792 GIT binary patch literal 34900 zcmeHwe|(eG_5XeHqYY`H0jiW*h%8wK(7KSs05L2iSpeQ zd|%(_;oNh7oO|xM=iYnHeV#Nwo?Y(XIF2bFJu75H1*b7q3~X=4KRRYCW<1M4SuPvN z(vU@E3RIy1fdP30dcZc&3S0=9fXa|90#M&4I1c>*sGM1(axo7wkR12jAc0X;&YD0x zCPAT&F#?iHX;TP<*3Ta(Y_q*2|7R%P&w6I7!SI&{8?7N{0pf3JRgz2 z%;Oo3F$EMo5pMz%`BK9fQ@{#=2$b?kb+yYT)ww6ETotIBQ0-qiG0-rv2<>S6RA;_( z{vt(*L_=kw&aa)fm>so0wY$mny!nasgZ}hN$u%An4fy1!s9{J?)zC{d^jZzQTSFh! z&|@$-naFH=Jg*U-5dxteL;NRc=rRqxN<**H(3>>$HVyrdhTf^7X}*7{q1!d|Z&ftO`-+BsUqeSVbhm~+ ztD%kJCM79Ev=0rPtD*BX^f(PYO-0lAY$}@gTLHcnrN1Gp4CT$YGS-c(0ydb{f-bLT z>>ZhY9JJTRSes1eVAD#~Nc+k#)ZYyH6zDxDC;A}h!`Oc<7$?z}Bma)R{<2t%^>!hom!>H;=K9T>c~Q=h0XhPb2CV z{*W;z?2zhz1-fK8+Q{`sp?%xkAn>8_)AH^90rV#GzXAMCLB73m`9{zcXkUkNs$U9z zyWIWq-HdUo+uu*}G%)sr-2QdY2UYZEpzBsZr*ipkLDM+|Hf$(P!FRylc0FX2<@pG- zn*U+ce`Y0PVY$5?<)&KbT$b-wpdW^Q&Y&KR--LSK2hbUi3oxTQW@kQ2Xx(UzH}J?3 zKTohNC2S_kCPK&S4Q!B@T}A(zLiRxhgM~NEYqAipYXGwWxg^NJtscfzx%GT&p*Eg`SY@0YJH{G@cHif^Ip3dG7ww_m;#^=R07>fHZX@W@L330 z0JxY4d`cw5#sforY`RR-c-5b4L0lnc(3~kBm>gRKfO)YZzy$zOA>0!-7NF?qCZy*A z@&N^a>j27!^ha}q<;3R8nZ+_zBhtMSV3RXv$yh;jM$eE5ECY540PckN`5yj-d5QZ1 z&Dqren)E9H^tll*5ip4ee98b5069d+ADVYNfR|~qhj06VxeoZiTw$%>?34LVs?naO z{R~lMT!i$cDq5Y)0x?RJL2HNnQrgo-%lU;e9tS*9PGe1pAJx$+=bVew{*+QWMou_@ zX`Pk=GUU9;GF~j>nKHgg#)L-DKb4i$p6X?_m8i zSh=#gww_fkudT0TmG~#fDsP%McTsRkWuAX z?%AqZCAAHK%4O97&(vEyLA02?nhGTjMN?2vTT|H(2>LzME6Zx;EvhUks_|C)D}(;( z+F+opX7=paQ+%s}vunO>t1Fk+tqOR*eQ#3(p8BAF?X05N3l~kP{Ipj8BYSfle^}z-o!$i5+8h>rjLj#gcVY0Qday42s_{FKNtZ7)evZ21Ld|A=# z*;E$v`Wx0%)_Ll033@9%et&~st)HUFk{Q4XYU^(~zZJkTrd8LG#i0|?ET&cm0=2i) z&vwmK+s1cdWuH7ioNr{6b%EJf65q~}(Wdb`v{|cabET+E%mF6ezp5q(J5?_zZSg>3 zDw@{UT3ox8?&@H*x_$p#1=hkYR?2f#J3z-%F`E!zs@nt88?eIU5~p>zX`73NsuTg#BF_TNGXHbaQYd{Xz7H4p+usE{z< zfX`D?yS%oBK{eDI2quRv!8KUB($lcqUA?xFQd5hmCr|xqwp`pMPzToJ!G0$$B6nT2 z+wEt|eXz&ia^|k9gt`0CTcyv7{6Nr6@&xMTa_pbfMJ4KcZea@L^EcFB%Us?tFh?Aw zQb(yzJ8PvlC1T~;fQlCgvh(V?%H@7i5w(?OkA$oY_^|bgnPAq(-0umjlIsSlS9>Z~ zFZW@Dl}p5mP?d^5QHmUxb04c*ES(3l8dm!1pryVHyNAfxjkKTCVpC8mUh4^#SJz{= zxy7?co&q}zOI^Oua|>E5q9dg*dtr5L;5^(GN}?;wuV1*R5*_rlBD$;|(*b1<%ynUR zQny+}<>#})$z&4stCVw3Qmflj)8O`0dc46(@c*2*Y@^y8Se^>Ci)p;XgnP3jAmoV3*5dtEyTkyYTs=Lncx_;KQkzFj4;}D zi}}8{fhe8oJrP*j7DuoV!EpU=4KL-vx<-42` zZJAGe+C!PZJo5Jfj|R5GVJ`&k1Rf7;MX*5p?ZA}33jqY>lhbbnjsO<}SHMv#0WOA< zJp(xJ2Kec~&j5?#fzwUnJOx}1+;Jmh0bYv0paQrTcnR<(1OrQfbKuNZ0sDYS&O3l9 z|2_m9l)nkV4&`qH7V|5m{QIgHbEDi^jo2F43tR_$2$<>z06Ih%w)#3@1dW}9ufV+tVIFrN zgr_j}A>m754}@XM9}&hH=_ZUda*Qz6P>L{Y{uE&ZXuX87=FSi%r~h$a1RVy#SVJbl zSPPkir^B8JUja`55OS|U>gmr^7(Mid)z#Z8FDxMd`%sWTjs(E=?Mhvo)?92`C#?3Iu8#&1DrrETNUJeet!9?`WiZa!0xtHwK(Z`?9cvceocel z9bjYN)B4%s`W5vJYwG#Zh1c=R>l&(qeSJe9sYnrKfP}aj@2`oIk?Wzm!gD?R>OJnl)shK4#sH?{SX>granoB$8uR*a19=5eTF z=#v8enn?=Rz(lX_-(Vvh;P&kgSsjk0_<}SF(Ur%#T27k)oZ&)d^SOn#fA0kCKyy&|18R#N0l#wz6H4O-B zc+q2&bEHyLjuZ$l`T3aQ>sxm?^;#?mm0p^N}s)U`SR&J9BJ$j`~)m>QAt;` z3EEGEClKUo-Hp>(g}=H!z^@G4!Y}g#*LXbjN~>zjfy}7};lXq!#*Mrb1*j-wPiN%R zyC*7P#B?S%?9Y%zAqN?yHA;(MabIdmUutq+s%SccQv7gidF(Lt0ouo)#6YlcWnf%? z*?{pEYKA{fsvDTb{L`3w8VgJY0tAYH0f7?cFJbNy6aWDNMZkc-Rm^`Cb6OhZCq}ZKI8bSuLfBnll<7Re8F|AV3f-|d^M(c zC3d?YFGd0d&zwHJa5N2576$(^%PX>oTg2 zbtB%m)%vbRtH$x-wsG~Cz<55O>UcPT=@`%2v(5k%@C()|9AU}q-Pr9G1_3>jGc|>i%J{}Qq zEgcEfb;upSeN2EK6PS)>6MzSlsOMv#vT(bJ{T*Ans{cOcV~lSAm-E(<&MkN@{XT~* z{eZSAo1(*Cj+4)8N=pVbREs`v5-JxjoK;yiZ&5{Qd3oim`SU7fFRA#ZO(`xG?=$*t zFyym>3|eIDCTv_Q)u@^dJ~fB2%T_HHSpk=O>aQMCx9WWD`!A-{ja8f6dHSSFr2g9H z<4TKIEzbGsXs*5fIYW4c(v6mQsP)};{p&`3Cf;9lJU^Ch?PyCLIJm{qF{il&6ZgJl zw|;H)fwx@$vbLldIu*{xvv2u`SB+|!RTeQ;GKq8K?`w>@->&J`?K9`q4_(l~msf3H zqP>bCpJ=h}T8j5p*4EQ8E#~+=xXh#HF4eSoBTJ)sQF7%{^t_^U zE8jJKz36DK2rS~h#aCCighnau?pNb<`g;DjmHck}H7rG)(AMzJOhL8;NQc(WTE6VE zmAn+wLV9_zzbOY}0dGQ+xYvJ(BE!=X6c1>Hl!J^Vv=G?1!jqe{+BOZ{IjQ zOKkf`vA&evd``MltaIQS=S%WPGN^f~^Ch0^RXimb)cNZA=gN6*eRW&4%>O*Cmf@d| zUCsaNWc#{&)*gUXO@lq&fI1&U$fYq2t+J zgO75a?Zveo%3e%xztpu_9hL%Psw2T!M|ARDW4#TIRdNVWga|#{CR5)>gv(e6ZDZMkn zd0(wH=eJ&)=8$OKQH1;_F)m~3sRYJrHEzc!_yxI!{b}v{x>HS5`ZnfcH6ZynLAV)M z7ZHRK;DvHt`)}@U&vXnayVbGQKG-|XYy6odAJY7c`=v3}n&2Fq)zHa1Sn3B~a6F4Z z2iq_ANiAQ=fS;zCd z*W6E4Sb*G+N;CLg!d^X4Bj=7NU;$GYDcrWRWw{x|nDI;f0*%H*dJ(1Q1SuCbp-G1JY zPMX6InzoZqi7bV&Ic`w=KWszL0h+KI^2&dy` z#dY~?zqJ>35AU<~%ex0!`{mt|wNC^l35esMK5IA2)^6=)``>iqULTPBP!Q$-(;nda zO`2n{!{lK3*=SwfZS{_G6d>j6=93YhZ(ry)v_nW#Xdm+$Qg`i__6=5;x4){&n3|4$ zE&IsMA87xP^G9WO%%PR7_ug(dd53Qu>dp0DxFw^mGr>`V-K(B7jr4eLqI>`a(e&+9SiIuqs!s^6K&eBNLB z-D8`Z#8Yb_trsMU%S=pHE+#Wk+x-y zH)HGE6~-<1cr&-&yF$0+Rqx=fudU#=m}`e@)o*z#VchvvZ(h4$%M}HkiD3_1=bR_b z1I@e5A)Fp{*60}7V_?_zq;ci~cBvutpFKM4G8qm->cl5$*tss)P4iTgQ-Yj|Pp-i{ z8NDTraiFgMM42h9ACb0V4=|)|`oxNVZ~i2$O}CwU(3WG|zMxe9U?|7%U}=w;3+1E( zX8@ZXTu?d)`DWk@;7s7bz(atu9=tHe(l$SJk@a*TK2OkslQRsc6mp8H0 z!)Ft7ljT3MC+FN@|8p;Ez1@B=!MLH0K?P3ey7nLMB-o{oqetf_>5z2rXU)q=)@eB; z(~~ETfEVT^Y;`OU>3;1>7&qDR{PlcAP zwQsukt>f&XUte7H#r*VFou&A<2rK=~08@P3xIN&UG z5Y-4Rd&D}&nsh&BsVQe)nDax&%ZW73>A2laBN0v;|8XQ?hNXObf<}@4j5G$)r2Pah z%I-X&$d28Y}V|f8sEB zSwvpHJ7YS@ry0Z<4xb>aD1z31b%v~1lCmg=r1|u?B<1JF6)Dq2DL+4MbxcF~m%xV9 z+2b$uNqOIy4-#pRvhIYI*XuH`P7SY4nb$iaufxYbNU-V~9Hcj=1H78w=(U93=*?_> zt|x5}H1Kpy4`=)x_5$NJPmh5chBZ%XWLVEzfzp$Vt4vnw<|n7( zT{61*p)y_^`HV9KjwudqTiX4G)Ub18yd5&qxbD)(c$X~WI#I^Ej~lm->@l&~J)Ew+ z$IO=XWayg9EIn`g*4k&DWV*`avW)quagf70NZ%%$)}5K-_yM@Sf1Flbx@y(UJZ{)d z8g%saC#^aM#+K}>kNkigMvwWRfQu(Y0ogV;%v;rA!GteI7Y53G(-$3l$6e|+yrmi5O3bN{i| z)OrMc=k2#4|B~ZV`$lN&#ONN9M)!SjY&5R^G0lGa>qj(09LdDDX&fINg9Sz;*+>q^ z)~c4R1DfiWZ1e!hB&ps$b_9DBc?X95gRz5=Ph?279y6paJf49a$dJlCZWi%{$Jzew z_XWWRC;@zQSP)(W_#5y%yB==FN<2pf&|bK;-H$fu-rMl+bnk6tbiS;$58E=lfKHiX zUy_aJR5oHgR*Rab1&_K6y0RWq)}mx9)?<>b6ayPlCC6@_bGvmAcErgaV*>?{}i zCJHRRMYs zPCxw>+mRo+2xA#4t$#_seIAt|73wJz_1fIWoni+=su^5qC*CA-zprOl+cePoNngeAb!F~=^zdw&*$Mehp2oqrL8&i4f2`Z{Uuo7yKFH{AQ|XZNj4 zb8K>6_zXjAMP~_OiB^V_ajAi{^izyCUp!-k)5TxWDReA!moxNMmEMk#8d}%lU%mM68wsw8M(`ZY`z6>%gwqGUpxu}>DtRYqJtbI?IM4gWyiW8> z%;=d;)FHswAA4Bp(3b}jI*z3d0vos`4#Rdj*S3H0PC|!W{`Q`MeBVz>eE*tMtl%k! zQRMt#Qt~e%z&H<+`t3`^6EX-+25_p-aM~kt+S|uT;pqeH)07(od%LOSB1Ba%!wJ?V=p$~e(RE*G^m z_+<7VNn=jbt4lgXjrmmaP`)oY4(%5s6@*0GqlQ!?aK57oeJuZyD;)AcAv|iDV?%1E zC_ANv)6Oqh;Wekn?>>S#XQD^N?H>%g*muluFDF~rP07`Gm&gg2320ow*xT<2!b^Y< z!2MUrx7yIY3^SkZt;WC8z16gzw63)qu%D18bx@3#^(uQeC2vGc+I0%W5t;f%Bx%Hy zl$m|0Mg)1jSzHJ;Cj` zBr*ydvPBNl&*5;F%we7C{(v~FlR4ZCjQuY`x~LTl@=hSdi-y$Qi9u!1cxqwNx&+_7 z0DSa@Aeew#bc|*FLl7SOlOU`BT;3_o*}d&ej(NBTpa^5$oVA#}+wI%~h?2b5c%4;? zs>~0}nK#Edx9l!EMNsKK!+2Yrm^J22YrR&Qy><(#Jbiw5&a{B3(~h2 zVs2g$(qLJJ)Vm4tJ_o71&oqqpMvTbZH{Ouw*O?R2`W*s{^`9_;&)|Zyrymor?!oCf zk&{WZrfIl+fj`|{D02F!FBUb3>*}L!$p`NSMts!m#J(~asY8ing=t4>3I}xt3Qu95 ze)R0gqt_HZ(aBklzh#PKJ9XO|?bOo?3E{N&Ozfz+jT2XgZa?EQpW1Y7`LB88 z=UUoQp9-x7+i|>4xg<<1AxXL5AZFyS|sZqNpIZslYMo zi>!3AfD6jl*bA;JKCD{4Tf(s{K0T4@ICAv6Zja}jnORd*0XV4T<9lVEd1`# z5X+4rR?N-gTe_(JVAP+Q#(J199L*!lT(LV*Zsx*K8|wa)>f+v&W1$G$%Ysg(AVY}R zy7*z?=pe{uWD8moT&J+58Y5=mWBS4Xs3)R-2xrbSfGQWMrlmd;@1jqj4>W_*2;$Gu}9)RK|K@c*9Smf2A=Mg zTjB5p!+Od z*QFoU6xCUqBBR)%*e@XyXIdBKFsB?J66e>5ap71^nlP7-ffr|CSOexRlf_1LFsINJ z>Qg-*bc%2G#Rij(e3FhfLPrcbA-$2VNJpeAt)4y_Ch2K^7Q?-cWINzzCfhlKEezin zLtnP8Jn&d2&xwI-i+=?7|B@ZPiF_AiAe*H5VVDE5XQ|(C)Ic=#EzeC*?sF&lJcf2( zH#S=D(`anIa7^R}yP&o4Lz)jBYXf$rgI<4Z)xoZZ#fIOuF`8~^>iSF&2CS1hk~0Bt%lob-kHdijYR5P{*ke>?~@V6i(q<_f87;GUe6ouJD)bn-? z?4Im>Fv-o9NOKaB=48`1oRg(Pr8&6?`hh$3jrCe6w<||G9P>$9dnT-Njtz~$1MSnv z5KA~Vq$(U6OJjE7nT$Mk?4h}X3rTS$-DhVFNnLf=FKHTwQAO zKGTy!Xw5E`)~ZVy^9CAo)w%XZwn1yPk?p`fx#MUMd}&{$XHt2P9}k$sJq_1&W}17N zuPoTIXiKnVTI=E-fVm*MDv|jVtN55@JuF>>69g~+o7M#Y&)4b0;Knu=nR+?>B`WitDSezx%M>Y#2)`FxGd5xGz=2W`KutmrSIbX+Ep#P+S-5sO4M(ow3YYug3Em2$WyNB9*f&C9Ql^lhlB34b<#XpFi+wf*)TUg$PC@kyj?HrXRxU28)9R{ zIlCb?1GEmdoW&|)chkh$sY@4Y=}w0ZNvB30 z>kWE&LDpe4#>io=aV3*$u)sbb7oE!k?W01p50dS+KKrN;?W2=F6y@@oyQs{lwhz#v zJ+$nD&lrwj9VN>#FRzWFy|jN`W{|C5{gptT64ks|HS=g|F@tU4*lB79o=4>N>s9sdM|yO)h5WV{7XlAo7f`^>}TE37YAE|ir_D7jM2Dg52zzKHRC!! z;|YbM{~?bH`jGXoBvys=DkgkPvSecnW1QjWD%Yuxb3*V_F%AP{5bewo>XPJd#Tnfi zr?Z>JME)0@RV>sJpCpe7)0oTI$bKrK#|2?J*&=uu;WO$+vlin9Sq`TtE1f4S+4~sA zhB0s~J4SOk9c4d~>p{1et4GBCXs-S!=Zkw*RX92c?f0NPwHuE#oslLB?83r^lbzBy znm{v~g5&>y_)%yBuyFead_9Qq3CwK6udHYXd%w zvE*P~FDZj_3}>S4TE@P5O%SqS2<3oN4#s{9`V{hScwG>Rflq^e@&!RSh_bYo1!2dF zg0KLf?9(N5o;K}>n?khy+hCU&@pASvQ3qK%)}`ZIvCA=coJ-szyRa8Vb+&M{i1u;V zTec6rC2T*<7asaI#7dMNiux}07tDo));Nyf2gEu&(lnMcWPfB|*i#wKI;?|O9)A(p zv7USv?2)=u%RbW@nmeE5SI}AKmUUL8((&i0qxAI=>;R7&l6KU43Uh5kJsb2%=N~+-7PkubNE2p)k zix0PSaTc_JkC+X6Ps2K=zRc+VMY%t0OqjpLu^9G5nmepnbDmX_iPo%cd^k2pKEKgE zm&ck&hny65jD}weZy{L{NPZWM1MjWnj(1U;#W6f8 zGUM+qiTUKG5#M6)vw^P@IwD<_^Ud)z@Nik0;U7U?!lWqe$$RB?WOF9$TUP)-FXz1i zz7%)T9=u8R!*7Lda3m&`{0ih7t+dx|j?|zGuk<9Hd~=rxdFgCRcRJ1yYESjY%RFvG zJ?e|>4L(7VMQY_33|@4BJM?bH*Agin1i;;xM5nkkD$Ln;Pn&m>U8bE zyex^)+~O;YxlQsoXx&^qq@~LV`yg3p&$8mZFdb~-PPC`JN6g0_srK0?p|2{Ghg9Y2 z{pm84uRuB3)^fS8TF61`i};b;B=g0nSA%-w$E)*4ARj(bveS<5bhq5ZHr3&CQU@z+M@END8{F1G-j;hF3aL(&-f8&F_wSvZ&l=Vcmw1Vz1 zP_E?D`)pUqvi}TvvbkXAHth4_ylju#FfaJaKheiw%bd;L#jz1x9LB3d{0AGxxluuN zb1nRK=$`tI#PB!X$d7?9M|Kg38ToLu19>>B#r63qt?O_&I#TTSrdTc7lTE{R&34qu zwo3JAy%yR>%bJh4O8Y}gFN_3E`#BCc=jS@O6pMtxdm2JkS0*J#)j zzK9%y>n-|9KptA72W1-%XRw}MVQy{6=fQt8_%l~a9P1%L^~kQNO{-jg8|ovBgDo$N;n*>^ zA)m_0ep*ll-6Y?T`y;>dRXL3bFxz=aU!?ox(6ddZN%zY@@0aTqqMf?#4^U=D9~O+8 z=IZyDm(dH(-5V8OAcnp79jq~$D_Uc?lQ7eHPvcQ!T?Sb{!8mql@|Pn27Ub{MkQz(V?6YI_f3GOv6c$2!96$5sZN|xhXMPr2G{&n5I#qG@$Utp^gjjR3Y4z~ zy#=@&^)G>K_{t|FEbT2_6aR{H40hHGxy1DapCpNWhV+FsV)j8c>YLUB&FcuraAEyi zaZTKB!n%a*(>#df*rU?n&)UH2?O|*{d}EdQjK?_X{3Tw>7>3$xQxBunO|pB>yC>iuQ~9vFFmeuvmMvRrkvKpP@#ap%(HzHtjPlLEjWZ7%eu@QiYl5CgKWkKdnD}iN%fcAqa9lT&UyL2>|r#VFmBX@$Px#lbs53%8#<&SY4`=iJUcbk}V#CjO-9Ck2n=Ebie$jU}@vY+CKbibN$P4}ANRi4i2b48qJb1^R?&DyS{o(Y!4|j4Q*coh0T)S1UH+lU^b|tM}T2DNO`%BDo znpIj;v?p#;ttYEI)<)T`O3oQ;{~DL<>VbHg1wKEW=?woPGjJ@k+kq_?9M0@8glFeG3`?`lhW;-0zEXWnc zMe|(vM~eT`Rt34Bd(K8@6Up|j>MVL!6CO~fG$Yybt?JZmgRHF^1Tmw;Cg-q z^1UMRlFp)^V?DyBhu)2{-VGKyn4rRtK9{QGeNvX!Cd>P)bL2f&pM|nMi=fM(ypLM3r=FV4*#2h)!BvdEvkE^=ZQt#- zZ)e|PtN|T|AQ#y<=~*4SHp+67ozVSF=p4DvZ{LayTU9n3yl@C~?TQJbuvg(;66bT@ zJ-riSO2?Sm@G#;}IBykOX|DQawnBPW+sYD^?yr@{Fhd^0{By=|ep{h6s@MwI#T|&J zXFVeb?@Y!MQ0V=CQpQU(GLHR*GM30P`pPAr^6)Io;M1^K$XEjz72ExH_JY&t1NQ;} z^uV=tuI-Lj*)G{^3FOj4u5GxG+JN)_e?qReG;;m-H;`+FW{(Qvu4Khif^Y^GJ-Lue z>(}X3ew_hnaoife?hl%N^_GJ;yAKYin~8o*=*MCy?V>$rIJ=E}zV#FrDt*%Vq~n{q zh9X|TUDQ1W>*g+9{?? zG3h-V7mAS2KCtbM_@11BF=w&3#&#T~*we~m?PC2?+*xQH_^fjobY{T%cLQGpIQ$FT zTj2r8{n!Kk8|gGW5E!5rE9qsC_?#JMc9*_r+fjY0S=37f##Z$mfb`MX zM7%$TJ?1Y+4}l&=u>&zK)7JOgjqF8PJ7h0(j%HCETR1v&hzob!h%+-?F}lktlh1hs zL}D!DwEQJrhBMp6HeenXi2mk1hW=gsCO9kno-`&ZHVj|!C>Yna`UD^)$GPh9 zi}#pSl27qn^x*s#dYGxvL#nDHs>C>SFG@NhJ*e|Z4}bcOdU#OQ!^6Of0Qc?0bEfh5 zJ}mZ-my!M$py+|#0oYb0os)>4VoJQ9iTF6gNxmLE7i{Fn2SVJ8dq1jYLab;2;H4q) zIZ-BiBthrhS$s66ucvpCTTX5;xh8(Nxu|dd>?a$u|Y2j zVwqODlOR8H5#39e>0JZy{to4IA9oe%(!C{P*G6#52wxa=i9avBW2D4!Ezo7f<&4#b z`+X0R?_rvI=!Iftl0%t)={?MCkgq?MyAvjyTPBy>$a*Ssy`N z*uyG%=J9@CegyCFLKcJV`S|E^V7%9BaINnmxv>8yIpD>0v7Jq)!dGsh(b!k_2 zWkd8A3(2PLk5bHRC|w76n!C8t%&s=;funUrp*YFZTy5xCuW#7F2B$4+6b zz%F8^q4!MWajp&6K9@%Sjz@T`3bBamZjr{BALCqXiZSxjC}P_r^+kOSVTK6D<6Q!b z7i+ScV)wt}KD8L@hWrrqx-ml+qfvh6q;QN!IjasZ0PRHSe0&5rCU|$O{#QAm2Om}eX6uqm9A2ym#ES%Robaa+f?ZiRobdb z7pl^{DxITBTU2S2D$P{sUOca&GgFK?ROxP2I-*J+R;4>t=|ie?hbp~Sm2Ow1cd620 zRk}@;ZdIi>snQ`;x>1$(snT9mx=NK^qDs3|X{Rb}Q>EX8Z|1pQ5H>#mA0Pfl3*dS{ z5g-$A0Dj5CfHi=HfC+#q-D9Qw+-vm4W@B^*`=m1Ahz8A0+@C@i50pZ(cz;75My%Y9I4cC8m>PaF*GlOh zi0^|lc2g`Lc_VQjkvpmZ`K1va{wW^U7JhToIh@|LQukwe4Ll2B808pd?4 z9Ed$dIl{3Fl8g;Fg`Pw6R=i7!aiRa1sVW@B>kQDr zV){-g;$g%M7(Zl>8vy6@i*no}CP}9k$vP!I`RIfA7pnQAPvVb9X30@}RoArPcyABi z6UbSHap^wzDi;OFX#ChQ6|z2#d2!dFfX~dvk_x9yt|jQp)T*6)kSqmZV5%F zrGr-&*KzFk3=(U+ahLuXXK^IjL1v#%@KUhA!2|% zzcfEH@>70e^jAN|oj}#bC}&-Sy9wBHBpjt@!erk&QML}Wbhoe=-(^hil5FM8*xfwl zJQRxR*v6>7HFS=B$luADj&;i69T(^|JO$|@%byyeL-GB~OzW)3$Tx9kexN+E9zcEM zVeKPIh=ptu5;uG<^n^nDx|_0GQC-pcf~G7R&mqkr%^}@11o@MZKLq(mb4YVYHw{Mq z6yy&^KGGc09MVmh$S+2ICi0Qykj5Q0-;{y;E0Ldpe55&~Ii#D+$e)UQGxCw{~UxIuS@{#6{=8$emNB%VArz0O}4rvbQrZnVFM}8Xek>-%* zkZv*}|9i+cA|GiEX%6Wo1M+7e-++9iIixwHoAj<|$clVD@{zV7%^}^Sb47W|*C8Ki z3*{r-#JQp-%IA=ew1M)GZo(YtD4!vp-s7fxr0EWX_F9@xtO4v>VZAb^+W9=wvAK)p zlID@-t#8ic`Rbc1d7k>_NS>d*xsm6kZ%*X-=$i|99{T1$)_^b8Gc)zG6gbdHA3)X+>rpZfd2@pWtH4>feBhCZmF_iE^8 zG;~-)Z`075H1r)B+NYu28hVL_F4xdD4PC6E3pI3}hPG&EgNE+?bf7+uY3PWCen&$e z($Ftx=ynbLgobX@(D!NRkcJLwXs?D|s-ayP+ODBXH1v3xo(4xm`OxoR6VTr-%k(3D z58z%Pi1?jg74ExMqa0wxi?wZlFu;a~;Jx%9d@Vgwz&$P;8p2b7afZ`%0Q*W18YmAB zU&If50oIL6Zv4+oD8OB{Sno^J!}mbg2mp@_m4)jk~n(YvPc(TXf1p-kXd{*%{!v_N^zvYc2``KJ6U!6z! z+RqrA2=t-ftyVzFk^XIM!M)=DW3cymc=A_aeAVx zWpNg6sBV}co4bIG(C2U?xm;ZVHyk;_)q*10Fty2Yy1D{E^M zY4O`$Y+}HRKE#y2fjW@7QBVB8NY|nqW-HqDHY5mO=6xS3qtB%Pn6Fsx8DtWW-76om zVfyRd^2pY>n16hsx-)0Dw9^k-$GxuS6k$NhbQd0w7+>$BlY_ KRS00E-v0%{4%0IL literal 0 HcmV?d00001 diff --git a/binary/timestampdiff b/binary/timestampdiff deleted file mode 100644 index c108c7624123f95e38e7efce7b472c6357b4bef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34688 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 bKU7aGAN56_Hvz;;`Lv+kM@j-%srP>XVp^U@ diff --git a/source/BUILD.gn b/source/BUILD.gn index 85378a4..177a7ed 100644 --- a/source/BUILD.gn +++ b/source/BUILD.gn @@ -1,20 +1,23 @@ import("//build/ohos.gni") ohos_executable("timestampdiff") { - source = [ - "src/tcpserver.cpp", - "src/tcpclient.cpp", - "src/timestampmain.cpp", - "src/utils.cpp", - ] - include_dirs = [ - "include" - ] - install_images = [ - "system", - ] + sources = [ + "src/tcp_server.cpp", + "src/tcp_client.cpp", + "src/time_stamp_main.cpp", + "src/utils.cpp", + ] + + include_dirs = [ + "include", + ] + + install_images = [ + "system", + ] + + part_name = "timestampdiff" + subsystem_name = "distributedhardware" + install_enable = true +} - part_name = "timestampdiff" - subsystem_name = "distributedhardware" - install_enable = true -} \ No newline at end of file diff --git a/source/include/tcpclient.h b/source/include/tcp_client.h similarity index 85% rename from source/include/tcpclient.h rename to source/include/tcp_client.h index da5ca6f..42d649b 100644 --- a/source/include/tcpclient.h +++ b/source/include/tcp_client.h @@ -1,5 +1,5 @@ -#ifndef TCPCLIENT_H -#define TCPCLIENT_H +#ifndef TCP_CLIENT_H +#define TCP_CLIENT_H #include #include @@ -9,6 +9,8 @@ #include #include +namespace OHOS { +namespace DistributedHardware { int TcpConnectSocket(const char* ip, uint16_t port); class TcpClient { @@ -26,4 +28,6 @@ public: private: int sock_; }; +} +} #endif \ No newline at end of file diff --git a/source/include/tcpserver.h b/source/include/tcp_server.h similarity index 72% rename from source/include/tcpserver.h rename to source/include/tcp_server.h index 9cd4e9d..90ddd0d 100644 --- a/source/include/tcpserver.h +++ b/source/include/tcp_server.h @@ -1,8 +1,7 @@ -#ifndef TCPSERVER_H -#define TCPSERVER_H - -#include "tcpclient.h" +#ifndef TCP_SERVER_H +#define TCP_SERVER_H +#include "tcp_client.h" #include #include #include @@ -11,6 +10,8 @@ #include #include +namespace OHOS { +namespace DistributedHardware { class TcpServer{ public: TcpServer(); @@ -21,4 +22,6 @@ public: private: int listenSock_; }; -#endif \ No newline at end of file +} +} +#endif diff --git a/source/include/utils.h b/source/include/utils.h index f171a1e..743854c 100644 --- a/source/include/utils.h +++ b/source/include/utils.h @@ -3,6 +3,8 @@ #include +namespace OHOS { +namespace DistributedHardware { #define BUFF_LENTH 1024 #define NAME_LENTH 64 #define INVALID_SOCKET -1 @@ -18,4 +20,6 @@ struct TimeData static TimeData timed; uint64_t GetCurrentTime(); +} +} #endif \ No newline at end of file diff --git a/source/src/tcpclient.cpp b/source/src/tcp_client.cpp similarity index 94% rename from source/src/tcpclient.cpp rename to source/src/tcp_client.cpp index 58a1a4c..5a92e26 100644 --- a/source/src/tcpclient.cpp +++ b/source/src/tcp_client.cpp @@ -1,7 +1,9 @@ -#include "tcpclient.h" +#include "tcp_client.h" #include "utils.h" #include +namespace OHOS { +namespace DistributedHardware { TcpClient::TcpClient() { sock_ = INVALID_SOCKET; @@ -65,4 +67,6 @@ int TcpClient::SendData(char* buff, size_t size) void TcpClient::CloseSocket() { close(sock_); -} \ No newline at end of file +} +} +} diff --git a/source/src/tcpserver.cpp b/source/src/tcp_server.cpp similarity index 93% rename from source/src/tcpserver.cpp rename to source/src/tcp_server.cpp index 495ef4f..856ac2d 100644 --- a/source/src/tcpserver.cpp +++ b/source/src/tcp_server.cpp @@ -1,7 +1,9 @@ -#include "tcpserver.h" +#include "tcp_server.h" #include "utils.h" #include +namespace OHOS { +namespace DistributedHardware { TcpServer::TcpServer() { listenSock_ = INVALID_SOCKET; @@ -46,4 +48,6 @@ bool TcpServer::Accept(TcpClient* session) } session->SetSession(acceptSock); return true; -} \ No newline at end of file +} +} +} diff --git a/source/src/timestampmain.cpp b/source/src/time_stamp_main.cpp similarity index 62% rename from source/src/timestampmain.cpp rename to source/src/time_stamp_main.cpp index e44bb64..37818ce 100644 --- a/source/src/timestampmain.cpp +++ b/source/src/time_stamp_main.cpp @@ -1,12 +1,16 @@ -#include "tcpclient.h" -#include "tcpserver.h" +#include "tcp_client.h" +#include "tcp_server.h" #include "utils.h" #include #include #include +#include #include #include +namespace OHOS { +namespace DistributedHardware { + const int32_t TEST_TIMES = 10; const uint16_t port = 9000; std::string svr_ip = "127.0.0.1"; @@ -24,16 +28,16 @@ void PrinResult() sumTransCost += transCosts[i]; } - std::cout << "averagr TimeDiff(server - client)(ms):" << sumDiff / TEST_TIMES <t2 << std::endl; std::cout << "timed.t3:" << res->t3 << std::endl; std::cout << "server hostname:" << res->hostname << std::endl; - timed.t4 = GetCurrentTime(); - std::cout << "timed.t4: " << timed.t4 << std::endl; + std::cout << "timed.t4:" << timed.t4 << std::endl; - int64_t timeDiff = ((res->t2 - timed.t1) - (timed.t4 - res->t3)) / 2; - int64_t transCost = ((res->t2 - timed.t1) + (timed.t4 - res->t3)) / 2; + int64_t timeDiff = llabs(((int64_t)(res->t2 - timed.t1) - (int64_t)(timed.t4 - res->t3)) / 2); + int64_t transCost = ((int64_t)(res->t2 - timed.t1) + (int64_t)(timed.t4 - res->t3)) / 2; std::cout << "TimeStampDiff: server - client =" << timeDiff << std::endl; std::cout << "Trans msg between client and server cost:" << transCost << std::endl; timeStampDiffs.push_back(timeDiff); transCosts.push_back(transCost); } -void TcpClientTest () +void TcpClientInit () { + std::cout << "TcpClientInit start" << std::endl; if (tc.TcpConnectSocket(svr_ip.c_str(), port) == INVALID_SOCKET) { std::cout << "client link false" << std::endl; return; } char name[NAME_LENTH] = {0}; gethostname(name, sizeof(name)); - std::cout << "client name: " << name << std::endl; + std::cout << "client name:" << name << std::endl; for (int32_t i = 1; i <= TEST_TIMES; i++) { std::cout << "-----------------Test idx:" << i << "-----------------" <SendData((char*)&timed, sizeof(timed)); if (ret <= 0) { return; @@ -103,8 +107,9 @@ void TcpResponse(TcpClient* tcpc) } } -void TcpServerTest() +void TcpServerInit() { + std::cout << "TcpServerInit start" << std::endl; TcpServer ts; if (!ts.TcpServerSocket(port)) { std::cout << "TcpServerSocket fail" << std::endl; @@ -120,27 +125,34 @@ void TcpServerTest() RecvAndSend.detach(); } } +} +} int main(int argc, char* argv[]) { - timeStampDiffs.clear(); - transCosts.clear(); - const char* optstring = "s:c:"; - int opt; + OHOS::DistributedHardware::timeStampDiffs.clear(); + OHOS::DistributedHardware::transCosts.clear(); + /** + * --s: creat as server mode + * --c: creat as client mode, there must be the IP if the server as argument + */ + const char* optstring = "sc:"; + int opt = -1; while ((opt = getopt(argc, argv, optstring)) != -1) { switch (opt) { case 's': - TcpServerTest(); - break; + OHOS::DistributedHardware::TcpServerInit(); + break; case 'c': - svr_ip = std::string(argv[2]); - TcpClientTest(); - break; + OHOS::DistributedHardware::svr_ip = optarg; + OHOS::DistributedHardware::TcpClientInit(); + break; case '?': - std::cout << "error optopt:" << optopt < +namespace OHOS { +namespace DistributedHardware { constexpr int32_t MS_ONE_SECOND = 1000; uint64_t GetCurrentTime() @@ -8,4 +10,7 @@ uint64_t GetCurrentTime() struct timeval tv; gettimeofday(&tv, nullptr); return tv.tv_sec * MS_ONE_SECOND + tv.tv_usec / MS_ONE_SECOND; -} \ No newline at end of file +} +} +} + -- Gitee From db9dcfb30b4cbb1caadf48769029f6a2ebf47ba8 Mon Sep 17 00:00:00 2001 From: li-tiangang4 Date: Sun, 24 Apr 2022 13:01:05 +0800 Subject: [PATCH 07/12] =?UTF-8?q?README=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: li-tiangang4 --- README.md | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 8170e8a..7641e85 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,20 @@ -# distributed_input +# time_stamp_diff -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} +# 介绍 -#### Software Architecture -Software architecture description +基于C/S架构的一个通信工具,用于测试两个设备间时延的工具 -#### Installation +# 编译方法 +1、下载此源码到OpenHarmony源码仓的、foudation/distributedharware目录下。 -1. xxxx -2. xxxx -3. xxxx +2、修改OpenHarmony源码的产品配置文件,把procrank添加到产品的编译目标中。 +例如:在productdefine/common/products/rk3568.json产品中增加部件: +"distributedharware:timestampdiff ":{}, -#### Instructions +3、编译timestampdiff进程:单独编译timestampdiff:./build.sh --product-name +rk3568 --build-target timestampdiff -1. xxxx -2. xxxx -3. xxxx +#使用说明 -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +server端:./timestampdiff -s +client端:./timestampdiff -c server端IP \ No newline at end of file -- Gitee From f89d07a6fe87b3dce2926c5ae4a14a7f17e45faa Mon Sep 17 00:00:00 2001 From: li-tiangang4 Date: Sun, 24 Apr 2022 13:03:03 +0800 Subject: [PATCH 08/12] =?UTF-8?q?README=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: li-tiangang4 --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7641e85..c5b05cc 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,10 @@ # 介绍 -基于C/S架构的一个通信工具,用于测试两个设备间时延的工具 +基于C/S架构的一个通信工具,用于测试两个设备间时延的工具。 # 编译方法 + 1、下载此源码到OpenHarmony源码仓的、foudation/distributedharware目录下。 2、修改OpenHarmony源码的产品配置文件,把procrank添加到产品的编译目标中。 -- Gitee From 603f24bed506ff3655f355d5f24bc972451d7381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=A4=A9=E5=88=9A?= Date: Sun, 24 Apr 2022 06:04:11 +0000 Subject: [PATCH 09/12] update README.md. --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c5b05cc..60d9c0f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,8 @@ 3、编译timestampdiff进程:单独编译timestampdiff:./build.sh --product-name rk3568 --build-target timestampdiff -#使用说明 +# 使用说明 -server端:./timestampdiff -s -client端:./timestampdiff -c server端IP \ No newline at end of file +服务端:./timestampdiff -s + +客户端:./timestampdiff -c 服务端IP \ No newline at end of file -- Gitee From 64fc4623e800f5e5a34ea40346b53320c9dd9f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=A4=A9=E5=88=9A?= Date: Sun, 24 Apr 2022 07:39:09 +0000 Subject: [PATCH 10/12] update README.md. --- README.md | 36 ++++++++++++++---- .../a684f2a4-142a-4617-b33a-679f4fb5dd83.png | Bin 0 -> 12105 bytes source/image.png | Bin 0 -> 8066 bytes 3 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 source/a684f2a4-142a-4617-b33a-679f4fb5dd83.png create mode 100644 source/image.png diff --git a/README.md b/README.md index 60d9c0f..be7b788 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,41 @@ # 介绍 -基于C/S架构的一个通信工具,用于测试两个设备间时延的工具。 + 基于C/S架构的一个测试工具,用于测试两个设备间的时间戳偏差 # 编译方法 -1、下载此源码到OpenHarmony源码仓的、foudation/distributedharware目录下。 +1、下载此源码到OpenHarmony源码仓的foundation/distributedhardware目录下。 + +2、修改OpenHarmony源码的产品配置文件,把timestampdiff添加到产品的编译目标中。 -2、修改OpenHarmony源码的产品配置文件,把procrank添加到产品的编译目标中。 例如:在productdefine/common/products/rk3568.json产品中增加部件: -"distributedharware:timestampdiff ":{}, +"distributedhardware:timestampdiff ":{}, -3、编译timestampdiff进程:单独编译timestampdiff:./build.sh --product-name -rk3568 --build-target timestampdiff +3、编译timestampdiff进程:单独编译timestampdiff:./build.sh --product-name rk3568 --build-target timestampdiff # 使用说明 -服务端:./timestampdiff -s +1、通过hdc将编译生成的二进制传到两个设备中去。 + +命令:hdc file send 二进制文件路径 目标路径 + +2、给二进制文件加上执行权限 + +命令:chmod 777 timestampdiff + +3、两台设备间,任选一台设备作为服务端,另一台设备作为客户端。 + +(1)、先启动服务端,启动命令:./timestampdiff -s + +执行样例如下: + +![服务端执行样例](source/image.png) + +(2)、服务端启动成功后,再启动客户端,启动命令:./timestampdiff -c 服务端IP + +执行样例如下: + +![客户端执行样例](source/a684f2a4-142a-4617-b33a-679f4fb5dd83.png) -客户端:./timestampdiff -c 服务端IP \ No newline at end of file +注:对于RK3568开发板,可以直接下载binary/rk3568目录下的二进制使用。 \ No newline at end of file diff --git a/source/a684f2a4-142a-4617-b33a-679f4fb5dd83.png b/source/a684f2a4-142a-4617-b33a-679f4fb5dd83.png new file mode 100644 index 0000000000000000000000000000000000000000..c9d10b374f5c0aa0168de895d84a373387d35485 GIT binary patch literal 12105 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 Date: Mon, 25 Apr 2022 16:34:03 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: li-tiangang4 --- ohos.build | 4 ++-- source/src/time_stamp_main.cpp | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ohos.build b/ohos.build index f299f73..ccb8461 100644 --- a/ohos.build +++ b/ohos.build @@ -2,8 +2,8 @@ "parts": { "timestampdiff": { "inner_kits": [], - "moudule_list": [ - "/foundation/distributedhardware/timestampdiff/source:timestampdiff" + "module_list": [ + "//foundation/distributedhardware/timestampdiff/source:timestampdiff" ], "test_list": [], "system_kits": [] diff --git a/source/src/time_stamp_main.cpp b/source/src/time_stamp_main.cpp index 37818ce..73a9025 100644 --- a/source/src/time_stamp_main.cpp +++ b/source/src/time_stamp_main.cpp @@ -126,7 +126,6 @@ void TcpServerInit() } } } - } int main(int argc, char* argv[]) { -- Gitee From 82142148dfb41cef2b57d7c0a56b3d2703f4f226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=A4=A9=E5=88=9A?= Date: Mon, 25 Apr 2022 08:49:41 +0000 Subject: [PATCH 12/12] update README.md. --- README.md | 6 ++++++ average_result.png | Bin 0 -> 12116 bytes one_result.png | Bin 0 -> 36858 bytes 3 files changed, 6 insertions(+) create mode 100644 average_result.png create mode 100644 one_result.png diff --git a/README.md b/README.md index be7b788..39af844 100644 --- a/README.md +++ b/README.md @@ -39,4 +39,10 @@ ![客户端执行样例](source/a684f2a4-142a-4617-b33a-679f4fb5dd83.png) +执行结果样例如下: + +![客户端执行结果](one_result.png) + +![输入图片说明](average_result.png) + 注:对于RK3568开发板,可以直接下载binary/rk3568目录下的二进制使用。 \ No newline at end of file diff --git a/average_result.png b/average_result.png new file mode 100644 index 0000000000000000000000000000000000000000..06194425efcf8a1282cc6ba91d9e3f8efd23453a GIT binary patch literal 12116 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 mo%svnxxJ|N)l%Krg|cz}BV literal 0 HcmV?d00001 -- Gitee