(* Content-type: application/mathematica *) (*** Wolfram Notebook File ***) (* http://www.wolfram.com/nb *) (* CreatedBy='Mathematica 6.0' *) (*CacheID: 234*) (* Internal cache information: NotebookFileLineBreakTest NotebookFileLineBreakTest NotebookDataPosition[ 145, 7] NotebookDataLength[ 247525, 4954] NotebookOptionsPosition[ 240419, 4727] NotebookOutlinePosition[ 242649, 4813] CellTagsIndexPosition[ 242201, 4793] WindowFrame->Normal ContainsDynamic->False*) (* Beginning of Notebook Content *) Notebook[{ Cell[TextData[{ Cell[GraphicsData["CompressedBitmap", "\<\ eJylvQvQbedZ37fOXmvv73IuOkeybEuWbNmSZbDjJJWNCZFTWtuEGcQtbigw wKSUFJxM0gQCYaYz7WQmnRCgtDPNpBQ6MBNoibk5NbgQByhjRGRbRsFGdoSR bar5/HE4xVQ+EKN6TjW77/95nt/zPmvt/R3JZM3s77L32mu9633/73O/fMU3 f+fb/ou//c3f+Te+5Zvv+dLv+Oa/+7a/8S1/756//He+o701nhuG4Yn2+mf3 DFP7e9v+LD+Gw+2zzz67rcfpycn2dz760e2//chHtn/4h3+40nvDwfbGjRvb k/aRPn7qqae2V69e3b7nV39Vpwx+zrS9du2afabX9aefXtvb4/YP/uAPtr/1 oQ9tP/Hxj7f/9N7h9vr16/pq3lGH7qg7t/enuOJnP/vZ7bV2J13xaa54uP3j P/5j/WtX0Ld1mk7RANvzrPTPGHfX8/2bxx7b/vrDD7eBtosNl22gH33io9uP Pfnk9n2PPJIPpO//yi//so1E19XI9f+HH3/cPmvX2D76/vev9OGwsdN0az2c LnPqt/fBv9a+oUOj1Qj0sabsXT/38zaqNh/2vLrqbz/xRJ73/ve+X3fZnp6e 2neY9sc+8JjdRt/5yOMfyXnTdzSMqzFROvS3nk6Tp+/omvqe3tP99P7/9bu/ a7/1fszg4I92ZPd89y++28aq85klzYgOraUv+wvtu3oWzvmTP/kTWxm99853 vMOuo6nSOLnGx5/8uD0z5+u3xqNDc9PG5Jd/md1eX9eQNFwd+ooWkf+FTi2S hito6dAU6n2mWo+u3xqupk7fB4bPtvM0fN1L5+tebQqHczaGoT0k8GBR9GC2 5u1/DR6U6uHYUvqt9/hfd9MImJw2Okfp8fazzzxj66BL6+HATQDf/s85GW0k er72TA2H/T2Npp0e763tPX1dU6tLtc8HrsGz9/eu5FIKavpcQ9KT/tK7321/ 81Q6h3nWzOipde825HatNrIGIb2vddO8C/Yah8agDaVraZwrjbBtaGDAoevp f0HGHrt9abiUiNUy6yPNkJDNgmj5TmMaNMRfeedPbX/sH/5X0/a7v/5NbZK/ 4Uvu3P73b/ta/bf9oe/4m9v3/fK7bCRCSZA77eWVHnd4jU2CMHoSlECToK0u yqHBaTT6TDBgknWOfv/kT/yEjUR/s/f1kBqhRq/vaFJOY4H0W3tCw9DE6fp6 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 5/5/cGprkQ==\ \>"], "Graphics", CellFrameMargins->0, ImageSize->{66, 50}, ImageMargins->{{0, 0}, {0, 12}}], " ", StyleBox["IMS\[ThinSpace]2008 ", FontFamily->"Arial", FontSize->32, FontWeight->"Bold", FontColor->RGBColor[0.31, 0.33, 0.37]], StyleBox["June\[ThinSpace]20-24th", FontFamily->"Arial", FontSize->32, FontWeight->"Bold", FontColor->RGBColor[1, 0.4, 0.15]], StyleBox[" International Mathematica Symposium - Maastricht, The \ Netherlands", FontFamily->"Arial"] }], "IMS2008Banner"], Cell[GraphicsData["CompressedBitmap", "\<\ eJzzTSzJSM1NLMlMTlRwL0osyMhMLlZwyy8CCjEzMjAwgDCzAgOI/R/IhBKM /z9+/AiU/H/r1i0QdeTIEZBaAIB3GBA=\ \>"], "IMS2008Banner", ImageSize->{2048, 3}], Cell[GraphicsData["CompressedBitmap", "\<\ eJzzTSzJSM1NLMlMTlRwL0osyMhMLlZwyy8CCjEzMjAwgDCbAgOI/R/IhBKM /52cnICS/wMDA0HUypUrQdTt27dB1MePH0EUEIAMAAB+UB97\ \>"], "IMS2008Banner", ImageSize->{2048, 6}], Cell[TextData[{ "Integrating Networks with ", StyleBox["Mathematica", FontSlant->"Italic"] }], "IMS2008Title", CellChangeTimes->{{3.416129044174181*^9, 3.416129060225449*^9}}], Cell[TextData[{ "Rudolf J. ", Cell[BoxData[ FormBox["Strijkers", TraditionalForm]], FormatType->"TraditionalForm"] }], "Author", CellChangeTimes->{{3.416129066153743*^9, 3.416129069033244*^9}, { 3.4172904124710503`*^9, 3.4172904326850986`*^9}, {3.417290551149828*^9, 3.417290552932893*^9}}], Cell[TextData[{ "Robert J. ", Cell[BoxData[ FormBox["Meijer", TraditionalForm]], FormatType->"TraditionalForm"] }], "SecondAuthor", CellChangeTimes->{{3.4161290716171913`*^9, 3.416129074041007*^9}, { 3.417290445581897*^9, 3.417290448703456*^9}, {3.417290554322112*^9, 3.417290556965973*^9}}], Cell["\<\ University of Amsterdam, Amsterdam, The Netherlands TNO Informatie- en Communicatietechnologie, Delft, The Netherlands strijkers@uva.nl, robert.meijer@tno.nl\ \>", "Address", CellChangeTimes->{{3.4161290798333273`*^9, 3.41612915471878*^9}, { 3.4172904518571167`*^9, 3.417290548041507*^9}}], Cell["\<\ We have developed a concept that considers network behavior as a collection \ of software objects, which can be used or modified in computer programs. The \ interfaces of these software objects are exposed as web services and enable \ applications to analyze and manipulate networks, e.g. to find articulation \ vertices or configure non-default routes. This article describes the software \ that allows Mathematica to optimize networks and applications in a continuous \ cycle of monitoring, analysis and adaptation. Here, the full collection of \ Mathematica algorithms becomes available to calculate the next optimal \ configuration. These algorithms use parameters such as energy consumption, \ application performance or bandwidth consumption as input. As a result, \ Mathematica can automatically adapt the network to maintain or provide (sub-) \ optimal or \[OpenCurlyQuote]better-than-best-effort\[CloseCurlyQuote] \ services. Furthermore, integration of networks with Mathematica allows a \ multi-scale optimization approach, where local behavior is adapted to support \ global goals. The presented work makes extensive use of Mathematica\ \[CloseCurlyQuote]s Dynamics and Combinatorica Package, but also of web \ services and J/Link.\ \>", "Abstract", CellChangeTimes->{{3.416668851941278*^9, 3.416668858370822*^9}, { 3.417141712482777*^9, 3.417141719253257*^9}, {3.417369836530303*^9, 3.417369837943416*^9}, {3.417418680085932*^9, 3.417418682250203*^9}, { 3.41742230877872*^9, 3.417422308984644*^9}, {3.4174223487936783`*^9, 3.417422404110145*^9}}], Cell["Introduction", "SectionFirst"], Cell["\<\ Next-generation networks open up service interfaces of individual network \ elements to allow distributed and networked applications more control over \ network behavior. The foremost reason to allow more control is that the \ resource consumption of these applications should be in balance with the \ resources networks can provide. Any imbalance directly impacts network \ performance and perceived quality of experience (QoE). Typical examples that \ rely on good QoE include VoIP and video streaming, but also communication \ intensive supercomputing tasks. Therefore, networks need to orchestrate \ traffic to achieve 'better than best-effort' services, i.e. optimize resource \ utilization to meet robustness or efficiency requirements.\ \>", "Text", CellChangeTimes->{ 3.4161292588900747`*^9, 3.416567003447999*^9, {3.4173698576714497`*^9, 3.4173698612864637`*^9}, {3.4174224482256927`*^9, 3.417422484155953*^9}}], Cell["\<\ The need to have more control over network behavior can also be found in \ recent developments in photonic and hybrid networks [1]. Photonic switches \ connect ports to form light paths and have no knowledge of traffic flows. One \ of the main issues is how to orchestrate the configuration of photonic paths \ according to traffic flows that enter the network. This issue motivates \ research in multi-scale optimization, where technologies at different layers \ in the OSI reference model have to cooperate to fully utilize the network \ infrastructure.\ \>", "Text", CellChangeTimes->{ 3.416129282222456*^9, 3.417369869651868*^9, {3.4174224905919037`*^9, 3.4174225556500063`*^9}}], Cell["\<\ Our research focuses on the development of architectures and models that \ facilitate multi-scale adaptation and \[OpenCurlyQuote]better than \ best-effort\[CloseCurlyQuote] services. In [2], we presented User \ Programmable Virtualized Networks (UPVN), an architectural framework that \ enables interworking between applications and networks. In this framework, \ application-specific network services can be implemented in the form of \ component-based software objects, potentially modifying or adding behavior at \ different layers of the OSI reference model. These objects are typically \ accessible through web service interfaces and can be included as part of \ distributed and networked programs. Using these objects, such programs can \ orchestrate network resources to meet their needs. Furthermore, the framework \ allows not only applications to orchestrate network resources, but also \ enables the network to run self-adaptation programs.\ \>", "Text", CellChangeTimes->{ 3.416129295065919*^9, 3.417369884187202*^9, {3.4174225723984957`*^9, 3.4174226083131933`*^9}}], Cell["\<\ Mathematica\[CloseCurlyQuote]s environment is well suited for solving the, \ often combinatorial, problems in networks. In cases where combinatorial \ solutions are unfeasible or not possible due to the unpredictable nature of \ the network, trial and error algorithms can be used. However, trial and error \ algorithms require middleware support to maintain front-end interactivity \ with the Mathematica kernel. By providing this middleware and integrating it \ with Mathematica and UPVNs, Mathematica programs can continuously adapt \ network behavior.\ \>", "Text", CellChangeTimes->{{3.4161292992229757`*^9, 3.416129338617447*^9}, 3.416567059522029*^9, 3.41714175216721*^9, 3.417369892889009*^9}], Cell["\<\ This article is organized in three parts. The first part describes the use of \ web services to facilitate the integration between network services and \ applications in current state-of-the-art networks and utility computing \ environments. It also presents the concepts and implementation of UPVN and \ describes the software architecture for integration with Mathematica. The \ second part demonstrates experimental results by example and the last part \ reflects on the results and provides directions for future work.\ \>", "Text", CellChangeTimes->{{3.416567064613595*^9, 3.4165670770595093`*^9}, 3.417141762367036*^9, 3.4173699026246862`*^9, {3.417422624698346*^9, 3.417422626592174*^9}}], Cell[CellGroupData[{ Cell["\<\ Web Services in Telecommunications and Virtual Operating Systems\ \>", "Section", CellChangeTimes->{{3.416241655215537*^9, 3.416241658271942*^9}, 3.416567092028542*^9}], Cell["\<\ Service Oriented Architectures (SOA) and web services as its implementation \ technology is becoming increasingly common in networks [3]. The devices \ within the network expose their functions as web services and by combining \ these; new, application-specific services can be composed. Web services \ enable high flexibility in network infrastructures and give the operator the \ ability to adapt services when needed. The usefulness of this approach can be \ observed in the many web service based deployments of large-scale hybrid \ networks that offer users the ability to control parts of the infrastructure \ [4, 5]. In these hybrid network deployments, however, the network functions \ remain static. Their primary service is to facilitate circuits between \ applications or computing clusters.\ \>", "Text", CellChangeTimes->{{3.416567098794324*^9, 3.416567107700204*^9}, 3.417141779302238*^9, 3.417369916265821*^9}], Cell["\<\ Web services are also becoming available in utility computing environments to \ orchestrate resources, the most notable examples are Xen [6] and VMware [7]. \ VMware allows monitoring and control of the whole spectrum of virtual and \ physical resources through web services. Consequently, the whole utility \ computing environment can be optimized by specialized applications such as \ Mathematica.\ \>", "Text", CellChangeTimes->{ 3.417141811192978*^9, 3.417369927155754*^9, {3.41742264377246*^9, 3.41742267563912*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["Software Framework", "Section", CellChangeTimes->{{3.416567140211376*^9, 3.4165671437620277`*^9}}], Cell["\<\ The UPVN model (Figure 1) describes architectural principles for programmable \ network services. UPVNs enable applications to upload code to network \ elements (NE) in the form of software objects called application components \ (AC). ACs allow implementation of not foreseen and application-specific \ behavior and allow computer programs to access their service interfaces \ through network components (NC). NCs act as proxies that provide redirection, \ virtualization or composition of multiple AC service interfaces. The manner \ in which NCs are exposed to applications such as Mathematica is \ application-specific, and technology choices and AC to NC interfacing depend \ on the network\[CloseCurlyQuote]s application domain. For example, when the \ network is under full control of a single owner, it is not necessary to \ support multi-user mechanisms or a complex security infrastructure. NCs can \ offer AC services through a synchronous or asynchronous interface. With the \ synchronous interface, applications interact with UPVNs by instantiating the \ appropriate NCs that act as remote procedure call proxies. In the \ asynchronous interface, the application, network or middleware implements an \ event mechanism that continuously polls ACs and fires events in case of state \ changes.\ \>", "Text", CellChangeTimes->{{3.416660071145508*^9, 3.41666007637215*^9}, 3.416668720608021*^9, 3.416816265556966*^9, 3.417141825960313*^9, 3.4173699397026243`*^9, 3.417424434012149*^9}], Cell[GraphicsData["PDF", "\<\ 9E14ARda;S<:9LCUl^G[Yo>Pd;a>;a n?=84Nd994BTWR]DfZ90XECRkoN=MkgIQ;C=9P/i9;4gWWWclNJI9kZR9c9h>Fo8 fT2o_]9WNZ2CClmL8V>m7_:FFl=C1f3KR/g[AN3be^DL`]`c?^_MWEHS>bj8=K/aRmG/el641Ok^74UWO>^0:M8beaCfMO>CF 8=b;FgYgNDk_JG57ih^A`IZ9aQX^a`9dD;`h?RL:[2T99NM8`bCPCY93J;e;fB?D K3?i50GOYb:gS?:Pc6gB8WV57;]oAGijmRoTYV3=bJ;`dZP2Yh96OCENA34k 6heR[>FEfF6i;ODc:MdFT2eWaO`J/]VFiM?7anF?VbnoOoalf0ed1aUeYVfGHQN< ?@ZmQekCGJ4WBAHAVI[]TVaWFj_Emb[I1i@iTR:Qbg;T_/YMlFm2OF^ZH`0^Y3[J Z>DMTXnU_2Fa[Tl5;=[G39NfYSXZ`nDH]fGllYoE3MidOHYY5/3N1aoW0YcT;ndL BcOk_0g`FS]c=QQ;;n2h>f935lf^7:GSP7EX85TEdfR53A;ZVnEfNPj^ka?@e[BH6Qh[Sn06jE^C0Y6EF`@ EcLinQk^AjM1O7AlkQZNKWJIW;C6KHSJa;FWln5l EYGP8Sf5f]EQ?FRLiZZZXQj8@e; MJDR:Z9C3@h^M^jnb^0:aLg0W0eAnYN[Z=2VE^I7=dLVEQK@YUKVA_HVX: =B0`86mRJPXi=S0:IFiTKf9Z2S8P<21_HVX:?3`P;eAiL6DP;e1QIfDP;e1QLVE^ M20c830PDR0_DVEcKgEbHfEc83HP<21B82m3KfidIFidLb0d830PDR0_CFETJF52 KgPPFc0P<20d=C0PB0` 86mRJPXl?20_E7U`IB0_AGQdAe=dHGAU82m1@E1<>T5187AbMFDP?Sh:IFiTKf9Z 2S4`830PKf9Z2S`l82mDNG1U82m5N7A7DgAQM6DP;f=Q830P?Sh:IFiTKf9Z2S4a 830PKf9Z2S`l82mDNG1U82m5N7A7DgAQM6DP;f=Q834P?Sh:IFiTKf9Z2S4b830P Kf9Z2S`l82mDNG1U82m5N7A7DgAQM6DP;d51D4`j@D4PIV5/LfDP?Sh:IFiTKf9Z 2S4c830PKf9Z2S`l82m83=1;46dIL8aM3195@V2e82doD[DkIUeD`9HYemMidLIjNIgBe58XCXV7F<;UI4 QhQ>hJ53YcY419UeRJ2SAA05GR:foc^C^f=D_S0c_gVNoo]l_L<0EHmBSV=5=63: c[_9gYQfNWAY==TQ=kQ3bDkb;O;FK8S7@i`FWP5D]E>C@_J^?;m@=/NH=>;RVg<0akL0gKG EFce=L3>4F3aD@JoH^3WWaE2k30>Hi/0OZ_03Lo0_/O0]/O0hUZ H:PETL]/=kSbhR;W0WCVW6WGc4kT]FIM?j9el6R5eVLKC@eJb[8dgnEY[_24FaCY 9TaI1LkIGm]hS`YkN91?mQNi9;c^gjcSZ9SN@kfO63UP9W_6`XhL/ZfhS`GZHWDf>?aTfC6Ee@W7i?cT3cW5@MUC=mn;WDR@JjU ?CVIjiNJGMcK?SB[5Pc4igagoc6;BAUgWgDg7D/oi]WKI5W68D50A6GY<:TaJYEo@J/;3i5nE5Q;UGAHE_ESQWQEocgTD^5_6?hEH77<= i@RJoTkoXRo[2oYMoO=lKJ6nhYUcci[6Zf]O6EMVU]G8^46=<[j/:HQ_/=X>NReT JIgR5OCTUOF=hNXbmWa]fJ?97>9ZO3GDY@QUJ/@hhlV^IOM5//DghNMKboJ_jE7k O?I9CBGG/[YhIRWjO3IL3F_o/j]Pd[:[l>B=T2hlJj7^E@nZOFZ;fPY=?JJfZfeZ 5mn>ZP?U7L>LUHT;[=]UmBWfH6>Jg/Y9EfJ;h=o2;hKoYEiQ2mLd=?T?CKRiS6T9 ga7L=W27U?o3Gk<33Mh:IFiTLgAbIF5]2VE^I6mRJPXa=20`86mRJPXg>C8:IFiT Kf9Z2SLP<21_HVX:Fb0_BD=3@V5cIF@PW3W_QAPA>JRC90X]F]WB CQ]H4RP_0oXFGKoFNHlA9KJg]KH/?_f1ddUTQ8QXK1/8RBFF=e2n4NFl]YE[Kab_:@M@OQSULB]F;FXa 5WYcDGh=iNbE;CNfbilXae4nSK9aKL_:ePmmCD^8LY95^GeEaeXjbU=A;TEiH_^J e_KlejLMA7T]TOeo@6>ha4dTP?a_kIEoXo`WPPZRmZd: RhUKTM[8S[W6OdiU?jD3T8LXmR7P8i4?;Xem9>Y5c_n:1]4Q8=Y5Ck6U m1@MY6OI05[]YWeHnnlXSJ[YHKZ5OT0K8HeiX=a5/g0YX?n0YLMjZHPN`KXNXB?P _I9^XofDbSbaSfTMKI1NAJ/=i:ALZZ9jFTGg/2]Rem5l>RkOCVEd1Ee;kJ`ceQRk =gIOk57j6NfCOQLkQmETd29LAf:O:Gn<_DDSdN:7m20MIoMIWjH@A^T4ihmY3FfC VV@FFa;k6S?8XA/`1iVVdA7Fah?X_IDnI1ifRc@I_O`d5XTM1YNGVZR=]]5n=XI= hCW:o=Rdf15:aAPgX]L7ZHOfhX[B[nU=iU06HXo61RRM2^Tb[:NGO/ojY<5cj`L[ 8CL5DQY1iJQIAOm3cmlHnhUFlPBoWYj@fJKGdJgTB[]Ub QgbkLZNbFOeX/77`l>3o3WhA:hkMBC=Q3n/anaoBCk2bOGBDoXC[>;g756IW;U`6 bf5cfO/7>l/9UlXcN@k?aNGWJoP=o0OlHGhD ec7n:Om:BY=bYJ0dAZZ@`]8Zc6ZS]1GGdm:kLXIlE8i1c/G:oLYfIIObY?:/mJb?;b=clmEg3^WD4Jg3Ahof3?H6o/GDZ13SoIO/0:Cd1S^5>C^ieicc9G`_TWlPObQlZliFGU0mDVkYB_E>=ZWoCaVXC]GY]Y]JTKM7fJZmI VV6MQnQYnUEl^lMCMT9J;mE8Cm>m_4A>ikoW_hLm;j35dS@>BnFkf2In:n_UNLZ= jP@nPDfW0CT0FCo7]on1F^Y=FamKCCDZSo0YK@Q:KBoWb2GRgFjAR>@Oi >WREnO1YNk6kml@eFXL^:U5A?6Uhl[6e=JDSajE=4U 8`^31B>63`_TioUcL`aOMYHg:oi5li@W3=dPI?YAPEE S2`dJ_a6i4ReghRbNCSVSV<>QKk5kOH]cZB=YgCW[nFDCWRIgfVKVR1k2HOB1]Sbo][V[5T?O3DgEcCH`6]l@KXb` 3ASB42/AZhZ_[mEO8bS=bhb8eCo9gmJe[1VZbNR:d:bKLWXb2kKKUC24>9cOAUXQm7RMRIW/0Z^K MD6bCDl7PT68`D5`TBdbM0YiSSA ;8lIFGQmU?_mkKZ13>:SN/Rf9Cbn2>;?bA4:gQ`=dD8D8Ydc6n=UPaIVmU2X:1R> l6IAdgNn9VF>Z>TlGg>QNKO?^l22@ZCC@nkLR4 RlXGCLoA9MDe`>G`^XIiGEffRnYPJ_5IGSJD`N:YXC77V1bQ>MRInOQ7HggS18@c 8b6833D=f4DV>I`iE;b8XDAPoHIdS2f_Ql@fcIkG^4o7OLbVQ/HN c_STiTUQXAHn^J5aB2bVcXCY@hLhHN2^AH2;6a=9g7?T^7?LnDPH3[e_3:W_Vi12 IlV@nl15714k:F7LEfSTHT_fccgR7TbejWDaFDdj6``j7>/CY4ZYQY TCi:Gf9Y/cK[VjB]nP_:LfZO?Z3K;DXHhG2mgVJ?j7mgo=giMiMEM/Q>fBGQB55T fN5dFEA=L`2g8>k3M:>a;d<93PNO@hKVB4HEUbA1Ba4dbI0MbFQUcEHDBkHZZE7N 7[:BaO5a2?;PniVM6;>74Qd6]F[B[7Z4UlMUJJ_YQ3U?D4 kJS6efVM6]NnWo3j6ijPO[YYMCX0OdnogYnA[_OgTjNb8Z>olVB5gXooA^FBH?1F oO36BcaVc]b9iNG^l_:=n^73[/>7=b[aO?@XEQNacjj;I6?;mLX9TTGKSc/@RWdi 3[l`Fk>j:FSno:b4nJDL:BU72PaC=HVGo2m_O?_9L`lmlROf]`M[LkdUb_j_JmV1 `FXnSmfokhIk=P]M^R=[:feCWYAni]`WmCZOacgjbJboIkUMREW^[2bY@1g^;_0J_RW>^LUG Y/a=Ke>FImfL^3UaVoBPJi]g5g^Dkg;o`IF4:2U3CmHcI=S0>cg3bc5VGfSTl78m PIRLVIC]T3:cIJ/NB;RL0PIS;<>G5S0/c>8@/k6TIbnJk`U>edl7VjKeCmO?83gM CiGmUOg^]788;1Q/JUY=T0]K`m9DfInKalND9^JE5<]YFR3PceEiBW9RJTWaF;Wg fD/73gg@?oS6@k_Ii6OOHXDC3YHlnofO_cmoiEo^o>UkW8lnMOHgk=YG?V1c^Tnl =7;7OC/7Cgg_VL6?^o2`@LQ^9n8jLOm/Yan6DU@Uff;A=9;TK9R@cIY]9h/VeYFU 9iIZ3M;UQ/e`LU^6DkHJc41[@lNfP93?m2HT325>YhUlgF_JKC@V45BL4^=F6WW?O=CjCP =gn@kU3f?cEHnH]1ie=R3GQVX_R`1R^k]C_A;^I[BdXY]GPLZMPU`P9b16K1iS4d 2kJAQF^BI;7:W5/eRb`IZZY4HinJB`3bNLP^eZ0TRPFPo4DX@jQ^f:g@0IHNUo8RL7nRc12MUT4/UI5;>a>jB;`U^_?E`]bYLgCjBHRMniG2GFP`T50b6Ahn2d@Aa1_EJ@[GU F7kOg]YbBjPhSQJGJkWYiL9TmjH3;HjSP^XgdI3MGjjiTP59XWajKa;@[3RJ1CA5 X5mfYi@?cAB6:WhH64>G^4^H^lC]Inj7WiOho^No6ECfWed_[o^jE^hlf`Uc`nga iK6?I:ll4M5m6AlI:[@j[@GYcXb24Lj2PW;Wf9Bbc?45UaDd>I/:USVG5SB?jW;N >F9KjT=LB3UiSFAZlg[7AlH;S:nMG@GMI ZH_9NU5NJEYaC[9W`HQE8oP8Ki6[d[G5]MdELbWKGK]MYebBbb6LCV4XK_DQ0BT;ZnD5^E?k?Gl<=W[eF0`YdlfAQ>RROQ4LcTM>VJ`?U[I1M39MW3XCb=jIIiDGiEB7G/105 m80A61GH7E3:H@Fm;QNO4hS6G]m[8Z<5;NC:^l[ic_:FGVJV5^Ej34]gi=K U7M@?JYbWeZYL]DUEZYRFDPmHShZg5PlENNX;[5LEAN[DTN?njLE[hI?2l:C?blVgGS[`d_=ZcNW=MZ>GbBfhL>;_QdW7/kN5NOORdXZW=Elfhm0KH =:?jf4MB?f`jPlg[iV9GQTYMja9HPYf5l8B`7O66W>ReJaj_S2M9:IY5:40cQJTQ GP2^2f5ZYQB>_?JLN@cXQi^:1H`NUAVJHWD`WgMbd^BdfDVcdiZCV]2c>M=/b_UAJYUcWJ7Mf>Qmc?6gMJg_JhDQeg>UhWd^^g0D9Za;F9DP936HH ^VTDKX7[ZAWCfTXkj0@=T9DB4^`h1/k?dH^YikT/YPgWIV9mNOJPSn41/PPK/>/@ ;<16f5BQKiHQf=QUgYBlXa[cJID87eb2BK<99/gLP][Xc=;3@nh=BXhKB=>JXC1] 7c4ACoJ_>Ag/Gf>^7@KQ;RoBVdkR;haP=F]J7LHa2?fC^cAa;=@mM0[6eBaEM6NM n^FKPen/nOR^YmkbkDiO=foC4hoN/NaN]R7]EdMI5[?mP_7e^ao9G;kRd:^_?o]M hHLf@G4E>3=4;7PTM;Ee[5313>]Fj`i[a=YW?FhM/6YTmEWK[IgFkD>T4mJHeNJc @Q:Jc2F[:]g6B5EDfJIZn@[9fnDMLTC^Tdo8JYll87>B3OTHB[8Qn`EMKPQ:1:70_mlJP; V`IQ@m>JeL6TkdMBIVii_Og:^J2LKcekBTK Ef[VYF?RnJSAlC`ggla3nBUYY@ThH;L[aaEi1Y81AO8YkDZW4U=TA:Tf;^FK9j7X bC`ADd[6U6hWePOShXAG3LMPIc9ZhU80lWDXBdR1C2V@:@DbYD0F8@9`a4D097Kn [1bB1DfG;iJ548I`:T8L@PBR97hhSMbgmhZ8DJam8l;n_f2?Y[9K@dV:Y2KaGGYD Oeoj<6U0>Y>T@]H3X@Zk/o@VWCfP7o>Ll<@l/V59MRFW9WXESJVYCY_CiG3UNF3l O8h76h7?/@lG^3eI;0EQajLQ]g2@MW=AmUbC@kQD^e2_?ET/35aO2KL>c2I>1iC? 84:7R^fQT[6URhoTD:ZYdDP 4[b8RPZ4ofI@PWReW2G2m2KO54YEgEJKaJKI95D?^5EG9T^`9FHb@SPB;5P?aA1D 1JfTR0d/o;GKkbhePmTDmlJMekgMo4RmK^/]F3jehg4il:?M=NgCRVlmel7__7IU eGd_Wc?SEDkER1n6@Hm>BVO;mjIha5ZBA6@PT0@A6G@8;=f/B=A/jHhYjUC;G3E/ FJ8^]EQ:mO69he?7N6[d^/Bje1[?O6FnMIKNU=RD>/^cDUUYGJb_C5bI^]Qc0d^a ZX[c:ZU1JK1MiEPQ]BZ]]QD>FiYGe]aN^cdi;c9Hm`;3Qdf IAkEZ1h`ifLR@QP[gNiZ^6IZTSCjNbC85oC9a>P=giI739N;[ A=4iVFL6HA;0CEm;iP5<3W?[Y9Xj3Z5;7eERnhg>:2dC[V?X7T_XCUlMK3[Cm4m2 <7kWPLfc^XUF8g@ZID7<3ESmke fcnce9/ofGal/7mOclHkNoI/f=R3QmW3k[enl=ecAcki;/]VcYMON_UoOo_BRfH< ^75`ZI`37BIB=U/H^]NQSm@_eN]d^M:86=aWS73h/hYCR[IIKUSZKhbKGUVWo5Zl]^N]c=NcCjIO3;kQ14cD_ebD0nVS977 jkGbiOXlo@?k9eV3^]g]TU:mGUG/Hjo;CZkd_6e2N@dkQGD>D0n2_V5^6e[FE89;dWP^>C>O931X77RjKdZIQiVg Rf9GRYlh0JKYidjOeT5HWRBeWk[VDI2iRZ65^jE_j foSXn?_J=QeKM]gaVnM]^LCmf?Dg?_WhfXk^`JG:[k]Vc[`km/1?1lm^_V;l^K?B XdL>_oB7Uek4Jf_41;7?NH7b8=j?oW4OfG2:n0>UEV6dED0jdg56>Y`f9U6ZKPdV f21fbIjPie8^LbKV>eQ3`k4Nfja=KMo95Mc=]aN0mMioko[C2324Sg9Kb;GllNQPeALWk8^mRUoERiD E1cRPnYkfV7;HmIalK7a5_Mc^8dO8bkRY>>]dEb4QVeb5QjLhBc7`8U3le71BODc iXFWe@F[eRa]FC6]`N@0Df`HgT?nYamJ8>;:`a_NhGPCG4feN:T0ZJPg0:/1f`0V0:VE9gQk3YeL=Tm;A =Qd[BY3Bj1@P1Y38Qk@8<0>`0;05/1fPVWb2/PZ`3W0@<01@:BBUmMaGP[VWmF`f /cg;EQBKaIIhLGjCFMacICRNCi/Icj/_Rk>=Sk>=;XfC;iTDchLEa_?4o>9>M;k7 iRc^ZdZED[78E4bl7BWSQbT1/K^?MTPY505`2EM_2C/cDh5G 0SQo2jW>ohaUoAUY0WlCf9_lcEPOOkFW[;ahWhT4RhH@Goh@TYHiQ2BV5TOi:ceO SH151J1YF=@cDRi=Y18Y]bMo]2lZNGXZU_ZRo?dmA]2gXfXDOhdR08jI_8JAGb<3 D0mX1[@3E62_0g^M>P5K0C/04@2/3:T>Of;?HUXY=Wj4Gh9Qo_XHo=o37J JJ7@L/e[VCMKJbc]]Hig[FFL4j[fJM@MKY IIgI[3?4>YmQhb2:CQKZ_JQH7_:`cQMIie>//h=e1UQW?^_99X3Vln1CcR8m2PPIYI2H39bhlcYfB;?gE=@6BmO <[ihEMEDOPP=3d4=QnPh@8J23/6<3Z6C@nP^0FTUH06P3g0:40>Xh[JHJ@;B 8T0UH05P7N0D@3FWL`YChK@:ZISRKW=RADP[0C=4RAo29CiBbN4iN;c[eH?jE6V; UbET/aWI/FaNAZWhW8`BgAIgU3WgO^7llP/WFJ^/o5jn1@oJOOPd99i_jOTZbaMU 3o@4W_5EYK0ODCK^2Gf/W08/7oThjS3;HlQ[4OABl_8WTAOgN>NRFD9?X=2gWkU4 Zkfn[k`WOAmkXacXAmiWO6lHDIWen?h0bY=kOJmiko:mD1BeP78PP5LF?KkmQ/Vj cc_>mmB;9^]jE6c[lMdV/[fnFkeCO<^mITE[_>;Z3YA22KiIPGVnZNR_f[_@5nY0 Wg]mUMj[OAEa[S6RcEkO:4`Q64L;<=TAGW=@OkKIhIbb:6/;5F[gJhgJ37cADZ`E JSVJCl_B<[ETBj95]kP/3X_=H[6X5]W2l@e?/WP46A@WJ;9Z7^XZ31Y_WdaLQhMQ `/dPaI/Z2ajDDRA9Z^=e/bOQkDWO8ZYKJ4C>c?I7VFgV_8SRWl@RRGEDec0YAjf2ch60F O6AH/^=lfn9lnFP?_SbAPLmZYGbC;mmZ=OUT9_Rj>o9ZZ[_cT80WcJ0>TjLScOPf ch_ih/T?0KMAJI=UkOf6fQBF7LOI[i7Vjg`EjKFiKD9>iWjfJjQ:1mW]WdC1]MMe G4NNVZGElGl7OR2]_DhX8ih61Ndoo/1BP`m9Z_7M;ME52_1b/a8_=k/e3MCVjS1X hloCk?HJg1O5RIN0>5h`B]85AT6[43B[MHSagjg1W1?8T/9B 9;^^PLO9SFLKhg/@hC=noWlD@Mbnhh3f^_6l:6 I;5f:3LKM>3mC/MiTIc_;RR4IBJV[=JR@oXo<3?L:`YUKVAcM79UHFd:IFiTKf9Z 2S4g830PKf9Z2SPa=c4:IFiTKf9Z2S4h830PKf9Z2S`l82mDNG1U82m6KfidA6Ec Hg9YL7A_LR0_@G=SIFid83T`=B0_@f5`B6EYIfQd83LbB0`86mRJPYK838g>20`830P<20`830P<20`830P <20`830P<20`830P<20`830P<20`830P<20`830P<20`830P<20`830P<20`830P =SHg2S0P=c8b830P=SHg830P<20`830P<20`830P<20g21M2VE^I6mRJPXh830PKf9Z 2S`l82mDNG1U82m6Kfid82mCMF9dNG1U82mDLWEUE7U`IB0_@V5cIDI_KW@P;e1? FUU=Bb]1LVUQK4eD82m6KfidA6EcHg9YL7A_LPXa>20`858P;eMYI7AXLb0a>B0` 858P;dIYLW=d@fQQLR0c5X`<2L`<2LY2Rm=KfA4HGAU82Q4>S8`<3P`=30gB0`<30`<21^80X`<30`<30aC

20`<30`<21^80X`<30`<30a=3Pc830`<30`86hP 2S0`<30`<34eC4h830`<30`86hP2S0`<30`6EUHc0gI3ESIV8e=fIUISQV6Ha>CDc=SPdIV"], "Graphics", ImageSize->{301., 151.125}, ImageMargins->0], Cell[TextData[{ StyleBox["Figure 1. ", "SB"], "The UPVN model defines the elementary functions to get information from, \ use, and adapt network resources in computer programs. " }], "NumberedFigureCaption", CellChangeTimes->{{3.416567524100924*^9, 3.41656754581518*^9}, { 3.4165677166522427`*^9, 3.416567716730744*^9}, {3.417369954989113*^9, 3.417369958133761*^9}, {3.4174227038524*^9, 3.417422770277258*^9}, 3.417424430183721*^9}, CellTags->"Fig 1"], Cell["\<\ Figure 2 shows a practical implementation architecture for integrating \ Mathematica in UPVNs. From Version 5 on, Mathematica supports synchronous \ interaction with web service enabled networks. The kernel architecture, \ however, does not allow simultaneous monitoring, visualization, and \ manipulation. Therefore, Java middleware implements an event mechanism that \ supports asynchronous updates. It enables the frond-end to remain responsive \ while providing continuous updates to the kernel. With this mechanism, a user \ can write a network visualization program with Dynamics in one notebook, for \ example, to display a continuously updated graph with marked articulation \ vertices while calling NC functions to manipulate the network in another.\ \>", "Text", CellChangeTimes->{3.416660089880301*^9, 3.4166687475515842`*^9, 3.4168162855456657`*^9, 3.417141837364419*^9, 3.417369970959268*^9}], Cell[GraphicsData["PDF", "\<\ 9E14ARda;S<:9LCUl^G[Yo>PdIk`Q n>HaLM=>gMZCeVikb>BPbXZ]A;HCFdTVoOGm@2ji:eUBETk[c<@VUP/281hO/1o4 Kn:3T?QWXaK>6W4g4gn96o7dYg/BUoORjA5nCnl5YGogDgjPn<7J>fnnKo14li?Q E/<4;m^87bnXUOSaCRPI15WG1ZdeWoSVNa6]/^:c2>8TWMTLWJDSY3PkHPWiCI8V 1QLCoG25LZPT2ANRV5h;IJ<<4PY9Z>BdX1Q8HDdVjZ1mPn?>X;D]@VWb`Y9[bCV7 CB]2SCjhhH>=U1X7:C;6TaHVTS<1R^XHK?2/9amL;M_a<79I7Webnc^I[H@ClCiFo7R O71X^I_6VW8W>]f26Mi9lP;LbIkZj`0;@6g]2GNiJ_N`]o[>]4k014I[5AnXKT=[ X[M^T`E>GncBG>^/>Q@VXKA:]QLn9W/T`K6W:DD:/PW_26kOa[eE edi2MnEMZahX__7>SbNO9^9TOW6aV7fN`NP_:P_MXPd3O@34Z`2[H<`R6YPJ3/IHSd@/E G2/9HG<=ojN>iT>V;@A2K6gO@U`QScCl8@JIY:6obd@gaX9Y5_b`WSCj]1W63PZW8^XVBHABjZChURl NXCm^ccC>1UQK;SG]M3A0LIB0<:1M9`QT8YJbF=DMHf9GmQ6cA3;XFd Pc]:BFMW`TYNR`PHjkDogbaWMi?YL_iYj;7KdV7RS]cN1RCZLF5a>U]n_[ek=`R7 gLbMH^In7?>CbLgloLO5I3Vo_AVLD=9kb[@=d[_B:4g9PgC/ZiQMLJQdAO]T:`iO@fA@7hO^HiegLMEm2ZTh2`8VA1/6kU?FaGdj_RQ? Sg@On1nbgWSoNBD>oW`RD;d?i_LO9h_i?nDZGX_chkk/=D?dHV@^Mc0QlPaB0FN7 H5025Lb:^5G1ZYjBL04A2N]/6i3GVdZIEQY41PAMDoP?J5Db>I>FSjWOb=FAJ hgA08SJ4]bgW=dL``PJJEK6eB_4YeR>=6JM4YOGbZM1jIg_QK4OH;2mT0e^_]>o? Q6`M[G5F]HPfcfM6WCMJ546b:fLET_5N>]lRjcKN:6WaATlBQD@FeEVadKafR6/3C9`YAFJb 2PmR4KPYjbTb?G2d6>Y8fCl6AFbe/;m6C5@e93@6/nB=iT0:[1ZU2ZN3Y: RZHG]e]?Ej]2Z]dkH:`QcAS>YY^lVUl>:Fli<9H]eAT;< >Y_H=@OT8:[;KLZSe?O:4=Bei6GZRBbS3EKO0c8n@WfDD^kFd2aafmIiULX5BG5`noifLG_iiMTA;[h_5]//WHmBZZg0H?FLm@K/l:OIlW@f_kcj noKSgL2eM_>GNo7oMGkck_WTi^;co69i=OH1ol/7@k8JcS?o81cOboVHO98FdK`2Vd=cQ9`3N ?BKi0L8SBB?g0d5c3D1=eZUahbhLB7cO`A322HjW`jJlWdI/dG>hQKD4N73:nJjD dWh`l5HP9ik/Qk>hlPaS2BeXAm7@U5_AUOjnkag9HR87J0TH86GjV_@85/j1AIU>OMYeo;El4;:na0MfiTJ_SABWNYQ7SGY<]3Bc7DaB5 cXIE`ofUVYfV:5S_OgoLj61l/Z5A7]kON[YL^KoeQIYbl5IObP8HF/m;@ 0SWUHDQD>61Tm3fHR;5Vh18JGP2FHdb4m<_de:6/;c66Lh1do=@2j:F1[Rj<2bG9 UT@2`kX;LRCJ64[oGZ=Am14eZMNX_3KA<>OC7Q5/d@PT8AW1EGgBD75U^F0 J9OF:6SO2/E7Xkg1fWT>M>D=AcHJ8OAEgSMU3H33F1oBPB0AXXNc8bOo5K=RRKC/2[AGB Z/EWYIfbZoZUi8L_=i?[nOCEje@EWojXFRhQo0gU^eXWVffW6DGijh`bV1ZE3ZA2 S/6H_QcH79c=US/?@`f^GgmF?PDA>TCh9b>A/kKj9WJ4D`aBTWBE]@mcX_<2=K6`ndaOad][a_152e;UUL5 eC;/6bN_7[0^>>eab6D=U?D`cBSW>IlS>gEO[g[:Pkc1Hf`6J1EaSL5SG1Xc855h UDm>H`C20`858P;dHb;S0P>B0`858:;dHb;S4PT5186IQK7=U83hn2VE^I6mRJPXaT5187AbMFDP?Sh:IFiTKf9Z2S4d830PKf9Z2S`l82mDNG1U82m5N7A7 DgAQM6DP;f=Q834P?Sh:IFiTKf9Z2S4e830PKf9Z2S`l82m83=1;46dIL8aM3195@V2e82doD[DkIUeD`9 HYemMidLIjNIgBe58XCXV7F<;UI4QhQ>hJ53YcY419UeRJ2SAA05GR:foc^C^f=D _S0c_gVNoo]l_L<0EHmBSV=5=63:c[_9gYQfNWAY==TQ=kQ3 bDkb;O;FK8S7@i`FWP5D]E>C@_J^?;m@=/NH=>;RVg<0akL0gKGEFce=L3>4F3aD@JoH^3WWaE 2k30>Hi/0OZ_03Lo0_/O0]/O0hUZH:PETL]/=kSbhR;W0WCVW6WGc4kT]FIM?j9e l6R5eVLKC@eJb[8dgnEY[_24FaCY9TaI1LkIGm]hS`YkN91?mQNi9;c^gjcSZ9SN@kfO63UP9W_6`XhL/ZfhS`GZHWDf>?aTfC6 Ee@W7i?cT3cW5@MUC=mn;WDR@JjU?CVIjiNJGMcK?SB[5Pc4igagoc6;BAU gWgDg7D/oi]WKI5W68D50A6GY<:TaJYEo@J/;3i5nE5Q;U GAHE_ESQWQEocgTD^5_6?hEH77<=i@RJoTkoXRo[2oYMoO=lKJ6nhYUcci[6Zf]O 6EMVU]G8^46=<[j/:HQ_/=X>NReTJIgR5OCTUOF=hNXbmWa]fJ?97>9ZO3GDY@QU J/@hhlV^IOM5//DghNMKboJ_jE7kO?I9CBGG/[YhIRWjO3IL3F_o/j]Pd[:[l>B= T2hlJj7^E@nZOFZ;fPY=?JJfZfeZ5mn>ZP?U7L>LUHT;[=]UmBWfH6>Jg/Y9EfJ; h=o2;hKoYEiQ2mLd=?T?CKRiS6T9ga7L=W27U?o3Gk<33Mh:IFiTLgAbIF5]2VE^ I6mRJPXa=R0`86mRJPXg>C8:IFiTKf9Z2SLP<21_HVX:Fb0_BD=3@V5cIF@P^F3aW hF_Wge]>R?U;@YB_iUaicAGC;?DhIolc8F>gcIdmHmJok_VhSY2V=KRnoeaD^2_E ke1n7^FR^@^G[g[_8oMYU8nPg7WUXYTcM_ifJ`TQUfe5nO:5 GCEShNa3[U5;DBkRiLF;URfGOj?l7^GQ:=nlN>W/aLW3XoNSo1XQe]nPS^;7ofc4 A3YaS95;LcFlmSooF:i28S9AL8FIZ?oIA9@]A2=F@3HT>i:3>8U>Gg:9T6gTFCZ??4_fTaOY2EbeWN`Q kN@e_=]`lR2iW_b<[EU=eT[_h:Zen?92k8g9UiW?b2 k95NbgBQad9T9Wh7;TJkb2CdN@0kFAYg7dfnH`6j?GB<=cU/Da[iVFdRY0VklN/P_bHOD9]b8_=hiPA`DdH^a?NdTmoACZVkjjI^D2Yj 882n[l6IAN@gi5EbR2KX2fbAHUi=_<^l=^G=>1]WlBEWm9o/a_aFbfm8Xo8 30DU[2DohKe=OT_n@T>dW8jUTeT_]XPm92d5=IGQf[iT5YV7o[hGMon8Y^U^IV<7 YLOTGlZWCOWMAc8>H2A57R0o9bm@>khdAYOAVnUQnSLfS4eW3k2oBSnCWi;O=/o0 Eem65Y;KbBo9_jVK3Z3SjJEd;[fN[ZLoXOOA0o@@?LJ6/4U/0O]JVR/]TGh]3lE_ X[a<_TEIYmaV>]HmYO_Uk]mgoc]CTEU7aXa<8^c@_`BK2VkV_f< ?LP>hWN8OLVnToaBXIBFnTVeDZ>d26neG]Z2gbkY;g98?RQWdgV7f]1g8EY:1m>;dC?CjGbjQ:i2CjjQmm=OR7Oo5GdN_O@NoA[_K6LAlLkW/Gi/ :1^;gfE/=U_2][0kFC/kc;jGc99ELTYiDZTdDVZBIT_;YF^T^jEFjBgY@nV_dRWY 37hIFI>SLZ6LT]?bB7Vj_49nB?i8BOT5?[j5OH`>lD6BJ?Y:3ZAc6Mm/cLdNNFW0MG:;i7Sl_?h ]]oQcZ]<=WXSnmYT8ffD/1X8c=m:ONBdm2Ki@?ZHV^E7b9mTSO[YLOJT=0iDl6]i /3:5a:D7bJnT9O@6/X_E4j:MESN1S/O@Yb4G9]4:nZfD8A8K0bZZU_i6KR4;f1o9 LO3a1W8?WBG?8GN@BWXmnH`l0JkXYEaU:SGUdMOI?7TSlm1f`^BWl7De]8Q:RYN/ XDgBoJJ_fO]T1CTXJn@SjAVloD7f:fVdO4:I@>N20fhPjlRBc4gT6VF:o3JM@b@j VBCU8i1^ed/ELQc7eI0Zdb3CMX>kmd8>3956XbH0b[THM=402G4oO_M2C/RPX7WP lD/PaGi7fTfCF0NIXcPXY0hQlY_M4lSDc1?T_/`LLUGVC]8KlV1miW[LLA_iQ6`V fnSJk^_8HTSfml7K5b/Sf45UA:HgflSNIa?IgCo6;gXkB@?T2oan1L`omV8c??9V9DXg< cEa9aY;WbBo<2YUQCP?7[OA]O>meI3JKT5T^cNjNQgkHS5h`d5/[87m^=HHeC1YR e0dn_gK@`9X1eOfZ:R_jmRTo[gMI^[AGBG4ZFI@XS[W4YLL45_GTk<@X6_7S=ZdaO]d< W?YAB`<][oR?UTJfYG6f9MES]JBfMeV/?Q5[?C0l4N^PDlM?0Gckl4AS[?FhP4L; N8^0kH3SLE`@Z`o<7Ai[YLfan]HA:nM^[6lNg[^c@[@2ZSE WeRlPoX7D`4`Oog07HbXMWaRJbPa_;heV<2U^8fD[9laZgGLn2We`l?aN6?_/UHj K6KRlUJB6=[ZC8/VI9QhC:]YF:]I?2Hf[aEO@fj;kBS[g;RY@bNG=jM]/a:cITbK dR[=`3gZFeeY?7MhZooJXh4OR[RiNmRDmNNN3D/Kj`?cH[caaXg[HjeKadliimY` W=nQ/A7g`;D/>J9ih`PlNQ<`=FYR34mSJa^W]=:eN6B6=hI8NGK9a`cLjP 4@_nn4c_/Qfj:m^a>ac>762cW`_O@Z0UWNiKb=dYLf6Z0XVK6l2IC 4_RV0CbK?H1/W3T02<1O8lEE[K>0TGV]UV7=6oF1_1jOB5^EY9j8KO`G0@DTSWoi hiXI^AYCD_lGhBLiWI`U]EHjX`M^CJMKBd/iRIR70JMhal6Rg:mgfLX>UTP/eV?C]SPeb>@V_;n2WILXaL7VhSAWVj/IDelc>M?FOb6_RI UYhcIbm_CX2BfhDRVmNZY/knLnXnCogLPJgDmombNWKfo:R9RE7SYdj9eFm/cU7] Z4To:VG?l`i5_n5L3V[e39/RQAWZ>Io^ZPSLh9O9@hoG9KkS=J1jMb;IUnkMM2?bSmj?M]6 JM@TR1`fJ];DSA^e7id3ZFGOl/;L0AA?9Tf9ahJeTPI`IQ;o>S:M0gQZ3;LJj3:L V@@^4]F=hEcaA`g3^H/JlLNY/gOI2^8CHgX/KUd8=R3TJ4k4WC3n1d6gC1ajY@m>VbJ3I>V]37: QSD?KNAXHLi4:a3G4=[1i[>5J5]V11NcaA8KCDLcAQ>4QIC5J12D5mlNB8oAScKYWi;bdLOk mR5;J9>WGca_2>]5>gK]b]h7mQ/k[GC2I]Y^a2C3kZYJ8:mVVmUmZ_b^S_a[iaWCNAkG@ 2Lch]P;jjPhCkgS3h];]0Ho7e63_b9a/MkT4l9EQdGE01EjUX2=cc?3c1PD5o6a1 a84c1CKniPDMK9mQHi[O7h_Z;/IRDINkY_cM0c`o@mSI1m[L KRHNJ5RL;T3Iia`a[6h?JbS`lSYnkcKL6Xm_]eYI0h0_3M6;oneYjGCfNOaYhV56 od7:8=oPmhfP4^jSmd4ReVW0`bKJeLM3:95K3FCfEiFA:9dlhkK 0T1ZdlWS`6b]O_8hZJ_]ZZdkg]Ede>GVV4FfgW5NfW63oS8:`3cn[kOMMmg=3m8mWVmo oljY2iillM5Y1Lln>jAfI^N=;gmbaH:O?[SALo3m;ijMl_CcSfnH`CE`BRIW?YEm X9DdKLbQcQX<69b>0a52>K6VKBS@GPW=k[@i2cB]Eei1A2kX5E5jfA=fFb18RC/6 @VL=:hi4gCiFW3o1oo4OL=GEenW7m>>SUn2_j:nhJoNEd1DlP5j=4/O_/mOIe M[WNMHU[IERJh;]BWnnMiE]Q_lJkc[kANf_h5gI=RDUP>/=Z]MTM/YWR^A03Snld l07kX:cf8WKJ[meVbi<3NmWS9a0:OUF8]iFHYS[4n: TYBNHWSSTloa^RM>BbVS`/lPSN? Wd`g0IO7PDTP4QnW2haV4@YV1@[1[gA9XjOJij^/b:;>G7dFk<4RAj?IQi`T2U>C fj=g;ERmoM4K:Rof^Zg;>]K=WkO9fakohUN[gUQ`aJbK]g@O>oa2Q]hB^6mmjlgG ?n9mR:fjHNK=JmK4M[djYfgFm0O?:oSe7IgMooXD^6F`@XV/:g/Qhn`dIOAgCk7= ]Me_Nl[f^TfiF;[HoS=ILX?>RLdTVAG=:YV93@coQRAk9DVFk8CIk;9If/Of`DG0 j5I38k:<9^@=CNiPEcbW:9ZA7jgBNZ@QP4oK>N40n0Z02@2]=^aVXc1AIFj9mc=_ LC9>D5Jk]hX`WLFHQ?8AL@f0Xk_i=FbGXh=^4WgmIC[M98CQBBiRJ_E?MB4;mI>e YfYM=KbKJf[FWiNF`CI>Ya_F]H:f^T`]heTYbOGl]_d@Qd X8gQ]AWF6U_;^1ZKTJZa5DI`k5g36j@K@/kn`Q5=mWiie08`j]82l_h^KB dnZDiH:8gD69>H0aXid?6@8@O5H>^LKiQ5YmOQlCZLMS29hN4_ HSRf>YS3hCCbJ>jUWW?:m1g>@91/AXboWV^j_TQO[FoFIAe/4Q1/4Z0TX0LHGSK; 9X4][UO?Bb_0 8Q72ClPm^Z@9f3RGLL0]WWQNG8;L8gUN/`Vld_3[_?^^_;WmfDfGK2YijPkfO]Mc HmOlY9>ZbflonEXGKM4gg_KbXoNgSJgc/GlldkebF_NYgkojTkHSH0g`aVSP;Pmb ;inDd[4ibAMedRQLN1hRaGV1XB@^SaZ[PhHNHWRV>9F9bOL?6g76MWN@5cR=E9cZQRS51nI n33Ui/=DXY2hm6ZDO=CkPc@dBJMg1/X^G31iB>VLgMCRQYd6hO=>N0khETPTe9he6oZDF6llETIO[ OO@ijUa;/ki1fZ:o[[aRj]A?j5IEJHBkM9`nemZZom?fCo/o7AKI9]]UQ`BGPb;; 69=DTmU/0jc2;`Qe]R?c[N4D6V7=Rd98^5O0:=^::PO?dh2MKFQhgE7JoGSn;MN>BnM 1[n]?blPST:B@Z:^eemnfO7bbn^Ek15X7MEZWCRZ]@0VFK_/U5CcGRQ<9?<]ed`J jE;>Xo`_@B]Y@XY;W[RD:SJI9EKiNcKU`emf?O38no@OmhdXS5@ZNklO@Io_7/jV d[_gG7gkKI`79OQ4RO`iL>DBG>SI@fAPIJCEJVZ@iA69bHT[4///JbbVNJ4EbV;; <^/]bReFDk7?8PF:B`]lnAJ;aee@F]Z[5hWT5j3WXU1MRAY8VFaL=cMQ=38Z>I>J g9`mCBKNmbJEgadPL6kbLQXgCDZVK15nQDgSkFbL<_9h:e^X;;lPAV?PZaPo3jbN 4Y9K0;`]P>nQMI`5X>F3^@cL1e1CN]0d[_IU^jP96]lHDAP=]B7kUm<3L@ILE8_1 [JKLE@>>X]07dOMLejmdaB^hIY3E3a`/@NC^JndXCG;h[AUnhZ=OY[FKKP0DS9U`3YI2B:c:O:B^EMh2EMgK=I??c6OA0[Yn; kc]VC>M@S5CHIl:W^3boQJc9gd;^EghYoL:nAfZg_fXoA8kVoc?OiG3W^o;cYE9C RJ/d4X^>]4ofGY8g>CQGFI1oWO/fmogBOHkk8m_XhfbKj`l>3kbK8Mf[QfC`iTM] 9CE2mnaMDZYJ^=_X`H;IZ:ganQ@bDHO AdLSigXfAUBGj4b8[jHUj=0dGD[m9SUAF8B>LaMEE/Qn?8Vkfg g_UXmmLofMOmnDHnNHRnNa@dcNNm[>@^8lnT5:RZfD`TVA>XIRV`4QDb_=?8emeE iTWBAC4]IVMJb2iKoWl@VVg@YMU?5fCEa4e6d@LTBTgn0XLD;c1I:4dE9h]RTPB=^kQI:7Q71M<86LbI1/07PVV430kc jmWBUV9JW9n:JE@C9[EY_4Ub4;`>Cl26WIgQ=hl]@iSb3a2fWHMLH `nE4>1::12>BbIKBTgVYJ4Y=`PfL3=SchlCWm^9VE4ZE99a6[7jhmC[@UIP RLM9THBkSRaM]XMNm/O3 M5WkW8jOmEWL`NL;i`9 >b^[//ONOK;7TUkIHb:I?NHGI8n1T3PJYGJm:ZI/DKH[`186ZleT:fTULST/WG6H F3]157L@JOUHV6T898S4Q7ajE3cNN8oFPKKNeH3Q[ JUbb];H[=ea0UhM;Pi=RYF_oRgaX`3MFIcjCIXRah2U3WlgVV9Jc5JH=mPd^TdE@ F[^E4eX73AUF^L1Y/J@dCDeI^C;=gd`0o8D0M0_Z0Y0EFKc644Z=]BWVXC6?hAWW JOK87YZ2]8JiVYGOG`0@l^g?>OTmb[fkid^>jde;/W:LSihP_^=Y_3iYbZVWoO_Q @hB:TaZdgKahiXGcBei/O>7V5`k@[H5]e`mKMZ?dcIUPaa_c?n:lQC5?VL3U0ndf 2ZC2jQ[E<[1HjfOZ[hgD;Y7FBNm9iYGJnm;k6_@2S4B`FUU3RK99gZPl;GnQ:YY< nlV7IFKQ2Z357JnBHSb3b=aYZg7cfYdXZkVSc8oilBXL>gNjOKcn8n?l89jIC9j_ FX;1ld6d5/bKJ8XTbc55ll:X/jQZc6b2eV;B=:8`VC:c5E>MV/B/lT>EiFZ>o@Z2hLd7K`QF1o61hKPk1^T^LgX/QBRglZ2=C9? QN4J<gZaMk[n]FINmVWGgC;HUcQ^U8Yj4HQ2`dK IK9DX10eaYE2mZCQ=3>`l_nb_doeD?Zg?Oe]nTm=AOnd:C]bI9TdWXLGO1^4@cHg?jdhKI:5`>]P /CZ8JV6JeBCh5ciB`KcOknJ][3YHlm1STH?WFJ]04gXR1^b/ dH0;_SFRG;U;`C4LdmaECY4Y=XU@1hIf5FQ//V4WhT54 ?0QOV;d]XOb3CYJ3g]7YX>c/al1/k:6oM9HT`lIZ`YbZUhEENJE]WNdeM:G]@]^5 CZVGW;BG>JI8UlX[kJ/LjnfZUBUZSKfoHb`K9L7/E4OKQcZdNmUmd]gV^mE]dY=V Ti/i7Hhn2P?7QLc`e^e_Lc;fGKH?EgkM= RJTM]:nQfBaJc;2]]U;[GWbTPeYaQWG0N;4h`O[>aCZ5ogCbLc6UFFUA<9b`KC]M Pb1EPk1ACSKE1[XPC[Um0SQd]W2d2MH:^X6cNll_11^6/[Q`4^f^[W5DE0]` EfoDiQa1jDIH=n1CS5b=D9VXcmnoV/IM2AL2Kecg8P[PdSjn87a2E=WG?GUkmaAU knU_OW;1^0NTE1b?/XNnX2n0K>ic77IdhMlS_VLWYM;ZO;JK>h4O>;nOa0/5AP<1Ym>Q5Z@L3f8h?bJ6702Wa903 h8QAb;oPjIHdN:RUR:YZ33`_lFbjOo:G`V^kW3C=O/W3;RLbAS@<`KIJN=^>ND4d3^l^b14kg`MF^ZhJaajP=MkX6XJZA;Q0ad@6491F]L h3LgT/>8e>Q@G_C2:=9I1^:B[lOmh?Oi?@WY?0J2BPSR4]OUR`eFGm8j?nP]mI>gMHnii[;^?/WO/JmLlN3PoFCAVAOLBfWO=YP5FLmL: ZK;jVY5ceg5MHQ[l/7n7[MV7iAW5;AQA? U1[=do8_:KWEhdQ`MakG6T1hFB3I0jAj0;Q@/jO@63S<=/h2J9`5d3P;X?4YH`A_ E69?5K4RZCSIgeVE69j/;ilJViaXB5iYWFmOh;S2>c]`SOEJnkG>6o@EAL^BjjB= eU_]6ifgjf^;KTWNJKoKNGMN@Dkgj1e?^L>YT2GE2fH6jAEbbaEmD`PBILCNni[` [F4FC_[/_@^:TcBYn23HCaYI?fA1Kd]1PDlB1VhJ=VeCe[cUQbJH[Gk<=Y<5m<] e0B3Z]G`m>J?E?1X_?55UQCYAG]a`l[QH0d0CQYfOZMNX@Yl4df1@klDY`2Pnc0J 0LRi>n7H1TZ3OG?6Nm?XXj0in225in/7U`cVbM97NGJBOa4L=?PjhOG2047PH3kk Ai^FN:X;62cZ[2`[:TjUnUF9ZDlHgL9_TnOenn2d5U>Ql>ZTYSeWWokJ3H^NWSQ^ fZ3^:lO?Vg?S=cmkk;]ebUkW/dne?U8cP;hoYNGJMJMooV[g?nnSknUGgGk9d6G3 jnLTo3?BeHo=G_C2[7U_gNBhkHjK;QeKFKVPI=2^UB/>;U_n>IN;U?C1n;0GL]6< :3Fk`P[@iO3W8>C:G?VF:DUD]DPWMf5jFl@oP`KaD6]2Z21CQ]lRk5 RKofV=5WNXKMK]C`D@1gE7OOml?0fhBIHjB^XdfOLZdX:okkm^4CE]bK`ccMnO;6 k[1ROoKIkonIOMm7hTJNX[j^bS`/o7oB2:WV@>T:nB5gYO48i iSCK27=Q/Z[MI?6V<91VM@h0>If32C?c^GT7=CS[=1D0YaH0gfME3TfX72QWE@h0>H]4Jl[S:/L?8Q5689a0>B>L 3gg7jlBHUlKd:Ta_U_GWLB]LC2fhi>HGIgFOO_MggMl_OW7T/cLLgZg/?K?S`nhc Sme1kIm;HlndkMmenH/D8O6DF33FSD0OJGA`KQK8[E2hF?PH3o?GXRZD:NDO7]0o ?>2Z[4B_eh5HnHa>DKU2BdV9U=C:KGe/cKIKeE/]FfbM]Q>`O6gSK9PT]:X/:`fN /e0Kc0?L/Zi>n=Ya]FJaa5C5ZjX:g2La3O[fK9G>IU0Z<5UJDS=> YBgZ5QEUn?_]c2RYVLkXI/CC<^SJe735U74:j`:0Sek`di[<`HE[VL_ >@Z>hRW0in0aV8B2ac4K`;GYg1@03SU7_aOjLQ]a0Q?oJ;>h8C?nd@Ic0bH=M6[l =J9I2MCZoT:]aQCiP4I^9CM1DfiZS6nk14 7NjS26LiJKRhmNF6c>^Ig^W7JKN1Uj?nJ21MEUYE8mNDGBQOD3IIKDaOXLi;[kB] anChMoK_dZkZ:PNEmO:R:Wm5g1^HgV]A;mH[D^jXLfaf?>c8>9B77M/MGc/TQhec ]:?73`D0/`LlZ/HQIVdM9Qh7i714934DA4U0n2Tj0D0OnJBaMA@91j4LUJ>57F` B`e7/L5S76:Y?ZW]:JD6e2CT=XJm`k^iK4oeiGF6_@3Q43FM=Fa[3Jf1IWCB6<;_ j4l62/^;mY/>VUSDE6MR9XNHC15cWJH0OalC5=M/SVTD1>dP5miKDml1?eP;L=dL Cl=LB<>1eWAfjPj08LhMnMGl4mLoJGGM1_ `@McJ6GmQ]GGi;L6[SYdjhJWanTFOn7c4OoU;bnJE[5`g]a7DoVg=8chiMXa=hga >^bQXZAfENoc6iL4U]`fbYQadGV[CYaNNoh0nV59A2lIGGi1ljEScklJ`YJAMJ1Y K^OY99nf60m@aNH/D_XYmHYB5ff=/VPD/f2AXI75dBeAdd1?[JlfM;7_hU2CfVBO hVcbGAJJ[eiYWn^lbWMEZ3?j_^d3o`O1_gZnm7lIo5_nTFPV6X`YiLibKanUcVTX 5c_7:ELX7nCoBoiN]nUi3]W4B3QRFJU^=F0;]USUZ0SU/@XZ]@YW 8UAbkP4BgYHCPXZ4T/kY5<0A<@ca6Z>LHmBj75HC4NA7I34`EDY9aSXY]8N]]9FN X7:DeV4mR@AYdBg85/0I8ilC61G4@/G0@MfLF207`KaXlBfJ2^2?YZ0Xi5kn 21X/65Wm8o4?dX7o6=iojgmI?_B7IM_Gf9dOo?[iaN`ZXJO[7cV5b]F?P>gfklfSmgla[;^ [k/?oicN_KoQ]P=_7W[UP1SkafF>BLLQ/d9dJVjLZ7:/MU:WUG:gnF;hiVEga6X> A6B/B/TcZockcN;kcM3/0<=>AZTW4@Hfdf6Pdjg?jho7[:YmZ0fWlfCiR/[K8_];OHWK;//^kEM=Y/?KZ2o=fib;WJ:CTA5_FdLDdOhL]_aV]]PG?o27cj5^9dFZ6nm;aS1:mNi51iMc/:`aP7 RjcY:caQ^IQHPem`eG_IcC E[R_=S]S/c@GlRT2H`Hd7UmjhMO_9Wci0SPk6?`9>JGJH?a^d2Mj9TCU/US;K <]?K7>V<_Z_l`O=Ql1??9mj_oGl?OR9hcaN=YT>LHDN5>?MR[ZO8OYi_8>]W7lGZ kB>l5dH^dBKKimPoPdCg9HDeTFMCUiPXRc68?k4LcmeQ/__?;1Fbmc W8f272d0WnD1Ia<=OiA4l^0XJe:J;0gFfM82II5U]UG=hb>Qn6`0aP@>iDMhG^an GoWNNbXTmgD?3?J=376?3Pf9S7M?2dj8c70_3;_QG1iN^AI9kP1oJj3>nkbPh1//1^0 k1`BP4k3DUaJeHX@XU0DYIg9E1Do6T?hD1^UDEnUGV@fRTZ[NS05QcB`TlDD?PA` U/4@EPab^DeahG6C>mTlaC[G>_gf[ob7>LUbXX79`HG GeblYFa[VKUo_7n_^[8AeQ7anUjChY=jcC??SLPQVFPNk`JQ@8Q6WEUlH/FVn_4=IB9LM8_V53X@889oH89NC2D24gn8/^4_1D?S/Xa8H0caTFLn_c; WCA92Z=5nid7WAlk@gldYK:Q/J1n_=cDhPnVbiG7> S>Ta>EL@IdK4c_d7?gHM?@G[kcS@;0;YSVI=8@@g;?73BL=UIGGoH[0U3g206?Gg jiVLm9c3VUM/]eH[FffS]QoMB^^WNUS?c_cfhjYMBjNlkmkoedR/_LO]Y?@9iN;b3UlkH @gbPmC`oWehk`Z>hC@e9^AoF2^jebj9ZX3mHiEMM=YMGPXgUS2QV[eFc9Be6IOnZ S8EfFZP??L`JO60geV0Y4KVGbd5<`Oba]UmAL4bn8iF;29Qi1a[FJT@^B7iJebZm`Y7i5=WO89VA4i9Qm2BIJc^Qe[093[=lBj0FDb YY>@NgVohAbO]aM0e]n1VS>HCd8ObV?Don`mQ0h8OdOMLB7@^;N8RkBUBm:NOYEi 4TJM3Ng]kO;O3ahlWBNWCWo0jA;O;7f;KkJb6DKHU1gaC9==DbfBdoi?iI@9DfLL ^o3/IQgD/7Vc08PV2h1TSaW2`MdPGJda]bWV4C?[9gJjRj_@jT@kSVkhkU0A5aG6 6]BHI5VACMFFTK:B=?GFYVQGBb^d3jBoVLa?V6S2U38WeA[C04^MOJbmDFhdCC4g FVj@[e7^/kaRNU/nK3YZn]clKm=gJYiK`jBl93eN_ 0C4bMbc8R/V/PS89H[>Y4d6Pj7?H_HG`6CR=N4cXK<8hY^:8`V_/G<20Q AYC7^77BiXhZ?S/45aog=o18KC5EcnO/cKZ:ZGY9i3VWZGfDQDH]JbAV2F0m3VQn 2GL_l=UgcE:FGf=A4LL=Q7gDU/nWg=m]RhW3SWP^MU_]DFh1Oo>F>L;Hi YPFcMRT2GYMTYo8[:JH6cJ14n_CWgO?YoXnj7eT=]m?c];EkIML/5[ffne9>UkLP ZaJln;OMRV14D53Wc^X1fB2MZWkIHinnfF=Q=XS7B4:/>S6An;3b/B:?AGI2TJ;: HTb[IQ@IDT]SDUJ@lC/1WIe6GVFoZXL9kHCbcljEJ]cb0XHiM`XS;BOE/[PFg4UD cYZL9W:^b4bVacVIhe4bA_haS`9EBa7F8mQDN8A@hWllb>6FMQ7RPfo7F65:@CM8 d5MiW?i9LG/nMBH0/=@OSM5FNeEB?RXO]Oc5odUbn?9Cm=QRf@g1:VHG6k<1n4a>g2hWHXOfFhn>g2 HS@82g<8]MgI@BP>4/F9C_XZYeaSYJcnP<@8>cV[Z=W9iMni8A1XF]< oNcQWl9V5U4eMETV1[]b@M/c8=VlWYCGiPYC]cf_Id3::IC0Kii`ao_i^9@MU[Q3 iTL3e23j5EF;flae7n;X]@Zm0ZD3j5j6b@RUDX;UJJ@@3462bAj3A2G<<8 W0R`aH6]PMI0Id0>81XjcbMhla@FgVDik`LF?5Nab;;P3hX5E51P=Z]HI7d_o17^ oeADa_PAkW[>Y0Vhl2BOX4ooZ1JdP>0e6eJ8[2Lljl9cB>;h_F?[_R`nI5a^]IN^^22IDo:ZG^feblNGG53ec:f kZZ5@nilZd_4a38b73IM=@D9a`VkFPKJCY 0WFbZE6MHiZWZUGj@?M0Gkm0_Ck:?LYG7iRVC;=TSFe3H;8c_W X>7S>VLhW3hQgTl071<2h6P7d6UhRY9E27TSI]dLPjWMmf=82Eio8COa03^:R9PE]bPL18ga0gmH1F;T?5gg4HNTfWVWjX h><[XY/QK;TMcPL^bdAUX^EbiG:;c4LWOYE7;;S0JQWQECUGoAonn:fooA?eGOOg fck^?[jWKOfj]Ye[ekMQXh_R>eIfojG[`=m_YPGDo]JKKogn]fnn8NbjmMgci3Q` jfajKoelOI@^elEJHb`JjfE;i5OTEN@?cElLfa9C1oX7QRobGaA^E2ne CO=?2lmG5mSVj@_m2l:M/GNl7`Hn3;eCL=Ak]>18;1?c9NBdW/k[9`oDXTYOA6FMLa8L2aZbjVWTUFjThClMfmVSa=CB>BL4ek CT^?7gSicCnlnLIkG9j^QH?U5N3@AEhg1YEkZ2kCQ5`U3l?V>eO8bfFCaJEJE8_M hk;HRJABZnQlXUU:]R3>_Q31/aiFj?Zofd]W=H]_3MLimQ827hCD>fOl4[fE2h?; ZYASg2=k_8N2gR6nJS5/=IeL2]NCj9fJWREoA7mm_D<4P3D]Y@QjbHi0V0kV4`4H NMHn>WQNgJFG3AhjM=1UgP8imLRB2`HnFCbb[WUYek/PIOA37Ob2>m0?OBBoLIeL j2dLJ;W8<[aXL^7/`^/]MeSF53gQnFGIRi;MhPl5o7e6UAgf:f74=3:mPVZ1JNXd bcA]VWFJKIYm_S[Oh]CALE5_OXGCMDJ[K=B/dZF9iHSC>BW fX>f>d_^:K^[cn?JDkK7RQl_fIWjKLZ7bJb/iU?H0bAjP:8N@;CQi2[JL42dhH1X `h5l:;N6^j1VZUZL]6Ub:9K:TjgWiHNh:kP`F>P70e^3[;P[h6M?526l7PId02a_Xf70>[H@HTAZUfC@Xm2T^ k`53n26?lB^3P;Po@3P RmfLmdY3hU5an>2J:cX[F5e5B`F[h=jk8R:NVE^B7l_f5:AU=k82;hYaAb9<2[54F^fUQFU9/DDcYND`RN[iO5c?[VSPQQUg;:CC YNVKKX9kXNN_2G/U8?;ak<;;hU@amYjZPT]9>1k>2KZ0[hW7V_6Q9EGGi[ce^^]G mD_nm9GkaPhID?ZCRCOlNZZ[eKI/g_GcOKkbl9[mmdbNmlX=1mnWidLF;9dmo?a4 85UahDeSAUiC4TeOL=fL`8AY4jXCTGb?EU@ii?YYDanni1W>YdFIKeRYLQofN__S 7Z;1BTZT^9d=?bZ05R`la`BCARGRdbeYYhIQ@[8jmD84[MWMBA_=V=EjBgfcNC6R d[NHIH9aNR_2dc_=Ql`V3>5O2BD<01lHh73U@AULJP7PnWl>h9B66^h:bVX0O9`1 949hLB:[`iSg/_TT@?__P4glPm/7lQjRoSQgoA`mbEef?8B;RgT44^R_Lclm>WH?2J5_;;0DFLcShb5c9ha:]kLZkJ55Z/MWXajOeD@d 5kZ9E?ZB0CmGGd=2=oH;[MS_iQd0ObK<7=h3OZ4E2gNXd8OmG]h;:>NlK7iQh:1l RXL8VAXbO][YYoha8HjS?:h:Qdj4f>;@eU1[:1>B@g3elC?2e@K?TREV>F@iHT7d S9P>5?jlg=2Alo918lijlK9>=X_@QBg2bFHI4obA2HX1PboCn0nU5f<8koNjf^ab LL548EUgf9ef1XN9BEED:;jb;Dc/ZR^@Nd?]Un`L6boINc>[YfgmadiO^;V3Jb6^j607b19 >PKlJ?B;g;bQGe69YYZXjFahBA4W@:DlOFjD2EL6`/oeDbPYM=EXG<;KGCDF63IE :/l@U?75CQ`QT/DA;OiXF0[REJ@46D[730]l1lB73:D?S1];cZ/RFbmBP^Dc =JBOMP4IZDg6f]I6MH[U2WX5VjO>/j`REm>[fCGZ:/_EfWZjWZfCKSE_D3MJOTk^ ]Oa4NhHlZ_fJ?6ONXKe>OZ]m@?jPODWnYYdV9kDbO8hF83j]Q:BdJVd/PM=6;Z`e8Yac?=B6e`WUR@OMR5ZV:3H[A63iQfU4h20M B1m8To:c@CSE6[aNBH_V]EPdK>h6WaHLdA@_XT5]DEG/2f/Y:9Q`a9S1RfdO_4fieh4Y7LeMCF50/N?lZPk/6_=FDnFBkRa OPQ2Qg/:XU?49_@8D4@YR5PH3hn5lL0Ym:_^:gmc=8UhTbogM5lUYk[Fc5TdJBGK 8^@aAeU`BaNH>I_Bg4oeQ]d5X8CHGfaYP?d0G_0O28i8EMRjj8L? j>n:IADRcXV?>[VQPC=465cXYJEb;heMi;[DM@MfB<2`:7AZ_XV36?Rc09`Y9`a; =5jUAa3S2ohnHC`G;JZBCCJ;aaBf1=f:C6BC5F]0E;M>?9;G7573eWcHC4UcZIYf E95niX7Z8DNj;W9OjYcPGX1elg?LeiR^=BmGmiSf>WNkofDj KBVa^TY8RKgHDN8/MYMk1i1ZmmGZ>_ENjAkKTg@KffK5U3WIKM[[N0dne_L]anAS c/oL9dgOFb9F4M5[4kT^LXO8WB9gi`Pg[3VL/Y^hE3>L/ 6mELD]U1OjDL`0jIGXm9/kYBF]XeBIjPCG=MjK[N]M6U^C@Ie7MTA^eD/05;AnI2h`[= jHRmi39SnIK;kDiSMTEAc0kP>FUgN;6B@hE38JfYGUb>MEdm_8:]?La^FGFjK0jk N3dgI3UO]LZIahfHJ0OA_:Md>ffflm03bMi1WcBdf5R=;]9FJeS``QX<2gK8FNAJ kN81Q0d8B59X/o1=H/T7OG8G?NDiQH4AhGc1dBNKVP9HchEoW_FOn10D6Ejag`9C_dFYhhc=>Xe^S4:NgfV2g6W/OF61C9 TCWDC_XhH`QF?B9f:a01KJ=JZbIRSIRJ>KC3c3LaJ1cE6TN0FjD8L5gUcLSEoW5mNi/1A?RlTa_[N? 29/CGVY7i]gMkQYBQP@6gn7Qk^E68D^4AeF/o16[D11Nia4BaN?WHRDQ5D]dE?Nn _DoEbIE?kGVhgoVk]gNgkg^Zeg/@<@lLMKg1[^Zjmld3k8[C7k3[Midi:>IV _h:/2M5oilJROOAP:782SUAn48BID dO1>IhB2mShb5TIZB[bCWM/eK:5U>9TcE]:WB^LI]T=`nn`1Mk6ef5I/kfo[KnoW ^YeN3IellJR]U0jAX`C;GCJM?1 2APIPUj?9nWF_2QP4b>G;FWEH>QX7QhNJ3GakbLA?L;:8o/S;=;1jWHidAN6]h== 5;W@;jbJ=1K4jfi7P80IT2`W8WZ8JLo_TTRG[^90WO4@D4 GE^[PZHMX:D0J6TOES/M8mK<_KAoJ>97[>2G@LMh5GCWXM/>>3FmN EiVKE[SmO;gYkk1:eEm51d<[@NU5hb80_ER9YEa7]:5f8Ag1AZPGF/KZdnPT=TVM JQVWGdUW/YT`[:nSbmG[;;OA]@R/oHjNI>6PVZ:me;BUA_f5nQheHfU8ig=jGQD3 lf28NMM8`5AR0bdJ`faITS8X0Xcb[CWH32F=CmAVf0UTmDW38VAefZ4QO=KI3U6W V?HaC;G>IHCkDI:]aSDUlN_Q`n3Nmmc/f5M73R:UJ`L^EgLc:_E?h4Al8T8X^78QRCC7Gbg7cjn `Y77>AmbHAMF3B04^JOgE=jG:;gh7>m5gYFR8GJFXWb=1iMO7kDiNBOT3/NN2f?n bQLnW`nmKGin1Z7E_QZ6NBdFl^FV_21Y:_]Q7XD7T5=colYhGPUkO=VDk[7B[:hG 5UdcWokmCTTegGUeefGGFAkPN8JZ`SK;aGe_W>j/oILJEU51b<_a2eo]>FJj^/NK DUS=@A1`a]_c?ac=Pk_7T64jnGkkmmOZfC]UcfGc?RHdh__l`PLaA5j67K^GHDOP IF@bDPRY0FVd7lR?MJRg=e N5hAb[L03^6N9QcSB:1oh/=_87KJo@ekAYXV3eABbQWCJnH[c:nYFj1_[]C^e?iX ^`ZQIjli^_E9nS>^`Ji_?IMk9nBEnDbnCodO1EZ3YJ6EXIkWV=nQ;:TTodQmkZPo0S^C3BCdI@DJB2k0Ol2S/Pch6leWS/>oe1>`Hg83g^hA< 8HgHbgdJmT;7m]fC9?Rn0]53cd^mb14T9_EZBnM7mf0hbflK53DjYMej5LdQ_ :HI_:AMi3?TRY>e8ni5TclJ@5R4mS7@4bBCU Bi4fk6=AIZ>]1WYHBBCJ>bLOfF5:BaZcam7S/lOQ5fJK3L`fje^E[Ci_ J?IHG9Hm^Y=V7Y1bY3VTj d/=8ni6nAS:c3i7[khCXTa_jmdeIMDk57 0>Wb711=iP1o>0NhOADMk>ffkgZ1XU;0=2QZWeA81Y=:ZK0]fCOJ8@GJJ^M5>mSO M/KBdJe3n[1gBB/B`i^lRbNoBf98hi2JTAHSV@0M1WBH]21]@MZ:e8X4:T>^8lGH 6dQ_8Ag6>[K3a40JQjBb@fehC0Lkf9HJ6QgR`fKY[l:I5FD76?o?3Z;/;OJ:>;k9 OR^>[n=HP?Xgf2]]1E4ba8[c1=OX>>XhU^>l`UkHFNB>IXJhf7kdH1Ai>E8MdURT jDRKTDa/?b]/VaEehbKkb1^@eE7FAShGabO8XbXaiTN=e30@H8aWZH7W0d;fL>cQ 53=BMmn78/mBMm`9R6NY=I/0lBaekDf0N9JjLRDPWZEVc@O4/mCDjH1hUQXk2A2b 3_K@LdG5dNZa2fQ/R9=MSEjj6[ed=G[YJR9S;gklb7N@Y57f@5]Y:G[/OR?MZcCJ /YNf?4mK9]2FAfW;K=Yb8ffiRKKDdYK;J4^J]TAXB`5]H@c7H__?7l`Y8nCaM6S LM1l739Q?o:3B1UA<]0XEYQ]72cPal:MYGGIlWT3:aH=^H2mQ0]O0QYN8QlSbD3@ Bb2SUg2CUg0k9o8jY>U8WDQO8fF@C6QMR>oH;78WlW:T>ZCYB:^A_THbRMOi6Zo2 b2;To1FgRaL[Aej7=9JGf4_hlOo/8`KkkgoI_ofdWUR4FMPOKS8fOX_P_1[;7cFgOiFCbZ;4=L[Vj?VO7?Hk5GM ZZhjE9^ZZBZLR3;FIQ7Ebj= HZdBC20f99^;=MhPViKTV]ii]LZ]h TYAm6m66IkR=oDQ?6o/A]3WKSOlC<7/Xg8Pk1cG>W5J?3NjK4oFcTIYKKe/i=m3J LWT/]V=V8cn1ONICcIO?W<^?=TN9IA=3h^2TkE3:d4OJ:>>iTEPgdfQb>=`kejH/72n8M50oL 6=h;KFDK/F;SNA_nZ`8k4ZO[gT=j3n6W`5?lU0?Ec]bY`8f3h^6mM5_^U8iZEf8X BBmO/F`52MC?6ikm]`aoZ5ZnPR7VHYQ@@8cCQ/DF60275HU`3441P0/ L0?V2VE^I7=dLVEQK@YUKVA_HVX:20`830P<20`830P<20`830P<20`830P<20c20`838g>20e<30P=SHg83De=R0h3W7=Vi/c<>FO>W=m0PXQbjBJBe;9XfH8E]9[N0NLEU>l_^WJEioC65@lB RIU4f^eM:biK]/2aHQZA?8Wfk/^^G=_E]S3WMdCj2Z:lWRF;5gAn<_G]?DB57[B? G0:6jN>QZd2gP`h/FKKZ^^JUi[FPK`1MNnGbA@^:A]RgPnh1GKI/`GD[/[biWh9F lg^^F[1/lK^^6nh7WECdR^GG[:86[IbX:1MddhZ[5jnhk_YOSP0mRBSkG_04O^X_ Udad;NXf6YWQ[ZAWP2mVajV5kE//H?N46?5TkA=K1K?RdjaVG/OaFRK[28;iH[W mB`]RA6?P;NIKZ6ShXoj2GZ;YU0g_BG_Y[Eb;5[FdR?R8SV>W;AB]c6m3ggN`1KZ IB?]4=WR6G52_2E^YOgR9H7IIC]m1WVKiFii6:_L[9O@Ik96JYQY1nHh`38P5obM DQZ3]a9a[a1Whb@kJ;2YY:fdEHfTn;MCgP[N1f_WgIlbb Tk[5bmQg=l[cLQ[j?h;M7QFUFk FD`DFcDWoIhed0e8nYOj0nTO23Od=X0i^lV[3jROTDn[]E:/17g0kCKIC7?4BeZU N5:l14egJPj]FbbS8aQK8S[E:9V=OU^ejG8mML_G]A9j1_@6fR3Fj@mXnk@^D;WH bAJaDk/8XgIXSCB;eYU/NSKdacm`^mE>]DW6DF>j2Y K:DYb5P9CGUYWK6BWZ=[]=OY6XKKX:fe]1jjHSf]7l:JM];gZK[5K39d698Z?9HN ;CRi/jOUo7K?[nIi:b_nROAHc9hNV]VC]mKci=3@c7Jme9SGHiCeb61FSakd_o_o =KiKFC5eI[_WBC5n@U]6k8CiKF1Nd8hIl4nalciGgef]BVJU[5` J51O3MgUDPG=JfTHi/QmbRGkH/GDin[?:ldZeL^cb_G6[4Km8Mo1l==ICn_I1JkQ aKZmd4^V_41=JF6]9hl:k8U:bf0bTNQ?W4XFeU/;7OGa3ZY:9Q?7TiIDdh_E@INX BHb/Z`giOBJc]Ech@WFe8a^5eIm6I8:/=YGdETm_UCOg_@MVVgU6mokjVn[n[7_XO6kjmoJ_bQ a]jB9gcFF^Q=__HJHU;4X/] WJk>^/kj:hZ^L:ab[JYKEKo>/JiX]FFCiMJRSDdKGA_[K5O4elE_SL/2:V/HG];X Ri]6AJ;5YS9c]7QRljR9i[8fbm]mbN?9?Z]BECfDIJf_kh32;?f3oDU;Oj[OdZmD R3H^mMDM@EI=UH3FJQ8>^n>/>Z_4>FVNgM4<3M_MX]QVl__2XO0id:FYf0J>:ld; RG5681b;bSbXM4A^S_n^bcOL_nSBkJlnmlfcXjhoCb_cEOSdo4RPcYVOkkeQa]Zk EZkJndS?VMLWgNJ_mj`e8fNhiGRbXcmQMMASeg3N`NBYY=Ym]H5]ZDeihBYFK=o;I;W@9Qe` 1Wc>e>O^F<`]lYbnP??0EiiBYcmDIV`]2gVMYES4MmO@g>9CJc0CE_0IE_;]:_Ck N0U5ACYFdG@ZfH5E`2BIEJB]E:elDjUOc@mWiODX7mHf7G3i_BjAjhW5?:UCCYoO MD0?Nl^LgU3IVNEU8Kncc8fcN/_@1oX]lPVL/cZj^FG^mLJ]aSg6gLEgVQlbmYWg 1An:?5Ql:?]YMjleKhBcY2h_?XabHbEANO:TGMP7QifaN;ibWPbM]Qb;OAd_]cHD mQK:N?TiMHTlBNNhBbPLWFV:n8]6:/LjUDcd`g^D6]DIk1lLk;LK^aiK?FGlRJmKcGGOno?>g 6ji]_V[Em5nhWJ5g7^ii8Wi^MBAbKeW097X;[D_JfmXgCGYeb_CmVoHlDV0aGg?E QEG1aUV??iYZM8D30Il7JYl?_EA2;aFd[^FBCFEK2WKikb^h9gmGhKj:Y`]joDmD I6OUV0E9ZchSim:LiCVMIJ_:e^OLUo=Xc[jb7UNfbg4VT61hiE]QFffBl/ _=1n<7@`dQ_ZSFCUfbS^=EmXRhCWZ?QdZRmYED[1>N];mUUBOAelc9@fdW]g2WEj _SdldYmhhL2;e Nn5iLmX^>Eog^Z^WmPJ3k_Si5caiaig?1X>i9GEQmh`O2o][[`V72/0JMF7o5b63 :2CK@5/Tjb ?;PlfTjSec4:86_Cj4:DoCR31jT8aHXRj13XG]2mX7]1Ie1cgZ1=H8LfQ`5T=YPl4jc4if=7GTK@Ie_G=jO6Q2nShh9NmFBPVlFJkLF75bgjK1hh?IkK`bE>J/MlEYQ ?_6>:1bR`j=3=joInR@;5JG3DRHZe7Pc=a]72bdkg=8L2KJfQ9lB[N6P_f[`ZdPT 5Q?a8m7bB4@4Bmgj[VZO4`d=iWT3DGLPh?MY6h9n_mmNQ1PfU4:nmP5lI8HH dKZD]]=X^Q=kfTK=l0O23FO3RTg`S`ZJ0D_U`do6d2RZPAl@;2SY33E@1KAB0jfd 03l=_hPYSJ7Wec@E^/RW2C@>YHUVXij=NS7:JQ@CSHEF1=ZVdRC?5RNnbZLcN//CC70_jeTI1FfKgXYQFYnLi8810IiaCk YdnMFeOkc@UG>>[f1b=>KH7eI/70i1F4_617d6IaJ77?:PSf]/6H5K57<__0e[:hRRA?NkP5VYa:<[F6[ iD7><7Q98fjPHNPm6ZLn3jM9OI]iH8l0K5<2fmSH@^EX2j?]0]0GXnl/F9eX7SEI 1Y_jLJTd`E8YY2T`CcYEDJHjFg1R0cUc/gBJZXRPdCNcYIm3RQ_Ln1Dj8Xbo<8K;0?DIaL3a/Po@G [`A^aFPcm1W6JE6c>bU^>MkAU4cdmOEUW1SIA_mPAe?2NbN/_Rm//chH2mG> GQTC9gRWmoY5]>m`JS[J5ei=37_INF?mJVENSNn _J[X^MH4nK2c=YC5:5f8V3Zld@N5aRAIQO9D1ccD;2Aj5:2gdP:n =S722ieF`;>2M1UZ7C6RU37hW^EhGooa?/_kbVnDBYZBSX@jk0Rhn11Z]I55C20? RY9GP=Z;@RaILMdXE_`/I/>BC9YA/Y;9NG7ZD>WafCaB^EXAlYVcnIbjXHIU4[c6 ];[=FVWii=YX>5EC5@b7Ccb@fSX^SV3]61e:S0n:0V4;CjP=eIn>QR]63i4kjPmh T=68/MZ[jVRk`a7?=bNd/2LBM__m8Hn61D:GG:XW;cenJD7C5l:JOPCYldinBCF[ NRP5KGn0;c[eFZ;jZcoDYZ`D>Y]fW3UbiPFCjnl]jGHl6>U7Z@]U8LXFoJSHWBid 2nSiVKKmn]6Q5?0U:>dXmAS/Xm_4C767n8ffD?^3_46Nd_mTk34UC6ob37UR:j;3 mCP76WCM0YfBnL?/nc=AB21^YeMXD[JO>G_l_;VcblL_GggeiH^_aPSnBfgS]j>c jobfcPjld@m ?@dhVSVS61m97N3DhFE4RU[Vec0oPI<]ACEc:QUFR01Z@lBHR]8EJ8lP8TXAISc4 L`JiEOFD`/mB?L8=OAW2`cb5Bn7R_TiAQRQY22OgDkPDYMR?52/`X;hKPP[]bQLRP;6LaWV<<`F`a1338HBLNMca783]@Fm cO@oT6BPKP=Uh_h6@cgCCfM:<]AHXh;>@Enlbl2j@n3W`nZZEWfnhE]3lBCS4^m< j8g<@KFOXKoR7LI0[BR5BoX:_R5a;gf9F6ZPERfWjALhieoB5lP636jAP3N1m`FM PSb3FbAmdCX4Wm31hceaVfALhSe7gG:O/[`1nPAA`j01YQ@^:DW_8`8KZ=F<7m>O ^lCL@d>_ @H;RB7ZL7^OlAYDRdBkF/??Z8OGX5XT:;F6W/bNE8]TG>:VR<3[ faC4jk2bjDmIl/<<7f;h8;a3dP76Ol9`?l=mm1oZW3:Dm80jYg@oLVA9NnTn5@m@ :odZG>8]E_W:_GReEVM5@DUgdbi`3HHBKhbZaigL/QgA_`4]feWN=QEUj0i^gdZg /dl[:95g=0?NQYO::7[OaZMBhA:jD=9^IOQ3QY_Ygm7K`7^YVU_Q4Zo3Z]L?f;]HkQXNLBfn7=Cj [fE:hA;_/T[FE@bGdIG81`aJQ/aDj1LR49NVYf;o4EUdG>iK@k??c_CHcKce5XT[:k6c/8MYj;D ;:K>I`Tc6Io>gWhNSio6L2ZbK8WoUE3S9Z]k2kNR`/oUV32AHmH4iXcW:3H^8g/L M2ma?YCMFf1GYIdF7Slf@heU2JY5h/]@`BJFdlR`PF4m`m7@lG2<7lfJ79FI@O4T ha9O0BY2eG3_1<7k5[CJ@cW36?N98T^D>7=Y7ho`g/=lET:Z En/>A28eA`2cZSPFH5oe/`@O@bm3_XWI6Q;jd;V_Rkg22Be:O?fTNFGL^aCjST1J :E<:UoSJBLm@`Sb5Bm`OJ[efQW`k8a=AgkL6@nBe/:hjK@Y:N74nKWX3]C[o2YO` /oC>lUQ6;^b_CYB24[XO1]T6@`VYRVO>m3Nc3]AHRAkY]A/L0A@^lE>m1O/=oR=? hF;hYViAoRolAomJJgLRKOdK5l@7mPYUKVAcM79UHFd:IFiTKf9Z2S8c830PKf9Z 2S@i=S@:IFiTKf9Z2S8d830PKf9Z2S`l82mDNG1U82m6KfidA6EcHg9YL7A_LR0_ @G=SIFid83Le=20_@f5`B6EYIfQd83Dh=b0_A6EcHfE^M20]B0g=S@PEdP;dI_KWA>HFeU82m@ED=I EeD[@fmeLVUULR0_BGAQK6US@FiWK6DP<20_DgAUKEH:=cHP;deQN5MYI7AX83Pb EP3@lGl^^YjY36AC3]o oNH_FeYboXSee88_ENmgcZJjP?FERgM4F_3JRU_XEjnZI5lj]a6Qo4Se1?eEF_Z4nO V_0k0O8 1CknUh10VQeeH7a[3 WU0C6^GM`BSi=Q:ib0UkhWCd?U]/9mN8^m0AgX`?hQ0^AQ<>f@J/]1C^a]J`=k1gZl9AaV^dSOH4AmTH5n:XSK68 ?KF`ShLEPg79]eXD=XLoQ2=h0PFQ=V`?>GPhJVFObd8h>[0S=:36dV4]CZ0[M5XO:o1HN91c _@_[dA[M4JJ7iZPHOe86VXR8?hTgmcaD1S5_AmQW4d[S8ohTOG1;EIg9_J8f^HZ^FJ2;VHUDZ?liVo_B@KO:IAS>BSVABD/`i]mS6L:m]a>j@@R7O Zo2P]JCF[^WU_5fEd]FWdn?;Th=maQn k_QkL^JTZElinOaS8Bo];9h_WKWg/oMoN^5IciaC]DVU^nRLJ^Ul[_?Ie<3?;6Y? R>8>e?;WOkX]i165IXkkERC4G5@P3lQj=o/QcZ1W97dcLE;X0lbN=ogb:nJNNN6R FaKO/60aFnR_JkgO9OoS;f>OdQf]2E=`2RaDLc7VB an8J<^ObI5ThAo`HlJ=A@fJDV7;QR324kbBL8Fdh_T[k<9a;?5gbD?EI9Z]kFQR/ Z2EQ4?>@Q19a;U/H:=oR<02GdE8/?iL]564f/KoT@[GX5`[hCX@FC/DNJOVbWJ;n nn8R]/T;^NRTGih/;U/hFG:>l2AQM^S5VbhAFTSSklRVU^JJFnm GCIlR[k4hoP4mm=bG9KSn3URa:MgLEc4icDTfTfbl 3kk0EQlZgQ5lP9?HjXPdU`g_hadDT7]Og7_hVccNTnJbhJlHB7bGeLS`5h`W_X>g FGdC]CC9a[[k4llWgcjW=hE_n0k3HLUoY]eh`kSeSl93`]lSWla1o4hI>BS>IL=_ IOV=V0>/OeNUNDiU;WFkJ_dK6KnKS7]E>/[7OUehF_jHdEnA?PShCK^3/?3TWlXg2[LPQoh>ADJ=_/iaD>HAMb4 ko]m`;OWefES;ONmlP2oN_b/>1Xfh7]T4j6aA[W7MfBiWcOe15[^EkceO/_Pfk8g hck]JDO3_GifL@l[gG1jgj=CjK8a5ak]K^4gQHgh1[dCeU__ffGSehEkOEdkNigf a9fhPe`R=5I=]joUF8aiiHg7^_XeC:Mm=KIALmUHaoeT[53LiFZaS=lR?_iUdU`f eWF?MK>`3SOQI=[[<8JLblKNgGhS^[SnQQ]HnG?YLH=FaFG3mCR?F<]_=CnK]Gjk HH5j[L6Gi5fSEIR?jiRa1?[ASTeUheO5MMXic/J[/k4_EZ]_0oS k_4aEFFREbVcEf:@k/<[IK]2oEnNlKQLW8o5^>[NMRk6J[gVB[]D4NI8_TBkoH]Z ?e/h2n?HhV9IIg[M`Pc95nU>V:hkJiZH2gF;CLg4W/[L6ln7[g/5emFcDj7fTc?J I4E`Rf6Bl7c5VBRL81`_7Fkd3]RV9VdC0P``f@Ma7c?HcARZBiK2S9d;Qcnk3B9gcknGOI^;MjI]IK0YUKVA_HVX:3UM82m6KfidCV5]IB0_C5U6EEIB:d=_MG9YIG8P;dUdHFaYHd5^IfaU830P ;e=dIFeF2SLf82m=HGQGJFAdJ20hLY4OaLT3H5QKB?62 e[S`f`N8Li5BK<734fS8`<3P`=30h30e830`<30`86hP2S0`<30` <30`B0`<30`<21^80X`<30`<30b>3Dd830`<30`86hP2S0`<30` <320`<30`<21^80X`<30`<30c>CDb830` <30`86hP2S0`<30`3TP<30`<30PKR0:<30`<30b3@f830`<30`86hP2S0`<30`C20`<30`<21^80X`<30`<38iCTd=B0`<30`<21^80X`<30`<3CLP<30`<30PKR0:M79QJFaULPXl?20_DfUjIB0cFHf=3UQIV4d>6ERISURISIT=38g =68n85dP?Sh:LgAQLWAhLVEV2S"], "Graphics", ImageSize->{379., 417.9375}, ImageMargins->{{0., 0.}, {0., 13.5625}}], Cell[TextData[{ StyleBox["Figure 2. ", "SB"], "Notebooks (1) allow users to visualize, write and prototype programs for \ network manipulation or analysis in an interactive manner. The programs \ interact with the network through a UPVN Package (2), which implements the \ basic functions, such as data and type conversion to interact with \ Mathematica. The UPVN Package communicates through web services (3) with ACs, \ such as a topology AC (4). Through the same interface (2), asynchronous \ interaction is handled. Java middleware takes care of the updates in the \ MathKernel (5) through MathLink (6). Notebooks can update or programs can \ adapt the network in a continuous cycle with Dynamics." }], "NumberedFigureCaption", CellChangeTimes->{{3.416659954041294*^9, 3.416659971646822*^9}, 3.416660008761888*^9, {3.416819384332294*^9, 3.416819416849841*^9}, { 3.417369996487113*^9, 3.41736999928832*^9}, {3.417428169762226*^9, 3.4174282067634172`*^9}}, CellTags->"Fig 2"], Cell["\<\ We have built a test bed to conduct experiments and to validate the UPVN \ model [2] on a real network. In the test bed, ACs act and operate on physical \ resources. Because an application interact with the network through NCs, \ simulated or real network behavior is transparent to it. Therefore, \ simulating a network, which would otherwise be difficult to setup or build \ physically, can be useful in prototyping adaptation algorithms for example. \ However, as in any simulation environment care should be taken when making \ assumptions.\ \>", "Text", CellChangeTimes->{3.417369982803359*^9}] }, Open ]], Cell[CellGroupData[{ Cell["Network Modelling", "Section", CellChangeTimes->{{3.416669339744676*^9, 3.416669343740589*^9}, { 3.4171418899415913`*^9, 3.417141890686965*^9}, {3.417255895734552*^9, 3.417255899891324*^9}}], Cell["\<\ For any visualization, analysis or adaptation problem there is an underlying \ model that transforms the measured properties into a useful representation. \ It is not necessary to model all the intricate details and the full scope of \ the network for the representation to be useful and the scope of what control \ is limited by what can be successfully managed. For example, a large \ collection of NEs can be load-balanced to macroscopic network properties such \ as throughput. However, when adapting NEs to service requirements of many \ applications at once the amount of NEs under control of one application will \ be relatively small. \ \>", "Text", CellChangeTimes->{ 3.417141906572446*^9, 3.4173700156817827`*^9, {3.4174227972175617`*^9, 3.417422826683796*^9}, {3.417422865094136*^9, 3.417422957416215*^9}}], Cell["\<\ In many adaptation problems, knowing the current topology is a primary \ requirement. This information can be static and provided as input, discovered \ or a combination of both, and the UPVN may facilitate different methods of \ retrieval. A basic discovery strategy consists of three parts, which may be \ combined to improve efficiency.\ \>", "Text"], Cell["\<\ 1.\tDiscover connected NEs 2.\tQuery NEs for neighbors 3.\tConstruct Mathematica representation\ \>", "Text", CellChangeTimes->{ 3.41714198978378*^9, {3.417423002354828*^9, 3.417423004310563*^9}}], Cell["\<\ Reachable NEs can be found by a breadth-first search. To support the \ breadth-first search, every NE in the UPVN test bed provides a topology AC, \ which implements neighbor discovery with Nmap [8]. By scanning the UPVN web \ services port, it also detects if a NE offers AC functions. Another topology \ AC function takes the discovered NEs as input and queries their IP links. \ When needed, a conversion routine translates the IP addresses to id\ \[CloseCurlyQuote]s and back. With these functions, the full IP topology can \ be discovered and used in Mathematica. The code snippet below shows the \ breadth-first search code and illustrates how the network calls are embedded.\ \ \>", "Text", CellChangeTimes->{ 3.417370061786989*^9, {3.4174145171666403`*^9, 3.417414518518875*^9}, 3.417423015454976*^9, {3.417423058850873*^9, 3.4174230721755037`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"BFSDiscover", "[", "start_", "]"}], ":=", RowBox[{"Module", "[", "\[IndentingNewLine]", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"q", "=", RowBox[{"{", "}"}]}], ",", RowBox[{"u", "=", "start"}], ",", RowBox[{"result", "=", RowBox[{"{", "start", "}"}]}], ",", "vall"}], "}"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"q", "=", RowBox[{"Append", "[", RowBox[{"q", ",", "u"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"While", "[", RowBox[{ RowBox[{ RowBox[{"Length", "[", "q", "]"}], ">", "0"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"u", "=", RowBox[{"q", "[", RowBox[{"[", "1", "]"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"q", "=", RowBox[{"Delete", "[", RowBox[{"q", ",", "1"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"vall", "=", RowBox[{"Remote", "[", RowBox[{ "u", ",", "\"\\"", ",", "\"\<\>\"", ",", "auth"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"vall", "=", RowBox[{"ToExpression", "[", RowBox[{"StringReplace", "[", RowBox[{"vall", ",", RowBox[{"{", RowBox[{ RowBox[{"\"\<[\>\"", "\[Rule]", "\"\<{\>\""}], ",", RowBox[{"\"\<]\>\"", "\[Rule]", "\"\<}\>\""}]}], "}"}]}], "]"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"Do", "[", "\[IndentingNewLine]", RowBox[{ RowBox[{"If", "[", RowBox[{ RowBox[{"Not", "[", RowBox[{"MemberQ", "[", RowBox[{"result", ",", RowBox[{"vall", "[", RowBox[{"[", "i", "]"}], "]"}]}], "]"}], "]"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"result", "=", RowBox[{"Append", "[", RowBox[{"result", ",", RowBox[{"vall", "[", RowBox[{"[", "i", "]"}], "]"}]}], "\[IndentingNewLine]", "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"q", "=", RowBox[{"Append", "[", RowBox[{"q", ",", RowBox[{"vall", "[", RowBox[{"[", "i", "]"}], "]"}]}], "]"}]}], ";"}]}], "]"}], ",", "\[IndentingNewLine]", RowBox[{"{", RowBox[{"i", ",", "1", ",", RowBox[{"Length", "[", "vall", "]"}]}], "}"}]}], "]"}], ";"}]}], "\[IndentingNewLine]", "]"}], ";", "\[IndentingNewLine]", "result"}]}], "\[IndentingNewLine]", "]"}]}], ";"}]], "Input", CellChangeTimes->{ 3.417142041269497*^9, {3.417142123498022*^9, 3.417142160233089*^9}, { 3.417142198306286*^9, 3.417142219904202*^9}}], Cell["\<\ DiscoverNetworkElements finds the neighbor UPVN NEs of the calling NE. Remote \ is a special function in the topology AC. It calls a remote web service from \ the host it executes on. This way, the AC supports a recursive search from a \ single NE. Note that disconnected elements will not be found. The web service \ calls return strings and need to be converted to the correct Mathematica data \ types. Type conversion can be abstracted away from the programmer in the NCs.\ \ \>", "Text", CellChangeTimes->{{3.4171420579817142`*^9, 3.4171420713070917`*^9}, { 3.417142232424884*^9, 3.4171422838625402`*^9}, {3.417142319565752*^9, 3.4171423401411867`*^9}, {3.417370044783057*^9, 3.4173700462742367`*^9}, 3.417414508125391*^9, {3.417423083106081*^9, 3.41742312258794*^9}}, CellTags->"Fig3"], Cell["\<\ Once the network topology is acquired and a representation is constructed, \ the full range of Mathematica\[CloseCurlyQuote]s environment becomes \ available for network visualization, analysis and adaptation. We consider two \ common categories for network related problem solving. The first category \ uses combinatorial methods. Mathematica\[CloseCurlyQuote]s Combinatorica \ Package provides many combinatorial algorithms that can be applied without \ modification. The second category uses a trial and error approach. It uses \ historical data to converge to an (sub-) optimum and requires a continuous \ cycle of monitoring, analysis and adaptation. In addition, visualization of \ information flows and network configurations can aid in problem solving.\ \>", "Text", CellChangeTimes->{ 3.417370076620152*^9, {3.417423139447757*^9, 3.417423140379958*^9}}], Cell[CellGroupData[{ Cell["Network Manipulation", "Subsection", CellChangeTimes->{{3.4171424094577227`*^9, 3.417142419124264*^9}, { 3.417255956165999*^9, 3.417255958463368*^9}}], Cell["These packages are req\tuired:", "Text", CellChangeTimes->{{3.4172855141322308`*^9, 3.4172855269737062`*^9}}], Cell[BoxData[{ RowBox[{"Needs", "[", "\"\\"", "]"}], "\n", RowBox[{"Needs", "[", "\"\\"", "]"}]}], "Input", CellChangeTimes->{{3.417282655941579*^9, 3.4172826752766542`*^9}, { 3.417282794616454*^9, 3.41728279566488*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{"network", "=", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.1\>\"", ",", "\"\<139.63.145.94\>\""}], "}"}], ",", "101."}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.1\>\"", ",", "\"\<192.168.0.2\>\""}], "}"}], ",", "95.9"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.1\>\"", ",", "\"\<192.168.0.3\>\""}], "}"}], ",", "94.5"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.1\>\"", ",", "\"\<192.168.0.4\>\""}], "}"}], ",", "95.8"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.1\>\"", ",", "\"\<192.168.0.5\>\""}], "}"}], ",", "96"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.1\>\"", ",", "\"\<192.168.0.6\>\""}], "}"}], ",", "95.6"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.2\>\"", ",", "\"\<192.168.1.2\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.2\>\"", ",", "\"\<192.168.2.2\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.1.2\>\"", ",", "\"\<192.168.2.2\>\""}], "}"}], ",", "98.9"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.2\>\"", ",", "\"\<192.168.0.3\>\""}], "}"}], ",", "99.9"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.2\>\"", ",", "\"\<192.168.0.4\>\""}], "}"}], ",", "99."}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.2\>\"", ",", "\"\<192.168.0.5\>\""}], "}"}], ",", "97.6"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.2\>\"", ",", "\"\<192.168.0.6\>\""}], "}"}], ",", "101"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.1.2\>\"", ",", "\"\<192.168.1.1\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.1.2\>\"", ",", "\"\<192.168.1.3\>\""}], "}"}], ",", "99.6"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.1.2\>\"", ",", "\"\<192.168.1.4\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.2.2\>\"", ",", "\"\<192.168.2.1\>\""}], "}"}], ",", "99.7"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.2.2\>\"", ",", "\"\<192.168.2.3\>\""}], "}"}], ",", "101"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.2.2\>\"", ",", "\"\<192.168.2.4\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.3\>\"", ",", "\"\<192.168.1.1\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.3\>\"", ",", "\"\<192.168.0.4\>\""}], "}"}], ",", "99.7"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.3\>\"", ",", "\"\<192.168.0.5\>\""}], "}"}], ",", "99.9"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.3\>\"", ",", "\"\<192.168.0.6\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.1.1\>\"", ",", "\"\<192.168.1.3\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.1.1\>\"", ",", "\"\<192.168.1.4\>\""}], "}"}], ",", "99.8"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.4\>\"", ",", "\"\<192.168.0.5\>\""}], "}"}], ",", "101"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.4\>\"", ",", "\"\<192.168.0.6\>\""}], "}"}], ",", "101"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.5\>\"", ",", "\"\<192.168.2.1\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.0.5\>\"", ",", "\"\<192.168.0.6\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.2.1\>\"", ",", "\"\<192.168.2.3\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.2.1\>\"", ",", "\"\<192.168.2.4\>\""}], "}"}], ",", "99.9"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.1.3\>\"", ",", "\"\<192.168.1.4\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.1.4\>\"", ",", "\"\<192.168.2.4\>\""}], "}"}], ",", "100"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\"\<192.168.2.4\>\"", ",", "\"\<192.168.2.3\>\""}], "}"}], ",", "100"}], "}"}]}], "}"}]}], ";"}], "\[IndentingNewLine]", RowBox[{"GraphPlot", "[", RowBox[{ RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}], "\[Rule]", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "[", RowBox[{"[", "2", "]"}], "]"}]}], ",", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}]}], "}"}], ")"}], "&"}], "/@", "network"}], ",", " ", RowBox[{"VertexLabeling", "\[Rule]", "True"}], ",", " ", RowBox[{"EdgeLabeling", "\[Rule]", "True"}], ",", RowBox[{"ImageSize", "\[Rule]", RowBox[{"{", RowBox[{"640", ",", "400"}], "}"}]}]}], "]"}]}], "Input", CellChangeTimes->{{3.4171426725772743`*^9, 3.4171427261536093`*^9}, { 3.4171427611759787`*^9, 3.417142810154524*^9}, {3.417144542878928*^9, 3.417144574786874*^9}, {3.41728511114438*^9, 3.4172851184955*^9}}], Cell[BoxData[ GraphicsBox[ TagBox[GraphicsComplexBox[{{3.355718075907042, 1.4343512509293745`}, { 4.685083240360878, 1.4340235602311477`}, {2.0258250505094373`, 1.4352851585025366`}, {2.3688153600210793`, 1.9446657064926112`}, { 2.9076566159109642`, 1.7118947559570796`}, {2.3681916639691005`, 0.9256183252683435}, {2.907558955839531, 1.1585149692756866`}, { 0.7842560613621702, 1.9774879119890953`}, {0.7835570588428356, 0.8919516211290686}, {1.017374718797658, 2.6165861527725562`}, { 0.16492846699320984`, 2.868985952964411}, {0., 2.0796608540475034`}, { 1.0172162400026101`, 0.2533011275436221}, {0.16484931735255315`, 0.}, { 0.0010803370459313566`, 0.789799229651433}}, { {RGBColor[0.5, 0., 0.], {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["101.`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{1, 2}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["95.9`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{1, 3}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["94.5`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{1, 4}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["95.8`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{1, 5}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["96", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{1, 6}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["95.6`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{1, 7}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{3, 8}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{3, 9}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["99.9`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{3, 4}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["99.`", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{3, 5}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["97.6`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{3, 6}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["101", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{3, 7}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{4, 10}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["99.7`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{4, 5}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["99.9`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{4, 6}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{4, 7}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["101", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{5, 6}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["101", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{5, 7}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{6, 13}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{6, 7}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["98.9`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{8, 9}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{8, 10}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["99.6`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{8, 11}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{8, 12}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["99.7`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{9, 13}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["101", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{9, 14}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{9, 15}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{10, 11}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["99.8`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{10, 12}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{11, 12}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{12, 15}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{13, 14}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["99.9`", StripOnInput -> False], TraditionalForm]], { 0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{13, 15}]}, {Arrowheads[{{0.5, 0.5, GraphicsBox[{ GrayLevel[0], InsetBox[ BoxData[ FormBox[ StyleBox["100", StripOnInput -> False], TraditionalForm]], {0, 0}, ImageScaled[{0.5, 0.5}], Automatic, None, Background -> GrayLevel[1]]}]}, {0, 0}}], ArrowBox[{15, 14}]}}, {InsetBox[ FrameBox["\<\"192.168.0.1\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 1], InsetBox[ FrameBox["\<\"139.63.145.94\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 2], InsetBox[ FrameBox["\<\"192.168.0.2\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 3], InsetBox[ FrameBox["\<\"192.168.0.3\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 4], InsetBox[ FrameBox["\<\"192.168.0.4\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 5], InsetBox[ FrameBox["\<\"192.168.0.5\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 6], InsetBox[ FrameBox["\<\"192.168.0.6\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 7], InsetBox[ FrameBox["\<\"192.168.1.2\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 8], InsetBox[ FrameBox["\<\"192.168.2.2\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 9], InsetBox[ FrameBox["\<\"192.168.1.1\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 10], InsetBox[ FrameBox["\<\"192.168.1.3\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 11], InsetBox[ FrameBox["\<\"192.168.1.4\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 12], InsetBox[ FrameBox["\<\"192.168.2.1\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 13], InsetBox[ FrameBox["\<\"192.168.2.3\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 14], InsetBox[ FrameBox["\<\"192.168.2.4\"\>", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], 15]}}], Annotation[#, VertexCoordinateRules -> {{3.355718075907042, 1.4343512509293745`}, { 4.685083240360878, 1.4340235602311477`}, {2.0258250505094373`, 1.4352851585025366`}, {2.3688153600210793`, 1.9446657064926112`}, { 2.9076566159109642`, 1.7118947559570796`}, {2.3681916639691005`, 0.9256183252683435}, {2.907558955839531, 1.1585149692756866`}, { 0.7842560613621702, 1.9774879119890953`}, {0.7835570588428356, 0.8919516211290686}, {1.017374718797658, 2.6165861527725562`}, { 0.16492846699320984`, 2.868985952964411}, {0., 2.0796608540475034`}, { 1.0172162400026101`, 0.2533011275436221}, {0.16484931735255315`, 0.}, { 0.0010803370459313566`, 0.789799229651433}}]& ], AspectRatio->Automatic, FrameTicks->None, ImageSize->{640, 400}, PlotRange->All, PlotRangePadding->Scaled[0.1]]], "Output", CellChangeTimes->{{3.417142763216807*^9, 3.417142810347082*^9}, { 3.41714456700283*^9, 3.4171445752496367`*^9}, 3.41725648194629*^9, 3.417283729759729*^9, {3.417285113699861*^9, 3.417285119144073*^9}, 3.417285530710644*^9, 3.417287502892912*^9, 3.41728753883959*^9, 3.417287916677951*^9, 3.4173315667633257`*^9, 3.417417726324771*^9}] }, {2}]], Cell[TextData[{ StyleBox["Figure 3. ", "SB"], "The right edge of the UPVN test bed connects to the Internet, and allows \ network discovery from any UPVN NE that knows the address of this gateway. \ The edge weights were obtained by performing a bandwidth probe on the \ discovered IP links. The topology AC uses Iperf [10] for performance \ measurements." }], "NumberedFigureCaption", CellChangeTimes->{{3.417280124486176*^9, 3.41728016320228*^9}, { 3.417280205933116*^9, 3.417280226104101*^9}, {3.417280280900552*^9, 3.417280281518915*^9}, {3.417370151863769*^9, 3.417370153118905*^9}, { 3.417424477358592*^9, 3.417424477404233*^9}}, CellTags->"Fig4"], Cell["\<\ Consider the network given by Figure 3. It shows the discovered IP topology \ of the UPVN test bed together with results of bandwidth measurements. Now, \ with the aid of the Combinatorica Package it is possible to route traffic in \ exotic ways. For example, to broadcast a stream to all nodes in a network the \ minimum spanning tree can be used. The result of the calculation can be \ configured in the network in various ways. In the test bed, it was done by \ tagging application traffic and adding forwarding rules for the tags. The \ following code shows some examples and how forwarding rules are generated and \ fed to the appropriate NCs.\ \>", "Text", CellChangeTimes->{{3.417142423494989*^9, 3.4171424345304213`*^9}, { 3.417142494158011*^9, 3.41714250254525*^9}, 3.417280082055703*^9, { 3.417282470370369*^9, 3.417282473489114*^9}, {3.417282676726171*^9, 3.417282682659567*^9}, {3.4172827191797943`*^9, 3.417282785049432*^9}, { 3.417283600495905*^9, 3.4172836313885508`*^9}, {3.417288838257262*^9, 3.417288857923794*^9}, 3.4173700975674334`*^9, {3.417370130517633*^9, 3.4173701379018927`*^9}, {3.417423162802134*^9, 3.4174231674592543`*^9}, { 3.417424479802102*^9, 3.4174244798803177`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"(*", RowBox[{ "Convert", " ", "between", " ", "NE", " ", "address", " ", "and", " ", "Mathematica", " ", "representation"}], " ", "*)"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"NEtable", "=", RowBox[{"Apply", "[", RowBox[{"Union", ",", RowBox[{ RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "&"}], "/@", "network"}]}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"NE2Index", "[", "nes_", "]"}], ":=", RowBox[{ RowBox[{ RowBox[{ RowBox[{ RowBox[{"Position", "[", RowBox[{"NEtable", ",", "#"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}], "&"}], "/@", "nes"}]}], "\[IndentingNewLine]", RowBox[{ RowBox[{"IndexToNE", "[", "is_", "]"}], ":=", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"NEtable", "[", RowBox[{"[", "#", "]"}], "]"}], ")"}], "&"}], "/@", "is"}]}]}]}]], "Input", CellChangeTimes->{{3.417284983610474*^9, 3.417284984855404*^9}, { 3.417285016829958*^9, 3.417285028453391*^9}, {3.41728506597543*^9, 3.4172850731562853`*^9}, {3.41728517612134*^9, 3.417285244143714*^9}, { 3.417285283633451*^9, 3.417285289870694*^9}, {3.41728532119034*^9, 3.417285323597172*^9}, {3.417285363839225*^9, 3.417285365716322*^9}, { 3.417285401443594*^9, 3.4172854310752172`*^9}, {3.417285470938497*^9, 3.417285480810602*^9}, {3.417286922770068*^9, 3.417286936574697*^9}}], Cell["\<\ In the network of Figure 4. it is trivial to find articulation vertices. \ \>", "Text", CellChangeTimes->{{3.4172855448867283`*^9, 3.417285672986382*^9}, { 3.417286760804428*^9, 3.417286762575343*^9}, 3.4172868407739267`*^9}], Cell[BoxData[ RowBox[{ RowBox[{"(*", " ", RowBox[{ "Quick", " ", "conversion", " ", "from", " ", "NE", " ", "addresses", " ", "to", " ", "Combinatorica", " ", "graph"}], " ", "*)"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"myg", "=", RowBox[{ RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "&"}], "/@", "network"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"myg2i", "=", RowBox[{ RowBox[{ RowBox[{"NE2Index", "[", "#", "]"}], "&"}], "/@", "myg"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"g", "=", RowBox[{"EmptyGraph", "[", RowBox[{"Length", "[", "NEtable", "]"}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"g", " ", "=", " ", RowBox[{"AddEdge", "[", RowBox[{"g", ",", RowBox[{"myg2i", "[", RowBox[{"[", "i", "]"}], "]"}]}], "]"}]}], ",", RowBox[{"{", RowBox[{"i", ",", "1", ",", RowBox[{"Length", "[", "myg2i", "]"}]}], "}"}]}], "]"}], ";"}]}]}]], "Input", CellChangeTimes->{{3.41728758048816*^9, 3.417287582245419*^9}, { 3.4172876145565977`*^9, 3.417287622356729*^9}, {3.417287655187303*^9, 3.417287795081161*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"IndexToNE", "[", RowBox[{"ArticulationVertices", "[", "g", "]"}], "]"}]], "Input", CellChangeTimes->{{3.4172836902157993`*^9, 3.417283705170373*^9}, { 3.417285491216198*^9, 3.417285500607551*^9}}], Cell[BoxData[ RowBox[{"{", "\<\"192.168.0.1\"\>", "}"}]], "Output", CellChangeTimes->{ 3.417283732694086*^9, 3.4172855008975973`*^9, 3.4172875092920723`*^9, 3.4172876278770247`*^9, 3.4172876734163218`*^9, {3.417287745040037*^9, 3.417287754064744*^9}, 3.417287797822795*^9, 3.417287924301228*^9, 3.417331572843669*^9, 3.417417738916565*^9}] }, Open ]], Cell["\<\ Now generate the minimum spanning tree and show the NC calls to configure the \ network.\ \>", "Text", CellChangeTimes->{{3.417285689975593*^9, 3.417285718745072*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{"mst", "=", RowBox[{ RowBox[{ RowBox[{"IndexToNE", "[", "#", "]"}], "&"}], "/@", RowBox[{"Edges", "[", RowBox[{"MinimumSpanningTree", "[", "g", "]"}], "]"}]}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"Remote", "[", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], ",", "\"\\"", ",", " ", RowBox[{"\"\\"", "<>", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}]}]}], " ", "]"}], "&"}], "/@", "mst"}]}], "Input", CellChangeTimes->{{3.41728585605905*^9, 3.417285898198348*^9}, { 3.417285963039865*^9, 3.417285994700224*^9}, {3.417286035766802*^9, 3.417286039707649*^9}, {3.417286313313183*^9, 3.417286357676835*^9}}], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"Remote", "[", RowBox[{"\<\"139.63.145.94\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.0.1\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.0.1\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.0.2\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.0.1\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.0.3\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.0.1\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.0.4\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.0.1\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.0.5\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.0.1\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.0.6\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.0.2\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.1.2\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.0.2\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.2.2\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.1.1\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.1.2\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.1.2\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.1.3\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.1.2\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.1.4\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.2.1\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.2.2\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.2.2\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.2.3\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.2.2\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"green:192.168.2.4\"\>"}], "]"}]}], "}"}]], "Output", CellChangeTimes->{ 3.417285899004806*^9, {3.417285975036354*^9, 3.417285995279608*^9}, 3.4172860406699467`*^9, {3.41728632333355*^9, 3.417286358059992*^9}, 3.417287802302374*^9, 3.417287927131282*^9, 3.4173315746418257`*^9, 3.417417742906665*^9}] }, Open ]], Cell["\<\ When special joined paths are required, for video streaming for example, we \ can define a domain specific language (DSL) to specify the required paths and \ then join these paths if there is overlap.\ \>", "Text", CellChangeTimes->{{3.417330967684312*^9, 3.417331086427567*^9}, { 3.417331151043103*^9, 3.417331151946742*^9}, {3.417331670945084*^9, 3.417331671608076*^9}, {3.417423186614352*^9, 3.417423197772319*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"MakeTuples", "[", "l_List", "]"}], ":=", RowBox[{"Thread", "[", RowBox[{"{", RowBox[{ RowBox[{"Part", "[", RowBox[{"l", ",", RowBox[{"1", ";;", RowBox[{"-", "2"}]}]}], "]"}], ",", RowBox[{"Rest", "[", "l", "]"}]}], "}"}], "]"}]}], "\[IndentingNewLine]", "\[IndentingNewLine]", RowBox[{"(*", " ", RowBox[{ "This", " ", "function", " ", "joins", " ", "paths", " ", "given", " ", "as", " ", "a", " ", "list", " ", "of", " ", "route", " ", RowBox[{"statements", ".", " ", "A"}], " ", "real", " ", "DSL", " ", "can", " ", "implement", " ", "a", " ", "range", " ", "of", " ", "algebraic", " ", "path", " ", RowBox[{"functions", "."}]}], " ", "*)"}]}], "\[IndentingNewLine]", RowBox[{ RowBox[{"JoinPhts", "[", RowBox[{"g_", ",", "prog_", ",", "col_"}], "]"}], ":=", RowBox[{ RowBox[{ RowBox[{"Remote", " ", "[", RowBox[{ RowBox[{ RowBox[{"IndexToNE", "[", RowBox[{"{", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "}"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}], ",", "\"\\"", ",", RowBox[{"\"\\"", "<>", RowBox[{ RowBox[{"IndexToNE", "[", RowBox[{"{", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}], "}"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}]}]}], "]"}], "&"}], "/@", RowBox[{"(", RowBox[{ RowBox[{"Flatten", "[", RowBox[{ RowBox[{ RowBox[{ RowBox[{"MakeTuples", "[", "#", "]"}], "&"}], "/@", RowBox[{"(", RowBox[{ RowBox[{ RowBox[{ RowBox[{"Method", "[", RowBox[{"g", ",", RowBox[{ RowBox[{"NE2Index", "[", RowBox[{"{", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "}"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}], ",", RowBox[{ RowBox[{"NE2Index", "[", RowBox[{"{", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}], "}"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}]}], "]"}], "/.", RowBox[{"#", "[", RowBox[{"[", "3", "]"}], "]"}]}], "&"}], "/@", "prog"}], ")"}]}], ",", "1"}], "]"}], "//", "Union"}], ")"}]}]}]}], "Input", CellChangeTimes->{{3.4173299434306*^9, 3.417329994078745*^9}, { 3.417330024544283*^9, 3.4173302050006227`*^9}, {3.4173302771312933`*^9, 3.417330285786434*^9}, {3.417330390086697*^9, 3.417330463992763*^9}, { 3.417330527124688*^9, 3.41733055273421*^9}, {3.417330585343581*^9, 3.4173305878121853`*^9}, {3.4173306742139177`*^9, 3.417330702371912*^9}, { 3.4173308126770687`*^9, 3.417330917325941*^9}, {3.4173311049579782`*^9, 3.417331188355781*^9}, {3.4173312551677713`*^9, 3.417331376293374*^9}, { 3.4173314538609324`*^9, 3.4173315296412487`*^9}, {3.417331698264297*^9, 3.417331699844989*^9}, {3.417414875056549*^9, 3.417414880620122*^9}, { 3.417417775948354*^9, 3.417417783870257*^9}}], Cell["\<\ The program defines a list of routes and the method of path finding. All the \ paths will be collected and double edges removed. The resulting edges can be \ configured in the network with the same tagging facility as above.\ \>", "Text", CellChangeTimes->{{3.4173317138834333`*^9, 3.4173317922632093`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"JoinPhts", "[", RowBox[{"g", ",", RowBox[{"{", "\[IndentingNewLine]", RowBox[{ RowBox[{"Route", "[", RowBox[{"\"\<192.168.0.2\>\"", ",", "\"\<192.168.2.3\>\"", ",", RowBox[{"Method", "\[Rule]", "ShortestPath"}]}], "]"}], ",", "\[IndentingNewLine]", RowBox[{"Route", "[", RowBox[{"\"\<192.168.0.2\>\"", ",", "\"\<192.168.2.4\>\"", ",", RowBox[{"Method", "\[Rule]", "ShortestPath"}]}], "]"}]}], "\[IndentingNewLine]", "}"}], ",", "\"\\""}], "]"}]], "Input", CellChangeTimes->{{3.417331335539874*^9, 3.417331348496497*^9}, { 3.4173314016743193`*^9, 3.4173314406310368`*^9}, {3.417331637525696*^9, 3.417331657610775*^9}, {3.417417804900529*^9, 3.41741783836907*^9}}], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"Remote", "[", RowBox[{"\<\"192.168.0.2\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"blue: 192.168.2.2\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.2.2\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"blue: 192.168.2.3\"\>"}], "]"}], ",", RowBox[{"Remote", "[", RowBox[{"\<\"192.168.2.2\"\>", ",", "\<\"AddForwardingRule\"\>", ",", "\<\"blue: 192.168.2.4\"\>"}], "]"}]}], "}"}]], "Output", CellChangeTimes->{ 3.417331204603568*^9, 3.417331380283383*^9, {3.4173314429727077`*^9, 3.417331530778775*^9}, 3.417331577733769*^9, {3.417331638028537*^9, 3.41733165790366*^9}, 3.4174177496190767`*^9, {3.417417788877829*^9, 3.417417838706839*^9}}] }, Open ]], Cell["\<\ The next program shows a straightforward way to find edge disjoint shortest \ paths [10]. The calculated paths can be configured in the same manner to \ provide backup paths or aggregate traffic for example.\ \>", "Text", CellChangeTimes->{{3.417287175195806*^9, 3.417287191620619*^9}, { 3.417287224804204*^9, 3.417287227284041*^9}, {3.4172880440636473`*^9, 3.417288068031199*^9}, {3.4172888033932*^9, 3.417288809740662*^9}, { 3.417290621098645*^9, 3.417290654023003*^9}, {3.417331825257861*^9, 3.417331869252202*^9}, 3.4173702484580603`*^9}], Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"RemovePath", "[", RowBox[{"g_", ",", "p_"}], "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", RowBox[{"tuples", "=", RowBox[{"MakeTuples", "[", "p", "]"}]}], "}"}], ",", RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"g", "=", RowBox[{"DeleteEdge", "[", RowBox[{"g", ",", RowBox[{"tuples", "[", RowBox[{"[", "i", "]"}], "]"}]}], "]"}]}], ",", RowBox[{"{", RowBox[{"i", ",", "1", ",", RowBox[{"Length", "[", "tuples", "]"}]}], "}"}]}], "]"}], ";", "g"}]}], "]"}]}], "\[IndentingNewLine]"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"AllSP", "[", RowBox[{"f_", ",", " ", "s_", ",", "t_", ",", RowBox[{"v_:", RowBox[{"{", "}"}]}]}], "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "p", "}"}], ",", RowBox[{"If", "[", RowBox[{ RowBox[{ RowBox[{"Length", "[", RowBox[{"p", "=", RowBox[{"ShortestPath", "[", RowBox[{"f", ",", "s", ",", "t"}], "]"}]}], "]"}], ">", "1"}], ",", RowBox[{"AllSP", "[", RowBox[{ RowBox[{"RemovePath", "[", RowBox[{"f", ",", "p"}], "]"}], ",", " ", "s", ",", "t", ",", RowBox[{"Append", "[", RowBox[{"v", ",", "p"}], "]"}]}], "]"}], ",", RowBox[{"Return", "[", "v", "]"}]}], "]"}]}], "]"}]}], "\[IndentingNewLine]"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"EdgeDisjointSP", "[", RowBox[{"g_", ",", "src_", ",", "dst_"}], "]"}], ":=", RowBox[{"Module", "[", "\[IndentingNewLine]", RowBox[{ RowBox[{"{", RowBox[{"flow", ",", "flowg"}], "}"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"flow", "=", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], ")"}], "&"}], "/@", RowBox[{"NetworkFlow", "[", RowBox[{"g", ",", "src", ",", "dst", ",", "Edge"}], "]"}]}]}], ";", "\[IndentingNewLine]", RowBox[{"flowg", "=", RowBox[{"MakeGraph", "[", RowBox[{ RowBox[{"VertexList", "[", "g", "]"}], ",", RowBox[{ RowBox[{"(", RowBox[{ RowBox[{"MemberQ", "[", RowBox[{"flow", ",", RowBox[{"{", RowBox[{"#1", ",", "#2"}], "}"}]}], "]"}], "||", RowBox[{"MemberQ", "[", RowBox[{"flow", ",", RowBox[{"{", RowBox[{"#2", ",", "#1"}], "}"}]}], "]"}]}], ")"}], "&"}], ",", RowBox[{"Type", "\[Rule]", "Undirected"}]}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"AllSP", "[", RowBox[{"flowg", ",", "src", ",", "dst"}], "]"}]}]}], "]"}]}]}], "Input",\ CellChangeTimes->{{3.417263565286931*^9, 3.417263606180545*^9}, { 3.417263820099565*^9, 3.4172639042252913`*^9}, {3.41726406469239*^9, 3.417264235567864*^9}, {3.417264356949176*^9, 3.4172643573380737`*^9}, { 3.417265627773437*^9, 3.417265682840023*^9}, {3.4172657671428843`*^9, 3.4172657684135942`*^9}, 3.4172827938630047`*^9, {3.4172871739870358`*^9, 3.4172872145020237`*^9}, {3.417417767491795*^9, 3.4174177687527637`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"IndexToNE", "[", "#", "]"}], "&"}], "/@", RowBox[{"EdgeDisjointSP", "[", RowBox[{"g", ",", RowBox[{ RowBox[{"NE2Index", "[", RowBox[{"{", "\"\<192.168.2.3\>\"", "}"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}], ",", RowBox[{ RowBox[{"NE2Index", "[", RowBox[{"{", "\"\<192.168.0.1\>\"", "}"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}]}], "]"}]}]], "Input", CellChangeTimes->{{3.417287236171693*^9, 3.4172873104435253`*^9}, { 3.417287442160742*^9, 3.417287446242518*^9}, {3.4172878807187977`*^9, 3.41728788355803*^9}}], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"\<\"192.168.2.3\"\>", ",", "\<\"192.168.2.1\"\>", ",", "\<\"192.168.0.5\"\>", ",", "\<\"192.168.0.1\"\>"}], "}"}], ",", RowBox[{"{", RowBox[{"\<\"192.168.2.3\"\>", ",", "\<\"192.168.2.2\"\>", ",", "\<\"192.168.0.2\"\>", ",", "\<\"192.168.0.1\"\>"}], "}"}], ",", RowBox[{"{", RowBox[{"\<\"192.168.2.3\"\>", ",", "\<\"192.168.2.4\"\>", ",", "\<\"192.168.1.4\"\>", ",", "\<\"192.168.1.1\"\>", ",", "\<\"192.168.0.3\"\>", ",", "\<\"192.168.0.1\"\>"}], "}"}]}], "}"}]], "Output", CellChangeTimes->{3.417287333906252*^9, 3.417287472531788*^9, 3.417287814690383*^9, 3.4172878875350943`*^9, 3.417287945208275*^9, 3.417418038622444*^9}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Real-time Adaptation", "Subsection", CellChangeTimes->{{3.4172881093695707`*^9, 3.41728812222202*^9}}], Cell["\<\ The previous examples calculated the precise network configuration. In the \ trial and error approach the adaptations ultimately converge to a better \ state. This approach can be divided in three stages and correspond with an \ elementary feedback loop well known in control theory (Figure 4). The first \ stage builds a representation of the problem space by retrieving the \ necessary information from the network. The second stage applies a decision \ process to find a next better state and the third stage reflects its results \ by adapting the network. This example illustrates the stages with a trial and error approach to \ load-balance traffic in a routed network. It introduces the idea of \ attractors and repulsors, which indirectly modify forwarding rules. A \ decision model decides where to place specific attractors or repulsors based \ on throughput measurements. This is an approach to load-balancing inspired by \ physics [11].\ \>", "Text", CellChangeTimes->{{3.417287992874206*^9, 3.417288020791835*^9}, { 3.417288126133485*^9, 3.417288127061411*^9}, {3.41728892235788*^9, 3.4172892224903727`*^9}, {3.4172892530194902`*^9, 3.4172892563623333`*^9}, { 3.41729082387463*^9, 3.4172908836825333`*^9}, {3.4172910135756607`*^9, 3.417291183121956*^9}, {3.417291214242154*^9, 3.417291255544023*^9}, { 3.417291692573185*^9, 3.4172917069727077`*^9}, {3.417370271209264*^9, 3.417370273364223*^9}, {3.417408322656211*^9, 3.417408325542005*^9}, { 3.417423235853409*^9, 3.4174232399131317`*^9}, {3.417424492275449*^9, 3.417424493003765*^9}, {3.417424523716729*^9, 3.417424523810251*^9}, { 3.4174251796839247`*^9, 3.4174252846615353`*^9}, {3.417425315905396*^9, 3.4174253582195683`*^9}}], Cell[GraphicsData["PDF", "\<\ 9E14ARda;S<:9LCUl^G[Yo>PdhQ6S9`Q/4^6/gVSjTM@/=3m;OO/?Q19>D2]5JGE?ld0CO^70KC: 8`L?EfR:fC=LghXd4CeK`4nHO5oGiKaY;X2lQ`UL`2nHOHFKfL7^>ckAZ2P]0?X< Qh0aiRkIfZBP1M4X31@m2PMPlTidkk34Z3n4@A_1H4`?1A^Eenb`Wl:gnNJ]G_n5 VmGlNEi]cZ;Q`iI6VbWfP0KBQfP4S2IAH4^IBYLTZ9fCkm5I4H;@X=130cD[lSH> d;Pi2`1j2lQnOd>:/LO?WST99H/V7Ooa;E0hFS66U00HGImVXm1J6[P7WnOU/UWF eEW:bLYQli51O>BlSHTfWk?E=UgnHoVSaI=;hR?eJ@o:/;43fZMe]EWGZckY@hKC k^FR/^96YSSa7:fLaN1BO/69imbnE^E6F?NiC[7e_5?GNDNl/nBcoBH5^O>KG^9Y aG6fVodV4ClQh1AkBI=l`mhAV=cEeG9C[iOEXoS]k:Uefb7BhZabZ_n3m=WTDTVa Z6gfYXkL_XMJebYF8>WbYT@^IDAKKQb5IK_nV<]Pd@1JjC9VF=9Akd__^D:[j2oJRcXS770eWQ5aViRPniiE_jgfa[oNjim9=b[YJ;1mOekoC_C_8^_]oIcCj N`YUKVAcM79UHFd:IFiTKf9Z2SDP<21_HVX:=STa2VE^I6mRJPXb830PKf9Z2S`l 82mDNG1U82m@HFMU82m@HG9UKW@PB0`858P;dMc=20a<20` 858P;dMc20` 858P?ShP?Sh:IFiTKf9Z2STP<21_HVX:?3`P;eAiL6DP;dEhM4MCM65dIB0_@D5@ C3Y1@B1VHFacIB0n?PYUKVA_HVX:fIME<2F:M OGNM76NWVMd]AB:4j9QeS2iFA8N8C^6Q@jLjA0BIMHVPXdD@1EhR]_lkTk]SE;h` Q:90InYULoe JoD]56UIJYBae_/fO:]fVA1@=2YgI0>B;nBM?3EW91/CZCCI8CNh@lU> lRgbeVb8ad>L5Yh1E;ECTclP]AB<[HchPjgKJ]K07j[`0g?`;k7`;K7`>9JV2X5I7;K3Nhl^8Ri`9diYaYela>i;EVGCnRMO1X QMIW6dd=F/Zb==oUJJk`Q5/DjBIfEoKN8l:NgR@CoHG^BBlk]n/c:ECGI`U V]SFYkCXjRHgT>mWc9hnLSf_maVgIcQPiH2Ika/:>7;:]^8l5jV9e=SSlI=TaUMD 9anCli0liaD7IDcOORie8T6^YCdiVN^GVUgLfchcMlMolaRdTIMim e=ae;?nKIffAIaR51@4C=^lf=2CARaPJhL153QUjC2Yoj8_j`_jGOgcO6fQ_^:ILlnJaZ][GaUG IYKEb;Q1SC:n[2V8Kk3J3WX]I6VMhQGdi9GeSN7Z<_IlKMVSbAcRJW`ee:D8IF[4 >>?9[VGgAK;5=n7WFl_f[nUAngcfBDdUek:jN6HYnW`fG0e[ok>[H=:bZo3TSI0^ ?6^QkUD?ZWeZRmX:CCfV]Z]]JQOOSZX3iAg3W9F92jcKIODYmV1SV]k:BEMVRn3O `Rn6ojENH@_G=3Ci3dfh^HaY2MlAg3I`QiCo`enc0`gN2VE^I7=dLVEQK@YUKVA_ HVX:20_AVU/M6Eb82m6K65dIDAUHfmTIB0n?PYcM79UHFd:N06UN`]lEoPnAG;EjmQ`jGO88m0YZmH]G15h[d9n`RY3Q=RoBnDDEclIb<: fH/dBQ[kBTCaodO4P26IVQ2LA2L^hRHiP0Wa T5cR9Ci0OV1f;`TP14e?Th2Li2FI;a2>l[AgLNHX_lmCmQGZMoH5@WJ@inURlScI AejQao7DC[:7M93OX=DjlPRiPOb4K0AFIZ7T=S8EU`WU?j61C0LY8hmQM8nAoJQk _0ZBDG83aM93OdRjY ]fMmKbg`IP:F1Y1Zg5U>oX^l@@kB>?dEFfjbVLY=Q^Vjc;^HUl5T1W[k=9klW7k; K/:eCWYM7Y/ISEWL@>kQf2Jo9QoC82fSTnQ<=X0]Ihm:Zd0EYGQf<5U05P?O3j;e SfR:kVHfMT1j@Wi>oT79jcfLLF16T^AQlU?b:f[7B:=d=OdAOHmnb/J`>NaQmXWd 4oTInOOZG8cjD[:h3[8o/jnUgaBPIBBQTPeDY>d7;gJ:6g1mH;d/AbD3lPIh;WLM;mY VfV7jCWC:jKSRTgmTDJdMdhodE?Ble4_jMgDNgm_Nfm7iV?`A`0d5BHADX?NclFe 1?=m?bQ^9oT3]@5g@EY2Am:;P9TiM0UMBML2TkO@[OAWX^noX2l3BgnRam1W>`^; ?Yo7Q[3AK1:^BmU2]Y9]HONb3_HN>bFYTUEbB[UBRCA>JYHFBV^TJjGkYKCdS_BQ m8UdDSZ=:b=Ki8QL82OUU3a>WR=O9ClZOb5oHIY]N]_dVF9AURVg:Yg:Oj]3eI7Z I7F:fZcN[NiFgmEJ@9f_TQO8Rj30bdWPnWFfSIeT8j@9]85>8d_Hh6b3RTMn5U2=o2[Y UUo6f7j;U]LZ=WXC>jKHB3/U[1[2l]OB83TU_DgNU`iAEGjLRdBPT3Z4b6ogCRFciRB=R7b3ab8CV2DGj==hbG^TQ5kdCFUQT[[L1h3i4YVJLc 4FXQRc9;bBCb<_VIJR9ceACV>4eoSo5NCaJbZITed/;NaL33gL220FaM1OUcVc5V a_AAA^g8lf]63:lNESFT/Z9ll:2bl`JFYTX651LU4hGaPUPdTYlG3PD3OYlgei?S M^U>QmeV]IPeEC794Z>T]3hn]RFJC[JTiFAlo?R1?1nORh:iIaFdY:d9EZO7W_eX/ge;GD3BfVKeC8V?VJQIF0YJK=H0EX1 YGga5FgD=i8:P?WZQkLaX]Taa7@`GUNO3/Ca:9ZA4_Ec5j@WCfV/[`_5HTd3Bm=d c?ch_3B9SdhkDj8:6B=NTeK6Y5GaV^SR=4I3KXnfUGI]_Z=C9o=JD[H5l@EcIcNV YKUXXck]B^6mMFWOMDOlolbRLONHaXeWg`e9Vn_mRj>ll^K=6j?YkE<] =3FQ3Cc;4V=K=Xo5Zno0C3EChj _VScTQI3L >`=;fgAG5[5]3VLOH;>O3B`4d[?g12BZLjQQjQW0Ga?5DnT5V975JO>HU/gjL5j>8M:d:J77Xi_o@D01lNjoWe/b]jm4 BNSo8?`VYi`IbRSb=5O/S0dZ/kFCbn@XlR0O[8I>1f K]?`VD@XaU768QBAa5d@iNmJI:/Pdf]9b0Wm54?F2CUD3EHXB6QfKeU_6 InMVN?l:I7llk6nHJB7YoXjV^efN/@inG>jIm//=Db7b64=dfM] gV`iiai8;M_;2oXBD3bIgQR;STVC6N3<1?jMVJiQ?3B5dPI@QS_C`DFR^2WDUcfW HZS_XBKl>7D>;1d;VKUilmQhM>cVU/ec>c>]ln9A?Kii3g^5_K9iACfTGII`>S=k K`nUamkA18`]X/?17XbMih[;dlZDHYM9N5XI9amY^ORg9V1AJH[lZiggnkN:SgTf1[N @ImT>eaoM>A0l`IeSajDFFOVXoKRJ[bcbaQHG:dk2IE3>OTf:I@_VoFTld:BS59: Pa5OO<3Khf0noXUOnoSggo]hkk5kG^[mL_?;77L< 5S@acL:Jc0W/OFJDAB=dS1K>blL/^OAl9m7@JC>=67HkVf6>jSYRRm>9f2m:>S_BC :O5[[^VYjH>KPACTN1PlJ?d^nOVgECdi[E4jnkIon6gSIJOLo?1]M?N63Ya>Mkgc7]cLfkJ5k_PMNNk^em IVkild<7egoie>OOU^ASe8o3i^9[Fb^iclQEC?VJYZY4TSTR;NIl:m5DCQmi^[]B WBiM6;E4kL`B]<_VocG>>?84cXkghl`fhY8/2ODQKD9?SJ2T4dMBIi3V[Rj[dCW^ <>YLL908Sl^5YanEDZOo:=eRf_]lKng?Nng?LckJPC5/`1SKm7_ilcfFPH@Y[V2Q>m5]WAmXH5bYkR9HiVNf0i[2kf0c`j=LM7301<8Xi I7?coYVL=/U<:=?/UJ@k6iNbjYS19mgl3/0_^/Wk=LmaDABb:FAF`B/MJInLJ8laY< 84eBn8@cQf0_6hl]8PHQOHLG@hP0<28LBYZX;FYaEcY5I;99Q3Y0LQYXS`nL]bT0 dLQ;K2Hl=cZKJMQ9MWK4RlC013=B?YHCIIPHT55]CDef<fcTZ]Nc581kGR3^^TE/?/Q5ab []2Yg/UV_QPe]IQJCI:YTngHiA[Ai4l5m1?=9iY[o10kgL60gPdhN2IcY9Wh@I0e nUUGD>o^gVPj;kGaa]LfW^OWbN11Y25]WMJ@cXN]lT]Rbo`06Wb?/Q1da7m=ZeHf TiG=];VY2Ja<_KjQECCVR[_Pm74mR1GX9H>lPB7`7IQNjYfi/kOA]?N7KnhI?oUQ jOBY/O;K?`bA3ol@5Kcb2>AmQ?S?O6T5>K:KVZ9E6[I>];MHE eUJ[bJY1cX70^P`kG_Ho:8Tn`B7cQ_3<_n/:2inbOUfAJTiaKM6lD/PA;Rl4dKZ[ ZjV[^WZS;>HXbh1kR9@io:;=EJU54H66V`H?hXX1/m2Q6F>[[=J3d8>cioHW@<`;`_V0LcUh7M]^Gdcb5D@o`WV `BAFD5N52k?gb1/Bfo_6jEi8Kho5c54eM8Z[jHWjbVJ^]BM0CoL9KJ6ZJC?9:]Yl62X/5W=1jIkA/Fc0_A>Fg]_d MNnK_I_XmBlofWcAh5]jKc?]MKPGkUkfDVm?cllUN/NjfCOWLWLcl71QiZPLUTO2 be351QZUI[^i960?UPb`UiA0Z>AFQHJGG53BK6l^FF9OG=8bJ;?meP5K_@l7Wk7W 5_LKPTFL]0KHj<`kC=/M=ac24iK=`XLWAV_Q;J100<:5eGISPPla0[ CRMRAeSbMK9WMo__lhC3:YSPQ17ToB3eAIKb/6@M<5NOBaBQO1:a@/j?G3Ea8<^? QC;GF/POPN`G`0VQ153bPF7U[b/D;d;n]=3;QIg/4/=AI92TWX`V1bEg9TgEh8H> Qh?=B7IVg]/]P<6lc;3Wab/7EGME/ngE]=[7ncJ:]nQ;n0_:2_LY1a@FDFXEYSSh B1D<2k6OmdL1HFES:4477jjRle4YPhOmTi]G`Pi>PIeCX:[VkWkS03bNn^`cKQlO BMEfmaaa`CP@c=Bl/W/U<_R3gj5d8HIQ=8>[Eb8Q:a>:4Rm83ZTL2Q>?Gd7lHOC3h[1N?:5/ONTCR/e/5>a0^/NfAffZ_j`38mf[Z[a2E05F:1QOg__RjF3_Y[cNDl 31hDLbig[W9:CPPb=J`O15CNI]:1KFlQfLYPLQhWXM5YQ ;_KgV7oRZW@?aGCg[IbbdbcE]>DMnlGk_Mn^n_:ficn8k0b/VkGYfBM_ FG8GgN1kl@3=XiJODkInif>Q:iJnnXOgG_TAUd<=T4?iV;=LTTNW6Kh82NM2JCJK V/dc[0^U:dc;c@^]FRkW>Si05`1S:XOb`S`^L_o5MC0g?MBl;cPf_EMKVWV@WoCXf/9afWfnb]lFk`R]i`lh]nWJMjKXL2U]D/YLm bdL_F5h/>WF>=AfH_Rl7e>8cH4Il82aC0;1jlFX0G`Tn1m1UV8]::]=fJPm6T=^E B5Kbe1S5fCY28mh:_E0e2T/ZnLACNPi0]F@BYe4b6Z7kQi`i97JKV7Fmjb/0K]FEk_iFQNZ@W0/GnV:jM99ACUa NMBHUc/mGoHNXih?oXPmW]=7;NdKi]oAlcjKHQ/flkHKWZ4c ODmdd0RE/:5Bg?]AkoMjM>ONAOBnFlL/NT[`77H[FB_l13iZ=o8mI^XTG<>aPFn8A2hMR/A`^h8aY58OROl0MNYW]9S9b41md?_7:dm_f0_A[m1:cCKURUcE`? ed07egIG^h1M[9Tm^T/aZhX6VJbKgB7RDY`Qk8:TB]J_YbUHUJ]PQPbY65:9EG15 >IP4^jM8Wd5W/PW9GBidF:eVSbUeXCW8V^mAc7W1O9:[DU?JKcJ>]AcXGF/IjKJJ5eT ?FGiAjkS_7QYdLShb::;R[JDKRmEQlJ63ZP]7F/M6j/O<3dfOL1RMGi/oX2Fd]KB mh^>a[j>7b]bnKa:KRM[jbP>ijQ2;^UAjco2en5YmLRW/BcJSE7PdO6hnck@]2Sm2Z8; ll9[8NKL2`6WS@Tkf_SE>VR05TL9mcP?>@ljYdSFab/VHc8UmJZii9OL2jCgm4`/=^18FkI6C/6Vk`CXmcHR> e68e3n464NOSKPbQ/X[0=ma1a2M`B8G;`oTXVB?d6A`KV=3;MU[;ajbiLI?O@Jm> ooGhUKnklnG[WU[hengomME3Cmeh`hkW[e^kXc4h9E6nH5IEnWIJln63U=kaH>_Y 9MlMF?^LE?:k[Wg__?[jZe`6KX;bZX5=b_ebnhe;cD>iM9QTgV;NKTjK^lb7cbdRDO UaVAXo91i6BI[gCi304hIOShg`2W/AH4S^F9fSPP n8ae0Gb^0V]`5ZW]5P:82b6>cUD[DcU3:W8UV>BK>SXji;lM>?13[YclhGf^Zc5V jC^EFFK9JOloYY<:U[flU`Y/8E08hf_];63^1lC:2Sh5ILH< jAX;Lb_AW5PUS?CS^ma5UJQe_0>Y6`/Z5F6bH:U]/F1RI;P `f`2cV4C5f2=kCARDJ6_QN6V1[M0SEPCQ2DXQM2[aKhNPaC[=@H;:BNL:0AE8N74 S16gT7=2`F=o2^PP0I_mhmRhblkR0Tkd4gC8D] gjRoQ]BOLP1@MJe6Zi54g>M//CO0KFVnAF;`E?;57Z`1c3>FNXK5G9YGKMKblVX` HAneieDSNKLm:Y:fF7JaeRCFfR^aE1=;M2GCeAhCRl9f;dlnJ]MiMIj8W4dTKMKn ]CYOjO5G^CnDZNKahVdNChf8l=C9MSmon>m]XFae;>Vc=V/:G9g2^]15:bRFmBXX TCkkINlB^^nSg/OFVOJNOYVVNjo^FL0ReoEN`^WbITAEPQLogFdBS0P:j]YE=JaB Y9E3/^VP`MVd825B8i7[ZgC22K3=M`0FGLbG8WP5=6WYQa`IemLigEJEZO@/^b9ZYVQ105d7JNnY/Gc/6n7cBd;_a>TKg8Eb@W0nGoH:02ce If>2eEjIT8o8Al`Oncj;V_iX>QUU?RdJ=o]3DKJ`^>:3M7Th@B=oe?1aQF8A`oY>0fMjnfCRKolCJRgP5oo5FnZKUQ>4AQXH@Ud@/ bTRP<=59enj:lFTiXi/`0Eah`Zhkhk4mIh66C1Bek@?nHgUe/PL6dQbXE_Ze;/M6@Qj30UekGa /O:WUUcm@>BV]aimMUMlm/PE?nUXG73An^5bl[j9LnHek]fi^jN8oGCYW>7g?MWc 06]O^gKbeW]jo]97;m;WX1L__M78iRS@6LN=6Q3<]CYm D3oX?nc?n>FXiW5h_>j`2ACR]E_/3Y^Sd8n539_QQfD0]g0aQjdNCQE`YOgML75E KaE;@JU@<[LaH:OkFRGi^OPH[QeJV oLOmK8Eo^co]ko;;OXUEi7X5Kik/L<67cCU?:4P>I1DT>I/5ngeXY`bH=a2fS0]b 8P_1beoQaS^?PiW>/?A47kJRQJgG[U/U7g_]?C]emEQcEH4NKACP;dR]fif8IBI^A`;`l7W9`Y EgmCYW>=`n;_XW03hC0^2C0J3;b2UJ WE4nMeRH=Im/oVL1ejoHNHB`iCiV[[SgGOjGNjomfnj7NkSg]6fm]gkEQHc/>B1GMMGG_acgkooHSVTo]kkcmc^mn oOIKHQff0HKTjiQ35gWC656F@gFIa^E:N@`>o5dV[i4E/d/cJfIkS/]/9i96[F4^ XXW5G;`5njL5dAbJ``YLFAEUj?m:`VMYYNldOfN@EGI;Lo/^K8A?Nh OZn3`1O8_PHR[oW4:[h[aJTMZbXQdJZ9o^I6Qg3l=joR^hYIjIEM?jV@EA/N7kVh mY9;AhhN?N9BCkjLO6cUn>5?5hf[KEWElbk@0;J[Q@nX3GPH9?VQ`@MCR@1h_8 L>MGcm::4SJ;78`VLfG[NGU1kT8Z29Abm4L2]H59PCV1WH430LDIR0BF1`h5i4SP kP0;o1;TS=?GFNn60N^1`JV1[AlMYcHIXC[UfoYM^ccNbZcG`n6ZY?BlfGU;leQN >5N51>M>C[5Hh5]e/?jaIfOTl2VF`nMI8o215`J<77mU>NN]P;hNZ39AC@il;H1g1DK8L8P><1`5Nk^A0Z 2HYGaN1_JBW_:VNeiJgU[9akJPZ9N2LAB`8BcF:IcA00k`07S03_A;C@:CamC]4m IiAg5F;^U84^0Q:kPgg;bX93oBIhH72O>`H[b[jeICO8F@O_[i[Hiea=YEK2Jgo6 `I[eXj5BKOM:hEcUE]PA_DLTD>3hmcUHXLJ=XX7iLBcdTbkM[NOXTU9PShJ8^EP= DM=0A?TNI6>>N8PDa>dfKH0UA8^;c1HU9HM8AR75kOU/a:gUE4UZoO[e@];` 71@5Gi?RW:hn_P7elSd6/N6_KWKMMOl?J8HTO_ok@ Y573B^jIM^<_IkWB]]F;KeSRmIJ5K]Wg`Kf:UD`/Lm1/TQ g1?TZX8/Rk/l7?E<3eiDnoXnO64 dR37dLf@IHOiNGljJ@l90SMV[39H=nRD4nAkWLS0XN3k8E`Ng1M30CU8>fQ9PmXC[PUC17c@O=Qldb2[<;6PiT EHMI_9W_?>>82fmOJ0bc/:?hNF;PW>D;54Kg_a]6P[3_/ CS_3HY/OJ87A9=]2a:ji@XCKaCR[@YXiJlB6R:TY`^C0/nFlo[? B;PQHhC5ZVJgTTA/`F:h``JbPo@l2ULI85NDakR1oB3H^kP1lLTQUb7b5YM4RDeA 5JXh;LAR]h4XLKk2AAW>V;^`/Q2[YB`a^k1Q/Gnoo]inoMgDOZiAJf_k]Vd4fh/m dQ2`k:4UlP0;^m1eRN/^UnB2f1=760h;<`Xmb09HGadgc95HYAk>boYAS1LSQIFb HS?W:25c`6fBRJaHLKI3Ln/TAo:XHBeTcHLJh;gILhYkZ_D1MXUk^_EJiCefQkU;g>gNio:3nHRjf^HU9/;g8D>h_LIIiQ YeY^X?]/68[QNaFmSYn0oo;Gla7iJ?>;m`WU5?V/1GXEFKHA:b; f25RYhSMOFj;TF5gN712@hC0am9AhhbG6VCgG;V]=ULmQ5mmcPEGi:RS6Z^9el ;m_R>JWKJH^MKdU9mTkj]669C[;@iIIe5QaTHC<lLH9IioW j3_FdIN0>3Ljh6Mbj3DlL9R7QWATFV>7?FZ;/YMaa9PR>387>lPPIm@=6ZDhnR5n C@gYbVThjZ5U3[JYPe2PeB8lb1JiW2K6/fF^_]>T>cQ3Nf6^TOKl6XLK5L7 lAKKbC2f=o^V7a2b1Z:6gEekJ_n:>LjJOfPQSE^ki;GB]l_? Y4[_52F9WAR2SDB@Q_PQEDOfCRASM79ZijW[L5jdodiO1A9@D82GTn5WOON1Cn1MgTLHdGGC`Q =F[Eh[U;9d`G=E0YDhA_P_kC;h122MmJ5N4VBk3_oI63;d/3b6449PeXCnE5mV1:lmY7A8a>:Kk; WE_^73E@RZ9_IB:>8Uj>/1=Q7h9>N1e2:l9>Q7d81a60;lClKQAQ>L8f Q<<8RY@WQM^S4GeDTAC0/`6/@ mR4LAe288OWJkje0ggg]]h]Tei:UiB8k=i^MgBbb^bi^bZHCYVCC^P^beHIWZ`f^ c1JO=cZK5YEVDgNR_1F=kk;Hbk]6HO/ 8dCIF`S_8;a71R4H29d=6>`A]YoaSdPSk1gf^TSO I[lFjI]8le7n5W^m?Cm2AUUaWn0I7JV>]0cgCNaG^`[MTL`X5m/734H@Ub7D8Ta2 V8=`=h;2m[62mPDA=aYiRK`5NAMQkNA;TCi57]N8/BAR9]VS;aHFAJXVGD6SXic/6V3Y6V3Y6V3Y6R;S6dMLi7]8_@Qk^;fT11SKJZ@6U4AJ mm;FUfW[E=[j>6eMB5]_XZg[JF/=KKfD]ZIXJiRfi]=FPkJnA8L15JgDj3PWFfgh JN]K]?Eif[ZJ]RIYJh:f5];F::db>UV/o@9`7I9jTN`JaIV>aGJM?a;BalUR`6P< =1n3C=R7n012A^@8J@@E1@^`3S^5_4C/AU2;D8La3F8Aa3D4AgSZ4[S2a7 c;^hDgB/374]`RBNHjoRhQnAaUPRToTlnZR=L;0NifJMP7 />one_kM]gIR7VEVMk6kLN`nPTlg/nWMkMoWAC[YPng9Ub:SL^T391okO1ln4_TbgVkI4oX^BigI5g`kM5gRc[e53bL[:C8]TK5EGgQ8M5WWm;E5f?6e_K8cOaI7OT a_2hb1EQLF=Qm/JUZi4cW96YbEVAlFR_;S`_HZa6Vk/S]N5;8cGIFT?h7>YRKRmeiMjjmeSgAESjgk3e6;:6bY bbieA8`MUSI?9P:?jHOobf1al]7jn_fd?oVbM=SG^T TOBKnZVlG1YIemCDd4UWRWXTB_lKmD0aB51?Pf;VmDQDbloFfiZ]Ul3cZ5O84m@c VdU2e4^HcJ:NC7Vm]]F5mGE]QHQ@aaLUZdFMeKkXfGGNBZ1>0Q7ZN5_9Fj;>FmiF GRLmDS@C3Z=:?R9DXOPBFU@9dj2X8W[N9ZZDmEFikDbEflBKY6a_A1dNXAWkhOhj m/>XL`J=oa>`L3B>1nhJdCAoMSdn76b9ebm4J4WOO_DROkYeGSCJ=[n9gl3gNlVF NO^fljlZg;bOgSGI=iH9GoG>?7L_kb[R]lNammEaMmEaMlecQPWgTD4 SDm^K=?8j2IhlTFjReT]X=NFD:aY]5MOhPE7oCIl0VX7H7C mL1A0dOaFn0YO/_1_`k]^nFoJD@/]9O^j;^UXmPE7deBJjiJOAGaebn^boiGhhNR =EOabLS6:Ekf7gnXDXl??N]F[b4h@en2UD`]ES9]ZX[BU[XVU0g_;k=Jjn5mb1JN Ql;Q_:8TWJW8bfYhVMWLEo7OZD7d2LG0cQhH6Ro]XTHnGD=F=dWYo8KY3:9PnRbP 0El9kXD]aIG4JVb1[5V=8e>[ne_Sha1`WlNBH=R[nl>JZoZP?Ub/jD_50j^ae5[M Si;niU8LFB8B^5Z3Xj_To`9Uf[8C2VE^I7=dLVEQK@YUKVA_HVX:B0`86mRJPYK838g>20`830P<20`830P<20`830P<20`830P<20` 830P<20`830P<20`830P<20`830P<20`830P<20`830P<20`830P<20`2SLb20e=CHP<20b 20e=CHP<0Xg 20`86mRJPXl?20_E7U`IB0_AVm^M20_DgERM7U`IB0_E79e IEAiL6DP;d9QLfE6Kfid82m@AeQB0_AFiSKfAYKVLP;deQHe9_KF5^AFiSKfAYKVL:?Sh:IFiTKf9Z2S4P<21_HVX: ?3`P;e1bKfAeHfEb82Q=HF30dC5X`<2L`<2LY83hn2VE^I6mRJPYhLVEV2S0PB0`<30`<21^80X`<30`<30`<38b830`<30` 86hP2S0`<30`<30g>3LP<30`<30PKR0:<30`<30`<3Ta<20`<30`<21^80X`<30` <30bCPf>FASHS=VIC4b 3HiI6=R0XU9DE?APX\>"], "Graphics", ImageSize->{342., 166.875}, ImageMargins->0], Cell[TextData[{ StyleBox["Figure 4. ", "SB"], "The trial and error approach corresponds with an elementary feedback loop. \ Monitoring functions and configuration options provide input to form a state \ representation. The result of a decision process based on the state is \ actuated with control functions. Monitoring and control functions can be part \ of different ACs." }], "NumberedFigureCaption", CellChangeTimes->{{3.417413571754519*^9, 3.417413576636899*^9}, 3.417423271619982*^9, {3.4174245261608562`*^9, 3.417424526256681*^9}}, CellTags->"Fig5"], Cell["\<\ In the Java middleware, one thread polls the network and another updates \ variables in Mathematica using Set[]. The following code simulates network \ throughput by generating two shortest paths and at each NE summing the \ crossing paths. The generated list is normally updated by Java.\ \>", "Text", CellChangeTimes->{{3.417423252492696*^9, 3.417423254008819*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"InitWeights", "[", RowBox[{"g_", ",", "val_"}], "]"}], ":=", RowBox[{"SetEdgeWeights", "[", RowBox[{"g", ",", RowBox[{"Table", "[", RowBox[{"val", ",", RowBox[{"{", RowBox[{"Length", "[", RowBox[{"Edges", "[", "g", "]"}], "]"}], "}"}]}], "]"}]}], "]"}]}]], "Input", CellChangeTimes->{3.4174136253606586`*^9}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{"g", "=", RowBox[{"ToCombinatoricaGraph", "[", RowBox[{ RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "\[Rule]", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}]}], ",", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}], "\[Rule]", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}]}]}], "}"}], ")"}], "&"}], "/@", RowBox[{"(", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "\[Rule]", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}]}], ")"}], "&"}], "/@", RowBox[{"ToUnorderedPairs", "[", RowBox[{"GridGraph", "[", RowBox[{"3", ",", "3"}], "]"}], "]"}]}], ")"}]}], "//", "Flatten"}], "]"}]}], ";"}], "\n", RowBox[{ RowBox[{"g", "=", RowBox[{"InitWeights", "[", RowBox[{"g", ",", "0.1"}], "]"}]}], ";"}], "\n", RowBox[{ RowBox[{ RowBox[{"paths", "=", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"4", ",", "5"}], "}"}], ",", RowBox[{"{", RowBox[{"1", ",", "8"}], "}"}]}], "}"}]}], ";"}], "\[IndentingNewLine]"}], "\n", RowBox[{ RowBox[{"sp", "=", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"ShortestPath", "[", RowBox[{"g", ",", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], ",", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}]}], "]"}], ")"}], "&"}], "/@", "paths"}]}], ";"}], "\n", RowBox[{ RowBox[{"vt", "=", RowBox[{"Table", "[", RowBox[{"0", ",", RowBox[{"{", RowBox[{"V", "[", "g", "]"}], "}"}]}], "]"}]}], ";", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{ RowBox[{"vt", "[", RowBox[{"[", "#", "]"}], "]"}], "=", RowBox[{ RowBox[{"vt", "[", RowBox[{"[", "#", "]"}], "]"}], "+", "1"}]}], ")"}], "&"}], "/@", RowBox[{"(", RowBox[{"sp", "//", "Flatten"}], ")"}]}], ";"}], "\[IndentingNewLine]", "vt"}], "Input", CellChangeTimes->{{3.417413640134527*^9, 3.4174136526688232`*^9}, { 3.417418063166013*^9, 3.417418064388246*^9}}], Cell[BoxData[ RowBox[{"{", RowBox[{ "1", ",", "1", ",", "0", ",", "1", ",", "2", ",", "0", ",", "0", ",", "1", ",", "0"}], "}"}]], "Output", CellChangeTimes->{{3.417418046106412*^9, 3.417418065038746*^9}}] }, Open ]], Cell["\<\ The decision model is straightforward. It finds the NE with the maximum \ throughput that will be repulsed.\ \>", "Text", CellChangeTimes->{{3.4174136566425734`*^9, 3.417413663908004*^9}, { 3.4174232914655952`*^9, 3.41742329795956*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"pos", " ", "=", " ", RowBox[{ RowBox[{"Position", "[", RowBox[{"vt", ",", " ", RowBox[{"Max", "[", "vt", "]"}]}], "]"}], " ", "//", " ", "Flatten"}]}]], "Input", CellChangeTimes->{{3.417413667606183*^9, 3.417413674467801*^9}}], Cell[BoxData[ RowBox[{"{", "5", "}"}]], "Output", CellChangeTimes->{3.4174180839577227`*^9}] }, Open ]], Cell["\<\ The following code puts it all together and the result is visualized in \ Figure 5. The first part of the code is responsible for the simulated input. \ After each edge weight update in the network, the new paths are calculated. \ This is analogue to changing edge weights in an OSPF routed network. Next \ there needs to be a stopping criteria to decide if the update had a positive \ effect. The most straightforward manner is to update the network a fixed \ number of times and pick the best result, which in the case of load-balancing \ is when the difference in throughput is minimal. Finally, the edge weights \ are manipulated by placing the repulsor and the state needs to be updated \ again.\ \>", "Text", CellChangeTimes->{{3.417292535114629*^9, 3.417292778640978*^9}, { 3.417423350376856*^9, 3.417423366374775*^9}, {3.417423406975876*^9, 3.417423407388626*^9}, {3.417424587039414*^9, 3.4174246003767138`*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"g2", "=", "g"}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"vl", "=", RowBox[{"{", "}"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"For", "[", RowBox[{ RowBox[{"i", "=", "0"}], ",", RowBox[{"i", "<", "10"}], ",", RowBox[{"i", "++"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"sp", "=", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"ShortestPath", "[", RowBox[{"g2", ",", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], ",", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}]}], "]"}], ")"}], "&"}], "/@", "paths"}]}], ";", "\[IndentingNewLine]", RowBox[{"vt", "=", RowBox[{"Table", "[", RowBox[{"0", ",", RowBox[{"{", RowBox[{"V", "[", "g2", "]"}], "}"}]}], "]"}]}], ";", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{ RowBox[{"vt", "[", RowBox[{"[", "#", "]"}], "]"}], "=", RowBox[{ RowBox[{"vt", "[", RowBox[{"[", "#", "]"}], "]"}], "+", "1"}]}], ")"}], "&"}], "/@", RowBox[{"(", RowBox[{"sp", "//", "Flatten"}], ")"}]}], ";", "\[IndentingNewLine]", RowBox[{"pos", "=", RowBox[{ RowBox[{"Position", "[", RowBox[{"vt", ",", RowBox[{"Max", "[", "vt", "]"}]}], "]"}], "//", "Flatten"}]}], ";", "\[IndentingNewLine]", "\[IndentingNewLine]", RowBox[{"(*", RowBox[{"Calculate", " ", RowBox[{"variance", ".", " ", "This"}], " ", "is", " ", "the", " ", "measure", " ", "for", " ", "a", " ", "good", " ", RowBox[{"solution", ".", " ", "Small"}], " ", "differences", " ", "in", " ", "NE", " ", "throughputs", " ", "give", " ", "a", " ", "small", " ", RowBox[{"variance", "."}]}], "*)"}], "\[IndentingNewLine]", RowBox[{"vl", "=", RowBox[{"Append", "[", RowBox[{"vl", ",", RowBox[{"Variance", "[", "vt", "]"}]}], "]"}]}], ";", "\[IndentingNewLine]", "\[IndentingNewLine]", RowBox[{"x", "=", RowBox[{"{", "}"}]}], ";", "\[IndentingNewLine]", RowBox[{"If", "[", RowBox[{ RowBox[{ RowBox[{"Max", "[", "vt", "]"}], ">=", RowBox[{ RowBox[{"Round", "[", RowBox[{"Mean", "[", "vt", "]"}], "]"}], "*", "2"}]}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"If", "[", RowBox[{ RowBox[{ RowBox[{"Length", "[", RowBox[{"Position", "[", RowBox[{"pos", ",", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}]}], "]"}], "]"}], ">", "0"}], ",", RowBox[{"x", "=", RowBox[{"Append", "[", RowBox[{"x", ",", "#"}], "]"}]}]}], "]"}], ")"}], "&"}], "/@", RowBox[{"Edges", "[", "g2", "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"g2", "=", RowBox[{"SetEdgeWeights", "[", RowBox[{"g2", ",", "x", ",", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"#", "+", "0.1"}], ")"}], "&"}], "/@", RowBox[{"GetEdgeWeights", "[", RowBox[{"g2", ",", "x"}], "]"}]}]}], "]"}]}], ";"}]}], "\[IndentingNewLine]", "]"}], ";"}]}], "\[IndentingNewLine]", "]"}], ";"}]}], "Input", CellChangeTimes->{{3.41182085825979*^9, 3.411820885121653*^9}, { 3.4118209766675158`*^9, 3.411820976787039*^9}, {3.41182354086906*^9, 3.411823585035387*^9}, {3.411930863354183*^9, 3.4119309162956753`*^9}, 3.412078154663743*^9, {3.412078219139347*^9, 3.4120782610281982`*^9}, 3.412078617570333*^9, {3.412078741969702*^9, 3.4120787490667257`*^9}, { 3.412078810324068*^9, 3.412078867545285*^9}, {3.412079175274622*^9, 3.412079194391169*^9}, {3.412079327645095*^9, 3.412079327841905*^9}, { 3.412079580301846*^9, 3.412079616382599*^9}, {3.412080797786045*^9, 3.412080835868593*^9}, {3.412080895559885*^9, 3.412080899284754*^9}, { 3.4120809601044188`*^9, 3.412080961152019*^9}, {3.412081058574573*^9, 3.412081059172839*^9}, {3.4172928212596617`*^9, 3.417292834142992*^9}, { 3.417292890238812*^9, 3.4172928924158382`*^9}, {3.417408703462962*^9, 3.4174087355048532`*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{"ToLines2D", "[", RowBox[{"e_", ",", "opts_", ",", "coords_"}], "]"}], ":=", RowBox[{"{", RowBox[{"opts", ",", RowBox[{ RowBox[{"(", RowBox[{ RowBox[{"Line", "[", RowBox[{"{", RowBox[{ RowBox[{"coords", "[", RowBox[{"[", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "]"}], "]"}], ",", RowBox[{"coords", "[", RowBox[{"[", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}], "]"}], "]"}]}], "}"}], "]"}], "&"}], ")"}], "/@", "e"}]}], "}"}]}], "\[IndentingNewLine]", RowBox[{ RowBox[{"MakePath", "[", "l_List", "]"}], ":=", RowBox[{"Thread", "[", RowBox[{"{", RowBox[{ RowBox[{"Part", "[", RowBox[{"l", ",", RowBox[{"1", ";;", RowBox[{"-", "2"}]}]}], "]"}], ",", RowBox[{"Rest", "[", "l", "]"}]}], "}"}], "]"}]}], "\[IndentingNewLine]", RowBox[{ RowBox[{"PlotMyWeightedGraph", "[", RowBox[{"g_", ",", "lvl_", ",", "graphics_"}], "]"}], ":=", RowBox[{"PlotMyWeightedGraph", "[", RowBox[{"g", ",", "lvl", ",", "graphics", ",", RowBox[{"GraphCoordinates", "[", "g", "]"}]}], "]"}]}], "\n", RowBox[{ RowBox[{ RowBox[{"PlotMyWeightedGraph", "[", RowBox[{"g_", ",", "lvl_", ",", "graphics_", ",", "coords_"}], "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "\[IndentingNewLine]", RowBox[{"(*", "Edges", "*)"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"edges", "=", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"Thickness", "[", RowBox[{ RowBox[{ RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}], "^", "2"}], "/", "120"}], "]"}], ",", RowBox[{"Line", "[", RowBox[{"{", RowBox[{ RowBox[{"coords", "[", RowBox[{"[", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}], "]"}], "]"}], ",", RowBox[{"coords", "[", RowBox[{"[", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "[", RowBox[{"[", "2", "]"}], "]"}], "]"}], "]"}]}], "}"}], "]"}], ",", RowBox[{"Text", "[", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}], ",", RowBox[{ RowBox[{"(", RowBox[{ RowBox[{"coords", "[", RowBox[{"[", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "[", RowBox[{"[", "1", "]"}], "]"}], "]"}], "]"}], "+", RowBox[{"coords", "[", RowBox[{"[", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], "[", RowBox[{"[", "2", "]"}], "]"}], "]"}], "]"}]}], ")"}], "/", "2"}]}], "]"}]}], "}"}], "&"}], ")"}], "/@", RowBox[{"Thread", "[", RowBox[{"{", RowBox[{ RowBox[{"Edges", "[", "g", "]"}], ",", RowBox[{"GetEdgeWeights", "[", "g", "]"}]}], "}"}], "]"}]}], "//", "Flatten"}]}], ",", "\[IndentingNewLine]", RowBox[{"(*", "Vertices", "*)"}], "\[IndentingNewLine]", RowBox[{"vertices", "=", RowBox[{ RowBox[{"(", RowBox[{ RowBox[{"Inset", "[", RowBox[{ RowBox[{"Framed", "[", RowBox[{ RowBox[{"#", "[", RowBox[{"[", "3", "]"}], "]"}], ",", "\n", " ", RowBox[{"Background", "->", RowBox[{"RGBColor", "[", RowBox[{"1", ",", " ", "1", ",", " ", "0.8"}], "]"}]}], ",", "\n", " ", RowBox[{"FrameStyle", "->", RowBox[{"RGBColor", "[", RowBox[{"0.94", ",", " ", "0.85", ",", " ", "0.36"}], "]"}]}]}], "]"}], ",", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}]}], "]"}], "&"}], ")"}], "/@", RowBox[{"Thread", "[", RowBox[{"{", RowBox[{ RowBox[{"VertexList", "[", "g", "]"}], ",", RowBox[{"GraphCoordinates", "[", "g", "]"}], ",", "lvl"}], "}"}], "]"}]}]}]}], "}"}], ",", "\[IndentingNewLine]", RowBox[{"Graphics", "[", RowBox[{"{", RowBox[{"graphics", ",", "edges", ",", "vertices"}], "}"}], "]"}]}], "\[IndentingNewLine]", "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ StyleBox["{", "Input"], RowBox[{ RowBox[{ StyleBox["PlotMyWeightedGraph", "Input"], StyleBox["[", "Input"], RowBox[{ StyleBox["g", "Input"], StyleBox[",", "Input"], StyleBox[ RowBox[{"VertexList", "[", "g", "]"}], "Input"], ",", RowBox[{ RowBox[{ StyleBox["(", "Input"], RowBox[{ RowBox[{ StyleBox["(", "Input"], RowBox[{ RowBox[{ StyleBox["{", "Input"], RowBox[{ StyleBox["ToLines2D", "Input"], StyleBox["[", "Input"], RowBox[{ StyleBox[ RowBox[{"MakePath", "[", RowBox[{"ShortestPath", "[", RowBox[{"g", ",", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], ",", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}]}], "]"}], "]"}], "Input"], StyleBox[",", "Input"], StyleBox[ RowBox[{"{", RowBox[{ RowBox[{"Thickness", "[", "0.01", "]"}], ",", "Red"}], "}"}], "Input"], ",", RowBox[{"GraphCoordinates", "[", "g", "]"}]}], "]"}], "}"}], "&"}], ")"}], "/@", "paths"}], ")"}], "//", "Flatten"}]}], "]"}], ",", RowBox[{ StyleBox["PlotMyWeightedGraph", "Input"], StyleBox["[", "Input"], RowBox[{ StyleBox["g2", "Input"], StyleBox[",", "Input"], StyleBox[ RowBox[{"VertexList", "[", "g2", "]"}], "Input"], ",", RowBox[{ RowBox[{ StyleBox["(", "Input"], RowBox[{ RowBox[{ StyleBox["(", "Input"], RowBox[{ RowBox[{ StyleBox["{", "Input"], RowBox[{ StyleBox["ToLines2D", "Input"], StyleBox["[", "Input"], RowBox[{ StyleBox[ RowBox[{"MakePath", "[", RowBox[{"ShortestPath", "[", RowBox[{"g2", ",", RowBox[{"#", "[", RowBox[{"[", "1", "]"}], "]"}], ",", RowBox[{"#", "[", RowBox[{"[", "2", "]"}], "]"}]}], "]"}], "]"}], "Input"], StyleBox[",", "Input"], StyleBox[ RowBox[{"{", RowBox[{ RowBox[{"Thickness", "[", "0.01", "]"}], ",", "Red"}], "}"}], "Input"], ",", RowBox[{"GraphCoordinates", "[", "g2", "]"}]}], "]"}], "}"}], "&"}], ")"}], "/@", "paths"}], ")"}], "//", "Flatten"}]}], "]"}]}], "}"}]}], "Input", CellChangeTimes->{{3.417292056112473*^9, 3.417292136399055*^9}, { 3.4172929172489567`*^9, 3.417292917788471*^9}, {3.417292975957223*^9, 3.417292989682399*^9}, {3.4172930266119223`*^9, 3.417293097200365*^9}, { 3.417293129535836*^9, 3.4172931522217073`*^9}}], Cell[BoxData[ RowBox[{"{", RowBox[{ GraphicsBox[{{ {RGBColor[1, 0, 0], Thickness[0.01], LineBox[{{2.0400867354458425`, 0.9929318454224567}, { 1.0203325939403822`, 1.0212177168242114`}}]}, {RGBColor[1, 0, 0], Thickness[0.01], LineBox[{{2.036730967930748, 1.9817147398525141`}, { 1.0488378122422415`, 2.0424573053853448`}}], LineBox[{{1.0488378122422415`, 2.0424573053853448`}, { 1.0203325939403822`, 1.0212177168242114`}}], LineBox[{{1.0203325939403822`, 1.0212177168242114`}, { 0.9920444869768449, 0.}}]}}, { {Thickness[0.00008333333333333334], LineBox[{{2.036730967930748, 1.9817147398525141`}, { 1.0488378122422415`, 2.0424573053853448`}}], InsetBox["0.1`", {1.5427843900864948`, 2.0120860226189294`}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0488378122422415`, 2.0424573053853448`}, { 2.036730967930748, 1.9817147398525141`}}], InsetBox["0.1`", {1.5427843900864948`, 2.0120860226189294`}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0488378122422415`, 2.0424573053853448`}, { 0.0592888500193518, 2.0376571454329757`}}], InsetBox["0.1`", {0.5540633311307966, 2.0400572254091602`}]}, {Thickness[0.00008333333333333334], LineBox[{{0.0592888500193518, 2.0376571454329757`}, { 1.0488378122422415`, 2.0424573053853448`}}], InsetBox["0.1`", {0.5540633311307966, 2.0400572254091602`}]}, {Thickness[0.00008333333333333334], LineBox[{{2.0400867354458425`, 0.9929318454224567}, { 1.0203325939403822`, 1.0212177168242114`}}], InsetBox["0.1`", {1.5302096646931123`, 1.007074781123334}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0203325939403822`, 1.0212177168242114`}, { 2.0400867354458425`, 0.9929318454224567}}], InsetBox["0.1`", {1.5302096646931123`, 1.007074781123334}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0203325939403822`, 1.0212177168242114`}, {0., 1.05028634257252}}], InsetBox["0.1`", {0.5101662969701911, 1.0357520296983656`}]}, {Thickness[0.00008333333333333334], LineBox[{{0., 1.05028634257252}, {1.0203325939403822`, 1.0212177168242114`}}], InsetBox["0.1`", {0.5101662969701911, 1.0357520296983656`}]}, {Thickness[0.00008333333333333334], LineBox[{{1.9812819134582478`, 0.005272095919768294}, { 0.9920444869768449, 0.}}], InsetBox["0.1`", {1.4866632002175464`, 0.002636047959884147}]}, {Thickness[0.00008333333333333334], LineBox[{{0.9920444869768449, 0.}, {1.9812819134582478`, 0.005272095919768294}}], InsetBox["0.1`", {1.4866632002175464`, 0.002636047959884147}]}, {Thickness[0.00008333333333333334], LineBox[{{0.9920444869768449, 0.}, {0.004729218433089155, 0.06088867661701591}}], InsetBox["0.1`", {0.498386852704967, 0.030444338308507957`}]}, {Thickness[0.00008333333333333334], LineBox[{{0.004729218433089155, 0.06088867661701591}, { 0.9920444869768449, 0.}}], InsetBox["0.1`", {0.498386852704967, 0.030444338308507957`}]}, {Thickness[0.00008333333333333334], LineBox[{{2.036730967930748, 1.9817147398525141`}, { 2.0400867354458425`, 0.9929318454224567}}], InsetBox["0.1`", {2.0384088516882954`, 1.4873232926374853`}]}, {Thickness[0.00008333333333333334], LineBox[{{2.0400867354458425`, 0.9929318454224567}, {2.036730967930748, 1.9817147398525141`}}], InsetBox["0.1`", {2.0384088516882954`, 1.4873232926374853`}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0488378122422415`, 2.0424573053853448`}, { 1.0203325939403822`, 1.0212177168242114`}}], InsetBox["0.1`", {1.0345852030913119`, 1.531837511104778}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0203325939403822`, 1.0212177168242114`}, { 1.0488378122422415`, 2.0424573053853448`}}], InsetBox["0.1`", {1.0345852030913119`, 1.531837511104778}]}, {Thickness[0.00008333333333333334], LineBox[{{0.0592888500193518, 2.0376571454329757`}, {0., 1.05028634257252}}], InsetBox["0.1`", {0.0296444250096759, 1.5439717440027478`}]}, {Thickness[0.00008333333333333334], LineBox[{{0., 1.05028634257252}, {0.0592888500193518, 2.0376571454329757`}}], InsetBox["0.1`", {0.0296444250096759, 1.5439717440027478`}]}, {Thickness[0.00008333333333333334], LineBox[{{2.0400867354458425`, 0.9929318454224567}, { 1.9812819134582478`, 0.005272095919768294}}], InsetBox["0.1`", {2.010684324452045, 0.4991019706711125}]}, {Thickness[0.00008333333333333334], LineBox[{{1.9812819134582478`, 0.005272095919768294}, { 2.0400867354458425`, 0.9929318454224567}}], InsetBox["0.1`", {2.010684324452045, 0.4991019706711125}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0203325939403822`, 1.0212177168242114`}, { 0.9920444869768449, 0.}}], InsetBox["0.1`", {1.0061885404586135`, 0.5106088584121057}]}, {Thickness[0.00008333333333333334], LineBox[{{0.9920444869768449, 0.}, {1.0203325939403822`, 1.0212177168242114`}}], InsetBox["0.1`", {1.0061885404586135`, 0.5106088584121057}]}, {Thickness[0.00008333333333333334], LineBox[{{0., 1.05028634257252}, {0.004729218433089155, 0.06088867661701591}}], InsetBox["0.1`", {0.0023646092165445776`, 0.555587509594768}]}, {Thickness[0.00008333333333333334], LineBox[{{0.004729218433089155, 0.06088867661701591}, {0., 1.05028634257252}}], InsetBox["0.1`", {0.0023646092165445776`, 0.555587509594768}]}}, { InsetBox[ FrameBox["1", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {2.036730967930748, 1.9817147398525141`}], InsetBox[ FrameBox["2", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {1.0488378122422415`, 2.0424573053853448`}], InsetBox[ FrameBox["3", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {0.0592888500193518, 2.0376571454329757`}], InsetBox[ FrameBox["4", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {2.0400867354458425`, 0.9929318454224567}], InsetBox[ FrameBox["5", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {1.0203325939403822`, 1.0212177168242114`}], InsetBox[ FrameBox["6", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {0., 1.05028634257252}], InsetBox[ FrameBox["7", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {1.9812819134582478`, 0.005272095919768294}], InsetBox[ FrameBox["8", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {0.9920444869768449, 0.}], InsetBox[ FrameBox["9", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {0.004729218433089155, 0.06088867661701591}]}}], ",", GraphicsBox[{{ {RGBColor[1, 0, 0], Thickness[0.01], LineBox[{{2.0400867354458425`, 0.9929318454224567}, { 1.0203325939403822`, 1.0212177168242114`}}]}, {RGBColor[1, 0, 0], Thickness[0.01], LineBox[{{2.036730967930748, 1.9817147398525141`}, { 1.0488378122422415`, 2.0424573053853448`}}], LineBox[{{1.0488378122422415`, 2.0424573053853448`}, { 0.0592888500193518, 2.0376571454329757`}}], LineBox[{{0.0592888500193518, 2.0376571454329757`}, {0., 1.05028634257252}}], LineBox[{{0., 1.05028634257252}, {0.004729218433089155, 0.06088867661701591}}], LineBox[{{0.004729218433089155, 0.06088867661701591}, { 0.9920444869768449, 0.}}]}}, { {Thickness[0.00008333333333333334], LineBox[{{2.036730967930748, 1.9817147398525141`}, { 1.0488378122422415`, 2.0424573053853448`}}], InsetBox["0.1`", {1.5427843900864948`, 2.0120860226189294`}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0488378122422415`, 2.0424573053853448`}, { 2.036730967930748, 1.9817147398525141`}}], InsetBox["0.1`", {1.5427843900864948`, 2.0120860226189294`}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0488378122422415`, 2.0424573053853448`}, { 0.0592888500193518, 2.0376571454329757`}}], InsetBox["0.1`", {0.5540633311307966, 2.0400572254091602`}]}, {Thickness[0.00008333333333333334], LineBox[{{0.0592888500193518, 2.0376571454329757`}, { 1.0488378122422415`, 2.0424573053853448`}}], InsetBox["0.1`", {0.5540633311307966, 2.0400572254091602`}]}, {Thickness[0.0013333333333333335`], LineBox[{{2.0400867354458425`, 0.9929318454224567}, { 1.0203325939403822`, 1.0212177168242114`}}], InsetBox["0.4`", {1.5302096646931123`, 1.007074781123334}]}, {Thickness[0.0013333333333333335`], LineBox[{{1.0203325939403822`, 1.0212177168242114`}, { 2.0400867354458425`, 0.9929318454224567}}], InsetBox["0.4`", {1.5302096646931123`, 1.007074781123334}]}, {Thickness[0.0013333333333333335`], LineBox[{{1.0203325939403822`, 1.0212177168242114`}, {0., 1.05028634257252}}], InsetBox["0.4`", {0.5101662969701911, 1.0357520296983656`}]}, {Thickness[0.00008333333333333334], LineBox[{{0., 1.05028634257252}, {1.0203325939403822`, 1.0212177168242114`}}], InsetBox["0.1`", {0.5101662969701911, 1.0357520296983656`}]}, {Thickness[0.00008333333333333334], LineBox[{{1.9812819134582478`, 0.005272095919768294}, { 0.9920444869768449, 0.}}], InsetBox["0.1`", {1.4866632002175464`, 0.002636047959884147}]}, {Thickness[0.00008333333333333334], LineBox[{{0.9920444869768449, 0.}, {1.9812819134582478`, 0.005272095919768294}}], InsetBox["0.1`", {1.4866632002175464`, 0.002636047959884147}]}, {Thickness[0.00008333333333333334], LineBox[{{0.9920444869768449, 0.}, {0.004729218433089155, 0.06088867661701591}}], InsetBox["0.1`", {0.498386852704967, 0.030444338308507957`}]}, {Thickness[0.00008333333333333334], LineBox[{{0.004729218433089155, 0.06088867661701591}, { 0.9920444869768449, 0.}}], InsetBox["0.1`", {0.498386852704967, 0.030444338308507957`}]}, {Thickness[0.00008333333333333334], LineBox[{{2.036730967930748, 1.9817147398525141`}, { 2.0400867354458425`, 0.9929318454224567}}], InsetBox["0.1`", {2.0384088516882954`, 1.4873232926374853`}]}, {Thickness[0.0013333333333333335`], LineBox[{{2.0400867354458425`, 0.9929318454224567}, {2.036730967930748, 1.9817147398525141`}}], InsetBox["0.4`", {2.0384088516882954`, 1.4873232926374853`}]}, {Thickness[0.00008333333333333334], LineBox[{{1.0488378122422415`, 2.0424573053853448`}, { 1.0203325939403822`, 1.0212177168242114`}}], InsetBox["0.1`", {1.0345852030913119`, 1.531837511104778}]}, {Thickness[0.0013333333333333335`], LineBox[{{1.0203325939403822`, 1.0212177168242114`}, { 1.0488378122422415`, 2.0424573053853448`}}], InsetBox["0.4`", {1.0345852030913119`, 1.531837511104778}]}, {Thickness[0.00008333333333333334], LineBox[{{0.0592888500193518, 2.0376571454329757`}, {0., 1.05028634257252}}], InsetBox["0.1`", {0.0296444250096759, 1.5439717440027478`}]}, {Thickness[0.00008333333333333334], LineBox[{{0., 1.05028634257252}, {0.0592888500193518, 2.0376571454329757`}}], InsetBox["0.1`", {0.0296444250096759, 1.5439717440027478`}]}, {Thickness[0.0013333333333333335`], LineBox[{{2.0400867354458425`, 0.9929318454224567}, { 1.9812819134582478`, 0.005272095919768294}}], InsetBox["0.4`", {2.010684324452045, 0.4991019706711125}]}, {Thickness[0.00008333333333333334], LineBox[{{1.9812819134582478`, 0.005272095919768294}, { 2.0400867354458425`, 0.9929318454224567}}], InsetBox["0.1`", {2.010684324452045, 0.4991019706711125}]}, {Thickness[0.0013333333333333335`], LineBox[{{1.0203325939403822`, 1.0212177168242114`}, { 0.9920444869768449, 0.}}], InsetBox["0.4`", {1.0061885404586135`, 0.5106088584121057}]}, {Thickness[0.00008333333333333334], LineBox[{{0.9920444869768449, 0.}, {1.0203325939403822`, 1.0212177168242114`}}], InsetBox["0.1`", {1.0061885404586135`, 0.5106088584121057}]}, {Thickness[0.00008333333333333334], LineBox[{{0., 1.05028634257252}, {0.004729218433089155, 0.06088867661701591}}], InsetBox["0.1`", {0.0023646092165445776`, 0.555587509594768}]}, {Thickness[0.00008333333333333334], LineBox[{{0.004729218433089155, 0.06088867661701591}, {0., 1.05028634257252}}], InsetBox["0.1`", {0.0023646092165445776`, 0.555587509594768}]}}, { InsetBox[ FrameBox["1", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {2.036730967930748, 1.9817147398525141`}], InsetBox[ FrameBox["2", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {1.0488378122422415`, 2.0424573053853448`}], InsetBox[ FrameBox["3", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {0.0592888500193518, 2.0376571454329757`}], InsetBox[ FrameBox["4", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {2.0400867354458425`, 0.9929318454224567}], InsetBox[ FrameBox["5", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {1.0203325939403822`, 1.0212177168242114`}], InsetBox[ FrameBox["6", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {0., 1.05028634257252}], InsetBox[ FrameBox["7", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {1.9812819134582478`, 0.005272095919768294}], InsetBox[ FrameBox["8", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput->False], {0.9920444869768449, 0.}], InsetBox[ FrameBox["9", Background->RGBColor[1, 1, 0.8], FrameStyle->RGBColor[0.94, 0.85, 0.36], StripOnInput-> False], {0.004729218433089155, 0.06088867661701591}]}}]}], "}"}]], "Output", CellChangeTimes->{3.417293174670559*^9, 3.417418103503688*^9}] }, {2}]], Cell[TextData[{ StyleBox["Figure 5. ", "SB"], "The first picture shows the ititial state, and the second picture shows the \ state after ten iterations. The area around NE four and five have become \ unattractive enough to change the path of (1,8)." }], "NumberedFigureCaption", CellChangeTimes->{{3.417293208544434*^9, 3.417293323307447*^9}, { 3.4174086380743732`*^9, 3.417408659821542*^9}, {3.417423426393379*^9, 3.417423428228636*^9}, {3.4174245097167397`*^9, 3.417424529945071*^9}, { 3.417428275876144*^9, 3.4174282945532503`*^9}}, CellTags->"Fig5"], Cell[TextData[{ "It is out of the scope of this paper to provide a full analysis of this \ approach. However, it does demonstrate that network modelling can almost \ entirely be done in ", StyleBox["Mathematica ", FontSlant->"Italic"], "and use ACs for monitoring and control only." }], "Text", CellChangeTimes->{{3.417293455006072*^9, 3.41729366354688*^9}, { 3.4172937138934097`*^9, 3.4172937140249453`*^9}, {3.4172943459705753`*^9, 3.41729440008782*^9}, {3.417294468891341*^9, 3.4172945252529163`*^9}, { 3.417408522579248*^9, 3.417408620646501*^9}, {3.4174140172662563`*^9, 3.4174140349213123`*^9}, {3.417417468908107*^9, 3.4174174724552402`*^9}, { 3.417418137643846*^9, 3.4174181395670547`*^9}, {3.417423443942355*^9, 3.4174234536433496`*^9}, {3.417424571071897*^9, 3.4174245771834383`*^9}, 3.417424607946706*^9}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Discussion and Future Work", "Section", CellChangeTimes->{{3.4165677927453136`*^9, 3.416567797904736*^9}}], Cell["\<\ When networks support the elementary functions of the UPVN framework, users \ can develop programs to change and optimize network behavior. Network \ services are implemented as software objects that expose their interfaces as \ web services, which can be consumed to develop new or modify existing network \ behavior. In this article, the emphasis was on the communication between the \ network and Mathematica.\ \>", "Text", CellChangeTimes->{3.41737041388218*^9}], Cell["\<\ In our experiments, we have found three limiting factors in centralized \ network adaptation. The first limitations are the scope and time-scale of \ adaptations. In the UPVN test bed, a single Mathematica instance controls \ network behavior. Since in practice communication between ACs and Mathematica \ was in the range of seconds, it puts a bound to what can be monitored and \ adapted simultaneously. Third, to support real-time interactions with \ Mathematica, the J/Link interface provided a work-around by offloading \ complex real-time network communication from the kernel. It remains to be \ seen if this approach allows large and frequent updates and how this affects \ the front-end responsiveness. Tests upon now were successful in update cycles \ of seconds, which is already good enough to address many problems.\ \>", "Text", CellChangeTimes->{{3.417327989282284*^9, 3.417328015888043*^9}, 3.4173704260379553`*^9, 3.417418514779866*^9, {3.417423502862541*^9, 3.4174235155382233`*^9}}], Cell["\<\ The next step is to embed Mathematica in NEs and explore distributed \ adaptation algorithms. It allows Mathematica to orchestrate the network at \ different levels and scopes and allow the development of adaptation \ hierarchies each with their own adaptation algorithm. The question here is: \ what if network adaptation programs are distributed over the network?\ \>", "Text", CellChangeTimes->{{3.417327993354789*^9, 3.417327998316711*^9}, 3.417370434182582*^9, {3.417423527279236*^9, 3.4174235277219133`*^9}}], Cell["\<\ The presented concepts and software framework are currently being applied in \ two applications. The first application integrates Mathematica with \ StarPlane's middleware for light path visualization and control. Using our \ software framework, Mathematica can proactively switch light paths based on \ traffic measurements at the edges of a computing cluster. Shortest edge \ disjoint paths calculated from Mathematica will be used to switch and \ aggregate additional paths when clusters overload one path. The second \ application uses Mathematica to visualize, analyze and automatically adapt a \ VMware infrastructure. In a continuous loop, a linear program will calculate \ the optimal placement of VMwares considering their power consumption and \ adapt the VMware infrastructure to reflect the new optimal state.\ \>", "Text", CellChangeTimes->{{3.416567846389821*^9, 3.416567848523387*^9}, 3.4173280009507217`*^9, 3.417370443978256*^9, {3.417423565880246*^9, 3.417423567729309*^9}, {3.417426415389415*^9, 3.4174264523358517`*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["Conclusion", "Section"], Cell["\<\ Mathematica\[CloseCurlyQuote]s powerful symbolic programming language, large \ collection of algorithms and its ability to interface with Java and web \ services makes it a suitable research tool for the development of \ \[OpenCurlyQuote]better-than-best-effort\[CloseCurlyQuote] network services. \ By utilizing UPVNs, Mathematica programs can move applications, reprioritize \ traffic or reroute connections to achieve optimal network performance in a \ single integrated environment. This aspect enables interaction between \ different adaptation programs and opens the way to multi-scale network \ optimization.\ \>", "Text", CellChangeTimes->{ 3.417367982719057*^9, {3.417423581868435*^9, 3.417423602336608*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["References", "Section"], Cell["\<\ [1]\tC. Riziotis and A. V. Vasilakos, \"Computational intelligence in \ photonics technology and optical networks: A survey and future \ perspectives\", Information Sciences, vol. 177, pp. 5292-5315, 2007.\ \>", "Reference", CellChangeTimes->{{3.417370629161675*^9, 3.417370652584778*^9}}, CellTags->"Ref1"], Cell["\<\ [2]\tR. J. Meijer, R. J. Strijkers, L. Gommans, and C. de Laat, \"User \ Programmable Virtualized Networks\", in Proceedings of the Second IEEE \ International Conference on e-Science and Grid Computing: IEEE Computer \ Society, 2006.\ \>", "Reference", CellChangeTimes->{{3.4173706447831593`*^9, 3.417370660744657*^9}}, CellTags->"Ref2"], Cell["\<\ [3]\tD. Griffin and D. Pesch, \"A survey on web services in \ telecommunications\", IEEE Communications Magazine, vol. 45, pp. 28-+, Jul \ 2007.\ \>", "Reference", CellChangeTimes->{{3.417370672405847*^9, 3.4173706802564173`*^9}}, CellTags->"Ref3"], Cell["\<\ [4]\tE. Grasa, G. Junyent, S. Figuerola, A. Lopez, and M. Savoie, \"UCLPv2: A \ network virtualization framework built on web services\", IEEE Communications \ Magazine, vol. 46, pp. 126-134, Mar 2008.\ \>", "Reference", CellChangeTimes->{{3.417370690389435*^9, 3.417370694650339*^9}}, CellTags->"Ref4"], Cell["\<\ [5]\tP. Grosso, L. Xu, J. P. Velders, and C. de Laat, \"StarPlane - a \ national dynamic photonic network controlled by grid applications\", Internet \ Research: Electronic Networking Applications and Policy, vol. 17, pp. \ 546-553, 2007.\ \>", "Reference", CellChangeTimes->{{3.417370704225327*^9, 3.417370711631448*^9}, { 3.4174257470140667`*^9, 3.417425814839634*^9}, {3.4174259019673758`*^9, 3.417425922156917*^9}, {3.417426390188649*^9, 3.417426405978011*^9}}, CellTags->"Ref5"], Cell["\<\ [6]\tXen Hypervisor, http://xen.org (accessed at 20 April 2008)\ \>", "Reference", CellChangeTimes->{{3.417370720203577*^9, 3.417370724857542*^9}}, CellTags->"Ref6"], Cell["\<\ [7]\tVMWare, http://www.vmware.com (accessed at 2 August 2007)\ \>", "Reference", CellChangeTimes->{{3.417370734928172*^9, 3.417370738350718*^9}}, CellTags->"Ref7"], Cell["\<\ [8]\tNetwork Mapper, http://nmap.org (accessed at 7 April 2008)\ \>", "Reference", CellChangeTimes->{{3.41737074587119*^9, 3.4173707494784117`*^9}}, CellTags->"Ref8"], Cell["\<\ [9]\tIperf, http://dast.nlanr.net/Projects/Iperf/ (accessed at 20 April 2008)\ \ \>", "Reference", CellChangeTimes->{{3.4173707557358637`*^9, 3.417370759230041*^9}}, CellTags->"Ref9"], Cell["\<\ [10]\tJ. W. Suurballe, \"Disjoint paths in a network\", Networks, vol. 4, pp. \ 125-145, 1974.\ \>", "Reference", CellChangeTimes->{3.4173707660792313`*^9}, CellTags->"Ref10"], Cell["\<\ [11]\tS. Toumpis, \"Mother nature knows best: A survey of recent results on wireless networks based on analogies with physics\", Computer Networks, vol. \ 52, pp. 360-383, 2008.\ \>", "Reference", CellChangeTimes->{{3.417410927804837*^9, 3.417410931251976*^9}}, CellTags->"Ref11"], Cell["\<\ Rudolf J. Strijkers (1981) received a BSc and MSc degree in computer science \ from the University of Amsterdam. He currently pursues a PhD degree at the \ same university and works for the Dutch institute for applied scientific \ research TNO. His scientific interests are in adaptive, programmable and \ intelligent networks. He uses Mathematica to implement and test new concepts \ and ideas.\ \>", "TextAboutAuthor", CellChangeTimes->{{3.416567929019237*^9, 3.4165681214207993`*^9}, { 3.416568155716578*^9, 3.4165681626924877`*^9}, 3.416568483212173*^9, { 3.416670982728285*^9, 3.416671067505764*^9}, {3.416671097624679*^9, 3.416671180471449*^9}, {3.416671213671217*^9, 3.416671218758328*^9}, { 3.4173404614567966`*^9, 3.417340466582333*^9}, 3.4173573408751993`*^9, { 3.4173574187763977`*^9, 3.4173574252992973`*^9}, 3.4173672848197937`*^9}], Cell["\<\ Robert J. Meijer (1959) received a PhD degree in experimental nuclear physics \ of the University of Utrecht. He switched to ICT research at TNO in 1991 and \ became professor at the University of Amsterdam in 2002. His scientific \ interests are next generation networks and computer technologies with \ application-specific dynamic adaptation capabilities.\ \>", "TextAboutAuthor", CellChangeTimes->{{3.416567929019237*^9, 3.4165681214207993`*^9}, { 3.416568155716578*^9, 3.4165681626924877`*^9}, 3.416568483212173*^9, { 3.416670982728285*^9, 3.416671067505764*^9}, {3.416671097624679*^9, 3.416671180471449*^9}, {3.416671213671217*^9, 3.416671218758328*^9}, { 3.4173404614567966`*^9, 3.417340466582333*^9}, {3.4173573408751993`*^9, 3.417357367301053*^9}, 3.417367294363288*^9, {3.417367348077743*^9, 3.417367350198061*^9}, {3.417370809945263*^9, 3.417370810701367*^9}}] }, Open ]] }, Editable->True, WindowSize->{826, 763}, WindowMargins->{{73, Automatic}, {Automatic, 0}}, PrintingCopies->2, PrintingPageRange->{1, Automatic}, FrontEndVersion->"6.0 for Mac OS X x86 (32-bit) (February 7, 2008)", StyleDefinitions->"IMS 2008.nb" ] (* End of Notebook Content *) (* Internal cache information *) (*CellTagsOutline CellTagsIndex->{ "Fig 1"->{ Cell[71593, 1226, 466, 9, 20, "NumberedFigureCaption", CellTags->"Fig 1"]}, "Fig 2"->{ Cell[119038, 1963, 992, 16, 72, "NumberedFigureCaption", CellTags->"Fig 2"]}, "Fig3"->{ Cell[126170, 2124, 813, 13, 71, "Text", CellTags->"Fig3"]}, "Fig4"->{ Cell[152661, 2810, 664, 12, 46, "NumberedFigureCaption", CellTags->"Fig4"]}, "Fig5"->{ Cell[196523, 3690, 564, 10, 46, "NumberedFigureCaption", CellTags->"Fig5"], Cell[230102, 4498, 564, 10, 33, "NumberedFigureCaption", CellTags->"Fig5"]}, "Ref1"->{ Cell[235643, 4612, 319, 6, 33, "Reference", CellTags->"Ref1"]}, "Ref10"->{ Cell[238140, 4681, 187, 5, 20, "Reference", CellTags->"Ref10"]}, "Ref11"->{ Cell[238330, 4688, 292, 6, 33, "Reference", CellTags->"Ref11"]}, "Ref2"->{ Cell[235965, 4620, 350, 7, 33, "Reference", CellTags->"Ref2"]}, "Ref3"->{ Cell[236318, 4629, 260, 6, 20, "Reference", CellTags->"Ref3"]}, "Ref4"->{ Cell[236581, 4637, 315, 6, 33, "Reference", CellTags->"Ref4"]}, "Ref5"->{ Cell[236899, 4645, 500, 9, 33, "Reference", CellTags->"Ref5"]}, "Ref6"->{ Cell[237402, 4656, 177, 4, 20, "Reference", CellTags->"Ref6"]}, "Ref7"->{ Cell[237582, 4662, 176, 4, 20, "Reference", CellTags->"Ref7"]}, "Ref8"->{ Cell[237761, 4668, 178, 4, 20, "Reference", CellTags->"Ref8"]}, "Ref9"->{ Cell[237942, 4674, 195, 5, 20, "Reference", CellTags->"Ref9"]} } *) (*CellTagsIndex CellTagsIndex->{ {"Fig 1", 240775, 4740}, {"Fig 2", 240868, 4743}, {"Fig3", 240962, 4746}, {"Fig4", 241038, 4749}, {"Fig5", 241131, 4752}, {"Ref1", 241305, 4757}, {"Ref10", 241386, 4760}, {"Ref11", 241468, 4763}, {"Ref2", 241549, 4766}, {"Ref3", 241629, 4769}, {"Ref4", 241709, 4772}, {"Ref5", 241789, 4775}, {"Ref6", 241869, 4778}, {"Ref7", 241949, 4781}, {"Ref8", 242029, 4784}, {"Ref9", 242109, 4787} } *) (*NotebookFileOutline Notebook[{ Cell[568, 21, 43711, 728, 58, "IMS2008Banner"], Cell[44282, 751, 183, 4, 20, "IMS2008Banner"], Cell[44468, 757, 199, 4, 20, "IMS2008Banner"], Cell[44670, 763, 180, 5, 20, "IMS2008Title"], Cell[44853, 770, 302, 8, 20, "Author"], Cell[45158, 780, 303, 8, 20, "SecondAuthor"], Cell[45464, 790, 302, 6, 46, "Address"], Cell[45769, 798, 1580, 23, 111, "Abstract"], Cell[47352, 823, 36, 0, 20, "SectionFirst"], Cell[47391, 825, 937, 14, 86, "Text"], Cell[48331, 841, 700, 12, 71, "Text"], Cell[49034, 855, 1097, 17, 116, "Text"], Cell[50134, 874, 716, 11, 71, "Text"], Cell[50853, 887, 714, 11, 71, "Text"], Cell[CellGroupData[{ Cell[51592, 902, 183, 4, 67, "Section"], Cell[51778, 908, 940, 14, 101, "Text"], Cell[52721, 924, 538, 10, 56, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[53296, 939, 105, 1, 67, "Section"], Cell[53404, 942, 1512, 22, 146, "Text"], Cell[54919, 966, 16671, 258, 160, "Graphics"], Cell[71593, 1226, 466, 9, 20, "NumberedFigureCaption", CellTags->"Fig 1"], Cell[72062, 1237, 919, 13, 101, "Text"], Cell[72984, 1252, 46051, 709, 440, "Graphics"], Cell[119038, 1963, 992, 16, 72, "NumberedFigureCaption", CellTags->"Fig 2"], Cell[120033, 1981, 610, 10, 71, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[120680, 1996, 202, 3, 67, "Section"], Cell[120885, 2001, 834, 13, 86, "Text"], Cell[121722, 2016, 363, 6, 56, "Text"], Cell[122088, 2024, 209, 6, 56, "Text"], Cell[122300, 2032, 874, 14, 86, "Text"], Cell[123177, 2048, 2990, 74, 268, "Input"], Cell[126170, 2124, 813, 13, 71, "Text", CellTags->"Fig3"], Cell[126986, 2139, 875, 13, 86, "Text"], Cell[CellGroupData[{ Cell[127886, 2156, 159, 2, 34, "Subsection"], Cell[128048, 2160, 116, 1, 26, "Text"], Cell[128167, 2163, 261, 4, 43, "Input"], Cell[CellGroupData[{ Cell[128453, 2171, 6779, 201, 298, "Input"], Cell[135235, 2374, 17414, 433, 415, "Output"] }, {2}]], Cell[152661, 2810, 664, 12, 46, "NumberedFigureCaption", CellTags->"Fig4"], Cell[153328, 2824, 1237, 18, 86, "Text"], Cell[154568, 2844, 1572, 42, 73, "Input"], Cell[156143, 2888, 239, 4, 26, "Text"], Cell[156385, 2894, 1307, 40, 88, "Input"], Cell[CellGroupData[{ Cell[157717, 2938, 226, 4, 27, "Input"], Cell[157946, 2944, 355, 6, 27, "Output"] }, Open ]], Cell[158316, 2953, 178, 4, 26, "Text"], Cell[CellGroupData[{ Cell[158519, 2961, 791, 22, 43, "Input"], Cell[159313, 2985, 2431, 49, 223, "Output"] }, Open ]], Cell[161759, 3037, 434, 7, 41, "Text"], Cell[162196, 3046, 3210, 79, 133, "Input"], Cell[165409, 3127, 318, 5, 41, "Text"], Cell[CellGroupData[{ Cell[165752, 3136, 763, 15, 73, "Input"], Cell[166518, 3153, 770, 16, 58, "Output"] }, Open ]], Cell[167303, 3172, 567, 9, 41, "Text"], Cell[167873, 3183, 3325, 90, 208, "Input"], Cell[CellGroupData[{ Cell[171223, 3277, 625, 16, 27, "Input"], Cell[171851, 3295, 749, 16, 58, "Output"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[172649, 3317, 109, 1, 34, "Subsection"], Cell[172761, 3320, 1730, 26, 116, "Text"], Cell[174494, 3348, 22026, 340, 175, "Graphics"], Cell[196523, 3690, 564, 10, 46, "NumberedFigureCaption", CellTags->"Fig5"], Cell[197090, 3702, 378, 6, 41, "Text"], Cell[197471, 3710, 394, 12, 27, "Input"], Cell[CellGroupData[{ Cell[197890, 3726, 2397, 78, 148, "Input"], Cell[200290, 3806, 216, 5, 27, "Output"] }, Open ]], Cell[200521, 3814, 249, 5, 26, "Text"], Cell[CellGroupData[{ Cell[200795, 3823, 272, 7, 27, "Input"], Cell[201070, 3832, 94, 2, 27, "Output"] }, Open ]], Cell[201179, 3837, 936, 14, 86, "Text"], Cell[202118, 3853, 4447, 110, 268, "Input"], Cell[CellGroupData[{ Cell[206590, 3967, 7989, 216, 358, "Input"], Cell[214582, 4185, 15508, 310, 202, "Output"] }, {2}]], Cell[230102, 4498, 564, 10, 33, "NumberedFigureCaption", CellTags->"Fig5"], Cell[230669, 4510, 847, 15, 41, "Text"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[231565, 4531, 113, 1, 67, "Section"], Cell[231681, 4534, 477, 8, 56, "Text"], Cell[232161, 4544, 1020, 15, 101, "Text"], Cell[233184, 4561, 529, 8, 56, "Text"], Cell[233716, 4571, 1059, 15, 101, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[234812, 4591, 29, 0, 67, "Section"], Cell[234844, 4593, 730, 12, 71, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[235611, 4610, 29, 0, 67, "Section"], Cell[235643, 4612, 319, 6, 33, "Reference", CellTags->"Ref1"], Cell[235965, 4620, 350, 7, 33, "Reference", CellTags->"Ref2"], Cell[236318, 4629, 260, 6, 20, "Reference", CellTags->"Ref3"], Cell[236581, 4637, 315, 6, 33, "Reference", CellTags->"Ref4"], Cell[236899, 4645, 500, 9, 33, "Reference", CellTags->"Ref5"], Cell[237402, 4656, 177, 4, 20, "Reference", CellTags->"Ref6"], Cell[237582, 4662, 176, 4, 20, "Reference", CellTags->"Ref7"], Cell[237761, 4668, 178, 4, 20, "Reference", CellTags->"Ref8"], Cell[237942, 4674, 195, 5, 20, "Reference", CellTags->"Ref9"], Cell[238140, 4681, 187, 5, 20, "Reference", CellTags->"Ref10"], Cell[238330, 4688, 292, 6, 33, "Reference", CellTags->"Ref11"], Cell[238625, 4696, 872, 13, 46, "TextAboutAuthor"], Cell[239500, 4711, 903, 13, 46, "TextAboutAuthor"] }, Open ]] } ] *) (* End of internal cache information *)