From 435859a64bbb194a2b4dd881ac96b0944e7dead5 Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Fri, 3 Jul 2015 18:12:25 +0200 Subject: [PATCH] Bug 1941 - [aodv] Remove unnecessary dependency on Application module --- src/aodv/test/aodv-id-cache-test-suite.cc | 7 +- src/aodv/test/aodv-regression.cc | 62 ++++++++---- src/aodv/test/aodv-regression.h | 7 ++ src/aodv/test/bug-772.cc | 39 +++++--- src/aodv/test/bug-772.h | 14 +++ src/aodv/test/loopback.cc | 112 +++++++++++++++++++--- src/aodv/test/loopback.h | 45 --------- src/aodv/test/tcp-chain-test-0-0.pcap | Bin 49816 -> 53374 bytes src/aodv/test/tcp-chain-test-9-0.pcap | Bin 28276 -> 28956 bytes src/aodv/test/udp-chain-test-0-0.pcap | Bin 34712 -> 36702 bytes src/aodv/test/udp-chain-test-9-0.pcap | Bin 18634 -> 19774 bytes src/aodv/wscript | 2 +- 12 files changed, 192 insertions(+), 96 deletions(-) delete mode 100644 src/aodv/test/loopback.h diff --git a/src/aodv/test/aodv-id-cache-test-suite.cc b/src/aodv/test/aodv-id-cache-test-suite.cc index 7a03dee62..a57a18c96 100644 --- a/src/aodv/test/aodv-id-cache-test-suite.cc +++ b/src/aodv/test/aodv-id-cache-test-suite.cc @@ -37,11 +37,14 @@ namespace aodv // Tests //----------------------------------------------------------------------------- /// Unit test for id cache -struct IdCacheTest : public TestCase +class IdCacheTest : public TestCase { +public: IdCacheTest () : TestCase ("Id Cache"), cache (Seconds (10)) {} virtual void DoRun (); + +private: void CheckTimeout1 (); void CheckTimeout2 (); void CheckTimeout3 (); @@ -93,7 +96,7 @@ IdCacheTest::CheckTimeout3 () class IdCacheTestSuite : public TestSuite { public: - IdCacheTestSuite () : TestSuite ("routing-id-cache", UNIT) + IdCacheTestSuite () : TestSuite ("aodv-routing-id-cache", UNIT) { AddTestCase (new IdCacheTest, TestCase::QUICK); } diff --git a/src/aodv/test/aodv-regression.cc b/src/aodv/test/aodv-regression.cc index 0d53611cc..80d9eb529 100644 --- a/src/aodv/test/aodv-regression.cc +++ b/src/aodv/test/aodv-regression.cc @@ -20,7 +20,6 @@ #include "aodv-regression.h" #include "bug-772.h" -#include "loopback.h" #include "ns3/simulator.h" #include "ns3/mobility-helper.h" @@ -32,19 +31,18 @@ #include "ns3/internet-stack-helper.h" #include "ns3/ipv4-address-helper.h" #include "ns3/abort.h" -#include "ns3/udp-echo-helper.h" #include "ns3/mobility-model.h" #include "ns3/pcap-file.h" #include "ns3/aodv-helper.h" -#include "ns3/v4ping-helper.h" #include "ns3/nqos-wifi-mac-helper.h" #include "ns3/config.h" #include "ns3/pcap-test.h" #include "ns3/rng-seed-manager.h" +#include "ns3/icmpv4.h" #include using namespace ns3; -using namespace aodv; + //----------------------------------------------------------------------------- // Test suite //----------------------------------------------------------------------------- @@ -56,17 +54,12 @@ public: SetDataDir (NS_TEST_SOURCEDIR); // General RREQ-RREP-RRER test case AddTestCase (new ChainRegressionTest ("aodv-chain-regression-test"), TestCase::QUICK); - /// \internal - /// \bugid{606} test case, should crash if bug is not fixed + // \bugid{606} test case, should crash if bug is not fixed AddTestCase (new ChainRegressionTest ("bug-606-test", Seconds (10), 3, Seconds (1)), TestCase::QUICK); - /// \internal - /// \bugid{772} UDP test case + // \bugid{772} UDP test case AddTestCase (new Bug772ChainTest ("udp-chain-test", "ns3::UdpSocketFactory", Seconds (3), 10), TestCase::QUICK); - /// \internal - /// \bugid{772} TCP test case + // \bugid{772} TCP test case AddTestCase (new Bug772ChainTest ("tcp-chain-test", "ns3::TcpSocketFactory", Seconds (3), 10), TestCase::QUICK); - // Ping loopback test case - AddTestCase (new LoopbackTestCase (), TestCase::QUICK); } } g_aodvRegressionTestSuite; @@ -81,7 +74,8 @@ ChainRegressionTest::ChainRegressionTest (const char * const prefix, Time t, uin m_time (t), m_size (size), m_step (120), - m_arpAliveTimeout (arpAliveTimeout) + m_arpAliveTimeout (arpAliveTimeout), + m_seq (0) { } @@ -90,6 +84,35 @@ ChainRegressionTest::~ChainRegressionTest () delete m_nodes; } +void +ChainRegressionTest::SendPing () +{ + if (Simulator::Now () >= m_time) + { + return; + } + + Ptr p = Create (); + Icmpv4Echo echo; + echo.SetSequenceNumber (m_seq); + m_seq++; + echo.SetIdentifier (0); + + Ptr dataPacket = Create (56); + echo.SetData (dataPacket); + p->AddHeader (echo); + Icmpv4Header header; + header.SetType (Icmpv4Header::ECHO); + header.SetCode (0); + if (Node::ChecksumEnabled ()) + { + header.EnableChecksum (); + } + p->AddHeader (header); + m_socket->Send (p, 0); + Simulator::Schedule (Seconds (1), &ChainRegressionTest::SendPing, this); +} + void ChainRegressionTest::DoRun () { @@ -173,11 +196,14 @@ ChainRegressionTest::CreateDevices () Ipv4InterfaceContainer interfaces = address.Assign (devices); // 3. Setup ping - V4PingHelper ping (interfaces.GetAddress (m_size - 1)); - ping.SetAttribute ("Verbose", BooleanValue (false)); // don't need verbose ping in regression test - ApplicationContainer p = ping.Install (m_nodes->Get (0)); - p.Start (Seconds (0)); - p.Stop (m_time); + m_socket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::Ipv4RawSocketFactory")); + m_socket->SetAttribute ("Protocol", UintegerValue (1)); // icmp + InetSocketAddress src = InetSocketAddress (Ipv4Address::GetAny (), 0); + m_socket->Bind (src); + InetSocketAddress dst = InetSocketAddress (interfaces.GetAddress (m_size - 1), 0); + m_socket->Connect (dst); + + SendPing (); // 4. write PCAP wifiPhy.EnablePcapAll (CreateTempDirFilename (m_prefix)); diff --git a/src/aodv/test/aodv-regression.h b/src/aodv/test/aodv-regression.h index 2871093af..79675d98c 100644 --- a/src/aodv/test/aodv-regression.h +++ b/src/aodv/test/aodv-regression.h @@ -23,6 +23,7 @@ #include "ns3/test.h" #include "ns3/nstime.h" +#include "ns3/socket.h" #include "ns3/node-container.h" using namespace ns3; @@ -177,6 +178,10 @@ private: const double m_step; /// ARP alive timeout const Time m_arpAliveTimeout; + /// Socket + Ptr m_socket; + /// Sequence number + uint16_t m_seq; /// Create test topology void CreateNodes (); @@ -186,6 +191,8 @@ private: void CheckResults (); /// Go void DoRun (); + /// Send one ping + void SendPing (); }; #endif /* AODV_REGRESSION_H */ diff --git a/src/aodv/test/bug-772.cc b/src/aodv/test/bug-772.cc index 978877a72..9966f8fff 100644 --- a/src/aodv/test/bug-772.cc +++ b/src/aodv/test/bug-772.cc @@ -33,17 +33,14 @@ #include "ns3/internet-stack-helper.h" #include "ns3/ipv4-address-helper.h" #include "ns3/abort.h" -#include "ns3/udp-echo-helper.h" #include "ns3/mobility-model.h" #include "ns3/pcap-file.h" #include "ns3/aodv-helper.h" #include "ns3/v4ping-helper.h" #include "ns3/nqos-wifi-mac-helper.h" #include "ns3/config.h" -#include "ns3/on-off-helper.h" #include "ns3/inet-socket-address.h" #include "ns3/data-rate.h" -#include "ns3/packet-sink-helper.h" #include "ns3/pcap-test.h" #include @@ -59,8 +56,8 @@ Bug772ChainTest::Bug772ChainTest (const char * const prefix, const char * const m_proto (proto), m_time (t), m_size (size), - m_step (120) -{ + m_step (120), + m_port (9){ } Bug772ChainTest::~Bug772ChainTest () @@ -68,6 +65,17 @@ Bug772ChainTest::~Bug772ChainTest () delete m_nodes; } +void +Bug772ChainTest::SendData (Ptr socket) +{ + if (Simulator::Now () < m_time) + { + socket->Send (Create (1000)); + Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0.125), + &Bug772ChainTest::SendData, this, socket); + } +} + void Bug772ChainTest::DoRun () { @@ -144,16 +152,17 @@ Bug772ChainTest::CreateDevices () Ipv4InterfaceContainer interfaces = address.Assign (devices); // 3. Setup UDP source and sink - uint16_t port = 9; // Discard port (RFC 863) - OnOffHelper onoff (m_proto, Address (InetSocketAddress (interfaces.GetAddress (m_size-1), port))); - onoff.SetConstantRate (DataRate (64000)); - onoff.SetAttribute ("PacketSize", UintegerValue (1000)); - ApplicationContainer app = onoff.Install (m_nodes->Get (0)); - app.Start (Seconds (1.0)); - app.Stop (m_time); - PacketSinkHelper sink (m_proto, Address (InetSocketAddress (Ipv4Address::GetAny (), port))); - app = sink.Install (m_nodes->Get (m_size - 1)); - app.Start (Seconds (0.0)); + m_sendSocket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName (m_proto)); + m_sendSocket->Bind (); + m_sendSocket->Connect (InetSocketAddress (interfaces.GetAddress (m_size-1), m_port)); + m_sendSocket->SetAllowBroadcast (true); + Simulator::ScheduleWithContext (m_sendSocket->GetNode ()->GetId (), Seconds (1.0), + &Bug772ChainTest::SendData, this, m_sendSocket); + + m_recvSocket = Socket::CreateSocket (m_nodes->Get (m_size - 1), TypeId::LookupByName (m_proto)); + m_recvSocket->Bind (InetSocketAddress (Ipv4Address::GetAny (), m_port)); + m_recvSocket->Listen (); + m_recvSocket->ShutdownSend (); // 4. write PCAP on the first and last nodes only wifiPhy.EnablePcap (CreateTempDirFilename (m_prefix), devices.Get (0)); diff --git a/src/aodv/test/bug-772.h b/src/aodv/test/bug-772.h index 1ca689705..d13940da4 100644 --- a/src/aodv/test/bug-772.h +++ b/src/aodv/test/bug-772.h @@ -24,6 +24,7 @@ #include "ns3/test.h" #include "ns3/nstime.h" #include "ns3/node-container.h" +#include "ns3/socket.h" using namespace ns3; @@ -62,6 +63,8 @@ private: const uint32_t m_size; /// Chain step, meters const double m_step; + /// port number + const uint16_t m_port; /// Create test topology void CreateNodes (); @@ -71,6 +74,17 @@ private: void CheckResults (); /// Go void DoRun (); + + /// Receiving socket + Ptr m_recvSocket; + /// Transmitting socket + Ptr m_sendSocket; + + /** + * Send data + * \param socket the sending socket + */ + void SendData (Ptr socket); }; #endif /* BUG_772_H */ diff --git a/src/aodv/test/loopback.cc b/src/aodv/test/loopback.cc index 5a8e3c5ff..ebdd99710 100644 --- a/src/aodv/test/loopback.cc +++ b/src/aodv/test/loopback.cc @@ -18,8 +18,10 @@ * Authors: Pavel Boyko */ -#include "loopback.h" +#include "ns3/test.h" #include "ns3/simulator.h" +#include "ns3/socket-factory.h" +#include "ns3/udp-socket-factory.h" #include "ns3/mobility-helper.h" #include "ns3/double.h" #include "ns3/uinteger.h" @@ -45,12 +47,66 @@ namespace ns3 namespace aodv { -static uint32_t g_count (0); - -static void -PingRtt (std::string context, Time rtt) +/** + * \ingroup aodv + * + * \brief AODV loopback UDP echo test case + */ +class LoopbackTestCase : public TestCase { - g_count++; + uint32_t m_count; //!< number of packet received; + Ptr m_txSocket; + Ptr m_echoSocket; + Ptr m_rxSocket; + uint16_t m_echoSendPort; + uint16_t m_echoReplyPort; + + void SendData (Ptr socket); + void ReceivePkt (Ptr socket); + void EchoData (Ptr socket); + +public: + LoopbackTestCase (); + void DoRun (); +}; + +LoopbackTestCase::LoopbackTestCase () : + TestCase ("UDP Echo 127.0.0.1 test"), m_count (0) +{ + m_echoSendPort = 1233; + m_echoReplyPort = 1234; +} + +void LoopbackTestCase::ReceivePkt (Ptr socket) +{ + Ptr receivedPacket = socket->Recv (std::numeric_limits::max (), 0); + + m_count ++; +} + +void +LoopbackTestCase::EchoData (Ptr socket) +{ + Address from; + Ptr receivedPacket = socket->RecvFrom (std::numeric_limits::max (), 0, from); + + Ipv4Address src = InetSocketAddress::ConvertFrom (from).GetIpv4 (); + Address to = InetSocketAddress (src, m_echoReplyPort); + + receivedPacket->RemoveAllPacketTags (); + receivedPacket->RemoveAllByteTags (); + + socket->SendTo (receivedPacket, 0, to); +} + +void +LoopbackTestCase::SendData (Ptr socket) +{ + Address realTo = InetSocketAddress (Ipv4Address::GetLoopback (), m_echoSendPort); + socket->SendTo (Create (123), 0, realTo); + + Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (1.0), + &LoopbackTestCase::SendData, this, socket); } void @@ -80,23 +136,49 @@ LoopbackTestCase::DoRun () address.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer interfaces = address.Assign (devices); - // Setup ping - Ptr ping = CreateObject (); - ping->SetAttribute ("Remote", Ipv4AddressValue (Ipv4Address::GetLoopback ())); - nodes.Get (0)->AddApplication (ping); - ping->SetStartTime (Seconds (0)); - ping->SetStopTime (Seconds (4)); - Names::Add ("ping", ping); - Config::Connect ("/Names/ping/Rtt", MakeCallback (&PingRtt)); + // Setup echos + Ptr socketFactory = nodes.Get (0)->GetObject (); + m_rxSocket = socketFactory->CreateSocket (); + m_rxSocket->Bind (InetSocketAddress (Ipv4Address::GetLoopback (), m_echoReplyPort)); + m_rxSocket->SetRecvCallback (MakeCallback (&LoopbackTestCase::ReceivePkt, this)); + + m_echoSocket = socketFactory->CreateSocket (); + m_echoSocket->Bind (InetSocketAddress (Ipv4Address::GetLoopback (), m_echoSendPort)); + m_echoSocket->SetRecvCallback (MakeCallback (&LoopbackTestCase::EchoData, this)); + + m_txSocket = socketFactory->CreateSocket (); + + Simulator::ScheduleWithContext (m_txSocket->GetNode ()->GetId (), Seconds (1.0), + &LoopbackTestCase::SendData, this, m_txSocket); // Run Simulator::Stop (Seconds (5)); Simulator::Run (); + + m_txSocket->Close (); + m_echoSocket->Close (); + m_rxSocket->Close (); + Simulator::Destroy (); // Check that 4 packets delivered - NS_TEST_ASSERT_MSG_EQ (g_count, 4, "Exactly 4 ping replies must be delivered."); + NS_TEST_ASSERT_MSG_EQ (m_count, 4, "Exactly 4 echo replies must be delivered."); } +//----------------------------------------------------------------------------- +// Test suite +//----------------------------------------------------------------------------- +class AodvLoopbackTestSuite : public TestSuite +{ +public: + AodvLoopbackTestSuite () : TestSuite ("routing-aodv-loopback", SYSTEM) + { + SetDataDir (NS_TEST_SOURCEDIR); + // UDP Echo loopback test case + AddTestCase (new LoopbackTestCase (), TestCase::QUICK); + } +} g_aodvLoopbackTestSuite; + + } } diff --git a/src/aodv/test/loopback.h b/src/aodv/test/loopback.h deleted file mode 100644 index bb4c5397a..000000000 --- a/src/aodv/test/loopback.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ -/* - * Copyright (c) 2010 IITP RAS - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation; - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Authors: Pavel Boyko - */ - -#ifndef AODV_LOOPBACK_H -#define AODV_LOOPBACK_H -#include "ns3/test.h" -#include - -namespace ns3 -{ -namespace aodv -{ -/** - * \ingroup aodv - * - * \brief AODV ping 127.0.0.1 test case - */ -struct LoopbackTestCase : public TestCase -{ - LoopbackTestCase () : TestCase ("Ping 127.0.0.1 test") {} - /// Run test - void DoRun (); -}; - -} -} - -#endif /* AODV_LOOPBACK_H */ diff --git a/src/aodv/test/tcp-chain-test-0-0.pcap b/src/aodv/test/tcp-chain-test-0-0.pcap index 57b7746a6f7c999a5bad49ddb3264f06f76b20c8..3c96d464f2b1f4db89e43f0ebe71ade7aa9c1ea2 100644 GIT binary patch delta 3866 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 R$2iAEE&4VpS|oYM{{a(8`~v_0 diff --git a/src/aodv/test/tcp-chain-test-9-0.pcap b/src/aodv/test/tcp-chain-test-9-0.pcap index 64cd64c84407c6c0bd6193fac3e3b4900236be00..982d1cf8e07569735c40fd3c0be35ab4f48dad6c 100644 GIT binary patch delta 3082 zcmb7G4RBOf6@K^LxBIf2U3b$!vdd=wVDhusFcK%5goKa>hBk#1`DungQW9fRQ$jmX zTN?R^6sOigz=W@*p+#DzIE=v5#KkDclpn_ts1u6T7J(t5<2cod1nh`2((1YQts&sp z+BdU%ch5cd`_8%N-0!}RF0ozjv!0EpWs{kP4ie#IB=LE2oQydo zw|sW(7=!uJOH6AbQxoNLEamr?aLAAQ4LqB!#HJkq0=a|iw~r8a+c}m zIBwVsMt=k3lVJqJqcmPy5@sgSoe8%X)imWz9t>wIf{fv6MJ`qvF6?p^-gC!1`Fv8N z2z|90zBN0{jw3rgVHY2%|H;X;_jc!PMntyiI+@7dZ*uCo0DA$$ z)lp7Sce@j|HWk4g3Ge+Up&0>(o+-wP%~s*2KGkVVNSS1_M)4I}uE?Gsq&FKx@0=)B zhCC?q27_H2Ww2>feEk4@h($g!if>O8G72$VE-;UU@#`!Hk~~+uF`aPqfY?zXu-X~M zGQSH)ypc~qa$mPrJok}MMH~uvm zGJQPFkAC+=cGs#8$V;v&)pc2a6y|wQpXHA_i#K{VJSo#sXnw&mJb8Njn@P+R1|x=@g>??%K=kXa#d`l3zl z5*^vba6C03n*MB4Wmy$)te)JNf<6Db@ zPz~%Q9!$>*@^#x03Hwps;J3;8EWo)?l#by*Ufi1UiN@a~4cH_(WF@hUm z{MqxEHl+#OB`yrc;>pMIFIp6T%&kFpg$GNDf_!ZsF6a5MD$m5)gbNpnA}Nz#Z#Yz4 z?=n9z=unK^haHOXuVrqqFBTH|FcZ7TDDzqoGr5;zMR7@TB-YN^+b~Mv{F}RRtH_6K zMIkZtLb__PzDgJRN+PK#@$}Ag1>XE}y5hcT`q=Jt$;qd2tWQYjOI8Wbl3mgk6q_V< z*UCzhuNHrulhACfi1W_9C@Cow?hS5Lt_8@fj0ZdS%BGixz-Xk;V)@TH1Rr)$KJ&ut zv-}=^&aFcI?q;`)X}jsh4=M|Z_##uq>O*hYL)bmr4YwIf4ppYg+h3!juEOM_8V=1V zJ3&xX+ASvft7b|;9Ia~Q zuW=f((J?b7esAL#C=2k#4vbVsP;_5evdqlq;%g4FR|UiXjZzWL++UQvre7v4HzBQ_ zJ`c!$n#S>fGiY%7^-MZP@!WaA|KUd-wO1<{{!g%nhL2_2x=y1?TG08_F0>MXs!x>Ea#O&&sPI#u9(~s)_YJ4!PsXHX7uMIuZTHdpn&Xb_QM=H@ zq&5$N4MG0oQOsE6!_dNzm~u&J71CN^{*+nb2AHjzHO(w;~*Ju)tv3lGan zV0uTKuO7lsn-48*A(8c>5-WO1IW{&S?4&uekt2I7O``kx-jyYUMhQ(L+qoq)iT14GK6+4s1+dFw?54%07m1thsbSJzM?K1{8dRM)JzjXM})e#am y)+_DuM#f=Dcf98Gjq?=)q)9TSw=7NaP8;XXbuB8n*^K0|_N(d)u#2Qo{(l42Mks&) literal 28276 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 delta 851 zcmaKqUq}>j5XXOimR6fvC&b<7)xPQj71o?j~`Sy*|ri&F6@gJsJHRYHSLJWB?r1~*~Kq&bIE-1Ty^xc$|~qtF>Yu*-3`%)$M52!>PK@H+0>=eWA({#R#uj?~oX zaMYE7b&9IUhp&?I#MrxJQ*BOD`;()+w3KXDCO!zT!#eLpHPxfQsK>yVOI2XSXX0Hq zL21yyB@aPc*hIrmFqLaybCBR?o{5uTf<&Q#>$wC&#U{q`304jpc%_iQUuNP`F+p3@ zz|2yDkxCPr%cKGeO;n=Vz&p`Rqa+^|_yT6vkf?;)54AA`F1W*jaqNoi zQRLY*S`A%W-o5}4CgDY0k<>S~)<)C#j?Iz~ju)klf0utYz!~={jk`cTTa)l0uERCU znRQlZc1`}{z69Mu{}0gW3$fw^X+5(c;c{OVi|6_8J}6=%FK z(2#-ZN$UPqqk-l11dB~3-fSSqYc+7bk>GT@i8;*#;~fT`Y9&~`XyW5`f@3`fe(50S X=`*psn_zLkz|J0m-Ge61_ete9wJGG@ diff --git a/src/aodv/test/udp-chain-test-9-0.pcap b/src/aodv/test/udp-chain-test-9-0.pcap index 823290d5b595cd7d20e6cc3a8158b256ade1fcb4..3b0e4144c6cec351af3be6a64c36ba16f773a3c0 100644 GIT binary patch delta 437 zcmXAlKS*0q6vpql=Tcsv@)EHx<-Oty+L%A(g%U-Fgys#3Swf^}J9!bIOaDOELYJ(qeIH6G)1e&;*q<9wWM1KJx9RRPbw3TlE6 zaryxP#=Z&aLk+)htxFGA_65C=KBO9z+q5ln_>zU6Jb2O>*yx>%Q4-TQ^<7Xxc{tG( zw2VH4SB6iRf)<64r`KrHE11MLe*_(34WqN`^`#vc*t{mtq2-(B%29Za8@@pwvn~KN zvuSf`IZE22bS&@CrWKmSAxF{wo7!{|3{Ml5c@9t1eg+y|fj^8A9i zE|YY>pzxoKgUF8x9J$X;E8}rE_d}?tZH<|3k@d$n)Ifh*49$ZX4s<%L&F2!sVo95c kkfBr2W@DD2JgejHVRsjW5SEw|N(tNaEU9Rrq$sMom(OH{VE_OC delta 409 zcmXBQF-U?z6bJC{?j5C~nW2(?;3q0+qEZbCDfvkbLI@F3Q#V#vvqIF`ZjVTGacB#| zx~au*36Un(APO3SwwfY{o;4i&-h=<$pX;^Qu)(?|#!HWlfDi8ylWZD~p#bMQ9M_n^ zg1FC;a7$C0m0@R><2%!#y2sJV4Ytt8&tiek!yzqRJUV!4|1lFUc@kb}atYnqsdKHO zX<7wcNgp18vr)F;A_VQLwA2`#Z{*mAGQ`jR642d(aT03VfPIUh4un_02@UiJx*eu^ zws-|rT~bvXgeQ+w0~cY#FICPoq6j1IXEG5#5B(oT}w