[or-cvs] r10687: finished documentation for impl classes, unified rest of doc (in puppetor/trunk: doc src/de/uniba/wiai/lspi/puppetor src/de/uniba/wiai/lspi/puppetor/examples src/de/uniba/wiai/lspi/puppetor/impl)

kloesing at seul.org kloesing at seul.org
Wed Jun 27 22:09:48 UTC 2007


Author: kloesing
Date: 2007-06-27 18:09:47 -0400 (Wed, 27 Jun 2007)
New Revision: 10687

Modified:
   puppetor/trunk/doc/howto.aux
   puppetor/trunk/doc/howto.pdf
   puppetor/trunk/doc/howto.tex
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ClientApplication.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/DirectoryNode.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Event.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventManager.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Network.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkFactory.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkState.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NodeState.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ProxyNode.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/RouterNode.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ServerApplication.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/TorProcessException.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AccessingPublicWebServerOverTor.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingHiddenServiceToPublicTorNetwork.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ClientApplicationImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventManagerImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/NetworkImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ServerApplicationImpl.java
Log:
finished documentation for impl classes, unified rest of documentation, fine-tuned howto

Modified: puppetor/trunk/doc/howto.aux
===================================================================
--- puppetor/trunk/doc/howto.aux	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/doc/howto.aux	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,8 +1,9 @@
-\relax 
-\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}}
-\@writefile{toc}{\contentsline {section}{\numberline {2}Installation}{2}}
-\@writefile{toc}{\contentsline {section}{\numberline {3}Example 1: Accessing public Web server over Tor}{3}}
-\@writefile{toc}{\contentsline {section}{\numberline {4}Example 2: Advertising hidden service to public Tor network}{5}}
-\@writefile{toc}{\contentsline {section}{\numberline {5}Example 3: Advertising and accessing hidden service over public Tor network}{6}}
-\@writefile{toc}{\contentsline {section}{\numberline {6}Example 4: Advertising and accessing hidden service over private Tor network}{7}}
-\@writefile{toc}{\contentsline {section}{\numberline {7}Known issues}{9}}
+\relax 
+\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}}
+\@writefile{toc}{\contentsline {section}{\numberline {2}Installation}{2}}
+\@writefile{toc}{\contentsline {section}{\numberline {3}Example 1: Accessing public Web server over Tor}{3}}
+\@writefile{toc}{\contentsline {section}{\numberline {4}Example 2: Advertising hidden service to public Tor network}{5}}
+\@writefile{toc}{\contentsline {section}{\numberline {5}Example 3: Advertising and accessing hidden service over public Tor network}{6}}
+\@writefile{toc}{\contentsline {section}{\numberline {6}Example 4: Advertising and accessing hidden service over private Tor network}{8}}
+\@writefile{toc}{\contentsline {section}{\numberline {7}Architecture}{10}}
+\@writefile{toc}{\contentsline {section}{\numberline {8}Known issues}{10}}

Modified: puppetor/trunk/doc/howto.pdf
===================================================================
--- puppetor/trunk/doc/howto.pdf	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/doc/howto.pdf	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,1423 +1,1260 @@
-%PDF-1.2
-9 0 obj
-<<
-/Type/Font
-/Subtype/Type1
-/Name/F1
-/FontDescriptor 8 0 R
-/BaseFont/XEEAJR+CMR17
-/FirstChar 33
-/LastChar 196
-/Widths[249.6 458.6 772.1 458.6 772.1 719.8 249.6 354.1 354.1 458.6 719.8 249.6 301.9
-249.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 249.6 249.6
-249.6 719.8 432.5 432.5 719.8 693.3 654.3 667.6 706.6 628.2 602.1 726.3 693.3 327.6
-471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3
-693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8
-458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1
-510.9 484.7 667.6 484.7 484.7 406.4 458.6 917.2 458.6 458.6 458.6 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 576 772.1 719.8 641.1 615.3 693.3
-667.6 719.8 667.6 719.8 0 0 667.6 525.4 499.3 499.3 748.9 748.9 249.6 275.8 458.6
-458.6 458.6 458.6 458.6 693.3 406.4 458.6 667.6 719.8 458.6 837.2 941.7 719.8 249.6
-458.6]
+%PDF-1.4
+3 0 obj <<
+/Length 2577      
+/Filter /FlateDecode
 >>
+stream
+xÚ•ÉrëÆñ®¯ÀÍ`•€`»Oy.ljuH9eåäø+u^–¥¡.´÷ºýÍÿe>6Î|óºÉ¿ß(Øüþúâ™ã8Ò^ UXª¼ ð/›+¯ËÏßy	¤ÐQ)ʁsI?9꧈Q¨„”{YXæ K at J€ÿ8O½8ÌTËñ7¤óPxÁ
+ªQó9¨>/ ÐšÙ•ê«:’Ð>q³Þyg‚C5-`U@
+ŒÚfª&#¤§ƒáA-WVþ"•ìg¢<5°Û™ßïø+¢'šØ=Ñ)QªZ6Ò4%&9¨ÁZÜËJ*Ð+‘˜‘i¾KÂu™$—æó-
+ñáÔŠïZ7îewâ#ë3hÂpÃyc-·)"B#î+§ïÞzs‹œ€9­.Æ…_2Ö~œ[ÒüA0âåR4zsæýº4gµœÚÉY¿ë'žy\mIƒ‹C\цyàØÇ+¨?cށ¾EÛ7hàˆÉyû™ó–J¸è¤…ŽïÕ8Ó’™(Öh¥¿ÄêUZ¾bH„Yj#’¦3Vµ—M´wtߨ¡}ÓUKî€x¶°BÅÑÊ’;2Yü1¢íQ}˜®L'ã¹ÛØ2ˆèt
+{€øÙP"C ¹Ffev{LªðB®(έÝóΝ²²§õµ-l’˜C6 ñQ¼â8Šrq
+J’‡!þ‡¶Ä’
+ሴ°×P#K`\@q¨ ṟ²˜®(¹:L	ÃØÏѽoÛµ@î„ø$	£ÚºUðŽoC<¤ØP©ce
+}wÄ=*´ƒÔ^6ÖàxUVsaEgu³8¬Í4ÛŒ<J
+·a“…ÝÏCcµODÍ(u–D—e;`Ö¶ì»(çÑìf”Á÷óu˜g9–:p7m{]ô_(C~4Û¸Q8q›1ÐkBáÜՏ·*¸Úó#ë±°ÁŠŠ„ ¶«V endobj
-12 0 obj
-<<
-/Type/Font
-/Subtype/Type1
-/Name/F2
-/FontDescriptor 11 0 R
-/BaseFont/NJEYML+CMR12
-/FirstChar 33
-/LastChar 196
-/Widths[272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6
-489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4
-462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2
-734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6
-272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6
-544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8 435.2 489.6 979.2 489.6 489.6
-489.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611.8 816
-761.6 679.6 652.8 734 707.2 761.6 707.2 761.6 0 0 707.2 571.2 544 544 816 816 272
-299.2 489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6
-761.6 272 489.6]
+2 0 obj <<
+/Type /Page
+/Contents 3 0 R
+/Resources 1 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 25 0 R
+>> endobj
+1 0 obj <<
+/Font << /F15 6 0 R /F16 9 0 R /F26 12 0 R /F8 15 0 R /F7 18 0 R /F18 21 0 R /F17 24 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+28 0 obj <<
+/Length 2399      
+/Filter /FlateDecode
 >>
+stream
+xÚÅYI“Ûº¾ûWÌ‘ª²h®åÛ¼”]™wˆ]±ªR©$Š„$d(‚áâñ¼_ŸÞ+Ž›"
+L¿Ù¦Å>hÕ¸IŠàe“ìq-žq½ʶf‚ÊÀ(¦jän³RµÙÆ’ŸM+[T¸¢˜æFÛå0õŠ‡-Þ1Õ€³›mÅÁ­ÄÕ×0,ìI½Ab–€ï?•c…Â]7ÿ9þþ=lã8<äyBª˜3¥i0˜›½fWä;¡Pu¯êIaø¯f²‚àL9^¨&’®Ý’I÷p9¹üØ£…¦~PQÜ°ß°{Рë`Ò誵Ž¸^+b]õú4³ffrœkùô2`Û:=Àa`.;/ZôyŽ¶¾j¹ï“¾dOlYŸ8YzXZóífúçüçÁoÂ/ÉrVùáäŒÌˆÁU¤(…‚ÁЏ¥nq!JÄÐÏMž£Í0Sy!q„ÞàÍ?7Œԝ½ôõÐí…ç¯|ŽtYõßQœ]&ґ켂$i¬eÅßì|{d4ï±ØÃgb'a¼ßåKÄ`©<Š‚'´RŽþc¬‹®½ëp¯V³~(Šé÷½ì£=.jË &¨+2´ÈEÆÿ—¼4²`hI9<K:˜ä¡!ñАFˆñgòøÀÓÒiÄyOˆ¬eaÜ*—	"aëúÖ5Ë4JÛäÅW´¦¤G„j¡ÿ Ô6¢¥É)ÀƒœqNÅKg¸£`¸! «ÅÑwá nÈ@òÔ~ŽO³„qâü®­ùÈÉjãù)Êb=賊FR*ÉÃÛlWGHj˜i³”ìƒùJ¦Z®-™YK¶ØŽ=8ÚðòX·gžá#·‚‰ªl?bx€í1”v9pÃßíL¦U<!äº8F¾¢>r¶QeÍt$)p©a¥1xä³ç÷Ñ+¯sM¥«Õ_„Cc.<X>3Ù4Œ#Þ»íûáBÙ·È:éaçëAÉ@åm’2%R8DÐ p¾ë^õT)YÒ£8c²ïˆ¹ó›ò˜4Jê3”b0¼GµD9ò!ôî„°¿YÐ^®üA‚C&;âixèj œ8Ë]`ý€¿~Ž3,¸$«†	L_Ï•­7‘E-¤Ï,tOUNƒ=Z+	áÖ±p­ö¼¹R2P¿ÑCqÑ­}G`ˆN¿³áÀd×ràWª–—¤P$«ÒÓï£ÔÇ7²‡Bœ7hé—l÷ÚÅ+ä‘Æÿ#b@õ~IH:Ôž]¶iœr^RýO]ÍÉ9- `y_ÓoP“6ReÅž†iÌ‘6a®depÔ/_Iå&æALDÊð/UA<£™F—Êâìm¶gPšÑ«¹á¶Ô™…&VW÷<*ÛÃ$Eær•WYðtæC”’¡‡Iö«ÛdωÈLR"}Ù2iÙŒªoùöÌËEñ‰3Ë—€­I”ÜÕ³¸‹­ÕžªÛ]­<sK¹ÒÌF1º¸g!Ëä…ÎYظ(©ùYÏÙ癄ü“}k
+.ád_L#ç2.[Ká7q5½ñ\7y7ÃH5ÌäìJŽU¥I<x„l‹QÑ+Iôì{UMciÕHѸo£daIÏ+V1ìÕž2yãB¶¿ÃÊŸy¡ä#™Ÿv+iÚWüʹÅØö`N5àÐZPÖ˜²^<	 …ê*^„úšä4‡F?¸ÞÆÙÉoÄQȹ鰤~-4¿ÝøqÂÜTaÌïÉjÒ}<~F*Þh+òýzx1ßÓ<Á^s ÐiQâööÒ<…HᮦsÅ/,JC¤¦I©/¢ãŠgn*ø;iyaÊÊÜnË’°hÛ•÷«3¿<Nô$â¨Öôi´A¡—§ÜÂè>îøË,–ŒK4¾!­\ž-®u¨Ç
+‡ú
+õOJ–ñkmvÃid°OO ·Kª5aôà‚v×TãÇtïõŽ÷a”¤9\ˆ÷„á' ­Ææík	
+hœ{!Ä~ºaøðÍ'º­|æ˽ endobj
-15 0 obj
-<<
-/Type/Font
-/Subtype/Type1
-/Name/F3
-/FontDescriptor 14 0 R
-/BaseFont/SFIZFA+CMBX12
-/FirstChar 33
-/LastChar 196
-/Widths[342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5
-562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6
-875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8
-675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5
-687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.8 562.5 625 312.5
-343.8 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8
-593.8 500 562.5 1125 562.5 562.5 562.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 675.9 937.5 875 787 750 879.6 812.5 875 812.5 875 0 0 812.5
-656.3 625 625 937.5 937.5 312.5 343.8 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1
-812.5 875 562.5 1018.5 1143.5 875 312.5 562.5]
+27 0 obj <<
+/Type /Page
+/Contents 28 0 R
+/Resources 26 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 25 0 R
+>> endobj
+26 0 obj <<
+/Font << /F8 15 0 R /F26 12 0 R /F27 31 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+34 0 obj <<
+/Length 2593      
+/Filter /FlateDecode
 >>
+stream
+xÚ•YKÛ8¾÷¯0ú²2ÐVDJ²¤,öÐ3Hf²H/ö0™ƒ,Ñ6·eÉ‘ä~üû­)Ùí6—v‘,ɪ¯^êŸnÞ}ÔÙ¢‹µ^/¶•&á:/²Ee¡Ò©Z<Ô÷õ“éG;ØvwßÖ÷Ue¤?Ùº6íÓ?ÙÊü,ŸO›ÆV]ÿ›Ÿ»þqùçÃ/‹•ŽÂB«x±R*,ÒT“Èÿ–Oår•ê4XUG&6¶}†ïÆ®¯ÆæŒhûÅn¾PmÂSk7eølK6ÃцÇÓñh`oh^Êñ1CHÛ£ócÿï—ôö©ÍùS at Wë…JÂ8YkTÖô²X‡‰.ÖtD¼„á9à7 » a–«8Nõ~¹Jò(ð'óô‡\¶âñ–E‚[T°Á‰$L£§e¬y¾gÆnÓ,гº’PG…†Wga뜮ô°,â ëù
+ùÌÜ+Ï®U˜Åì{¼­ŽSt+3Œ<ñ¼ÔYP.u¼â„ÆŽNKî0~Xæt"1ف'sÙw×’˜CwšW™¥ ŒAøKþ9¢p+§<ï9þÒä2¤oXamÁæG)æ:6e%ë[Î+ï1·ï¯¼]>‡,é³—RBoçƒð0|,+ÈÕ¯aÕH³2ù5J£[IßêFêïoUF–K.Ne‡‚€¿‡1Lª…f0•5ãgFÉ:a=÷Î+à>²¼Ÿ6û|†Ä[ïƒJ`?Cj~ºw4S‹DN),cEpÜâTàÉÕÜÏ-97Qo¾œÌaQ£qp8XGœ¥<@èhi”Zx]— ‘ÝŽ²mO§6ÂÞ@1-/Q¢¹y؃¡„I`àËóìI®QÊoÅ	Cvãî,¬Î22»ŸËkV™Ú’ðØ—”¬ä÷<2“	)]Íœ€*+x¸ü)n]18?ëÐœ¹rZÀÇÞ}ÿîa	À‘,aàó½%¯Õk‡Ä0Ï^äpρ™°(Âß°IDËž‰u‘x?>†ŠCëâ"2JE°»Ä”xꙸ¸E.9~§­¸Ê6øxI€t›·pŠ¡'‹óTÒоz‹]„I¦]êAxÿ®”³W«B`ý›+Ç|
+—n%jK!Œ´Æ^7\sÕz
+–R×=÷s×n-—·`!ÔûÄ~ó‚›•PH»ô pîÂÆ8EÅq.ÖCâz)dÅ„ˆ\t2®Þ/½'äk/xªŒ€·"¸!µ%¾t—{â<²7O¶s!0u¥<všãW¦¾F%H
+v#q·SàdûwîÖ©æ[ïæ{,yv¼X[Ÿ*)‡óì¼JŸ…à»kÞ’r´Kg¶75æ²BSPGËBñ<Ⱥ3³Íq+UÙ² mi¡(Ì+©ˆ Gäi0¢q®ý”8r͏¹†5ܧK­¹Ê²,˜cfVhpö4ëÁ_§Â2=,I ²•ö(‰ ¨ZÖK^-‡OÂÆÈsVv\Õ@Fgcum-ÁElÇYVÆPaVxí½ù>×â8)\Õ£Ò)žݹªfÖ¨Â4¥løŃ¥ÈÚIœOÖv)xZ×ÀÈ+¿—ÍnýFhN•po+y|4z˝¥Ÿç©
+Š®†y˜žb—’ÔGoªpYß{Á"A3ú&.}-ÿ¨ÉÀ¥DÖÙ÷ nGùšuöÉéüLìî\A;ºü½-*Õx7ã*­œi%9l&½OÎÌ]ë¾b½5\ß|x¸Qð h¡*ŽÃl'•åa\dù¢:Ü|»ùãÏhQßD‹_n"˜…jÿQ¨ŠB/7
+z€$×±›in¾ÜüË‹\y™«¹ÐŸðÿ<*_¤a‘eΓ0_Gx6i6ž&UÙ"ÎHÑ'ªPÞW:Ì•ü7áÃÓ,f¸òKÈ“`\Sɘú¸4ð*&.
+pWËCN“)¦4¶9aoåòdŠõŸ>:p¹¡¡TP‘g¤øÁ3͸C‚ë¿ÚñÔÚªôY?Mä3u¿t—ðJ¾KáátÙ#Ìó¬ÿíˆ
+ÿûOÒÐendstream
 endobj
-18 0 obj
-<<
-/Type/Font
-/Subtype/Type1
-/Name/F4
-/FontDescriptor 17 0 R
-/BaseFont/XCHVXE+CMR10
-/FirstChar 33
-/LastChar 196
-/Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8
-500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8
-750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8
-680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8
-277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6
-500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500
-500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3
-777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3
-277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8
-277.8 500]
+33 0 obj <<
+/Type /Page
+/Contents 34 0 R
+/Resources 32 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 25 0 R
+>> endobj
+32 0 obj <<
+/Font << /F27 31 0 R /F26 12 0 R /F8 15 0 R /F14 37 0 R /F7 18 0 R /F18 21 0 R /F17 24 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+40 0 obj <<
+/Length 2497      
+/Filter /FlateDecode
 >>
-endobj
-21 0 obj
-<<
-/Type/Font
-/Subtype/Type1
-/Name/F5
-/FontDescriptor 20 0 R
-/BaseFont/GCOOBE+CMR7
-/FirstChar 33
-/LastChar 196
-/Widths[323.4 569.4 938.5 569.4 938.5 877 323.4 446.4 446.4 569.4 877 323.4 384.9
-323.4 569.4 569.4 569.4 569.4 569.4 569.4 569.4 569.4 569.4 569.4 569.4 323.4 323.4
-323.4 877 538.7 538.7 877 843.3 798.6 815.5 860.1 767.9 737.1 883.9 843.3 412.7 583.3
-874 706.4 1027.8 843.3 877 767.9 877 829.4 631 815.5 843.3 843.3 1150.8 843.3 843.3
-692.5 323.4 569.4 323.4 569.4 323.4 323.4 569.4 631 507.9 631 507.9 354.2 569.4 631
-323.4 354.2 600.2 323.4 938.5 631 569.4 631 600.2 446.4 452.6 446.4 631 600.2 815.5
-600.2 600.2 507.9 569.4 1138.9 569.4 569.4 569.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 706.4 938.5 877 781.8 754 843.3 815.5 877 815.5
-877 0 0 815.5 677.6 646.8 646.8 970.2 970.2 323.4 354.2 569.4 569.4 569.4 569.4 569.4
-843.3 507.9 569.4 815.5 877 569.4 1013.9 1136.9 877 323.4 569.4]
->>
-endobj
-24 0 obj
-<<
-/Type/Font
-/Subtype/Type1
-/Name/F6
-/FontDescriptor 23 0 R
-/BaseFont/DMIVYN+CMR6
-/FirstChar 33
-/LastChar 196
-/Widths[351.8 611.1 1000 611.1 1000 935.2 351.8 481.5 481.5 611.1 935.2 351.8 416.7
-351.8 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 351.8 351.8
-351.8 935.2 578.7 578.7 935.2 896.3 850.9 870.4 915.7 818.5 786.1 941.7 896.3 442.6
-624.1 928.7 753.7 1090.7 896.3 935.2 818.5 935.2 883.3 675.9 870.4 896.3 896.3 1220.4
-896.3 896.3 740.7 351.8 611.1 351.8 611.1 351.8 351.8 611.1 675.9 546.3 675.9 546.3
-384.3 611.1 675.9 351.8 384.3 643.5 351.8 1000 675.9 611.1 675.9 643.5 481.5 488
-481.5 675.9 643.5 870.4 643.5 643.5 546.3 611.1 1222.2 611.1 611.1 611.1 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 753.7 1000 935.2 831.5
-805.5 896.3 870.4 935.2 870.4 935.2 0 0 870.4 736.1 703.7 703.7 1055.5 1055.5 351.8
-384.3 611.1 611.1 611.1 611.1 611.1 896.3 546.3 611.1 870.4 935.2 611.1 1077.8 1207.4
-935.2 351.8 611.1]
->>
-endobj
-27 0 obj
-<<
-/Type/Font
-/Subtype/Type1
-/Name/F7
-/FontDescriptor 26 0 R
-/BaseFont/MAMUVX+CMR8
-/FirstChar 33
-/LastChar 196
-/Widths[295.1 531.3 885.4 531.3 885.4 826.4 295.1 413.2 413.2 531.3 826.4 295.1 354.2
-295.1 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 295.1 295.1
-295.1 826.4 501.7 501.7 826.4 795.8 752.1 767.4 811.1 722.6 693.1 833.5 795.8 382.6
-545.5 825.4 663.6 972.9 795.8 826.4 722.6 826.4 781.6 590.3 767.4 795.8 795.8 1091
-795.8 795.8 649.3 295.1 531.3 295.1 531.3 295.1 295.1 531.3 590.3 472.2 590.3 472.2
-324.7 531.3 590.3 295.1 324.7 560.8 295.1 885.4 590.3 531.3 590.3 560.8 414.1 419.1
-413.2 590.3 560.8 767.4 560.8 560.8 472.2 531.3 1062.5 531.3 531.3 531.3 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 663.6 885.4 826.4 736.8
-708.3 795.8 767.4 826.4 767.4 826.4 0 0 767.4 619.8 590.3 590.3 885.4 885.4 295.1
-324.7 531.3 531.3 531.3 531.3 531.3 795.8 472.2 531.3 767.4 826.4 531.3 958.7 1076.8
-826.4 295.1 531.3]
->>
-endobj
-29 0 obj
-<<
-/Filter[/FlateDecode]
-/Length 2118
->>
 stream
-xڍXK“㶾çWðfªj„%-“ºí‹›|Ëô¸™&¿u'äZz7Ëy…QE¹>ßMÌþóÒµÙ>|2‰–eÝêZ(B­ê†ö|ÞyêÂ4ûAõ#=uÃᯇÓW5ø™n2¥Êa“U¹e¹Ï¡ëáÇØ'T©É²Šï³‰Î•Íù>[¨¢J¶¹Q|ŸÞlµ†}6V§s€+áÛ.»¹ÞŸ'jJÜž‘vµYµB£ÖFŒúáS‘”ª©;·ÊÚĪÒÈMw§UJ›d{]ï&Ô¶L~*rB…N(˜R¦ûàNþ©cø̤ùèfYt»®ïf7û‰÷ÏGσÝ8üaŠê°G:qÜ¿¹lòóš^¥dú:ݹžC¥ÈT^€ùØq -èl)xè„ÝOÝ2º¡ÅA-‚ ¾úÝ""¹
-—y<h;ž‚óÄ;%ôˆY6Áa“÷öRµÙæY“>)ÈÐS7Y»aCÃÄalÁ·`Ä‘¿'÷ù¼¬ÎLõnê|àñ~”Aë¿k?J„‰wųÜàúË<O$>¾žÛÙÁŸY ”¼5¼tspáò¨Æ?ìyE=(l‘¡ïfHÌ3LX4»-4I‚ß(°/Ä£g6!QúÝ<1}ßݼytÃÁO|x<E6ꨋ\=.a''îF²DëÕ£Üdjä8ü…>±uÂ-<À=³yCwòì÷‰WvnXKV’d/ì>à°yÚŽ,ù¿nà•e˜–xî—Ž–_ܼÃ+Ž85ƒÓ„b-vbèØÄZ±Z)ÒXC ¼œ˜7ø/\q}™Þ!QhÉVÅæÍce,êZlGŠNãã)Ö:$Bxâ­h-©Ô…¸Óe`XãÐQ¢@"./´ñè·""é*ý„—/£þé[†ÏíÛˆ@0Gno).Ü÷J ­]»#§@ëo_µJ¸Â™˜%¦Ô{ÐÂ02ö½@’ç*+n at bïÐVihÉ55ÊÔꁤ.º8¸ùzäÚG„˹ã Ž©›—ˆËë’úzìn5ÓJIÃÑ]IC›m„aœ@YÜ/ý÷Œ=FUÐÎk^ºlw¨1ßëÐlVPðs¦æf¾Ó’š/ɤ}ÆÕu§„Ì{Ù,΂!«›¦ÕÁ×3®}rsÄ>IƒöMcÖ$ðØÛäݹ1Ô­bue홆!MZÉ
-ÛW/ìzO”k#€tÔ‰×$ÃÉ%›äƁ™OÔsõÿÕ™>qPL#·OÜáP-	€1ù/Ù-endstream
+xÚ­ÙrÛFò]_ÁòX%Ž1®låÁ‡œ•ãØŠEoj+ÉDB$V @ƒ iÕÖþ{ú˜²´ëA3˜£»§ïn¾œŸ=£¢I"’P…“ùíDj-¢06“ȏ„TœÌ—¿{eÖªúN¬÷ÛOe“Ÿ¶øœOg
+<éÃ,ÈLÿœ¿}þ&îÂ3"1:™Ì”‰Œb÷¾šªØ;LgZ¯ÚO¥Wã\{ói¬½Ê~+omWÄàæ¸	(ñM³–‹ü4Ê¢bÒÓ¼dŒ*Œ¼”EГ©	…¯M¬Ák¯ðÍÍ‹í¶Èi“Ð)‚Ð$ö¢Hé9„!ôë|x×ü¹HKžìš´np+*¥GfcÊzKªo´WT«UŽª£!~ìkKÆŽ‰<Ç­8œñxêUæ¥
+H±-ûþ$vÀXT$ŽêŽ?I-èîíÍõ‡W?_3‰,H²‰†ñU·ý7±–’â£9wÿ‡-õû>b¨¦äkÈbžÿȃsNж&ã{èžžñÙgçD–òE¢¤î3üÙáp«ªZ™XfϬ?‹};‰|_=à×fH¢Èôi~IÂaÕ&U0¬Ú
+Š'Ä-2×o3gr(¼u Umç$•xv—5»`•ïš¬æE&…çÙœÝßñúWªM—ª[Rë#<ç˜RÖ;8Šö¡#oŽçg:4i=á]´ü@÷|0µëìó>c›E/B<Í©Ï  K‹]¬·vÙ6­Ax\Cž¯ ÷GTö&%w·ª)6•hZçè½Á¢1x ÿ‹Ðÿ­¼´(8š¡÷5'ë®,V1jQm¶Eö•wS´PiøO|ÍÆG•ö2
+Óhíuâ+Þw1º‚Ñ$BJ-»’/®®Þ]¾z1¿üðoœ]ÌÏð€?‘ I%Œ21p2q“ÅæìóÙïú“å™?y{æÄÁä+È 3ÎòÙÅP>ùȐ®½ý†&Š•…VêèHa¾dg@Ëœ+*Ù4¼=6°W[ÁVnGXl®„+ªqoy¥M†é&÷œ¶7OÈŠû²“lü8–÷ºzþÀgz×0ÔQ”£­ÿòðü9Bžüï©Ù°-½UØj“Áä“b¡QT*â‰:»…¬£\düY•<ZSñ|„|¿×ôŒ_Ò2]¥
+a$|?ˆíÙNýŠ(È4)Å+PHbŠ‰UÁÛéî¾äœj¦t"p'ù/炨…¨ÕÞ¶&FÓm=L·µ9ê0~Pžbզױõf.æá©jãøCRÜt?N
+©UÖt/8µxjwÇÈÆÖ¥0Ñm—çD¶+Àmó–×\r™=FÉ°9rçcÖ
+Ëíkð{R‚àZ=Æò›n£çë+¼ÿd—X>A–D›ðùƒöü-îŸÝR,È穹 U¢ÛSÁ÷kb×èôµp‘<Nj¦Ð¡Êæ-‚F~Ú6¸ÂŽ¶fžÖv`òv߉
+´;/yäjh—9È©ÝO–V‹½ZYsÍ’æÅŽ¿Øt|rÄni|ÆYâ´ìTé]a
+ðr›Ÿk[´Ú9vV,¹‡ó›ô®¹S€º•ºUƒœ©C±¢M"F$›PÃkP`T>ì
+(ª1Ø(H[ß„5œÔ¶§•„îupñ–šKlb5/uªp€²[ÞbÉ›7.¡À½ôƵ•2»îÆÂæζ™lØL­+¬JÇMc‘ZÅÀC»ý‚«F[ó´=_4˜"ÝÙcXìo2W(Š$†â 
+M½Ï††Ä1ÒØ3hmbØY"L=‹c{[²¤ÍGf©­A+lÛ9âÿ?¬ùµUpêõU®çw\ÃèÄÁ¬}`c`ÜÇn´6!«	»\ç–brTw€Ò6nH¼pÞѐ}¥&m¾È›âž·ÈœÒü~“»›:>¾@'=¹[Ûn-ŒGeƒ8]×.dKô*a§%뎥%crù5ÂlkqÄÞóîT›ªîø—ÞHùìhÝ®6Ç5‘†9ûLƒ	n(ÈA$`…¥5²¾ÔÀôȶeÉ|ï,[d§Ò—®‹u$¼õDï¤é%•·grNlðPÊÛX
+	™m‹ÁÚ(é¶ÔÐÀi^<^@Žþƒ‡Rê(¥t§èP\tD½yêÐÓÅŠÇV)À[HÈ’Oî9ÈçE³½7LAF ~…c¨ž\^k¨ý(Ÿ#…úæï—®â¬r¤tÕhn¡<bî´®‡%v$ŒƒïH§ƒø±´‰út^]||óáã/c56zÅáIÛ>w?ÿ}[)@ô’ëîo£	!%r&Bccbšˆ?$¬Æ1ò/Õç-Žendstream
 endobj
-31 0 obj
-<<
-/F1 9 0 R
-/F2 12 0 R
-/F3 15 0 R
-/F4 18 0 R
-/F5 21 0 R
-/F6 24 0 R
-/F7 27 0 R
+39 0 obj <<
+/Type /Page
+/Contents 40 0 R
+/Resources 38 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 25 0 R
+>> endobj
+38 0 obj <<
+/Font << /F27 31 0 R /F8 15 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+43 0 obj <<
+/Length 2117      
+/Filter /FlateDecode
 >>
-endobj
-6 0 obj
-<<
-/ProcSet[/PDF/Text/ImageC]
-/Font 31 0 R
->>
-endobj
-36 0 obj
-<<
-/Type/Font
-/Subtype/Type1
-/Name/F8
-/FontDescriptor 35 0 R
-/BaseFont/PQEIII+CMTT10
-/FirstChar 33
-/LastChar 196
-/Widths[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
-525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
-525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
-525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
-525 525 525 525 525 525 525 525 525 525 525 525 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 525 525 525 525 525 525 525 525 525 0 0 525
-525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
-525 525]
->>
-endobj
-37 0 obj
-<<
-/Filter[/FlateDecode]
-/Length 2329
->>
 stream
-xÚÍXKã6¾ï¯ÐQÚŒD½s	:ÉÌîØd°c`¤÷ K´ÍmYòêўίO½(ÉîÎ1ÀQÅb±XõÕƒòÞÑ£×ß½ïwß|Œ½B©·;xyªÒÄÛ¦Ze‰·ûñ7·É#¿ë7Û(ÏüÖŒù׍΁öÌIJ­qûU×ÖS52õ²Ù“é].ÛÊ0ËÙ”ÃÔ›³iQÎ8<l¶qøçr£SÿukR_XmËï’åí˱B¦Óæ?»Ÿ¼ÀÛ†¡*XÅî- >ÊgrŠ
-0†Î4B…‚L,Ü­¡@Áu¿íùÒÌY‚e¯m…Ÿ§¾kíïΔ»	×”"‚±„».±ù¾‹ÄnqèjúÓªÞ€ÙkþØ;½a¼¤Dø@¢Y+34÷w}˜)0;Âa'ŸV„—üj»v»Ø8Ödcá€àx>UÙ> <°‚3MÙc8¨»Öà(A•\öpæÚ§%¹ß˜²f^R
-×-A`­‚ö,>X§çh‰%—ÌRÿÃ|ätO›?gtNHö¦±²#áÓɇ)Ò$ué#¥Œ‡ôCߝy4³Š§‚D@‹É¯iL%›pnƒÁÙôGYÒtGHD´€)vTü.Û÷A
-ƐÃó‰/*RXƒswèa.ÐúH‰…‰qªŒ,!<_gXÊÊåN9Ú,…šÊ¬ã©y´aҒʁz¶ÇCäMn‘èÖb(ØRŠ#}jSöÆ9Ð;Ð
-
-À䮯É!+Qùšöð*kK(ð² 6-°UÖüiïíѶdgq2Å)9þ¦z"X¨zâÜže›Öag°GÆ÷
-ë>ˆ)æ«+M–ОrÆɝHr.}¿äŸl]ÓžPïÓ¿ØJ”sùGº•÷-)¿Ú"ðè8{LãB{üü‰…\O–ýÍt¨ÃoÍÌØ鸋Wñ†%NÜÚteÍ%P»¢ÅK}û2ífÔºJ»¨ÓÖ5t’KuŒW	ށà6t䋃/UE†æ†Ä¨‚Ä‹T’Úñ½? ž†p´D%œÃ#›$¦“¤rˆ~Œ£"rpbÎøKdCKB÷$°3’µïâ;ß-Ëfî=c·Ÿ›Ú÷³#¶q¦%…ÇÙ]Ï€$ÁFLQÿ¼á+'’ñjÊt.w1e
-~SÖç)áiA,›.ŸM§“X%À‚n-Q¨<Y]	£Š²!ö4ÐDÄþ8$Z¢ã/¹ß®PÜÁæùè·©ÇÄŽ)-×G©vÅ>8ߥœ¸Ó9q"¥ä×m8"å_“Ôò³p~hùzÀª1„‰u€ð‡ÅÉíµÿí	µtÅ¢TdêÛ(Z²0ܹäp·-÷h¿€'¹ã•K,Ê6éÇ»ð6_K¼Ø·×6,ªæ݆+sÓpênYC6?ŸñÆ·÷ÐqÁ 1
-þ[¾€iÈ¿Ûꃽe‹S¡×積šZ»/ÕÕ–V5ÃŪäbÃ(f½Õc…%¨òyÚCaú·ÙRnú_àÙ¹Že%ú¯R£†ýF‹Šüƒº¡/ÜPì:ÖTùÙŒWŒ÷{’¿\#¨³™n´C#ýßë—Q¸ÝÝ)øaç*ö®^âÁmBávö¢PÚ}6Þú™˜z‰*rd¦UãtA­ÁRk2/“ì«äiWý7º k&\=8ùÃàÜ-Á¯WŠkˆëºR.ßŪ|Ë7èg¬€m3A~à?X¢¡_Ã+ƒˆ¼¢Ù÷D×åB®Ë0IÕbžæߍ8ªP9ê©J‰Ò1^3âT9·¢¬9wÙtÃ!kž¯4Ï0ÈIµÚPŸZÐ=LÏ…I»:¤Wõ­|°ºæÕÔ.eòWý$²ü
-[ÄÀŽSß/fÎôʺðqg]é}æÎê*®¾ÿ,QÐëÒA’w¦’h¹—$1[5w3 õ›0±6+Í=QÇùÝÓFJ|Ç|œ,“x±*2ß[i„äÇÃ}À|ǐ\P‘PQTZ¬+â;˜åþiÇ—ÅD~îÀûØq²NâYÇ=Îw[þò,‘ëæÚu_ŽCè0‚¶/TžK‹Í!ú·?-endstream
+xÚ­XKsã6¾ëW¨æDU0ÀçlíÁöÈ'³¶cijI*ES”Ä5EjHʲ³µÿ}ûP”%Íd+{@£ÑèÇ×
+]ήU8ŒE¨`8[¥Ö""oº¡Ê—ÃÙüg”É2«Å.ÉÛ몾(_ïÒt[gešýêúnZäYÙ¾ý6ûq¨\+©‡c)EìûŠöOža]\Üß¾¹º˜ÝÜÝþþ0ùùËd:›þ~?y¸¾{øÇä’C®£žBc_Äaè
+Ç
+äÉ0"y#9íh¬µvŠ¤¥íp%CÚsh~5R±³5«ó
+—w%ÚÕHZÞM
+4¬†ÎË+PY‘ÓŒ¥'bOLJª”Y»«ê'Ѭ¶í¼Ú•·Õ<kÐ(gîsRÈ…Qµ{ÝäiRðDµm7 U¿Zð7{IÖ›Âh.yn/W}«T£1Œª'3)ùSÏ6ý»/ª¢°·ßå%Ë?ÿ‡ìë6kàT_ùN[áHù*dbEÞq^_{Byîp¬Hôc䁷 àœ	z.ˆ¨¨|×QGcOGÎÅüy¤ÎJ§nñ7oòr‰Làê|>§•’75|Eà|Îñ“amÅü›íã˜cÖʍÜ0±†K£>ï…¾3Å`þº|¤%„šF£¡ü§qÛ	kE@‘ÐÙ
+tð\å4¤XZ•sPrL7å8έÒhSä윍\mÄ`¡Óq6« këÖ¬“Zá:;Ç“æYiÏ£¤†«5rlP ½ÙýX À”œ"m€só-‚‰…Ta&=½SÉØyD)’ÌVbæg`yQÕk^HJJ+ã7oÆEìÜ`JKßY$©9¤][h:iRòì£=gžÛ6Ùb[ðþ¶3½9æÄe×Ä“4ÛºÖ‚Õ6¯eÀ¨9oh˜Óæpw½’Üò’äÅj;ê˜Ù•õ3º/5n%Ëh%­s„‡¶ªAšR†zV]¹9VÚ­¯à¬Úà⯮ô0õ·uBaT”L–I^v\MÎhÛD*‹×ClªÊcPTiµdXš[UÎH¯—9hn)_“þ Wxœ^†r‰åþ蜝M%iV'@7(m]xå@¬jƒ™¡ëJV<!§ðìôè+ÜþÓýΈC½å-°Y±ÆF·ƒ[ü“‡âNCx%t¤TdÜŽv9©+Mu!ÂA˜£=ü9ëNd±ú[v+Es»XçL,è ¨g[.©ýÁ1Õ Ú`WŽÆ¤vhçÆtÉÈš½ôjpJúº!X/1ëûF e°EêÈ·.ö‹EÁ{êmÉ„ÔÉTí§QQA»ªšö#î‘B-”ò"ã‚÷Œ]3ÈR–T(	TL½ÔÜ+ù›<rWdÒ§ZzSRoÂG
+5ñL(g+„zdäå·ªP•#s$5¸šæuºÍÍYèª.W*+ÃÛn=ÐBêHÙq1˜~îŽ;‰ã¾ÈË£?]<ˆC½cCM¯n®¾ÜÌŽÔô=áê>ó_VÓJüžš~(dè‡jÞÝOn'ŸŽÓCKGÊ.3}É1¥á´0òÞüCD!­”äÎ}µïdhÒºx•˜Pƒ§;°y³Êæ&øømf×ÓþaÞS&fº'/:¦¦kµóMËQ'φ’ï
+yߏ$
+!ip!Ö endobj
-38 0 obj
-<<
-/F4 18 0 R
-/F3 15 0 R
-/F5 21 0 R
-/F8 36 0 R
-/F6 24 0 R
-/F7 27 0 R
+42 0 obj <<
+/Type /Page
+/Contents 43 0 R
+/Resources 41 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 25 0 R
+>> endobj
+41 0 obj <<
+/Font << /F27 31 0 R /F8 15 0 R /F26 12 0 R /F14 37 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+46 0 obj <<
+/Length 1692      
+/Filter /FlateDecode
 >>
-endobj
-33 0 obj
-<<
-/ProcSet[/PDF/Text/ImageC]
-/Font 38 0 R
->>
-endobj
-43 0 obj
-<<
-/Type/Font
-/Subtype/Type1
-/Name/F9
-/FontDescriptor 42 0 R
-/BaseFont/NENDNC+CMSY10
-/FirstChar 33
-/LastChar 196
-/Widths[1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8
-275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8
-611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9
-820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7
-666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8
-500 500 611.1 500 277.8 833.3 750 833.3 416.7 666.7 666.7 777.8 777.8 444.4 444.4
-444.4 611.1 777.8 777.8 777.8 777.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 0 0 777.8
-777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8
-777.8 777.8 1000 1000 777.8 777.8 1000 777.8]
->>
-endobj
-44 0 obj
-<<
-/Filter[/FlateDecode]
-/Length 2104
->>
 stream
-xڍXKã6¾çW}‰´½³È!ÉÎ$Ù²¦sˆ÷ ¶i[hYô’T{üï·^”Õêž`.UU®"ëñUQAÅqpèñkðóò É£,öA™DU¬Ëÿü+ÌVë$I‹ðý—ötîÕjey˜¼[­ó:Ún•µÝp at ržÇǾ۲ÈçU“†ê_²Ð*ó¼ÊâPfêU–„Ïø”ÿ>ü+Hó(
-ÖI5Y}X5Y¨‰÷Ç<h¢¦ÄÝ­Y.M¢:a¹#î(K­í”uø’…—UZ…í*­Ã+sfÆh/V5é'ng™ÈRiØzX¥ex=éÑö¤"	[:*¶ü˜Žÿù¼ªå¸ðBÇ…-(Ÿò¶	6ðœ12‰v-Ùï\Ž­“š%§áN3­Øgîèå7iQ+Q—ˆÔC›|n‚ýbƒr¸£:E›'&nõ€º£i]§‡‰h;ëĖȳ½§x•°Aж“œh‡Ó{¦ë'QÑwOä~Ãc¼ã¸6S\Ñ-°NiÏ›´L—§gLì?Fu_®ì¦KçŽÓÆÑ}ÎèžYgÞ‡q¬­ʨ©P[g¸Ê¢’³¨\š«¢ª	Ö¿Šã„mL‡üøŸ_þý‘—73äN9ëµJçgûœœVxAñb¯ûžÎs*ºGMÅ”i•¹ïe…Ô¶â7w4z<Ú¶èúŠBÂtL,\aêàsP˜Å­¹Š€öÿó‰ dçËDšeßf‘Kw×°?”Ùksò1—1ê£ò™ë$Á[æÝÀ#›USö²šI^ÒÞ>c1£…¦
-­k)Mí3ˆúѵÝÀ0Œ–Ã]OáN @y#ùõ‡r¬EJäqTøì03lÅäåÛ†ý‰1òXáCÃb«d;Ób^6exîÛ­ðöŒq}pªfîqÕNZÁ	NÜ>‡wËÄ„‰Mòâ-eZ¥Rybš„	.ç3Œ$|àW;ê6åWU…Ñ3
-É-ܶ³"½wؐ9/ð|º;¼.XœçwÔM_^Ijß+}<F-„Ѝäú<«ç®‘®Ox°Ä¿x+„Ÿ	·z|>R{›[ƒ…S“µW}Íò-Ê[Iï‰j`Læ)`S!&îÛÚÂ<´	‹8Ž¿¥y}ÀÙËx6	¥®øÞJO @Req|sJBV
-Ú±ŒªÞ
-©3Û±>ö=J0|áªÀÔêŽWXÍøìÛqàÄZV¤¼¡@,^qÆ:Óð½•àl;À§ë„ ,ͯg£EñwjM at XO¸Á a•“„+µJxè#ÔÑL1ÊÏiôëÚÞ(Ym¨Ò*“›ÞHöFÙ£¿T©Îðr\(Þ
-8RJ© Ÿr	l[nk-¡æ\ÿãØõ")Ñ°XWiþ¦Àmo à”œMž ”…•Ü&’—þàP#³ùíÓŸwL²Ýaà»F¾¾Q‡±oÍD$6‡Þ²ÌÈd‚Px¥1M«¾c£<y'Uîu¹lc®T8OU at hù!žˆÒ~˜*óSãïÄ%݉™ä5Ý>TÄ·%À瀪g7YâY“¨ÙóÎÿ®Þ‚KþvÄýI®^Ú_^õ±ù]÷¦{í'“ùwœ¥ÂÛÅ—9›@™O¨Û€ üŽxkÖy†ŽãùÓ-endstream
+xÚÅXKsÛ6¾çWhz¢:ÃøJ§‡4u¦Ó¦m¦V&‡¦X‚$Œ)R)Ëî¯ï¾@Q¶ÒÄ3irH€»‹}ïÿ0òìURLª°Ê“|2_Mâ4
+‹¼T“"*Â8ÉâÉ|ùgpqcšþWÝèµqÓY–dÁv¼ùžÓZw®M?fxeü‹¿›þ5ÿyMfqVY–d‘êå’x^Û®7
+3í\{{÷”eÓú>‹|öª ÂJ¥Õd–À-qQÒ-ó™ÎÒ4o{^é,vÓ8èøDãÞÁžh‹ ³[[k‡›,è[&꽤÷Q¬€ÖuÈÕ3I¼ÕÛ]ÍRâ œÎT–殮òbÿÍ,E$ˆt¦Q‰þÞ};GdIÜÂâŽ|9Œe—r°tC‚“`‹Òô4)ƒ»«é8I”
+:ºõ Â4x§ê§·o¾á)aáëºÑuÇ,û)2€¤ÞÖLe½Ž*ØÀRáRÚºg"Í?/ÑÑŠHúcw’}ÑiØ|Buà’þ·vi:L‹,Š>œOže³ß½m@Ù·;b‘,Š#á}Lò¼+0lšâ)ü‡i‘³÷ˆ„)æÓJ!bÂáAa<ü¿]?쌳Aè/%¬dœ`+gÂ?@=ЕŒ8‚ ŒiZá³W8."wZäZ@¬Ý1
+8¥ºñÁ)0µ<Ú…v£{^iw¼ä6fÁð=献‰ÁˆÐ=ê­ú\1Ïq|’GÔÀpŠ€@ÄõS9cψ1…Ç3Â#zÁŠÂ	TŒÉp.jä
+Bç@¡…Ò3¹Žˆ²‚Ä>xðF€÷q<˜ânΖ3Ø¡bÈýÚšQžÒMËfG“Ø8Nµ-¢¼8ñ05þÆøÖ¢cŽ=ªŠ#VÏئ£+–^8˜0+I—õÞiRØ#ìcDøiÖyý<X;­I8Ø
+ñ¢mÃvÀÉÒÛ¯GÏ¿Èu²ãl'p-V§°<†]’¥d'è_<ì¹²ŠˆäÍ?ÄI¦y’1½ùã‡SQR	ÕÁö›Á…T ®l»£VØ:¬EÅò.õXþÔùýå/—¢OÂ3fÏ
+FIQ|ë“Ïi}üHëãÏkýå¨]ªªu0ØÔôWŽ7˜øø;Ò·W[€jAUu¬â5ÊqfÉZŽš7n»á|­;‘ÜŸ~Žëùƒy‡i™ÄbîYß) QêÓ}Wˆ°—£îÏKݏ£6´âöÒ3ÿÞOî~ô÷n&ô“tøÏ\x*÷	
+b¥8‘Ç<“ÑeV…Ê?–Ò丱ßÀAy–U	­4Íò¬2ú˜ãÇ'ó'ÿ
+…Cˆendstream
 endobj
-45 0 obj
-<<
-/F3 15 0 R
-/F4 18 0 R
-/F9 43 0 R
-/F5 21 0 R
-/F8 36 0 R
-/F6 24 0 R
-/F7 27 0 R
+45 0 obj <<
+/Type /Page
+/Contents 46 0 R
+/Resources 44 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 25 0 R
+>> endobj
+44 0 obj <<
+/Font << /F27 31 0 R /F8 15 0 R /F26 12 0 R /F14 37 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+49 0 obj <<
+/Length 2359      
+/Filter /FlateDecode
 >>
-endobj
-40 0 obj
-<<
-/ProcSet[/PDF/Text/ImageC]
-/Font 45 0 R
->>
-endobj
-48 0 obj
-<<
-/Filter[/FlateDecode]
-/Length 2186
->>
 stream
-xڍXÝsã¸
-ï_áÙ'y&æJ$õÕÎ=ävm®{Ùtãö¦Swn‰±ÕÈ’OëÍtú¿ H}ÙéE/AAàG@—¹îb·Ðͧŏ›÷7r³8XlžaÀ‚x±
-8ýÅæã?»jÉCç´\	Áª«‘ÎfA¯&n©Ú%`€÷L̼ÁV:uW–y¹cËm~Z¸‹•ç±ØHVßÛåJúBÏŶÝ+"Ò"W%îÛځÄP§¼(ˆ:.W°ŸªŸªú@œZýÖ©¦5º¶%R«-}ék}šï/ËH8l¹Š\áÜwG:Ê
-5]y’År¬nZ‘FI^Â<ðg¾¿‰zãÉ€¹‰Ó?àÚëã±ÈÓ¤Ía±ž<X:ö˜/Íä´H-¬¸ÏSÜgO{¤IIü¦Mê–È„šv_«$£imE¼©Qôºüp,”9“™ŒõçÍæîɏœOë
-ñÈŠÈFÁÈM¨ÙåßP9¸è†N’eµj3¥Ìˆ sVuö¹çü‚ÖV$ÏÜÀ·<3Œ¼¥ö”·ûÑV‘S&uî4OÚé¤tŠj·ÓŒcWÓÉ«F5WÈÉ™ppP;ZIéJRWŸS‹%9ÏÔíŽFšY'±_>üå᢬êi¬w õî#§wÁ?νçGŒG¯¸˜Ò§Àh‰þˆ¾DKÁZEë¶Î;šùîJ«Â]ó±ߝN'¶«ª]¡X¦`ˆ’Nä^‘ÌÐuùvù§¹Ë®|Gc-Tpú"9(݈oÍ„q'šsBœÐœhðn°vKò5\²Ë›VÕÔ£BY×Ã
-	L«ƒÙR8Ouu°›¢¼Å=² sŠÀÙì5R’+@ƒ¦à.IýBìÄâ¹ú؁½{Š8•//Í$juLj¸êÙ°ODk¹úc¢àyWW]™]!‚Yx¤ðœ¤-ÞvRB;>©ÎN:æöªÝþÇT-„ÆðU[çGJ‹iKÁ-uKBÿÐüÿü`Š|£ÜàÂÀ—s€RèÙŸ,Ù:-& ð°ÁÈå%7FÔã’Òi+·Ëz•qAÎdɤØC-šAToè³tŽb
-Blà;ÿVéïŒÑ‚ÁgþNqsõj½ÅŠ7y	þ¤ËJÄcÑã-qÑ<Ûâ‘ñÒKÍ®fÃÇ˜ªÉ45‚.?u‡8”—vÇFY	IK¼ä•”xÈÐ…ë<%y¡Ú3ëj¨²¬í„ÔðœÄ˜ùëäVxf·ùJf	Õ»	—Ò}ÌY“g;¹[²ÎíÆÚmÎ	̯ãP+šQGÃ)´Ü¥–-ΆæÒÁ=qI%=lêX˜ÑHç
-%ÄMUm2!ïìaÀiúøz~ªÌ¥ìÂBL)9çÆ^Htã¼O/¸Ípû
-ÈÑ(Ê…¾#cnÏ:ºŒ~ÆÙè)8}t
-ÚÏl2µã¼rr#&å
-?f!T
->„"÷± 8‹üžaŠWúãZça^SøLŒÄIÒe&nÌ5âî×_o¾|ýù¼¦ÀHÑ?€Gõqcñi¸¥i¦#†¿[Ã[þ¶×øxSÕ×åË—4ít&8<ȳ¬5¸lâ_­m~íOõ–_W×öϤdºö5
-p›½þbF2ú^ÒXŸÚéßyÁ¥ßy«3ì³yZ³ïÚ¬:•wU¦šËYZ3Ç«¸Vš›ÿÃÿ-endstream
+xÚ­YÝsã¶×_¡¹—ÒG€ßíôÁw–c§®íĺf:I&C‹Å‰DêHêd_&ÿ{÷ )ëÃî\_D`±»X+\žÇ˜Wv‡ñPó†6áý…Šz>
+â
+Äe“øn6eõûÉ(PSô;ÿàa¸H§MY=ò5mˆ¿¸û]tµÐÞ;èÉ¿ï3ñ®*ŸžoÊL³ÆvåÖ$fb£øI7³¾;e®Èue×T{æãc>ªMuÚd§MªƒÖ³
+"ͲË<Ÿ¾GOžjÒŽŽÝžiÆîA…Ö<p¯F,‹Y>ȈJ_]¹n'±®ûúTóõêSÑä‹O+16J·/ûú^ôå
+Z†m´Ï®RŠð†Ú|µÐ†íUÏåºfúÅ!+C´µµ)C g¬ਈX×+ì”i¦3&¤ø‰œvC­õWÚÂ\ƒþÈ´8‘Þá.QQW¾¢-©x<d´g at B9å’€P¶&F+éÀæø¶($(uij!ž¨¼IùW3ƈR’ÇžTžìËh&lXؘ.r;
+1)ÉÙG]ö}€Ôƒ«V&í¨Àl
+¶*Dè›:ÅpÛä¤L6[ô€óÐ&Çb
+ÕîAAfmØãrºÍgA+ߏËÉÉwØ‹œï`t<á:`?2ÖaŽ‘q	íw™€wê/µ•¢lZp/%è«tM£‰C(mÃœeš±:D+áîjEæ"ŸîÃÿŸ½Iú£»ª-aO ²+<¡’$z®+B?ñ‡Óåàóàç_Ýa6p‡ß\á%q0Ü@Ç2IÔp9ð„ôbeû‹Áýà‡Vá¨Õ8ê«ü€/AÛ†¡ð=°´e£(ßœ_Ý|·cfâ‰0ê3³™Vãkf&¡ˆe(·Íüqüçñýd7P½D+/î3³™Vãkf†¾d½4óãøêßãó]ŸòaU‘òw}
+}
+¿¶8k!¹A,ö“ U[¹§½ÎÁNi¡&Ó·Rþ ·h[#æ§¾kæ,Ÿ¢§ºlwJF‰P!lâ½Ê?b@‚(‘—Èo>-«pÔ׸{X¾ˆH‚xËƇuwýŸ=%|4âÿg£Õøš‘^ B/Œ^yÈ£+!¸ñç±÷„4ËvT²U§¯›xð™÷˜v¾€ü/Úßðª{Sò>pFIWC›ÒoÝTëiÄöqËKö\íû*‹ÍÂíîÝÈ蜖í?bô¯л÷Ã^z¯yÌ8PÜÕ@<°ÄV)Ë÷^äÉ;»G]`˜Û({a­ùe˜ÈŒXy"Ž<ÒYŒý/E°endstream
 endobj
-49 0 obj
-<<
-/F4 18 0 R
-/F8 36 0 R
+48 0 obj <<
+/Type /Page
+/Contents 49 0 R
+/Resources 47 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 50 0 R
+>> endobj
+47 0 obj <<
+/Font << /F8 15 0 R /F27 31 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+53 0 obj <<
+/Length 1738      
+/Filter /FlateDecode
 >>
-endobj
-47 0 obj
-<<
-/ProcSet[/PDF/Text/ImageC]
-/Font 49 0 R
->>
-endobj
-52 0 obj
-<<
-/Filter[/FlateDecode]
-/Length 1949
->>
 stream
-xڍXKsÛ8¾ï¯PåDME	€¯lí!gã™L’ŠåÚÃj°Kœ¡H
-–=Sóß·
-Pe'>h4诟à,da8ÛÌÌçß³·ËWÄ,’LÈÙòv–D,g‹„ãgùþ¿œ/¢ˆÇÁŽÚí+=_ð8øëùBŠ4xSÜÍEè¶/»²ÞÀ¢ÌƒmYº&ÆN·wåÚîêúÅüËŸg\2>[D)Ë…9«*×ó…Hã`9ÏEд8‘A­{<ä0Ð~ǝ¯>ÈYÎòo¼ )<bYd¤,·pž#8|ÝÔÅB«®Ô]4h§2”ñbøU OIË¢èãtB®Q'\p[{:”£rF
-\\Î3Žj ®!(±œ@E•à Ãœg¨ÒKP4ʃ›¡ÇAԍì°îsÛ´;¢¨7>à$ZýÇ-Ɛýjò/úX†]MûÀZÚWÁ›iø‹ÕüŸçŽpÿð¹)4ÉÚãôDº=ÑŠ5ì Ôð½xI,èÇ!·çøžçð¥"«Ô=&Bž#Ì):‚Äè¿ï5Zé”È`pH’0FÉ	—‡-JºAãÙ±"Ž1uÂø˜:a¢M*ëÛtIö„Á)™Kq#½„“Æ`ÆQïxkµÓSÛFqÂDfÄ]Œ)\2badY[Èâp¿-ŠäT*@4¤FJÊàë’Jw¾lfB7媕§Lä~kµñ¬	…S+(U³Ù î‡vo¨é4$ÅE’Èಧ5}OK ®#J¿U=	±5)…ÃTE$¯vAâ,+Kn‡šH`çGbb´FÕ¬UµmºþµÉGøRÁ¸ƒï%Å•4ˆAU×Í-Í®çïMG0`×êÓF_a8ŸÔY)£c¸Âòºª‚†æa¨JË¥Ã,
-=v *ÓÒ‚|ÕU杈;ÇVýàÎcß•ë¡×žl“šÌÿ®•|ú³ã{8¸ÿ‡CžýáxÒbË-´+3Š-endstream
+xÚÅXKsÛ6¾çW¨7jÆdˆ_éÉIä7MœÚêôÐt2	[S¤
+’Rüﻋõ2íØ“dz°¸‹ÝoŸôëù‹—g<™dAóx2¿ž0!‚$Nå$	“€ñˆMæÅß^«ÍZ› *ÛNןÂ(„?öëôŸùo“pâ3dQÄ-g^•ºî‚•6׍Y^ê{Ývx":™ú<…aèèÎôz+éåYº¯‡2)²‰ÏÃ@&‰°Âÿš¦ÒÓS_ém¦<ñT9e^G×@6iáuMD>õ™W!—Fªžò”ø§Ùci–«j`êÜYUUDk…ÝjRõ+2Tã@Ÿ³²Á¨;Dñ„L³(:{­…D¨P^Ñà¦>‚¤ð`½0{.µî6¹
+ÚEßͦþк=ˆ©G#„œ:¢rw«2WN¯¦ïV Sï´o®é©¿*p°‹AkËòf±YÔܺWRÞâ¾;Õ-ÈVjM…û
+‚·±°Þ¼z²ý.'\4x!RL¤aJ䲬 Óˆ¾6Í’(
+˜á=)/K殑iÄF®Á̱œ˜9H˜¦¯;¿3åŠÞU]8	¡éI:êIºéI¥eöµìÊú&†ŠÑãBÆ!fÁƒ8KRËC¬AQòfsÖ§H W¤ðä«©/!´O‹õTpŠKÓáoÙÂ
+È$É!¹§ò\·»õEYº¦l”3j&A&x:T@”´Æ°@"ÇK“b@à*ü ƒHboeJâŒ!_l-Åù4“À‹ѹšJ
+ÜàíÝŽäòV΂(«ÎÜ80ãPQmÂ
+u|Å4¨Ö¿–È/6cˆõZ"¶±
+Ëf_ZÞЁ
+À©`Îù$ÏÀfÌ jíÒÆ]ê*‹î:JºkÌŠ¶­à%¦\O£Øâ6Óó)pÛÏc¬#¶4aB=¡E{}¼ @Ë­‹‘i[É€±(ÍP»ò®1wNæý²æK‚{±³Ï(Ä¿¢½Nµ·Dµ²0·nc8ݪ¥¥RtÙH.”¨\†%	
+1rf¡¢×eÓ;'ÂÚÖû®†èD-€ökÛá’(’‹lkZçîj詈#Ra×0a5q4ër@×)§î‚´z»^±½4ìƹP+r?u¼‡Ñ%8èî.çiLh`áiâå욶ŽŒUu®‰­ Gjw
+Å7ÑK­Á®ä»uÛùrü]@wäYÉb…X‹U?¨è® '÷Vîß4fòa¸ÆJ”zÄzcüE™× ÞÑ1°@mµ %*:„Ⱥ<Ådd™÷Ú¶<ز1ϼ¡aǨÖíXOGä鈫ÿ‚¡SæþàW•HÑÔåœ9Êà‘Ømj[†#7O!ZUA+äçì´•ÊvÏ;Úl¾Pà˜!«pq³PQ»HÍºugjzÒ8â	­_Ëïâö0–KCNì,òîæ{É>涢·Ui(\»ÙRzÛ²ŸT¶‹ÑÌ"Šž“ÐÂZzíSÈ$ÞÖÕa¾¡±¸USý"À×Â0ÞÒŽ9Èbë¸ÑîcÐi×u¬Œm84ÐB K(å›e6¸iAœÊPöM!_÷­FpY¼ºYtœŒÔZz«´c[?mád{®zY¶=ECAü˜ì¸a‹ µÿk¹U\@ØïAHœãÞ†=Ó·Þ:ó¸zìˁ.r§¶É¡HÚ86n dòx”E,Ó`ø¤o'÷›¾£BšäldÌ—0%‘H›±lì¾0‘‚±Ì±mJˆÈÇÐ%ª«ˆN…ëCYnptÂ×$äë!´Þ«`{ƒÇÞqõ;wì—qBÞOxÆQ|]4¢Á‡=Ú"»'+Äñ÷BÿPˆ¯¶Í§’”Æñ…þ÷ØÒ‹‰à¹§¾BcˆJHw$J{"Û
+k7(Çè‚N('>ÿ±Ÿk'׍¤S¶ÿ­ç$w#ž?!nÅq3.½nV“ •þ—(Ò4¡ü÷^Ìæ/þ¢ÉY·endstream
 endobj
-53 0 obj
-<<
-/F3 15 0 R
-/F4 18 0 R
-/F9 43 0 R
-/F8 36 0 R
+52 0 obj <<
+/Type /Page
+/Contents 53 0 R
+/Resources 51 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 50 0 R
+>> endobj
+51 0 obj <<
+/Font << /F27 31 0 R /F8 15 0 R /F26 12 0 R /F14 37 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+56 0 obj <<
+/Length 2234      
+/Filter /FlateDecode
 >>
-endobj
-51 0 obj
-<<
-/ProcSet[/PDF/Text/ImageC]
-/Font 53 0 R
->>
-endobj
-56 0 obj
-<<
-/Filter[/FlateDecode]
-/Length 1880
->>
 stream
-xÚµXYsÛ6~ï¯Ðä¥TÇbI¼ÒéC;I“&™Z™>ԝ,Â&©ò°ìüúîÅC’“™Î´/"°X,ö·Í?f·3ú¼š=_þxÍBíGz¶¼™%¡ŸÆ³E¢ð³|ù‡Ïa¨bïüÞlw;_DZyÑÓùBgÚ{VÜÍ£À³uëWÞò¢)¬V¶éé‘·vEaËùŸË_fJûj¶S?èÆÖwn…ÂÓØ«P$ÈU )ÚÛu×·âÕå<W^%¥mçQèíñ§ª?£ì/ô,÷óYð9*ô³ÎY®];³Ük×®F5sÐ~°&´Žß’ùn̪eJ»–+§u#ÔR÷kÐP¥Þz/’nj³µ{\B
-i±ªÝ­+ÍfóÀ,kӐ[ðIèçìøëùöX‹Š„™wݹMëƒÛ£Ì@UÂüÖ¶ì_˜¬ª²qMÛð¬ºáo‹'Ãñø•»ºBÒ½³Ä™€ª¦å%SÛATiW­-D†lmûs% ':/çYÄÁQ9g8»þ|T¬áEŒø\%b`%"‰-f¤A5³YHnˆQyuÕ•Å¢­ÝŽyZ·¥t€½œÑ0M"=ú?ê¯mã“N€!¹>ÈCtœ	Lo`xn»Ú´®*bŸÃ0£ƳrÔCIÓÈ°Xô&0ÁÆME>«>‹÷™ò…·á}ʘ‘˜ž…±"®T¢ŽA…¾-ÂH<ÙÀ£r?ê™@×û‡ðXJ¤ý$Ž½k׃ù”puµCÉ°ªny=
-‚-#ïòË·—<<eVþ±y‹TûAø¿Ø¨þ+ÃccøØx9Á§ýMÏ3H˜¦µeÃLR\žè€dðsÌ#RNvÔöÔVèFèý%Âqst8}äéƒËþ•t
-ý(kNý¡a5úþx1A>¾(¦º@>†—&¢ù¢¦0%jš¢vÆLηXÔ´öèFßÍIüI®eŸ;׎0ÌW¾:0›)Ž&%&MkjRÇnë6¦æ	A~ûm»ÚÞ¹ªk"ù
-£à­帇¢˜Ò~Ázà¤À —Œ$à.E¸ÓI0)´>¸.ƒÊöŒéCV%áØQéDq:Âw„\JH`£<O”T) ©“2¥Å«ÁÀ#nÇÙ1˜“‡ré'`°¯]Û2oÞ»$g;Rm˜S ¬,vœ€nÃ@³Ätª	16XvËKk3fS¨Wz´®-ƒq×=äJŽáC=W2+Cw»ejËÒ¾¯K& €äp²—fÙh­¶©SI´’xÆ5¦¼O8ïq*Ǥ“‹9éᾂ(ø X¨$ñšŽÞ`7½5Òí6•)ð–©$Å+ÄÚ–…ýBeˆ,¡­=‚à\¾‚f±ÅÞ÷¡îH'õˆÁÕ–n¯K¯
-eâ‘~uÚ>3P»ÎðGª	-Õ	4*Î`ú’}À2ÚÔUҳĽø„@ÎÝ;,ôÈ2E	¦˜ò4ìv×Ê]×:õ^/—yôê|‰ñ¾ÎäH=i¾õ´ùþ¾á}Uéx\Ï¢¨<™Ó•ÐÈ›BdÞð×ðçk‡ð…¿Ë|5¼Qÿ<Ö‡c-endstream
+xڝYKsã6¾Ï¯p͉Ú2’àK›ÚƒçU³»³3©XsÚ¤R’P¦H-	ÙãüúíHJ¦ì$è÷×
+øÍêÕ¢äj,³8»Zm®¢¤ò(VWy˜QœFW«ê¿Þ/a”/~]ýë‡Å„–FùUH$ok£›E\xvá«(óì®”Ñaáǹ§~äu‹È۴ݾǕœ>iþG7ê­¬áL3Í–ºýòöß·8LéÔÂkñË;ò0‰¯q¸ôL ƒ…Ÿ¨¥×¢H÷øGw¬H<ªçË ‰§D×­îÔSUUdQœY€W¾ŠÓ`¹\W~”qªØ.­A‰ã4óʬx¼n0dÛcçÔ»Ô×8“{¸«%
++Ýó”aƒà°jÞ€½Ù›ºìð#õl+l뚇ÁÆ÷00í±çyšú^î0[3kV*J‚%Q°LÅÿe*({»6Íp2zL%Nf¥”·9’_v`súfn0u¨É ` ¶ùûŒ?Â+?¾Q^ßÏÚ>´ÝÝÂOãÔk¦ÿà!øP®mÛ=k´½–É_Â4|­QÇZ'¯á+ú‘Tn1ñø™|þ¹­4É1°Ör>ï ã…øõ5ÓåaÃxªq˜\”ä.ñÈE\ÔÈE\Ô—èpQ#—dä’Œ\’‘KòGuyg:M"F•™Z,¹¤#—tä’þe.‹e#—l䒍\²Ë'eU}4U¥›[ÝÝ›µ&6;Sáç$Rápâ)˜)6
+õ„T„JÆ+˜×ˆ1fiJ·<ê­>ð¨ð‚à"Î°Õt²yƒ©ÛYøKɉSúû¡Æœl(+a„Ð+o…»™nß%áÖÈÔ+Iåh4éWɆ–¿¹jƒ$$é„À»E;-¨¸´çÜÀʏ—6¯‰ÇAªL·ÇNì/Í1š•!ftˆ¥2ç&aqí8eWì¬.+œË½vÿäv$:Ðy>	5-$ÎϲïÏðÝàr»ççâuü†Þ4ë¹tX-
+……¬cqKÜî¨ðfÞ
+3äªÂ	Ìà0£Ýc>­(‘pŒûQ…퐮¡ÔsÈ4ž+1“sˆž[CZc`ÌùqµÓä²Lö²HTvšñ€ÆZèŒhƒ+±
+˜'RˆZÊ&qA~$š&–ÂÚE5ºC˜º%
+í
+IZ&+Ôá²»àx¶8{\÷üqì)~R’næârÁÐÝH|¿6½õ7°Qw€H¹®A–¨Xv´K‚Æ]f"ÄÙ2;õßGÝ`T‰š\Rа	X€ÏÊr9#d‘Q&cŽÏ
+—…`æ(R´`-pƒ¬[æx›*‰ä^+ý}çÐ
+I9þ2ûý+¹"ͽ8¬Su…ß‹è©$+HH¸YÍ C*D,ÏУÀXÊæåè–zR!ÈÅ1ÜÃ’ñÄÉT­Õˆ{˜Ò\O+PLs÷r2p)Œñ÷O^^¬,püãˆ2~}ËC¬K;éòÜ-ÉÂðkÝ¡›¶®9T ë2øØýRiç†J; íAc³f!eMÔ:K†èå‹+–3Y|¬ã7;e‘+^~¹^&Úfcà–¦oúŸ:sú:õÜû@rzÞÍfî­\v•3ÕõÓ@¥ÒÄþæl/î°|ÏmõÐâ%^=4HBÒ›½{¥÷EâÑžõƒ|+½7­¼×Rè^ûʽ»<×zîµÏŸÓÔYګߊù¨‘êOlvé-ˆn1øœGäi†/>…펇¯5õ×n)äý&
+ç÷2»÷÷º±ÿ)›r‹ï(H¿Ÿ~œ=nµnxV9'x(ýÐv7Íã—õ"¨á'y!éÔàó—wïûùöÝo?}}ó韷ß¿ã[O]tŠ§Z«O¼õoü“…§ß¨ö§Q8ÿì–Ÿ¼tws8Ôf-M.îíiú™§SÞGgL;}7»h‘[è‘°m€ÛMUuãtÂȽҁ©¿LhNé.Fý÷Â>ÑgMÓÏèÃûˆÓ:}¦b^Ϥx¶T–,±ïŠ"LIŠ%¾z¿zõç1‘ñendstream
 endobj
-57 0 obj
-<<
-/F3 15 0 R
-/F4 18 0 R
-/F9 43 0 R
-/F8 36 0 R
+55 0 obj <<
+/Type /Page
+/Contents 56 0 R
+/Resources 54 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 50 0 R
+>> endobj
+54 0 obj <<
+/Font << /F14 37 0 R /F8 15 0 R /F27 31 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+59 0 obj <<
+/Length 1361      
+/Filter /FlateDecode
 >>
-endobj
-55 0 obj
-<<
-/ProcSet[/PDF/Text/ImageC]
-/Font 57 0 R
->>
-endobj
-60 0 obj
-<<
-/Filter[/FlateDecode]
-/Length 1907
->>
 stream
-xڍXÝoÛ6ß_aôIbE"õÙaiëlº$K¼Ã2ŒÄÄBeÉÓGœ`Øÿ¾û dÉr»<‰<ïx¿;Þ5slÇ™=ÎèóãìÝêô<šÅvÌV³ÀµC¶~Vþ´nuõ¤«³í6ÏÕde1_ø·j"óøþºÙ•Õ;©´j4ﻳÞ0ç›f
-Ç¿›?ÿkõóÌ™-\׎ž¦ÊŠGf*Ðs–¦•®ë‘ŠmU>¿¸ö£n®, d¥¨ðÍQÑïóLÍÄ„„Èß0÷tæìLžî„´	ÇŽÅPcä¯æºÂœéôÜëQ^øvÍ6¸´á|I«<%lJà„"´žæ"²tªÍ;$›1‘Ç
-?à-¤ ÕfõÚ¬°ðÀ"΀…ã,<.ŒÎ_3Ï=’^x½Yë¬brƒû^¶0mö|á¹±õi	DŠtT4ˆ¬ŒÍÒà¸F§¼˜™“‚¼ià‚œ¸¿*"F':Ĺ|‚-.™7ÛÍÜȵ…ˆy¶³
-<[Æ=!ŸÝÂ=Q=Á×byùáâòDZ8ˆ8!<º¶cqCªw³üõ·åíê0el±1e·Î4<&ØÊ-¤í{Yj/ë8øÚPèF9ôA02ðUŠrDÜ’QðÃ`œÞB¿س†¿kUó`ˆ¸ÑÄŸJoóL_˜Ê ÿþT¢À.	z(
-ûr€»
-­Óaã„Ü”pé:=bò¯xÖ¬éRCLV	ˆ½A•]•€=}•àé~cØm¬Ë¶Jt}ÂC$p•«,T‘ax9ÊHáõ±?̾`Ÿ)÷G8ú2¾ãÁˆåκ›3ùþœžò׶mü;-U¨G8«JÓa|š“ÿ?ÚÑžäër¹_z½ÜaX›Š¼Gñ²D¬w}´o$ÄcQ7U›wb“Åa0̸…(2QÁ<&& 4I¹¡Ì,&¯Ô¼füÝ‹Ž""Dч]C³åÊQž
-GaÝö	B©Sôµøá›Ï0Ú|ptý'0ºö–uÝ°Ü;Ë7à{¾ã8f`é×-AÍž°¼·z#Ï:KŸæҁPl²šãÜë2Hw]ZðIÁ„*tapÆ°S‚±˜Q5¡D‘ Wð%=xÕ@!\‹ûy ¬æ±y
-À,û¹töe‚<+$"F~Eá¸ç
-«<Žto\Ä%‰]“PjTÅ‹M·ySv›9Ÿ1EÆ>µøHͺ'Jh•9—¥šeÕºi×n™]ñ‡,…v-ÜÆÕþ
-Õ”¹°ê€ÕD„„“·Ü+JT܇
-¬¥TÔ¦¬^xm<Üð-endstream
+xÚ¥WmoÛ6þÞ_á}“€ZÕ»ìC‘%ΖµK2ÛÛ0¬C¡HLDD]ŠŠkìÏï^(¿4J3tÉãÝñô˯ÎÃl4õ¦i˜Ž–·£ ‰½t2ÍF™ŸyA˜£eù—3ñ_ºã$LœÌÃ~¼qÿ^þ<‡¾7
+ƒh4oš$!)ÏDcÞËÖˆFhÞVÔæNšr!ôƒÐßó§ŽTÀ£^yéòí÷N9ÂUÞäwB{yY>ÚÊÞ_>Êþdþñ‘¾f½%;ÿÇ:[ðjÒëÏúfè”lÞ[}«ôj.>u¢5¸#±þãÄ÷ûZ݉gO´É¥9Wú¤Ù^E§ESˆÃ”áΧ‹ì\_¿¿8=Y^\]~œÏ~ým¶X.>^ÏæçWó_fgO…OÓ³QúÞk«Î”jÓ\ªR´Gçu>9ÄfìMãh
+ÖÀHMÈȉ;Ž¢È1n8q¶kYä5O¨Î¬ÝÀéŒÞòW|ÎWëZà vbž[É»
+·[ÕZ¹c©{;+ò×í.SÁŒ•oUëÊ
+3g#ï^sàG]5}Ñ…hÛÛ®®·\²ÖäÚˆÒö¦ã»¡â=ÞxÓÉÚXJ]tÒï<pIk¾8kYZw7€¼J”ß
+!nquÈîOySÖ²¹c=àxÍò!D³Ë³‹Ë{¨|»!k+%l‰Z´¸å¬ÂzÚãx76Š¿h¹å0x¾‡?È4/W¸««sô«	£i
+jb‹J‘SZCØÊ°Œqhòö ˽=ÙŒ‡JÙö
+þâ85)‘'žÎuó•4Sgg±óÔ$ø;HJ+Ás#†é¹ã´¬$>Ž'+Ù‚‡Ö#+;Ú8¦^"#½E礉Sškä•9ª ò´¼RåV°yHˆ»¸àL\<+›ž6q”ãJÉò£’+r¤´éí*þnÐ)bDÈŠÎÆ0²àËà‹SÙ«M5
+”í5Ÿ;ô‚,M@ &iP¸ÞœØ6Дj]öl“¯(ƒ±µ+Ð8U\mTTöºX3çã”Ú8¿:}·Øï¢oá:ÅvËÕü«Êl?±Êg’¢ŒéK6ïÒĤ2å·š%•wr#ßÙ À2¨+c~ðfxšPü©eýŁc[+躨Bâ{‘Nž/(†QÚ+ö £ÃG¾ï%pÛS™l™æ)ý\0÷õ`<IêEÁs [¡Ÿˆ'„À£Øj¾eÖ½ÚÓFï^Zw9àžˆèž j!%ë-&Š€Y28 endobj
-61 0 obj
-<<
-/F8 36 0 R
-/F4 18 0 R
-/F3 15 0 R
+58 0 obj <<
+/Type /Page
+/Contents 59 0 R
+/Resources 57 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 50 0 R
+>> endobj
+57 0 obj <<
+/Font << /F27 31 0 R /F8 15 0 R /F26 12 0 R /F14 37 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+62 0 obj <<
+/Length 587       
+/Filter /FlateDecode
 >>
-endobj
-59 0 obj
-<<
-/ProcSet[/PDF/Text/ImageC]
-/Font 61 0 R
->>
-endobj
-64 0 obj
-<<
-/Filter[/FlateDecode]
-/Length 1744
->>
 stream
-xÚ½WKsÛ6¾÷Whr¢fL†@j§‡$mšig’™D·ºF„,Ž%R%);ίï¾(>$ÇNíÉ	Àb±Ø]ì~»˜…Aήf4ü1{½|ùv1[;[®g‰
-ìbæ[$ñlùÛßÞ¥²jþÏòÏ—oÍ‘‰Æ¶?V‡ÖÕ̐4gŽš8¢©½´pÜífî«$ôVU9W‰×ÖÕ–	{R¯ª[\F^ªèIÆûôáÍ_ŸîcRÂôá#“#qèThæ'*ã™EÁ‚íÍÊ|îk­½¼¨y2K8l¶¦w›O?‚A=§ÛÔ3¹M?ÆmúA·é§¸Mÿ8·égr›yŒÛ̃n3Oq›yºÛ~+j·j«únê9m„8ÉQôpì6é±Ût¤F*G¨rŒnÓQÒ¹MGfè\“&tž;ӹͦÑßé¶ø‡¹M=—ÛìcÜft›=ã6ûX·Ù§»í“«oÐRHTß,ÀâMÖâ,õ¶EÓº²á¸ƒ¶* à5æi‹“BNÔî
-ÔNè™Ð7Ež»’çÍär¸zòxá0î+NPÅšSwÄßã7ÛÂñÓãÅâY1ÝÕëªÞ5üªµû÷àš¶a†CS”W<=Æ„¿¸íH«Ð+€ÝzáUx!xÅO= @Ç-P'a<4ÂÂÐòá?xœvÝ…’¥özl€ã=éò
-ÒøeeÐ86ÎÜm3ô<Îè§-úR£†&Qmbô-endstream
+xÚ­T;œ0î÷WÐÅH‡mÀPE:å¶H‘kR$)¼,Ë¢°k&wù÷™½äŠiðx<of¾á¡ÚÝïe”q™«<¨NL‹ØH¥“˜XªLÕñ‹øšH~«>Þï‹[’LÉçs(EFR\ÃHËLô®m»k‹—\xÇçänCÏ×nÂÓˆ‰ý¶îÂjŒ¼Eê]¨
+ñŒz'°9Û+ƒP¿Q*]Æ™1Å‚óê|W7£e¬µÝaÐ27ÝC "ô"e’¸ÌÊ"ˆ¤!SäT[ß9, ÁÊ@X¢*¡+ ñü:ÍuØª+—ÆwŽp­†¦?º~+bäždÐû¼¯œ8B?·1L‡&ï&¾X¶(ç¡o–´îôº4\Z8$’ÖÂS! ¬Ó:å¶ d7÷GT)\‰ôå=óèÕEËZD•é] }X¤0H@š&ÐÓÉO’Ã3¿ÕœoÛ´(‘-xZ¶Þw}óÉy
+êf¤Ðññ¾Ì»Ác·¬hû¼V·®/*'oG¿.å?¿Éjq÷#Ì`K<ˆ®k(¿­ª¿sWI@,ÍiÔ“.þŸ­ìÚs+àyzôoX&Y=}xZy“y·a endobj
-65 0 obj
-<<
-/F9 43 0 R
-/F4 18 0 R
-/F8 36 0 R
+61 0 obj <<
+/Type /Page
+/Contents 62 0 R
+/Resources 60 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 50 0 R
+>> endobj
+60 0 obj <<
+/Font << /F14 37 0 R /F8 15 0 R /F27 31 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+36 0 obj <<
+/Length1 750
+/Length2 576
+/Length3 532
+/Length 1110      
+/Filter /FlateDecode
 >>
-endobj
-63 0 obj
-<<
-/ProcSet[/PDF/Text/ImageC]
-/Font 65 0 R
->>
-endobj
-68 0 obj
-<<
-/Filter[/FlateDecode]
-/Length 1567
->>
 stream
-xÚ¥WÝsÛ6ß_áëËä]¬ê[Öv»ž›Øk6×Îçú0ïrŠDۼʢKQqrûç#µ×í‰ 	‚À -´Z³×r.Y¦Š<ZšUc¤^(ÉV‘|’õŒþN[õ/5HˍaoGý€Ç×ð”Lm…ül"¾¬%T7’?ÐÜ™[óî/(âÕ“„Ò«˜ÁB1¹ÕH¥2×Êù¾G¾ñ}k#QïŒUÚ¡~€Ž…µÄc\;ñøVÅ×¼H%N”Àí–LöÄEM¼ì9Õôó¡­½–¦ÞžÁ[É»$«Ñq;S÷alNT*•j"-Œ?LþX?ú^SÂMÌé0¦ÄzþBªµ©–šÔàkʵÄW <<lÝ/s$š²ZâÔø‹Š¦j•*¤$3…eš‚räÞ*÷ diÞ,‹ä|U›{‘wh½³=Ë%6;ë]S¨tO€³Lßš*}u	™¥ÖbÍŒ‚ʆjEÖå*-—lËµ
-A7ºžHãé'„¢¶|‡kÓYœè	š嵦úÖèz2¤²\ÂÃHsªÈbÃ’XP-5¥v7}¢ÂyŠÃ¬Û÷¨Sôš´ñî(Î\·o‡á÷F@é ¦'
-ó>`¬ —Ö
-i>ÒÑÐfo
-ýÝ؝-Zß­¯«C&=vŸØ¡Kj at dðì%ßµý>qèàs
->—‚¯GÅ vì~²WÉšøMrLK&½&h¡Ùœ?dLqxäK$}­|L1ijÞî›Ï-Bñ…
-¨¿oä­S-æ…4Å5®~¬Òæ…;«H›Å±ªÍ_2cJá¹Ó²ZáÏO‡¯~ÇÏïþo"é;¹æñ5#Jì¯($mjꥧ#^°‰P#ó€ê2>glƒá8¡µ5/@3š_Ž	cxÜõaªϤÊ×ß~©Ý °èRÏî#†‰YÎ~ø:YsÍ
-endstream
+xÚSUÖuLÉOJuËÏ+Ñ5Ô3´Rpö
+Ž44P0Ô3àRUu.JM,ÉÌÏsI,IµR0´´4Tp,MW04U00·22°25çRUpÎ/¨,ÊLÏ(QÐpÖ)2WpÌM-ÊLNÌSðM,ÉHÍš‘œ˜£œŸœ™ZR©§à˜“£ÒQ¬”ZœZT–š¢Çeh¨’™\¢”šž™Ç¥r‘g^Z¾‚9D8¥´+@'¦äçåT*¤¤¦qéûåíJº„ŽB7Ü­4'Ç/1d<8”0äs3s*¡*òsJKR‹|óSR‹òЕ†§B盚’Yš‹.ëY’˜“™ì˜—ž“ª kh¢g`l
+‘È,vˬHM	È,IÎPHKÌ)N‹§æ¥ ;|`‡èû…„¹xkCã,˜™WRYª`€P
+æ"øÀP*ʬPˆ6Ð300*B+Í2×¼äü”̼t#S3…Ä¢¢ÄJ.`
+òLª
+2óRR+R+€.Ö×ËË/jQ+š¤¥$e~sû]F1ñÊ»Ï/ËÚQ?ý¸mò»³·|<ċݺÔ/¦Ùq'}Iüö„+6­ìâEíÀgŽ¯¼xT.‘òGÀ¿gtÅÙ¥vՏG‚—U|íª“®¾~ª€]üRÇëÞ…_kü9¹öË:½{ápËñGúý
+îûd}dN<6Îø-uBÛošHºÁ=c¦MÏvHžÎzºq½aûÿìRKë~,KÌž³}Š¬Ë›ªÂå»m¿‡Š÷Öêyo›ù~ÉîÃÜ×v‹
+Û_¹éÜÿs>§ß¶.#ßҭߦíÈè{­/þô­É™kÜ—<nÈeà‘œ[»«×?Ñí[ïÁ§÷º˜ÞâdÚe€‹ãHð1Îcê+öÍ“_èeÍäž7aՍ-<Ì
+{fýß_áþZ#MzîáUü.G?=¨=ãûp®Yõ'åǶ‡/¨Tñå}[}âWè:‡)ïÓ»ÚÕÎÖ0Ê3íÿ±:oÝ;K©æBÊû.l½ñcc«yEá2ÿ
+óî-ÆŒž×¦ÈWµýþdöä“Ž¡_Õ~Ò+	”áš”iïsûs‹`ª¨C¸¾îuÞI^>öÉ\mü|¢Ðr¢úÿXöÑñßϾØad­j|ïǝéÖR/ü,2 p0,HÎIM,*ÉÏM,Êæ endobj
-69 0 obj
-<<
-/F4 18 0 R
-/F8 36 0 R
-/F3 15 0 R
-/F9 43 0 R
->>
-endobj
-67 0 obj
-<<
-/ProcSet[/PDF/Text/ImageC]
-/Font 69 0 R
->>
-endobj
-8 0 obj
-<<
-/Type/FontDescriptor
-/CapHeight 850
-/Ascent 850
-/Descent -200
-/FontBBox[-33 -250 945 749]
-/FontName/XEEAJR+CMR17
-/ItalicAngle 0
-/StemV 53
-/FontFile 7 0 R
+37 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 63 0 R
+/FirstChar 15
+/LastChar 15
+/Widths 64 0 R
+/BaseFont /NTVDHS+CMSY10
+/FontDescriptor 35 0 R
+>> endobj
+35 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /NTVDHS+CMSY10
+/ItalicAngle -14.035
+/StemV 85
+/XHeight 431
+/FontBBox [-29 -960 1116 775]
 /Flags 4
->>
+/CharSet (/bullet)
+/FontFile 36 0 R
+>> endobj
+64 0 obj
+[500 ]
 endobj
-7 0 obj
-<<
-/Filter[/FlateDecode]
-/Length1 1095
-/Length2 4446
-/Length3 533
-/Length 5179
+63 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 15/bullet 16/.notdef]
+>> endobj
+30 0 obj <<
+/Length1 1884
+/Length2 12110
+/Length3 532
+/Length 13167     
+/Filter /FlateDecode
 >>
 stream
-xÚí”gXm—ÇiRBïE”©H½÷"Mš@HR0€TC&
-RD@šŠ4¥wé"Eº€PP¤#°ÑgßG÷y÷Ë^ûm¯ù2¿sÎý¿ÿsæÌ-Äoa%¡‰À¹!õpX?	iIi( mj)­-‡Õù!¡€´’’4 éï\¤å¡2ŠÐ²  ó	£<<ý-€&‰GÁaXÀæç‰ÄEà04`…ƒ£~A’-D",P~pOÀ†öEþŠ#±ˆš öí—ˆ®®¦‘%ø¯OúWÒ†ÂúYùü-û³úKÿfb{ð¨@ÀQJRJJšXH¼ÿõtù›ébá8
-K
-9y-ÇåÆVØû­0ž
-šŒó½ã
-JÝhoר{[¤ÜÐÆoïVôºÈ0+N:dt5DMRIô„3ýˆcJpm¤ÛWÁKÆQO¼R9[Ø͐‹ü:ºVº°ÀòDaŒœQfä{„t–¼‘	,KU°ˆÜÜðô¿»÷’î›÷›õ'ùá#lÔ­Æa×êjgʏi>Ñ”ÐÏ?Ç0¥Ò«yöY}ÄómE«›š‹‹CóX²d§æIæË5>¶Î~ȼ/—nlBµîxœÈ¾Þºº)<´CY+f½¾%q’Èo„TxìŽRÌÖ™	±sסmiS¸ˆ{™8üä(‘pväÞ¡îD%?ž5lm7rœbaâ݆ohú•ì¾\㜣‚ýÝ1ù]x.Õ=WÂÐcç•ã©Í åÛYá½Úu’U†!AYÞô»V8ûI[ð-$âTpðÅ´‚¸´Öj)Y3#'aä²~—iÞµd!Öäæ
-Þ+ÜšY0‚a0,õ³Íˆ
-è¬-nßÖFÁ™EË1FU½›µã¼KŒÑ-C:±Ñ«3W‹#ÚEœh?y>„Ñ1 _ίzÊˆ#
-¾#<¿ð„%jæ¦Ñ¼DÈsk¶w®býµ—z(8òòËw*¾m\¾ÃS"7èX—[™dÓ¯1)É]0X®åZläVÍü¾QÆ~¤÷XUÚx@Û»FŸE0–!/`œÅÉĶ7©$ìçxÊ
-,/¸Æ}uob«ÅC„ƒìë§;y1þ#_ùl¨ãqk	¹|I».åíÁ©çŒ\¡™m÷ÖRçæýàHŒsß^—Ú>‰„o°$®“Ê€Æ_œ[‡t—*i7|£¥'8Q»TÙ!Ì~:¾ç¥–=‚éqÍB~¶¾Z¦Ù$…Z)RnéSh‹i:mÉLßÕÛdÖœLjÿÎÕÜ»©Å¹ÂçOZŽI.«©² ¼
-|ÉçÌÄ!Lw¼mN)ñíÓñõ©yÄ©ŸfJÂ2ˆÙ¬KZrõç›9<QR¸#Ú˜9sÝ«³¤ø¦4¦/½¿µ9ë|8ÑéáÛ'Œöñ÷¨ãÂÁ·|©OÓå´y†Œ.’]²á9.^lç••bù'Ÿ}3K /~äá¸i©x‚ª¸æ§i¥èd<Ìé„мãNPPñU¥@ûVƒ÷˜—ÅM¾³åz_t{ܨOp·¿-°"{Û·›L²ÈH†äŽ…÷¨o•Øë¤ú’U,ªÞõR.}„J?¼c±Hå…Zw^B²K>áÕ_ÐfЯÖ{íŽ4¦yM²b׌‚DšÄõŽ²D¬r
-j8Œ8MA¿ž”ج‰Nݲե?=ŸíóYÅäQ"{•é”Â÷pn¡=ë¦7\‹äœwlÍÔ>d÷u-S”ú,Yô|›_m]
-ˆ4aˆ'yÕ"ÂaD¡8guKpqM±üöÕõª‚—¼2%ÐïSÏ^º®ù妅¸pÍF(Ÿ¶ýÁIwÉTÛÝ’jÆî3®»ÎwKìdFQH¤·Š!õÁéïQg¯LêQ#Ì-‡Àý&çoŒðpù<T€Ë³¾¥(>A<§)º6æšÎ\•”UžðØ$³vŸP41–ÝBhŠ©si滿¦Z?Êð-Î}¾½ÄÜi|åâG‹:ZÜŒÓns–È{ͪ-r•¾kœ–š±<Ɓú¹¬BM^ۑŃàdQ©ÃFk,ô†Ý̸Ú,_ÏÖÝ´õÁù©Éå`a嶌tQñWöUE‡ÆbÙ
-BV7_äÅöÌMg›fp*í«é³/´¨œ'ul#'W–Tù<2•÷I¬?>òï0›x2c2–q†6ƒ^Ó õ#Dÿ%珔v됮›­S›gèNCWY2ò±¿u£ÑWPvfÏÒ\Ý;Ïtò–R¥É“þâU
-•Ùu¦M5Ì£“‹uñ±™ ÓÕ,姨y}ìÇÄ92(‘µ×õtòJ[UÒ¾‘ÉœØ;Ci¥¾–Eÿ»‡PE—C^î»7­8]“)Z Ø 3BûAhÜßèÝØO«†´Ðá֐æ2ßÍýö£‚	ßÂjÿn$–‡‹P;*Îmäqdÿ;̍-Êh_Te­•³bz5ÎÌÁN§¼è¼@t»a›Ì’fÿ’`CáÂç0¶RZó˜oº{ËÜÒ¾àŒxÇmWù‰3’ÔŽ6j;©¢ë‚;J!Q çNŒá÷ýZÝ”×¾7?ÜÖB=YûÈv±pÞÚ’æ`] ×¥ÂÀüh\ßÇ_voã=Þ¾'ÓM%²gm¹õcUÁ…÷F_–j’DžŸÌ<æïVÆy6¶Nµ9
-†v¯Oy&=Å&@4ê•€d_….×OxBÔÚÊA
-öåÇ™cÆ?¨¥y$(—ót?]„N«½­,òqo®¿žùðÉædï´²
-X^RÀä,Ü“‰oPÔe¡¼Y»½/Tò~ܦló`¤üãzHz¯³ñ­€ôWêk5[fj’ʼ¶L\q$×õú᜽rH¢•ñ>ƒfúÒº:9²X½XÏý£mÜÍ[<váE‰¡Î&rÁiBuZÃNÝ¡×C…@Ëé§(é¾sù¨ñZ‡€$I­2—‡»v	ƒŸ/hq¼°kð5þ!•ÄÆùú5,ù–¹ëNB’‹¤ºRn¬³°ìr•nJècúÀÂÉ#ÿÞòPÖÀŽnïõüàqÍž—ít<jIèËfwlÜV¼‹†˹Ã8éá…®Ï×V’1ÉÝÂyêÅàF6áOÓ-,¢!ÓܯIYó’[·wé*Í8Ø“±bææ]jÆWÙr—)Ïz\&aÜe“yQI“…Lj³E>Ù=¸=kýêâu„º·éÙ…ÅÎBT׫y1ƒC†’ÑÁM‘Î&”g$_¤^SX̍"?õ^‰Z”÷4„`ÿŒð\U¬.w~̲jpÅ€º95FÍâ"4ó¥F'¸M$¡—a·¸œLÈiÄ›ÓXÔÉÍÁBùÛ>ÔÎÞ;Ïâå>¿¦(	EÒY%nb.´5MfÛ-!œ%ÚS¦E26°ÓŠðÔÉÀY»“Ò+^ëM®!báM;aŸo0[ØÒ}²û RØû£9'1‡äôU¶M0âùdÐmuöűUjjtïé§|*}ɵv Í¾ÏFU,©´†°…âJòñâVRñzÜi…’®ÏCíJ\2j{»v÷œò/Íغ,:¹ö¤Žð¼(§°]Ö‹¬h£¼ö¯t¼þÃÜóf×å9¨aw×0äo‹´Ú½–™UçÒ¿ÊrÔhswÝìË$‰½`w廬v?$¥âÝAçèw?—ÿÈMS"âAiƒïíóªGeš7Ÿ]ßè“Jò‘•x^-¹Ì#üüä˹–.ôöPtâûnjgYoXk¡Oé¬×bmïDISÆZ•¼'ô¼W³Úµ<€7!’°SdBn€yÅS2úv?½mãýÍWUh‰àŠºçù!-ò2Ö¼²	¹ò‰•ª7ÕE‘ÕRÇnv¦ÐÒ¶üg3߃LJ„Ñ‚·°
-•L-endstream
+xÚí·UX̶h‹»k€+²³3þa0Zz:Xíÿ„8À	Áë@fBœ+ÿy0þï·SDäáMÏ gae_LfðµbòýÓL]ÀŽË¿>—Àïï³¹ø±=€¦H«K SÞëôæ°
+?ñâ™JXH‹–…†oó]ÈÁ+‰¶ec²Ž4[õZÏUYØh‡°‡¤î¯DÎQ>Ê“WŽ	‹o‡nF‡Y^mDZ·Yòžä?ƒÏÐ;šîÏÙ!ç¶Æ+R´Ks¯‡Î
+•¨ÄÔŽà7È zuÝ{³C88µ$²lÕÃCë?²’©`d8VD°…oºc¤$ÁlNûY‡#´Ò®ß€:]±ž‹
+’ß!žLᢃXDòVZ¦­ùóè	¸6õÄ,ž6cô	
+e=Œ”&Ù5½™5Ñíö«?×zfvUÛëz=!^÷Mh&	Ž†å¨àg¸5/à«$PU`ÎxÄ[¾ÈcØ8CWK…2±”‹ßã§f+^+]y‚°;BÏ•?KCvl•é™çOQ‘"ÉPˆVãŽhØŠY9'ôj[Jì„ô‹1·ó%¶· {ìd+_yøñ¡Þ-SˆW¢é¸–¾bzŒ(‘&>‰Ëö ¤É&ä—š;¥†«\Èx)â„]ç=ç»…Þ>@ùè¸«„7 ¬¶ä5±ŽfX¥U‹hËÕèáÈœ¡˜¦©VÚ†xÕÓ*iYVÉSd¸YƒçÍ¢dnŒŠ¿ŽÜqf—pÒîJW¶»Ö\nî®ôXJññ“}Â
+¨j#V›L`a¨rÚ¥DrCÙøíOÓ3p§šœ”¡'×@ñ‰ڰ×(0ú+»á†"Ö~v†ÔGqXÕý9ÇkþؾYš¤’y+ÅŠÃýÝ#àÛhõéן¬£—Ø&)ˆ¬7?m!?'~tdC2°~ÜQ,eSÚ]ËðÐ),j°\•J«•‘ïþ埰à7%h;+ÃÌgeQ{ ‚n/%trTÉ4êî5óåU–t€4·¬	÷mÔ§çcA»øž0ˆl«0üÃd¡M«|ÕH4±î·aJ£e¼þÞ5LAWÄŒ\h§ÆÌÈl%ÌÑ–“›áœC¬³Î±0¡
+É/ŠÆ}»Ôßù<v[>$ã\«Eqb;'·:­}
+Ô>¸ÿrÉòý„Ãí0«« Àœ·%¿‡Ôkƒ3	én+)aqëÿà°{Âýέ´7ÕÆçS¦âÁHw珦JéÙŒ9ÖËéRNß.–»¿^10Þ&¼»û=¬ôkh’¸›“D(ˆÛfé´$c=²þ³Ø{"˜\y4”ÚèÀ<·T™i'Ð@o%e‡½‚ÐN9¡õL+™5©ÝÀpÕQ ¸GßuѤ«;;-çWgóž˜è—˜p<”>ËÝ‘T¯pœ"aÞ-ÕjK|yÿ±ÜÖOÆt’¸9ýü‘ƒÕ.þÝÄ+µ˜¬<¬ƒŒ#èêlÞ`œaÙò'`o—.é(TÅA×ìö_ö.‰œ¬mXWÊ1ùAc"+Ó$™ö6õ3ã\
+öÌœ@¾Ü™!rú;ã·ø{'É×'sª¦wFtqd‡ÕÙ„gYçç+úäOâ*û¿7ŽN:~›—~'¨1Õ§]Ñ®ïh{ĉ'æù¹‘AÜ«ƒ \L¼ÖRd{JL:Eå+ù½Zo¼‡vO]léGHVî]º0ô=܆æ½MÂSåg?ÄÌÕì°ßUN¿ ŽBÚÛì°ÈŽWIÂÊ++Ö$ºHD!ì–Îq^`–¨àh?úáà¹Î+`x÷@FCS5¿¯û¾ùr¨è°ž1”ß“N¼l¾èCx°‡`+­uðː*VQµ›Ö»8ðàÀGXl2?ð‘-]Š›Ây–§KBÓ:y#¸˜ýw:Fö65«ÇÛÍvÃÏ$ÆÇt¶ÜnÎîè$â–߸…½+Þ¢'À*MsrVAÌB ëHÁÍ•¬Û)ž‰¿	ÊžâÏåµC+²š‡²Ê1•÷UÛ®7_/¡R³	k&Ùà͏®nûÂ#]„Œ·	ƽÆkAµësn'Xza*
+ÏzÝîlm#ðyWIáO.êßQpϲ\!/øæÁp×Fì7¢Ù¼=|F[ä÷¬7YÅ&DÔ±ñ™5m½6Îˆ×ð’3ŸªçªÞf¯¼c;PvNù^YÿZ¾{§pô©ê»ÎŒñt[I£¢Šè¨÷Šuu"
+Ù¹Ûߎ,Ýœƒœlñ×î9k5äðµêœFTðרßßm^zùôŸÙjs&
+RX×iÔ
+VD…ºC‡ðÆráÊú/¨ 
+µÛ là·w%Ž¨…s,JÝÊé>ÖzûµÃ糪Ȇ…!ÓOŽp(¨vn¬vŽ²´øùØÛ»÷(2Lˆ¦mJýóæ}*ŽqÓ?Ž]2'Ng–é“iá»׌1â€Mâª"-0Oɸtýörí}ñ¡½ùt%W k´)„óŠ@ïÅ›ni»ö|õàf۹ߌßóå7nubZ'U§àø+7ª•f嵌dKÌy¥™WtЦ°`—KCÏYË™xWýØ‚ñÐN]ú•\õ×°HQ®#ÛMõb[ÈŠ°eÐÑW–q¸EâjÅ÷iF'iY0°¤Ù-|*_\Ë?Ʀj°ˆ|Ñ®Î*„h €ç‚t°çhÏú`¼?’ï ¦¹Cî›7EÿrôË¿%}Í}eMÜJ‚XQAGSº2~”Ä8D¹õ¾ËÿuÝ‹ouòh¡R‘Ÿ&RmÑýsID™Sb9¬¡¤ßª‚GöhÎF¡Ìüe»´B³0OŠð+ÿ–GZ¦3H§vÚIµ»veœ‡6&_¥/þç“
+h¢
+5MÍ><EáFôë‘’?JYÅ39NÝ!P{ðLd?n-üÈú0¥Ù…I$ÜÄ}óp‡+ÇÀ™èp€„4Åœ@«™áŸ#'3s
+¨(S4Jî'[ç¢gœQ¹#ü-?ýv9L‰ÄšŒGqßÍYîD¢Ý!€D®Á,O7ý6¾QÒü<ì·+±WÕûóØpžÐ=±ÿ.{2z	J„¦Í!oß$(û x™óÒ&W<
+qÜë1>4`U+qÔêjø!Áe§¾spš!o|K¯”"Ãô!8±”ô×9Ç܁ûÿ±\Ü*ž#)5»^7—vÛzB1Á{êq&:ùÑ‹W1˜Fòh sE\C¥d›†G·h#Š…°Ò±P©þz{®iG?\\¿è¾:•$2Ãõ£ìSõGN:Ò`™lœÇí¸\f5&͹n®õœ¨Õô Ÿáƒ?Ú¤5H×4?¦9·ZädÆê¡#òía¿F‡C?Á®]bFÊoÔa÷0|um¡×ِ%JG_í" Å¡D¦ˆÃ~gxxÊçJœ=8m‚áQq¸äàÑéïø»`¨˜7&b÷™\ø!íPˆZîœ$A—'Þv¨Úõ€pÇå%e9'å¬V¥“ßÂÎÒÆ”ÿû—Ð7=F…0”¯”ì>­µ-ø´~ïm¹y½¸2	rh­
+ÊÎìœÚSÙG¯rS’ °zL—­lÊJw‡	ü×i¤~‡xxÉcÃ#ÉŠó̆ôÖÑLkŒ '_ÆœînC°Ýu©]½1’n|
+ÐøˆÛe9h¢þÊ:àú½Ó-ѤÉ36|ûyDik9Ävmå}â;Oèñ–E *W~„xdݽCReCÏÔc1nLq¤²|ÃéHH+gÍά9J=ÊÕÃññèR]ŠîÁ¬èÂyBRKì0£5	ìxÕ2!'ͪ»«•2zWLÎp=
+¦¤|êâÞWÁ"k朦n¼1“'K7¤˜UÙìùÜÒ)aêW¨-»W6Þ›]Ñ'C¹,<¸âho-Šºóþb'aÛ#ƒ	2cÊÕ‘ß÷$<ÛÂ&­–ˆ™nÙð¦Kï͐ã¥õu¬3èbSF„ڏ$ŠJzt¾Sû˜$ulC¾p8ñæ"òa2{‰%‹ñJ9ž£x±^É?‰4‹§¹-.£:PWúË{‹ÇÌ08U¦‘ð
+žVL¸|#íõ“P’>.*Y\õäQUPrA£úÅ.£ÂêÀa#:·ëãŒÔá4¿ŽR¡ï­@Ñw)ÅÂ;¿ÒG¬Ìé|¦F£ªy¿X­‹8zvÑô:µšx­CS,þƈ0­¤šÙý)ÊOM7B„+ 06ªQ`+ÄYðŸââ\ü~òùš Ẅ¹cбºà“ .£;‹ÎÉ\å ÈÛÝÛ;Ô/a­*ÑŽ[æä[5<Ë»T÷iÁ`Zvt–?þá	H“'Îå?udž…µ·©æîZ;ÓÔ“¡Ýðø®œÏ3éö'Óå/íÄîX2DÉm>‹Î`åÔ"
+ +…8—`Ãê×[Æ –Äšßo}—
+Ù}{k»;©Ø£nÜLÞ/Ô…yâ?Ö‹9ÖÛ×Å"Š¡­"6䉗la¬0·Mm.
+ ¥:!Ú•=>ngÞÍ»i‡#ÄGsW‚lÁ{¼/{Ëá
+ÏÍâˆ*b¼Ûˆ`Ú$Ø¥£Êc¡8Õ–âO6¬TæóÕó+eq×ï[æ;»Ú+Åû
+åÖ’î¨buÛïéÈZË“iz$>’Ð²¡çX*‹gšK.£yˆI“wú·[‘}OÐek¿¹QíÇš›¾v4†—¨dp0·FóY¼Â#„]
+¨æAò{¶0íâY at -Q¾ixÞvJÚÅòYt3ØSà¡F¡{öVõ©
+×ý¸þŒÆ1†Ä•¤ú!?aziÁ(sÊçeú·Q5IW¥çÏáã¬WôÓâD.¤¦]³Áæ¹âkáé¡eŒ”5ý ÆÀFK:fö¶¬Bš±®k—–—ç"­Åáñ®–6äm‰\Jâ®zx¯€+ýS—"2ŒŒ‚$³noŠù=ºŽÕ¿a+¤¡Ç7l—`-Ì4TVoö†àÐ,AìŽá³[ÏX ç(!a£‰ŸÿëÞp¨È›	¿hš(¬ø³¿ù©N‰¿G&/u[h‰7Õ´Q77ù &ñÊ ÜAìÍÛ¶mØuC—!ûwÊ®4¨äÙK§*£¬`N˜ãó±Ç¡ø spøúø³›ëcV‹-ÞtÊœ–÷ó¶Ôðäå8aÄáë‹°½Ip{_)[m¹än½€Põ>hæ´ÜêÌŠg¶·LÓ5…°–¾lžð/y¡ul¤è™-¡°›éy”u8F¸Û–mØVo2‹€‘Å¿M[š»aËŠš•UÙàê
+™µLP-erŸWJ5æÛí›s-qô{²Û¸Õ <˜ÒjñÐíéM&·¸mFŽlßùz’GK¨?¤‘\È
+*ìR$Ã@ê¶É´
+½QˆÃ×þb¹K{õÕ÷ý,É£Uк𼏧€(7‘™‡÷uc*¼®Î¿Ê¿‚=˜¿™ùDæ*¡¢7Ï®Dç¬ÝËW¾ì?éW®Ñó^­=–\ׯ8Ó	C«"] dbçÝsòOˆP|hÿ®yŸ%
+ṟy]²+ÄNüéØ^™Ä
+(‰¼ÔP¯“#·’xˆï‰¦\Æêh$ûôäÍänTŒá¦<Bß	Fy3"e¼Íïñ{}Fà­X6QЯ…x´mµmàûØ?¸»/ÎQ9SÄv§²0؛׳»–h1¸çЇ•¸§à
+â-Ÿ™žƒN~v­²—‘%¦¡$‡Ÿã“g¬"exÙùnvßO ³aew—Ðò]pSÏÅåZ-‡ìjR4´^	Çã:‚b0²>ÈÑf¹Ã.§âõð`IºmLäÑÛ²Y‰Ëó`¸8Æûî?îû`g."ǝ.ÎYgð£~»¾÷;\ѝ£ÀàVL…éU†ò·Øã#Á…al5I|…¥€á'áÉÿi»é\.]•¿<¶¹‰,)ž¯˜ŠÒwk_+Ço™.îµ¹š8Ý“8£¸DÒx Û–‘pœ^úÅGÁnúsLS­íªÍQªMr!¯ÒÐaƒuªë@ì2‹TŸ.tÕTiƒ’\µÛP½®½ÊzâqK=Ù¦¹Ä‘n~íSÌ»TÇø“5‡rOë¿oW/›s,bV9Æ@Q˜q6ýãò¼¿¢¾ÏûetËWõIŽšŠ©‹Æz}lò®‚î"xѼn–Íô
+»‰óFÚ~`m£#ïfèöF	u*ÌHyì"„Éo×)ρ
+P"<Dîc	ÑŽÅÙǝÔA±.›>u®uût&lYÙëš
+åÐs_VtfA¤^§:P+½¨ZD!Hjš©	l#ÎCú÷f2ÅÇåu›íò~×Lñ+_¦ÀËõúwù÷׍Ž_?ßmÅbÙøùuÁÄ	´§,€1*n¬/Û8´}Oš΃ÓÊÚ|6êF“uðÓ}Ü^´2+qÊ´­ÂÁlãòü\i­´a4ö˜jЌʳn&6£…I`×^‹ö¿#r=È¡Þ÷TçÙNµÕÌèБœ=n~â}–íí¾?1z“&cË&…Dqm^ÖÐy01fï‘CóÜØ={u§<ÌjE+r÷‚+ã·ƒ&õ­f‘>žkfB×®VH¿Ãã܇?hXgh\«M§ÈEY`µÊ¤ñ™ 07%|Ó<¢nr-RõÙ÷žX^ΞóÊ™§mF±ì¢¾tXčí?z6bùq‹¤+Ï¢;o4–F%‰U´¶×ΊŸ2~؆€Ñ&×­¾€;ãƒdÈr=Â>Kô¡#ÐÃƈùÈä<áðù°ÃÏFöøe™ÙüaÇUIè#S9nº´QsÕ§Cö/ÙãñØ7£¡ûTjî¿È݆ê92›››Þ-˳Žï*†CƒÆ¡´Â¿»Ñ|ÿxí"oe(¿Ûõ}Co•Î0%cíyð0“…i+ÍK%éúæaY‹i8A?a¶ýNsRot•ƒ*lÃï‚l—©'Þg®Gñ¨hB½éÇ:Í–@I²ÉƒK¬áïç˜BUÔ„•;:É+H7€tNWžR-D:µ†´;`ôuFéÊämѵ:QÉ À–+F»Á‚¨Ð÷÷y"‰Pèg7uit‡ØÑuŠ\“:SÖ7 ñ€bÞ&é^êõ<³0Dx÷Ûd3"íqèD¤:Ó×Q…Hã·
+AO“	ÞiˆªRÇ“Bu˜LWð5BGÚ%¢Öü©QpbÒDr~XÃÓ?S:én0Yüè}…g×gä4ã†GwésNŠ+´\ëÃ7bÆçÜã
+<Ð¢,¾!Ÿ¶Á-6ŠÃa¦F½yŒ;b„Æ>ÂÜ]ôD~Ĺ8ÕH@¹•BáL÷"—×}z]ò|O¢‰îÁ‚­^cT÷\PŽh¶ÀJزs½&zoŒàzçÌa=´ï·‹á’+Á‚FØí‚WI¢+Õq…¬¬VQãW¼O¤›Ÿm»v¯\\hÝö¼<Ã!ü2ü†ì‹f›¸A[9«(γÔí?+Ï+I›ó¸¾7-®scþ|4˜h‡€òô@Í—ËU^øx¿ŸmªÏEßLò–jÕå A»+Êw±åˆO)̍S3cá4ónäŠÎ³rèMÚ?ÛÓHi™l9#uò©Ü±Ó„£49+W¿é÷}j‡±}ùòŸO2†I%ö­#z	‘¶¶v)ø–‹Åå^²Öí³ÕiÚd®.æÀ¬ÆK£G9¢Tª >€ÑœÃN9Ù_ÜèabI"áÎç3×÷»p¦×ùz¦ý¬U¥ÔrU™¤¦~ØáAϐl‡Žˆ8ڛϷ™E¸µa/
+P÷v¦¾˜¢ô’ù|'ýÆ{Ü¡yws'­ë´ÚµG“ÉØtÆì36(\êû»ŽƒTž/"ᕳ/2D©‚³[™^¶åˆeZxÏXUóèµ4÷[G°ßûìÂ^r,ÖnTI¬]
+Bg¹Z	©œQ“V2öXË›¡?Ñ2{¬ûŠ¼8üÑ…p©``™ieç<­æfÇüUpÞmsbwdêw<·Ò¾vó|mE* 8|6$…~ˆ"uÿñåƒ Ó—ìk7‹Ó+ñØ@Y¡L½ŽZ*h¬Ùó´«_Ï'Ô„ÅÎ%¹´¤”‰+q'E õàOT%z×.†¯ÛÆMÂô%yŸùèö¾áKq^'ò0«Ñ¿ÅD÷`É•¦<Ï*í÷ J8fÙ•å!@}¶ë4âl n$…ø¾¹öKû¬¨++f@ĤžÀÆf{’€°©R²‹îŽAr—±üµI.Ê;jè»þ%òTZI†É¤ª|¼wéÉ°ºÿ}KW˜ö‘‡_ü
+&nïûÂÅRÒ endobj
-11 0 obj
-<<
-/Type/FontDescriptor
-/CapHeight 850
-/Ascent 850
-/Descent -200
-/FontBBox[-34 -251 988 750]
-/FontName/NJEYML+CMR12
+31 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 65 0 R
+/FirstChar 33
+/LastChar 125
+/Widths 66 0 R
+/BaseFont /NRYWIT+CMTT10
+/FontDescriptor 29 0 R
+>> endobj
+29 0 obj <<
+/Ascent 611
+/CapHeight 611
+/Descent -222
+/FontName /NRYWIT+CMTT10
 /ItalicAngle 0
-/StemV 65
-/FontFile 10 0 R
+/StemV 69
+/XHeight 431
+/FontBBox [-4 -235 731 800]
 /Flags 4
->>
+/CharSet (/exclam/quotedbl/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/V/W/Y/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/braceleft/braceright)
+/FontFile 30 0 R
+>> endobj
+66 0 obj
+[525 525 0 0 0 0 0 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 0 0 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 0 0 0 0 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 525 ]
 endobj
-10 0 obj
-<<
-/Filter[/FlateDecode]
-/Length1 1091
-/Length2 4694
-/Length3 533
-/Length 5429
+65 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 33/exclam/quotedbl 35/.notdef 40/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P/Q/R/S/T/U/V/W 88/.notdef 89/Y 90/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef 123/braceleft 124/.notdef 125/braceright 126/.notdef]
+>> endobj
+23 0 obj <<
+/Length1 1140
+/Length2 5257
+/Length3 532
+/Length 5984      
+/Filter /FlateDecode
 >>
 stream
-xÚí“g8œk·Ç‰h£GÔ(#!º1J0$ºˆD‹1ƒÁÌ0F2z¢“ H½—A0z‰!‰"щÞK™ì}Þ½sö{¾œë|;×yž/Ïﯵîÿ½îõðñèßU†¢Â4PHŒ(Xªê‚%€`1q-(ó§õpý×Ò#ڝà(@ð)$¸„¢.ž@(Ì+xÚí“w<Ûý·À©jµ£¶"bÕ¨ª½·Ú;"‚HÄÖRµWÚ› V©ÒªYjS»ö*Š¥6Uô¦ýÝßóô>÷Ï{ÿº¯›ü“÷ùœï9ïœÏùr±ë
+Ê; í¡*H7OA°X¨¨m 		¸¸ÑP;O8ÒMÉÎ*
+KIò^0 ˆ0,!-*%-†M*"Q~h8ÌÉÈ«È÷+éPEÃ!vn at m;O'([bç
+4DBàPO?! ¼«+Ðà×@¨í
+u€Á@8Äh…ÁÝ+šZ·ßæï#=;¸›§‘ꯢ¿r3øoÆÎ
+÷Z	ƒ±‰Øï¿Yý£•²é+Az¶€Ñ_„½oÐߥ¤$ û¿	[ò…±eþ@0ýiþ¢@ìÄ6uúŁ øˆ•pù±® Vñ7‚±n Vùb5P ¶/úÄöõø±“óü±^ VÃûÄjøü"ؾ~¿ñ¿/–‚Ò÷¡ ¨PPD\ø×ßÞø/‰/4êæùûÅ®ç¿ÙŽ]f(Ô
+ÌL"!2¡ÎiuáeÊ…#åü¸
+°·	:µm[HC¦q]Ÿ÷kºó/Ö˜žWdҐ¯¬³ù\0yD7?ÒTùöÄ=!}âjÝÛv=Ó¿Éô SÛo
+uë4d›¢©nüè«8®îØ⇲d³¢®œ½îí=^%£/Dóì8ï-¼_¿Ï
+•¸cª’éú "¬†[”Ý€2ݽ,R,bÁ‡2ùþÂpH sqýí¹}d³õy!q~Ò•åÑæØ}ºì		+·¡‰)§I„«“]L¬Úm1¶Ø¸¬†Æ‹óÊlÜˆhwBºÛ¸lv’„r=dz‰þeÆG¯s…‚çÇÃ>ø¬ÞjbA‡TÂ, j%[8ðҐ¯,å÷Ør‡¼Â'‡Ô±&=kSå÷Ê?¦2Œ¶k ¼#äw¶+
+h2Sï}·‰e©¯þ¨Ï _mï2ŸÎ­“G'YݦîîvÐê§:{J~“ÛU@èˆz'^ô¼¹½“®y^)ñ-èC0òpU^’¦Ï5†>Ÿ–ó^§üy&!|㝔أ«è6ê<‘µ§N°/}õ`ûšÇqpmDRý+Ç«heýNir!ÅÅ*ƒ*ÌÆç¨|gOŠÊdõ{
+vÑ5+âNâòâ~ïpØdVºWFõ+Ñ…ˆ8ÑÒ™3²Y¶G*/³t{bj†~>ÒQÀጊÎ&ñ
+DsÅî¹U7Úög>øüCð^øÈÔ›î¼~Óµ0Lê´Ñ=öÃü7\fmÍÉþùµ¾»Q¦ùèä
+éÙ{ë_Úӏ‚»ƒ+|e«]ÝódÓWð®FmÝO°ü­…Öف”SÅÑWÁ§:¶{©¾Õª›b´êѝƒ ³V*–¾¸Gí—xi=y¹52LGÖQdmÙorØ{jOÃMC_ý˜^OG~SÕ%Á°8Dqð+õI—‚hêË#Û«ÄÏn‹ Ì6‚µ¯©¤þ˜\Vë¿Â¡ €Ù“£íé#?
+¤º)ÛºxKkÂP»ÖÉ_@µpžgÅpN‘~KjÅÞ†øßL!\ñ3&£OežÉnqíxÄãØî2²f±ãAUß?šŠ€Óíb¨F2ôñ¾ê&Ãu³bËûº¤
+L=ùš³ªOsOI衏4¾à¶ˆ˜ùjé&÷ø$›2×­Ve
+Áð-ûr+ß=N>:¹Ö¨Pïy·X0Ä‘VVÙìÙËNKKí€iP´Cô4³-ÁÄ~M)ú‡!~äü0W»w{m$&»fòÓMbŽ~ßCž71>V÷‰£Ì­øNi‰—^#µXí/³7rü»5¶
+ù´èt™=çZW€<×©Þ³ÍÞÙ¤ŠYmYΈ³J(¢%öt¶G¢´6†Ÿ^ø#R•OIhvH\•¥6Ló#¤m%4§ƒÑ7‰hø,¤´w¸›l/´eE=AÇàU%°Ë9 ·¼0B´’‰Ú;šXlp$´è ÀÓD%-ÁoPpûu&[HÈvlh¢`û:½i“Yr[¶‹Úã÷N½÷“Žp-£¬+`2ìÂÚŠi©fJUŸ•ÛÙu Ö´6¨#û"²Íæ^ìÿPÖi%Ì]áãuˆ™ä­ì‚ù˜-ŒË¢ï–dø[FS´·ÞŒ6üb;l_%;5
+	½e+h¤†ë*©ºÔÔM¬Mí²–eÛÏsHˆ[JšMe¿Â÷Š_c|»‡!oÔê&?גݤ™èc:©â<ÎMoÁYÞ=ìy7ülèåh$§ˆQŠ…Ò뼧ˆÂñ„À‚\.1ÀÍ°&ò¨Þœ‚g:Éûq±2ÆEñü‡ä^–,ns”@›ï,R†:“|[ÄÕÿ$×n£ÓâëvêAÙåèç×"<IxÒ{ñ„v¾›ñŒìKâóùZÀ‰Ì‹¾:õõ„ó¯q½¹˜–[¿ÇïíŠÖòð…‹>;>|/Ôü2ð6ïTˆM¸éJÇë]ݬvå“𬘶XŠüDb±
+)%Õ1ZºÞãgÅÃCë2P.F¾£Ò»§Õ„ÕÏòíoi—
 
-G†BúЍ¶õ¦ƒ@Ò@o0Ž„°@–à$†Da)@BS|ö(4à×}JIAv(Âö—ü§rr%\
-ú·$yÁШ¿iq óø7Ø
-ƒý­HAî°G0ä_Ê
-ÂN¶˜¿‘ üfô·0ᨠØo(	9ü†„TøoHÈuþ
-	f]~C9 ñ7‚	Α¿!a#Ôo(A8ûoH°Œþ
-é7$4êïó€	?%ûþû4¨¨ °Þ¢’R at Q	B«äde2Òâ¾ÿ5Î	wó€ÝQ#4W\\FNêÕ΍†!1ü~„AûÛÃ	c	ƒaav€´t&8±§ðþƒ½Ö‘«¦
-£ú€¦ÜõéƒLæÁž-*R±1§°Pgý½qš“ïúQÉGÜŠá•~ºòq­Öžžì%SÌBöý³ûÒè%ÑŒ5æ@-°¨zœp¦´·5)Ýô4ãÚ¼ÝÅÃV{:Òí×<-1nîÇÍ?]ÀAìFÔk'¿´9¨ C¾W…š3²zVH0ú"‚$CÏŒw•Dý?Uk:šUåÔd¾»²7›“¹¤©© ?h5ïÓu-±²‚°ûƒð{'µŸ'§"óú³¯Æ,Ù<vK:MISVö;¹à›J
-Š~%
-Ư[fä-¢…¦“Ó–—™­#­BR·wÚö¡q\R×-¯—(†6õwwq¯Ï§³¦Þ;ZR	ݺ7ö!¸Œe•ÅÚºQ‰Ëá#{Æ*c:~ÏhÖ͘o¦ŠK…	³{'ÛÜ;¿úaJ~Æk€¥<k’Ç$˜þm2Žó&I‹’ö'ªòô¶tz³Æ%&’~ê3‘2þ¢áZ-Ÿë_<êÞ~iÖZ£èÓ†"°X¢’Ïj5Vôýí׼ϋÍ2åÒbØoSn,óJ…å%§ÿôè[Í	Øc(Œ‹D@Äüà2X	Ï’Tƒ¸e踬ÀÙFûªÀS˜çâÓuvçÊž”tÑLûÑ©ÇLš;“òØ!’Ù£šf>§µ34äd»	ùd—{³6§¿1Ûäˆ*Ø'Õ¼?Ö€ÝÔÉ9*3Ÿø{¾„_j4#ì!`ŽŒ*š3˜nLµX¤í¤ò´Úšn\ÝbJ­^ò@$yÿpÓ­ÕÞUŽ>>\ŸòNŒppìèûev>»téîLX=n·9ÐäõrçœØ&4S[çñÀåÔñ¶ë”êC´AR§Riin+ÕdšÙsV®+LæEßþ/¾óHµæÉ-@(ÉdººÎǝ†,§Â~iç–ÌC{¬öº–NpAÞɨ™ÖÒ?­ïÊеŒ§o´Ê8‘zCUg½±w¥KàYî§lõ$Ïö•Øæ‡|33ÅxË.#TÄûübaâœulÌþ;éWã_w˜k—¸5²¯ÓZ¼•²®¾ðhÛ†^:çûgc½¥D®¬[JÐu‘ìU¢`f”Bƒ‰Ä'ÿ{îâ[R4/öîºðÇ>§šû‚ҰϏî=À[Û9ŸGÉcóS_ÕMX/³¾ŠÍ›£oqÜ©üÂUÏr² $M”ü¢y¬òr%NÖ$ǵԕŽ„ø~¹ýþdøÀôö`g¡Ê¥ùüÌVªÖ'ñp¡Í'²”ÞhôÉ•o÷דËòµüC‰{ÜâÄO˜8鉧¹A]{,C®%Ÿx9ãR—me95Ò›ZÕ.©ô±³xØXvÂm+¦2›xñ~ØR©oS û(ß@
-щþ@9•weœÄ7û6sR)|ɦȝ’(îÊàLhù:–§¸„tãùgµ}Pcî zò@æq¼;µ&«l.SIZf g„ Î
-¤	®FnEn‡Z÷-?hÚbG½È%ž³Fw–[ÿ¬ŒU½¤+I~‰Oÿ<\Ö1š·Ð2~›ÕXÝÊ¥§rÑX^C¥×åi«—+Þ·´þ4Š[2>¨,˜œ&Râæã…y
-Ù#i" u%óVPƒ çNVâëž-‡s€¹'‚=ôW·4¾ˆºð-#
-}©å'KÔôߐ,xººZ…ó#è
-¢m+Gž§VÕ},ËÌ÷©Ôî²ß?Τ_ÂÞ-ÿGÛð)_%¶b¡]ÍnV°Ê#Z›¥Ð¤¦vªï)|Y%ïÉÔÄ6‡GkÏÖOŽ¼üØAbœ¤…K­=ŽÑÁE2õÂzŠ‡¿ïb§¹ÀÛ9æs/–ï÷å¿~ýaê„MÒ{["¥ùΛˆ7°âËøÔ²	ËŸesˆQ]ëT¦”—
-Î!’Fò4ªj?¾çªãü$ËÀlE¬bò÷ã³Há·	
-ÙDL¶ŸŽÂ„qÁ|û¶y^̾––ɷ凂¢Þºƒd&|QJ>í#³ò°Ên)
-¦hº¤¦È”÷:½Üî‰z‰#^¯Þ-mØÔ4€÷4&È´ûALc	ûÊK½éfê3ßv%
-0ú¤n²îßò
-^.xÉ¿uSwéÜKJº=¥·<AD¯S”Ñ
-©#ªâ“¿58sQækîZáCËë{¹qZ
-h,­˜D¡ä?àŽ—B$;Ê/§ïÓÊ.^ПЪ¤rð¼4–£ü‚ïö4Û–ìÏJÂōŸãÌx¹DÍ{ zjâÜI¡Þ¯Ïk.7®„q<W £Ó™TM×d]¥œÞB31¸âIךƒŒ…@ƒE=-éAWT¯ìóPm~'ÖÒÔ+â\gnö”™<á³¾
-•ä´þá£æpìý	5uÑÚ -ô
-çŸDòtÈJ•f<Øf­üˆy&µFžH™(-žÜÉ,ºUG@ºÓÙ_:üva×àœhì¢y¹A~ˆ'¶gýsÃœª½ˆëscjü5 M¶í¯÷%»µPGLda\³
-
-<žB­ú˜j‘:´ží—«Íjõ­´„È0é«ì™¶Ûmùnߢ:[¥jf„¤j+Ðñâ{04™ÓT
-ºú³ Lzè2–!|kS…YW2¦ÓµYÓ[VÓ-[\àÄüäÍÒKÞ†)KõN«kµÐo Š3Tê¼@â›=éeêHÙ—íY÷v™£„}ŽžMK>©~MôTý´YôTÕ
-ùqÆbG]D$Š5ÜÔ¤»š5æsò=ǹþ4ÆÈų͑¬)™†ôÎd$Ô‘	õw^ÊYê 6Õˆ§[÷”Wù^Ë~‡©µ5oA„nÆ
-ýÂ捄Å_üîpŒŒéî0Æ®À[´’öãsäIÅIm¯š‹¼¬¡Ä¤å˜º~+`?/düüÔ½~n‹Wº4ýÃl«‡nÑÐYŽ$f
-‘ÖJV@¤×™+ª¬wÚz¤ÝëáP>ÇÜZ!?Ÿ¿
-¸ XÑ&9(Ö_W­UÞJJëÆZD5Š¿«W—Uròª)RðwT$
-ó¹äçãZ|Ã|Z*~±äk¶?¯Ž„{€üEuÔÇÅç#W\õä`¬3î$“Hé2¡øÈ©ÓYí4©Â¸BêÉN+±·»gpÞ-W¨Þ{!ufâœx>G9jšÖ^¶̸lÙ}­~õµ}ÈâÒü‹+Ôòhb™gjSÚeûâ|[»‚]bù/6AüfTŽ­1…æ•ÄLv,»~By®o‹z)öñ5z—4,9È.¯o>ýVÃêÐ&=»œsb«o]aéöT©TÀ|G?ƒ{s at vÞ#ávíMçkÅGˆÙ¥žs_èÃ*Ý«;w¢œ)r8'CîVjÆ]p²èœÖfµ!G«ß„q~jœ1¼ØtËÞ,·”GðÆ@ñs¦»»4°êò—»œÚ#uÜ€Ï.ß8úµIlhå §¼-‰ŠóiÃ/ióGüŒ­*V®bN
-0{Q•N‘¢´Øæè-ȆғµQÕl¸áÚ“¤aZÅg뉌é^ôT½Ü7NÚ\_;«Üß9ÐøDÿJ²å»µžgý ¬ÚsX>‡ÒÐÈáy¦¹l£_×àQômc£ŒäÊž®|âŸåÊscWHámóª“ôLí\È$̈Œ—¸/³·v)z#+G{u„Rûþ2]éx.CÌ¿Î9Ú.Q“k/°²3šh.fÓì)rõ¨¬oûÁæbê^^4ä}7ÿÚ”Š»­6±‚ì8ßõR¥ù¥6ë„Ç_}Fr¦Û@gÑ•*L¯]Ù¨Z/›´RòL´Êö*©ð^(¾†ÀY벜\Wþ±ýò#	ž“êÀå ßE‡,òL°Ù* "ÂÔÄÚ_ye''ݞ͚[ü‰wçùÚ»íZz9–Go†\>\sc–ïó‹b
-M\_%.ñ3°Z»ÝÌNêÂqdº½œ0)ÿà˜uêE![ÂÕøŸ<céÎIã>—z9˜XÅ9®ý(})d}+[‚9¦)#‰æîB”Kç²À=ø|Ï’p(8bĨut?­¶ÐbµãqÒ…æ]S‘˜Ø¦ðQ]¯4œöOÉ­Í®ˆëÿ
-Žç8ôj>+q<áPʏËZ‚œ‚"Uš´H‡“Asƒ.›æÍô)†>Ù¯%¡j†83ŽL	³;çë¬Å…ú[ýüŒ7óòçUQkÇ#@ïohã’&ªÖcs§Ùòø$„*±¤»=d,¦7ëú­ö{FF½AŠ€7?ºÚê=”°Fø»Ùø©LÑùÈáoŒúÆÞF‘ÃÉûW¤INôöN7©Ì­SÖ2ŽŽÜZniYã÷)é~_PV&k›-äN01æ/òg94Z­#ÝêTéL
-6€ìՍõN?BáÚnODvR
-¿_Ù¹õ8‘ÃÏD–¯»ø˜ñ³2©ßv »`¨»	݃µ7	”¡±P=± åõˆ—ï÷p…™>‹÷eƒ“ÇFO3ïf®¨t)v‡S½3ȘQݼS¥á$Êáîê5õì"o5V^Ño£1JöÕ‘òælˆ)çjÇJi»mŸ[õ¥@Ø
-ÙÕýþ‰j©‚!Õ›ç•Ç+I=>µÕ‹{	“¦Šîþ•Zktý¥áÛ½7bàýÝcƒJ_MrH6òWJ±´·ëÛXýi\j†–69#¦´.x5¤‘õ᩺ÕLùú9}yõ\e†D‰2vÝÀ¥}}eþtéDâƒn‘òè~9Ž#aÝ{mÃo1¶Ëò1%âÉ dÕöx€Q ‡¿-'Ø¿•ñcÊ­ÞàÓÞ–…‹ÝÔ•Š?"¥¤íÄ‹—%(†‚Ì—@ea÷“£9„C®Ô¶q¿吧ñ~Já~…¾q):$§¼Ü¬Aœ«óyY:¬$õo˜ćÇ5-endstream
+H”_Dy]Ì ïF†\öGÖUÏgÕ>©Û•l8áë[܈퓕{„É*NXäFÑáÝ0ÝqPaÌÍ+¾yWœØ÷éá)œ½*òÊ×7¼ï	{©á¸À"‰ݹDë)Fd/L6Ë_o·x1AmØ_D,~±HõïKyòRQ,ûXGëêŠ轶A®n™ì:Ãó*Ýôó†ùU–Z<XÓþZÅõ¼·JÝÊCN>`é.íúJPˆÈd½6ûDJ¤kÃùu´J&l'"Üjº=›	Z;j\/Pˆ’\ë)ã–bLþò‰Cj’=Ê¢ ê
+æ¢ù9붤ÙÑ“k`Üά:G–M„ÐÇŸ”9›‚±ævXççDзܹ0¦§”¼~ŒMYÜL¸Ú2¤‚äùEo6/óνëy_ñúŽán¬‰z)œ‡UÞF{¢s>=hÓ-Î*äA°(.Fìå {-Ñêz„a|$©‘¡‡ësÍ™+n®eŽC½‰Ÿ›%GaïºÝWæÍË3Æo¿“Sâ+õ1em(G†µådÜ?Cá8‘Ýî»)D2¯$5bÕ|}ȼM3…ž%ôÒ4é´…I’>” K,ã8HèÑ{ç6#D£KŸRµÿmK­aâ‚ŒB$,˘®|œÔŒ˜Ö…‚íSúSà8¼]œG{ep‚Eô폱X©áqT²TŸwÉÊÐ_æªxùW[½MŽ¡‰Ðà {xõ<pÕ'(¹æM!ݏeÐXôÝ:Vn¿VÌêþh¤;!Og…ånQw5›ª½Ñ¬§­ÛH‡Rä$Ž¦Y`¥ÈŽ
+Í8 ¹ùÁW&¡L‘l3PéõÒ‰õªsÛôÚ¾…x§¥H(͏é×ìV¥‰ùõþJù‚T|lÞ	ëVAQo©Î¥@«ïüq6|ž»
+
+t0¥5Äœš™|{JBÛÐLHî„ߣúÁ™SþÑž×ÊÃttÉîÑëÓ”…Ê›øùÝ‘)>zä+œq*Ø6ÚÈ—(yëËv‹y;
+¼'~ÆŸäç–V8HåÞÔì}N9+5úô.
+.{¤Ý%=߃ökËmq]¡ٍÄlƒlßïîCÔA‚𬌝è¬Ö
+’R+¿Nâ’O\ïM´_²RFï>Ñi#–ØË
+4^0‹*üJê~ÿÃV(n+-hï—~>K¯ašòê'£U5»È*ï z4Ćm’žéÑ	4³y60Žq˜û_¬”<Vz)u÷m±ü	@l›C1å’|/Á*}P@þõý¹k(£5ÝZOô±ÀúX`[î¹ÇÊgz¾îÑÆxYŒ«³‰£µ(ñ¶°<¤/wؘÙçû£™ª]+°õ]3oÖ’=H¨Æ˜?g´Ì­gŸ‰tnPë?ÛŒ¹Þ¤ë $OÁi­e€ÙƒÓôF7ªŸï*ìÅ\‹9<ks¬	®”ýÞÈ™ž{Dkè©ç•%œØzk¡
+j<õ
+Xm=ÿÙ}X6$Ö¤˜ŠÅÑHhœRËåóŽ1]L›ðãí ÕÇç.:ªùû¤³
+*‰T˜7»ó{ÆÙ)ì8I„&ËLÙÆZ;ž(MÛv=Gº>e‡±$p¦@1aMô¤ëäŒûRˁï°ç.¡ú軋:edA…znçãsãÇYé[Þt•„gSîD‹\ƒ‚ë$>y+2`.Ñ›0³RSÑð	·S×'f8Ï|ÏlÂ$™ˆžÓÒ“2öøF+,ÑŽ¨ÎŠú-]¡F™¶n+Bg”|6ˆŠØ]pgèšL&gI֏¶/Õ³êH¢è¿ézÁÙöè¥yƒ»Ð‚ã>@]­}ÍO§$æ[9®ÇDA€Ýʍäõ¨'̪絰F͸’ÏPþª÷¹Ôò*äøÁê[…‡÷|IKŠÆ,•PF²7ûµ;”Ul"ÅÌÕÂCã;à¥7V£R…ÿ‡Àÿø?Q+µC{"vhÀ endobj
-14 0 obj
-<<
-/Type/FontDescriptor
-/CapHeight 850
-/Ascent 850
-/Descent -200
-/FontBBox[-53 -251 1139 750]
-/FontName/SFIZFA+CMBX12
+24 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 67 0 R
+/FirstChar 12
+/LastChar 121
+/Widths 68 0 R
+/BaseFont /CPLBKL+CMR8
+/FontDescriptor 22 0 R
+>> endobj
+22 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /CPLBKL+CMR8
 /ItalicAngle 0
-/StemV 109
-/FontFile 13 0 R
+/StemV 76
+/XHeight 431
+/FontBBox [-36 -250 1070 750]
 /Flags 4
->>
+/CharSet (/fi/comma/period/E/P/T/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/y)
+/FontFile 23 0 R
+>> endobj
+68 0 obj
+[590 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 295 0 295 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 723 0 0 0 0 0 0 0 0 0 0 723 0 0 0 767 0 0 0 0 0 0 0 0 0 0 0 0 531 590 472 590 472 325 531 590 295 0 561 295 885 590 531 590 0 414 419 413 590 561 767 0 561 ]
 endobj
-13 0 obj
-<<
-/Filter[/FlateDecode]
-/Length1 1300
-/Length2 6348
-/Length3 533
-/Length 7162
+67 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 12/fi 13/.notdef 44/comma 45/.notdef 46/period 47/.notdef 69/E 70/.notdef 80/P 81/.notdef 84/T 85/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w 120/.notdef 121/y 122/.notdef]
+>> endobj
+20 0 obj <<
+/Length1 786
+/Length2 1538
+/Length3 532
+/Length 2114      
+/Filter /FlateDecode
 >>
 stream
-xÚí–eX”m×ïI¥»%†’r:DºD	ArfÈa†¡¤A:¤CAIénnABº‘Þ¹Ÿû}nÝÏ»¿ìcÛÇžëËüÖ¹®õÿŸk×u\ÜìzŠP¤5L‰@……e-ñŸ©F°¿Í=DÂÿ‡Œ:Ú
-nQDØÂa-…²ò"Âœ‰¼…ö(Ì-öG†-HX³mèˆÙ5ìÄ°ý1šv ƐýˆQuü1²ð?£ëô…1ºˆ?£‹ü1­vþ1º¨?ð¯¶þ˜Iýn Ɔûˆ±áñ1ïÐßóúŸ§ûáC¤§73d æ0‹JcF äû¿& ì]Ü`êʘó#$$‰ß_Qˆ
-C ÿõ:Á<9ÿf{Ìsƒy D™´öØ÷XN,[&8Œê¾Lê5ŸæÐ
-õÃñ§ÂBõŽ§I/¶õ¢RÎyÙ^–½Ð–k95o÷òbú0GÇoÓß`º|"S½¡®2Á5ïÁ¢j-L+rĽÍñÉç@sÐÎM‡ìŒÕ—Ý/šf Lšz§+V"Vë±d `́,‹ÓO·ƒJPj¯O"Ô¾N¢!×G€~c•jŽëq”#'Í¥ÏØTkæe£}ÛwÓŒËõ)S*¨~
-Ž‡úݏmÄ%ž¢¾™eùÖ¤×yΔR•½î¼æó(++ƒs’©%˜k€‹?*'J½ô+Ñ,­6íMæº^©ãÕ籊¨‹2ÆYx:ÈØ#ý† …›Z£+¹g dÅЕÑ%|øgŒ©E’¹¸´sEÂÐc"»ÃO¸fÍ--%W¬òzñjÒßV'F«‚6Þ$I‰î/«ó	ëŠ,7¦»Åò7¾¥pgØ;=”ÆßäûžsׯðÖ”KO¢^u¿`±¯$Ò<b^ö¡–éÔĤÚWëý¡-oþ^ËqŠsðÞÝÈr~3˜³ü`¬z¡ÍìeU‰Aãðtìù˜Ï僜ëÙBÙeUñÜ’Ü5[o`c~Q¶˜Üz`¦!	Ì$,uºêÕ*_h³éi±vÚ(¢Z§*Ðð~r~©š¤¡ÀzçeL¨l¹a"÷­{:eœ/U|òîAé½üP™:2‚£[.Pµ%&²ëðšcèRóüžŒÌ& X3¨+
-ÿG\X‰‘íç®ÃÈýÂj™þz—®ãZøüÇÍ÷1J•ðr(ØÁ„Rm.¤žXÔ,]î|pge›÷™g¯Hg¤Ïò™ÄÞ-¬¥¬YHM÷g™2ÞœoùC÷€©ï„|âǘ5j°‰2yW${ù¤ôIfå/¿P$F_Oz,쌙àw`Š»ÓYf÷IôŸ¶ÆôziãQŸ-ôV\{dZÆß»ßu]-¤0'E”ÈY{®C„Þ¸ÝlÛTÚ¡Œâ–¨tø¶ˆ³<j\𔍭y¼W4ĝ²šÈñU˜ÙIÀÜ1ÙUá~=o÷ò—wš:9Å}Àj­‡£±ÝÕ1[Ú«1¾*_y&g-sãéý2™¡0¨®Ö7”Dñ"›’·1¹þÖ”ÙlЃóùÃýtëïl >ý™Ø\nߌ
-KEŽ™:3p£ÌDÌåNŸ( ÜB°u®¹JÆG섆5v;^û¨ñBúA/=€&å°x«ãJæ¸!¼Rw—Ôwú&Aú7¥[ªMôØx}‡*9­„BÈ´—Ä°bn¯ùµh»ª+ÆH:]ÅÇ€ª}A¦RÐó|«ly®*rØtsT«!ÇïNó“Ü0PP™yDK¼š¢/¦>£©©ý ‘Ç}ˆÝ_»ˆ3Pp;´Y‡=¿ßp¾ÃààÒ´oMjÉ0®"=ªÃéúùW䐟â±p•'Ù¦ø“(-ûœ
-G„ùШËKf¤ fÆhXE.%¸Ã;hŠGÒööª8Ú¯yI{óúÖ£ÑÔo¬9	äMôø²·S?˜c7g¶å:rŸyëO¥0žŒ¡7
-‡ÚdBhOxOÎûYŠ:Š)Eï2à*?J»UÎzÏtñâ\Lí9°DjoþµH[TÛ§©ÁxÙ§_óê™d‹Ò`½åœýw¢G%†ÌJW,3R©’Ø»eP:@¯åµîÇÆͯž-e³÷V¦ÝÃT£/£¯´YwÞ/Å(¨mJk[¾ªN`âéÅ”R5‹>²Vp'…ƒtRëbé­‡S’=¹s˜_\
-]•70Ô•>å¤dw‹÷JßÇÅÏ­¢iXK¶L—-±k6¼°£7µï”èIT×ÙmŸŸ]ö-,EÏçíí¼xóÈ}Ñí@÷rËâ58ÌuTÏ㝉kC['{›æ“;›ê[ŸÚ¨¹’J•6v9LàßGÄ=ëGœ¥Ÿ!^FÒJÕ¯yyQ„G1|&ßæ[51ŠOØrOcSÍ•‘·ˆ]i¢Ž½6‚DëÈ iÞ{¥WEhîÒ/%”½Üÿ&cãïF,Ý)¹d ÆF?úºú†M•I{~“‚B¡pñL}žÿðÂòÂ}"€—4[a"ò/1Ó8Û]Ùma&ýþ½õgE*´"­H“Òø’ÍH-MYám
-Öá(ð-|tžÎòÑ4»ö:?fóšëWò5ö£`w²Í‡":u:µ^M cŸ[“itÇJ×ÆÇ©èZª¿æo¡\'ÅfU`h“‡”rŸc
-ÝÇ:àH¦d;ßg•@X®û½ùFÈÃ#þ÷®æG<\ñý¤üìÜ>¤”4.‰aòd|ú~\×養ç]E®½5ÞŸ÷.ôôzO¤Fõ4¯hÑT´¬}'š'¡µ[¥ßRïÔ畱šéšjCåü²:ʐ+ÖTñih×CÃÌyßñ&Z„pÍ}9‰¬´o«¿GuP<s9àäa_Îd’UÖ1Ó
-Ïemk'-ãó1E‘°HÖD4	–׶·¸O`›“£z¬>;S[¿IvŠÿöÔ€cÈŠ
-¹C°ŽG *·´i’‹3|MLÎr[Z4/øtœ'o¨ääR‰ðŒú²,iWÒôà
- Ðbލínd•Ï§,ZÖíôj9±Øýeý¾?Ø 5qrh”HÈ™-¼«-Ac[ñêñצ$‡ûÛ!nŽÝ!ZšZþÇ°’W½úkª·y·'s̞ܳ8öuºs5®ÓoîŠÝ6¸Í}¨å÷Fõ♍eçnbÄ‘Å‹Gã$;ðÝ9ð¤Lë³ ŸEÿqžÉ¦ðž(ö…JÓþË(0{Î
-þbäÓàÑC¶§…Sˆð׊0<iòNþçŠC-7™‡Ë°(ÅôDdËÛèZÈA,9/S¥®Ç°ðëÂ#zŸF̧ªæ-iò«M×Å­!c<‚ÀÊ$‹ICTÚÃd±z¢—Tíu6u>¹€Pó•×VhÀRîJlͺ%<p@Ó—²¨,brñ*óíëh³<Nà”>á},ÚtáûÉóÄž3Gg®…t-î¶Éã(,à¥ï™û’úÁË_R€¾æóäk<_
--çÀ?;#hnGõº?ìNÞæ·È“,ò«=öylF…‹¬Z3ËH¼>âc+Éýª[¹æá…s›1d²+Qí“ÙKˆéY¥Ms‡¡T÷Ÿ«±<S'¶K—½5Ô”Ÿ^>kO`Ë]˜(ÝoY­®>ä¡5©Î][ùå@9›{_Š)SâGUBN?¿âŽ¶yŸõibȉ¼*&Hõ û/>ˆœÂ•õ2Ô¬“}—”ÅÏ8éjˆ‚µýr0-G¦Սêò=´cZ}Ü]$‚e%XÆ3P羃7¬!÷Ž«.0m”lNbœ×zÚE·ÜKÿSݪ̲è|Üg±kŸFYÅÝçô§’— t¢*§|í—‚ø’݆ó»iKyúßäW¢ŸkÐ[ú‡P¶P1ˆôÔ&®¢õ‰ë¹˜ÿI¦Çóår§uN<_ø£&EVÈ!¤Ã‚{¶Ÿ‡V¬}þþNBÙñVÔy_ýk坫ÅÊf‚T~Þ¹ÖÔ>Vh-H£]5{Ne芳)i¨ÊÞE
-–X:‹™T3ÃjOkÎÀ'N"ëq».zúÊÔÈéîã7¶í”¥£ãûhõuÞ¢Îk»ûpTD:ƒ˜ÈûÆ«9(fEŽtwÝ6R¼ôÅëxkÑÇ­F+ô¸!N½ýÓAoW	ҶȁëÒoÄòü\ñ½ÃZŠãžhI‡›V‘T“{`9Lù¥EnÝäÎó7'ŽÄ¨;®VÞ¦ ÛðÇ)Q¤V"bÄmåŒìÜ’rýåBWU¨ÍçK:G¥‡E=ú˜Hµ«óä¤þ²d5DôuRnõçbҍV¢÷r9„$¡aÖÃ,ás1-—Ur§hžõ¤¯T+)„G‹Öb–þØ°ZËžÐnœ˜hµzæÞïœ^/—ÄÊX€Ù"ПªßKÙò¿$éÝ»IiF[rª]î;=4Š»'ÿQœÿ±iåv7u"•ËÍöQ4ÿìàÚ«·Äœ*Ý“ï(¿¶“@4“_¼bþy¡_áã_͐ùÄ!_žÂGÌÅA©JµFMhéúàð¼Ýô°³Úpõ¢Tüg¯JL»pßÞo¬l¿N at pÎÄwõ¤YZ^8µb¢(%’üšÙ-giûŠ|‰†
-ß鳿È.ÑG˜¯Û‚l ç»OÎ%¿o)&@±,ò†
-:ïlówN3­´}
-™ùj‚~§{q§§‚R§ý|RQkÛ~´·#
-
-Ňó	z=\ØÑ4mõÄ1„s+¬€7©#§™»IŸ£=ÄäÖ»é3Šcušéz÷‚è•ê­Wá®ÐCo»­>Îpàcµ§Ã
-|×â(•€‘Œ*»XÆI­öæ €^
-†ôâ:œQGSä1G{õÚ³¶±Îˆ®Š'4õC¶¼6y	Ÿ>š€ÚNÞŽ­D¹ø}‹Ãï2Z¡Tâ7su…z¢]pɶâì#èþÀsÐþ­aӝ´þ¯×±ŒÚ†YÈ€Gf¦÷, ¼.ó±s­¨!B§dFâÔ©+ÿ1ð3q$‹ºÞÄÉÆ4Zº¡‚Bêi	MäÓVÞð@pt¾³ÔKQ|Šáól™}jn
-;*-°MC5ý»—­«„æÔ‰PÑÔ[¥I—[âY™ïö·z^—“„9i¼;%ÜŠ0¹dÄ50ìîù¬ýXQ¿íùbQ(Y’ŽªD-t²B9ýDY$
-endstream
+xÚíRk<TëNØiTD©\Ú«l"13×Ê1î¹ÌÓ¦R»1³0ff
+kf0Ò$—]Ø~Ĩ„:¤‹Ê%—íR¤Æe¶\cÒD(Õ¨D†ØC§³Ïi<çÓùw}yŸÿÿyŸ÷YÏû×Û‚÷1¶§0@g&Ä6F› m+'ôk+„Y2S€Ì¤! ³HaBt.@H/¦ì.Pæä¿aê[qgîEb,ÊË2úK—Ä Ò¹ÿè3¡6žL
+CßR}Á/Ö<A
+•Ãø¶ëÆ&Ñ©d{(ˆ¨/%*Ë™	RðT69$ÑYàR„(ßšÅ¶dIðtt÷$-½æRO¢Bl"7ôŸ¢‹Ü%Œþ˲©‘À”	
+…–eß×ÝÁo®r‚ÈL
+’Æ Á0‰‹Í…a€#h€
+QÀH+ã2:¶³SMÊÍCøî‡^úvÆ‘ÝçŠR“BÝŸ$ßÿãÝ2o´-þ·S–ÞèÌæêáÿˆVÄW£^ªžº	s†ä$Jž_,*9Ì/kU^Ðâ—Õ\”Úæ­e%–úæâÛ([>ÄªàŽ•Þ|’[¹©Û*â¿ÛWÌÒ“l¸;í¥d$áˆèrÚ*ÒsåmÄl'Ýd¡TD;×aVL50žèÛ|©_˜ôLÉZár_p×uÛß÷	µ'5ÖjÕlh¢9d+ÒCL±Ê)àC-ÁÜm¹U¸ÍÚ£o†E¢*=¿Ÿ¾ÛSâ:E,^è!ÆÞ¾Uy›kÀNwfLÇØ´oº'8ýáÚY—òö©Òg\1­/¾|kµ±jϬåyx÷yùª¼ú*$@wÎEý‡ñÿ	2$Ál&ƒÓ endobj
-17 0 obj
-<<
-/Type/FontDescriptor
-/CapHeight 850
-/Ascent 850
-/Descent -200
-/FontBBox[-251 -250 1009 969]
-/FontName/XCHVXE+CMR10
+21 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 69 0 R
+/FirstChar 49
+/LastChar 52
+/Widths 70 0 R
+/BaseFont /RMDKMR+CMR6
+/FontDescriptor 19 0 R
+>> endobj
+19 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /RMDKMR+CMR6
 /ItalicAngle 0
-/StemV 69
-/FontFile 16 0 R
+/StemV 83
+/XHeight 431
+/FontBBox [-20 -250 1193 750]
 /Flags 4
->>
+/CharSet (/one/two/three/four)
+/FontFile 20 0 R
+>> endobj
+70 0 obj
+[611 611 611 611 ]
 endobj
-16 0 obj
-<<
-/Filter[/FlateDecode]
-/Length1 1867
-/Length2 13928
-/Length3 533
-/Length 14981
+69 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 49/one/two/three/four 53/.notdef]
+>> endobj
+17 0 obj <<
+/Length1 786
+/Length2 1532
+/Length3 532
+/Length 2109      
+/Filter /FlateDecode
 >>
 stream
-xÚíµeTœÏ¶¸‰»N qww
-®ÁwwîNpÜÝÝ-ww‡à6üι÷$÷þçˬù6k€ÅêgW½{?µ«ÞjrbEezac[C¸­=33@Tî3€™‰Iœ\Ôt2·µ:x-þ³¿³ù_ÌùÏøŸ-dòW”ù¿¢ÿkò{v#[kkàŸÈ»™»ÈæOˆãýÙ÷*¶ÆB\-›8ébïTÛ5tbÞI˜½Þ†:xš|bºàv$·44R@ò2@GÜ„wÏYªV/1ã/ÌŒl3.Ž“æ6g^îU'Nâtâ8J–E”ögg»Zd´}PHüô¢‘yN·;;J¬Ù¬Ìé8j֍펎`Öù1•?#ŧق¡„mrk¯D²(Ëzíúq3·Ê­#9ä#„ªÅ·-­ÈËrñ§/	a`Žà*¨*²üR—.\Àñ¼FHÌ:›¥>ÆÒ£Ö¬	ZcJX)œ(Ç.“ó´Šâoñ¥b|pOáÈ§-f‡²=|Ý·ß"Pù|bºúG~Þå±ì?¨RyL’)gx‚=¨w*z¢!xN·,gíì@Šì’-ÑÛ1QÔ U®ÜúƒVü¬»ìUÉKbÑALÄ‚ÀïõÉ·)d‹LŽ£0–jéeº92"ídÐiQíÓ§áÅ锡×UnExªžƒ¢Ý4„`/ç/H_טEraºN7Û2ÕŒ…ÚND¨uŽÆge~né[f.<ö}æsÄvÝÜ+«ä,ÂŽBëÀ?3ÃÁ¼ž=‹"Cô:¬V˜¬œ…"¶¥X¡¢|BjÛÔ(DÌmZ_ÜìCÉÆl”0ôc$³ÒTsî…ÂSóÊwȉ(ß‚O|Yä†ëÙæ1ô˜®Nð­æ—ã¾)m2ù_­ç«OÃ^º*)ÓÌ£Ñ@ýàË-€}¶ø
-ËLÑN¹`îTGñ;ìÍ°€7ø*|ÞXe†vÓÂÀà:w5W«Q¨Ï¦
-æî~•™”³n†Ýáù¼Ý©±æ>BÔ¤a@IœƒÆK{¹ üC{ö]§t-Vfú?Òǘ(B>[ÆÒÂMdûòCKZs§Yú¯¿|I¢•ßÜ¡Œ<ÚÀœ•›,Xé]jˆû6P?½xgXQÐøì9Ž‡SàF)ÝØ"#ú…2Dê;UE'‘è+kg¡ET#‚
-¿È™–¿ðò/—ó7 at n¾è²,ˆ”´G+zµ®…Z§Ì¾y¯uv›?±1'l­‹
-Ϗç'®ô€ÌÁ‰›@æ¹àkÕlTáphuå ˜/7AZ#m+àCº›ª>A{\ß¹”D\<ƒ0ß8‘ÝЩ1ðûSöo¹‡Võn”
-ÜZƒé‚†9rˆ‡£³.ï¬t÷±	îª6	KÇŽÐ‘”$Ûd"pÓðw&à.ñø_©¾Â²äº‘SâÍ
-py4°Ý
-I‡õ1üŠêò)ÉAú +&t™áLû¢'7ïÍ0C9ÒEd§h©»®4	e¾"hÌPJ
-ç—\gš]˜yÎ陥Í1 |©Fˆ„2ŠxÆÛ–²Ê³ü-OksØUªÝf˜W‚Ž€‚ŠŠçË,ø}cúÓEd„ög«Þ~ʶ(¯Ñhù’XîJ0½¶Úßí*	,û>²KU%t¸,,þ*Ž{]N
-X”¨¾5‰/³æ#3ýcíäü	XEÁ¼ãÓûCèû¦ˆ%¶`bÒŸdŒáÚ³Ç2g‘u‰=ù*p„%›ÔÄš˜2ÌÊðFñäx®75úð£»îØDû‘â¾ øêÑç<·vß£§d»·»0±F•YGåÖ"þ6	OHSÇe<åýJ•6ªóRî12Ê7éáÎ÷½%j=•ŽŸÆåøôå&èêZl
-]^  dÞW“ì¬ͯöG²ÚYœªs;wƒ{u•ðmë˜Ê°Y‰’DVç®Â¾®À…ðÐ[ø´£Ç§ù4Q™u¹Á,h†ƒ›qîö«ÇŸ9:·×DöVÒž±¸
-¡™b ì¦ò¡‡)¢ݵÎPÕ>r¹vsïø˜’aLŒ)Íuz;òÍ
-^[1õ¡qtº‰‘èÅâ8<›Y³çWö*òKQD½uݵ%É“!tBA4X½îJ>î« p9™¬ìg¡«ì ñy‹^–ºóEâ¼GÖ9º†¯
-xnØqÏ1ËÅYÍpâw^ìß(•:X NPkYy³Ñwü¬‰Š”Öð]æ&?eëãy…kÏü\ÞÛÛï“èœ+VnÒ‹sgìÞÐ#¢öÝèxö­-ë‘ZvŽïrg³Et(>åèì””®^n":ºÙn(rÞœ›Åføv¶OÞ4µ÷~|¡Îu¹+àj¦8»a’˃}Bèž$ƒk®Qݾ€~èdÉâ6i†H@/šÙk͸Q
-Áàj ¦×øÈþËù[ŸKrGŸÕhÜ+E¤܇gµ/š²)È%Ðpîñ›>J¶–±(%†QG¡xbx«zì)“«|óÛm–Ž­›¥îCTñ‡äP¢iñ,´Ó„ÉØiÑ×þáMÕ®’õB!^CŸ|z·8òfGkà€˜¡IÕ°Lã—D÷lîùl(͆ŒkŽzŠ·ºnYÚΩ2½w`Â.ûݝøà.rÀiv´¾«ÚÁSaÔƒ>ãìÄd÷”›Ö	‚‹8? ¨[#›¬³ú¬ÃK
-1—HÕðF#\Ý°&ä•æ`Û†Òê#ì¿݄&ë].JÉL‚Ïߎž€,G8kÇ$9ÎҰ׆Xiã<"Bð›îi±ßFÀ!Z…DªÔËu¸nIaŠ];d¥h…·@66>R¼¥ŽQÐö'¥VÌs×þÆ2ejóDÏõ{Ÿ¬1<~¼¾=çÓÞg’-涾ÆffÏDzü–­sH‚9åÓF4C ;:ÚÄÕ¯ôe\©“.È—9mí…Ù‘°µK0Â`¦Op+H§ÝÊNÐl1UëYG¼ìڍ*X+“sé>v¨ÊTã§û³‚6Oû4´ÃòJû”VÓkÍ…!9˜ª‘~mV½õÝ­÷¨U
-w†dÕ°œX*ï“ÈÃ>÷Ôé‹ä”@ˆ\l–'Ð’`˜ªKüš0öÐBó)§¢|÷£sßúz&öø´°Ïá
-ŠTs8ð{ÛàK°ú÷èo*& ¾¤éÉûEŽm:-­®PwýIØŸ\Ja-ÈÇÔÍÞÅŽbVìHµe3bäŽ!Ù(\[,UQpBRÈ?ˆhÓmPZ¶&s.=·§Ë#¿ï@¶AÄŸx«F:‡×ìñ¥d©Üw›ë¼J¤c¹AwO^ŽƒK«PE殤ȱ„)>ÆñšZ総ú( Ýbû=p²>Ü’¹wAoÇÛoX(ÃzÈA+±‡ž1ç$Nt¾ÖüÒÁÏJ\$Ô™»ùöyIf#v²æSf%ï;Žü®ƒÒE2­³VöóTž3æîC¼9aÜŽÚ£çó—.õ_ý‚O`0L´‘Õ¥€u¸î€C«…²Uó'$Zõšý>ÙÓö²5Ïqn%Oҍ±Ø>íi /þ«¸þ:oÁ_ïíâ5É-Í{¼Å¨?˜ø¥m›º—7Œ)­<¢Ü ¥ÚÆÞa79›[Á÷ôŠ‚â:@ñò›	ymÚÀûvQø\òÈ9%_!6-$IÀœJ[‡erX¥õaÝ…	p£´àÐ!	[
-œÆï(/¾8³we—uÕâ–<fO͸	V¦þ©Ã&·³žìVñ-È«ÖÑtA¬½I?Af (kßF|ôiHd²ƒN͏F¸G§¸"¸‚å{b/Ïñá¶Î·šÛ^–o´¹.8`2Ƈý	ƒgºeÚR7S(oJ!KË·*ÇmsN(NýòUµ“YH.ܬZy_M-FÝ7?›Ù×&®’;{ü‡lu
-ÎûQœáL^ëiÓ‚€ŸN>›ÐX5ÖŠrNl.a£ÂáÆ}Ò#Û4ÖõÂq6·tÝ{ÆU@Ñ‚ˆ3;ÊD*“¢;Ž©,4úŽ03Ñ‹‘å(dŽï¤'ì®Ñ…K´7¦né÷{ô3…šnJ(­´ú<OfB›¨.’‘ƒ·´5X%²š\öLçƒïò¥ŠûÕÿ´âŽÉRê¨)ÙSéî–67¯`t5Ô}´.ò-A:HÆöCmÔ*Ù*üfA¿‹¬$xš†{IJêñl5ê Ùéÿ¸JΫLF§?/.Eñ{SÙd³Õ¸£è©N{.ñŠÂ7œ9?¹ã†ƒ@ŽÖ:å“‘ÕÅìTÆ=žm´ÐÓvææñkñì–3…Ì>›C“•³êWVµŽô*Zb *C‚VnIffÖ-aôDK·ÈþíÀÝ4aï룶ü¬éqóNlàÙÆ“/žj…Ö è!ÌjÏJTÌÞñ+gQ\ëï †ßÇ¿Ü¿C³¢Né •+ÿ(hzQÚã5nGÏ7G“â¬àÑM3)åÊ÷w‰7ƒŽ¼¢’É?)§Á\ªcDº­òòö£Ý©ÓŽ|å×KîÐ F&+fÁ¬ˆÊ||s‚ILúJôúâ6CKëç8
-cât²F²²Å,È©mo'G]$ëµó¸Qžc¥°Œ¢6…‹ó(wšü{摉L¥¼òSNK’kKxå­Ö¥öÜœ5ºSŽÙ,ÅW\â4É!\‰—£ú™à“'b¯Æ.	\•7›`Ì(þVã%÷—®žOzo?…š÷x
-œóɝKrÈN¬¹¾Ão?ˆlŒzU+ÔIœZ}ÐHdïÇÒVºKjy
-÷o}ûz:RLÐ<ùé fv&7a¼û¢nŒòG3¤{0ٔ½í£×Áïá²YÎOaÛæ§]hþì
-v¥îÇø>3UðyÇq-£™k-¾&ŠÉ;¢ú±ØQ€\G3yfÝ´µsE¸oªÓ`)Æ0“TU¯zü DÝóÛ¾º+.GFgÓ‚g	IC[h~ FÁÔ²T‹Y½{”Ž6@ôt ÜN˜?§@µX3ܘöƒ(ˆËÁ“¥dÝï[”`5Ù0¯'ŸèÎ…ã+PÓêaà¼5ŸKS4´X):Ö†á·yÍXn¶Kuäξˆ4çæ«åM1B_ÁYµß	Ahµ¿Š}ÁэÐô!92 7þÄ¡ÈcHY“~çèêÊž³±ñÛXiÈÅÚê3öÙK…¿gÿϪšÂj¹Oì)ó—)2H¨¯ µ e•B}‰@›õÞ
-2™jùÍAÕm›@e“é¬-š²(¤µ8>Û¯«‡}®•ù<€w6Ìq¤8:µwH~Ý-f#Ÿð‹/QâpV5Àýr¶Z¹½UÕõ“UZ7„A74·
-À•é?&g5bÅhñPÈËU1«*à(JobL4*8Ãà´Ðöé_µËZ–Ö	¥y[üRv>·±f›†Ì Oøº£žR¶#Ös$­ñ‰=€|É­NÀ„zBg>6Uzº~OIã"îæ/õímœ„kýž‚ÀP„Ƕ¼—ªÒÜ“ùTwQŸ6úêD«¹4ãðÂ*ù­¤·måÀ-I‘]•>#æGç)Ö[”ºžj!¸Ýßo¹ˆ‘§
-㤭Ï~t…í0è‚Xüöúy`Ÿo×*NŸ]¥À»~iT½dÁžrh†¸¹nÓ——‹öæ'p²-ü-U
-ãw¡öæ—!e²ëïÚ"—ÂÏwZ³"z@@Ä	–DÔù•Wk(¸ fé íS‘+”k^¡%QS„MÇ…8WÝŽ/"ÃVßß~ɦ¸¿ZË1FR¨ÌŸÚzLâ©Vžº2ï“üF¦´Ç~2í5n¢…˜jsÜê¹PΆPsîÂN­$)hÈ¿ö“:GiKßå%`m H°‚PjjÀÝyg2Gr]+æ|ÀBqTåÀysŸíŒB–ìû.­ò15™ÍÖkÌÛÇVFéM=|û)Äå­IûßÑ5ëmã&á†$,䎘?ÓÏË”‰t'…d†¹Ç7v’âf¡{ Í•m¼ttW²µQ(¨xÑ&à{ˆô¹,B}]3°D“Ë
-yOJ’Îï¯ðÿÌ›-–,%k¬äÏà›w<{²¦é.	@¥Š1 at MÉbó×òäo›¼€.PLˆÿºÌ:1VПiÔ§Ÿùù1VYӁ±bòºRNÚ¡3}pTÚ<*¦S)Ò"¡²´FéXWŠ|æ¥Fn'Åeî
-Œ©Õ£ÒtB¨FîV7ÝúŒYmƒÍ4_ÔØÉfÿ¡E#ZJr¡•X[p·$pìˆ*#`Ãç­ƒL”÷¡JdB—iS€~ÛÌ®%{}‡:	ì4:öÎ.'ßÀ;Ôöú…¹®yD¬=ätä6‹ÕW˜Ô@Š ³:åZR¥ ÄòÓèó®Ž!²Høi±›ˆ8í§s>÷%ÈÍÈlZ&:©Sf>$'ñÍÚ5ÜC![H*âÀžËº`„ËÇrRÓyq´Ø-?d#º'¨¯úqê\gLû2;dC¹ÒÔ–ßÆ2¬?›-DHý®[ÚõN  Ø_b?ð¨øv'ê¬,´}ã­¾8ؐða»Ìâc‰Êá¸ÄQwHMÁ³±0õ
-’)Qlí£ÎÂl€Ÿ$–š²“,>¤õ¯ÜµÄÃíVq.®²Ù(Žåaʸ2¾„»ïÏ¿ëW,åùn‰•M„Õù#ìk×õ(c²ÁêѦIí
-ˆ(ƒ€©W¨ŸF¿ëö¡Ê^”ƒî+IZv¬iýÔ¢é~"Á¶ºÃ"8¨ÍШ”¤ZäN’{G	á-FÆÁ“4<h!u½±k­£˜tû7f˜—?PÝÁ5Án„Ý~²5ânF&,äÁÏŸï…ºó’Ø=Ëâ¡Jsû1/º à’®sÌÌ,Ë&|>øH1äczæ
-s"KlÅ´ÇBfüFð´°‚Ô¿Z«´ÌßT%æÊ‘”Noç>e<©×?Í“AA¨—ô¥‹¾DXÿB¢‘¤xÚê«-î?`ÔK]“±u![¶}Ô»Äã¦W;¢Úvþþ•ø¤X¿ÒHÃXê(Ix§'mš÷†4¦
-ƒóŠPÑpN8,TúA76óÅvhŒñ¯‰¹ªÐtÚh‡ø¾ŠzÁdšÉüoœ×éM—aîfOd‡{u[ˆê^ðš[¹áøºRBIIº­wž	SäÈ=ÏKu‹ƒÁÂpqPq%ð‹¬µ‘-J}êFNii|U1™ËÑz#ò~p+§é¼¤­véÌ's+l¢ç§2ÿ“ÿ‡[©-nßÒ_Éy·U)umÏøRá1OÐta‡?´c\°ë3!G…jäb(¤U“rNœ`•·V»À»ßKãã5Øo$k%णòÅ»JòkvÜ'Šg¤LQe!ÃëöûžOv°³ÓÛ5Qwrƾ¼Õ‡×n5¢ØÀý*.ªJO۹ߒӇ$¦3ÿ"TÓ°z ɨ„W%.º/ L‹ÂÌ7¸×oˆØ6@š­èFq‹ë%b½ìº$	!ÙÐòEŽøwPuÖË¿XÈ-Xpª2ãAÇ…¨”8ãksKr5Ü½…~lpðƒ&÷eU.Ædî-Þ§ï€ðãìkL7R=!‚0¥¥ó/F%mtL WZþ=žž˜@2LLQÉÏF–縩ƒÄþ¦W]:E
-Ìj(ØàTxò‹‰Hm돟ðæn<Õ»ºeËohc]?ˆuäžå-þ\¶é…Ô¹§–ÛÈYM,°ìÂeYi€ÏKÁ{Cú!.!p">ÒßïБßK°ŸpÉY+^©&¦9š¥ÃÑÇúö¤–™÷C3­"¤ž«BÊ\­„ÿNß©foŸ…”íq"Ûÿû¹Ho7C”ÉQD
-ŽÄÔ5òUEHè̇[ø§ìL«†ë˜¹DÏR=¢½KB¥¢(šŸ|«*™Ú¯¾W–<îGQmð¼eŒµ+é2:
-µö'^K¸0ÕOofzÎJ#ÊžÜ2¯"Ç‘TðW9&j‹¤_(L¤œ§ƒRRÆBäª&¿®4X3ò$•W/ÀJvþR¸;6Ð×3“‘È(ÆöA«»J@¢®Iù(d ÇªÐŸü©· –¬j–X®í7 at fz’²9ý2ט×òÙlò§–‘í³êÇúÚ;¶x²æ\Ü3<‘‚BFÍÐï5C×x43ÇÅH.š®A-Ê7¦Ã1žbY§$·ß° ¢c}4N–²z5íÇ"ûüHBå~<±l?7â,åkP$ß·YÉÓí ©µ˜'âñeaÍÕÚÕ‹Ö„ÎMÒŽÄÌùÁ”ód0·ÒëAåàUßÀÝÒ%Úré>pÈŒËîöƒÞ®<—‘°Õ¬ˆpìÖ
-ï¦l
-·÷Ž&	Y؁yËËÎSŠ;D~‰À x“£†×è—‚r䣵·%™Áso‹z´£·Àåõí=dJë ®}ž»iª¿H¨$Ë3tNæ›*[¼†à[œD…µ÷n‘…©Ö_é7VÁPzÕ0t˜¾~ü b„Ô´#Ûþí6ı@1)aéK½=Ûáâb§àTÅòÕé1ì‘óÇÌŠF7Ǎce2½è¯r-•’’åÕ
-”–á9ór5j“Læ>ôÕ¿Ý=FÔ¿â)¹Å	8ÉWð}àƒcÿX*d¢˜ÖéĬeÚõªæ£{’J—Ë-ð½<¬›·¬H¡ëšìšû¶v¦ù]Š[[0§-ú¯P/ù5v!£»ù±©ÚˆVH ó]=‚ø®k„.9¼(—?”(Cî®é`û+}Ähöj5{µ´&„‚ùQIÜé5ÐU±‘(ý«™o¶tø¬¾¡1œOŸ³¯Úé:ŽUšÍJJ…uµºY©óBÄ7î—S(u–A¡û,ÿ×@j‘Tš­¼õ-=ņëq¥±eφÓÓ'=S<·;¸'/©»0¾ú× Ñs«ªñü½$;BëK¨FÞÊ`Qw8µ›lmFÂä]¿—SÏE/eÀlö¥ÐÈýÄx]ßÝñfÿjü·˜SåÇAáüÞ š¡çÌoç+”FÁSqÿS
-ØøÔc~í_Õý]%v–iªÃ´´L'*ª{Ÿ‘]rvB²R.äb(b¤ÑO×E+òRL5½jËGÇ'BýT–Ï4ÚRï¥w–0‹%p±ŒÉàfšˆ a¬ª=±všE×e°íŠ^ÚÕÍ2?§Þò¥Ý>Â÷l®¯Q††‰»!ß›|=Tùv› ­KAQrÌpüóÔø-¤oŸ âÍTM?}â¤ÞÄaت¥L†öÈ4ÔÅwâ¨sãT[®µìhYþä™dgÞCàØ9¸­ºo7 äNÞ[Á)8—@»@Hû¡
-Ë/;ÔG„þÄ
-Ñ4þÚÚ7A_O¿ý°ÄÓ(vx ä#ä¿ÊÃ5ÍŽÿàqÁ¢OR ³8oëŸL€^hÈ€‰Cw¥®´(Ñœä<¡ÕÙ
-»uFÉå‚«¨Î/.Ú	YŸÆp˜˜ÕÙõ —ZK¿ÂÉ­V@CöDÀܞÙS—Lô®7Yáë_ÙAlƒ®¶Ý`!Ú’äãv­´Û[¹²oh!‡²ÄÊc2·’Ñ#©iŠl‚~)Øq-J©ØÒy•úÖù˜üZ%礖æÿãp
-·?¤
-†Ð»[^FÎîã(w^´<äõ-endstream
+xÚíR{<”駓¥¡¡hsr{]&†˜KÆDŠQF“uMÑ6.cæF3óŽ1Ã÷KµY¹DjS"¹¤Ì(agÊ¢­KIjZ‹R4¡ÓÙsÚ?Ïùë|Îóþó|¿ïó}¾ï÷ù!Œ½÷XhP(H„Ø<kŒ
+ÆØáá‹06h±ƒRxˆ½“Â+ØQ Oh˜LÀwéDàFÜhfÃ`+'ÿ
+S_ŠùL¦'…µ$¯ÈèO]
+‹Áþ£±8|È< ÈeIõ?Yó+¢âû¼üâ*W6¢1ØŠqÀÙ.—"„)æBp@`°i +¿(6ÄS‘Ätˆ[zL[{+|5ÓÉû˜|%³ÂÆLjØø¨ÒçÀ¾„Ê3ëž_iišš+yÒÛÜ&ì7¹:Ù¯ÏBædl|Àž®0M–ûõž„ãË•W5ofõif£¹ÚoOsV›¿ET:ôºìñÖ¹ª©kÎjæÒT¾e›Ê/%¬1ÑE˜¾¼¸8l[iŒ@6;­Ï§OÔc>ŽYl£­8ïý²Á1á#a‹Cn¡Äqת(™ðбDztªo<`¸SÒ!–é]ìÃ6Íðw±†Ž»wæœ8fkE6z¸È$¢ÞÎ!ºO?Y­ÒZG>+<©Ï~ŽóÒp^qÑ(‰ýzÞÛãö5»âLiýWA²èuæÏ2ë.t`Wן\ø!­ÉÏî!Òö”#¹}ÛüóžÅåCJ;sš‰ï6žñÐ[o¯*~×mÅUGºÖ/òt
+ÆC¢úÇ4'š/,>v^å=WÙRÔ19Pk®¯.^›l^øènxÝt`cëå8qpà·>¿m¬#£Z+Êâ‚t¾ÿ^-‹¼‰þìÿÿT&Háò …{öwÜí\Ðendstream
 endobj
-20 0 obj
-<<
-/Type/FontDescriptor
-/CapHeight 850
-/Ascent 850
-/Descent -200
-/FontBBox[-27 -250 1122 750]
-/FontName/GCOOBE+CMR7
+18 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 71 0 R
+/FirstChar 49
+/LastChar 52
+/Widths 72 0 R
+/BaseFont /WRFXWO+CMR7
+/FontDescriptor 16 0 R
+>> endobj
+16 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /WRFXWO+CMR7
 /ItalicAngle 0
 /StemV 79
-/FontFile 19 0 R
+/XHeight 431
+/FontBBox [-27 -250 1122 750]
 /Flags 4
->>
+/CharSet (/one/two/three/four)
+/FontFile 17 0 R
+>> endobj
+72 0 obj
+[569 569 569 569 ]
 endobj
-19 0 obj
-<<
-/Filter[/FlateDecode]
-/Length1 845
-/Length2 2042
-/Length3 533
-/Length 2661
+71 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 49/one/two/three/four 53/.notdef]
+>> endobj
+14 0 obj <<
+/Length1 1842
+/Length2 13515
+/Length3 532
+/Length 14535     
+/Filter /FlateDecode
 >>
 stream
-xÚí’y<ÔëÇ•DƒJv•~YJd6Ƙ!ːB4¶™&³hf,CÆÉš
-¡$œÒ)-¶dÉ5¶ÂQJŠÊYêDö¥tFÝsϹûÏ}Ýÿîëþž~Ÿï÷ó|Ÿ÷ëó<Ú[ñ.ú–d†hà³õP°rpF(¢­mʼnl
-ƒnMdƒX-Èæ@À’Jœ—·°-[F²¥û2-íÊ	üçÔeó7øS‹ÂaRBO8GˆŒ¢õÇŸ×gí¦“d
-]ô$PF-ÀØ!Œ?5B¤ý™à_H-ýíK]†‚$HV¶"e…÷ÎÍzÓG¦ð5V·¿ÀCjsË@Íä(=y4.M•€v
-ÀOuË.¼ÇŸ¹0§³Åü䮃ÉÙ3„G­ WI׷힧`[˜8¤ÿT¾Üc%ìþGðL•·g©^*œ ±®o‚œÃ¬ûÔ´Uõî"ÿ!·®‡\à¡W×Ò]:pj°FKâï±OÕûÙ{¦x5ý±ÙC^…SŒ” EÄ.¹MZè»Ev–íõ?dÁ¼Dטª[+ÕŒ?\—ÌÁ§M¸kÿSb×ú÷i4ì#³ƒÑ峃4#ì¡œm¹ÄLTÄÖÆ¡ðÑ
-ê%ökVF¨¦)&½IÙa1²éÙ'ŽF©{l‚u‹%}'s~h•KE"¡wƒÉvì…Œ”üwZSWON&på‹wíÓŸ	i([²Øúæc¯žž–6íŒ(×ÌZœ-9§¡)8ù$ïy¹ÌñM˥ª(íbÐhÿZõ*œ¶æŠ;(5ÜFÖ•«Ï´I!Ø¥¢$³KT5xõÂ#eñ×\V~ÑøpÆ;Ÿ4hOˆq°Wn…}E7gѺt;vhðö­AÎ:Ìpª<åtè«BýöÑ[<™áÛÆ׊œ¥!ZžÒý™!/ZŒ†\d;*eomËXÐ	\pèÆ›é+—òa%K5k&JnË誤Š_ªS½~vMüÅ›îÂÎtD-EûŠëS⌊¤ÝË-Üõ¢#Oêaß½¦&×¹‹9ª­§L*cžM™r™ÑP|qd!ž£ÝqÊt5ØcaGoÔÙñÔD¬bì(¡‹@½í¬²©§æôB2ãRüRçN¹˜kf“ýeÊhµTðð™FVû«ÏÖ#Ùƒ¹Î‚·,Lõ‚l|…Œ]‘¸ÉÄŠ
-?ÓŠïÔ¸ö÷‡ÖÈ¿?F¾}µöIH­ÒŠ±WªÂ‚襁Þ!Aë‹Y:-y©–Jóƒ	¯ïšŽÔ'ÿrÖDÀ#ãµG¾Ô*”£‹§ô Ù¡Å›pïv:Å#ËÊ¥Nd;Œªü”1åÎ
-iò¨Zë±Ùùò¾±¶[fïo¡‹Wm•8y¬–q¬ ö¬¾¸`Ää¿	¤f»éEÐ,êÐíÑSOœòš“¸âq¤´Ìp|tFëªDðvš–J6hã
-?÷‚7mt¸ÜÆzŒiìZ÷f*ŸÛ£yëg6i>ÅÈîeWÄÒåã
-ö•iÂül½&°ííè¾¹!6'[߇k_g-ußÁÍ-Æ‚ ?¾âfߎ$™}õT··_c‹zµ-}óüp[ýñÖ€&êÅk%¦•åÁãŠñΛôTˆ?ò%eE›g°pÃ×çÇ#ïNýò䫍ÜA”¥Âó;éEè$¹æä;&åžµ›9¶ÒÅv€_NÓÁ¸Ú¦=W0jV̨n&ܰݾß3£!	Y…
-7Jè@ĬBZÒe´ÇúFË|',ä›o«*áüzß8ï]1wè£Â³ÓÛ.ÄœîæÿnSîc¥mà|>7«OA¶©r_d±Y¼xrÙã}Ýü)Ÿ÷m8']kéêáùWµ¹™iÕ7&Õ¬ÃúíÔnÇÍÙ%ô¥'L;«©ß#ŽrU0QKšª9í+–©W4E’j0Hó1ԝ³uT×êT)ÏœâE*Á7p­GÅ?¤kÉɨWÌÉúÏT‰¥%Ö	[zÉ
-³Ù¯¸)˜l­#¡«iìã$E\9Þ-t£¹I}qîÉ
-é%7=#0Æ^}£é)Õk…PGÛÝ؉©stV‹³‰Ò¼Âƒâº’hï,‡­È¯Ñ-¾¸”Ÿ'ÓöØ»Š·š÷:Û­W¨f^ܤ~­¿Wsbz×DÍ÷VÓ¬ïtÞRpÿìdƧ¬>åóZ™a?­5”ySo©å^éÙMûåfuëÒ^T±ç+Ìu5üš–¸J{ŸyÃôÌõ¸ðîÞ/õhž¹:øaæðq‰¤¹—ÊpEÞŠs{äR¯?]õåcž~ât·ÕÍŽá«™û'$wmY¿·bó¦„Vf—‰¼£ðy¢LT²@ÝG_§Øšƒ{ÉûÔŒž×y!”ýœÂOÁÏ¨QL¹ƒŠ+†Ð‚ÏÜ6_‰
-(„ ¶/8˜„ZÑ#ò&ÏÃÿËòÿÿHTÈd3hDf-endstream
+xÚíµeT]Ͷh‹kp‡îîîîîÎÂÝ=¸»{Ðà.Á=xpwî®—oïsvrÎýùÞ¯×Ðh«ª9F¯Q5k‘*(Ó
+šØÅìlié¹+åzö®tÜà…Û™Â6¨¡+i°0æƒ#Ç5¸<ó¸O’dÇ@z©	ôÂ	÷Û£]ÌŒëxF-”1‹Ï/Å
+¡‰‘§xÎdЋœ{BÃ@^=3ì#kREz¦ÉE½ýjñ.m;ËÉ¥]à¼â4±]?ÐÉgSRm6	3i¡ë÷r¨Ò‚lîúT§ŠhÑ)N|²Õû!j†­­d£‚ë]‰xxü•—
+30’=“ådù—L»8V)эÝQO§ÔÙ}^bµYqsió®-SaŠ!椑øo‰Eã¼qÀªôSx‘—è^Áð8–f1lÖÉgÏÌ­í¾Ó¬JwuÙ2ŽëåF嫦썝¸r}‘ê1ÃDzQãPq]âuH¢˜êÚ°Œû\Ö‡r|r±ñd]ÃiGuà!VU̦àKž¶çg¦M×b1gš…§Bj¢_ÐêÖשÜuzÒÄÒ·áÄ£±¹>~%ýT…».¶Ìi–j€¸ ü®„[-Am5ÎŽ'ËZ®ÉŒƒB…”
+ÄÑ€»ª^È­±â'{ˆ~Ć€¿Ç½Ù}Ž;I$«á’Û9ƒ/¦%L%}Q‰ZB¹Ž²PY6­ä!w¢ßìòmç†ìáÃÞãW0ÍYÌX¨æÃý¾èJ¹enðÔÖOæ·,–ÐpÑ ZëÇÇcÏáÜ ²kÐ{øô.‚™Ø¿-™©nT›©cn×ää÷ýü2w||‰H£==´µØàÁàj†Kúå)ºóžŠŸ‚FéóÄÛVoø]ßBê`Ä<…¼
+Ãœ¤ªÎÊ´@¿#ŒáI%ZÄ\CP.E±AŸ(ú’·–ÌàÝ~yÏÌ"ÂŒ¢úoºzp=š]vW>:D‘…/¸Ë»»j—`G…[€ãÞpˆç6üCÃ1ó¤O²¡e‰z2رt´6‡}\ù¹ÀN „§kW‹5ª—áÜçf@á*«mïÇZ²’Õ"þ÷:ÿ1üÂô”µ9#$U•Ü#©}”ÁF:œ.QüY@¬ôÆJIø Õ!Àˆ3©.¸£‘Kl<XžVäŠ. 5±Ä)ÿ8Ãœ©L7¥wÑGpí¨÷üwµ¡Là®Én"Ÿ‹Ž6ŠõçÕS°‹/–+Ä;7WlV(&ɐë…Ûãj2ï¬Óü¸Ï±..[E™7Z»Õé>çÇ—-–rmk,ã>éhý/êÈ“å ¦{©Òð¼TãL£¬§1{‹“InØ`dO&-iæùA=ºWÒõµ.—Ç÷¦®ÛÏûà£ÚLëg.ìW½BÏ=^xƒëšØ{X$´¢rqö›³–Q”<•äþ0í0®—
+Û:»õˆpÂ¥Ç7:uW·1²[¨Ü{£{ôÕQ%C`V
+ˆØZiÆrÖçÁ,:Ä÷†bå4®ß«‰]Æ‘æĐ?G|qï{A«8cJövNÓ{a|v›,F2©Þ”$è}/ƒlPJ’ê—äÕ9ƒ‚£Ub£QŠ»ky1ôÑ[RðF¡ïF;òšÉÓ½ja¤ß&|üy"9Íd“oé[(­ggìo¼âuâq‡´1ùÈÊÌ¥àf|›vêR‘´Šß#ìaâŲà‹ïEGñþÜQߟé3hÞLЈeÐô>£Xu(¿‰ù:Ù	NüJ·­=ánHOû‹ÙDÛûõÈeü0ÏÆ`¥ƒsY¨9ûj£}M‡	z5Ï÷š¯½'Jš‘!eÞnìlˆü~–	ö#¹¶€¿»ͺT-ÁR¾üØŠé<z¯¯
+u¹ w©ú¦;éâ„+ù™TC¦Òþ0xBv‡È;& 
+qÊœ½žË&½×¢&XT™xe2îeÄ…LD𹌯Þõ4|C€ÔæÒ"Õkeá(°$Œ¥zඋ@¶YO7
+W1;Ì*3ZÁß¼4 Ä`t	ŸC[¡~$“ú—“|lîõdŸY4:XªßvÀŽ¢F¬;tó—iyçš{ˆžê㝑¯¬ãa	5µGç-Ÿ¤$`ë%Jì³ðÞuùe̘šÎÒšÙn»ðr~Žé²ÅËÍÛðÛb
+m!õ.£ìè.}[¶4úD.#1mÓ¤°‘‘ý+º{ç¬i—šñN¹·Jï’àÈC:íðÛºyxсÃd¦É[Ò²vM¡$—‚^úZ5uÔ)üšâ¢.e67c‚eåˆNœ+7d~;ú§×…E+å©tÝô›"æüxúW^ç<ãásE…E)¶¨ÖeÊ.¢2å|ysK®líýO¤èëu´c,1)ÞMŸÜ|u½Ú-˜Á!r¦¯
+6à¬Ýãf)zTv$Ä
+á$?©É¦%¯­æt•#ضò#~­´!ÉÜö[ñüü*ÕWøK~ÆF¾ou)½9ÈĬ‚äj
+#“,CNʤ.jZN!7XÜ‚™ÎÎqN««­df_æï<JOÿÑÞˆ¬Ã{[£¥/ *‡©ouƒšßûfÃlZ²žK½G‹ôn#ov;¤Çó-;NãBlDXŽ¦‡Ç	Þ²~`S±žø”™<C*C/ŒÞzäÛîE$•Žó6~úžÇõI}ØH,rP8rˆBmsdL™¯‡ö½ÑÚÙtiý¦Ù•v•Ø0ñúp×{“é(œV+ðã,6,•zÑ”L»)Â'©Ë’¦|LžXØ0-ë˜2S<#ç!ÿn2re”þÕÒYÔHB at gé+}©à;ÜXWøRA‰b%F-„¯k(RÏÛÕ(E¡¿ž’ÕA¤ŠT¨Ð;k7ªKdÝ@žÆkÎÄÎz5õl-~ž2ŸcȆ‡ØÀ/”ŽzÑÖcÖ8Š8rì+Ê>!²‡»zz“Q~p,¸ýÊluX3ßyfߺ 
+Ké…<R¹ˆ)þuìÃdÍ˧ïßÃ~¦)¼·É½³ÝXŠÄ	鉙’Ú­ì¶ÎÌž+N|¼<ìÓV¯ØbÁn5‡,Ò¸j¶yÀ›0×Ý&ðÐ0Aiç›f.ˆ¶ Pþ»Ì¢@åÐô_½~´?·\Ó›RqÀã‘›w†ZÎ
+wÎé¹~H8yä¬_¡Ðe)ÔõkÑ©¢Ž4‰…§uÍ]·sïl¾œÃ×LžƒÅeMª¶=TüÃ>TÅT­UøRÁ)xª”~Cê¸þÝ“BDí§£™y(™"~‘Ï’§ÌÎ,ü lLÚáÉš#W¾à“¥ò,+´8çÈ«á.Æq%tqÒcŽÐ‰¨dŒãב+ãØü†’'6ð9¼uQ+{\tÿd£ŸDqÅ¡pbŸlfú'
+Šì5dœ¯"&äµ	½r&!ô²§VØ.ÕñĶ¾ò†ê,¨ëëØãûÐV˜§x؆i"‹i$æï³v´B`äU¹ÒtW©0“ð$˜KÔE"-)ÜG,5O²Ž2(lŠ¼×ÓâÖ=ŽûÇÕ𐔛¢;ÛàKåŽêE—`ž
+õú¥z=ŸÜ¡T1&¾ë­³§FŽ¶[v`Ö±Órè«×º<
+è~ò@u¯k×$.eäÓV˜a½Ø¢Ê¨ø‹èšÜÔÒr,å*\‹â΂0¢–GoWíøX¢- <Æ‹&º¿†ßÿ E9o¶×;ŽL&/xtÝVbúŠ$œtÈÞv@ì1c„ÅÓ–ÛáÒM¼VÜcnNC)?ºû15qáÍ´ÖJÄ+=|?ë¹¢{Ê…èT]©›1||mp,H§ƒ@-»ADDÉí«ðêÕ£¬ôõ³˜Z²ë|Í_E;þŠâP;Ö0üãA15{y\¶ZÐ^'õ`Â5…ÿÚÒy›Ð|ò•†0\\LM•l+„ê-ßÜñL’ô®ú]öµÿ:±[á·Øz“°Ð˜)löø1kñ[”²ðû6RB¸Þ˜"žÉØýj•+>,•Ì™#ü¶“Ö
+þqÌA±:ל`)H<æÇáÜèWXÍ8“ï\i‚ìûéÔk{çäjV­ö	!dj>]¼ä„MO
+Áãp!……W±’¼ç3íñ_uÜœÞÖ³í[QA%'	L€žèHñGÇ•º'šœíËúJÜ¡zÇU€‡W©ŽÖ¥s%×°)l±Ù‚òþ72ÒÒÍ
+8ûS½øõ	a@
+OÙ*ßáí÷»zá©Sp/Åå‡ØÓµ*ÞX`Ì‘kp¿	"uçÄ•wÚ9G.(~ß'føµöâä½à+59`@C+fÛ(1UË\ú`¯‘_*ÚŠx¢++cÒÏY`_Z	²c9Bö‰ì^ªT>	ØyþûüÞùâ!¬qÞb}´-üY™ÓÜ1Qa0à,*µÔC…#ë	ã<œ_dI–+žxžÃ<åD ³ôD«n7´ÁÇĨyBú–½t8ó6oµÈ:n0ižS €Z^å‚¥Øqu¬ö»ÀÞ;5øb»Sû™þ/AÐ	7	P4º±Â-U©É9‹€X::˜8ÄܘÆz*ð^JÏ 'ŒÈH0>‹7i)/
+›Êdü(élKD÷0r»@zöNiŒX¦M©öNfUƒöX°<Ôï^ܐòe¸Ï‰µ¥-SËÝ‘ÇùŽ^ÞâbéêðÀ\¦LbzsŒŸ}-MÄP'uð^>ý˜¤ÏŠOæA$r9ý¨-…%{Uð—à§s­%4>¨´ãüqVÏ{2†&¼]]Q?Àb“d²±ÁNËq›82Ý2æRÍRE/Ý…Xõž¿¤zYµ”º›Có}2•’Å·ñöþ¹C¨¢÷2í Õ=ô&ÿ÷jä3y¤Î’Kì7üž+Ðei`6TÍLNL’Ø3Û´D¼ù,’ <ñKŽÈ÷•µI*,!œ~§Ò¨4ÈMèèÆFº"Å’B;郯ÕF˜,d¿÷§),
+y)Vêo7ÅàÙåp|¡w•’2[Ê¢øLC at L'^ÈÆañÐÞ+ÜoåñÔƽ;K#Hy°³¾úËL8Ô¦L”Dœ~ÐÚòÈ,}U÷µŒS#°¬/¼Ë N³J[sa*Ö^ÍöMd’fX…‡òfƒº0£Öäòʃf¹¡SÒY…LdÃ_‡ê®ÌÛ¡Ž)ï%¾2³J)[I|9µu쎤L‘7¶&zþVAJX_÷l–žã¬ÛvF3@⻃™m—†ì3¢®â›™¶»Þv§Dtï—!Üæ Cy÷jƒ|¹Öá”CN’WBû_„C bò
+==—GüÛ˜“)T	›FDM”º@chyuU/¹WêÏíä™ç2©ÚÀ]m/
+sbìP2í\íï“kp
+Dãþý¶ËQN=ß2ÏÖvVžôœÁ½÷~S‰=½—¸Ñß:b8`:ZíÝÍŒã.Ž9®ñær=ãÖÛuHKbU5:#‰":%]tõ–VÕ2¤ùs)E¬•ÃÕèñ¥+;»ë±8íPݲ>"®ºñŒq¼É0Ÿœ
+èÐT2ý`Eó×o¸!á ŒN³Ù>v3pIµÍŽtÅY—¤p®á¯WZ}
+dV„À5Ö!²*Ñ
+Lð|)üÜüÜù¬.ÙzäøN<™%¦ÊÚ"æ¡m1ùK~CŸ¢*;hÌwñ7šDÎ(FŽ#Ãﻝ‡ßH ’Uê¬ð¿nØøﱤv²š­sC(ªŸ×Gçcg‘
++¹\©Æ‚o­Ýf‘¹¹m·/nÊ^ÊôËFFu‰˜O²å†àcUŽ›ÀF–I4ÛI˜º°
+Ϟ`#bǞ/F
+šÈ¡2vꀲŒ3ó%õ~À8ßa}“:éôŽxË X,í~*Åû´ïµ„A)p1Döó£øôÌ—éÄ«TSbHŠøÐD»P¾Utâ	ˆ…ï®J˜–Á‚àS£Š¯á¤Ñ	÷˜¶»;‚{#†Þ«HO+ø´ßAΈi‡ì±oØ.n‹)UY"Q2l¥tq¦ú~®ÄË®W¼@¾ˆ*SzŸÜnG†ÍÀÅ׫„ôA’—4<m³óÎóv¢dέj<0)êQ1§›~ºã6,Å_™¿ë8鳌ßÔÑy¾Jnõÿ2ŠÅã˜ZñHë!™10¾§üÎË¡8GQzσåëœøž_+ÏÐÚ(BJšlÄjÄæÀb·I×œÎ4Ú4º¥Ðý^ÃbÑpü¡Ugr??ÝP	8îGã2O ó{ì÷±@?9µ&FÑ=£¯‰*qh(¹j
+­÷øzµ‡Gãmwâhà¥Õ&{¦¥|Ú"rwMòÍÛI×+Ã$Ýdì³$0Î9t„Bî/Uaí¯¡C®ý®—‡¢?qVÄ45ÜÕÈÜôEÓG#û°Î²›â:ØÈ-»)¡>³¿Ø¯l*Yú¤³û’¤h6åÐ-.‚Ä̐©ê8ó‚JÓÓ[rÎæûêL"©WÒúåÎ05Æ
+,ej|öÞ¥Ëmû ùÕÛ„{äè=5ÄAö¸0~Š×ý·wQƒå{E«w‡ƒnéÔWÚñ‚
+ð½
+·:ÿÓÜKAÕGŽAwÁd•Û¾ôër•_Ò/ÅOcˆÒ¢"î*ŽM™p[
+‰7_³‚ ºïÛ†\Ð´Ö«îhÀ¢®\È¥ôœj©Ê€I±{¬…W8Tvƒ›7:ñY©–½…óxëYœ[ËFÔ'’å-Äm-¹èÔ¤þ»[±–ºjõ#¨´£Ë- »dÌVá
+VÎÚÂI/òFœÂJ(ø›v#—c~ƒÂþÉê½0–“øbÉúqÐ~rú§’£¥ž•†<°«ó;(De$k8âoµãà2MçH«z šáeŠ¿sˆ‘—ù[Ê@Ú™ƒW
+å;¿¼úÑï7€	êZyOk™ïº
+¥Zì4ƒÅð_¡˜¢€áXë\w˜Šc(ú«*8î²< K–”t î
+æ…Ù¼ÏVÌ•¸j‘ªáw­1E<Üi°kæ2”\LPÖl'¼:BA©DÕÒðî]ò­`çý°5Š[MG’öŠ‘¶oÄNf˜å+T±šu­7Â0r."zÚveÄÆt¢Qrk¹ژ܂U‰Dí*äØèK=²é
+ô*äsv®Ü£tÞúŠXÍl"öÔ}l(…ëÕ‰Þr?Ci/Y‚ŽÃšÒYKXMÊðØZ½í閐*¿>KF.²Pñu°þ[7¶RBÝxôÙymp
+û…/Ý•sÍÕSi4qGîk÷á¶Y;7¹M#(x§í|³w”ü††KJîMŠ¥ÂRõ£TW at sàjšðjYŒŽ%wN”i°È/Ï–µšº­× ‚TQpKŒäé”ÃA®Ü.Œç˜€x—na«)wĪÛD-šÃQµ0¯y³àûÌtPǤI¢Ê6„†µøÄ[N¨¶Î¢áXYåž9E!¨¢¾ÞÒlýÚxª0“ѝAdÿ÷ÁË„;bUÝ°`Sí
+—~ªít£bxiéܝ©sG;†	Úoœ 2w\füm¹	óÀµ§o?µæ_|)–ŒTé½ÎÕ ~7kêc}W…5[4ˆ'‰[?®î®×|9Ž°œùÚÚnj{™¿	{ÍÙbâ m«v¶<ê^qÛ ž¤ÐÕ¼-ÿýVkÄ€MÊG¸ƒww
+UfE ÂðžUvÞ@ýƇ¯Æ{¨±ã™cYÚß	å_揸²Oþhِì¯Gt-×,•¬¿,ú+yL¼Œ^,¸¥p²£kݪ¿Ó8´'ØJ®=¡ûF¸Ög<øŸoUE|tÈ
+y\W²›FOmú
+?–(æo·ì½S-Døìäì¿Árs«}ú9
+•&}Cƒ3Óð®ÿÛi9l؆äÛ`.¼áÛ‹;7O÷þ[V.‹†ûÊ+·×øæïãÚ̳¤êIû+´Â+DÔ'=-oŒÞ/Båë²$tÐ?ž×{'æï"‰òx-úa¿·51‚ñeƒY
+ûEJ:l‚ÑÑüXb~Sné‚+b–Æåâ8aÖ9ÕÑ&Õ–Óî‚Í°š0E…¡TÖ¼¸L|<F
++È1׫’•|Œ4ӏþjqä`1«öܽð+8}’RËÆà‰XŒv‡d_Éší÷»{¨ [ÄG?":ˁÖHAr8ê¼ãçÕÂÌŒ
+ÔM|Cþ-1$ׁ#.Ž¼oÒíÀŽ·wíYÀ>»?ÙµgáÈîAÔÏ%µ‡ÉßÆÆ#Û?Uût°C*>‰ü̬ŒÙj‹éÚîtÚ´°| P**_n5éPæcÃàz)mB¾x§×¨8<J~
+ä1‚ï̝
+6Y§ý²× ú†ܾ܎_üÙâ¹D	1\íiŒaè\d:<]µ§±Ú6€ÐÎÈBp±Ã2¢5úŠºßö­:Ú8Ã	b¤è]¯(%
+֐w·DGoÌjækð–r@]/üš“&¾‡»ÔCjËèW£…Hyøu¸°î·Òøž:Wi·GŒ¤»;)†hI7ò£IëhaxuÇöi‰SûZý¯l\òS€_•šXLç¿â9„	”,AŸä<H¡NH]äæªÝ·«ÄЀšþ}m¿‘jõHšO‹bøðšPí‰ÆaÃ'°‰­†Ãå_…¶ïSµ@sc‘¨LÐj9{ó¡~™šr§á¦©p	o	ÒùmVTŒb§Qþ>¿Š’ža«Š}hÉ--×ØÙÙë„ÑÃ4FÔûÝÖÍ‹”áýŒ’ÈÍK_êo3ð¥˜Áša±t§S‰;Ñcð:¡bÞ™O´yñþdÎN¼NÎÌ¿Q`íE3£Tñö–í¥™ææÒ÷MTÝ·;ñ…©ªC…V„làú˜{ü¤·Öh‡úí(ÑX‹ªsaÒdFã‘“"‰í÷~†¹v$Œêi>39Ü>~@ löÑ;ª/µ¾ˆÇ½Šæn“˜©D9þ×/å4q—©Ø	eZ +†ï?IyÙìdc3h†ÍeìP|´`)	Ô¨÷´røò¹Ïœ¦gü$AµÆ›Ÿù]69$Tß“|y¡Þ+:,ÜhYfX«q,زžŸ1úô‹1XOÕÊ-*Ÿ‰Î»îÔ×S»Ë,zÓÄ(˜Þ [æÛa'ô/~úÔ#u¶mÈOjK¨R)ô<W U0ÎíЫ·”átOùq]RQNÎ1ËN˜ÒY/Jšõ¶Þx
+.œ¢)ëgDÜY]Šç .yL«¼x‰‘Ó¢¹ðÉg½f­n6å“Ê›«Äûà_öòzcŠ‰“Iۏ¬ÄŒu³A¼ðŒôtŽâJ;ßû"õ6*œ¬a•‹Q/+ÎRÒ[fY——Ë;CZ)é<œ†e"_ª]QxÞâ@·Uæ°÷
+Y“Sà°rÛ£ÚÃ…½$Uë铍sQšµˆp0ím«W¦±3ÈNʾCŽEɾÁÈ {ãzŸW»§w"ÏÎ}ºG‹tÖ–¨úqÓ%n1²vžóÒMæMší½Sg1æpï}iïö+ÝÓšïçñªÍët©C»õ¤¼²r2_n}³Sç.0”,YM»ŠÔ;i(â{&ŠÝ	;’]ÅÙ;­ç¢O çEC–ëM}’¿­tIO.Wjxø„åMáÅïÆÕ´ã¸e:e*‚XòjwK;]—{’²•Ú••˜7LMöã«Ø>,QÙ2Më¤ÂËAv¼Î~Ïúø¦œ«8#?ôRôÆ™)ðåßé¾Á¥7NâùFó7Þ`ûa/}ögð¾‡Å‹a:Yûù e*eŸ¡K®bGžý)þÔØ'ÞFÄåõnnF8bJ(C³Â]§nêÞ±äÊÙ#“ù‹‰å®ÝìLîS+ÕÑW¥<‡ô{tSüŽ®À/EúcF™­³)R¯:¦øB;ˆù #ônâpÃgë”8íÙŠÀW$òˆàLË`*¯æ1yœ[LÎ׊˜ÜXªI#<gCºó[qÖwbá)g¾Å¨T“>Ž9EQ…>\Ký+´ŽO¹õüC,TùQ4‹ž¯Ò>HýLÜ@WÖëøSìÝBLžµ6zÍ·Óþ#sèdYKLЦ|£ BÒ'`Ôº¨æ+bèó˜$
+"2¡SÐ~Íá`×k´z=2À¢SŠš¯ï	2ˆO˜ÐèøÈ£+¨*œÚ§/m—gDãÏ&C–Šø-(ã;ú¬pe0zõ<¨z'uå9L¨{ÞÄÒœà=ãš=PÀËvFµÛxTK*=•ùJAKU²³{Ø/å‡ðúO'⤳‘wЯ¸êDy¢‰;¹Õ
+ù?u9f¯–@¡ðèV·=äøàQ¦ê~Xû”vºŠë"0u\l1À7ôc==h)y@Èä`æ\¢ÿ¬Æp·).jgT-Uy>/OäñˠٝPX”™ó[ì›®~m/¢+f¡HQcØ&ë¶Ø헝&hõ;§Â`BŒi¦êãmUýاàݺµÅ¬aOèâ÷‚/øU—^ù¡5£ÄÚ™/e€c'Ý_tG1PŽúrüï7N,/*ÍýÒ™R`7vÅi‰ÑlzG¡éèTŽ®M‰û7ÅX±kõù|ªJðk$C}¸>¸"F–´\ÃNcX‰KjÍzÐÄ-ƒe°zu˜Ø¦G…Œ.’pðÂ>|=jZ¿:³²<ʸx¥ÍÄ»,Ÿ˜L[ÑÑÔ/®)ã³$kog<¡‹ryW°Ò8kÚÂ…vmÅjõÅKHЗІ‰å¡×œë•†üx¸sñ‹TYSâ#Ü0èa+ÙÔ“mmûóÒ¥–“ŒÇ@TÅÇÌÈäõV@­F–`ñ|Ô>M!’‚ˆ¥{ t+qÛúp“ñ5eÿÞ Êp™XÜt¡yAAßâ}ËüЕ7ÌßaQHI¢ýÓמ™ˆ ¸_[&¨—’ú]í4…FTTϳ3C±ƒkše¶ã4xYýÙ¬¼`$©4®xÂ7%Âq¦h釨ÈèÅwnjK¹Á‰dÅŪ¬Úö$[©%}_.PÄ•þþÀýÿ	þ?‘ÀØhèèlgcèh÷ endobj
-23 0 obj
-<<
-/Type/FontDescriptor
-/CapHeight 850
-/Ascent 850
-/Descent -200
-/FontBBox[-20 -250 1193 750]
-/FontName/DMIVYN+CMR6
+15 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 73 0 R
+/FirstChar 11
+/LastChar 122
+/Widths 74 0 R
+/BaseFont /EWBXHF+CMR10
+/FontDescriptor 13 0 R
+>> endobj
+13 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /EWBXHF+CMR10
 /ItalicAngle 0
-/StemV 83
-/FontFile 22 0 R
+/StemV 69
+/XHeight 431
+/FontBBox [-251 -250 1009 969]
 /Flags 4
->>
+/CharSet (/ff/fi/ffi/quotedblright/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/J/K/N/O/P/R/S/T/U/W/Y/quotedblleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z)
+/FontFile 14 0 R
+>> endobj
+74 0 obj
+[583 556 0 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 278 389 389 0 0 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 0 0 0 0 472 0 750 708 722 764 681 653 785 750 361 514 778 0 0 750 778 681 0 736 556 722 750 0 1028 0 750 0 0 500 0 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ]
 endobj
-22 0 obj
-<<
-/Filter[/FlateDecode]
-/Length1 845
-/Length2 2056
-/Length3 533
-/Length 2671
+73 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 11/ff/fi 13/.notdef 14/ffi 15/.notdef 34/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J/K 76/.notdef 78/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef]
+>> endobj
+11 0 obj <<
+/Length1 1292
+/Length2 6411
+/Length3 532
+/Length 7207      
+/Filter /FlateDecode
 >>
 stream
-xÚí’{8TûÇÝF5%9DB‘[æ†\wî·&w™3³5cŒ1C(‘¹%ŠP±©%j#¢Ø
-‘FIR¹ÄP[.gèì³÷iŸÎsþ;ÏYëŸõý¾ßõþ>Ïû{•]4M‰_ЊÑ5Ñ´`nç|-‡+æ*‹Fò ªæjë)]À4¤‘x°ÃÓÀ ^ž¸P$ÎB-šiõØüˆ­ó¸§÷äÛÜUìÁ•QÅÐÎÝ9‹ÉuÇŒ;§LO‘A·üI±nãðwƒ6"ºŠb%†úy›a[È–å%:l}N3@æŸOG¸<GV%‹
-§þfò,ó3ÄÚS·øø†ä§µlS}Ôˆ³:–ü9ÇÌš}Ú¦¹W¶[Ž¤ö¿¯ìî;ü-F…¶©|³˜rÝÞn"¼úùiùœûê“¢þÅFÉžjY>Ñä…ºT¶â£é…D™^É	ïôi:rLÂ`„pjŠÕÌ·(¸Ê‡Â§q¶U±c–œïŠ{D"¤) Û(B½C 5¡ï>C*ðêì-ÒÍ;îÝ4(X[ÉMïc¸È\ÎËRw…$
-ºUs°öS-›¹ÐT¥OVË÷§:ÂE®[	J«Œ<-<,w5M\iI*£kmטhŠh at M<¡î6¶¿c¸äSëöÑZúZN©÷õÛZC#×cOÉ4n…­dÀâ®I>Ì^N4nšß
-U?¼§µƒ}ôDªHvŽÖÝàŸƒÂh%z¨ÿòÿ¿ÁÿDÄÓè” <-ÿ;ü|ví
-endstream
+xÚí”e\”]÷ï¥;DJRz$¤»;e˜``˜¡»CJT:%…Q at BJD‘AJ$¥iAÀ3÷ýüŸ[Ïó¼<çÕùœ¹ÞÌwíµ×ïw­µ¯ÍÍnh"¤E9ÂÔQHo!0H ¢§l	€„EH¹¹UÐ0°7…T{Ãd @ÉÇ *+üË‘Ò	úWêãñï%_Úk
+À‹5ÉÀZ„¢ˆ+ÔGaµ`X'ÿ7LýgquBìþWù¿»ô_ë`w8"à2Pî>Þ04@…¡‘ÿ™jû—9eâ¿d´¼Á8D	錀Dþ‚{©ÃýaPC¸7ÄàFxÁþŽÃÐÿ´€mÛ߀†jƆ¦ÿ3Ï¿
+Áp¤·i€Ç?eÿÊþ›A¿Û4Ü`#","Â&bŸÿ³û15$…#±BB++J­Ï
+ˆo‹c4jKQÀZß–²›Ý¨M­á	iZ(nsq°Ö?e*ù|ÇEGã×ëøÀ{ß¾4ŒS¦´¾d‘s‚xw(kxsù¸~i‹éÄÌ<ú£vUÕ–Íê•ZK¹éª^VïôžšÃkr=VHkñõôî`úŒrT7©¤¼Kiª§ª9õw¹Uµ›	nïë1jO©õ±—FO’¶Æ’©PÝà ɈÓÆ£—Z)j’Ìç_ØjÌPˆD;ë(ðð¡ðD™mÍì¸,-~9•tOݯQ{wD™ä~n'ÿL÷û÷s	ïÒEa!;ý2BÓ‘0q&æ9¿Ž4_ý*Ëî˜ã‚b•k\ªÂ¥™ÉNëd¹SÅèì6PÓT5s‹ù*¡JQîÓ¾ŒP¦5ÏB²kK§ïŸgí»í˜¸Æ›ˆöK¸'Â4¤ [¹}µÔɶ‡/«.êM‘;g¹­„¦G"Êy^X|RÑ^¥oÚ¡‘è¦M®˜¹×§½ªX/@h(ìåÜ|fÖOü Â4š·%ùÅ*”	{þi62¹®îÊÉðáºt£ÊòâT&3›Ùǃ5’#ïÖe°S¤-àåÂ9¦+AîrRÚR… Û„ÈÝ…6¹¯±ß8HÖ{8dß?á¦	›*
+Ù˜¨0£¿óqí嘴øeŒ
+mË~ÖZ;zÎwg7i;¿¡3‰Mˆ«ùj#6
+¸åˆo&I©ÖØú½S$N¹šîYnÑÝø²¢T –Î…»|Jˆ"ÁÀëF|d4lré3JëËÙu¼Zg§¨!’B2ØH@‘XkÀ³¯ñHI}ÐhGCNlß/u-^öúv…§™~á†p¹*uD~^EQYÈô|e>•‰í>¼_´æâ;]æI›³C‚ýÙ§Ã\ÿ3yùÉGLÖÉOÆE²|aÉ<M˜v!w|hm	©ƒŽ¹=tJÕÏ·ðqO|öœ‚¡WyµòšñiíG†ŸrSOÛ2Ø>¸°Ÿ$Ûî=ʾ+–“ð‘z9¥Y²`@÷åB8<ºrFÝg?×
+4¶åÆ%ï8!TR{ìwU>ZÄås&P±føa’˜N='@„O0dºŸþ :›uL~Ž›$ƒóxq£¬CBƒà°Öy×Ê–\ì ~4¨Wñ×±ú’ã¾±ŸŠÃŒøHY]ëRµŽ%0óªæþ)Ÿˆtùêµ1Íz™uQ&Æ †ŸîLäu#+S²Kjì=®³w¶‡\®’1'Ú
+•Œ´sïe×tܵME, úl,«ËÂLó^­ûñ5ÇŸ¯¸s]¶Ãf›m‰æuæ›…Ó.457Ù¡MXÀxš·ê×½t‡J‘6íÖ5Q/J®OtmvR*_7úu¦ÚÏT<¾ŸþŠ¨õ<wLæÀÀ[Gφ_5/+
+5ËÏL&Ìd×CðRâÊÝÈÉ//‚ÒÞúÿÚûš=ê+æÊ©&ä4·Ú€š»Ó
+‹:3lK\‰q›Ã—	¾kžŠŒÞ1(Ÿ"Tû¶3ï¶RŸí[=¦(ò¬°grþdñ€åÒ/’§òõ°Xüy-ù˜šV´±o²5¢2šv…Zb‹ùB~§îè
+~»™Ü2B‹¿?åptyHª'¸¬ÃŠ(
+npåU	I«OjóÞ<ш+ˆÇôùÎ^:=À{xù9æ.²ØÞE±½#gsK#I8Ü¥#ÿv4ny<ÄuÜ2lxÐA›<Áз¿ö2ߢ.Ÿs<Z¸ú§³S¦G~üæmåö\ÕmŠØ/*nGèЙ€ì
+“”_
+ÉòkvnÜmÎI¸?ˆs¨x at HÁÓ>âŸn}¶‘e
+ûGr(Ü+B­B«s@©¯oŽo>žËЃq 75ÒÎn
+z„•j>?ãd{ëáÉw±1ÀZµR¿¯ÑRq)À>Óº8ˆ¦lfóó“qí«]ǼG:Ø5_Û^2­¤Ö°oã>ôS¦Jf^T±‘Û¨æðɍŸÆ󆣓wؽr»ºEÔ¼hMCÚöÙó8-ÑîöÉ]*BËŽ~É*Uõ_ŒhÀÉ÷{3#DT¯2©ÊMúq¿i„&„„NÐäiÌ­f,õaÀDB¿wl"OƒŠÍz³¹,™ªb
+Bî:³z¸á.¼çwét*L­½wFcŇΟyúîS•ÒÚ‰•Ùõ”(Uk)+	nǘYâæ1‹Í›Ó= ÕG6Ì=]ÃåˆÂ"ñÑ(ïeÈIuÕ’Ol}dGQ0÷ííìX;‡øP|á‡òñj£_ÍËŽ9È?½%Œ•Êœî1»Hæ„èôf˜$õÚºËñ[±©=É-¼Àù¬öPj>W¯§ýÁ˜"	éNÈq:ø£‰¢ËPæó½òÞ“d¼çQ}esA
+vGTø?ãÝáJ{Ñ ´êö0º»¸¢>PÈF_}öj±è&Š÷üÛBEWq0R…å{'û@h¢Õ̸ãÅF»{·g3yä¨õ‡t„^vÆ`®8¢^hÖ#	Ÿ{ô=PrŒ×á„gyÀab57˜Nš¸™Ç]HC'ÉÞ#qãuæg‚ÝwÙu†Þ8¤Wöd,ÑMlXÕã±ieݵ^4”½í
+ím@KMñÚMæ¢WÑßô	ÑÓ>–¹²Sj¨ÊÆZ:Fs·Ši¶†ƒy.öU·Mâ)Ò¤Avâ¡âIÏðË)]Âè²£ìÑUZ9¸8œàh"5 ûpN±y81Q%±˜L÷³†ùQ‰ûÂ7£:†O„ƒ:r¸¬Ã¬£"QóJÑÒ4*1%ú<?¬µîY.ýtUÛ|vlvÓNEÚãÇ<öº:öÙ—GG8ŽÌ'(~ñcq{<Õóü[ä
+Ÿ0¡*ŸŽL·3—¶ýÖÂø¢õˆñ#¾H¹!ƒGº½GÝ U4s°¡Èáò¦T¿X€`¶4UéYŒz=±|ûô«m*Ú
+“š>S*aÏXþþhè“0îO>¯§8räŸYH¦c8¶¼¦• QKõéS•úO#t1—´Õ¸É8gÃ×}|‘ªví™å4E¯T\ÌùUt¯Í’§hÕ¥Ë‹o7øˆÌb>öÑ–-R¿Iy`ú
+÷Ã>Ì蚯+‹•ý‹èOHß3a¿Ð+u
+!·Šù#ù:Wr°±—¹l·Šk6O~`ðM+²?ò{¶H’™ÝLU’­×éÕ¿—X¡çÔ*ôºò…pJF…n©íÜ’<äxBb¨ã’´Á~ÆÁ¶ž>Ÿ‰.Ž6ß·®ú‘u>ŠçÓ¢{‡"&ëžâîö·×Gò
+í¡p¡Ö×¢sKáÝÌE,ÇŽw–ò`$[Þ„Ž‰eÖ¼c¿CÍ5.ƒuÚõB–
+âµ3‹€xÓ„à±H®‹eùï™÷X8RFØæ\Htt^=Ý44,llOÉx‡Ys•ôë†(*«³ð6å61ãÓ¸;aR¾•Êèú3]Pjsu2Qâþ•K
+|寭!¶9vvÈ=ìx$Á¤pû—’C`È7ÁêÞ"¯&GŽ76Gøï¶àn¶¬’ŠÕåäýÅÂ%1¹¹ª/IðS* ô:ÚE¬¬¯
+y6EÏØbp”1?²Ïš®û(ÞD™ö&‰énGͧÐ
+ú›~YˆOsåßÐëcF”g‹Cá¢ÁZ©Sñ9N|šCßW@ÙH1üÒJ'ùTåý§gb¨rµ4Sò¥™‘,ÔýÃ})5†ýÝC»Áh§½ï“H»q½›kא]*ÐZn¹Y»lßÐ&a¯=ÉãÉ8K„Í“ñÞ|éDcŸ;ªcËgEà-NˆGÁï‰H<M`ïþ|óøK˯÷zæú[8N{*5Š*£ŒoI7å?m
+êû±N=A¨ä>ï6YÙ±5‹|ìæC²d
+læhµÑ1ÅOñ'–=^Þ#‘àút}'‚¢Q—Ü‹ÌÛwûÈàUŠ_"fà•OšrOey¹ÿì¹í¿³8=q!'mEa‘Õ/òµð»¿:îgH§USË“»¹d“Y8KHöÆtE‡ÕØaHý³¿žd"GÆôúe2oìñQ(ùvÀ5Àggc}‘WVÞcö4Ra¹¾#J#Zoì%‰ÇýË;Ty{8gZR~öXUëŒ+IÊ?؝71IÜ6^úpl®7ÿÎ`“%×—Èk“÷ˆ­õ‚¿%í–(«äE8Œ2þqà“¹
+¨+žÕ7 Øm³Y1ó…÷Q¢O¾üWw[k×*¢&£ºb`¡à²q¡t¤˜|»Æ•>15ž—²öSýÀehóÃh—«iæ—˜š‹§_–™b(ž§o¨eœòŒyúsb9x¹hìZ»øŒß_ë…ÅݯüKϳ!Y­CÍñïoÆG²¥sŒ‡|§]m¦ÿú¥Žë­š‹Já™õÂæXhfxÞÆ-7T•K2ëq·‚³"‰ñŽIv©ž¦½€»…IðËï’æ|ÅÓ¼¬nöûÕ!¢ò†Ò›G_|ŒŠÔ‰ø+7ò©Š\ëWIY©ÿ#'[E¶ÔVÃСy‚ê+)ÊË1̦K!¥ ùî„“MYZºÑч5Ü&7’Éç©TÞ¶÷mKȝqÌ,OÖ8hk/tŒÿ–iÒ]·›«"ÁµÒO¨„ú½ˆZ“ÀÉè»
+¿Z§⬖"»xWü!ÕëÞæS$O·ÐÁÌr±ÁÎó<1#úýWË›o*žthßЕ…Õï7j<~ßà™v&bÒ³O­#˜“>UÕÇ\`Þä~VŽ²I_Ñ¡8ÚZ'rÜæžq.í¢5`ñÙ±…+èì_
++ƒ–PË72ü¾ö;Ž:òFŠ…Ûc¤³Ú¦Œ±oÇt?ÛÎH·SøûqŸ¶ÒÎNÁ8è¨ÿñÞ#…îöO¯ÔXJî“£§ª
+ZZ8•
+ÑìÞc#×gTÁ×1|zÉ¸plwg6°ª$è2+,]û-Þ–ÈK×<±­êò'Fû䈙½/‡ÒïKºÕé9'@‚£ô%vÚn;CöwÝÏiQ«ÕÂwý0<Ïdø]2¨ï7ãR×nû}T\#ÊH"kïÍðú-ÍËÈQ“=øÎۆǘµäŽÃê:AH9Üã½ÛÄq	m€ŸFÄ1ÏW™`NµJl*sVbàÍmë{ÈvÓŒ¹áVÂsLÐìcõðÛCm"£ô_m,‹¹4ÚŒÁãæù“gÃÁ±]%1S“3ÙëCƒk˜§(̨þùs6!íGaÆQo  MçºÐ„©èêê%seæêÊ*òcµè6špÓËèòbªuCÆô
+(Œ¾rÉ“0®÷ŽWÅUÙÎ3ž¥|uöû‘`¡wÒˆ48e3¾'HîFM$¨\ò¢äፆN¼$EÀ`r¦‹Â¯F[E/ïЉ˜pÚµ‹,uÊ;n"÷³âjtj7•}_ÜœÞøH¬°l˜?TŒô¾9Dù=ː—QÛT¤À/½2î§OL2v:X/ëè™2Ö—
+…”Ô>	»™à–+Xß¼ñh˼+βo3)Í™½»}ˆ[’èW&v#»q×4(c£QìTž¾á>˜lÒXZ…>\cA
+n-’30Õ";Ûš“
+]È!_7»‡§è-çq²Ü%›PëøР–f>êŠë:œʯÒ?‹íײЭfºlD_ù–4ˆüÃH›~Ô.…~}TÃM}'@yÐãÉûxöuüîãWŒºU#ÊÏç•ßnï(+è÷‹Óëä­\˜Û܉.µêØæ87­sk0-[l·]åJŠº›¦ð,yûE°±äì
+aŽ%ŧu8¼múM‹éË2¼+¾¨}ºþáfd%§2›¼Áë5roAZ.>ž®46°S&O•ÆZö¥Ü¸Þ»!Õjƒ
+ Özc²d2Å·Ä®£K}²išµ±í¹«ÐE™‘YÍàOîfN¡±4&QÔ6’+Oýõx…¤SK|3å 5[zùW{ºL¿_	¦wîx%uC;ý½ûâÒžÙ!	ãÒÁ×{M	[{é%ÃT·L׆˜‚ÈçlèT<–?Pë)p•ë‰:t;v^¤	WˆüþHÿÿ'
+@00ÚåF»‘þ/
+ék~endstream
 endobj
-26 0 obj
-<<
-/Type/FontDescriptor
-/CapHeight 850
-/Ascent 850
-/Descent -200
-/FontBBox[-36 -250 1070 750]
-/FontName/MAMUVX+CMR8
+12 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 75 0 R
+/FirstChar 45
+/LastChar 120
+/Widths 76 0 R
+/BaseFont /PERPTG+CMBX12
+/FontDescriptor 10 0 R
+>> endobj
+10 0 obj <<
+/Ascent 694
+/CapHeight 686
+/Descent -194
+/FontName /PERPTG+CMBX12
 /ItalicAngle 0
-/StemV 76
-/FontFile 25 0 R
+/StemV 109
+/XHeight 444
+/FontBBox [-53 -251 1139 750]
 /Flags 4
->>
+/CharSet (/hyphen/one/two/three/four/five/six/seven/eight/colon/A/E/I/K/T/W/a/b/c/d/e/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x)
+/FontFile 11 0 R
+>> endobj
+76 0 obj
+[375 0 0 0 562 562 562 562 562 562 562 562 0 312 0 0 0 0 0 0 850 0 0 0 738 0 0 0 419 0 881 0 0 0 0 0 0 0 0 782 0 0 1162 0 0 0 0 0 0 0 0 0 547 625 500 625 513 0 562 625 312 0 594 312 937 625 562 625 0 459 444 437 625 594 812 594 ]
 endobj
-25 0 obj
-<<
-/Filter[/FlateDecode]
-/Length1 1289
-/Length2 6434
-/Length3 533
-/Length 7245
+75 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 45/hyphen 46/.notdef 49/one/two/three/four/five/six/seven/eight 57/.notdef 58/colon 59/.notdef 65/A 66/.notdef 69/E 70/.notdef 73/I 74/.notdef 75/K 76/.notdef 84/T 85/.notdef 87/W 88/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x 121/.notdef]
+>> endobj
+8 0 obj <<
+/Length1 1065
+/Length2 4472
+/Length3 532
+/Length 5179      
+/Filter /FlateDecode
 >>
 stream
-xÚí”e\TíרiAºkŽa†.‘º¥†¡†RR¥»»Qîn	QZARD@)¥„w|ž÷ÿèyÞóåüηó;³¿Ìµîµ×ºö}¯½9Xuõòöî¶0ew7PP at P
--€	98 H…pwS„¢`R-}-¡7èDûÀÿ@tSÇ?ý\ˆ?-áü¢-\þ@´†ëoDk¸ýh
-÷?­áñ¢û"ÿ@t_¯?}¨?­áý¢5|þ@´†ïoB÷õÿÿçP+(¸û=
-‹€B¢à_ˆ‹‚ÿ×DC7ú¼Õ¢`0X\òﱶóF¢Çõ×WýÂü‡è×óƒÙæäR!0­ù™øNmNzgï¿œ˜Ó%ìz¶Ÿ)ú½zjôÛm\y§ˆ0gÝ“â‹/º±gÜ,²‘õAZÒ‰½ß­üýé«ÞSó:Œwš¯ŸJUÇ}¾¡h6ÃõÀbÛ­Íù
-EYá’|8²/Dyt±Òµ\ÎŽu/ÚW™ñu-4nFou`HÙÍ*ùj$óåY¯Ãs›„Ø›QÐú×	Qº>»6<–¿mRu4i(m.|-Àp²^ZøIUõžô”åfÀ'¡Tz@•GY‰yd3„ŠŽ	‡­	Ïâ!„'"%Öy¿ZYmןãf Q
-"Öîh(É+í‰=ܱxÑÅnù¶ýŒÀØd¤l|?éZ÷f4ÛhÚïãôú‘m‘˜\¡+ͦöF¸‹ˆç¥Éõª™´/
-Œ‘ºkž3Pò™¶§§7°k[ª/§©‹ñ³Uó5\ò6AVþ»yœç(È©å$MÕbzßéG¶±­¢Ø`6©ñð‰ù	
-	úOÚªjV#z¸’ÁÑqã÷Ûz+ç8bD8)2›ïÀGê_W#P¼±9„‹U¾£ÒjÂ}¹—_…lÒÕbM¯€À2!£lï7z0QŒ†# oKQõ
-°HCæÇ+ûN™ô_=“«Àm…Ò±–¥ø{ê!DÑÕ£óVª¯¶XÅ?Z`Ã-_(/]Í	Xؘ1øe¶½‘c䯢Ǽ[<ZVñ1ýÖÑÐQrJaN–©dò“î(\J½¨Ç­¾Ë™àmqfë`9`ãUºÎX¾3S~ÝË+Éîì« ΆRf8'Cãò¨‰â'÷ŠJýûkÎã*¡+†X-ñn}»PÒS!¼)ÆëR:c,»†Ð®Dw!³mô”Š“P¿ã^[ᯬ¬p
-Õìq…/Ž\‚Í4»m¡‰IŽÎîPG†‹³Ô8gx}gQÜ1–C¿jݪò„ò³A‹¤yĵ¥ŸåžüÔg*¯Û1ŸÙ>³6¼XØ
-&®fr+X Úò|uV%ø2KÚ–®¼áƒ‚ÚeÄ9Ë­2ëöÄpõû`‡ ±æLb°´)ÉË%Ã>u!-#pc‰äupY¢ZjÛØR&Èq£Ì|‘Û&,/D¯{.®p[£¢7`
-sHõÇpúÏ½¾ÚNâ&Ö¡¢;Šío@o(¥¡¸û©ã><$óî/Î0ΝÕÔ/;GºoZxKÜ]a¦VUnŒ¶)e‰s›Ý öy¸RJ"×’–õŒð|M‘uÞ×ÙeLÊ1ìDÖ¾Ù$Xk“i> ?~–ÍÚ˹Tñåºò0
-¢†er»B•g¯^±´ÑžõΉ`æìë
-e-Û,Kn“NÖVC/ô<÷±*¦Bô&9Úµ,uÑ=ÏkÃÒg‚¹iq!¤€KDر]åý`Í¥–I°Á\l…³R^&Ï2føÎf4û"Äqg­¦2ãû>z(J½»sØŒáÏ«±›1¥pŽ›J2ø-!]Üq
-ã^JfEx-o•A?7ËÆRâÇQ1#1&AxˆŸ\
-/ä’Í¡(aeÛiH_HðýÑfÙÊå©í]›Ú#NïdŽÅ·&’ÕõÞû›¥Æ£¢¾<ñµ@ímÝ48RÁO{ïÕÙË$…KîX|lu⺗!c(ó¹oa˜¦³­©ª–j—Y9™wV\¼U_÷óˆ?aÙbÀ.+Øpta.4î [NöÄ‹€ZÑyÆ·I¥È°vFvtΝ’‘EGùðî*."ô"bc–
-£ÕºJúuCȪg¿Ü=¨¶Ÿ‰o›BüÞ6~ÏcQzU%µÎ>ô‚ŽË<
-«wÅö'¬gsIñ¹fWùD]·]x;Šçy<Œ#O´Þlã>fábÖ×t«/öý¨‰oä)HÊ¡”ÙH/……t™— öGâ›ÝæG\>Æ.Œòªé;ú!|«Uîç—/,-ô:”ðõFÞ¯àx½Ë*˜a艰¼d6áòƒ¼º>†ÆñE²¡BÎ)S;Á’þp©#XvRlSÜB*›è§ëÙ3å*j£º7~:‘É-TÚ±=Çz‚©‡ðöÚ¨×ÕëÛ×/CP¬µç¢YÝ¥fkªR,‘T<EëÒŠ¶×UváHšFòàºû®Àl‡|ÃêT_ü°žFbu'ÝL±“䄨
-àmj-²ÓÕ„)êžÑõ¹ÃÄðá³Üoî{¾•ð&VÝÞQÈ%}+¤á›OòMé¢Jï€u{'q¦cS®kGÙ¹<ý©®JG˜ÑTkÔÚ'z`†dš{NÁ^
-D©“^´N0<~¼þ¹ØrY‘°ìt˜}ºx3A’à§ßµÉdÏtÉÉ|d¤1WÏܶÍ!Âs>G\NµÛϺ·xÍ:ÌþÃÛ4ÎŒ¡rœ++ at .·á1À¿Pûµ¯ÃvÇÇ–Õés÷´I‡©cíº”¸·V“»Á癘´-ß²”m£V58ßÈÛJ…®Éüùͧ7|JZf<¾D¦Y¦ëð‰orlCÏŽÁ—â^·‹æžµÔ|’ÓÌǐŸØž,<9Yc,™ "òH{•,¡ßKµ/’›Cú3©ÿ€“’<Q}b5–×$Z5öB"z#¡VN¼¤Œmµôö]{Þ£äŸ+Oktat¢Í­”ÑüÐ=°x§éÐÓûð¢H‚gf,ëV—5¬5Û‡ÈOÒ’¾û¶þ˜̽oUìE½³°‚(‘êFcV†¾(!V§³‘QlºÊQ©Àã¿Sv»©W¨å‚¬»ý­¸Wd!ÄL¥=Yëâš›pUããÅ£ÅÒrЧûj9.¦8Kô’æ·|7¬ÚLåÇ7	JìpÙ(µR;A‚;ÒÅf6knb>R=h˜k·Zò%Èo)‘éÈí‹âñ²­¶l¸¥éõ"ŸÆSëµ#樗:ÙR™'RAxMmúS[Ùß¿¦)m¨°-æZóI`úÊXÊïîš	è‡
-Câo9ê/(RÁemÃN÷î??¦Íp|W%‹¹†µ°yÐÐÓíĈÙÆ= ¥qXg6÷Áñü&_5j¢dDŒcS ”µ`‹)K¨ÍÞ}¹Z=J³g÷…[:i%r,z[e…®°5µQþnþJѽqì/iåØ”Ùx95‡Mõ9OàÌÛ·—WŽë$¼¯WÚý
-†«‡‘¾`¶$lñ<;6"'PU‘Kio)叏ÓÕoµmç6üMĬ-i_aÑ,Šã´°¡(Š¬3®ÃÊ€ÏX3êy=9¾R*/‚H‡n‹fR……«h×^¹büš½‚XñûÆVdw§„¯Â±íý^Úƒ›XàZ_ïtMîª8t£*ð|$Ùʇš5F¹”µèÅ,õ·ÕLB–é
-qށˆF%«¼z@‰Aç[ísçIçÖ³¹k÷-•­µâ7Îódšôƒóø;ZÓô\¥ÍXàÄ6ÚêÔáj^|¶O»J8¡ð‰fM]B„àøØýÃÑaPªôÊ—½QyÉpP	Q£%.œý²¬’€+ª½ä¼Ó._X½A„R´.µÈR¦~Ͳé”ìρXá’àyÞïOƒ—ž³ÍáËýøhœÓ¿½ecÙê™ZaHÊ¢ÇUx·B01µô½…þSùÕ—«|L§¸¤Ï‡[8ÎP÷Mj‹.ÎwŒSÀ¯V°„”wŒ½…
-1FQ¡|ò3£-vÖV‡”݁¥*º?î_–çU¿ôűR]f)“¶#ÉÌÓNì³lœç1?ùÚ~!ÆT˜ûcððòŽ(Y ÁQÿÊ`;ð
-àë¨Ûî´FóJ2Ã4í¬þ8Çé:È¡
-AIUí:3"‘sýT›U÷NCˆÀù>ŒöÄ €?hᵤy	M…¥¡j–j?AêHJÕt¹Ï<çœ"·÷è7Ä	NûbtǃâæZ3¡êÏ—&‚y¦8}zŽŽúeȦUµ²,ô‰0æì%„^Öa‘˜?;³ÞrêmÑ«ºëôx¡»4ieåÚÔgNáÜøS+ÿ½ñÍ{‘ÎotÖ±Á\Å}ÇúÚOæ›r¨.^_½SÊ	dÛŠÔ"¡QbeÖ‰žÎöm‚:ÛšªIÌ+P&Qã¢üøfX6žLŒÑ	²Ê%'çÓèNŸœ¡”
-ÏG
-xZ‚F¿*—/Þ3Zæ/o¹ôiMé6åã
-‘ì Ô{ì/GÉ°叉»·ˆËæ•0[”m;pIQõá¾N³õ—p•ß›Ã¥†Þ f1¾’âŸCò¥ß„¨6¢{#¿['
-'éŽíá%(ª¿ _>ä'q3Ü6V郮Ã.zàçmÊÂ¥´3»ØühIGŠ%Ê/pÆçN?;**,4Y™Ô{¬KÔÖ]eÒãá:µ`ûÄ]-ñ žFÞŒ),™£¿eàð
-ÚXùÞ2(u¬öédrä7,WÖ3ñQ¢¸)ñ3MÁR̤»½~äw?µâôy¨–—lDŠ¿ê"Oíú©qªÒc-y^É•^GD³´/:ˆ…%ÌйêcFecLÝUA<ã¾¹kG‡ {×ÐÈ;Ži½·~8Vx at 6Ôù†!uñÀ0®²=òàµÚ:ÞØœØJž‚Ô®2”Û/ao¢FUôÔqn}Ü5ÞÓN
-Êy‘¥ù‚ªÒ¹PwôF¡5ÅÀ¸E¯âÕ›­bG—OÃÛœ<\‚>™êÛ¾•s&Ϩ|‚½z]6=Š¥0 ‹õ¶e|GÙ)™ý©Æº¦gɝ:s!#RivTÿ§àô’[Ú®q$žÀ3é$néWðEîôÃÊ7ô"Ð’qÙ4Ú×äåkŒû­Á;•.úÚ̏Òšà (çꊓÖµ^åç?ÌVi’á-®º‘¥40%0°,¼Sqöù¾™g&EèÞCß·úeŠÑÅ^ÚABR0ã4FH\샡­Ö,Î[-žN,G¬+å“<_Uô®i1ý6š7§wdöq˜Ÿ˜6‰œ4䔪׹eÝ$9{yì|Šÿ„|å“¡ù`ïò­Ë,®ÜTXAðË‹–’Pw+*ԏȬ“†\¿ûúA¶µÄ•”øÕbi“ E)؏8êRºûT…‰Wj2%ÛZmâ;±yÞ…™?†ÂÔEÂà-rça_<µou‹t¾Y¤XSš\מN)Ûù½ø©3‡Â5UÂ…ÁÈ­njþÖ’@=aÄÓwÓ–˜¥‰E:/çY|ç‡Ôᝧvy)uµQò–”úR1k&˜4W;Kí‘‚‚Ø&›·hË´
-Žc#jwñ1û„²¸éƒÉwíŒòÓÎ`†ŒÅïR•}û@õ¥yÏß›«I¯¯%†ªJöxèuÁ2]SÇ7¨4^7>H”#ÆÊ©*ðÀÈÜŠom=¤tcÄ–+‰<8“Í­:5[°õ .Å«ò&à}É P«øp&Òb_
-Ëy
-tMìè2s䳿ÅÛu²ìQ>LÌ[óe¹¿Û»ã¤Ù_æ+uDl>.U|rÑò¤ž…*¹k‡[´"^M¼5×y6¾#«kÄC^~­qUÚÅ4n½×¸ØÒƒ&XCr–8_®~’–´ÉŒT:n^;>þH$éokcSêOÛL™×l83×ä‰ó´AIa‡µ_“þëÕÝpd_5Æq02ÙÙ$IK»šv¤%B.A]Õž—”:LwLžkQfc.më[s’'ûuõȍïµ[fV›i3-h…›Q¯oþ$¨>NlÒÇ‘%H½9¼.)»ËdU¢— ¼wJMVÏ¥´ÅÂ.R¶öx›8ºLØz04³|r
-¸¼*á·ŸöQ¥Ó¯ˆÐ1VçC>“ÀRY”0îÂz
-Ý„ž
-¼¸“[o’Æ´–˜÷€Çj+gR˜ÅqK_êÒ5 dŠŒQW?¬¤¾lv[CTÉ«?8Åtνf9ñééZFˆ›%QÞ‘Âtã'«âÚ§©c%¦ÄŸãoïx„_éUUG—Í-ÚIùúQ|õYéЫ¬qá°#-‰ㆀ{ÏC-~ˆÈ	âKÝkn=!Ю5‹§ÿÑ=|{~¸”æÛà¿`wÓòtùL9\…ÃÍÖbÏeРôY*têá‹™æ6q—sŠ5W8éfïJ§rc"γŒ\!íÛ @“®0Ýe¢•!Ò°TV.‡Zló–}¿_/SOd•°Ž%Í…%v¥:qÀ˝ã^ñ‰3
-HMƵÉØs§`~é1e+îâÖyƒò‚ûb¡Cqó'È·½ î-[µ›ôOÛÌù´r¨´ö‡½z,E9V<!wãÕNÇô‡Þ	Õɘ)0wðÿåðÿø¢€ŠD¹»B‘΄„ÿ`‹9
-endstream
+xÚí–gXSÛ¶†DzUTD`!EPHºÒ{‘"5 ¡…*Ei¡	i"%H“&EšŠ…Ž•^¤+M:ž¸÷Ýg{÷ùyï¯ûÜäOÞoŽ9Æ7Çk=01—PCà‘Ú8¬·Q4ŒÌ R+êÿ›(£þÛ„rT0ò7”À.¿!¥ê7¤ìuÿ
+)fÑ¿¡+;=(k‡íüäúƒv…ãt/ËðÇ$d56ì•gƒU¤ëE’Ò±®d§Àeµ“»¦ÎÕÞ…~¸Ókè'z<Wtßk”ÛئÈnÎÚ‰¯[Ža댗›¬Ã¨Ê†¤ë‚ærߺ‹š~Ò»æÅ€ÙRunÞI«‹šHÓ€;À™‡èÓõ8q‚c“’ۏýÆ2ho9²+²3¸b;¦LzĝW’—j{.•ÒÅM9êäIÛ¾—.1yG“Z$o(ý¿Xpã‹urÐêhs-™wQH¤	«
+j4ûÉló3þ6µD÷Ëç H8_rj!F 
+¦–žp:ÏÚÃäÅkc
+‹f¹u‹åúÒÖ¯»l³åå°Ý!8l&¹’²{ü×w*¬·³_öۯإ[5¦g¥õö{
+~tضÝkvöR=Û4°Áo¼õòñÕO¡ Ô.±Š‰‹JüÈN·š?VÍ]ý2¤ÿ›çÌ)F™TÞQ¨k±a§ gQõ9vÅs2&‡—·“T\ޝäeÒÑO2ÄfGÏÙ£¤š¢Šd#«¨RbvŒ¸Ò:Òù$WH ÇU,­[-¯ÍißÒYúÅæ*‚«C³\°$<Ÿ‰¯1*­áfÈrŠ¤µXìü"zÂfkå=AR‘Nº‘•+Ï«ù*\ž“Û­`D(òŠú¼ÿþI%ag{Û‰›:VØ îšã’™é	Ba"£§£ZøŒ÷ÆrB›ýÕ>´\ÅÂ</&Ñ÷FÆW²Ç‘XAáj=8whA÷/.xX½5².Km\½6ný‘çcwVc,¼i«$ÔÁ ©&ÆF5I¡X¾[9¸`°Vûz%›²ƒNís¬¸&|5;o’u¿í½>ÿ¬›«Ý,šƒ¸âŒ"ÇÍK¥ÏÊH•!|Ìñ·üí»û’Ú«_„Ý:K½x•ñóÂ%§øÞcY¼-Ùü†IOúÔ“ó—Ç´s>iÂXÙ³¶×ã5$X2ï}ˆŠ©—l•’þÆaÄ(ªq|æíéÈWåܸÁÚ6ÝåügÔà=!œÄsr¿Î‡‰NtqË™	‘ïV¸nBíÀÏysú4…^¼Ï¹mƒ¬ü¸Ò½™1­¦6ÁäQ¡‡î}ÊØ•ª=·Ý/÷ž	V
+‚Ìâl$žp5³6•?¿"²‡©N€%
+w¡Ð¾‡µ¼a>xä‰D»ô	8=•um†–2«G>·?B<„V–£1u96uî@TUS4±n
+ÃúˆgØ¢mbHRð©¼Ê%djm.‘_0îô'Þ)¢g³ý>ü ®zŽsÒ˜s¨
+8„ܮ᪵
+'9\²\üb¾>Ü¡×ATþT4U¬þp2¶	K“œ›Î,8û©?þ¾låòð2ˆp:2ÙºâÄñQ^Ù6Ô?r¢y]m½œòÖí4obnñRëR
+›R¨r&÷ô‘ôö½d½ßÊ
+ÕµhÑ8${EÞ.ÚL}ã~Žë•œ±å£‹©ŽÓ³Áåø²+»D¡Íq•FŸ@]žø§!’VkVÌ[51j§nä“T“Ñ+š¯…+]—-¸yi)°:DQ«Ÿ=¢Õ»Vÿ4ºÊë²á\çá¡ÝpÛ†.6Ïí-›‰Ó©ç äµ#ã€à>»håNÓ CCþ†ž÷¼Üµ~À‹
+œÝ-[b
+ÙAëzÅíd;¼vÚ«rø5Ðáîž÷Àœ’E„‰¿E€ݲ@Åf|ˆ1­ ±y)[¥ 
+óÖ&9™¶ûU1ZÚSÏ…ãˆÙÖM¶¥·±zªtö"ν_›¥@[l
+‚5â–×Ü®Q7‡h~šêÍQµˆÊËɶÃÙ<ÈÕ±ŏh'ä?«ÓÛëÕ<ºm×ç¥ÝÿÚˆ5òÛ`ïã3›p»y¢.;<ÂU£s„lÂõôù›×,ÝÒSï—´‘#ëÑ«P¡UZ‘qé¬X9!‚æ+õ¼NéŒ0ãÉüù8Ûƒï§Æâ‹9VIÀ1w¿Ð¥¡Ü…¹:óÐV?Yr^·ÛäsYœ™ý6¦jΧaü§áéSèTÎ]E9³Ø\¾[E:BœFGgŸ•0UÌͬ5Û'Ú'¸¬;j>žXvÁ°/‘†~+û„Ç4È€Må§Û®¥Âò`£®lL 4xév!CqôîSFâM˜¼Ý(?a9Tª&®ØÐÌ&ó§D“žDÆ¢n'½DÓ7Ìq˹3…ܯ€ÒžÉ|†…Óëª6‚iv=Æ\xÉÓGa»tBH+SU${YÕõc~znR¦ÁÛ`5ªºð†I‘MêßÞîÛ %\²g1<“ª£¦­å•iÝKù'uKàéJóíêG¦†7¢95Wk¶FVtßá‚ÐæK «æ›'É!){Fàê3fÖɹÓ˜&Öh¡
+ÆÒ
+‹ïÀ]§³R5O¥‡å^³k#5á‚°ó“ܬ¼ƒÅ™T‰„á>hoº•ˆ#®}^ˍÄ:+š
+µgv,[ŽÏÞu®̵͊ɽ¹r›æÜÈH³žmîñÊZDwÛ	‘SÚ74cd¾a?Î@\:5h*yTp{èOåØíJòÜÔ_|ÁßR˜›Éy¤ðZbü–TNh(mæ—ÉVÍz½ƒxªx@„5ÊæB&Ÿ¼	\ìþž½&V¦6Û`W%º6œsU0+p<´&Ïq&³"Ëï1:Ä®ɧÉß|Яe5lÈ<+ãÎ$;©+:´9bPNï‡n}¿èK½ +ù D•¶Ù²ÌN”k½â¸#Ù\ÿ4”T6µ¯¶?—k¼*®c?’4ê3KûÞ¤®º¤pñSÄ~ryä<ì!Ž_Au½Ág#}§â'3\j©o‚ö­Þèñ5üî|’?ÜQ0Ž›¬•ˆž,ÁªÚ˜¹?ŸÑÜíQµRÏÈ1§81ù«ÇÂî/w½'+ק¢õI	÷	zâ™9ó|EE‡:ý|ŽÒU¶æ¸3©Ež96¸eü˜¿¹¨Ì_%Ñýv6ŒSäÇ.΍sÂRÙøyü⥻1*îÆŠFÊ:336G=ý»yWÂñUœ-7‹ä§žŠÇ?L|ý&–=àŒ{kúš§LŠn¢y‰®ºNŽa¾Ñ{ù¶oí_§-¾¼B at .BßU3Í‹›´’*tÛ¨Ïh´ې×ø]žô=¹Þå›;=XjxvWÜéTBMç+~CWÍŒ·1;ŠmÝÌ{µ	Udzì&óBf{ÄŽarKºNà…Û©²únœÅ³šî¯ÚŽ-€<ÝÄ‹ùþ½t[&ê~Ié\Ã㽨¡Â£aÄʏ‹âl½>¾yx–Ój:ò”x8†«Ú‚²âIq½}?ýCë멸Ïg¢5˪z¼ßà³ÞÚoŒÜл­Þ>Í-®G5øt*[K®-™ª‹&i?ãçUÉÿá‡ñÿüŸHà„FÂñÞ8ïÎø/»sÝendstream
 endobj
-35 0 obj
-<<
-/Type/FontDescriptor
-/CapHeight 850
-/Ascent 850
-/Descent -200
-/FontBBox[-4 -235 731 800]
-/FontName/PQEIII+CMTT10
+9 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 77 0 R
+/FirstChar 44
+/LastChar 120
+/Widths 78 0 R
+/BaseFont /ZCHLIL+CMR12
+/FontDescriptor 7 0 R
+>> endobj
+7 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /ZCHLIL+CMR12
 /ItalicAngle 0
-/StemV 69
-/FontFile 34 0 R
+/StemV 65
+/XHeight 431
+/FontBBox [-34 -251 988 750]
 /Flags 4
->>
+/CharSet (/comma/period/zero/two/seven/eight/at/J/a/e/g/i/k/l/m/n/o/r/s/t/u/x)
+/FontFile 8 0 R
+>> endobj
+78 0 obj
+[272 0 272 0 490 0 490 0 0 0 0 490 490 0 0 0 0 0 0 0 762 0 0 0 0 0 0 0 0 0 503 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 0 0 0 435 0 490 0 272 0 517 272 816 544 490 0 0 381 386 381 544 0 0 517 ]
 endobj
-34 0 obj
-<<
-/Filter[/FlateDecode]
-/Length1 1874
-/Length2 12070
-/Length3 533
-/Length 13138
+77 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 44/comma 45/.notdef 46/period 47/.notdef 48/zero 49/.notdef 50/two 51/.notdef 55/seven/eight 57/.notdef 64/at 65/.notdef 74/J 75/.notdef 97/a 98/.notdef 101/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 107/k/l/m/n/o 112/.notdef 114/r/s/t/u 118/.notdef 120/x 121/.notdef]
+>> endobj
+5 0 obj <<
+/Length1 1069
+/Length2 4336
+/Length3 532
+/Length 5041      
+/Filter /FlateDecode
 >>
 stream
-xÚí·UXÜͶ¸‰»ChÜÝ	îîîÖ—ÆÝÝÝ%Xp÷àîÁ58	$¸3ýí}ÎNÎùÏÍ<s7Ï-æ@ýÿžªü·œÐÜÊÕîÊ¸˜ØZ™‰Ø²Xþ²r–´ò-ôþshÿB°•Ë_¶rýÁVn!ØÊý²­<þB°•ç_Ö0™˜ÿÇõÀÊÆù_á?÷Ãÿy1ŠŠ:xx3r-¨ü:¯˜‚OgûÍ@Ëj(—F^âÊàð!P",5™J<Âç؏¥^Ó­œ’»?—¯u-gyHÓ0.ݝ߳t‡>cö¸‰4‹¬
-qì0±:tcŠlùžµêW
-þ ÙÕΪ1pžzÑŠ×}:ãXYÿxÛJi¢l3p¼^øE7ì]RK"›µám( ͺG蕐|<ä/çãÌÈöCºZFÜQ·û©a…£ÙËÿâ…<†.w=˜µú:}šñ´ÇËkÅJEá£ôÞ¶nA@ÎMNbeË`s•)+&‚(œ.²B–e”¨Ô5ßéo’CŽ¯í~éÒ“U'-Ë	l6¼íj뿼õ`»OÎbg*Qž–Q0S.“õJ¤*ï·†ÆG|U{1kCzQ³Í2˜Ë9Æ‰í¤è…æ;mÌê\–>c
-‰8žpMëò|aZìJY!hZ»ˆëýÑi¥I¶M÷kBÑNþ¤&_bšøfÄÌE8Õ.•)dÁÙ²!C‘¹¡…M¸OvLŠZƒÝ­¥öWÛŸP°•‹Y¼ÜÆ…¥ƒéGª™Ž¬ÍËg7çG/ÍÒ+3ŸûìL†áT|HG%ߌºE
-+žw´TžTþ>ÇÌ2Ù½},:{g­
-—ûà9Ö|\D5TdcÞË.à-,¹Ä%ITxîhÃ]®öàP³De?E­v2ÐÜ;Ù:€7Ȫo¯N- Y64éwò“²G§@HÖYpòÎx"™íóq-Tõ7’Ê iWëÄ:rµæîâ‚Ù¿©‘¥º÷%ráŸè´–ƒ‡ívf‰‘p;¯(Y¬ÈFXfi8ܽ†]ÑC±?¸×Ý|4µàŸÿ—£þˆ ß9Í­dÔ°Kù“a‡)Æ“YϏ\2b®"ÞÔKÒ‘=ÏÜ,ó8ETÔìGs¾€I±¸Œ	q¹‡.àéûGÒ¬9I°íƒöd±ÈÒnI
-Ë#Þf†du>¹±¼g6nyºçóÄgqäΑ@ÜC­¦Æ„M4‹$l7Œ¦Ä$Ð{⯤F”îGcÖ3þÌ’.èûtC$?Êñlùñ5›9ß>,É•à¨)l8÷©?-=4½$`<klÑqÆìZ8B_i4þ0ôJi¦à˜C“§*k±5À¿fŽÊ²êÊ›ÈE;”õõN.÷"ûlcl]\'…â žÈPs*ÁÍæÁþˆý¬ÿádwE¬Ã€á—ïÇtF¶
-‚dzWTÛQ^ç§ötƐOHCãC3ÍúÛ¤)ÉÓ´5	®°Ñuž?Gg\a>¾8G&ö´!ï‡-—>ÞçŸVãТG„œ<†ú‘õ“½Gi™‘Þh¡QĆ 9+t¥³ªcŸƒ¨Îô>˜ÝìÆþæñqäAa»ß¼w¥€øØÀå’+êeÏôÒ%»m%VÞ°_` _Rô{Ϋ¨¸m-Ú²é	x	¾"Ÿß‹²79£¢ÔºWpU‚ôI@”X_ü®ÓdsâKÒ½áè™;È)òa÷÷>¥zñ„ðw¾ªFԽ–ä0(Ô{œM7©,%­Œ:û¡Y¶*t<Â]LSÅô{D[$²Ÿ
-¸	¹åxGÈbú1á³Ð‚ÂÍ6Jï\u£zñƒÝ`Öó”Þ+ôŸàk]ü¸vŸ†+8ñ€²™mpÃ`°4}g+ƒÖ¯ó¦yÏ'º²õC(
-Ë'ª	ÚïõŽâŸ¦úWSYqsq€Ž.]m2YÜ–‚¦s²ÉRU²G0ÿ¥!D¿ÀàEê@<ØÔ–ù¤éÀÖ£¡Ú:›­Fê‰Ð#÷w΂ã8ı¼žn¦Úuƒízô2‹ˆ{½*–~­°°d>ïmBT,S…‚†Ìfÿ}£^ò1Qn‚ËüµuGöv-×°Jö(ʧ(–dSf€žÂÏZh¿ÜŽÞ‘5֐åHÒKD0æ
-.gÑ6ZŒÐTìÅîVf¿)@%å—oQñZ_‡ù3;xÇDîû–L°U*ÎÙš/$J¶Ûi!²i‘J¶¢g­X‹R-(‡»&Š×ç_d·v;%±ŠGEìUÏû>³#íÞ¦‰CíkŸ’îp—ÜOxNò>Ë;îÀ£‚¤éá½_‰­A†{‰­ö´£Üm_à`p–J·fÒ-!£é%9íA™â‹
-ßÁ”3ÉòÚÓ7-IƁ˜ð­@Í#6‰f1UÐȃï8½ohm5¹Â®L%ó6:··Y¿þî2ˆ$Oˆ¤*µ"ÎÁ©éƒ©(t‡È%Š¯ÊA¨!*1ðõC€¡ÚÈôñåpÂøÓŽ¯–vn]Fž”eÁg4Qÿ6,£ºn¦ò^+¦¢Àßò]ØÏã	ËÏ·é1-1§ü µ7‹9É4R½0K{ÏŠÆ„ü[îGÌÅÏ©iZÚ͐óf„ÄìlÛò'怖åB÷wÈ~:ƒŒ—<ýBÖýŽ}ÙT„Y(t(PÔ$ˆo¯\X’Ü®åú›8ã‹Ë‡Õí™ÐåP1'ÄÍòHI©Måì§g'f¼Ÿ8í3mHoóéž’NHÁ_¦îts–0ì~7;ï>V[;6f@~„ÿåÊ£4SŸ!ã-ë¡l\#—l z‰VƒH'¶
-É!]1˜í)Ëæ<²¨ÝÝÃ<‹>UÕÇÜ2¬A¹-z>@ÔÚêå"°QrõEZ”Ë¯?…´o„êjֻʣׅ.å·þ¹…-HPÐ¥éßž= ȾNºÃ¼°zŸsèuªÇw@>4"DÔŠ² švÀ­´é%RW¤Ö¹…[®g|#ڝ|S
-WýN8ïªòÝ`oÂ/`CI/†ÖÓßÛ@$Ь`…@‰ö.‹àH™¾`u„àÎàWO.EPÏ –ð†XÏBÚ0ê™Ì‚Sñ;ùãz}”»Z…]¦5¼|q¶gl8Š¡WÎÅû¼%ÆÑ»+jRÞ½ÖÎi/"§íö¤Ä†£!.×QØŶÓ•Dr¦[AëŸHzÉ-¯jÏ\äL¾8{—zjË€b,,Ž×ÆûïQ2RՐ0L<åtúvä]–.dÁ
-–÷;åߟ"‚S¢¥6"]¾ö£ÊK~oÌÏ‚´~ÏS`ô“d‡<2 ·áH¿¥ž¿Ðr]éð^“V%Ùû4À8Í›òã˜gÔ%ÿ~øzˆ¨Š“¬#„òM™›zzc褌.+‰iJ|®lm[îD6l¯]e!C€ømú
-ù^J=ªHµòw4mІÞB÷?ýǧÚ[óóTP®õº)yÎëy	Ô3¶[Üï[vGêk?B©Hü¹¢÷K•Åz¼bdÖû’W³¡rg™1WqŒf¬#’Ä‘©¼¢÷V×v.<Ýù;÷·–hã‹ØFä•°vµ	’P)’'š_…¾Eúb2JFD¡‡6Ì«@¡à¶Ý$˜§œ–‰@±J]WÍÊøXq7Œ|‚b– S²2ØgÒÒþ„ó	II·’?ÜÁÙ^cQå’Ô;–žÊ`ªk#áAY÷k&wáõ>œë—‹A/=[EÁìmª¤>[-^+_¢Ï`òÄ(™Ô”¦ÂgÓ’"ÂÆéæÕ*âñ]ddÜK³p¿ÏÁÓ8J%ˆv(é®ÄW'íŠ5¡«`¦ó;SO&ð¯¼:>âiÖ!#7Ó ÚZu´p=“šß3`)öća?fVÙJa¤)6…>›½ðÒ¡ˆ;
-ÝNíÕ-c
-ÓÅŒW”VÑÎäFzÉën|&!áëÜ>þñ%,ՏS“ÉðBdØavƒÁðœŠ);Æl{Œ!
-åkÃJWƒE470ýᾶ'›ä*ÃZœ5õ¬…6;‘#{<ÞpÐ!ÞKÞ3­Çvd*Ëþ1Ø&þ¦œÉ2h´Å§¨ƒl;]W8Zí\Zž¼ŲٌgsÞo‡Dô,u´†§õ¨joÖ„žƒ{¨Í	t¿wÐ]Ø“ {ZÙ”]š8ù4&àÃq×&aÛç¤Ãe¾w®ó¤ÊÀtÒHÄM³-¢3Ó‡DͨubºŠÆªÍ<KDs¨”“[K‰NùÚR@ÙIJ|Þ;1N4pmLä,/ä*/°ª/þ)€ÿƒ³^–l7©à‹=,©W~õqÄž|-8ŸêŽÃ_ÿ­ËÚOýÔ±ÜwŸ0÷Ùdæç¶\<m†"ö>ÜÉ»S8šwI‰%öÅ‘ïßun¼FýÖÜ>z63ô‹Û¶[~û¢Ê[Y
-‰ËûàÖì0éÉõ—^ÎC›äL•©†Ÿð§îY¶;bo«´œØ¤œþ"és®
-?…©`±{³¹þÍR«€¦†Ü/ÖÂ1=Š<ï‘
-_&РQ¢¥VTÇà?'O±<²Ú´G¼Z¥¿;Ï´51Tz+s´ºÁÖèn"Yèno†×àâF¦Ò>ìPX»#\¼“m÷Ív S.3Ȧ¥ÐúŽšŠÉÍž3Èø»
-÷³¬Q¦qhÑ\?/üg6Ôâ-tE²CY<4Z̤_Xй½¤·é-`*{¤®Óü*ûîbëõ¸²ÄìŽwNHZ¶OìѸU>ðÂ5ÖÛWrM.8 þÒÆX(«üÀâ Ãìï5;J”èµFdÁ¡»ÀàHÑQ,Q}ƒˆ\ìÖg1á¨ìßÖ|jqÎaòÓ¬ç:(v»Q’V¶õŠƒÝ«úÆåaM3 ïv_jáNqé!Ù¼p“ÒÜ7<ã´i~
-[#Ž2Hã-¥é×/³MånX-±tìc’¯„•[Úߌá ±7åLë;ò©%­SE•é8_ôÏÕ¨µCQœ½ <"U~rä«Ðœ1øýÆ‘ ¯?,XºXÎ	ÖGBÊXuH}’¾=Õ=
-O_`·mYÄXT™åIÒ®j¢«yš:FQÜ5{Ó¼
-¢õ¤í­ÅñÊêEeÔÐ1J}ôE´l—T¢ ;ôÍß^%g3?ãõ`À9šmåñ}‡=¼KpŠÄÅ>=؍³„š4ÒSTUºÐRçO%2‘¬-RÍýB1DËöÕ3ÛIôµ<Iâ‹ô¥ûï
-vjxþÇ"6€kš¢’/+,ÐJ®Å]ÇÂëá¡Ð×éä’DÍnа˜ÚÞV8Zº}Ùl+¯u5ŠV	/ÜF]‚¬x—ÝË÷»,òs
-Áï}§zP#4æÑÉùnŠ¶Ñ#Ϊa¹ý?ž4Š(Q9Çnº›gæi¸¥Ž’9WwBÀ㏠=¬>wN ¨JEÄKæ§r1ž/.œãä¿~~y`².!ÚpBÓ?¨Ç|/N.ÓôCØ--ôÛI»4ÖÓ¡óøQ}€žè¨Yn?ËZ.ž  pyì‘W½/ÿ̻޲t'ƒÜ]µn©ðXý…ÑGSb¥‰Ùnºud½Ì£?r¸»´1¶)î@â“@ë$¢f„×Ö	\¹ÍŸÞ(£‰È¹T6¤Ü§ÒjºÀ„;w7~É–Bo »ZÏI¤Wìù¹ $(Wpa“üœòY¡¦9ü¡ê¼JƒR‹žùü>»¨®§ÝôãW,"JQl³”òqÁå"k¤˜|’•9²3ùzÎHJGŒƒIF“=ùTÑÌiö€Ø¼æùüƒ´+ìŸÉ2͉=<ŸtñÕ¸4_ŒÑÔnù¿tÁg)ï!úmj‰£ÎÌI°î/Œ^IÐH–ÝU(FÛ-·7ùß”ÒnÙÞ–·šxü̃jêW%Ò (üj Y
-„à¤|ÎÐöÖKÄöÙB™áõE©8|èšxµ-Œý°”0¦›9W³È *TÔFԁ!‘N‹¹ËÛgd	»±‹b{¿ŽZ2»i¢a²œ†€ù’1ìŸÄPÅŒ~ñb¯Ó7:åDªë*éÐã‘tLóä=
-Vø¥zHë¶s!TMD‰„è=tIpï7D¿s¢Ì*´¶¡•~·SEÞUDˆÈ–¨ÓˆX5Óüêè™Qò`¶EX§ÄF.O“5øPØ­PþpDúÄêè^ÿ#ÀêºÇSê7vúh}ÿvÿi©¡g›Í¦³@±"n?_Ú<O½û姉å{Z)ôðv¶‹Œ´âONc+²ÐŸºlË΢®gn$?âZeó)
-Ä BÅFGB'“¦OV‰.^ÒàèvV$•Z$
-ɨÑA9K)ab¥©=Æ?2òút+#ûJ7ÇÞ+X¤Kô:À½§ÉäÃON'ÜTYÿ”&¢R’‡UûsÝ=Ú…[m‹3×,ŠúzÄfJd…P¶ý}+·i/4Eý€Úéá¦ÍHPénáS
-ÚLƒ"RÌ1é>ŒÊÅrßíÂ>6lœºJ±ìDÖ¾ùHfÐhdª'ÝÄX³ûü‡å2EEùt|jt‰ä÷ãURJº8b÷ö°®„)ß^?'´ú'Á
-÷…C(]>09âr69LÕ³dØ£³…yâ™)‹ìR5lÜ™žY_QÜM¸âāú )L›­Ž™¥ùÃ'ÔW}V@¤»úûòÓüæ æ­{8ñ°¯þUNrta÷ñJõwVt(q­ëUS’,aÖ.>-]¾GÞÜMm_½W+ÞÃç$k™O»-ú6#Å}ÎÇZ>)¹K	Û‚[GîZ6©áwñC_ne%j “Æô[oK)Wÿ‘´³Tø¾Å®“x±U"Ãᆴ
-¥{2uÏQ¼ŸZÑ÷¶š4ú!E]€13ÂÓñ>/Áº5SJ¡g«K[ýlj¶ĝâHOZj&c9†õ`uÜÔŒyÿB"GkHLòÁÓû
-³N3
-ù(~;¦þ
-k„$÷Çû¯å˜TMÌh6IºÈ1«ÈÕ¿¥5z\Ú¼;v0e!^hsŽ"›óÞ¡\OõCV¬¥€”c×ãh"Ñg¯‡ñ˜Ä|ˤ««7í&ò§9Ù˜Ýw({ƒ>ÉÝtÁVM¬ì4¦–ð…¹phähÍgއǧÅâbÜ®äjò5Açü *@°9‰c»åOx?òR/Wà‘
-s—žG²<ä_/W-O¯Œ
-adžOõü4ßÝX¤MF‚ä½î“œy®xÇ°Ök}*qÒ¹™ÆôJ ?E `4’½‡He®“a9‰pðícñ+*áw¬.fÅ$¸‹´Æçï‚Fí—²½Çß“Ö$0(H—#Ÿ‡v=ÒŠ$dêÞ	ˆ<™ùÛd-%˜ÿn½ËÁíѾ-ê‘ØÐ[“ªï-¿áÌÉ9ch¡7Êx_´©¿ C@\õü!ˆÝs©ü18-©Ÿ(c„ù™à
-ÕèòŽ†ýëy…I-N„`» cz¹äûmêšè~êð1×zEQ¹¼¯µμõ=F÷$ÖàԐI}I 1ÙÖê{òýk<3yD;ÝñxaÛ
-ð*¿HTòMc7a»¨Pý*å*Hºã/¼Â{¸Æ:]¨Ü'~LçF1…Î EŸVùÌK¹›”ýByv¥ïh,zÔá­‹}\–Æñ¾ùž™çyòÛŠ1×Lê‚ûÅfŠæ¾_vQ2ai»R\›§ßŠä›kˆÀðW%JØïXÑd-7H¤©®—‰½9
-c¯Ì82Qôÿá6-endstream
+xÚí–gXk·†¤JU@Ä¡#-	%¡(Ò»€4)R"	I½7EA¥JÕ€4Azo
+¢€téé å‹îóm=ûûyίs™?s¯µÞç}fÍšk†KßPT½ƒTÃbÜD!bY@ù†@ÄÀ4||Êx$Ü
+…ŨÀݐ²+#ÜqÿNy ñ®DS€ Ñä€hÅ ½ÒŽ¤‹%î…$:ùß0õOq5w4ZîüSþg“þ#
+wF¡½ÿ«+C)(+îc;†ìgßÔÝ­÷NÕÑ'%Q9Ì®|¼Ë&_ض-¨·rÕV!¬JwâБóôi¿±»;‰ïþÕ,ƒÕë.ƒ×sK†¾Ž	=|Úz—¾Àbfô1÷ü¥+>º%iÌÙ¬´öû¥M·ÅC7»_j‡x¥¥¼\(Ы*äYÙΜ𗑶4`QoÎÍ‹)'×tÇTÅl©jiúx_w^ëWÅƈ@ã-¾ëŠ=yöd·]OóÞ¤NM‹'ün¿@jq2g0kRº<ÿ™@ƒ&¤òÄw]ÒŠ®`µó@wŒG þœRÌŠ£<hünÓHVQ¾©îÂøÛ‚½›awá¦Mɉ͚èJ”è'Ò‹(_±¾>¾æ'ƒ-6tª­p.̺¥ôy¼r3s„*½ILnÎ&6“Ášäǯ³ó)4¥z JÎ BçšH;xÆ}bLfÞϧ–Àºú¹—>¯x“Œš³†)–t¶úº‚Œåb¶<áÜm…/cÆÈvÙ…à;Ý -3|ö	üü{>ѲÌyCmí.“h^ç
+‰gÂÒ]süÑõneEA±“Å{þâ_°7zx>}§ò„lv….»Ê2‘J‹w9ü¸s/;ÁSy7˜ëÆCBCónÉ9®>O—]Á£Ô¿cÿظŠˆå{òÅúúü—ZH"}ýu$K—ÛM)®™ÀÅ’|)üÐ+þxð4åÔ-%^øù°CÓ:d2I¬á¢Óda»1º\nÓ?¾‹&—Û+	géª,<P+‘žE¦Ê6z6øÄAØÙ”2ïËR~Ñ´kY!=v^=
+K—G ÕIÓ˜¢ÁŠ¨×:l,œáÝ™)-ÉЭ²‚HŽò(aÛ*Ë+/R²òÌŽvU ?/>ðGÌ¿°p8ä“Ó8,ìÒ`uÎ §•2hOT¤Ð©;„Þېô_•RŽ¶•ü¼½³;'PËýÒ‰n7š7ÒY¹'hy<¯~𚏲ו†Õ†Q”jÌÄþÅ°gá},ç¹aûêrIö"7‹ýqÆÂUís&ßù^ú“S·8f»8¼[€n°Ë–ÈÛm6†/.péšÝ¼ÿæú™Q&€Åüá„¥nÏ[ÿáWuÚÒ‡9¤‘_§c%9®Ú…¥°wï,áÆš{‚·ÈÝ+o½Ùè‘.|\µuql¸YÞrnÑ‘~~(ønÔ¤0Ø5L§0x’e¬ɸì\¡õñ=‰æ˜bÜÆ5– Çìå(ÑŠ“5´ê“†¯•GëwR*c=·R’Áå“9_O×Äúæð¶îóOp?ãúŽÕ‘¥¹ý´W¼¡'0<a+Š›eD”’Ú8vÂ]F
+€Šó>Œ-m¢íDÝH2^8‰)¾G{–U¢;‹1÷‰Kßå€[n^¹šŽã{úÔt?®50÷Ÿ¬çø¬{ø‡ðqv2ÓJ~ZøÜýúA)¡{£n	ôíd¤ìäÒX“¢P<ã'ÒSƒ™aµÅL|'ÈùBûM©,/[TÚd‚†^ú=‹žH—µGJ!ÕíyÑ5šú]DPXóÜÓ6ø±)¢›—Œlñ1_‘Rrêî±¥o’f)÷L>LÕ¬—œ3œ`^³BÅT’"›é
+s2>>Ù›çL6¿Þ‡µësjµ×©™ä¹+Ùu-cuª‚œ‹½eÖïQÚ¡§Ñ»”­Ú³Í··Ì˜$““£gƒFB]Óh½ž‹Ÿ)8¡ºÞ¡Õ¶ÎÕæëãë3	}4.û+TÈ=´Ð‹2~#™2QSÙ#ÿ¤5GQVBú¬iS­.œOØ©¬Oó#:9ß×’†|{eG妮Äví¨B¹==Þq¯µ9—ƒÊöœÕÞ qSUŽ/“¸æh9¥ÎÉ™:MµÓÕýµ¤L
+‰;’b†ÐrWÿ@±¹yÌMãÿC¶h^‘:²~e®n\¦Òs¾ÎäööëúšuDùã‘¥Ú:‡vBœîôqG:ˆÞ”suì7žÁý«'Í,¿–}I†ë1¡]¾fsüð›ñî´Ýto׈\Z‚M=uWgˆ^òmƒ	3#}:o×ÊÞ™G”U65^®oj%Hwžœ’©<œÁâáÅ´–/Y0»ùÛ$t£„°fs²Jªöš~§½…§F¤xn7ˏ\8Å”™ýMœL¾þùXJ”}×ÔÆâu
+Ù韫ªmº™NÓf)L
+qvt <÷.VÞ†rœ±Jw÷ȽFz=Á6?bèiôñ«¦Š+Ç6(È^$âYkô2Ÿ§1í—Úá°¶–•—ƒ.(g_ËãˑY&¾Ñ8Í13	Í÷ÁÈuò•yãáãÎ.÷àp‡“ãxÔÅqæ3]v„éÆ‘xT5ˆ%}âEAÂÛÕp1Ð)æj¡N²0E#4°Üzü¨º‰“Ò”É>øf^}lÝ¢’|4•{ª¢ªÿ}ÇàŒl^Æêƒöϲ}«·Sœ‡¥À­Ø™;Õ¬LÖEù–”9ö"oÀÍööŠ÷f{]bŒÀ½ÉäÚ2ïäJ¡àdÏRÅpT¯5Es¯ò	Õk^þÀ”oUt¹ShÆïM¾_läeÈo'ª?yn.õz'í–C+ç&ùe].}ƒG¥Ž™W•½îPZ•8øu×JºH³f$KÅ-’P¿ù$_®Øʶ­ä‹$~ÏH|½íìŽ{¬³ÁÌÙM^ü}…üÍÛ"æÍt,©ÚÇûp÷¦o­¨–›—Í”f”t–qä~Õo¤öéÛ‚=®»šž…H“>S'XêýéRÈ:kyþÜŽº|š+w¤HO‰‡Z”¬pS©pµjµþ:Ç6•ïÖ$™1æç{|ð±´{ZêüŒ]GæVòª™/_;Ï»§r)Úµ>OÙØÙüÕ%˜YH,¢„šÊÈ/j;6l_f]gŠ>,tœ
+¼P\{°®9Z^¬Z‹'hœˆ(Û5 3¶YÝÚFóéí3ý*ì…†åÉìÙüË’œ*kãëx¦<~.7O%ýC‹k)ñû#-ä›M-éÞ陵¨ê‚xªí§ïG®àãÖÖª¬›ú“Øç*¸°S¶ŠO^ŽBíM^“?סîxCUªXÒdîƒðVà`K£»˜ú[’,æ:Ý¡Ôg,oÚHóñ¼P¯~Û/!Þ:XáÔÓ¯i7®ò>’‰mRªFÌ%%ÀàåÞîöåØ×ëA»Q¹Î‡Zç:Ík®-h“ñ„;OúÚ endobj
-42 0 obj
-<<
-/Type/FontDescriptor
-/CapHeight 850
-/Ascent 850
-/Descent -200
-/FontBBox[-29 -960 1116 775]
-/FontName/NENDNC+CMSY10
-/ItalicAngle -14.035
-/StemV 85
-/FontFile 41 0 R
-/Flags 68
->>
+6 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 79 0 R
+/FirstChar 39
+/LastChar 118
+/Widths 80 0 R
+/BaseFont /NPUWBR+CMR17
+/FontDescriptor 4 0 R
+>> endobj
+4 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -195
+/FontName /NPUWBR+CMR17
+/ItalicAngle 0
+/StemV 53
+/XHeight 430
+/FontBBox [-33 -250 945 749]
+/Flags 4
+/CharSet (/quoteright/hyphen/A/G/J/P/S/T/U/a/b/d/e/i/l/m/o/p/r/s/t/u/v)
+/FontFile 5 0 R
+>> endobj
+80 0 obj
+[250 0 0 0 0 0 302 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 693 0 0 0 0 0 726 0 0 471 0 0 0 0 0 628 0 0 511 668 693 0 0 0 0 0 0 0 0 0 0 0 459 511 0 511 406 0 0 0 250 0 0 250 772 0 459 511 0 354 359 354 511 485 ]
 endobj
-41 0 obj
-<<
-/Filter[/FlateDecode]
-/Length1 777
-/Length2 594
-/Length3 533
-/Length 1156
->>
-stream
-xÚSUÖuLÉOJuËÏ+Ñ5Ô3´Rpö
-Ž44P0Ô3àRUu.JM,ÉÌÏsI,IµR0´´4Tp,MW04U00·22°25çâRUpÎ/¨,ÊLÏ(QÐpÖ©2WpÌM-ÊLNÌSðM,ÉHÍ’œ˜£œŸœ™ZR©§ à˜“£ÒR¬”ZœZT–š¢ÇÅeh¨’™\¢”šž™Ç¥r”g^Z¾‚9D8¥´- at W¦äçåT*¤¤¦qéûåmKº…dgaqºán¥99~‰¹ ãÁ…!Ÿ˜›™S	U‘Ÿ[PZ’Z¤à›Ÿ’Z”‡®4<â8ßÔ”ÌÒ\tYÏ’ÄœÌdǼôœT]C=cSˆDf±[fEjJ at fIr†BZbNq*X<5/Ý)Àà;DßÏÕÏÅÏYµÙ€Ä̼’Ê‚T„r0ßÁSQf…B´ž!P!ÂX±h¶¹æ%ç§dæ¥+™š)$%VrSgªPm¨™—’Z¡Zt²¾^^~	P‹0ljÒò‹¸@ñjhn¡ ŸÜԐ¦Wœœò+ªu,t-Í€&š)˜››Ö¢*ÍË,,MõtQ0500°0‚x-¹´¨(5¯œ†€Áã§eƒ65µ"5™köÑLÆxYí¯	_\U
-ßuâÜÍ
-³Ô£6JúošÄÚ”ï7=öܹãÚ:ŸvÌ<sOþ¦é…¹Öœ9ÇvØÜ÷WÞ¹Œw‹ü̲5ÆFÉ'9î¼?»×§…é-Ãâ¼’öd_ŽùW¢¾,î
-[â¨cͽþ×ëÂê÷æÿ®jIØï•.±á¸M¸ ëµ©EeÁ¬‹~¿?vâ[APE_:óî¸'SÛ¹OÉZÝ0¸:}‡Ó›9NÖÕmï}^ê5QËÅþ¬Ë÷ÃËþY†mX%WáµîØŸ½ëxÊnÍå²Û¾³+Éøæˇ?ðŸÉÖÉš½Èêsç³ûÿýþ¾ÇzM='û‰xÍSózÕi|_Þ6o™Í¸£øó2ËsŸÃ”f§”/hœlÿÞzŸöÜÿË¿‡¦oüå[<»\¿7Ý/¬ÔäØÑÝÏ'íSØØRô}UľÅܽ÷Ïpµm»aس¬ÿ‘N×GëëáùONEUýdˆ[zÆïvåÕi}þo¼ë£æmýðä@ÇÙƾ3þ¯½Þt_š!ýÉ8¡d›3ãákûe»/[S·}ÎTeÿ¶¬×æw\¿ðÎ@ñ¸÷ï„m“\ê'Ïå[µ,úW$cïM¦ÉgÏ>6Vé|È)5]fkÚÓí"Y61|QÍŸÁ{BÁRÐIJçM¤}•Ém‡K®ñûk¾ØMW(úÄWÁ°,‹æš•-¢éYÅœ¿ƒÏ-VÉŽeÐ==kÌnÏ…
-:~§ö;]Žê¸sææ÷Úν·WoÜÚ÷hetº–7#[HÃ$ÆÒŠK±S¡ÆAßÇóZü
-™þO‚åÛô¢ò×
-g…¼<þi@!à5`Xœ“šXT’Ÿ›X”ÍÅ-endstream
-endobj
-1 0 obj
-<<
-/Creator( TeX output 2007.04.23:1418)
-/Producer(dvipdfm 0.13.2c, Copyright \251 1998, by Mark A. Wicks)
-/CreationDate(D:20070423141904+01'00')
->>
-endobj
-5 0 obj
-<<
-/Type/Page
-/Resources 6 0 R
-/Contents[28 0 R 4 0 R 29 0 R 30 0 R]
-/Parent 70 0 R
->>
-endobj
-32 0 obj
-<<
-/Type/Page
-/Resources 33 0 R
-/Contents[28 0 R 4 0 R 37 0 R 30 0 R]
-/Parent 70 0 R
->>
-endobj
-70 0 obj
-<<
-/Type/Pages
-/Count 2
-/Kids[5 0 R 32 0 R]
-/Parent 3 0 R
->>
-endobj
-39 0 obj
-<<
-/Type/Page
-/Resources 40 0 R
-/Contents[28 0 R 4 0 R 44 0 R 30 0 R]
-/Parent 71 0 R
->>
-endobj
-46 0 obj
-<<
-/Type/Page
-/Resources 47 0 R
-/Contents[28 0 R 4 0 R 48 0 R 30 0 R]
-/Parent 71 0 R
->>
-endobj
-71 0 obj
-<<
-/Type/Pages
-/Count 2
-/Kids[39 0 R 46 0 R]
-/Parent 3 0 R
->>
-endobj
-50 0 obj
-<<
-/Type/Page
-/Resources 51 0 R
-/Contents[28 0 R 4 0 R 52 0 R 30 0 R]
-/Parent 72 0 R
->>
-endobj
-54 0 obj
-<<
-/Type/Page
-/Resources 55 0 R
-/Contents[28 0 R 4 0 R 56 0 R 30 0 R]
-/Parent 72 0 R
->>
-endobj
-72 0 obj
-<<
-/Type/Pages
-/Count 2
-/Kids[50 0 R 54 0 R]
-/Parent 3 0 R
->>
-endobj
-58 0 obj
-<<
-/Type/Page
-/Resources 59 0 R
-/Contents[28 0 R 4 0 R 60 0 R 30 0 R]
-/Parent 73 0 R
->>
-endobj
-62 0 obj
-<<
-/Type/Page
-/Resources 63 0 R
-/Contents[28 0 R 4 0 R 64 0 R 30 0 R]
-/Parent 73 0 R
->>
-endobj
-66 0 obj
-<<
-/Type/Page
-/Resources 67 0 R
-/Contents[28 0 R 4 0 R 68 0 R 30 0 R]
-/Parent 73 0 R
->>
-endobj
-73 0 obj
-<<
-/Type/Pages
-/Count 3
-/Kids[58 0 R 62 0 R 66 0 R]
-/Parent 3 0 R
->>
-endobj
-3 0 obj
-<<
-/Type/Pages
-/Count 9
-/Kids[70 0 R 71 0 R 72 0 R 73 0 R]
-/MediaBox[0 0 595 842]
->>
-endobj
-28 0 obj
-<<
-/Length 1
->>
-stream
-
-endstream
-endobj
-30 0 obj
-<<
-/Length 1
->>
-stream
-
-endstream
-endobj
-4 0 obj
-<<
-/Length 33
->>
-stream
-1.00028 0 0 1.00028 72 769.82 cm
-endstream
-endobj
-74 0 obj
-<<
->>
-endobj
-75 0 obj
-null
-endobj
-76 0 obj
-<<
->>
-endobj
-2 0 obj
-<<
-/Type/Catalog
-/Pages 3 0 R
-/Outlines 74 0 R
-/Threads 75 0 R
-/Names 76 0 R
->>
-endobj
+79 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 39/quoteright 40/.notdef 45/hyphen 46/.notdef 65/A 66/.notdef 71/G 72/.notdef 74/J 75/.notdef 80/P 81/.notdef 83/S/T/U 86/.notdef 97/a/b 99/.notdef 100/d/e 102/.notdef 105/i 106/.notdef 108/l/m 110/.notdef 111/o/p 113/.notdef 114/r/s/t/u/v 119/.notdef]
+>> endobj
+25 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 81 0 R
+/Kids [2 0 R 27 0 R 33 0 R 39 0 R 42 0 R 45 0 R]
+>> endobj
+50 0 obj <<
+/Type /Pages
+/Count 5
+/Parent 81 0 R
+/Kids [48 0 R 52 0 R 55 0 R 58 0 R 61 0 R]
+>> endobj
+81 0 obj <<
+/Type /Pages
+/Count 11
+/Kids [25 0 R 50 0 R]
+>> endobj
+82 0 obj <<
+/Type /Catalog
+/Pages 81 0 R
+>> endobj
+83 0 obj <<
+/Producer (pdfeTeX-1.21a)
+/Creator (TeX)
+/CreationDate (D:20070628000323+02'00')
+/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4)
+>> endobj
 xref
-0 77
+0 84
 0000000000 65535 f 
-0000090280 00000 n 
-0000092043 00000 n 
-0000091696 00000 n 
-0000091896 00000 n 
-0000090444 00000 n 
-0000008923 00000 n 
-0000028122 00000 n 
-0000027938 00000 n 
+0000002779 00000 n 
+0000002664 00000 n 
 0000000009 00000 n 
-0000033601 00000 n 
-0000033415 00000 n 
-0000000985 00000 n 
-0000039334 00000 n 
-0000039145 00000 n 
-0000001886 00000 n 
-0000046799 00000 n 
-0000046611 00000 n 
-0000002816 00000 n 
-0000062083 00000 n 
-0000061897 00000 n 
-0000003717 00000 n 
-0000065044 00000 n 
-0000064858 00000 n 
-0000004665 00000 n 
-0000068015 00000 n 
-0000067829 00000 n 
-0000005649 00000 n 
-0000091796 00000 n 
-0000006633 00000 n 
-0000091846 00000 n 
-0000008825 00000 n 
-0000090546 00000 n 
-0000012202 00000 n 
-0000075561 00000 n 
-0000075375 00000 n 
-0000008984 00000 n 
-0000009711 00000 n 
-0000012114 00000 n 
-0000090727 00000 n 
-0000015475 00000 n 
-0000089011 00000 n 
-0000088816 00000 n 
-0000012264 00000 n 
-0000013198 00000 n 
-0000015376 00000 n 
-0000090831 00000 n 
-0000017841 00000 n 
-0000015537 00000 n 
-0000017797 00000 n 
-0000091013 00000 n 
-0000019992 00000 n 
-0000017903 00000 n 
-0000019926 00000 n 
-0000091117 00000 n 
-0000022074 00000 n 
-0000020054 00000 n 
-0000022008 00000 n 
-0000091299 00000 n 
-0000024172 00000 n 
-0000022136 00000 n 
-0000024117 00000 n 
-0000091403 00000 n 
-0000026107 00000 n 
-0000024234 00000 n 
-0000026052 00000 n 
-0000091507 00000 n 
-0000027876 00000 n 
-0000026169 00000 n 
-0000027810 00000 n 
-0000090650 00000 n 
-0000090935 00000 n 
-0000091221 00000 n 
-0000091611 00000 n 
-0000091978 00000 n 
-0000092000 00000 n 
-0000092021 00000 n 
+0000090585 00000 n 
+0000085270 00000 n 
+0000090430 00000 n 
+0000084456 00000 n 
+0000079003 00000 n 
+0000084301 00000 n 
+0000078094 00000 n 
+0000070609 00000 n 
+0000077936 00000 n 
+0000069279 00000 n 
+0000054466 00000 n 
+0000069122 00000 n 
+0000054122 00000 n 
+0000051739 00000 n 
+0000053967 00000 n 
+0000051395 00000 n 
+0000049007 00000 n 
+0000051240 00000 n 
+0000048176 00000 n 
+0000041916 00000 n 
+0000048020 00000 n 
+0000091377 00000 n 
+0000005512 00000 n 
+0000005394 00000 n 
+0000002916 00000 n 
+0000040611 00000 n 
+0000027165 00000 n 
+0000040453 00000 n 
+0000008395 00000 n 
+0000008277 00000 n 
+0000005605 00000 n 
+0000026849 00000 n 
+0000025464 00000 n 
+0000026692 00000 n 
+0000011229 00000 n 
+0000011111 00000 n 
+0000008535 00000 n 
+0000013624 00000 n 
+0000013506 00000 n 
+0000011310 00000 n 
+0000015618 00000 n 
+0000015500 00000 n 
+0000013729 00000 n 
+0000018279 00000 n 
+0000018161 00000 n 
+0000015723 00000 n 
+0000091485 00000 n 
+0000020295 00000 n 
+0000020177 00000 n 
+0000018360 00000 n 
+0000022831 00000 n 
+0000022713 00000 n 
+0000020400 00000 n 
+0000024482 00000 n 
+0000024364 00000 n 
+0000022924 00000 n 
+0000025371 00000 n 
+0000025253 00000 n 
+0000024587 00000 n 
+0000027079 00000 n 
+0000027056 00000 n 
+0000041422 00000 n 
+0000041073 00000 n 
+0000048729 00000 n 
+0000048434 00000 n 
+0000051641 00000 n 
+0000051606 00000 n 
+0000054368 00000 n 
+0000054333 00000 n 
+0000070109 00000 n 
+0000069725 00000 n 
+0000078642 00000 n 
+0000078396 00000 n 
+0000084930 00000 n 
+0000084713 00000 n 
+0000091060 00000 n 
+0000090835 00000 n 
+0000091587 00000 n 
+0000091654 00000 n 
+0000091705 00000 n 
 trailer
 <<
-/Size 77
-/Root 2 0 R
-/Info 1 0 R
+/Size 84
+/Root 82 0 R
+/Info 83 0 R
+/ID [<0005E6093B0F959C8EA0BF96414DD1C4> <0005E6093B0F959C8EA0BF96414DD1C4>]
 >>
 startxref
-92138
+91908
 %%EOF

Modified: puppetor/trunk/doc/howto.tex
===================================================================
--- puppetor/trunk/doc/howto.tex	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/doc/howto.tex	2007-06-27 22:09:47 UTC (rev 10687)
@@ -74,22 +74,28 @@
 homepage.
 
 After downloading, you need to put the Tor executable to the base directory of
-this framework and make sure that it has the name \texttt{tor.exe} or
-\texttt{tor.sh}, respectively.\footnote{This is going to be configurable in the
-future.} Further, you need to have a Java Runtime Environment version 5 or
-higher installed on your machine.
+this framework or make sure that it is in the path. You also need to put the
+Tor Controller API classes somewhere. Further, you need to have a
+Java Runtime Environment version 5 or higher installed on your machine.
 
-You can then start the examples with one of the following commands:
+You can then start the examples with one of the following commands from the
+base directory of this framework, assuming that the Tor Controller API
+classes reside in directory \texttt{../torctl} (line break behind
+\texttt{examples.} included for layout reasons only):
 
 \begin{verbatim}
-java -cp bin
-    de.uniba.wiai.lspi.puppetor.examples.AccessingPublicWebServerOverTor
-java -cp bin
-    de.uniba.wiai.lspi.puppetor.examples.AdvertisingHiddenServiceToPublicTorNetwork
-java -cp bin
-    de.uniba.wiai.lspi.puppetor.examples.AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork
-java -cp bin
-    de.uniba.wiai.lspi.puppetor.examples.AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork
+java -cp bin:../torctl/bin
+    de.uniba.wiai.lspi.puppetor.examples.
+    AccessingPublicWebServerOverTor
+java -cp bin:../torctl/bin
+    de.uniba.wiai.lspi.puppetor.examples.
+    AdvertisingHiddenServiceToPublicTorNetwork
+java -cp bin:../torctl/bin
+    de.uniba.wiai.lspi.puppetor.examples.
+    AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork
+java -cp bin:../torctl/bin
+    de.uniba.wiai.lspi.puppetor.examples.
+    AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork
 \end{verbatim}
 
 \section{Example 1: Accessing public Web server over Tor}
@@ -221,6 +227,12 @@
 network.shutdownNodes();
 \end{verbatim}
 
+A typical output of example 1 might look like the following:
+
+\begin{verbatim}
+Request took 527 millis
+\end{verbatim}
+
 \section{Example 2: Advertising hidden service to public Tor network}
 
 The second-easiest example is to advertise a hidden service to the public Tor
@@ -297,6 +309,19 @@
 network.shutdownNodes();
 \end{verbatim}
 
+A typical output of example 2 might look like the following:
+
+\begin{verbatim}
+Waiting for 2 minutes and observing RSD publications...
+RSD published 38514 millis after first circuit was opened
+RSD published 38514 millis after first circuit was opened
+RSD published 38779 millis after first circuit was opened
+RSD published 100074 millis after first circuit was opened
+RSD published 100567 millis after first circuit was opened
+RSD published 100568 millis after first circuit was opened
+Exiting...
+\end{verbatim}
+
 \section{Example 3: Advertising and accessing hidden service over public Tor
 network}
 
@@ -394,6 +419,14 @@
 network.shutdownNodes();
 \end{verbatim}
 
+A typical output of example 3 might look like the following:
+
+\begin{verbatim}
+Request took 13808 millis from client to server!
+Request took 14851 millis for the rount-trip and 1043 millis from server to client!
+Exiting...
+\end{verbatim}
+
 \section{Example 4: Advertising and accessing hidden service over private Tor
 network}
 
@@ -491,6 +524,19 @@
 network.shutdownNodes();
 \end{verbatim}
 
+A typical output of example 4 might look like the following:
+
+\begin{verbatim}
+Successfully started nodes!
+Successfully built circuits!
+All RSDs published!
+Started server
+Handling event: APPLICATION_SENDING_REQUEST
+Handling event: APPLICATION_REQUEST_RECEIVED
+Handling event: APPLICATION_REPLY_RECEIVED
+Handling event: APPLICATION_REQUESTS_PERFORMED
+\end{verbatim}
+
 \section{Architecture}
 
 Though the examples show how to use the simulator, they do not provide insights
@@ -526,8 +572,6 @@
 private-network example.
 
 \item Fight the TODOs\ldots
-
-\item Complete logging and documentation for the impl package.
 \end{itemize}
 
 \end{document} 
\ No newline at end of file

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ClientApplication.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ClientApplication.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ClientApplication.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -3,7 +3,7 @@
 /**
  * The <code>ClientApplication</code> can be used to simulate simple
  * <code>HTTP GET</code> requests by a virtual local client. Therefore, an
- * address and a port are given wo which the client shall connect. Requests are
+ * address and a port are given to which the client shall connect. Requests are
  * performed by a background thread, so that multiple requests could be
  * performed at the same time.
  * 
@@ -13,9 +13,10 @@
 
 	/**
 	 * <p>
-	 * Arranges for the requests being performed by a thread in the background
-	 * and returns immediately. This thread will try for <code>retries</code>
-	 * times to make the request with a timeout of
+	 * Performs one or more HTTP requests to a previously provided address and
+	 * port. All requests are performed by a thread in the background, so that
+	 * this method may return immediately. That thread will try for
+	 * <code>retries</code> times to make the request with a timeout of
 	 * <code>timeoutForEachRetry</code> millis each. If an attempt is not
 	 * successful, the thread nevertheless waits for the timeout to expire. If
 	 * <code>stopOnSuccess</code> is set to <code>true</code>, the thread
@@ -32,6 +33,8 @@
 	 * is fired.
 	 * </p>
 	 * 
+	 * TODO may this method only be invoked once?!
+	 * 
 	 * @param retries
 	 *            The number of retries that this client will perform. Must be
 	 *            <code>1</code> or greater.
@@ -48,8 +51,14 @@
 	 *             Thrown if an invalid value is given for either of the
 	 *             parameters.
 	 */
-	public void performRequest(int retries, long timeoutForEachRetry,
+	public abstract void performRequest(int retries, long timeoutForEachRetry,
 			boolean stopOnSuccess);
 
-	// TODO we need some way to interrupt performing requests
+	/**
+	 * Stops all requests that are currently running.
+	 * 
+	 * @throws IllegalStateException
+	 *             Thrown if no requests have been started before.
+	 */
+	public abstract void stopRequest();
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/DirectoryNode.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/DirectoryNode.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/DirectoryNode.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -3,37 +3,43 @@
 import java.util.Set;
 
 /**
- * A DirectoryNode represents a Tor process that acts as RouterNode and is
- * further a directory authoritative server for the (private) Tor network. It
- * inherits most of the configuration and behavior from RouterNode and adds some
- * directory-specific configurations and behavior.
+ * A <code>DirectoryNode</code> represents a Tor process that acts as
+ * <code>RouterNode</code> and which is further a directory authoritative
+ * server for the (private) Tor network. It inherits most of the configuration
+ * and behavior from <code>RouterNode</code> and adds some directory-specific
+ * configurations and behavior.
  * 
  * @author kloesing
  */
 public interface DirectoryNode extends RouterNode {
 
 	/**
-	 * Combines the node's fingerprint to a DirServer string that can be used to
-	 * configure this or other nodes to use this node as directory server.
+	 * Combines the fingerprint of this node to a <code>DirServer</code>
+	 * string that can be used to configure this or other nodes to use this node
+	 * as directory server.
 	 * 
-	 * @return DirServer string to configure a node to use this node as
-	 *         directory server.
+	 * @return <code>DirServer</code> string to configure a node to use this
+	 *         node as directory server.
 	 * @throws TorProcessException
-	 *             Thrown if a problem occurs when determining the node's
-	 *             fingerprint.
+	 *             Thrown if a problem occurs when determining the fingerprint
+	 *             of this node.
 	 */
 	public abstract String determineDirServerString()
 			throws TorProcessException;
 
 	/**
-	 * Writes the given set of routers (either directories or routers) to the
-	 * <code>approved-routers</code> file. This will confirm to directory
-	 * clients, that the given routers can be trusted.
+	 * Writes the given (possibly empty) set of onion router fingerprints to the
+	 * <code>approved-routers</code> file of this node. This will confirm to
+	 * directory clients, that the given routers can be trusted.
 	 * 
 	 * @param approvedRouters
-	 *            The set of approved routers to be written.
+	 *            The set of approved routers to be written. Each provided
+	 *            string must be formatted as
+	 *            <code>nickname 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000</code>.
 	 * @throws IllegalArgumentException
-	 *             Thrown if <code>null</code> is passed as parameter.
+	 *             Thrown if <code>null</code> is passed as parameter;
+	 *             however, if an empty set is passed, an empty
+	 *             <code>approved-routers</code> file will be written.
 	 * @throws TorProcessException
 	 *             Thrown if the <code>approved-routers</code> file cannot be
 	 *             written to disk.

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Event.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Event.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Event.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,9 +1,9 @@
 package de.uniba.wiai.lspi.puppetor;
 
 /**
- * An Event is created for every state change of an asynchronous system
- * component, e.g. a Tor process or a client/server application running as
- * thread in the background. In contrast to <code>NodeState</code> or
+ * An <code>Event</code> is created for every state change of an asynchronous
+ * system component, e.g. a Tor process or a client/server application running
+ * as thread in the background. In contrast to <code>NodeState</code> or
  * <code>NetworkState</code> an <code>Event</code> cannot be a pre- or
  * postconditions for a method invocation. There is no prescribed order in which
  * events are fired by a certain process or application. Some events can be

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventManager.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventManager.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventManager.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -3,11 +3,11 @@
 import java.util.List;
 
 /**
- * The EventManager is the central place for a test run to manage asynchronous
- * events by Tor processes and client/server applications running as threads in
- * the background. A test application can either register event listeners to be
- * notified asynchronously about events when they occur, or synchronize with an
- * event by being blocked until the certain event occurs.
+ * The <code>EventManager</code> is the central place for a test run to manage
+ * asynchronous events by Tor processes and client/server applications running
+ * as threads in the background. A test application can either register event
+ * listeners to be notified asynchronously about events when they occur, or
+ * synchronize with an event by being blocked until the certain event occurs.
  * 
  * @author kloesing
  */

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Network.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Network.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Network.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -16,7 +16,9 @@
 	 * Configures the nodes in this network so that they can run in a private
 	 * network and don't require public directory servers or onion routers from
 	 * the Internet. This configuration should be done after configuring the
-	 * nodes and before writing configurations to disk.
+	 * nodes and before writing configurations to disk. This operation can only
+	 * be invoked, if network status is
+	 * <code>NetworkState.CONFIGURING_NODES</code>.
 	 * </p>
 	 * 
 	 * <p>
@@ -55,8 +57,9 @@
 	 * TODO check if we have enough directory and router nodes to build a
 	 * private network? How many are required? 2 dirs and 3 routers?
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
+	 * @throws IllegalStateException
+	 *             Thrown if network is not in state
+	 *             <code>NetworkState.CONFIGURING_NODES</code>.
 	 * @throws TorProcessException
 	 *             Thrown if an I/O problem occurs while starting nodes with the
 	 *             <code>--list-fingerprint</code> option, reading files from
@@ -68,16 +71,14 @@
 	/**
 	 * Creates a new client application, but does not yet perform a request.
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
 	 * @param clientApplicationName
 	 *            The name for this client application, which is used for
-	 *            logging purposes only. May neither be null or a zero-length
-	 *            string.
+	 *            logging purposes only. May neither be <code>null</code> or a
+	 *            zero-length string.
 	 * @param targetAddress
 	 *            The target for requests sent by this client application. Can
 	 *            be an IP address, a domain name, or an onion address. May
-	 *            neither be null or a zero-length string.
+	 *            neither be <code>null</code> or a zero-length string.
 	 * @param targetPort
 	 *            The TCP port for requests sent by this client application. If
 	 *            the target address is an onion address, this port is the
@@ -99,9 +100,9 @@
 	/**
 	 * Creates a new directory node and adds it to the network, but does not yet
 	 * write its configuration to disk or start the corresponding Tor process.
+	 * This operation can only be invoked, if network status is
+	 * <code>NetworkState.CONFIGURING_NODES</code>.
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
 	 * @param nodeName
 	 *            The name for this node, which is used as name for the working
 	 *            directory, for logging purposes, and as node nickname. May
@@ -123,6 +124,9 @@
 	 *            for incoming directory requests. May not be negative or
 	 *            greater than 65535.
 	 * @return Reference to the created directory node.
+	 * @throws IllegalStateException
+	 *             Thrown if network is not in state
+	 *             <code>NetworkState.CONFIGURING_NODES</code>.
 	 * @throws IllegalArgumentException
 	 *             Thrown if an invalid value is given for either of the
 	 *             parameters.
@@ -131,11 +135,11 @@
 			int controlPort, int socksPort, int orPort, int dirPort);
 
 	/**
-	 * Creates a new proxy node and adds it to the network, but does not yet
-	 * write its configuration to disk or start the corresponding Tor process.
+	 * Creates a new <code>ProxyNode</code> and adds it to the
+	 * <code>network</code>, but does not yet write its configuration to disk
+	 * or start the corresponding Tor process. This operation can only be
+	 * invoked, if network status is <code>NetworkState.CONFIGURING_NODES</code>.
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
 	 * @param nodeName
 	 *            The name for this node, which is only used as name for the
 	 *            working directory and for logging purposes. May neither be
@@ -149,6 +153,9 @@
 	 *            for incoming SOCKS requests. May not be negative or greater
 	 *            than 65535.
 	 * @return Reference to the created proxy node.
+	 * @throws IllegalStateException
+	 *             Thrown if network is not in state
+	 *             <code>NetworkState.CONFIGURING_NODES</code>.
 	 * @throws IllegalArgumentException
 	 *             Thrown if an invalid value is given for either of the
 	 *             parameters.
@@ -159,9 +166,9 @@
 	/**
 	 * Creates a new router node and adds it to the network, but does not yet
 	 * write its configuration to disk or start the corresponding Tor process.
+	 * This operation can only be invoked, if network status is
+	 * <code>NetworkState.CONFIGURING_NODES</code>.
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
 	 * @param nodeName
 	 *            The name for this node, which is used as name for the working
 	 *            directory, for logging purposes, and as node nickname. May
@@ -184,6 +191,9 @@
 	 *            the mirrored directory. May not be negative or greater than
 	 *            65535.
 	 * @return Reference to the created router node.
+	 * @throws IllegalStateException
+	 *             Thrown if network is not in state
+	 *             <code>NetworkState.CONFIGURING_NODES</code>.
 	 * @throws IllegalArgumentException
 	 *             Thrown if an invalid value is given for either of the
 	 *             parameters.
@@ -195,12 +205,10 @@
 	 * Creates a new server application, but does not start listening for
 	 * incoming requests.
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
 	 * @param serverApplicationName
 	 *            The name for this server application, which is used for
-	 *            logging purposes only. May neither be null or a zero-length
-	 *            string.
+	 *            logging purposes only. May neither be <code>null</code> or a
+	 *            zero-length string.
 	 * @param serverPort
 	 *            The TCP port on which the server will wait for incoming
 	 *            requests. May not be negative or greater than 65535.
@@ -215,8 +223,6 @@
 	/**
 	 * Returns a reference on the (single) event manager for this network.
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
 	 * @return Reference on the (single) event manager for this network.
 	 */
 	public abstract EventManager getEventManager();
@@ -244,11 +250,10 @@
 	 * with <code>false</code>. Thus, the maximum waiting time is
 	 * <code>(tries + 1)</code> times <code>hupInterval</code>. As soon as
 	 * all nodes have successfully opened circuits, the method returns with
-	 * <code>true</code>.
+	 * <code>true</code>. This operation can only be invoked, if network
+	 * status is <code>NetworkState.NODES_STARTED</code>.
 	 * </p>
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
 	 * @param tries
 	 *            The maximum number of HUP signals that are sent to the Tor
 	 *            processes. Negative values are not allowed. A value of zero
@@ -261,6 +266,9 @@
 	 *            HUP signals. Negative values are not allowed. Typically,
 	 *            values should not be smaller than 10 seconds to permit Tor to
 	 *            stabilize.
+	 * @throws IllegalStateException
+	 *             Thrown if network is not in state
+	 *             <code>NetworkState.NODES_STARTED</code>.
 	 * @throws IllegalArgumentException
 	 *             Thrown if a negative value is given for either
 	 *             <code>tries</code> or <code>hupInterval</code>.
@@ -276,10 +284,12 @@
 	 * Attempts to shut down all nodes. The method blocks until all shutdown
 	 * requests have been sent and either returns, or throws the first exception
 	 * that has been observed when shutting down nodes. The method can be
-	 * assumed to return very quickly.
+	 * assumed to return very quickly. This operation can only be invoked, if
+	 * network status is <code>NetworkState.NODES_STARTED</code>.
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
+	 * @throws IllegalStateException
+	 *             Thrown if network is not in state
+	 *             <code>NetworkState.NODES_STARTED</code>.
 	 * @throws TorProcessException
 	 *             Thrown if an I/O problem occurs while shutting down the
 	 *             nodes.
@@ -291,10 +301,10 @@
 	 * <code>maximumTimeToWaitInMillis</code> millis. The method returns as
 	 * soon as all nodes have started and opened their control port so that we
 	 * can connect to them. It returns a boolean that states whether the
-	 * operation was either successful or has timed out.
+	 * operation was either successful or has timed out. This operation can only
+	 * be invoked, if network status is
+	 * <code>NetworkState.CONFIGURATIONS_WRITTEN</code>.
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
 	 * @param maximumTimeToWaitInMillis
 	 *            The maximum time to wait in milliseconds. A positive value or
 	 *            zero restricts waiting to this time. Negative values are not
@@ -304,18 +314,26 @@
 	 * @throws IllegalArgumentException
 	 *             Thrown if a negative value is given for
 	 *             <code>maximumTimeToWaitInMillis</code>.
+	 * @throws IllegalStateException
+	 *             Thrown if network is not in state
+	 *             <code>NetworkState.CONFIGURATIONS_WRITTEN</code>.
 	 * @throws TorProcessException
-	 *             Thrown if an I/O problem occurs while startint the nodes.
+	 *             Thrown if an I/O problem occurs while starting the nodes.
 	 */
 	public abstract boolean startNodes(long maximumTimeToWaitInMillis)
 			throws TorProcessException;
 
 	/**
-	 * Writes the configurations of all nodes in this network to disk. This
-	 * method is assumed to return very quickly.
+	 * Writes the configurations for all nodes in the network to disk, including
+	 * <code>torrc</code> and <code>approved-routers</code> files. This
+	 * method is assumed to return very quickly. In case of a private network,
+	 * <code>configureAsPrivateNetwork</code> must be invoked in advance to
+	 * this method! This operation can only be invoked, if network status is
+	 * <code>NetworkState.CONFIGURING_NODES</code>.
 	 * 
-	 * TODO allow invocation of this method only in correct state
-	 * 
+	 * @throws IllegalStateException
+	 *             Thrown if network is not in state
+	 *             <code>NetworkState.CONFIGURING_NODES</code>.
 	 * @throws TorProcessException
 	 *             Thrown if an I/O problem occurs while writing to the nodes'
 	 *             working directories.

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkFactory.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkFactory.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkFactory.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -13,7 +13,7 @@
  * constructor using reflection. Currently, this is the only place where we
  * reference a class from the impl package.
  * 
- * @author karsten
+ * @author kloesing
  */
 public abstract class NetworkFactory {
 

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkState.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkState.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkState.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -13,6 +13,7 @@
  * @author kloesing
  */
 public enum NetworkState {
+
 	/**
 	 * The configurations of the nodes in the network have not been written to
 	 * disk and can be changed. This is the initial state of a

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NodeState.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NodeState.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NodeState.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -14,16 +14,17 @@
 public enum NodeState {
 
 	/**
-	 * The node's configuration has not been written to disk and can be changed.
-	 * This is the initial state of a <code>ProxyNode</code> or one of its
-	 * subclasses.
+	 * The configuration of this node has not been written to disk and can be
+	 * changed. This is the initial state of a <code>ProxyNode</code> or one
+	 * of its subclasses.
 	 */
 	CONFIGURING,
 
 	/**
-	 * The node's configuration has been written to disk and cannot be changed
-	 * anymore, but the Tor process has not been started, yet. This state could
-	 * be useful to review the configuration that has been written to disk.
+	 * The configuration of this node has been written to disk and cannot be
+	 * changed anymore, but the Tor process has not been started, yet. This
+	 * state could be useful to review the configuration that has been written
+	 * to disk.
 	 */
 	CONFIGURATION_WRITTEN,
 

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ProxyNode.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ProxyNode.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ProxyNode.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -3,31 +3,33 @@
 import java.util.Set;
 
 /**
- * A ProxyNode represents a Tor process that is configured as onion proxy, i.e.
- * to relay traffic from a local application to the Tor network and vice versa,
- * and does not route traffic on behalf of remote applications. It is the
- * superclass for other node types that extend the configuration of a ProxyNode.
+ * A <code>ProxyNode</code> represents a Tor process that is configured as
+ * onion proxy, i.e. to relay traffic from a local application to the Tor
+ * network and vice versa, and does not route traffic on behalf of remote
+ * applications. It is the superclass for other node types that extend the
+ * configuration of a </code>ProxyNode</code>.
  * 
  * @author kloesing
  */
 public interface ProxyNode extends EventSource {
 
 	/**
-	 * Adds hidden service entries to this node's configuration. This method can
-	 * only be invoked while the node is in state
-	 * <code>NodeState.CONFIGURING</code>. TODO Should this operation also be
-	 * possible while the process is running? We could easily change the
-	 * configuration via the controller.
+	 * Adds the entries for a hidden service to the configuration of this node.
+	 * This method can only be invoked while the node is in state
+	 * <code>NodeState.CONFIGURING</code>.
 	 * 
+	 * TODO Should this operation also be possible while the process is running?
+	 * We could easily change the configuration via the controller.
+	 * 
 	 * @param serviceName
 	 *            Name of the hidden service that will be used as name for the
 	 *            hidden service directory. May neither be <code>null</code>
 	 *            or a zero-length string.
 	 * @param servicePort
 	 *            The TCP port on which the service will be available for
-	 *            requests. This can be different for the virtual port that is
-	 *            announced to clients. May not be negative or greater than
-	 *            65535.
+	 *            requests. This can, but need not be different from the virtual
+	 *            port that is announced to clients. May not be negative or
+	 *            greater than 65535.
 	 * @param virtualPort
 	 *            The virtual TCP port that this hidden service runs on as it is
 	 *            announced to clients. May not be negative or greater than
@@ -43,17 +45,17 @@
 			int virtualPort);
 
 	/**
-	 * Adds the given set of DirServer configuration entries to this node's
-	 * configuration. Note that as soon as one DirServer is configured, the node
-	 * does not connect to an outside directory server of the public network any
-	 * more!
+	 * Adds the given set of DirServer configuration entries to the
+	 * configuration of this node. Note that as soon as one DirServer is
+	 * configured, the node does not connect to an outside directory server of
+	 * the public network any more!
 	 * 
 	 * TODO allow invocation of this method only in correct state
 	 * 
 	 * @param authorizedDirServerStrings
 	 *            A set of DirServer configuration entries that each contain one
 	 *            directory server that this node shall connect to. May not be
-	 *            <code>null</code>.
+	 *            <code>null</code>, but may be an empty set.
 	 * @throws IllegalArgumentException
 	 *             Thrown if <code>null</code> is passed as parameter.
 	 */
@@ -61,21 +63,35 @@
 			Set<String> authorizedDirServerStrings);
 
 	/**
-	 * Returns the node's name.
+	 * Adds the given configuration string to the configuration of this node.
 	 * 
-	 * @return The node's name.
+	 * @param configurationString
+	 *            The configuration string to be added.
+	 * @throws IllegalArgumentException
+	 *             Thrown if the given configurationString is either
+	 *             <code>null</code> or a zero-length string.
+	 * @throws IllegalStateException
+	 *             Thrown if not invoked in state
+	 *             <code>NodeState.CONFIGURING</code>.
 	 */
+	public abstract void addConfiguration(String configurationString);
+
+	/**
+	 * Returns the name of this node.
+	 * 
+	 * @return The name of this node.
+	 */
 	public abstract String getNodeName();
 
 	/**
-	 * Returns the node's state.
+	 * Returns the state of this node.
 	 * 
-	 * @return The node's state.
+	 * @return The state of this node.
 	 */
 	public abstract NodeState getNodeState();
 
 	/**
-	 * Determines the onion address for the previously added hidden service with
+	 * Determines the onion address for a previously added hidden service with
 	 * name <code>serviceName</code>. Requires that the node has been
 	 * started, i.e. is in state <code>NodeState.RUNNING</code>.
 	 * 
@@ -83,22 +99,29 @@
 	 *            Name of the hidden service that has been used before to add
 	 *            the hidden service. May neither be <code>null</code> or a
 	 *            zero-length string.
+	 * @param version
+	 *            Hidden service version; can be either 0, 1, or 2. Note that
+	 *            version 2 may not be implemented in the regular Tor sources!
 	 * @return The onion address string consisting of 16 base32 chars plus
-	 *         ".onion".
+	 *         ".onion" for hidden service versions 0 and 1 or 16 base32 chars
+	 *         plus "." plus 24 base32 chars plus ".onion" for hidden service
+	 *         version 2.
 	 * @throws IllegalArgumentException
 	 *             Thrown if <code>null</code> or a zero-length string is
 	 *             passed as parameter.
 	 * @throws TorProcessException
 	 *             Thrown if either there does not exist a hidden service with
-	 *             the given <code>serviceName</code> as directory or if the
+	 *             the given <code>serviceName</code> as directory, if the
+	 *             given <code>version</code> is invalid, or if the
 	 *             <code>hostname</code> file could not be read.
 	 */
-	public abstract String getOnionAddress(String serviceName)
+	public abstract String getOnionAddress(String serviceName, int version)
 			throws TorProcessException;
 
 	/**
 	 * Sends a HUP command to the process via its control port to restart it;
-	 * can only be done if node has already been started!
+	 * can only be done if the node has already been started, i.e. is in state
+	 * <code>NodeState.RUNNING</code>!
 	 * 
 	 * @throws TorProcessException
 	 *             Thrown if an I/O problem occurs while sending the HUP signal.
@@ -108,13 +131,14 @@
 	public abstract void hup() throws TorProcessException;
 
 	/**
-	 * Shuts down Tor process corresponding to this node immediately. This is
-	 * done by sending the <code>SHUTDOWN</code> signal twice, so that nodes
-	 * extending ProxyNode and have opened their OR port shutdown immediately,
-	 * too.
+	 * Shuts down the Tor process corresponding to this node immediately. This
+	 * is done by sending the <code>SHUTDOWN</code> signal twice, so that
+	 * those nodes extending <code>ProxyNode</code> which have opened their OR
+	 * port shutdown immediately, too.
 	 * 
 	 * @throws IllegalStateException
-	 *             Thrown if node is not in state <code>NodeState.RUNNING</code>.
+	 *             Thrown if this node is not in state
+	 *             <code>NodeState.RUNNING</code>.
 	 * @throws TorProcessException
 	 *             Thrown if an I/O problem occurs while sending the
 	 *             <code>SHUTDOWN</code> signal.
@@ -125,8 +149,8 @@
 	 * Starts the Tor process for this node and connects to the control port as
 	 * soon as it is opened. <b>In order for this method to succeed it is
 	 * absolutely necessary, that logging on the console is not changed in the
-	 * node's configuration to a higher level than NOTICE, because the output is
-	 * parsed to see when the control port is opened.</b>
+	 * configuration of this node to a higher level than NOTICE, because the
+	 * output is parsed to see when the control port is opened.</b>
 	 * 
 	 * @param maximumTimeToWaitInMillis
 	 *            Maximum time in millis we will wait for the Tor process to be
@@ -150,15 +174,29 @@
 			throws TorProcessException;
 
 	/**
-	 * Writes the node's configuration to the <code>torrc</code> file in the
-	 * node's working directory and changes the state to
+	 * Writes the configuration of this node to the <code>torrc</code> file in
+	 * its working directory and changes the state to
 	 * <code>NodeState.CONFIGURATION_WRITTEN</code>.
 	 * 
 	 * @throws IllegalStateException
 	 *             Thrown if not invoked in state
 	 *             <code>NodeState.CONFIGURING</code>.
 	 * @throws TorProcessException
-	 *             Thrown if the configuration file cannot be written to disk.
+	 *             Thrown if the configuration file <code>torrc</code> cannot
+	 *             be written to disk.
 	 */
 	public abstract void writeConfiguration() throws TorProcessException;
+
+	/**
+	 * Copies all locally stored descriptors of this node to the data directory
+	 * of the given <code>node</code>. Note that this method only makes sense
+	 * when used with a modified Tor implementation!
+	 * 
+	 * @param otherNode
+	 *            Node to which data directory the .rsd files shall be copied.
+	 * @throws TorProcessException
+	 *             Thrown if copying files does not succeed.
+	 */
+	public abstract void copyDescriptorTo(ProxyNode otherNode)
+			throws TorProcessException;
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/RouterNode.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/RouterNode.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/RouterNode.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,11 +1,11 @@
 package de.uniba.wiai.lspi.puppetor;
 
 /**
- * A RouterNode represents a Tor process that is configured to both, relay
- * traffic from a local application to the Tor network and to route traffic on
- * behalf of remote applications. It inherits most of its configuration and
- * behavior from its superclass ProxyNode and adds some router-specific
- * configurations and behavior.
+ * A <code>RouterNode</code> represents a Tor process that is configured to
+ * both, relay traffic from a local application to the Tor network and to route
+ * traffic on behalf of remote applications. It inherits most of its
+ * configuration and behavior from its superclass <code>ProxyNode</code> and
+ * adds some router-specific configurations and behavior.
  * 
  * @author kloesing
  */
@@ -13,10 +13,11 @@
 
 	/**
 	 * <p>
-	 * Determines the directory node's fingerprint. If the Tor process has not
-	 * been started before, it is started to determine the node's fingerprint.
-	 * This is done using a temporary configuration file and with the
-	 * command-line option <code>--list-fingerprint</code>. Tor then
+	 * Determines the directory fingerprint of this node. If the Tor process has
+	 * not been started before, it is started and immediately stopped
+	 * afterwards, so that the Tor process creates a new onion key pair and
+	 * fingerprint for it. This is done using a temporary configuration file and
+	 * with the command-line option <code>--list-fingerprint</code>. Tor then
 	 * generates a new onion key and writes its fingerprint to the
 	 * <code>fingerprint</code> file in its working directory, but does not
 	 * start routing traffic.
@@ -43,7 +44,7 @@
 	 * before specifying directory servers for this node.
 	 * </p>
 	 * 
-	 * @return The content of the node's fingerprint file.
+	 * @return The content of the fingerprint file of this node.
 	 * @throws TorProcessException
 	 *             Thrown if either the temporary <code>torrc</code>
 	 *             configuration file cannot be written, the Tor process cannot

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ServerApplication.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ServerApplication.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ServerApplication.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -11,11 +11,21 @@
 public interface ServerApplication extends EventSource {
 
 	/**
-	 * Starts listening for incoming <code>HTTP GET</code> requests by
+	 * Starts listening for incoming <code>HTTP GET</code> requests from
 	 * clients. Any incoming request is answered by an empty
-	 * <code>HTTP OK</code> reply.
+	 * <code>HTTP OK</code> reply. This method may only be invoked once!
+	 * 
+	 * @throws IllegalStateException
+	 *             Thrown if <code>listen</code> has already been invoked
+	 *             before.
 	 */
 	public abstract void listen();
 
-	// TODO we need some way to interrupt listening for requests
+	/**
+	 * Stops listening for requests.
+	 * 
+	 * @throws IllegalStateException
+	 *             Thrown if <code>listen</code> has not been invoked before.
+	 */
+	public abstract void stopListening();
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/TorProcessException.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/TorProcessException.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/TorProcessException.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -5,9 +5,10 @@
  * exceptions that occur when interacting with the JVM-external Tor processes or
  * with the local file system. Any occurence of this exception denotes either a
  * configuration problem that can only be solved outside of the JVM, or an
- * unexpected problem. In contrast to this, all kinds of programming errors of a
- * test application (invoking a method with wrong parameter values, in wrong
- * state, etc.) will instead cause runtime exceptions from the Java API.
+ * unexpected problem. In contrast to this, all kinds of programming errors of
+ * an application using this API (invoking a method with wrong parameter values,
+ * in wrong state, etc.) will instead cause appropriate runtime exceptions from
+ * the Java API.
  * 
  * @author kloesing
  */
@@ -15,15 +16,16 @@
 public class TorProcessException extends Exception {
 
 	/**
-	 * Creates a TorProcessException without a detail message or cause.
+	 * Creates a <code>TorProcessException</code> without detail message or
+	 * cause.
 	 */
 	public TorProcessException() {
 		super();
 	}
 
 	/**
-	 * Creates a TorProcessException with the given detail <code>message</code>
-	 * and <code>cause</code>.
+	 * Creates a <code>TorProcessException</code> with the given detail
+	 * <code>message</code> and <code>cause</code>.
 	 * 
 	 * @param message
 	 *            The detail message of this exception.
@@ -35,8 +37,8 @@
 	}
 
 	/**
-	 * Creates a TorProcessException with the given detail <code>message</code>,
-	 * but without a cause.
+	 * Creates a <code>TorProcessException</code> with the given detail
+	 * <code>message</code>, but without a <code>cause</code>.
 	 * 
 	 * @param message
 	 *            The detail message of this exception.
@@ -46,8 +48,8 @@
 	}
 
 	/**
-	 * Creates a TorProcessException with the given <code>cause</code>, but
-	 * without a detail message.
+	 * Creates a <code>TorProcessException</code> with the given
+	 * <code>cause</code>, but without a detail message.
 	 * 
 	 * @param cause
 	 *            The cause for this exception.

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AccessingPublicWebServerOverTor.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AccessingPublicWebServerOverTor.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AccessingPublicWebServerOverTor.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -9,8 +9,8 @@
 import de.uniba.wiai.lspi.puppetor.TorProcessException;
 
 /**
- * Example for accessing a public Web server (www.google.com) over Tor to
- * measure access times.
+ * Example for accessing a public Web server (here: <code>www.google.com</code>)
+ * over Tor to measure access times.
  * 
  * @author kloesing
  */
@@ -20,16 +20,15 @@
 	 * Sets up and runs the test.
 	 * 
 	 * @param args
-	 *            Command-line arguments are ignored.
-	 * 
+	 *            Command-line arguments (ignored).
 	 * @throws TorProcessException
 	 *             Thrown if there is a problem with the JVM-external Tor
 	 *             processes that we cannot handle.
 	 */
 	public static void main(String[] args) throws TorProcessException {
 
-		// though we only need one proxy, we always need to create a network
-		// to initialize a test case
+		// though we only need a single proxy, we always need to create a
+		// network to initialize a test case.
 		Network network = NetworkFactory.createNetwork("example1");
 
 		// create a single proxy node with name "proxy", control port 7001,
@@ -57,7 +56,7 @@
 
 		// create client application
 		ClientApplication client = network.createClient("client",
-				"www.google.de", 80, 7002);
+				"www.google.com", 80, 7002);
 
 		// create event listener to listen for client application events
 		EventListener clientEventListener = new EventListener() {
@@ -92,9 +91,20 @@
 		manager.waitForAnyOccurence(client,
 				Event.APPLICATION_REQUESTS_PERFORMED);
 
+		// wait a second before shutting down the proxy
+		try {
+			Thread.sleep(1000);
+		} catch (InterruptedException e) {
+		}
+
 		// shut down proxy
 		network.shutdownNodes();
 
-		System.out.println("Exiting...");
+		// wait another second before exiting the application
+		try {
+			Thread.sleep(1000);
+		} catch (InterruptedException e) {
+		}
+
 	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -22,8 +22,7 @@
 	 * Sets up and runs the test.
 	 * 
 	 * @param args
-	 *            Command-line arguments are ignored.
-	 * 
+	 *            Command-line arguments (ignored).
 	 * @throws TorProcessException
 	 *             Thrown if there is a problem with the JVM-external Tor
 	 *             processes that we cannot handle.
@@ -45,14 +44,15 @@
 		RouterNode router1 = network.createRouter("router1", 7021, 7022, 7023,
 				7024);
 		network.createRouter("router2", 7031, 7032, 7033, 7034);
-		network.createRouter("router3", 7041, 7042, 7043, 7044);
+		network.createRouter("router3", 7041, 7042, 7043,
+				7044);
 
 		// create two directory nodes with parameters (router name, control
 		// port, SOCKS port, OR port, dir port)
 		network.createDirectory("dir1", 7051, 7052, 7053, 7054);
 		network.createDirectory("dir2", 7061, 7062, 7063, 7064);
 
-		// add hidden service to the configuration of proxy1
+		// add hidden service
 		router1.addHiddenService("hidServ", 7025, 80);
 
 		// configure nodes of this network to be part of a private network
@@ -62,93 +62,72 @@
 		network.writeConfigurations();
 
 		// start proxy node and wait until it has opened a circuit with a
-		// timeout of 5 seconds
-		if (!network.startNodes(5000)) {
+		// timeout of 15 seconds
+		if (!network.startNodes(15000)) {
 
 			// failed to start the proxy
 			System.out.println("Failed to start nodes!");
 			return;
 		}
+		System.out.println("Successfully started nodes!");
 
-		// hup until proxy has built circuits (8 retries, 10 seconds timeout
+		// hup until proxy has built circuits (10 retries, 10 seconds timeout
 		// each)
-		if (!network.hupUntilUp(8, 10000)) {
+		if (!network.hupUntilUp(10, 10000)) {
 
 			// failed to build circuits
 			System.out.println("Failed to build circuits!");
 			return;
 		}
+		System.out.println("Successfully built circuits!");
 
 		// obtain reference to event manager to be able to respond to events
 		EventManager manager = network.getEventManager();
 
 		// wait for 3 minutes that the proxy has published its first RSD
+
 		if (!manager.waitForAnyOccurence(router1, Event.NODE_RSD_PUBLISHED,
 				3L * 60L * 1000L)) {
-
 			// failed to publish an RSD
 			System.out.println("Failed to publish an RSD!");
 			return;
 		}
+		System.out.println("All RSDs published!");
 
 		// determine onion address for hidden service
-		String onionAddress = router1.getOnionAddress("hidServ");
+		String onionAddress = router1.getOnionAddress("hidServ", 1);
 
 		// create server application
 		ServerApplication server = network.createServer("server", 7025);
 
+		// start server
+		server.listen();
+		System.out.println("Started server");
+
 		// create client application
 		ClientApplication client = network.createClient("client", onionAddress,
 				80, 7042);
 
-		// create event listener to listen for client and server application
-		// events
+		// register event listener
 		EventListener clientAndServerEventListener = new EventListener() {
 
-			private long requestReceivedAtServer;
-
-			// remember time when request was sent and when it was received
-			private long requestSentFromClient;
-
 			public void handleEvent(Event event) {
-				switch (event) {
-				case APPLICATION_SENDING_REQUEST:
-					requestSentFromClient = System.currentTimeMillis();
-					break;
-				case APPLICATION_REQUEST_RECEIVED:
-					requestReceivedAtServer = System.currentTimeMillis();
-					System.out.println("Request took "
-							+ (requestReceivedAtServer - requestSentFromClient)
-							+ " millis from client to server!");
-					break;
-				case APPLICATION_REPLY_RECEIVED:
-					System.out
-							.println("Request took "
-									+ (System.currentTimeMillis() - requestSentFromClient)
-									+ " millis for the rount-trip and "
-									+ (System.currentTimeMillis() - requestReceivedAtServer)
-									+ " millis from server to client!");
-				}
+				System.out.println("Handling event: " + event);
+
 			}
 		};
-
-		// register event handler for client and server application events
 		manager.addEventListener(client, clientAndServerEventListener);
 		manager.addEventListener(server, clientAndServerEventListener);
 
-		// start server
-		server.listen();
-
 		// perform at most five request with a timeout of 45 seconds each
 		client.performRequest(5, 45000, true);
 
-		// block this thread as long as client requests are running
+		// wait for request to be performed
 		manager.waitForAnyOccurence(client,
 				Event.APPLICATION_REQUESTS_PERFORMED);
 
-		// shut down proxy
+		// shut down nodes
 		network.shutdownNodes();
 
-		System.out.println("Exiting...");
 	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -22,8 +22,7 @@
 	 * Sets up and runs the test.
 	 * 
 	 * @param args
-	 *            Command-line arguments are ignored.
-	 * 
+	 *            Command-line arguments (ignored).
 	 * @throws TorProcessException
 	 *             Thrown if there is a problem with the JVM-external Tor
 	 *             processes that we cannot handle.
@@ -78,7 +77,7 @@
 		ServerApplication server = network.createServer("server", 7005);
 
 		// determine onion address for hidden service
-		String onionAddress = proxy1.getOnionAddress("hidServ");
+		String onionAddress = proxy1.getOnionAddress("hidServ", 1);
 
 		// create client application
 		ClientApplication client = network.createClient("client", onionAddress,

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingHiddenServiceToPublicTorNetwork.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingHiddenServiceToPublicTorNetwork.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingHiddenServiceToPublicTorNetwork.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -20,8 +20,7 @@
 	 * Sets up and runs the test.
 	 * 
 	 * @param args
-	 *            Command-line arguments are ignored.
-	 * 
+	 *            Command-line arguments (ignored).
 	 * @throws TorProcessException
 	 *             Thrown if there is a problem with the JVM-external Tor
 	 *             processes that we cannot handle.
@@ -87,12 +86,12 @@
 			return;
 		}
 
-		// let it run for 5 minutes and observe when RSDs are published...
+		// let it run for 2 minutes and observe when RSDs are published...
 		System.out
-				.println("Waiting for 5 minutes and observing RSD publications...");
+				.println("Waiting for 2 minutes and observing RSD publications...");
 
 		try {
-			Thread.sleep(5L * 60L * 1000L);
+			Thread.sleep(2L * 60L * 1000L);
 		} catch (InterruptedException e) {
 			// do nothing
 		}

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ClientApplicationImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ClientApplicationImpl.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ClientApplicationImpl.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,8 +1,3 @@
-/*
- * NOTICE: This file is still work in progress. As you can see the Java
- * documentation is written partly in German and in English and logging and
- * documentation still need some work. Sorry for any inconvenience!  
- */
 package de.uniba.wiai.lspi.puppetor.impl;
 
 import java.io.BufferedReader;
@@ -21,182 +16,51 @@
 import de.uniba.wiai.lspi.puppetor.Event;
 
 /**
- * Implementation of ClientApplication.
+ * Implementation of <code>ClientApplication</code>.
  * 
  * @author kloesing
  */
 public class ClientApplicationImpl implements ClientApplication {
 
 	/**
-	 * Thread that performs the requests in the background
+	 * Internal thread class that is used to perform requests.
 	 */
-	private RequestThread clientThread;
+	private class RequestThread extends Thread {
 
-	/**
-	 * Logger for this client
-	 */
-	private Logger logger;
+		/**
+		 * Flag to remember whether requests are performed at the moment (<code>true</code>),
+		 * or have been stopped (<code>false</code>).
+		 */
+		private boolean connected;
 
-	/**
-	 * Target address for requests; can be either a server address or an onion
-	 * address.
-	 */
-	private String targetAddress;
+		/**
+		 * Number of retries to be performed.
+		 */
+		private int retries;
 
-	/**
-	 * Target port for requests; can be either a server port or a virtual port
-	 * of a hidden service.
-	 */
-	private int targetPort;
+		/**
+		 * Flag that determines whether requests shall be stopped after the
+		 * first successful reply (<code>true</code>), or not (<code>false</code>).
+		 */
+		private boolean stopOnSuccess;
 
-	/**
-	 * SOCKS port of the local Tor node.
-	 */
-	private int socksPort;
-
-	/**
-	 * 
-	 */
-	private EventManagerImpl eventManager;
-
-	/**
-	 * 
-	 */
-	private String clientApplicationName;
-
-	/**
-	 * (logging finished)
-	 * 
-	 * erzeugt neue client app innerhalb der jvm, started aber noch keine
-	 * requests.
-	 * 
-	 * @param network
-	 * 
-	 * @param clientApplicationName
-	 *            für logging
-	 * @param targetAddress
-	 *            Target address for requests; can be either a server address or
-	 *            an onion address.
-	 * @param targetPort
-	 *            Target port for requests; can be either a server port or a
-	 *            virtual port of a hidden service.
-	 * @param socksPort
-	 *            SOCKS port of the local Tor node.
-	 */
-	ClientApplicationImpl(NetworkImpl network, String clientApplicationName,
-			String targetAddress, int targetPort, int socksPort) {
-
-		// TODO make sure that name is loggable!!
-
-		// create logger
-		this.logger = Logger.getLogger("application." + clientApplicationName);
-
-		// log entering
-		this.logger.entering(this.getClass().getName(),
-				"ClientApplicationImpl", new Object[] { clientApplicationName,
-						targetAddress, targetPort, socksPort });
-
-		// check parameters
-		if (clientApplicationName == null
-				|| clientApplicationName.length() == 0 || targetAddress == null
-				|| targetAddress.length() == 0 || targetPort < 0
-				|| targetPort > 65535 || socksPort < 0 || socksPort > 65535) {
-
-			IllegalArgumentException e = new IllegalArgumentException("bla");
-			this.logger.throwing(this.getClass().getName(),
-					"ClientApplicationImpl", e);
-			throw e;
-		}
-
-		// remember parameters
-		this.clientApplicationName = clientApplicationName;
-		this.targetAddress = targetAddress;
-		this.targetPort = targetPort;
-		this.socksPort = socksPort;
-
-		// obtain reference on event manager
-		this.eventManager = network.getEventManagerImpl();
-
-		// log exiting
-		this.logger.exiting(this.getClass().getName(), "ClientApplicationImpl");
-	}
-
-	/**
-	 * bricht alle laufenden requests ab
-	 * 
-	 */
-	public void stopRequest() {
-
-		// log entering
-		this.logger.entering(this.getClass().getName(), "stopRequest");
-
-		// check if a request is running
-		if (this.clientThread == null) {
-			throw new IllegalStateException("No request has been started!");
-		}
-
-		// log this event
-		this.logger.log(Level.FINE, "Shutting down client");
-
-		// interrupt thread
-		this.clientThread.stopRequest();
-
-		// log exiting
-		this.logger.exiting(this.getClass().getName(), "stopRequest");
-	}
-
-	/**
-	 * (logging done)
-	 * 
-	 * startet einen oder mehrere aufeinander folgende aufrufe an die im
-	 * konstruktor übergebene adresse und port.
-	 */
-	public void performRequest(int retries, long timeoutForEachRetry,
-			boolean stopOnSuccess) {
-
-		// log entering
-		this.logger.entering(this.getClass().getName(), "performRequest",
-				new Object[] { retries, timeoutForEachRetry, stopOnSuccess });
-
-		// check parameters
-		if (retries <= 0 || timeoutForEachRetry < 0) {
-			throw new IllegalArgumentException();
-		}
-
-		// check if we already have started a request (TODO change this to allow
-		// multiple requests in parallel? would be possible)
-		if (this.clientThread != null) {
-			throw new IllegalStateException(
-					"Another request has already been started!");
-		}
-
-		// create a thread that performs requests in the background
-		this.clientThread = new RequestThread(retries, timeoutForEachRetry,
-				stopOnSuccess);
-		this.clientThread.setName("Request Thread");
-		this.clientThread.setDaemon(true);
-		this.clientThread.start();
-
-		// log exiting
-		this.logger.exiting(this.getClass().getName(), "performRequest");
-	}
-
-	/**
-	 * (logging done)
-	 * 
-	 * @author kloesing
-	 * 
-	 */
-	private class RequestThread extends Thread {
-
-		private int retries;
-
+		/**
+		 * Timeout in milliseconds for each retry.
+		 */
 		private long timeoutForEachRetry;
 
-		private boolean connected;
-
-		private boolean stopOnSuccess;
-
+		/**
+		 * Creates a new thread, but does not start performing requests, yet.
+		 * 
+		 * @param retries
+		 *            Number of retries to be performed.
+		 * @param timeoutForEachRetry
+		 *            Timeout in milliseconds for each retry.
+		 * @param stopOnSuccess
+		 *            Flag that determines whether requests shall be stopped
+		 *            after the first successful reply (<code>true</code>),
+		 *            or not (<code>false</code>).
+		 */
 		RequestThread(int retries, long timeoutForEachRetry,
 				boolean stopOnSuccess) {
 
@@ -206,6 +70,13 @@
 							new Object[] { retries, timeoutForEachRetry,
 									stopOnSuccess });
 
+			// check parameters
+			if (retries < 0 || timeoutForEachRetry < 0) {
+				IllegalArgumentException e = new IllegalArgumentException();
+				logger.throwing(this.getClass().getName(), "RequestThread", e);
+				throw e;
+			}
+
 			// remember parameters
 			this.retries = retries;
 			this.timeoutForEachRetry = timeoutForEachRetry;
@@ -219,25 +90,8 @@
 		}
 
 		/**
-		 * stoppt diesen request egal wo er gerade steht
-		 * 
+		 * Perform one or more requests.
 		 */
-		public void stopRequest() {
-
-			// log entering
-			logger.entering(this.getClass().getName(), "stopRequest");
-
-			// change connected state to false and interrupt thread
-			this.connected = false;
-			this.interrupt();
-
-			// log exiting
-			logger.exiting(this.getClass().getName(), "stopRequest");
-		}
-
-		/**
-		 * (logging done)
-		 */
 		@Override
 		public void run() {
 
@@ -251,12 +105,12 @@
 						socksPort);
 				Proxy p = new Proxy(Type.SOCKS, isa);
 
-				// create target address for socket -- don't resolve the target address
-				// to an IP address!
-				InetSocketAddress hs = InetSocketAddress.createUnresolved(targetAddress,
-						targetPort);
+				// create target address for socket -- don't resolve the target
+				// name to an IP address!
+				InetSocketAddress hs = InetSocketAddress.createUnresolved(
+						targetName, targetPort);
 
-				// start loop
+				// start retry loop
 				for (int i = 0; connected && i < retries; i++) {
 
 					// log this try
@@ -331,7 +185,7 @@
 
 						// wait for the rest of the timeout
 						long timeOfTimeoutLeft = timeBeforeConnectionAttempt
-								+ timeoutForEachRetry
+								+ this.timeoutForEachRetry
 								- System.currentTimeMillis();
 						if (timeOfTimeoutLeft > 0) {
 							try {
@@ -379,13 +233,189 @@
 				logger.exiting(this.getClass().getName(), "run");
 			}
 		}
+
+		/**
+		 * Immediately stops this and all possibly subsequent requests.
+		 */
+		public void stopRequest() {
+
+			// log entering
+			logger.entering(this.getClass().getName(), "stopRequest");
+
+			// change connected state to false and interrupt thread
+			this.connected = false;
+			this.interrupt();
+
+			// log exiting
+			logger.exiting(this.getClass().getName(), "stopRequest");
+		}
 	}
 
+	/**
+	 * Name of this client application that is used as logger name of this node.
+	 */
+	private String clientApplicationName;
+
+	/**
+	 * Thread that performs the requests in the background.
+	 */
+	private RequestThread clientThread;
+
+	/**
+	 * Event manager to which all events concerning this client application are
+	 * notified.
+	 */
+	private EventManagerImpl eventManager;
+
+	/**
+	 * Logger for this client.
+	 */
+	private Logger logger;
+
+	/**
+	 * SOCKS port of the local Tor node to which requests are sent.
+	 */
+	private int socksPort;
+
+	/**
+	 * Target name for the requests sent by this client; can be either a server
+	 * name/address or an onion address.
+	 */
+	private String targetName;
+
+	/**
+	 * Target port for the requests sent by this client; can be either a server
+	 * port or a virtual port of a hidden service.
+	 */
+	private int targetPort;
+
+	/**
+	 * Creates a new HTTP client within this JVM, but does not start sending
+	 * requests.
+	 * 
+	 * @param network
+	 *            Network to which this HTTP client belongs; at the moment this
+	 *            is only used to determine the event manager instance.
+	 * @param clientApplicationName
+	 *            Name of this client that is used as part of the logger name.
+	 * @param targetName
+	 *            Target name for requests; can be either a server name/address
+	 *            or an onion address.
+	 * @param targetPort
+	 *            Target port for requests; can be either a server port or a
+	 *            virtual port of a hidden service.
+	 * @param socksPort
+	 *            SOCKS port of the local Tor node.
+	 * @throws IllegalArgumentException
+	 *             If at least one of the parameters is <code>null</code> or has an invalid
+	 *             value.
+	 */
+	ClientApplicationImpl(NetworkImpl network, String clientApplicationName,
+			String targetName, int targetPort, int socksPort) {
+
+		// check if clientApplicationName can be used as logger name
+		if (clientApplicationName == null
+				|| clientApplicationName.length() == 0) {
+			throw new IllegalArgumentException(
+					"Invalid clientApplicationName: " + clientApplicationName);
+		}
+
+		// create logger
+		this.logger = Logger.getLogger("application." + clientApplicationName);
+
+		// log entering
+		this.logger.entering(this.getClass().getName(),
+				"ClientApplicationImpl", new Object[] { network,
+						clientApplicationName, targetName, targetPort,
+						socksPort });
+
+		// check parameters
+		if (network == null || targetName == null || targetName.length() == 0
+				|| targetPort < 0 || targetPort > 65535 || socksPort < 0
+				|| socksPort > 65535) {
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(),
+					"ClientApplicationImpl", e);
+			throw e;
+		}
+
+		// remember parameters
+		this.clientApplicationName = clientApplicationName;
+		this.targetName = targetName;
+		this.targetPort = targetPort;
+		this.socksPort = socksPort;
+
+		// obtain and store reference on event manager
+		this.eventManager = network.getEventManagerImpl();
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "ClientApplicationImpl");
+	}
+
+	public synchronized void performRequest(int retries,
+			long timeoutForEachRetry, boolean stopOnSuccess) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "performRequest",
+				new Object[] { retries, timeoutForEachRetry, stopOnSuccess });
+
+		// check parameters
+		if (retries <= 0 || timeoutForEachRetry < 0) {
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger
+					.throwing(this.getClass().getName(), "performRequest", e);
+			throw e;
+		}
+
+		// check if we already have started a request (TODO change this to allow
+		// multiple requests in parallel? would be possible)
+		if (this.clientThread != null) {
+			IllegalStateException e = new IllegalStateException(
+					"Another request has already been started!");
+			this.logger
+					.throwing(this.getClass().getName(), "performRequest", e);
+			throw e;
+		}
+
+		// create a thread that performs requests in the background
+		this.clientThread = new RequestThread(retries, timeoutForEachRetry,
+				stopOnSuccess);
+		this.clientThread.setName("Request Thread");
+		this.clientThread.setDaemon(true);
+		this.clientThread.start();
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "performRequest");
+	}
+
+	public synchronized void stopRequest() {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "stopRequest");
+
+		// check if a request is running
+		if (this.clientThread == null) {
+			IllegalStateException e = new IllegalStateException("Cannot stop "
+					+ "request, because no request has been started!");
+			this.logger.throwing(this.getClass().getName(), "stopRequest", e);
+			throw e;
+		}
+
+		// log this event
+		this.logger.log(Level.FINE, "Shutting down client");
+
+		// interrupt thread
+		this.clientThread.stopRequest();
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "stopRequest");
+	}
+
 	@Override
 	public String toString() {
 		return this.getClass().getSimpleName() + ": clientApplicationName=\""
 				+ this.clientApplicationName + "\", targetAddress=\""
-				+ this.targetAddress + "\", targetPort=" + this.targetPort
+				+ this.targetName + "\", targetPort=" + this.targetPort
 				+ ", socksPort=" + this.socksPort;
 	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,8 +1,3 @@
-/*
- * NOTICE: This file is still work in progress. As you can see the Java
- * documentation is written partly in German and in English and logging and
- * documentation still need some work. Sorry for any inconvenience!  
- */
 package de.uniba.wiai.lspi.puppetor.impl;
 
 import java.io.BufferedWriter;
@@ -16,19 +11,59 @@
 import de.uniba.wiai.lspi.puppetor.DirectoryNode;
 import de.uniba.wiai.lspi.puppetor.TorProcessException;
 
+/**
+ * Implementation of <code>DirectoryNode</code>.
+ * 
+ * @author karsten
+ */
 public class DirectoryNodeImpl extends RouterNodeImpl implements DirectoryNode {
+
 	/**
-	 * Initializes this Tor node, but does not start it, yet.
+	 * Creates a <code>DirectoryNodeImpl</code> and adds it to the given
+	 * <code>network</code>, but does not yet write its configuration to disk
+	 * or start the corresponding Tor process.
+	 * 
+	 * @param network
+	 *            Network configuration to which this node belongs.
+	 * @param nodeName
+	 *            The name of the new node which may only consist of between 1
+	 *            and 19 alpha-numeric characters.
+	 * @param controlPort
+	 *            Port on which the Tor node will be listening for us as its
+	 *            controller. May not be negative or greater than 65535.
+	 * @param socksPort
+	 *            Port on which the Tor node will be listening for SOCKS
+	 *            connection requests. May not be negative or greater than
+	 *            65535.
+	 * @param orPort
+	 *            Port on which the Tor node will be listening for onion
+	 *            requests by other Tor nodes. May not be negative or greater
+	 *            than 65535.
+	 * @param dirPort
+	 *            Port on which the Tor node will be listening for directory
+	 *            requests from other Tor nodes. May not be negative or greater
+	 *            than 65535.
+	 * @throws IllegalArgumentException
+	 *             If at least one of the parameters is <code>null</code> or
+	 *             has an invalid value.
 	 */
-	public DirectoryNodeImpl(NetworkImpl network, String nodeName,
-			int controlPort, int socksPort, int orPort, int dirPort) {
+	DirectoryNodeImpl(NetworkImpl network, String nodeName, int controlPort,
+			int socksPort, int orPort, int dirPort) {
+
+		// create superclass instance; parameter checking is done in super
+		// constructor
 		super(network, nodeName, controlPort, socksPort, orPort, dirPort);
 
+		// log entering
+		this.logger.entering(this.getClass().getName(), "DirectoryNodeImpl",
+				new Object[] { network, nodeName, controlPort, socksPort,
+						orPort, dirPort });
+
 		// configure this node as an authoritative directory
 		this.configuration.add("AuthoritativeDirectory 1");
 
 		// TODO make this a little bit more configurable---same as to
-		// location of tor.exe?
+		// location of tor executable?
 		this.configuration
 				.add("RecommendedVersions 0.1.2.12-rc,0.1.2.7-alpha-dev,0.2.0.0-alpha-dev");
 
@@ -36,19 +71,61 @@
 
 		this.configuration.add("NamingAuthoritativeDirectory 1");
 
-		this.configuration.add("V2AuthoritativeDirectory 1");
+		// TODO this requires version 0.2.x
+		//this.configuration.add("V2AuthoritativeDirectory 1");
 		this.configuration.add("V1AuthoritativeDirectory 1");
 
 		// TODO this only works since Tor 0.1.2.x!!!
 		this.configuration.add("HSAuthoritativeDir 1");
 
+		// TODO only in v0.2.x
+		//this.configuration.add("HSAuthorityRecordStats 1");
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "DirectoryNodeImpl");
 	}
 
-	public void writeApprovedRouters(Set<String> approvedRouters)
+	public synchronized String determineDirServerString()
 			throws TorProcessException {
-		
-		// check param!
-		
+
+		// log entering
+		this.logger.entering(this.getClass().getName(),
+				"determineDirServerString");
+
+		// determine fingerprint
+		String fingerprint = determineFingerprint();
+
+		// cut off router nickname
+		fingerprint = fingerprint.substring(fingerprint.indexOf(" ") + 1);
+
+		// put everything together
+		String dirServerString = "DirServer " + this.nodeName + " hs orport="
+				+ this.orPort + " " + localIpAddress + ":" + this.dirPort + " "
+				+ fingerprint;
+
+		// log exiting and return dir server string
+		this.logger.exiting(this.getClass().getName(),
+				"determineDirServerString", dirServerString);
+		return dirServerString;
+	}
+
+	public synchronized void writeApprovedRouters(Set<String> approvedRouters)
+			throws TorProcessException {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "writeApprovedRouters",
+				approvedRouters);
+
+		// check parameter
+		if (approvedRouters == null) {
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(),
+					"writeApprovedRouters", e);
+			throw e;
+		}
+
+		// sort the given approved router strings alphabetically and store them
+		// to file
 		try {
 			File approvedRoutersFile = new File(this.workingDir
 					.getAbsolutePath()
@@ -62,22 +139,13 @@
 			}
 			bw.close();
 		} catch (IOException e) {
-			throw new TorProcessException(e);
+			TorProcessException ex = new TorProcessException(e);
+			this.logger.throwing(this.getClass().getName(),
+					"writeApprovedRouters", ex);
+			throw ex;
 		}
-	}
 
-	public synchronized String determineDirServerString()
-			throws TorProcessException {
-
-		// determine fingerprint
-		String fingerprint = determineFingerprint();
-
-		// cut off router nickname
-		fingerprint = fingerprint.substring(fingerprint.indexOf(" ") + 1);
-
-		// put together everything
-		String dirServerString = "DirServer " + this.nodeName
-				+ " hs " + localIpAddress + ":" + this.dirPort + " " + fingerprint;
-		return dirServerString;
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "writeApprovedRouters");
 	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventManagerImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventManagerImpl.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventManagerImpl.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,8 +1,3 @@
-/*
- * NOTICE: This file is still work in progress. As you can see the Java
- * documentation is written partly in German and in English and logging and
- * documentation still need some work. Sorry for any inconvenience!  
- */
 package de.uniba.wiai.lspi.puppetor.impl;
 
 import java.util.ArrayList;
@@ -19,23 +14,61 @@
 import de.uniba.wiai.lspi.puppetor.EventManager;
 import de.uniba.wiai.lspi.puppetor.EventSource;
 
+/**
+ * Implementation of <code>EventManager</code>.
+ */
 public class EventManagerImpl implements EventManager {
 
+	/**
+	 * Registered event handlers.
+	 */
+	private Map<EventSource, Set<EventListener>> eventHandlers;
+
+	/**
+	 * Logger for this <code>EventManagerImpl</code> instance which is called
+	 * "event." plus the name of the network.
+	 */
 	private Logger logger;
 
+	/**
+	 * Events observed so far.
+	 */
+	private Map<EventSource, List<Event>> observedEvents;
+
+	/**
+	 * Creates a new <code>EventManagerImpl</code> for the network with name
+	 * <code>networkName</code> and initializes it.
+	 * 
+	 * @param networkName
+	 *            Name of this event manager that is used as part of the logger
+	 *            name.
+	 * @throws IllegalArgumentException
+	 *             Thrown if the given <code>networkName</code> is either
+	 *             <code>null</code> or a zero-length string.
+	 */
 	EventManagerImpl(String networkName) {
-		
-//		 TODO make sure that name is loggable!!
-		
+
+		// check if networkName can be used as logger name
+		if (networkName == null || networkName.length() == 0) {
+			throw new IllegalArgumentException("Invalid networkName: "
+					+ networkName);
+		}
+
+		// create logger
 		this.logger = Logger.getLogger("event." + networkName);
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "EventManagerImpl",
+				networkName);
+
+		// create data structures
 		this.observedEvents = new HashMap<EventSource, List<Event>>();
 		this.eventHandlers = new HashMap<EventSource, Set<EventListener>>();
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "EventManagerImpl");
 	}
 
-	private Map<EventSource, List<Event>> observedEvents;
-
-	private Map<EventSource, Set<EventListener>> eventHandlers;
-
 	public synchronized List<Event> addEventListener(EventSource source,
 			EventListener listener) {
 
@@ -45,7 +78,10 @@
 
 		// check parameters
 		if (source == null || listener == null) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(), "addEventListener",
+					e);
+			throw e;
 		}
 
 		// if necessary, create new event listener set for source
@@ -70,12 +106,15 @@
 	public synchronized List<Event> getEventHistory(EventSource source) {
 
 		// log entering
-		this.logger.entering(this.getClass().getName(), "getNodeEventHistory",
+		this.logger.entering(this.getClass().getName(), "getEventHistory",
 				source);
 
 		// check parameter
 		if (source == null) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(), "getEventHistory",
+					e);
+			throw e;
 		}
 
 		// prepare result
@@ -88,10 +127,9 @@
 		}
 
 		// log exiting and return result
-		this.logger.exiting(this.getClass().getName(), "getNodeEventHistory",
+		this.logger.exiting(this.getClass().getName(), "getEventHistory",
 				result);
 		return result;
-
 	}
 
 	public synchronized boolean hasEventOccured(EventSource source, Event event) {
@@ -102,7 +140,10 @@
 
 		// check parameters
 		if (source == null || event == null) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(), "hasEventOccured",
+					e);
+			throw e;
 		}
 
 		// determine result
@@ -115,6 +156,57 @@
 		return result;
 	}
 
+	/**
+	 * Stores the given <code>event</code> from <code>source</code> to the
+	 * event history and propagates its occurrence to all registered event
+	 * handlers.
+	 * 
+	 * @param source
+	 *            The source of the given event.
+	 * @param event
+	 *            The event type.
+	 */
+	synchronized void observeEvent(EventSource source, Event event) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "observeEvent",
+				new Object[] { source, event });
+
+		this.logger.log(Level.FINE, "Observed event " + event + " from source "
+				+ source + "!");
+
+		// remember observed event
+		if (!this.observedEvents.containsKey(source)) {
+			this.observedEvents.put(source, new ArrayList<Event>());
+		}
+		this.observedEvents.get(source).add(event);
+
+		// notify waiting threads
+		notifyAll();
+
+		// inform event listeners
+		if (this.eventHandlers.containsKey(source)) {
+
+			// make a copy of the event handler set, because some event handlers
+			// might want to remove themselves from this set while handling the
+			// event
+
+			Set<EventListener> copyOfEventHandlers = new HashSet<EventListener>(
+					this.eventHandlers.get(source));
+
+			for (EventListener eventHandler : copyOfEventHandlers) {
+
+				this.logger.log(Level.FINE, "Informing event listener "
+						+ eventHandler + " about recently observed event "
+						+ event + " from source " + source + "!");
+				eventHandler.handleEvent(event);
+			}
+		}
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "observeEvent");
+	}
+
 	public synchronized void removeEventListener(EventListener eventListener) {
 
 		// log entering
@@ -123,7 +215,10 @@
 
 		// check parameters
 		if (eventListener == null) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(),
+					"removeEventListener", e);
+			throw e;
 		}
 
 		// don't know to which source this listener has been added (may to more
@@ -146,7 +241,10 @@
 
 		// check parameters
 		if (source == null || event == null) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(),
+					"waitForAnyOccurence", e);
+			throw e;
 		}
 
 		// invoke overloaded method with maximumTimeToWaitInMillis of -1L which
@@ -167,15 +265,16 @@
 
 		// check parameters
 		if (source == null || event == null) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(),
+					"waitForAnyOccurence", e);
+			throw e;
 		}
 
 		// check if we have already observed the event
 		if (this.hasEventOccured(source, event)) {
-
 			this.logger.log(Level.FINE, "Waiting for any occurence of event "
 					+ event + " returned immediately!");
-
 			this.logger.exiting(this.getClass().getName(),
 					"waitForAnyOccurence", true);
 			return true;
@@ -189,7 +288,6 @@
 		this.logger.exiting(this.getClass().getName(), "waitForAnyOccurence",
 				result);
 		return result;
-
 	}
 
 	public synchronized void waitForNextOccurence(EventSource source,
@@ -201,7 +299,10 @@
 
 		// check parameters
 		if (source == null || event == null) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(),
+					"waitForNextOccurence", e);
+			throw e;
 		}
 
 		// invoke overloaded method with maximumTimeToWaitInMillis of -1L which
@@ -210,7 +311,6 @@
 
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "waitForNextOccurence");
-
 	}
 
 	public synchronized boolean waitForNextOccurence(EventSource source,
@@ -222,7 +322,10 @@
 
 		// check parameters
 		if (source == null || event == null) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(),
+					"waitForNextOccurence", e);
+			throw e;
 		}
 
 		// distinguish between negative waiting time (wait forever) and zero or
@@ -299,50 +402,4 @@
 		}
 	}
 
-	/**
-	 * wird lokal aufgerufen; speichert event in history und meldet es an alle
-	 * registrierten event handler weiter
-	 * 
-	 */
-	synchronized void observeEvent(EventSource source, Event event) {
-
-		// log entering
-		this.logger.entering(this.getClass().getName(), "observeEvent",
-				new Object[] { source, event });
-
-		this.logger.log(Level.FINE, "Observed event " + event + " from source "
-				+ source + "!");
-
-		// remember observed event
-		if (!this.observedEvents.containsKey(source)) {
-			this.observedEvents.put(source, new ArrayList<Event>());
-		}
-		this.observedEvents.get(source).add(event);
-
-		// notify waiting threads
-		notifyAll();
-
-		// inform event listeners
-		if (this.eventHandlers.containsKey(source)) {
-
-			// make a copy of the event handler set, because some event handlers
-			// might want to remove itself from this set while handling the
-			// event
-
-			Set<EventListener> copyOfEventHandlers = new HashSet<EventListener>(
-					this.eventHandlers.get(source));
-
-			for (EventListener eventHandler : copyOfEventHandlers) {
-
-				this.logger.log(Level.FINE, "Informing event listener "
-						+ eventHandler + " about recently observed event "
-						+ event + " from source " + source + "!");
-				eventHandler.handleEvent(event);
-			}
-		}
-
-		// log exiting
-		this.logger.exiting(this.getClass().getName(), "observeEvent");
-	}
-
-}
+}

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/NetworkImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/NetworkImpl.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/NetworkImpl.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,8 +1,3 @@
-/*
- * NOTICE: This file is still work in progress. As you can see the Java
- * documentation is written partly in German and in English and logging and
- * documentation still need some work. Sorry for any inconvenience!  
- */
 package de.uniba.wiai.lspi.puppetor.impl;
 
 import java.io.File;
@@ -24,92 +19,526 @@
 import de.uniba.wiai.lspi.puppetor.ServerApplication;
 import de.uniba.wiai.lspi.puppetor.TorProcessException;
 
+/**
+ * Implementation of <code>Network</code>.
+ * 
+ * @author kloesing
+ */
 public class NetworkImpl implements Network {
 
-	private EventManagerImpl eventManager;
+	/**
+	 * Internal thread class that is used to determine fingerprints in parallel.
+	 */
+	private class FingerprintThread extends Thread {
 
-	@Override
-	public String toString() {
-		return this.getClass().getSimpleName() + ": networkName=\""
-				+ this.networkName + "\", networkState="
-				+ this.networkState.toString() + ", nodes.size()="
-				+ this.nodes.size();
+		/**
+		 * The exception, if one is caught while trying to determine the
+		 * fingerprint of the node.
+		 */
+		private TorProcessException caughtException = null;
+
+		/**
+		 * The node of which the fingerprint shall be determined.
+		 */
+		private RouterNode node = null;
+
+		/**
+		 * Creates a new thread to determine the fingerprint of
+		 * <code>node</code>.
+		 * 
+		 * @param node
+		 *            The node of which the fingerprint shall be determined.
+		 */
+		FingerprintThread(RouterNode node) {
+
+			// log entering
+			logger.entering(this.getClass().getName(), "FingerprintThread");
+
+			// remember node reference
+			this.node = node;
+
+			// log exiting
+			logger.exiting(this.getClass().getName(), "FingerprintThread");
+		}
+
+		@Override
+		public void run() {
+
+			// log entering
+			logger.entering(this.getClass().getName(), "run");
+
+			// determine fingerprint
+			try {
+				node.determineFingerprint();
+			} catch (TorProcessException e) {
+				logger.log(Level.SEVERE,
+						"Caught an exception while determining fingerprint for "
+								+ "node " + node.toString() + "!");
+				this.caughtException = e;
+			}
+
+			// log exiting
+			logger.exiting(this.getClass().getName(), "run");
+		}
 	}
 
+	/**
+	 * Internal thread class that is used to start Tor processes in parallel.
+	 */
+	private class NodeStarter extends Thread {
+
+		/**
+		 * The exception, if one is caught while trying to start the node.
+		 */
+		TorProcessException caughtException;
+
+		/**
+		 * The maximum time to wait for the Tor process to start in
+		 * milliseconds.
+		 */
+		private long maximumTimeToWaitInMillis;
+
+		/**
+		 * The node for which the Tor process shall be started.
+		 */
+		private ProxyNode node;
+
+		/**
+		 * Flag that denotes whether starting the Tor process was successful.
+		 */
+		boolean success = false;
+
+		/**
+		 * Creates a new <code>NodeStarter</code> for node <code>node</code>
+		 * that will wait for <code>maximumTimeToWaitInMillis</code>
+		 * milliseconds to start a Tor process, but that is not started, yet.
+		 * 
+		 * @param node
+		 *            The node for which the Tor process shall be started.
+		 * @param maximumTimeToWaitInMillis
+		 *            The maximum time to wait for the Tor process to start in
+		 *            milliseconds.
+		 */
+		NodeStarter(ProxyNode node, long maximumTimeToWaitInMillis) {
+
+			// log entering
+			logger.entering(this.getClass().getName(), "NodeStarter",
+					new Object[] { node, maximumTimeToWaitInMillis });
+
+			// store parameters
+			this.node = node;
+			this.maximumTimeToWaitInMillis = maximumTimeToWaitInMillis;
+
+			// log exiting
+			logger.exiting(this.getClass().getName(), "NodeStarter");
+		}
+
+		@Override
+		public void run() {
+
+			// log entering
+			logger.entering(this.getClass().getName(), "run");
+
+			try {
+				// try to start node
+				this.success = this.node
+						.startNode(this.maximumTimeToWaitInMillis);
+			} catch (TorProcessException e) {
+				// if an exception is caught, store it, but don't throw it (the
+				// thread wouldn't care)
+				this.caughtException = e;
+			}
+
+			// log exiting
+			logger.exiting(this.getClass().getName(), "run");
+		}
+	}
+
+	/**
+	 * The fingerprints of all approved routers in the network configuration.
+	 */
+	private HashSet<String> approvedRoutersFingerprints;
+
+	/**
+	 * The fingerprints of all authoritative directories in the network
+	 * configuration.
+	 */
+	private Set<String> authorizedDirectoriesFingerprints;
+
+	/**
+	 * Event manager to which all events concerning this network are notified.
+	 */
+	private EventManagerImpl eventManager;
+
+	/**
+	 * Logger for this <code>NetworkImpl</code> instance which is called
+	 * "network." plus the name of this network.
+	 */
 	private Logger logger;
 
 	/**
-	 * Contains the name of this node configuration which is the String
-	 * conversion of System.currentTimeMillis().
+	 * Contains the name of this network configuration which is the String
+	 * conversion of System.currentTimeMillis() of the network creation time.
 	 */
-	protected String networkName;
+	private String networkName;
 
 	/**
+	 * The state of this network.
+	 */
+	private NetworkState networkState = NetworkState.CONFIGURING_NODES;
+
+	/**
+	 * All nodes contained in this network. It is important that we store and
+	 * work only with interface types to assure that all operations could also
+	 * be performed by the application itself.
+	 */
+	private Set<ProxyNode> nodes = new HashSet<ProxyNode>();
+
+	/**
+	 * Directory that contains status information of all nodes contained in this
+	 * network.
+	 */
+	private File workingDir;
+
+	/**
 	 * Creates an initially unpopulated Tor network and creates a new working
 	 * directory for it at test-env/randomTestID/.
 	 * 
 	 * @param networkName
-	 *            Name of this network configuration.
-	 * @param logToConsole
-	 *            Whether logging statements shall be written to the console or
-	 *            to a file.
+	 *            Name of this network configuration. May neither be
+	 *            <code>null</code> or a zero-length string.
+	 * @throws IllegalArgumentException
+	 *             Thrown if the given <code>networkName</code> is either
+	 *             <code>null</code> or a zero-length string.
 	 */
 	public NetworkImpl(String networkName) {
-		
-//		 TODO make sure that name is loggable!!
-		
+
+		// check if networkName can be used as logger name
+		if (networkName == null || networkName.length() == 0) {
+			throw new IllegalArgumentException("Invalid networkName: "
+					+ networkName);
+		}
+
+		// create logger
 		this.logger = Logger.getLogger("network." + networkName);
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "NetworkImpl",
+				networkName);
+
+		// TODO is this necessary?!
 		this.logger.setLevel(Level.ALL);
+
+		// remember parameter
 		this.networkName = networkName;
+
+		// create working directory
 		this.workingDir = new File("test-env/" + System.currentTimeMillis());
 		this.workingDir.mkdirs();
+		this.logger.log(Level.FINE, "Created working directory \""
+				+ this.workingDir.getAbsolutePath() + "\"");
 
 		// TODO if we want to log to file, set this... somehow...
 		// this.logFile = new File(this.workingDir.getAbsolutePath()
 		// + "\\events.log");
 
+		// create event manager
 		this.eventManager = new EventManagerImpl(this.networkName);
-	}
 
-	public NetworkState getNetworkState() {
-		// TODO Auto-generated method stub
-		throw new UnsupportedOperationException(
-				"Auto-generated method stub in NetworkImpl.getNetworkState");
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "NetworkImpl");
 	}
 
+	/**
+	 * Returns whether all nodes in this network are up, or not.
+	 * 
+	 * @return <code>true</code> if all nodes are up, <code>false</code> if
+	 *         at least one node is not up.
+	 */
 	private boolean allNodesUp() {
 
-		// check if all nodes are up
+		// log entering
+		this.logger.entering(this.getClass().getName(), "allNodesUp");
+
+		// nodes can only be up, when network is in state
+		// NetworkState.NODES_STARTED.
+		if (this.networkState != NetworkState.NODES_STARTED) {
+
+			// log exiting and return false
+			this.logger.exiting(this.getClass().getName(), "allNodesUp");
+			return false;
+		}
+
+		// fail on first node that is not up
 		for (ProxyNode node : this.nodes) {
 			if (!eventManager.hasEventOccured(node, Event.NODE_CIRCUIT_OPENED)) {
+
+				// log exiting and return false
+				this.logger.exiting(this.getClass().getName(), "allNodesUp");
 				return false;
 			}
 		}
+
+		// log exiting and return true
+		this.logger.exiting(this.getClass().getName(), "allNodesUp");
 		return true;
 	}
 
+	public void configureAsPrivateNetwork() throws TorProcessException {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(),
+				"configureAsPrivateNetwork");
+
+		// start threads to determine fingerprints for all directories and
+		// routers in parallel
+		Set<FingerprintThread> fingerprintThreads = new HashSet<FingerprintThread>();
+		for (ProxyNode node : nodes) {
+			if (node instanceof RouterNode) {
+				RouterNode dirOrRouterNode = (RouterNode) node;
+				FingerprintThread fingerprintThread = new FingerprintThread(
+						dirOrRouterNode);
+				fingerprintThread.setName(node.getNodeName()
+						+ " Fingerprint Resolver");
+				fingerprintThreads.add(fingerprintThread);
+				fingerprintThread.start();
+			}
+		}
+
+		// wait for all fingerprints have been determined
+		for (FingerprintThread fingerprintThread : fingerprintThreads) {
+
+			// join fingerprint determination one after the other
+			try {
+				fingerprintThread.join();
+			} catch (InterruptedException e) {
+				// ignore; TODO really?!
+				logger.log(Level.WARNING,
+						"Joining fingerprint thread was interrupted.");
+			}
+
+			// if any thread has caught an exception, throw that exception now
+			if (fingerprintThread.caughtException != null) {
+				this.logger.throwing(this.getClass().getName(),
+						"configureAsPrivateNetwork",
+						fingerprintThread.caughtException);
+				throw fingerprintThread.caughtException;
+			}
+		}
+
+		// read DirServer strings for all directories from memory; they should
+		// have been read from disk before, so that this will perform really
+		// fast
+		this.authorizedDirectoriesFingerprints = new HashSet<String>();
+		for (ProxyNode node : this.nodes) {
+			if (node instanceof DirectoryNode) {
+				DirectoryNode dirNode = (DirectoryNode) node;
+				this.authorizedDirectoriesFingerprints.add(dirNode
+						.determineDirServerString());
+			}
+
+		}
+
+		// configure nodes
+		for (ProxyNode node : this.nodes) {
+			if (node.getNodeState() == NodeState.CONFIGURING) {
+				node
+						.configureDirServers(this.authorizedDirectoriesFingerprints);
+			}
+		}
+
+		// read fingerprints for all directories and routers from memory; they
+		// should have been read from disk before, so that this will perform
+		// really fast
+		this.approvedRoutersFingerprints = new HashSet<String>();
+		for (ProxyNode node : this.nodes) {
+			if (node instanceof RouterNode) {
+				RouterNode routerOrDirNode = (RouterNode) node;
+				this.approvedRoutersFingerprints.add(routerOrDirNode
+						.determineFingerprint());
+			}
+		}
+		
+		// write fingerprints for all directories and routers to
+		// approved-routers file
+		for (ProxyNode node : this.nodes) {
+			if (node instanceof DirectoryNode) {
+				DirectoryNode dirNode = (DirectoryNode) node;
+				dirNode.writeApprovedRouters(this.approvedRoutersFingerprints);
+			}
+		}
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(),
+				"configureAsPrivateNetwork");
+	}
+
+	public ClientApplication createClient(String clientApplicationName,
+			String targetAddress, int targetPort, int socksPort) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "createClient",
+				new Object[] { clientApplicationName, targetAddress,
+						targetPort, socksPort });
+
+		// create client; parameter checking is done in constructor
+		ClientApplicationImpl client = new ClientApplicationImpl(this,
+				clientApplicationName, targetAddress, targetPort, socksPort);
+
+		// log exiting and return client
+		this.logger.exiting(this.getClass().getName(), "createClient", client);
+		return client;
+	}
+
+	public DirectoryNode createDirectory(String nodeName, int controlPort,
+			int socksPort, int orPort, int dirPort) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "createDirectory",
+				new Object[] { nodeName, controlPort, socksPort, orPort,
+						dirPort });
+
+		// check state
+		if (this.networkState != NetworkState.CONFIGURING_NODES) {
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(), "createDirectory",
+					e);
+			throw e;
+		}
+
+		// create directory node; parameter checking is done in constructor
+		DirectoryNode dir = new DirectoryNodeImpl(this, nodeName, controlPort,
+				socksPort, orPort, dirPort);
+
+		// add new directory node to nodes collection
+		this.nodes.add(dir);
+
+		// log exiting and return directory node
+		this.logger.exiting(this.getClass().getName(), "createDirectory", dir);
+		return dir;
+	}
+
+	public ProxyNode createProxy(String nodeName, int controlPort, int socksPort) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "createProxy",
+				new Object[] { nodeName, controlPort, socksPort });
+
+		// check state
+		if (this.networkState != NetworkState.CONFIGURING_NODES) {
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(), "createProxy", e);
+			throw e;
+		}
+
+		// create proxy node; parameter checking is done in constructor
+		ProxyNodeImpl proxy = new ProxyNodeImpl(this, nodeName, controlPort,
+				socksPort);
+
+		// add new proxy node to nodes collection
+		this.nodes.add(proxy);
+
+		// log exiting and return proxy node
+		this.logger.exiting(this.getClass().getName(), "createProxy", proxy);
+		return proxy;
+	}
+
+	public RouterNode createRouter(String nodeName, int controlPort,
+			int socksPort, int orPort, int dirPort) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "createRouter",
+				new Object[] { nodeName, controlPort, socksPort, orPort,
+						dirPort });
+
+		// check state
+		if (this.networkState != NetworkState.CONFIGURING_NODES) {
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(), "createRouter", e);
+			throw e;
+		}
+
+		// create router node; parameter checking is done in constructor
+		RouterNode router = new RouterNodeImpl(this, nodeName, controlPort,
+				socksPort, orPort, dirPort);
+
+		// add new router node to nodes collection
+		this.nodes.add(router);
+
+		// log exiting and return router node
+		this.logger.exiting(this.getClass().getName(), "createRouter", router);
+		return router;
+	}
+
+	public ServerApplication createServer(String serverApplicationName,
+			int serverPort) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "createServer",
+				new Object[] { serverApplicationName, serverPort });
+
+		// create server; parameter checking is done in constructor
+		ServerApplicationImpl server = new ServerApplicationImpl(this,
+				serverApplicationName, serverPort);
+
+		// log exiting and return server
+		this.logger.exiting(this.getClass().getName(), "createServer", server);
+		return server;
+	}
+
+	public EventManager getEventManager() {
+		return this.eventManager;
+	}
+
 	/**
-	 * check, (wait, check, hup)*
+	 * Returns the implementation instance of the event manager of this network.
 	 * 
-	 * if all nodes get up during sleeping, we will wake up and return
-	 * immediately
+	 * @return The implementation instance of the event manager of this network.
+	 */
+	EventManagerImpl getEventManagerImpl() {
+		return this.eventManager;
+	}
+
+	public NetworkState getNetworkState() {
+		return this.networkState;
+	}
+
+	/**
+	 * Returns the working directory of this network configuration which is in
+	 * test-env/networkName/.
 	 * 
-	 * @param retries
-	 * @param hupInterval
-	 * @throws Exception
+	 * @return Working directory of this network.
 	 */
-	public boolean hupUntilUp(int retries, long hupInterval)
+	File getWorkingDir() {
+		return workingDir;
+	}
+
+	public boolean hupUntilUp(int tries, long hupInterval)
 			throws TorProcessException {
 
+		// log entering
+		this.logger.entering(this.getClass().getName(), "hupUntilUp",
+				new Object[] { tries, hupInterval });
+
+		// check state
+		if (this.networkState != NetworkState.NODES_STARTED) {
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(), "hupUntilUp", e);
+			throw e;
+		}
+
+		// check if nodes are already up; if so, return immediately
 		if (allNodesUp()) {
+
+			// log exiting and return true
+			this.logger.exiting(this.getClass().getName(), "hupUntilUp", true);
 			return true;
 		}
 
-		// register event handlers
+		// create and register a new event handler for each node
 		final Thread sleepingThread = Thread.currentThread();
 		for (ProxyNode node : this.nodes) {
 			eventManager.addEventListener(node, new EventListener() {
-
 				public void handleEvent(Event event) {
 					if (event == Event.NODE_CIRCUIT_OPENED) {
 						sleepingThread.interrupt();
@@ -119,22 +548,30 @@
 			});
 		}
 
-		for (int i = 0; i < retries; i++) {
+		// walk through wait-check-hup loop until there are no tries left
+		for (int i = 0; i < tries; i++) {
 
 			// determine how long to sleep
 			long endOfSleeping = System.currentTimeMillis() + hupInterval;
 			long now;
 
+			// unless all nodes have reported to be up, wait for the given
+			// maximum time
 			while ((now = System.currentTimeMillis()) < endOfSleeping) {
 
 				// sleep
 				try {
 					Thread.sleep(endOfSleeping - now);
 				} catch (InterruptedException e) {
+					// do nothing about it
 				}
 
-				// check
+				// check if nodes are up now
 				if (allNodesUp()) {
+
+					// log exiting and return true
+					this.logger.exiting(this.getClass().getName(),
+							"hupUntilUp", true);
 					return true;
 				}
 			}
@@ -147,15 +584,27 @@
 			// continue in loop
 		}
 
-		// no retries left and not all nodes are up; return failure
+		// no retries left and not all nodes are up; log exiting and return
+		// failure
+		this.logger.exiting(this.getClass().getName(), "hupUntilUp", false);
 		return false;
-
 	}
 
 	public void shutdownNodes() throws TorProcessException {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "shutdownNodes");
+
+		// check state
 		if (this.networkState != NetworkState.NODES_STARTED) {
-			throw new IllegalStateException();
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(), "shutdownNodes", e);
+			throw e;
 		}
+
+		// iteratively shut down all nodes; if an exception is caught, continue
+		// shutting down the other nodes and throw the first exception
+		// subsequently
 		TorProcessException firstCaughtException = null;
 		for (ProxyNode node : this.nodes) {
 			try {
@@ -166,46 +615,41 @@
 				}
 			}
 		}
+
+		// change network state
 		this.networkState = NetworkState.NODES_SHUT_DOWN;
+
+		// if an exception was caught during shutting down nodes, throw the
+		// first caught exception
 		if (firstCaughtException != null) {
+			this.logger.throwing(this.getClass().getName(), "shutdownNodes",
+					firstCaughtException);
 			throw firstCaughtException;
 		}
-	}
 
-	private static class NodeStarter extends Thread {
-
-		TorProcessException caughtException;
-
-		private long maximumTimeToWaitInMillis;
-
-		private ProxyNode node;
-
-		boolean success = false;
-
-		NodeStarter(ProxyNode node, long maximumTimeToWaitInMillis) {
-			this.node = node;
-			this.maximumTimeToWaitInMillis = maximumTimeToWaitInMillis;
-		}
-
-		@Override
-		public void run() {
-			try {
-				this.success = this.node
-						.startNode(this.maximumTimeToWaitInMillis);
-			} catch (TorProcessException e) {
-				this.caughtException = e;
-			}
-		}
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "shutdownNodes");
 	}
 
 	public boolean startNodes(long maximumTimeToWaitInMillis)
 			throws TorProcessException {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "startNodes",
+				maximumTimeToWaitInMillis);
+
+		// check state
 		if (this.networkState != NetworkState.CONFIGURATIONS_WRITTEN) {
-			throw new IllegalStateException();
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(), "startNodes", e);
+			throw e;
 		}
 
+		// check parameter
 		if (maximumTimeToWaitInMillis < 0) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(), "startNodes", e);
+			throw e;
 		}
 
 		// remember time when we begin starting the nodes
@@ -220,27 +664,45 @@
 			nodeStarter.start();
 		}
 
+		// wait for all node starts to complete
 		for (NodeStarter nodeStarter : allNodeStarters) {
+
+			// join node starts one after the other
 			try {
 				nodeStarter.join();
 			} catch (InterruptedException e) {
-				// we have some kind of problem here!
+				// this happens?! we have some kind of problem here!
+				this.logger.log(Level.WARNING,
+						"Interrupt while joining node starter!");
+
+				// log exiting and return false
+				this.logger.exiting(this.getClass().getName(), "startNodes",
+						false);
 				return false;
 			}
+
+			// if node start threw an exception, throw that exception now
 			if (nodeStarter.caughtException != null) {
-				this.networkState = NetworkState.NODES_SHUT_DOWN;
+				this.logger.throwing(this.getClass().getName(), "startNodes",
+						nodeStarter.caughtException);
 				throw nodeStarter.caughtException;
 			}
+
+			// if node start did not succeed in the given time, fail
 			if (!nodeStarter.success) {
 				this.logger.log(Level.WARNING,
 						"Starting nodes was not successful in "
 								+ (maximumTimeToWaitInMillis / 1000)
 								+ " seconds.", this.networkName);
+
+				// log exiting and return false
+				this.logger.exiting(this.getClass().getName(), "startNodes",
+						false);
 				return false;
 			}
 		}
 
-		// check how long we took to start all nodes
+		// determine how long we took to start all nodes
 		long after = System.currentTimeMillis();
 		this.logger.log(Level.FINE, "Starting nodes was successful and took "
 				+ ((after - before) / 1000) + " seconds.", this.networkName);
@@ -248,88 +710,33 @@
 		// change state
 		this.networkState = NetworkState.NODES_STARTED;
 
+		// log exiting and return true
+		this.logger.exiting(this.getClass().getName(), "startNodes", true);
 		return true;
 	}
 
-	public ClientApplication createClient(String clientApplicationName,
-			String targetAddress, int targetPort, int socksPort) {
-		return new ClientApplicationImpl(this, clientApplicationName,
-				targetAddress, targetPort, socksPort);
+	@Override
+	public String toString() {
+		return this.getClass().getSimpleName() + ": networkName=\""
+				+ this.networkName + "\", networkState="
+				+ this.networkState.toString() + ", nodes.size()="
+				+ this.nodes.size();
 	}
 
-	public ProxyNode createProxy(String nodeName, int controlPort, int socksPort) {
+	public void writeConfigurations() throws TorProcessException {
 
-		// TODO check parms
+		// log entering
+		this.logger.entering(this.getClass().getName(), "writeConfigurations");
 
-		ProxyNodeImpl proxy = new ProxyNodeImpl(this, nodeName, controlPort,
-				socksPort);
-
-		// add to nodes
-		this.nodes.add(proxy);
-
-		return proxy;
-	}
-
-	public DirectoryNode createDirectory(String nodeName, int controlPort,
-			int socksPort, int orPort, int dirPort) {
-
-		DirectoryNode dir = new DirectoryNodeImpl(this, nodeName, controlPort,
-				socksPort, orPort, dirPort);
-
-		this.nodes.add(dir);
-
-		return dir;
-	}
-
-	public RouterNode createRouter(String nodeName, int controlPort,
-			int socksPort, int orPort, int dirPort) {
-		RouterNode router = new RouterNodeImpl(this, nodeName, controlPort,
-				socksPort, orPort, dirPort);
-
-		this.nodes.add(router);
-
-		return router;
-	}
-
-	public ServerApplication createServer(String serverApplicationName,
-			int serverPort) {
-		return new ServerApplicationImpl(this, serverApplicationName,
-				serverPort);
-	}
-
-	public EventManager getEventManager() {
-		return this.eventManager;
-	}
-
-	public EventManagerImpl getEventManagerImpl() {
-		return this.eventManager;
-	}
-
-	private NetworkState networkState = NetworkState.CONFIGURING_NODES;
-
-	/**
-	 * Writes configurations for all nodes in the network, including torrc and
-	 * approved-routers files. Directory nodes are configured first in order to
-	 * obtain their fingerprints for all torrc files. Next are routers to obtain
-	 * their fingerprints for the directories' approved-routers files. Proxies
-	 * are configured at the end.
-	 * 
-	 * This operation can only be invoked, if network status is CONFIGURABLE.
-	 * 
-	 * @throws IllegalStateException
-	 *             If method is invoked in network status other than
-	 *             CONFIGURABLE.
-	 */
-	public void writeConfigurations() throws TorProcessException {
-
 		// check state
 		if (this.networkState != NetworkState.CONFIGURING_NODES) {
-			throw new IllegalStateException();
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(),
+					"writeConfigurations", e);
+			throw e;
 		}
 
-		// TODO don't we need to configure the nodes as private nodes, if we
-		// have a directory node here?!
-
+		// write configurations for all nodes
 		for (ProxyNode node : this.nodes) {
 			if (node.getNodeState() == NodeState.CONFIGURING) {
 				node.writeConfiguration();
@@ -338,124 +745,8 @@
 
 		// change state
 		this.networkState = NetworkState.CONFIGURATIONS_WRITTEN;
-	}
 
-	/**
-	 * Directory that contains status information of all nodes contained in this
-	 * network, plus the common log file, if one is created.
-	 */
-	protected File workingDir;
-
-	/**
-	 * Returns the working directory of this network configuration which is in
-	 * test-env/networkName/.
-	 * 
-	 * @return Working directory of this network.
-	 */
-	File getWorkingDir() {
-		return workingDir;
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "writeConfigurations");
 	}
-
-	/**
-	 * All nodes contained in this network. It is important that we store only
-	 * interface types to assure that all operations could also be performed by
-	 * the application itself.
-	 */
-	protected Set<ProxyNode> nodes = new HashSet<ProxyNode>();
-
-	/**
-	 * Internal class that is used to determine fingerprints in parallel.
-	 * 
-	 * 
-	 */
-	private static class FingerprintThread extends Thread {
-
-		private TorProcessException caughtException = null;
-
-		private RouterNode node = null;
-
-		FingerprintThread(RouterNode node) {
-			this.node = node;
-		}
-
-		public void run() {
-			try {
-				node.determineFingerprint();
-			} catch (TorProcessException e) {
-				this.caughtException = e;
-			}
-		}
-	}
-
-	private HashSet<String> approvedRoutersFingerprints;
-
-	Set<String> authorizedDirectoriesFingerprints = new HashSet<String>();
-
-	public void configureAsPrivateNetwork() throws TorProcessException {
-
-		// determine fingerprints for all directories and routers (can be done
-		// in parallel)
-		Set<FingerprintThread> fingerprintThreads = new HashSet<FingerprintThread>();
-		for (ProxyNode node : nodes) {
-			if (node instanceof RouterNode) {
-				RouterNode dirOrRouterNode = (RouterNode) node;
-				FingerprintThread fingerprintThread = new FingerprintThread(
-						dirOrRouterNode);
-				fingerprintThread.setName(node.getNodeName()
-						+ " Fingerprint Resolver");
-				fingerprintThreads.add(fingerprintThread);
-				fingerprintThread.start();
-			}
-		}
-		for (FingerprintThread fingerprintThread : fingerprintThreads) {
-			try {
-				fingerprintThread.join();
-			} catch (InterruptedException e) {
-				// ignore
-				logger.log(Level.WARNING, "fingerprint thread was interrupted.");
-			}
-			if (fingerprintThread.caughtException != null) {
-				throw fingerprintThread.caughtException;
-			}
-		}
-
-		// read DirServer strings for all directories from memory; they should
-		// have been read from disk before, so that this will perform really
-		// fast
-		for (ProxyNode node : this.nodes) {
-			if (node instanceof DirectoryNode) {
-				DirectoryNode dirNode = (DirectoryNode) node;
-				this.authorizedDirectoriesFingerprints.add(dirNode
-						.determineDirServerString());
-			}
-
-		}
-
-		// configure nodes
-		for (ProxyNode node : this.nodes) {
-			if (node.getNodeState() == NodeState.CONFIGURING) {
-				node
-						.configureDirServers(this.authorizedDirectoriesFingerprints);
-			}
-		}
-
-		// read fingerprints for all directories and routers from memory and
-		// write them to approved-routers file; they should have been read from
-		// disk before, so that this will perform really fast
-		this.approvedRoutersFingerprints = new HashSet<String>();
-		for (ProxyNode node : this.nodes) {
-			if (node instanceof RouterNode) {
-				RouterNode routerOrDirNode = (RouterNode) node;
-				this.approvedRoutersFingerprints.add(routerOrDirNode
-						.determineFingerprint());
-			}
-
-		}
-		for (ProxyNode node : this.nodes) {
-			if (node instanceof DirectoryNode) {
-				DirectoryNode dirNode = (DirectoryNode) node;
-				dirNode.writeApprovedRouters(this.approvedRoutersFingerprints);
-			}
-		}
-	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,19 +1,16 @@
-/*
- * NOTICE: This file is still work in progress. As you can see the Java
- * documentation is written partly in German and in English or needs some work
- * to refine it. This which will be the first thing to change in the next
- * version. Sorry for any inconvenience!  
- */
 package de.uniba.wiai.lspi.puppetor.impl;
 
-import java.io.BufferedInputStream;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.OutputStream;
 import java.net.Socket;
 import java.util.ArrayList;
 import java.util.List;
@@ -29,21 +26,23 @@
 import de.uniba.wiai.lspi.puppetor.TorProcessException;
 
 /**
- * Abstract Java proxy that represents one Tor node (i.e. Tor process) in the
- * testbed network. Can be a Tor proxy, a Tor router, or a Tor directory.
+ * Implementation of <code>ProxyNode</code>.
  * 
  * @author kloesing
  */
 public class ProxyNodeImpl implements ProxyNode {
 
-	// TODO make this configurable
+	/**
+	 * Executable file containing Tor.
+	 * 
+	 * TODO make this configurable!
+	 */
 	protected static final File torExecutable = new File("tor");
 
 	/**
-	 * Logger for this Node instance which is called "node." plus the node's
-	 * name.
+	 * The <code>torrc</code> configuration file of this Tor node.
 	 */
-	protected Logger logger;
+	protected File configFile;
 
 	/**
 	 * Collects all configuration strings for this node during configuration
@@ -51,51 +50,86 @@
 	 */
 	protected List<String> configuration;
 
-	public synchronized NodeState getNodeState() {
-		return this.nodeState;
-	}
+	/**
+	 * Connection via Tor controller.
+	 */
+	protected TorControlConnection conn;
 
-	@Override
-	public String toString() {
-		return this.getClass().getSimpleName() + ": nodeName=\""
-				+ this.nodeName + "\", controlPort=" + this.controlPort
-				+ ", socksPort=" + this.socksPort;
-	}
+	/**
+	 * Port on which the Tor node will be listening for us as its controller.
+	 */
+	protected int controlPort;
 
 	/**
-	 * Port on which node will be listening for SOCKS connections.
+	 * Event manager to which all events concerning this node are notified.
 	 */
+	private EventManagerImpl eventManager;
+
+	/**
+	 * Logger for this <code>ProxyNodeImpl</code> instance which is called
+	 * "node." plus the name of this node.
+	 */
+	protected Logger logger;
+
+	/**
+	 * Network to which this node belongs.
+	 */
+	protected NetworkImpl network;
+
+	/**
+	 * Name of this node that is used as part of the working directory and as
+	 * logger name of this node.
+	 */
+	protected String nodeName;
+
+	/**
+	 * The state of this node.
+	 */
+	protected NodeState nodeState = NodeState.CONFIGURING;
+
+	/**
+	 * Port on which the Tor node will be listening for SOCKS connection
+	 * requests.
+	 */
 	protected int socksPort;
 
-	private EventManagerImpl eventManager;
+	/**
+	 * Handle on the running Tor process that belongs to this node.
+	 */
+	protected Process torProcess;
 
 	/**
-	 * LOGGING OK
+	 * Directory in which all information concerning this node is stored.
+	 */
+	protected File workingDir;
+
+	/**
+	 * Creates a new <code>ProxyNodeImpl</code> and adds it to the given
+	 * <code>network</code>, but does not yet write its configuration to disk
+	 * or start the corresponding Tor process.
 	 * 
-	 * Creates a new node and adds it to the given network. Does not yet create
-	 * a new Tor process.
-	 * 
 	 * @param network
 	 *            Network configuration to which this node belongs.
 	 * @param nodeName
-	 *            The node's name which may only consist of between 1 and 19
-	 *            alpha-numeric characters.
+	 *            The name of the new node which may only consist of between 1
+	 *            and 19 alpha-numeric characters.
 	 * @param controlPort
-	 *            Port on which the Tor process will be listening for us as its
-	 *            controller.
-	 * 
+	 *            Port on which the Tor node will be listening for us as its
+	 *            controller. May not be negative or greater than 65535.
+	 * @param socksPort
+	 *            Port on which the Tor node will be listening for SOCKS
+	 *            connection requests. May not be negative or greater than
+	 *            65535.
 	 * @throws IllegalArgumentException
-	 *             If at least one of the parameters is null or has an invalid
-	 *             value.
+	 *             If at least one of the parameters is <code>null</code> or
+	 *             has an invalid value.
 	 */
-	public ProxyNodeImpl(NetworkImpl network, String nodeName, int controlPort,
+	ProxyNodeImpl(NetworkImpl network, String nodeName, int controlPort,
 			int socksPort) {
 
-		// make sure that name is a valid logger name
+		// make sure that nodeName is a valid logger name
 		if (nodeName == null || nodeName.length() < 1 || nodeName.length() > 19
 				|| !nodeName.matches("[a-zA-Z0-9]*")) {
-
-			// prepare and throw exception
 			String reason = "\"" + nodeName + "\" is not a valid node name!";
 			IllegalArgumentException e = new IllegalArgumentException(reason);
 			throw e;
@@ -112,13 +146,7 @@
 		// check remaining parameters
 		if (network == null || controlPort < 0 || controlPort > 65535
 				|| socksPort < 0 || socksPort > 65535) {
-
-			// prepare and throw exception
-			String reason = "Invalid parameter values: network=" + network
-					+ ", controlPort=" + controlPort + ", socksPort="
-					+ socksPort;
-			IllegalArgumentException e = new IllegalArgumentException(reason);
-			this.logger.log(Level.SEVERE, reason, e);
+			IllegalArgumentException e = new IllegalArgumentException();
 			this.logger.throwing(this.getClass().getName(), "ProxyNodeImpl", e);
 			throw e;
 		}
@@ -132,23 +160,19 @@
 		// obtain reference on event manager from network
 		this.eventManager = network.getEventManagerImpl();
 
-		// determine working directory
+		// create working directory
 		this.workingDir = new File(this.network.getWorkingDir()
 				.getAbsolutePath()
 				+ File.separator + nodeName + File.separator);
-
-		// create working directory
-		this.logger.log(Level.FINER, "Creating working directory \""
-				+ this.workingDir + "\"...");
 		this.workingDir.mkdirs();
 		this.logger.log(Level.FINE, "Created working directory \""
-				+ this.workingDir + "\"!");
+				+ this.workingDir.getAbsolutePath() + "\"");
 
 		// create reference on config file
 		this.configFile = new File(this.workingDir.getAbsolutePath()
 				+ File.separator + "torrc");
 
-		// initialize configuration with general-purpose configurations
+		// initialize configuration with general-purpose configuration entries
 		this.configuration = new ArrayList<String>();
 		this.configuration.add("DataDirectory .");
 		this.configuration.add("SafeLogging 0");
@@ -176,6 +200,10 @@
 		this.configuration
 				.add("AllowInvalidNodes middle,rendezvous,exit,entry,introduction");
 
+		// tunnel dir connections
+		// this.configuration.add("TunnelDirConns 1");
+		// this.configuration.add("PreferTunneledDirConns 1");
+
 		// initialize state
 		this.nodeState = NodeState.CONFIGURING;
 
@@ -184,11 +212,180 @@
 
 	}
 
+	public void addConfiguration(String configurationString) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "addConfiguration");
+
+		// check state
+		if (this.nodeState != NodeState.CONFIGURING) {
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(), "addConfiguration",
+					e);
+			throw e;
+		}
+
+		// check parameter
+		if (configurationString == null || configurationString.length() < 1) {
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(), "addConfiguration",
+					e);
+			throw e;
+		}
+
+		// add configuration string
+		this.configuration.add(configurationString);
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "addConfiguration");
+	}
+
+	public synchronized void addHiddenService(String serviceName,
+			int servicePort, int virtualPort) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "addHiddenService",
+				new Object[] { serviceName, servicePort, virtualPort });
+
+		// check state
+		if (this.nodeState != NodeState.CONFIGURING) {
+			this.logger.log(Level.SEVERE,
+					"Hidden service can only be added when node is in state "
+							+ "CONFIGURING!");
+			IllegalStateException e = new IllegalStateException(
+					"Hidden service can only be added when node is in state "
+							+ "CONFIGURING!");
+			this.logger.throwing(this.getClass().getName(), "addHiddenService",
+					e);
+			throw e;
+		}
+
+		// check parameters
+		if (serviceName == null || serviceName.length() == 0 || servicePort < 0
+				|| servicePort > 65535 || virtualPort < 0
+				|| virtualPort > 65535) {
+			this.logger.log(Level.SEVERE,
+					"Illegal argument when adding hidden service!");
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(), "addHiddenService",
+					e);
+			throw e;
+		}
+
+		// add hidden service using Tor controller
+		this.configuration.add("HiddenServiceDir "
+				+ workingDir.getAbsolutePath() + File.separator + serviceName
+				+ "\nHiddenServicePort " + virtualPort + " 127.0.0.1:"
+				+ servicePort);
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "addHiddenService");
+	}
+
 	/**
-	 * LOGGING OK
+	 * Adds a hidden service configuration to this node while the node is
+	 * running.
 	 * 
-	 * @see de.uniba.wiai.lspi.puppetor.ProxyNode#configureDirServers(java.util.Set)
+	 * TODO not fully implemented yet, but this should be possible both, during
+	 * configuration and when running a network...
+	 * 
+	 * @param serviceName
+	 *            Name of the hidden service that will be used as name for the
+	 *            hidden service directory. May neither be <code>null</code>
+	 *            or a zero-length string.
+	 * @param servicePort
+	 *            The TCP port on which the service will be available for
+	 *            requests. This can, but need not be different from the virtual
+	 *            port that is announced to clients. May not be negative or
+	 *            greater than 65535.
+	 * @param virtualPort
+	 *            The virtual TCP port that this hidden service runs on as it is
+	 *            announced to clients. May not be negative or greater than
+	 *            65535.
+	 * @return The onion address string consisting of 16 base32 chars plus
+	 *         ".onion" for hidden service versions 0 and 1 or 16 base32 chars
+	 *         plus "." plus 24 base32 chars plus ".onion" for hidden service
+	 *         version 2.
 	 */
+	synchronized String addHiddenServiceUsingController(String serviceName,
+			int servicePort, int virtualPort) {
+
+		// TODO this method is not supported yet!
+		if (1 != 2) {
+			UnsupportedOperationException e = new UnsupportedOperationException();
+			this.logger.throwing(this.getClass().getName(),
+					"addHiddenServiceUsingController", e);
+			throw e;
+		}
+
+		// log entering
+		this.logger.entering(this.getClass().getName(),
+				"addHiddenServiceUsingController", new Object[] { serviceName,
+						servicePort, virtualPort });
+
+		// TODO check state
+
+		// check parameters
+		if (serviceName == null || serviceName.length() == 0 || servicePort < 0
+				|| servicePort > 65535 || virtualPort < 0
+				|| virtualPort > 65535) {
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(),
+					"addHiddenServiceUsingController", e);
+			throw e;
+		}
+
+		// String serverName = server.getServerName();
+		// int serverPort = server.getServerPort();
+
+		// add hidden service using Tor controller
+		this.logger.log(Level.FINE,
+				"Adding hidden service using Tor controller.");
+
+		List<String> configs = new ArrayList<String>();
+		configs.add("HiddenServiceDir " + workingDir.getAbsolutePath() + "/"
+				+ serviceName);
+		configs.add("HiddenServicePort " + virtualPort + " 127.0.0.1:"
+				+ servicePort);
+		try {
+			conn.setConf(configs);
+		} catch (IOException e) {
+			RuntimeException ex = new RuntimeException(
+					"IOException when trying to register a new "
+							+ "hidden service", e);
+			this.logger.throwing(this.getClass().getName(),
+					"addHiddenServiceUsingController", ex);
+			throw ex;
+		}
+		this.logger.log(Level.FINE,
+				"Hidden service successfully registered at Tor proxy.");
+
+		// 
+		File hiddenServiceFile = new File(workingDir.getAbsolutePath() + "\\"
+				+ serviceName + "\\hostname");
+		if (!hiddenServiceFile.exists()) {
+			RuntimeException ex = new RuntimeException();
+			this.logger.throwing(this.getClass().getName(),
+					"addHiddenServiceUsingController", ex);
+			throw ex;
+		}
+		// read hostname from file
+		String address = null;
+		try {
+			BufferedReader br = new BufferedReader(new FileReader(
+					hiddenServiceFile));
+			address = br.readLine();
+			br.close();
+		} catch (IOException e) {
+			RuntimeException ex = new RuntimeException(e);
+			this.logger.throwing(this.getClass().getName(),
+					"addHiddenServiceUsingController", ex);
+			throw ex;
+		}
+
+		return address;
+	}
+
 	public synchronized void configureDirServers(
 			Set<String> authorizedDirServerStrings) {
 
@@ -198,55 +395,194 @@
 
 		// check parameter
 		if (authorizedDirServerStrings == null) {
-
-			// prepare and throw exception
-			String reason = "Parameter may not be null!";
-			IllegalArgumentException e = new IllegalArgumentException(reason);
-			this.logger.log(Level.SEVERE, reason, e);
+			IllegalArgumentException e = new IllegalArgumentException(
+					"Parameter may not be null!");
 			this.logger.throwing(this.getClass().getName(),
 					"configureDirServers", e);
 			throw e;
 		}
 
 		// add to configuration
+		int entriesBefore = this.configuration.size();
 		this.configuration.addAll(authorizedDirServerStrings);
 		this.logger.log(Level.FINE, "Added "
 				+ authorizedDirServerStrings.size()
-				+ " DirServer entries to configuration!");
+				+ " DirServer entries to configuration, having "
+				+ entriesBefore + " entries before and "
+				+ this.configuration.size()
+				+ " entries afterwards (duplicates possible)!");
 
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "configureDirServers");
+	}
 
+	public synchronized void copyDescriptorTo(ProxyNode otherNode)
+			throws TorProcessException {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "copyDescriptorTo",
+				otherNode);
+
+		// copy files
+		try {
+			File otherWorkingDir = ((ProxyNodeImpl) otherNode).workingDir;
+			for (File f : workingDir.listFiles()) {
+				if (f.getName().contains(".rsd")) {
+					File dst = new File(otherWorkingDir.getAbsolutePath()
+							+ File.separator + f.getName());
+					this.logger.log(Level.FINE, "Copying '"
+							+ f.getAbsolutePath() + "' to '"
+							+ dst.getAbsolutePath() + "'...");
+					InputStream in = new FileInputStream(f);
+					OutputStream out = new FileOutputStream(dst);
+					byte[] buf = new byte[1024];
+					int len;
+					while ((len = in.read(buf)) > 0) {
+						out.write(buf, 0, len);
+					}
+					in.close();
+					out.close();
+				}
+			}
+		} catch (IOException e) {
+			TorProcessException ex = new TorProcessException(
+					"Error copying descriptors");
+			this.logger.throwing(this.getClass().getName(), "copyDescriptorTo",
+					ex);
+			throw ex;
+		}
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "copyDescriptorTo");
 	}
 
-	/**
-	 * Network to which this node belongs.
-	 */
-	protected NetworkImpl network;
+	public synchronized String getNodeName() {
+		return this.nodeName;
+	}
 
-	/**
-	 * Name of this node that is used as part of the node's working directory
-	 * and logger.
-	 */
-	protected String nodeName;
+	public synchronized NodeState getNodeState() {
+		return this.nodeState;
+	}
 
-	/**
-	 * Port on which the process will be listening for us as its controller.
-	 */
-	protected int controlPort;
+	public synchronized String getOnionAddress(String serviceName, int version)
+			throws TorProcessException {
 
-	/**
-	 * Directory in which all information concerning this node is stored.
-	 */
-	protected File workingDir;
+		// log entering
+		this.logger.entering(this.getClass().getName(), "getOnionAddress",
+				new Object[] { serviceName, version });
 
-	/**
-	 * LOGGING OK
-	 * 
-	 * @param maximumTimeToWaitInMillis <
-	 *            0 bedeutet unendlich lange
-	 * 
-	 */
+		// check parameter
+		if (serviceName == null || serviceName.length() == 0) {
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(), "getOnionAddress",
+					e);
+			throw e;
+		}
+
+		// check if hidden service directory exists
+		File hiddenServiceFile = new File(workingDir.getAbsolutePath()
+				+ File.separator + serviceName + File.separator + "hostname"
+				+ ((version <= 1) ? "" : "2"));
+		if (!hiddenServiceFile.exists()) {
+			this.logger.log(Level.SEVERE,
+					"Hidden service directory or hostname file does not exist: "
+							+ hiddenServiceFile.getAbsolutePath());
+
+			TorProcessException e = new TorProcessException(
+					"Hidden service directory or hostname file does not exist: "
+							+ hiddenServiceFile.getAbsolutePath());
+			this.logger.throwing(this.getClass().getName(), "getOnionAddress",
+					e);
+			throw e;
+		}
+
+		// read hostname from file
+		String address = null;
+		try {
+			BufferedReader br = new BufferedReader(new FileReader(
+					hiddenServiceFile));
+			address = br.readLine();
+			br.close();
+		} catch (IOException e) {
+			TorProcessException ex = new TorProcessException(
+					"Could not read hostname file!", e);
+			this.logger.throwing(this.getClass().getName(), "getOnionAddress",
+					ex);
+			throw ex;
+		}
+
+		// log exiting and return address
+		this.logger.exiting(this.getClass().getName(), "getOnionAddress",
+				address);
+		return address;
+	}
+
+	public synchronized void hup() throws TorProcessException {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "hup");
+
+		// check state
+		if (this.nodeState != NodeState.RUNNING) {
+			IllegalStateException e = new IllegalStateException(
+					"Cannot hup a process when it's not running!");
+			this.logger.throwing(this.getClass().getName(), "hup", e);
+			throw e;
+		}
+
+		// send HUP signal to Tor process
+		try {
+			this.conn.signal("HUP");
+		} catch (IOException e) {
+			TorProcessException ex = new TorProcessException(
+					"Could not send the command HUP to the Tor process!", e);
+			this.logger.throwing(this.getClass().getName(), "hup", ex);
+			throw ex;
+		} catch (NullPointerException e) {
+			// TODO sometimes, this throws a NullPointerException...
+			this.logger.log(Level.SEVERE,
+					"NullPointerException while sending HUP signal to node "
+							+ this.toString());
+			throw e;
+		}
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "hup");
+	}
+
+	public synchronized void shutdown() throws TorProcessException {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "shutdown");
+
+		// check state
+		if (this.nodeState != NodeState.RUNNING) {
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(), "shutdown", e);
+			throw e;
+		}
+
+		// we cannot simply kill the Tor process, because we have established a
+		// controller connection to it which would interpret a closed socket as
+		// failure and throw a RuntimeException
+		// TODO who cares?!
+		try {
+			this.conn.shutdownTor("SHUTDOWN");
+			this.conn.shutdownTor("SHUTDOWN");
+		} catch (IOException e) {
+			TorProcessException ex = new TorProcessException(
+					"Could not send shutdown command to Tor process!", e);
+			this.logger.throwing(this.getClass().getName(), "shutdown", ex);
+			throw ex;
+		}
+
+		// change state
+		this.nodeState = NodeState.SHUT_DOWN;
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "shutdown");
+	}
+
 	public synchronized boolean startNode(long maximumTimeToWaitInMillis)
 			throws TorProcessException {
 
@@ -256,12 +592,9 @@
 
 		// check state
 		if (this.nodeState != NodeState.CONFIGURATION_WRITTEN) {
-
-			// prepare and throw exception
 			String reason = "Node is not in state "
 					+ "NodeState.CONFIGURATION_WRITTEN!";
 			IllegalStateException e = new IllegalStateException(reason);
-			this.logger.log(Level.SEVERE, reason, e);
 			this.logger.throwing(this.getClass().getName(), "startNode", e);
 			throw e;
 		}
@@ -275,13 +608,10 @@
 			this.torProcess = processBuilder.start();
 			this.logger.log(Level.FINE, "Started Tor process successfully!");
 		} catch (IOException e) {
-
-			// prepare and throw exception
 			String reason = "Could not start Tor process!";
-			TorProcessException e1 = new TorProcessException(reason, e);
-			this.logger.log(Level.SEVERE, reason, e1);
-			this.logger.throwing(this.getClass().getName(), "startNode", e1);
-			throw e1;
+			TorProcessException ex = new TorProcessException(reason, e);
+			this.logger.throwing(this.getClass().getName(), "startNode", ex);
+			throw ex;
 		}
 
 		// start thread to parse output
@@ -294,10 +624,9 @@
 				// log entering
 				logger.entering(this.getClass().getName(), "run");
 
+				// read output from Tor to parse it
 				String line = null;
 				boolean waitingForControlPort = true;
-
-				// read output from Tor
 				try {
 
 					while ((line = br.readLine()) != null) {
@@ -319,7 +648,7 @@
 					// don't throw this exception, nobody will catch it!
 					String reason = "IOException when reading output from Tor "
 							+ "process!";
-					logger.log(Level.FINE, reason, e);
+					logger.log(Level.WARNING, reason, e);
 				}
 
 				// log exiting
@@ -372,11 +701,14 @@
 
 		// be sure that Tor is ready, especially if computer is very busy and
 		// many nodes are created
-		try {
-			Thread.sleep(1000);
-		} catch (InterruptedException e2) {
-		}
-		
+		// TODO don't wait, because we could miss log messages while waiting
+		// TODO should we better only parse the process output instead of
+		// parsing log messages from the controller?!
+		// try {
+		// Thread.sleep(1000);
+		// } catch (InterruptedException e2) {
+		// }
+
 		// connect to the controller
 		this.logger.log(Level.FINER, "Connecting to control port...");
 		try {
@@ -384,13 +716,11 @@
 			this.conn = TorControlConnection.getConnection(controlSocket);
 			this.conn.authenticate(new byte[0]);
 		} catch (IOException e) {
-
-			// prepare and throw exception
-			String reason = "Could not connect to control port " + controlPort + "!";
-			TorProcessException e1 = new TorProcessException(reason, e);
-			this.logger.log(Level.SEVERE, reason, e1);
-			this.logger.throwing(this.getClass().getName(), "startNode", e1);
-			throw e1;
+			String reason = "Could not connect to control port " + controlPort
+					+ "!";
+			TorProcessException ex = new TorProcessException(reason, e);
+			this.logger.throwing(this.getClass().getName(), "startNode", ex);
+			throw ex;
 		}
 		this.logger.log(Level.FINE, "Connected to control port successfully!");
 
@@ -398,14 +728,16 @@
 		EventHandler handler = new EventHandler() {
 
 			public void bandwidthUsed(long read, long written) {
-				logger.log(Level.FINEST, "bandwidthUsed(read, written) = "
-						+ read + ", " + written);
+				// TODO do we need this information?
+				// logger.log(Level.FINEST, "bandwidthUsed(read, written) = "
+				// + read + ", " + written);
 			}
 
 			public void circuitStatus(String status, String circID, String path) {
-				logger.log(Level.FINEST,
-						"circuitStatus(status, circID, path) = " + status
-								+ ", " + circID + ", " + path);
+				// TODO do we need this information?
+				// logger.log(Level.FINEST,
+				// "circuitStatus(status, circID, path) = " + status
+				// + ", " + circID + ", " + path);
 			}
 
 			public void message(String severity, String msg) {
@@ -429,51 +761,50 @@
 			}
 
 			public void newDescriptors(List orList) {
-				StringBuilder sb = new StringBuilder(
-						"newDescriptors(orList) =\n");
-				for (Object o : orList) {
-					sb.append(o + "\n");
-				}
-				logger.log(Level.FINEST, sb.toString());
+				// TODO do we need this information?
+				// StringBuilder sb = new StringBuilder(
+				// "newDescriptors(orList) =\n");
+				// for (Object o : orList) {
+				// sb.append(o + "\n");
+				// }
+				// logger.log(Level.FINEST, sb.toString());
 			}
 
 			public void orConnStatus(String status, String orName) {
-				logger.log(Level.FINEST, "orConnStatus(status, orName) = "
-						+ status + ", " + orName);
+				// TODO do we need this information?
+				// logger.log(Level.FINEST, "orConnStatus(status, orName) = "
+				// + status + ", " + orName);
 			}
 
 			public void streamStatus(String status, String streamID,
 					String target) {
-				logger.log(Level.FINEST,
-						"streamStatus(status, streamID, target) = " + status
-								+ ", " + streamID + ", " + target);
+				// TODO do we need this information?
+				// logger.log(Level.FINEST,
+				// "streamStatus(status, streamID, target) = " + status
+				// + ", " + streamID + ", " + target);
 			}
 
 			public void unrecognized(String type, String msg) {
-				logger.log(Level.FINEST, "unrecognized(type, msg) = " + type
-						+ ", " + msg);
+				// TODO do we need this information?
+				// logger.log(Level.FINEST, "unrecognized(type, msg) = " + type
+				// + ", " + msg);
 			}
 		};
-		conn.setEventHandler(handler);
-		
-		// register for logging events of level INFO and higher
+		this.conn.setEventHandler(handler);
+
+		// register for logging events of level INFO and higher using controller
 		List<String> events = new ArrayList<String>();
 		events.add("INFO");
 		events.add("NOTICE");
 		events.add("WARN");
 		events.add("ERR");
 		try {
-			
-			// register for events using controller
 			this.conn.setEvents(events);
 		} catch (IOException e) {
-
-			// prepare and throw exception
 			String reason = "Could not register event handler at Tor process!";
-			TorProcessException e1 = new TorProcessException(reason, e);
-			this.logger.log(Level.SEVERE, reason, e1);
-			this.logger.throwing(this.getClass().getName(), "startNode", e1);
-			throw e1;
+			TorProcessException ex = new TorProcessException(reason, e);
+			this.logger.throwing(this.getClass().getName(), "startNode", ex);
+			throw ex;
 		}
 		this.logger.log(Level.FINE, "Registered event handler at Tor process!");
 
@@ -485,92 +816,24 @@
 		return true;
 	}
 
-	/**
-	 * Handle on running Tor process.
-	 */
-	protected Process torProcess;
-
-	public synchronized void addHiddenService(String serviceName,
-			int servicePort, int virtualPort) {
-
-		// check state
-		if (this.nodeState != NodeState.CONFIGURING) {
-			this.logger.log(Level.SEVERE,
-					"Hidden service can only be added when node is in state "
-							+ "CONFIGURING!");
-			throw new IllegalStateException(
-					"Hidden service can only be added when node is in state "
-							+ "CONFIGURING!");
-		}
-
-		// check params
-		if (serviceName == null || serviceName.length() == 0 || servicePort < 0
-				|| servicePort > 65535 || virtualPort < 0
-				|| virtualPort > 65535) {
-			this.logger.log(Level.SEVERE,
-					"Illegal argument when adding hidden service!");
-			throw new IllegalArgumentException();
-		}
-
-		// add hidden service using Tor controller
-		this.configuration.add("HiddenServiceDir "
-				+ workingDir.getAbsolutePath() + File.separator + serviceName + "\nHiddenServicePort " + virtualPort
-				+ " 127.0.0.1:" + servicePort);
-
+	@Override
+	public String toString() {
+		return this.getClass().getSimpleName() + ": nodeName=\""
+				+ this.nodeName + "\", controlPort=" + this.controlPort
+				+ ", socksPort=" + this.socksPort;
 	}
 
-	public synchronized String getOnionAddress(String serviceName)
-			throws TorProcessException {
+	public synchronized void writeConfiguration() throws TorProcessException {
 
-		// check parameter
-		if (serviceName == null || serviceName.length() == 0) {
-			this.logger.log(Level.SEVERE, "Illegal argument!");
-			throw new IllegalArgumentException();
-		}
+		// log entering
+		this.logger.entering(this.getClass().getName(), "writeConfiguration");
 
-		// check if hidden service directory exists
-		File hiddenServiceFile = new File(workingDir.getAbsolutePath()
-				+ File.separator + serviceName + File.separator + "hostname");
-		if (!hiddenServiceFile.exists()) {
-			this.logger.log(Level.SEVERE,
-					"Hidden service directory does not exist: "
-							+ hiddenServiceFile.getAbsolutePath());
-			throw new TorProcessException(
-					"Hidden service directory does not exist: "
-							+ hiddenServiceFile.getAbsolutePath());
-		}
-
-		// read hostname from file
-		String address = null;
-		try {
-			// TODO use FileReader
-			FileInputStream fis = new FileInputStream(hiddenServiceFile);
-			BufferedInputStream bis = new BufferedInputStream(fis);
-			byte[] bytes = new byte[16];
-			bis.read(bytes);
-			address = new String(bytes) + ".onion";
-			bis.close();
-		} catch (IOException e) {
-			throw new TorProcessException("Could not read hostname file!", e);
-		}
-
-		return address;
-	}
-
-	/**
-	 * Connection via Tor controller.
-	 */
-	protected TorControlConnection conn;
-
-	protected NodeState nodeState = NodeState.CONFIGURING;
-
-	protected File configFile;
-
-	public synchronized void writeConfiguration() throws TorProcessException {
-
 		// check state
 		if (this.nodeState != NodeState.CONFIGURING) {
-			throw new IllegalStateException();
+			IllegalStateException e = new IllegalStateException();
+			this.logger.throwing(this.getClass().getName(),
+					"writeConfiguration", e);
+			throw e;
 		}
 
 		// write config file
@@ -581,159 +844,17 @@
 			}
 			bw.close();
 		} catch (IOException e) {
-			throw new TorProcessException("Could not write configuration!", e);
+			TorProcessException ex = new TorProcessException(
+					"Could not write configuration!", e);
+			this.logger.throwing(this.getClass().getName(),
+					"writeConfiguration", ex);
+			throw ex;
 		}
 
 		// change state
 		this.nodeState = NodeState.CONFIGURATION_WRITTEN;
-	}
 
-	/**
-	 * @see de.uniba.wiai.lspi.puppetor.ProxyNode#shutdown()
-	 */
-	public synchronized void shutdown() throws TorProcessException {
-
-		// check state
-		if (this.nodeState != NodeState.RUNNING) {
-			throw new IllegalStateException();
-		}
-
-		// we cannot simply kill the tor.exe process, because we have
-		// established a controller connection to it which would interpret a
-		// closed socket as failure and throw a RuntimeException
-		// TODO who cares?!
-		try {
-			this.conn.shutdownTor("SHUTDOWN");
-			this.conn.shutdownTor("SHUTDOWN");
-		} catch (IOException e) {
-			this.logger.log(Level.SEVERE,
-					"Could not send shutdown command to Tor process!", e);
-			throw new TorProcessException(
-					"Could not send shutdown command to Tor process!", e);
-		}
-
-		// change state
-		this.nodeState = NodeState.SHUT_DOWN;
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "writeConfiguration");
 	}
-
-	// /**
-	// * Flags that denotes whether certain events have been observed in the
-	// log.
-	// * In general, this requires logging to be done at least on notice level!
-	// */
-	// protected Set<Event> observedEvents;
-
-	// public synchronized boolean hasEventOccured(Event event) {
-	// return observedEvents.contains(event);
-	// }
-
-	public synchronized void hup() throws TorProcessException {
-
-		// check state
-		if (this.nodeState != NodeState.RUNNING) {
-			this.logger.log(Level.SEVERE,
-					"Cannot hup a process when it's not running!");
-			throw new IllegalStateException(
-					"Cannot hup a process when it's not running!");
-		}
-
-		// should we check whether conn is null?
-		if (this.conn == null) {
-			this.logger.log(Level.WARNING, "WARNING! conn is null!");
-		}
-		try {
-			// TODO sometimes, this throws a NullPointerException...
-			this.conn.signal("HUP");
-		} catch (IOException e) {
-			this.logger.log(Level.SEVERE,
-					"Could not send the command HUP to the Tor process!", e);
-			throw new TorProcessException(
-					"Could not send the command HUP to the Tor process!", e);
-		}
-	}
-
-	// public synchronized void addConfig(String newConfiguration) {
-	// if (this.nodeStatus != Status.CONFIGURING) {
-	// throw new IllegalStateException();
-	// }
-	// // TODO should we check the new config?!
-	// this.configuration.add(newConfiguration);
-	// }
-
-	// public String getConfiguration() {
-	// StringBuilder result = new StringBuilder("Node configuration: ");
-	// for (String next : this.configuration) {
-	// result.append(next + "\n");
-	// }
-	// return result.toString();
-	// }
-
-	/**
-	 * Adds a hidden service configuration to this node while the node is
-	 * running.
-	 * 
-	 * TODO this should be possible both, during configuration and when running
-	 * a network...
-	 */
-	public synchronized String addHiddenServiceUsingController(
-			String serviceName, int servicePort, int virtualPort) {
-		if (1 != 2)
-			throw new UnsupportedOperationException();
-		// TODO check state
-
-		// check params
-		if (serviceName == null || serviceName.length() == 0 || servicePort < 0
-				|| servicePort > 65535 || virtualPort < 0
-				|| virtualPort > 65535) {
-			throw new IllegalArgumentException();
-		}
-
-		// String serverName = server.getServerName();
-		// int serverPort = server.getServerPort();
-
-		// add hidden service using Tor controller
-		this.logger.log(Level.FINE,
-				"Adding hidden service using Tor controller.");
-
-		List<String> configs = new ArrayList<String>();
-		configs.add("HiddenServiceDir " + workingDir.getAbsolutePath() + "/"
-				+ serviceName);
-		configs.add("HiddenServicePort " + virtualPort + " 127.0.0.1:"
-				+ servicePort);
-		try {
-			conn.setConf(configs);
-		} catch (IOException e) {
-			throw new RuntimeException(
-					"IOException when trying to register a new "
-							+ "hidden service", e);
-		}
-		this.logger.log(Level.FINE,
-				"Hidden service successfully registered at Tor proxy.");
-
-		// 
-		File hiddenServiceFile = new File(workingDir.getAbsolutePath() + "\\"
-				+ serviceName + "\\hostname");
-		if (!hiddenServiceFile.exists()) {
-			throw new RuntimeException();
-		}
-		// read hostname from file
-		String address = null;
-		try {
-			// TODO use FileReader
-			FileInputStream fis = new FileInputStream(hiddenServiceFile);
-			BufferedInputStream bis = new BufferedInputStream(fis);
-			byte[] bytes = new byte[16];
-			bis.read(bytes);
-			address = new String(bytes) + ".onion";
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
-
-		return address;
-	}
-
-	public synchronized String getNodeName() {
-		return this.nodeName;
-	}
-
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,8 +1,3 @@
-/*
- * NOTICE: This file is still work in progress. As you can see the Java
- * documentation is written partly in German and in English and logging and
- * documentation still need some work. Sorry for any inconvenience!  
- */
 package de.uniba.wiai.lspi.puppetor.impl;
 
 import java.io.BufferedReader;
@@ -19,34 +14,72 @@
 import de.uniba.wiai.lspi.puppetor.RouterNode;
 import de.uniba.wiai.lspi.puppetor.TorProcessException;
 
+/**
+ * Implementation of <code>RouterNode</code>.
+ * 
+ * @author kloesing
+ * 
+ */
 public class RouterNodeImpl extends ProxyNodeImpl implements RouterNode {
 
-	protected final String localIpAddress = "127.0.0.1";
-	
 	/**
-	 * OR port of this router.
+	 * Port on which the Tor node will be listening for directory requests from
+	 * other Tor nodes.
 	 */
-	protected int orPort;
+	protected int dirPort;
 
 	/**
-	 * Directory port of this router.
+	 * The fingerprint of this node that is determined as hash value of its
+	 * onion key.
 	 */
-	protected int dirPort;
+	protected String fingerprint;
 
 	/**
-	 * This node's fingerprint that is determined as hash value of this node's
-	 * onion routing key.
+	 * The IP address of local nodes (typically <code>localhost</code> or
+	 * <code>127.0.0.1</code>).
 	 */
-	protected String fingerprint;
+	protected final String localIpAddress = "127.0.0.1";
 
-	@Override
-	public String toString() {
-		return super.toString() + ", orPort=" + this.orPort + ", dirPort="
-				+ this.dirPort;
-	}
+	/**
+	 * Port on which the Tor node will be listening for onion requests by other
+	 * Tor nodes.
+	 */
+	protected int orPort;
 
-	public RouterNodeImpl(NetworkImpl network, String nodeName,
-			int controlPort, int socksPort, int orPort, int dirPort) {
+	/**
+	 * Creates a new <code>RouterNodeImpl</code> and adds it to the given
+	 * <code>network</code>, but does not yet write its configuration to disk
+	 * or start the corresponding Tor process.
+	 * 
+	 * @param network
+	 *            Network configuration to which this node belongs.
+	 * @param nodeName
+	 *            The name of the new node which may only consist of between 1
+	 *            and 19 alpha-numeric characters.
+	 * @param controlPort
+	 *            Port on which the Tor node will be listening for us as its
+	 *            controller. May not be negative or greater than 65535.
+	 * @param socksPort
+	 *            Port on which the Tor node will be listening for SOCKS
+	 *            connection requests. May not be negative or greater than
+	 *            65535.
+	 * @param orPort
+	 *            Port on which the Tor node will be listening for onion
+	 *            requests by other Tor nodes. May not be negative or greater
+	 *            than 65535.
+	 * @param dirPort
+	 *            Port on which the Tor node will be listening for directory
+	 *            requests from other Tor nodes. May not be negative or greater
+	 *            than 65535.
+	 * @throws IllegalArgumentException
+	 *             If at least one of the parameters is <code>null</code> or
+	 *             has an invalid value.
+	 */
+	RouterNodeImpl(NetworkImpl network, String nodeName, int controlPort,
+			int socksPort, int orPort, int dirPort) {
+
+		// create superclass instance; parameter checking is done in super
+		// constructor
 		super(network, nodeName, controlPort, socksPort);
 
 		// log entering
@@ -56,7 +89,10 @@
 
 		// check parameters
 		if (orPort < 0 || orPort > 65535 || dirPort < 0 || dirPort > 65535) {
-			throw new IllegalArgumentException();
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger
+					.throwing(this.getClass().getName(), "RouterNodeImpl", e);
+			throw e;
 		}
 
 		// remember parameters
@@ -71,7 +107,7 @@
 		// all routers mirror the directory
 		this.configuration.add("DirPort " + dirPort);
 
-		// this node's address should be localhost and not guessed by Tor
+		// the address of this node should be localhost and not guessed by Tor
 		this.configuration.add("Address " + localIpAddress);
 
 		// the OR port may only be contacted locally
@@ -88,24 +124,26 @@
 
 		// bypass testing if we are reachable
 		this.configuration.add("AssumeReachable 1");
-		
+
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "RouterNodeImpl");
-
 	}
 
-	/**
-	 * @see de.uniba.wiai.lspi.puppetor.RouterNode#determineFingerprint()
-	 */
 	public synchronized String determineFingerprint()
 			throws TorProcessException {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "determineFingerprint");
+
+		// check if we can answer the request immediately
 		if (this.fingerprint != null) {
 
-			// we can answer the request immediately
+			// log exiting and return fingerprint
+			this.logger.exiting(this.getClass().getName(),
+					"determineFingerprint", this.fingerprint);
 			return this.fingerprint;
 		}
 
-
 		// write modified config file, including a DirServer option with
 		// false fingerprint; this is necessary, because otherwise Tor
 		// would not accept that this router node has a private IP
@@ -125,8 +163,11 @@
 			}
 			bw.close();
 		} catch (IOException e) {
-			throw new TorProcessException(
+			TorProcessException ex = new TorProcessException(
 					"Could not write temporary config file!", e);
+			this.logger.throwing(this.getClass().getName(),
+					"determineFingerprint", ex);
+			throw ex;
 		}
 
 		// start process with option --list-fingerprint
@@ -135,13 +176,15 @@
 		processBuilder.directory(this.workingDir);
 		processBuilder.redirectErrorStream(true);
 		Process tmpProcess = null;
-
 		try {
 			tmpProcess = processBuilder.start();
 		} catch (IOException e) {
-			throw new TorProcessException(
+			TorProcessException ex = new TorProcessException(
 					"Could not start Tor process temporarily with "
 							+ "--list-fingerprint option!", e);
+			this.logger.throwing(this.getClass().getName(),
+					"determineFingerprint", ex);
+			throw ex;
 		}
 
 		// start thread to parse output
@@ -150,14 +193,17 @@
 		Thread outputThread = new Thread(new Runnable() {
 			public void run() {
 				try {
-					// Read output from tor
+					// read output from tor
 					String line = null;
 					while ((line = br.readLine()) != null) {
 						// TODO discard output?
 						logger.log(Level.FINER, line);
 					}
 				} catch (IOException e) {
-					// TODO handle?
+					// TODO how to handle?
+					logger.log(Level.SEVERE,
+							"I/O exception while parsing output of temporary "
+									+ "Tor process!");
 				}
 			}
 		});
@@ -169,11 +215,12 @@
 		try {
 			tmpProcess.waitFor();
 		} catch (InterruptedException e) {
-			// TODO handle?
+			// TODO how to handle?
+			this.logger.log(Level.WARNING,
+					"Temporary Tor process was interrupted!", e);
 		}
 
 		// read fingerprint from file
-
 		File fingerprintFile = new File(this.workingDir.getAbsolutePath()
 				+ File.separator + "fingerprint");
 		try {
@@ -182,10 +229,22 @@
 			this.fingerprint = br2.readLine();
 			br2.close();
 		} catch (IOException e) {
-			throw new TorProcessException(
+			TorProcessException ex = new TorProcessException(
 					"Could not read fingerprint from file!", e);
+			this.logger.throwing(this.getClass().getName(),
+					"determineFingerprint", ex);
+			throw ex;
 		}
-		
+
+		// log exiting and return fingerprint
+		this.logger.exiting(this.getClass().getName(), "determineFingerprint",
+				this.fingerprint);
 		return this.fingerprint;
 	}
+
+	@Override
+	public String toString() {
+		return super.toString() + ", orPort=" + this.orPort + ", dirPort="
+				+ this.dirPort;
+	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ServerApplicationImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ServerApplicationImpl.java	2007-06-27 20:52:42 UTC (rev 10686)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ServerApplicationImpl.java	2007-06-27 22:09:47 UTC (rev 10687)
@@ -1,8 +1,3 @@
-/*
- * NOTICE: This file is still work in progress. As you can see the Java
- * documentation is written partly in German and in English and logging and
- * documentation still need some work. Sorry for any inconvenience!  
- */
 package de.uniba.wiai.lspi.puppetor.impl;
 
 import java.io.BufferedReader;
@@ -17,100 +12,109 @@
 import de.uniba.wiai.lspi.puppetor.Event;
 import de.uniba.wiai.lspi.puppetor.ServerApplication;
 
+/**
+ * Implementation of <code>ServerApplication</code>.
+ * 
+ * @author kloesing
+ */
 public class ServerApplicationImpl implements ServerApplication {
 
 	/**
-	 * logger für diesen server
+	 * Internal thread class that is used to process an incoming request.
 	 */
-	private Logger logger;
+	private class HandlerThread extends Thread {
 
-	private EventManagerImpl eventManager;
+		/**
+		 * Accepted socket on which the request came in.
+		 */
+		private Socket handleSocket = null;
 
-	private int serverPort;
+		/**
+		 * Creates a new thread to handle the request coming in on
+		 * <code>handleSocket</code>, but does not start handling it.
+		 * 
+		 * @param handleSocket
+		 *            Accepted socket on which the request came in.
+		 */
+		public HandlerThread(Socket handleSocket) {
 
-	/**
-	 * erzeugt neue server app innerhalb der jvm, fängt aber noch nicht an mit
-	 * listening.
-	 * 
-	 */
-	ServerApplicationImpl(NetworkImpl network, String serverApplicationName,
-			int serverPort) {
+			// log entering
+			logger.entering(this.getClass().getName(), "HandlerThread",
+					handleSocket);
 
-		// TODO make sure that name is loggable!!
+			// remember parameter
+			this.handleSocket = handleSocket;
 
-		// create logger
-		this.logger = Logger.getLogger("application." + serverApplicationName);
-
-		// log entering
-		this.logger.entering(this.getClass().getName(),
-				"ServerApplicationImpl", new Object[] { serverApplicationName,
-						serverPort });
-
-		// check parameters
-		if (serverApplicationName == null
-				|| serverApplicationName.length() == 0 || serverPort < 0
-				|| serverPort > 65535) {
-			throw new IllegalArgumentException();
+			// log exiting
+			logger.exiting(this.getClass().getName(), "HandlerThread");
 		}
 
-		// remember parameters
-		this.serverPort = serverPort;
+		@Override
+		public void run() {
 
-		// obtain reference on event manager
-		this.eventManager = network.getEventManagerImpl();
+			// log entering
+			logger.entering(this.getClass().getName(), "run");
 
-		// log exiting
-		this.logger.exiting(this.getClass().getName(), "ClientApplicationImpl");
-	}
+			try {
 
-	private Thread serverThread;
+				// wait for request (don't mind the content)
+				BufferedReader in = new BufferedReader(new InputStreamReader(
+						handleSocket.getInputStream()));
+				in.read();
 
-	public void stopListening() {
+				// send event to event manager
+				eventManager.observeEvent(ServerApplicationImpl.this,
+						Event.APPLICATION_REQUEST_RECEIVED);
 
-		// log entering
-		this.logger.entering(this.getClass().getName(), "stopListening");
+				// write response
+				PrintStream out = new PrintStream(handleSocket
+						.getOutputStream());
+				out.print("HTTP/1.0 200 OK\r\n");
 
-		// check if a request is running
-		if (this.serverThread == null) {
-			throw new IllegalStateException(
-					"We did not start listening before!");
-		}
+			} catch (IOException e) {
+				logger.log(Level.SEVERE,
+						"I/O exception while handling incoming request!");
+				// we can't do more, because nobody takes notice of this thread.
 
-		// log this event
-		this.logger.log(Level.FINE, "Shutting down server");
+				// log exiting
+				logger.exiting(this.getClass().getName(), "run");
+				return;
+				// TODO do we need more?
+			}
 
-		// interrupt thread
-		this.serverThread.interrupt();
+			// close socket
+			try {
+				handleSocket.close();
+			} catch (IOException e) {
+				logger
+						.log(Level.WARNING,
+								"I/O exception while closing socket!");
 
-		// log exiting
-		this.logger.exiting(this.getClass().getName(), "stopListening");
+				// log exiting
+				logger.exiting(this.getClass().getName(), "run");
+				return;
+			}
 
-	}
-
-	public void listen() {
-
-		// log entering
-		this.logger.entering(this.getClass().getName(), "listen");
-
-		// check if we are already listening
-		if (this.serverThread != null) {
-			throw new IllegalStateException("We are already listening!");
+			// log exiting
+			logger.exiting(this.getClass().getName(), "run");
 		}
-
-		// create a thread that listens in the background
-		this.serverThread = new ListenThread();
-		this.serverThread.setName("Reply Thread");
-		this.serverThread.setDaemon(true);
-		this.serverThread.start();
-
-		// log exiting
-		this.logger.exiting(this.getClass().getName(), "listen");
 	}
 
+	/**
+	 * Internal thread class that is used to listen for requests.
+	 */
 	private class ListenThread extends Thread {
 
+		/**
+		 * Flag to remember whether this thread listens for requests at the
+		 * moment (<code>true</code>), or has been stopped (<code>false</code>).
+		 */
 		private boolean connected;
 
+		/**
+		 * Creates a new thread to listen for requests, but does not start
+		 * listening, yet.
+		 */
 		ListenThread() {
 
 			// log entering
@@ -123,23 +127,6 @@
 			logger.exiting(this.getClass().getName(), "ListenThread");
 		}
 
-		/**
-		 * stoppt listening
-		 * 
-		 */
-		public void stopListening() {
-
-			// log entering
-			logger.entering(this.getClass().getName(), "stopListening");
-
-			// change connected state to false and interrupt thread
-			this.connected = false;
-			this.interrupt();
-
-			// log exiting
-			logger.exiting(this.getClass().getName(), "stopListening");
-		}
-
 		@Override
 		public void run() {
 
@@ -148,75 +135,196 @@
 
 			try {
 
+				// create server socket
 				ServerSocket serverSocket = null;
-
 				try {
 					serverSocket = new ServerSocket(serverPort);
 				} catch (IOException ioe) {
-					logger.log(Level.WARNING, "Can't open server socket on port "
-							+ serverPort + "!");
+					logger.log(Level.SEVERE,
+							"Can't open server socket on port " + serverPort
+									+ "!");
+
+					// log exiting
+					logger.exiting(this.getClass().getName(), "run");
+					return;
 				}
-				logger.log(Level.FINE, "Listening on port " + serverPort + "...");
+
+				// as long as we are connected, accept incoming requests
+				logger.log(Level.FINE, "Listening on port " + serverPort
+						+ "...");
 				while (connected) {
+					Socket incomingConnection = null;
 					try {
-						Socket incomingConnection = serverSocket.accept();
-						HandlerThread handler = new HandlerThread(
-								incomingConnection);
-						new Thread(handler).start();
+						incomingConnection = serverSocket.accept();
 					} catch (Exception e) {
+						logger
+								.log(
+										Level.SEVERE,
+										"Exception while accepting socket requests! Stopping listening!",
+										e);
+						break;
 					}
+					new HandlerThread(incomingConnection).start();
 				}
 
 			} catch (Exception e) {
 
 				// log that we have been interrupted
 				logger.log(Level.WARNING, "Server has been interrupted!", e);
-
-				// log exiting
-				logger.exiting(this.getClass().getName(), "run");
 			}
 
+			// mark as disconnected
+			this.connected = false;
+
+			// log exiting
+			logger.exiting(this.getClass().getName(), "run");
 		}
 
+		/**
+		 * Stops listening on server socket.
+		 */
+		public void stopListening() {
+
+			// log entering
+			logger.entering(this.getClass().getName(), "stopListening");
+
+			// change connected state to false and interrupt thread
+			this.connected = false;
+			this.interrupt();
+
+			// log exiting
+			logger.exiting(this.getClass().getName(), "stopListening");
+		}
 	}
 
-	private class HandlerThread implements Runnable {
+	/**
+	 * Event manager to which all events concerning this server application are
+	 * notified.
+	 */
+	private EventManagerImpl eventManager;
 
-		private Socket handleSocket = null;
+	/**
+	 * Logger for this server.
+	 */
+	private Logger logger;
 
-		public HandlerThread(Socket requestSocket) {
-			handleSocket = requestSocket;
+	/**
+	 * Name of this server application that is used as logger name of this node.
+	 */
+	private String serverApplicationName;
+
+	/**
+	 * Port on which this server will listen for incoming requests.
+	 */
+	private int serverPort;
+
+	/**
+	 * Thread that listens for requests in the background.
+	 */
+	private Thread serverThread;
+
+	/**
+	 * Creates a new HTTP server application within this JVM, but does not yet
+	 * listen for incoming requests.
+	 * 
+	 * @param network
+	 *            Network to which this HTTP server belongs; at the moment this
+	 *            is only used to determine the event manager instance.
+	 * @param serverApplicationName
+	 *            Name of this server that is used as part of the logger name.
+	 * @param serverPort
+	 *            Port on which this server will listen for incoming requests.
+	 * @throws IllegalArgumentException
+	 *             If at least one of the parameters is <code>null</code> or
+	 *             has an invalid value.
+	 */
+	ServerApplicationImpl(NetworkImpl network, String serverApplicationName,
+			int serverPort) {
+
+		// check if serverApplicationName can be used as logger name
+		if (serverApplicationName == null
+				|| serverApplicationName.length() == 0) {
+			throw new IllegalArgumentException(
+					"Invalid serverApplicationName: " + serverApplicationName);
 		}
 
-		public void run() {
+		// create logger
+		this.logger = Logger.getLogger("application." + serverApplicationName);
 
-			try {
+		// log entering
+		this.logger.entering(this.getClass().getName(),
+				"ServerApplicationImpl", new Object[] { network,
+						serverApplicationName, serverPort });
 
-				// wait for request (don't mind content)
-				BufferedReader in = new BufferedReader(new InputStreamReader(
-						handleSocket.getInputStream()));
-				in.read();
+		// check parameters
+		if (network == null || serverPort < 0 || serverPort > 65535) {
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(),
+					"ServerApplicationImpl", e);
+			throw e;
+		}
 
-				// send event to event manager
-				eventManager.observeEvent(ServerApplicationImpl.this,
-						Event.APPLICATION_REQUEST_RECEIVED);
+		// remember parameters
+		this.serverApplicationName = serverApplicationName;
+		this.serverPort = serverPort;
 
-				// write response
-				PrintStream out = new PrintStream(handleSocket
-						.getOutputStream());
-				out.print("HTTP/1.0 200 OK\r\n");
+		// obtain reference on event manager
+		this.eventManager = network.getEventManagerImpl();
 
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "ServerApplicationImpl");
+	}
 
-			try {
-				// handleSocket.getInputStream().close();
-				// handleSocket.getOutputStream().flush();
-				// handleSocket.getOutputStream().close();
-				handleSocket.close();
-			} catch (Exception e) {
-			}
+	public synchronized void listen() {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "listen");
+
+		// check if we are already listening
+		if (this.serverThread != null) {
+			IllegalStateException e = new IllegalStateException(
+					"We are already listening!");
+			this.logger.throwing(this.getClass().getName(), "listen", e);
+			throw e;
 		}
+
+		// create a thread that listens in the background
+		this.serverThread = new ListenThread();
+		this.serverThread.setName("Reply Thread");
+		this.serverThread.setDaemon(true);
+		this.serverThread.start();
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "listen");
 	}
+
+	public synchronized void stopListening() {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "stopListening");
+
+		// check if a request is running
+		if (this.serverThread == null) {
+			IllegalStateException e = new IllegalStateException(
+					"We did not start listening before!");
+			this.logger.throwing(this.getClass().getName(), "stopListening", e);
+			throw e;
+		}
+
+		// log this event
+		this.logger.log(Level.FINE, "Shutting down server");
+
+		// interrupt thread
+		this.serverThread.interrupt();
+
+		// log exiting
+		this.logger.exiting(this.getClass().getName(), "stopListening");
+	}
+
+	@Override
+	public String toString() {
+		return this.getClass().getSimpleName() + ": serverApplicationName=\""
+				+ this.serverApplicationName + "\", serverPort="
+				+ this.serverPort;
+	}
 }



More information about the tor-commits mailing list