jetty-6.1.26/0000755000175000017500000000000011745736533011465 5ustar moonmoonjetty-6.1.26/NOTICE.txt0000644000175000017500000000312511273670756013210 0ustar moonmoon============================================================== Jetty Web Container Copyright 1995-2009 Mort Bay Consulting Pty Ltd ============================================================== The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd unless otherwise noted. It is licensed under the apache 2.0 license. The javax.servlet package used by Jetty is copyright Sun Microsystems, Inc and Apache Software Foundation. It is distributed under the Common Development and Distribution License. You can obtain a copy of the license at https://glassfish.dev.java.net/public/CDDLv1.0.html. The UnixCrypt.java code ~Implements the one way cryptography used by Unix systems for simple password protection. Copyright 1996 Aki Yoshida, modified April 2001 by Iris Van den Broeke, Daniel Deville. Permission to use, copy, modify and distribute UnixCrypt for non-commercial or commercial purposes and without fee is granted provided that the copyright notice appears in all copies. The default JSP implementation is provided by the Glassfish JSP engine from project Glassfish http://glassfish.dev.java.net. Copyright 2005 Sun Microsystems, Inc. and portions Copyright Apache Software Foundation. Some portions of the code are Copyright: 2006 Tim Vernum 1999 Jason Gilbert. The jboss integration module contains some LGPL code. The win32 Java Service Wrapper (v3.2.3) is Copyright (c) 1999, 2006 Tanuki Software, Inc. and 2001 Silver Egg Technology. It is covered by an open license which is viewable at http://svn.codehaus.org/jetty/jetty/branches/jetty-6.1/extras/win32service/LICENSE.txt jetty-6.1.26/distribution/0000755000175000017500000000000011745736446014207 5ustar moonmoonjetty-6.1.26/distribution/jetty-assembly/0000755000175000017500000000000011745736447017164 5ustar moonmoonjetty-6.1.26/distribution/jetty-assembly/src/0000755000175000017500000000000011745736446017752 5ustar moonmoonjetty-6.1.26/distribution/jetty-assembly/src/main/0000755000175000017500000000000011745736446020676 5ustar moonmoonjetty-6.1.26/distribution/jetty-assembly/src/main/assembly/0000755000175000017500000000000011745736446022515 5ustar moonmoonjetty-6.1.26/distribution/jetty-assembly/src/main/assembly/site-component.xml0000644000175000017500000000055411173372264026174 0ustar moonmoon site-component jar ../../ ${artifactId}-${version} javadoc/** jxr/** jetty-6.1.26/distribution/jetty-assembly/src/resources/0000755000175000017500000000000011745736447021765 5ustar moonmoonjetty-6.1.26/distribution/jetty-assembly/src/resources/javadoc.css0000644000175000017500000000301410370423705024063 0ustar moonmoon/* Javadoc style sheet */ /* Define colors, fonts and other style attributes here to override the defaults */ /* Page background color */ body { background-color: #FFFFFF } a:link, a:visited { color:#4876FF; } a:active, a:hover, #leftcol a:active, #leftcol a:hover { color:#ff6600; } a:link.selfref, a:visited.selfref { color: #555 !important; } .a td { background: #ddd; color: #000; } h1 { color:#000099; } h2 { color:#000099; } /* Table colors */ .TableHeadingColor { background: #FFFFFF; color:#000099 } .TableSubHeadingColor { background: #FFFFFF; color:#666699; } .TableRowColor { background: #ffffff } /* White */ /* Font used in left-hand frame lists */ .FrameTitleFont { font-size: normal; font-family: Arial; color:#000099; } .FrameHeadingFont { font-size: normal; font-family: Arial; color:#666699; } .FrameItemFont { font-size: normal; font-family: Arial; color:#666699; } /* Example of smaller, sans-serif font in frames */ /* .FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */ /* Navigation bar fonts and colors */ .NavBarCell1 { color: #FFFFFF; background-color:#4876FF;} .NavBarCell1Rev { background-color:#000099;} .NavBarFont1 { font-family: Helvetica, sans-serif; color:#FFFFFF;} .NavBarFont1Rev { font-family: Helvetica, sans-serif; color:#FFFFFF;} .NavBarCell2 { font-family: Helvetica, sans-serif; color:#666699; background-color:#FFFFFF;} .NavBarCell3 { font-family: Helvetica, sans-serif; color:#666699; background-color:#FFFFFF;} jetty-6.1.26/distribution/jetty-assembly/pom.xml0000644000175000017500000000347711466510412020472 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-assembly pom Jetty :: Jetty Assembly org.codehaus.mojo exec-maven-plugin exec-site generate-sources exec mvn ../.. -Dmaven.test.skip=true -Daggregate=true -Pgenerate-site remote-resources:process jxr:jxr javadoc:javadoc maven-assembly-plugin src/main/assembly/site-component.xml package single jetty-6.1.26/webapps/0000755000175000017500000000000011745736447013132 5ustar moonmoonjetty-6.1.26/webapps/README.TXT0000644000175000017500000000127110521215356014447 0ustar moonmoon This directory is scanned at startup by the WebAppDeployer configured in the standard $JETTY_HOME/etc/jetty.xml file. WAR files, JAR files and directories discovered are deployed as web application instances. This directory is not rescanned for hot deployment (see $JETTY_HOME/contexts for hot deployment). The directory or file name is used as the basis of the context path (eg foo.war will have a context path of /foo). A directory called root or a webapplication called root.war will be deployed to the / context path. By default, the WebAppDeployer avoids duplicate context paths, so any contexts that have been configured manually or in $JETTY_HOME/contexts will not be deployed again. jetty-6.1.26/VERSION.txt0000644000175000017500000050776611466426733013376 0ustar moonmoonJetty-6.1.26 10 November 2010 + JETTY-748 Prevent race close of socket by old acceptor threads + JETTY-1239 HTAccessHandler [allow from 127.0.0.1] does not work + JETTY-1291 Extract query parameters even if POST content consumed + JETTY-1293 Avoid usage of String.split + JETTY-1296 Always clear changes list in selectManager Jetty-6.1.26.RC0 20 October 2010 + JETTY-547 Improved usage of shutdownOutput before close. + JETTY-912 add per exchange timeout + JETTY-1051 offer jetty.skip flag for maven plugin + JETTY-1096 exclude maven and plexus classes from jetty plugin + JETTY-1248 Infinite loop creating temp MultiPart files + JETTY-1264 Idle timer deadlock + JETTY-1271 Handle unavailable request + JETTY-1278 J2se6 SPI filter handling fix + JETTY-1283 Allow JSONPojoConvertorFactory to set fromJSON + JETTY-1287 rewrite handler thread safe issue resolved + JETTY-1288 info when atypical classloader set to WebAppContext + JETTY-1289 MRU cache for filter chains + JETTY-1292 close input streams after keystore.load() + 325468 Clean work webapp dir before unpack + 327109 Fixed AJP handling of empty packets + 327562 Implement all X-Forwarded headers in ProxyServlet Jetty-6.1.25 26 July 2010 + Jetty-6 is now in maintenance mode. + JETTY-1212 Long content lengths + JETTY-1214 Avoid ISE when scavenging invalid session + JETTY-1223 DefaultServlet: NPE when setting relativeResourceBase and resourceBase is not set + JETTY-1226 javax.activation needs to be listed in the system classes + JETTY-1237 Remember local/remote details of endpoint + JETTY-1251 protected against closed selector + COMETD-112 if two threads create the same channel, then create events may occur after subscribe events + 320264 Removed duplicate mime.property entries jetty-6.1.24 21 April 2010 + JETTY-903 Stop both caches + JETTY-1198 reset idle timeout on request body chunks + JETTY-1200 SSL NIO Endpoint wraps non NIO buffers + JETTY-1211 SetUID loadlibrary name and debug + 308925 Protect the test webapp from remote access + COMETD-99 ClientImpl logs exceptions in listeners with "debug" level + COMETD-100 ClientImpl logs "null" as clientId + COMETD-107 Reloading the application with reload extension does not fire /meta/connect handlers until long poll timeout expires + Upgraded to cometd 1.1.1 client jetty-6.1.23 2 April 2010 + JSON parses NaN as null + Updated JSP to 2.1.v20091210 + COMETD-28 Improved concurrency usage in Bayeux and channel handling + COMETD-46 reset ContentExchange content on resend + COMETD-58 Extension.rcv() return null causes NPE in AbstractBayeux.PublishHandler.publish + COMETD-59 AcknowledgeExtension does not handle null channel in Message + COMETD-62 Delay add listeners until after client construction + 296569 removeLifeCycleListener() has no effect + 292800 ContextDeployer - recursive setting is undone by FilenameFilter + 300178 HttpClients opens too many connections that are immediately closed + 304658 Inconsistent Expires date format in Set-Cookie headers with maxAge=0 + 304698 org.eclipse.jetty.http.HttpFields$DateGenerator.formatCookieDate() uses wrong (?) date format + 306331 Session manager is kept after call to doScope + 306840 suppress content-length in requests without content + 307847 Fixed combining mime type parameters + Remove references to old content in HttpClient client tests for www.sun.com + JETTY-875 Allow setting of advice field in response to Handshake + JETTY-983 Range handling cleanup + JETTY-1133 Handle multiple URL ; parameters + JETTY-1134 BayeuxClient: Connect msg should be sent as array + JETTY-1149 transient should be volatile in AbstractLifeCycle + JETTY-1153 System property for UrlEncoded charset + JETTY-1155 HttpConnection.close notifies HttpExchange + JETTY-1156 SSL blocking close with JVM Bug busy key fix + JETTY-1157 Don't hold array passed in write(byte[]) + JETTY-1158 NPE in StdErrLog when Throwable is null + JETTY-1161 An Extension that measures round-trip delay for cometd messages. + JETTY-1162 Add support for async/sync message delivery to BayeuxClient + JETTY-1163 AJP13 forces 8859-1 encoding + JETTY-1168 Don't hold sessionIdManager lock when invalidating sessions + JETTY-1170 NPE on client when server-side extension returns null + JETTY-1174 Close rather than finish Gzipstreams to avoid JVM leak + JETTY-1174 Memory leak in ChannelImpl/ContinuationClient + JETTY-1175 NPE in TimesyncExtension + JETTY-1176 NPE in StatisticsExtension if client is null + JETTY-1177 Allow error handler to set cacheControl + JETTY-1178 Make continuation servlet to log the incoming JSON in case of parsing errors + JETTY-1180 Extension methods are wrongly called + JETTY-1182 COMETD-76 do not lock client while sending messages. + JETTY-1182 Reduce synchronization in ContinuationCometdServlet + JETTY-1183 AcknowledgedMessagesClientExtension does not handle correctly message resend when client long polls again + JETTY-1186 Better document JMX setup in jetty-jmx.xml + JETTY-1188 Null old jobs in QueuedThreadPool + JETTY-1191 Limit size of ChannelId cache + JETTY-1192 Fixed Digested POST and HttpExchange onRetry + JETTY-1193 Exception details are lost in AbstractCometdServlet.getMessages + JETTY-1195 Coalesce buffers in ChannelEndPoint.flush() + JETTY-1196 Enable TCP_NODELAY by default in client connectors + JETTY-1197 SetUID module test fails when using Java 1.6 to build + JETTY-1199 FindBugs cleanups + JETTY-1205 Memory leak in browser-to-client mapping + JETTY-1207 NPE protection in FormAuthenticator + JETTY-1202 Use platfrom default algorithm for SecureRandom jetty-6.1.22 16 November 2009 + Fixed XSS issue in demo CometDump servlet + JETTY-937 More JVM bug work arounds. Insert pause if all else fails + JETTY-983 Send content-length with multipart ranges + JETTY-1120 Requests with no body are treated as complete even if there's a LF left to read + JETTY-1121 Merge Multipart query parameters + JETTY-1122 Handle multi-byte utf that causes buffer overflow + JETTY-1129 Filter control characters out of StdErrLog + JETTY-1135 Handle connection closed before accepted during JVM bug work around + JETTY-1144 Fixed multi-byte character overflow + JETTY-1148 Reset partially read request reader. + 289221 HttpExchange does not timeout when using blocking connector + 290761 HttpExchange.waitForDone() + 291340 state==HEADER (Race condition in onException() notifications) + 292546 Proactively enforce HttpClient idle timeout + CVE-2009-3555 Prevent SSL renegotiate for SSL vulnerability jetty-6.1.21 22 September 2009 + JETTY-719 Document state machine of jetty http client + JETTY-933 State == HEADER in client + JETTY-936 Improved servlet matching and optimized + JETTY-1038 ChannelId.isParentOf returns the wrong result + JETTY-1061 Catch exceptions from cometd listeners + JETTY-1072 maven plugin handles context path not as documented + JETTY-1080 modified previous fix for windows + JETTY-1084 HEAD command not setting content-type in response under certain circumstances + JETTY-1090 resolve inifinte loop condition for webdav listener + JETTY-1092 MultiPartFilter can be pushed into infinite loop + JETTY-1093 Request.toString throws exception when size exceeds 4k + JETTY-1098 Default form encoding is UTF8 + JETTY-1099 Improve cookie handling in BayeuxClient + JETTY-1100 extend setuid feature to allow setting max open file descriptors + JETTY-1102 Wrong usage of deliver() in private chat messages + JETTY-1108 SSL EOF detection + JETTY-1109 Improper handling of cookies in Terracotta tests + JETTY-1112 Response fails if header exceeds buffer size + JETTY-1113 IllegalStateException when adding servlet filters programmatically + JETTY-1114 Unsynchronize webapp classloader getResource + 282543 HttpClient SSL buffer size fix + 288055 fix jetty-client for failed listener state machine + 288153 reset exchange when resending + 288182 PUT request fails during retry + Fix DefaultServletTest for windows + Update Jetty implementation of com.sun.net.httpserver.* + Include tmp directory sweeper in build + Streamline jetty-jboss build, update sar to QueuedThreadPool jetty-6.1.20 27 August 2009 + JETTY-838 Don't log and throw + JETTY-874 Better error on full header. + JETTY-960 Support ldaps + JETTY-1046 maven-jetty-jspc-plugin keepSources takes affect only in packageRoot + JETTY-1057 XSS error page + JETTY-1065 Add RedirectRegexRule to provide match/replace/group redirect support + JETTY-1066 Send 400 error for request URI parse exceptions + JETTY-1068 Avoid busy flush of async SSL + JETTY-1069 Adjust Bayeux Java client backoff algorithm + JETTY-1070 Java Bayeux Client not sending /meta/disconnect on stop + JETTY-1074 JMX thread manipulation + JETTY-1077 HashSSORealm shares Principals between UserRealms + JETTY-1078 Automatic JSON Pojo Conversion + JETTY-1079 ResourceCollection.toString() can throw IllegalStateException + JETTY-1080 Ignore files that would be extracted outside the destination directory when unpacking WARs + JETTY-1081 Handle null content type in GzipFilter + JETTY-1084 Disable GzipFilter for HEAD requests + JETTY-1085 Allow url sessionID if cookie invalid + JETTY-1086 Added UncheckedPrintWriter to avoid ignored EOFs + JETTY-1087 Chunked SSL non blocking input + JETTY-1098 Upgrade jsp to SJSAS-9_1_1-B60F-07_Jan_2009 + 283513 Check endp.isOpen when blocking read + 283818 fixed merge of forward parameters + 285006 Fixed NPE in AbstractConnector during shutdown + 286535 ContentExchange status code + 286911 Clean out cache when recycling HTTP fields + COMETD-7 max latency config for lazy messages + Added getSubscriptions to cometd client + Made unSubscribeAll public on cometd client + Removed clearing of queue in unSubscribeAll for cometd client + Update test-jndi and test-annotation examples for atomikos 3.5.5 + Clarified cometd interval timeout and allow per client intervals + Update Main.main method to call setWar + Added DebugHandler jetty-6.1.19 1 July 2009 + JETTY-799 shell script for jetty on cygwin + JETTY-863 Non blocking stats handler + JETTY-937 Further Improvements for sun JVM selector bugs + JETTY-970 BayeuxLoadGenerator latency handling + JETTY-1011 Grizzly uses queued thread pool + JETTY-1028 jetty:run plugin should check for the web.xml from the overlays if not found in src/main/webapp/WEB-INF/ + JETTY-1029 Handle quoted cookie paths + JETTY-1031 Handle large pipeline + JETTY-1033 jetty-plus compiled with jdk1.5 + JETTY-1034 Cookie parsing + JETTY-1037 reimplemented channel doRemove + JETTY-1040 jetty.client.HttpConnection does not handle non IOExceptions + JETTY-1042 Avoid cookie reuse on shared connection + JETTY-1044 add commons-daemon support as contrib/start-daemon module + JETTY-1045 Handle the case where request.PathInfo() should be "/*" + JETTY-1046 maven-jetty-jspc-plugin keepSources takes affect only in packageRoot + JETTY-1047 Cometd client can grow cookie headers + JETTY-1048 Default servlet can handle partially filtered large static content + JETTY-1049 Improved transparent proxy usability + JETTY-1054 Avoid double deploys + JETTY-1055 Cookie quoting + JETTY-1057 Error page stack trace XSS + JETTY-1058 Handle trailing / with aliases on + JETTY-1062 Don't filter cometd message without data jetty-6.1.18 16 May 2009 + JETTY-937 Improved work around sun JVM selector bugs + JETTY-1004 CERT VU#402580 Canonical path handling includes ? in path segment + JETTY-1008 ContinuationBayeux destroy is called + JETTY-1013 MySql Error with JDBCUserRealm + JETTY-1014 Enable start-stop-daemon by default on jetty.sh (START_STOP_DAEMON=1) + JETTY-1015 Reduce BayeuxClient and HttpClient lock contention + JETTY-1017 HttpDestination has too coarse locking + JETTY-1018 Denial of Service Filter + JETTY-1020 ZipException in org.mortbay.jetty.webapp.TagLibConfiguration prevents all contexts from being loaded + JETTY-1022 Removed several 1.5isms Jetty-5.1.15 - 18 May 2009 + JETTY-418 synchronized load class + JETTY-1004 CERT VU402580 Canonical path handling includes ? in path segment + Fixes for CERT438616-CERT237888-CERT21284 jetty-6.1.17 30 April 2009 + JETTY-936 Make optional dispatching to welcome files as servlets + JETTY-937 Work around sun JVM selector bugs + JETTY-941 Linux chkconfig hint + JETTY-957 Reduce hardcoded versions + JETTY-980 Security / Directory Listing XSS present + JETTY-982 Make test-jaas-webapp run with jetty:run + JETTY-983 Default Servlet sets accept-ranges for cached/gzipped content + JETTY-988 X-Forwarded-Host has precedence over X-Forwarded-Server + JETTY-989 GzipFilter handles addHeader + JETTY-990 Async HttpClient connect + JETTY-992 URIUtil.encodePath encodes markup characters + JETTY-996 Make start-stop-daemon optional + JETTY-997 Remove jpackage-utils dependency on rpm install + JETTY-980 Fixed ResourceHandler ? handling, and bad URI creation in listings + JETTY-985 Allow listeners to implement both interfaces + JETTY-1000 Avoided needless 1.5 dependency + JETTY-1002 cometd-api to 1.0.beta8 + JETTY-1003 java.lang.IllegalArgumentException: timeout can't be negative + JETTY-1004 CERT VU#402580 Canonical path handling includes ? in path segment + JETTY-1006 Resume meta connect on all XD messages jetty-6.1.16 1 April 2009 + JETTY-702 Create "jetty-tasks.xml" for the Ant plugin + JETTY-899 Standardize location for configuration files which go into etc + JETTY-936 Allow dispatch to welcome files that are servlets + JETTY-944 Lazy messages don't prevent long polls waiting + JETTY-946 Redeploys with maven jetty plugin of webapps with overlays don't work + JETTY-947 Exception stops terracotta session scavenger + JETTY-948 ConcurrentModificationException in TerracottaSessionManager scavenger + JETTY-949 Move cometd source to cometd.org project + JETTY-953 SSL keystore file input stream is not being closed directly + JETTY-956 SslSelectChannelConnector - password should be the default value of keyPassword if not specified + JETTY-959 CGI servlet doesn't kill the CGI in case the client disconnects + JETTY-964 Typo in Jetty 6.1.15 Manifest - Bundle-RequiredExcutionEnvironment + JETTY-972 Move cometd code back from cometd.org project (temporarily) + JETTY-973 Deliver same message to a collection of cometd Clients jetty-6.1.15 4 March 2009 + JETTY-931 Fix issue with jetty-rewrite.xml + JETTY-934 fixed stop/start of Bayeux Client + JETTY-938 Deadlock in the TerracottaSessionManager + JETTY-939 NPE in AbstractConfiguration.callPreDestroyCallbacks + JETTY-923 BayeuxClient uses message pools to reduce memory footprint + JETTY-924 Improved BayeuxClient disconnect handling + JETTY-925 Lazy bayeux messages + JETTY-926 default location for generatedClasses of jspc plugin is incorrect jetty-6.1.15.rc5 26 February 2009 + JETTY-811 fixed @parameter + JETTY-915 Incorrect/Duplicate Logger implementation printed out on initialization + JETTY-917 Change for JETTY-811 breaks systemProperties config parameter in maven-jetty-plugin + JETTY-920 JETTY-921 Fixed cometd unsubscribeAll deadlock + JETTY-922 Fixed NPE on getRemoteHost when socket closed jetty-6.1.15.rc4 19 February 2009 + JETTY-496 Support inetd/xinetd through use of System.inheritedChannel() + JETTY-713 Expose additional AbstractConnector methods via MBean + JETTY-749 Improved ack extension + JETTY-811 Allow configuration of system properties for the maven plugin using a file + JETTY-840 add default mime types to *.htc and *.pps + JETTY-848 Temporary folder not fully cleanup after stop (via Sweeper) + JETTY-872 Handshake handler calls wrong extension callback + JETTY-879 Support extra properties in jQuery comet implementation + JETTY-802 Modify the default error pages to make association with Jetty clearer + JETTY-869 NCSARequestLog locale config + JETTY-870 NullPointerException in Response when performing redirect to wrong relative URL + JETTY-878 Removed printStackTrace from WaitingContinuation + JETTY-882 ChannelBayeuxListener called too many times + JETTY-884 Use hashcode for threadpool ID + JETTY-815 Add comet support to jQuery javascript library + JETTY-887 Split configuration and handshaking in jquery comet + JETTY-888 Fix abort in case of multiple outstanding connections + JETTY-894 Add android .apk to mime types + JETTY-898 Allow jetty debs to start with custom java args provided by users + JETTY-909 Update useragents cache jetty-6.1.15.rc3 28 January 2009 + JETTY-691 System.getProperty() calls ... wrap them in doPrivileged + JETTY-844 Replace reflection with direct invocation in Slf4jLog + JETTY-861 switched buffer pools to ThreadLocal implementation + JETTY-866 jetty-client test case fix jetty-6.1.15.rc2 23 January 2009 + adjustment to jetty-client assembly packaging + JETTY-567 Delay in initial TLS Handshake With FireFox 3 beta5 and SslSelectChannelConnector jetty-6.1.15.pre0 20 January 2009 + JETTY-600 Automated tests of WADI integration + upgrade to WADI 2.0 + JETTY-749 Reliable message delivery + JETTY-794 WADI integration tests fail intermittently. + JETTY-781 Add "mvn jetty:deploy-war" for deploying a pre-assembled war + JETTY-795 NullPointerException in SocketConnector.java + JETTY-798 Jboss session manager incompatible with LifeCycle.Listener + JETTY-801 Bring back 2 arg EnvEntry constructor + JETTY-802 Modify the default error pages to make association with Jetty very clear + JETTY-804 HttpClient timeout does not always work + JETTY-806 Timeout related Deadlocks in HTTP Client + JETTY-807 HttpTester to handle charsets + JETTY-808 cometd client demo run.sh + JETTY-809 Need a way to customize WEB-INF/lib file extensions that are added to the classpath + JETTY-814 Add org.mortbay.jetty.client.Address.toString() + JETTY-816 Implement reconnect on java bayeux client + JETTY-817 Aborted SSL connections may cause jetty to hang with full cpu + JETTY-819 Jetty Plus no more jre 1.4 + JETTY-821 Allow lazy loading of persistent sessions + JETTY-824 Access to inbound byte statistics + JETTY-825 URL decoding of spaces (+) fails for encoding not utf8 + JETTY-827 Externalize servlet api + JETTY-830 Add ability to reserve connections on http client + JETTY-831 Add ability to stop java bayeux client + JETTY-832 More UrlDecoded handling in relation to JETTY-825 + JETTY-833 Update debian and rpm packages for new jsp-2.1-glassfish jars and servlet-api jar + JETTY-834 Configure DTD does not allow children + JETTY-837 Response headers set via filter are ignored for static resources + JETTY-841 Duplicate messages when sending private message to yourself with cometd chat demo + JETTY-842 NPE in jetty client when no path component + JETTY-843 META-INF/MANIFEST.MF is not present in unpacked webapp + JETTY-852 Ensure handshake and connect retried on failure for jquery-cometd + JETTY-854 JNDI scope does not work with applications in a .war + JETTY-855 jetty-client uber assembly support + JETTY-858 ContentExchange provides bytes + JETTY-859 MultiPartFilter ignores the query string parameters + JETTY-862 EncodedHttpURI ignores given encoding in constructor jetty-6.1.14 14 November 2008 + JETTY-630 jetty6-plus rpm is missing the jetty6-plus jar + JETTY-748 Reduced flushing of large content + JETTY-765 ensure stop mojo works for all execution phases + JETTY-777 include util5 on the jetty debs + JETTY-778 handle granular windows timer in lifecycle test + JETTY-779 Fixed line feed in request log + JETTY-782 Implement interval advice for BayeuxClient + JETTY-783 Update jetty self-signed certificate + JETTY-784 TerracottaSessionManager leaks sessions scavenged in other nodes + JETTY-787 Handle MSIE7 mixed encoding + JETTY-788 Fix jotm for new scoped jndi + JETTY-790 WaitingContinuations can change mutex if not pending + JETTY-791 Ensure jdk1.4 compatibility for jetty-6 + JETTY-792 TerracottaSessionManager does not unlock new session with requested id + JETTY-793 Fixed DataCache millisecond rounding jetty-6.1.12 4 November 2008 + JETTY-731 Completed DeliverListener for cometd + JETTY-772 Increased default threadpool size to 250 + JETTY-774 Cached text/json content type + JETTY-775 fix port of openspaces to jetty-6 jetty-6.1.12.rc5 30 October 2008 + JETTY-703 maxStopTimeMs added to QueuedThreadPool + JETTY-762 improved QueuedThreadPool idle death handling + JETTY-763 Fixed AJP13 constructor + JETTY-766 Ensure SystemProperties set early on jetty-maven-plugin + JETTY-767 Fixed SSL Client no progress handshake bug + JETTY-768 Remove EnvEntry overloaded constructors + JETTY-771 Ensure NamingEntryUtil jdk1.4 compliant jetty-6.1.12.rc4 21 October 2008 + JETTY-319 improved passing of exception when webapp unavailable + JETTY-729 Backport Terracotta integration to Jetty6.1 branch + JETTY-744 Backport of JETTY-741: HttpClient connects slowly due to reverse address lookup by InetAddress.getHostName() + JETTY-747 Handle exceptions better in HttpClient + JETTY-755 Optimized HttpParser and buffers for few busy connections + JETTY-758 Update JSP 2.1 to glassfish tag SJSAS-9_1_1-B51-18_Sept_2008 + JETTY-759 Fixed JSON small negative real numbers + JETTY-760 Handle wildcard VirtualHost and normalize hostname in ContextHandlerCollection jetty-6.1.12.rc3 10 October 2008 + JETTY-241 Support for web application overlays in rapid application development (jetty:run) + JETTY-686 LifeCycle.Listener + JETTY-715 AJP key size + JETTY-716 NPE for empty cometd message + JETTY-718 during ssl unwrap, return true if some bytes were read, even if underflow + JETTY-720 fix HttpExchange.waitForStatus + JETTY-721 Support wildcard in VirtualHosts configuration + JETTY-722 jndi related threadlocal not cleared after deploying webapp + JETTY-723 jetty.sh does not check if TMP already is set + JETTY-725 port JETTY-708 (jndi scoping) to jetty-6 + JETTY-730 set SAX parser features to defaults + JETTY-731 DeliverListener for cometd + JETTY-732 Case Sensitive Basic Authentication Response Header Implementations + JETTY-736 Client Specific cometd advice + JETTY-738 If jetty.sh finds a pid file is does not check to see if a process with that pid is still running + JETTY-739 Race in QueuedThreadPool + JETTY-742 Private messages in cometd chat demo jetty-6.1.12rc2 12 September 2008 + JETTY-282 Support manually-triggered reloading + JETTY-331 SecureRandom hangs on systems with low entropy (connectors slow to startup) + JETTY-591 No server classes for jetty-web.xml + JETTY-670 $JETTY_HOME/bin/jetty.sh not worked in Solaris, because of /usr/bin/which has no error-code + JETTY-671 Configure DTD does not allow children + JETTY-672 Utf8StringBuffer doesn't properly handle null characters (char with byte value 0) + JETTY-676 ResourceHandler doesn't support HTTP HEAD requests + JETTY-677 GWT serialization issue + JETTY-680 Can't configure the ResourceCollection with maven + JETTY-681 JETTY-692 MultiPartFilter is slow for file uploads + JETTY-682 Added listeners and queue methods to cometd + JETTY-683 ResourceCollection works for jsp files but does not work for static resources under DefaultServlet + JETTY-687 Issue with servlet-mapping in dynamic servlet invoker + JETTY-688 Cookie causes NumberFormatException + JETTY-692 JETTY-681 MultiPartFilter is slow for file uploads + JETTY-696 ./jetty.sh restart not working + JETTY-698 org.mortbay.resource.JarResource.extract does not close JarInputStream jin + JETTY-699 Optimize cometd sending of 1 message to many many clients + JETTY-709 Jetty plugin's WebAppConfig configured properties gets overridden by AbstractJettyRunMojo even when already set + JETTY-710 Worked around poor implementation of File.toURL() + JETTY-712 HttpClient does not handle request complete after response complete jetty-6.1.12rc1 1 August 2008 + Upgrade jsp 2.1 to SJSAS-9_1_02-B04-11_Apr_2008 + JETTY-319 Get unavailable exception and added startWithUnavailable option + JETTY-381 JETTY-622 Multiple Web Application Source Directory + JETTY-442 Accessors for mimeType on ResourceHandler + JETTY-502 forward of an include should hide include attributes + JETTY-562 RewriteHandler support for virtual hosts + JETTY-563 GWT OpenRemoteServiceServlet GWT1.5M2+ + JETTY-564 Consider optionally importing org.apache.jasper.servlet + JETTY-571 SelectChannelConnector throws Exception on close on Windows + JETTY-596 Proxy authorization support in HttpClient + JETTY-599 handle buffers consistently handle invalid index for poke + JETTY-603 Handle IPv6 in HttpURI + JETTY-605 Added optional threadpool to BayeuxService + JETTY-606 better writeTo impl for BIO + JETTY-607 Add GigaSpaces session clustering + JETTY-610 jetty.class.path not being interpreted + JETTY-613 website module now generates site-component for jetty-site + JETTY-614 scanner allocated hashmap on every scan + JETTY-623 ServletContext.getServerInfo() non compliant + JETTY-626 Null protect reading the dtd resource from classloader + JETTY-628 Rewrite rule for rewriting scheme + JETTY-629 Don't hold timeout lock during expiry call. + JETTY-632 OSGi tags for Jetty client + JETTY-633 Default form encoding 8859_1 rather than utf-8 + JETTY-635 Correctly merge request parameters when doing forward + JETTY-637 empty date headers throw IllegalArgumentException + JETTY-641 JDBC Realm purge cache problem + JETTY-642 NPE in LdapLoginModule + JETTY-644 LdapLoginModule uses proper filters when searching + JETTY-646 Should set Cache-Control header when sending errors to avoid caching + JETTY-647 suspended POSTs with binary data do too many resumes + JETTY-650 Parse "*" URI for HTTP OPTIONS request + JETTY-651 Release resources during destroy + JETTY-654 Allow Cometd Bayeux object to be JMX manageable + JETTY-655 Support parsing application/x-www-form-urlencoded parameters via http PUT + JETTY-656 HttpClient defaults to async mode + JETTY-657 Backport jetty-7 sslengine + JETTY-658 backport latest HttpClient from jetty-7 to jetty-6 + JETTY-659 ContentExchange and missing headers in HttpClient + JETTY-660 Backported QoSFilter + JETTY-663 AbstractDatabaseLoginModule handle not found UserInfo and userName + JETTY-665 Support merging class directories + JETTY-666 scanTargetPatterns override the values already being set by scanTarget + JETTY-667 HttpClient handles chunked content + JETTY-669 Http methods other than GET and POST should not have error page content jetty-6.1.11 6 June 2008 + JETTY-336 413 error for full header buffer + JETTY-425 race in stopping SelectManager + JETTY-580 Fixed SSL shutdown + JETTY-581 ContextPath constructor + JETTY-582 final ISO_8859_1 + JETTY-584 handle null contextPath + JETTY-588 handle Retry in ServletException + JETTY-590 Digest auth domain for root context + JETTY-592 expired timeout callback without synchronization + JETTY-595 SessionHandler only deals with base request session + JETTY-596 Proxy support in HttpClient + JETTY-598 Added more reliable cometd message flush option jetty-6.1.10 20 May 2008 + Use QueuedThreadPool as default + JETTY-440 allow file name patterns for jsp compilation for jspc plugin + JETTY-529 CNFE when deserializing Array from session resolved + JETTY-537 JSON handles Locales + JETTY-547 Shutdown SocketEndpoint output before close + JETTY-550 Reading 0 bytes corrupts ServletInputStream + JETTY-551 Upgraded to Wadi 2.0-M10 + JETTY-556 Encode all URI fragments + JETTY-557 Allow ServletContext.setAttribute before start + JETTY-558 optional handling of X-Forwarded-For/Host/Server + JETTY-566 allow for non-blocking behavior in jetty maven plugin + JETTY-572 unique cometd client ID + JETTY-579 osgi fixes with management and servlet resources jetty-6.1.9 26 March 2008 + Make javax.servlet.jsp optional osgi import for jetty module + Ensure Jotm tx mgr can be found in jetty-env.xml + JETTY-399 update OpenRemoteServiceServlet to gwt 1.4 + JETTY-471 LDAP JAAS Realm + JETTY-475 AJP connector in RPMs + JETTY-482 update to JETTY-399 + JETTY-519 HttpClient does not recycle closed connection. + JETTY-522 Add build profile for macos for setuid + JETTY-525 Fixed decoding for long strings + JETTY-526 Fixed MMBean fields on JMX MBeans + JETTY-532 MBean properties for QueuedThreadPool + JETTY-535 Fixed Bayeux server side client memory leak + JETTY-538 test harness fix for windows + JETTY-541 Cometd per client timeouts jetty-6.1.8 28 February 2008 + Added QueuedThreadPool + Optimized QuotedStringTokenizer.quote() + further Optimizations and improvements of Cometd + Optimizations and improvements of Cometd, more pooled objects + Improved Cometd timeout handling + Added BayeuxService + Cookie support in BayeuxClient + Improved Bayeux API + add removeHandler(Handler) method to HandlerContainer interface + Added JSON.Convertor and non static JSON instances + Long cache for JSON + Fixed JSON negative numbers + JSON unquotes / + Add "mvn jetty:stop" + allow sessions to be periodically persisted to disk + grizzly fixed for posts + Add removeHandler(Handler) method to HandlerContainer interface + Remove duplicate commons-logging jars and include sslengine in jboss sar + Allow code ranges on ErrorPageErrorHandler + AJP handles bad mod_jk methods + JETTY-350 log ssl errors on SslSocketConnector + JETTY-417 JETTY_LOGS environment variable not queried by jetty.sh + JETTY-433 ContextDeployer constructor fails unnecessarily when using a security manager if jetty.home not set + JETTY-434 ContextDeployer scanning of sub-directories should be optional + JETTY-481 Handle empty Bayeux response + JETTY-489 Improve doco on the jetty.port property for plugin + JETTY-490 Fixed JSONEnumConvertor + JETTY-491 opendocument mime types + JETTY-492 Null pointer in HashSSORealm + JETTY-493 JSON handles BigDecimals + JETTY-498 Improved cookie parsing + JETTY-507 Fixed encoding from JETTY-388 and test case + JETTY-508 Extensible cometd handlers + JETTY-509 Fixed JSONP transport for changing callback names + JETTY-511 jetty.sh mishandled JETTY_HOME when launched from a relative path + JETTY-512 add slf4j as optional to manifest + JETTY-513 Terracotta session replication does not work when the initial page on each server does not set any attributes + JETTY-515 Timer is missing scavenging Task in HashSessionManager jetty-6.1.7 - 22 December 2007 + Added BayeuxService + Added JSON.Convertor and non static JSON instances + Add "mvn jetty:stop" + allow sessions to be periodically persisted to disk + Cookie support in BayeuxClient + grizzly fixed for posts + jetty-6.1 branch created from 6.1.6 and r593 of jetty-contrib trunk + Optimizations and improvements of Cometd, more pooled objects + Update java5 patch + JETTY-386 CERT-553235 backout fix and replaced with ContextHandler.setCompactPath(boolean) + JETTY-467 allow URL rewriting to be disabled. + JETTY-468 unique holder names for addServletWithMapping + JETTY-474 Fixed case sensitivity issue with HttpFields + JETTY-486 Improved jetty.sh script + JETTY-487 Handle empty chunked request jetty-6.1.6 - 18 November 2007 + rudimentary debian packaging + updated grizzly connector to 1.6.1 + JETTY-455 Optional cometd id + JETTY-459 Unable to deploy from Eclipse into the root context + JETTY-461 fixed cometd unknown channel + JETTY-464 typo in ErrorHandler + JETTY-465 System.exit() in constructor exception for MultiPartOutputStream jetty-6.1.6rc1 - 5 November 2007 + Upgrade jsp 2.1 to SJSAS-9_1-B58G-FCS-08_Sept_2007 + Housekeeping on poms + CERT VU#38616 handle single quotes in cookie names. + Improved JSON parsing from Readers + Moved some impl classes from jsp-api-2.1 to jsp-2.1 + Added configuration file for capturing stderr and stdout + Updated for dojo 1.0(rc) cometd + Give bayeux timer name + Give Terracotta session scavenger a name + Jetty Eclipse Plugin 1.0.1: force copy of context file on redeploy + JETTY-388 Handle utf-16 and other multibyte non-utf-8 form content. + JETTY-409 String params that denote files changed to File + JETTY-438 handle trailing . in vhosts + JETTY-439 Fixed 100 continues clash with Connection:close + JETTY-451 Concurrent modification of session during invalidate + JETTY-443 windows bug causes Acceptor thread to die + JETTY-445 removed test code + JETTY-448 added setReuseAddress on AbstractConnector + JETTY-450 Bad request for response sent to server + JETTY-452 CERT VU#237888 Dump Servlet - prevent cross site scripting + JETTY-453 updated Wadi to 2.0-M7 + JETTY-454 handle exceptions with themselves as root cause + JETTY-456 allow null keystore for osX + JETTY-457 AJP certificate chains jetty-6.1.6rc0 - 3 October 2007 + Added jetty.lib system property to start.config + AJP13 Fix on chunked post + Fix cached header optimization for extra characters + SetUID option to support setgid + Make mx4j used only if runtime uses jdk<1.5 + Moved Grizzly to contrib + Give deployment file Scanner threads a unique name + Fix Host header for async client + Fix typo in async client onResponsetHeader method name + Tweak OSGi manifests to remove unneeded imports + Allow scan interval to be set after Scanner started + Add jetty.host system property + Allow properties files on the XmlConfiguration command line. + Prevent infinite loop on stopping with temp dir + Ensure session is completed only when leaving context. + Update terracotta to 2.4.1 and exclude ssl classes + Update jasper2.1 to tag SJSAS-9_1-B58C-FCS-22_Aug_2007 + Removal of unneeded dependencies from management, maven-plugin, naming & plus poms + Adding setUsername,setGroupname to setuid and mavenizing native build + UTF-8 for bayeux client + CVE-2007-5615 Added protection for response splitting with bad headers. + Cached user agents strings in the /org/mortbay/jetty/useragents resource + Make default time format for RequestLog match NCSA default + Use terracotta repo for build; make jetty a terracotta module + Fix patch for java5 to include cometd module + Added ConcatServlet to combine javascript and css + Add ability to persist sessions with HashSessionManager + Avoid FULL exception in window between blockForOutput and remote close + Added JPackage RPM support + Added JSON.Convertable + Updated README, test index.html file and jetty-plus.xml file + JETTY-259 SystemRoot set for windows CGI + JETTY-311 avoid json keywords + JETTY-376 allow anything but CRLF in reason string + JETTY-398 Allow same WADI Dispatcher to be used across multiple web-app contexts + JETTY-400 consume CGI stderr + JETTY-402 keep HashUserRealm in sync with file + JETTY-403 Allow long content length for range requests + JETTY-404 WebAppDeployer sometimes deploys duplicate webapp + JETTY-405 Default date formate for reqest log + JETTY-407 AJP handles unknown content length + JETTY-413 Make rolloveroutputstream timer daemon + JETTY-422 Allow values to be null in config files + JETTY-423 Ensure javax.servlet.forward parameters are latched on first forward + JETTY-425 Handle duplicate stop calls better + JETTY-430 improved cometd logging + JETTY-431 HttpClient soTimeout jetty-6.1.5 - 19 Jul 2007 + Upgrade to Jasper 2.1 tag SJSAS-9_1-B50G-BETA3-27_June_2007 + Fixed GzipFilter for dispatchers + Fixed reset of reason + JETTY-392 - updated LikeJettyXml example jetty-6.1.5rc0 - 15 Jul 200 + update terracotta session clustering to terracotta 2.4 + SetUID option to only open connectors before setUID. + Protect SslSelectChannelConnector from exceptions during close + Improved Request log configuration options + Added GzipFilter and UserAgentFilter + make OSGi manifests for jetty jars + update terracotta configs for tc 2.4 stable1 + remove call to open connectors in jetty.xml + update links on website + make jetty plus example webapps use ContextDeployer + Dispatch SslEngine expiry (non atomic) + Make SLF4JLog impl public, add mbean descriptors + SPR-3682 - dont hide forward attr in include. + Upgrade to Jasper 2.1 tag SJSAS-9_1-B50G-BETA3-27_June_2007 + JETTY-253 - Improved graceful shutdown + JETTY-373 - Stop all dependent lifecycles + JETTY-374 - HttpTesters handles large requests/responses + JETTY-375 - IllegalStateException when committed. + JETTY-376 - allow spaces in reason string + JETTY-377 - allow sessions to be wrapped with AbstractSesssionManager.SessionIf + JETTY-378 - handle JVMs with non ISO/UTF default encodings + JETTY-380 - handle pipelines of more than 4 requests! + JETTY-385 - EncodeURL for new sessions from dispatch + JETTY-386 - Allow // in file resources jetty-6.1.4 - 15 Jun 2007 + fixed early open() call in NIO connectors + JETTY-370 ensure maxIdleTime<=0 means connections never expire + JETTY-371 Fixed chunked HEAD response + JETTY-372 make test for cookie caching more rigorous jetty-6.1.4rc1 - 10 Jun 2007 + Work around IBM JVM socket close issue + moved documentation for jetty and jspc maven plugins to wiki + async client improvements + fixed handling of large streamed files + Fixed synchronization conflict SslSelectChannel and SelectChannel + Optional static content cache + JETTY-310 better exception when no filter file for cometd servlet + JETTY-323 handle htaccess without a user realm + JETTY-346 add wildcard support to extra scan targets for maven plugin + JETTY-355 extensible SslSelectChannelConnector + JETTY-357 cleaned up ssl buffering + JETTY-360 allow connectors, userRealms to be added from a for maven plugin + JETTY-361 prevent url encoding of dir listings for non-link text + JETTY-362 More object locks + JETTY-365 make needClientAuth work on SslSelectChannelConnector + JETTY-366 JETTY-368 Improved bayeux disconnect jetty-6.1.4rc0 - 1 Jun 2007 + Reorganized import of contrib modules + Unified JMX configuration + Updated slf4j version to 1.3.1 + Updated junit to 3.8.2 + Allow XmlConfiguration properties to be configured + Add (commented out) jspc precompile to test-webapp + Add slf4j-api for upgraded version + Change scope of fields for Session + Add ability to run cometd webapps to maven plugin + Delay ssl handshake until after dispatch in sslSocketConnector + Set so_timeout during ssl handshake as an option on SslSocketConnector + Optional send Date header. Server.setSendDateHeader(boolean) + update etc/jetty-ssl.xml with new handshake timeout setting + fixed JSP close handling + improved date header handling + fixed waiting continuation reset + JETTY-257 fixed comet cross domain + JETTY-309 fix applied to sslEngine + JETTY-317 rollback inclusion of cometd jar for maven plugin + JETTY-318 Prevent meta channels being created + JETTY-330 Allow dependencies with scope provided for jspc plugin + JETTY-335 SslEngine overflow fix + JETTY-337 deprecated get/setCipherSuites and added get/setExcludeCipherSuites + JETTY-338 protect isMoreInBuffer from destroy + JETTY-339 MultiPartFiler deletes temp files on IOException + JETTY-340 FormAuthentication works with null response + JETTY-344 gready fill in ByteArrayBuffer.readFrom + JETTY-345 fixed lost content with blocked NIO. + JETTY-347 Fixed type util init + JETTY-352 Object locks jetty-6.1.3 - 4 May 2007 + Handle CRLF for content in header optimization + JETTY-309 don't clear writable status until dispatch + JETTY-315 suppressed warning + JETTY-322 AJP13 cping and keep alive jetty-6.1.2 - 1 May 2007 + Improved unavailabile handling + sendError resets output state + Fixed session invalidation error in WadiSessionManager + Updated Wadi to version 2.0-M3 + Added static member definition in WadiSessionManager + JETTY-322 fix ajp cpong response and close handling + JETTY-324 fix ant plugin + JETTY-328 updated jboss jetty-6.1.2rc5 - 24 April 2007 + set default keystore for SslSocketConnector + removed some compile warnings + Allow jsp-file to be / or /* + JETTY-305 delayed connection destroy + JETTY-309 handle close in multivalue connection fields. + JETTY-309 force writable status of endpoints. + JETTY-314 fix for possible NPE in Request.isRequestedSessionIdValid jetty-6.1.2rc4 - 19 April 2007 + JETTY-294 Fixed authentication reset + JETTY-299 handle win32 paths for object naming + JETTY-300 removed synchronized on dispatch + JETTY-302 correctly parse quoted content encodings + JETTY-303 fixed dual reset of generator + JETTY-304 Fixed authentication reset jetty-6.1.2rc3 - 16 April 2007 + Improved performance and exclusions for TLD scanning + MBean properties assume writeable unless marked RO + refactor of SessionManager and SessionIdManager for clustering + Improvements to allow simple setting of Cache-Control headers + AJP redirects https requests correctly + Fixed writes of unencoded char arrays. + JETTY-283 Parse 206 and 304 responses in client + JETTY-285 enable jndi for mvn jetty:run-war and jetty:run-exploded + JETTY-289 fixed javax.net.ssl.SSLException on binary file upload + JETTY-292 Fixed error page handler error pages + JETTY-293 fixed NPE on fast init + JETTY-294 Response.reset() resets headers as well as content + JETTY-295 Optional support of authenticated welcome files + JETTY-296 Close direct content inputstreams + JETTY-297 Recreate tmp dir on stop/start + JETTY-298 Names in JMX ObjectNames for context, servlets and filters jetty-6.1.2rc2 - 27 March 2007 + Enable the SharedStoreContextualiser for the WadiSessionManager(Database store for clustering) + AJP13 CPING request and CPONG response implemented + AJP13 Shutdown Request from peer implemented + AJP13 remoteUser, contextPath, servletPath requests implemented + Change some JNDI logging to debug level instead of info + Update jasper to glassfish tag SJSAS-9_1-B39-RC-14_Mar_2007 + Optimized multi threaded init on startup servlets + Removed unneeded specialized TagLibConfiguration class from maven plugin + Refactor Scanner to increase code reuse with maven/ant plugins + Added RestFilter for PUT and DELETE from Aleksi Kallio + Make annotations work for maven plugin + JETTY-125 maven plugin: ensure test dependencies on classpath for + JETTY-246 path encode cookies rather than quote + JETTY-254 prevent close of jar entry by bad JVMs + JETTY-256 fixed isResumed and work around JVM bug + JETTY-258 duplicate log message in ServletHandler + JETTY-260 Close connector before stop + JETTY-262 Allow acceptor thread priority to be adjusted + JETTY-263 Added implementation for authorizationType Packets + JETTY-265 Only quote cookie values if needed + JETTY-266 Fix deadlock with shutdown + JETTY-271 ResourceHandler uses resource for MimeType mapping + JETTY-272 Activate and Passivate events for sessions + JETTY-274 Improve flushing at end of request for blocking + JETTY-276 Partial fix for reset/close race + JETTY-277 Improved ContextHandlerCollection + JETTY-278 Session invalidation delay until no requests + JETTY-278 Only unwrap one layer of ServletExceptions + JETTY-280 Fixed deadlock with two flushing threads + JETTY-284 Fixed stop connector race + JETTY-286 isIntegral and isConfidential methods overridden in SslSelectChannelConnector jetty-6.1.2rc1 - 8 March 2007 + TagLibConfiguration uses resource input stream + Improved handling of early close in AJP + add ajp connector jar to jetty-jboss sar + Improved Context setters for wadi support + fix Dump servlet to handle primitive array types + handle comma separated values for the Connection: header + Added option to allow null pathInfo within context + BoundedThreadPool queues rather than blocks excess jobs. + Support null pathInfo option for webservices deployed to jetty/jboss + Workaround to call SecurityAssocation.clear() for jboss webservices calls to ejbs + Ensure jetty/jboss uses servlet-spec classloading order + call preDestroy() after servlet/filter destroy() + Fix constructor for Constraint to detect wildcard role + Added support for lowResourcesIdleTime to SelectChannelConnector + JETTY-157 make CGI handle binary data + JETTY-175 JDBCUserRealm use getInt instead of getObject + JETTY-188 Use timer for session scavaging + JETTY-235 default realm name + JETTY-242 fix race condition with scavenging sessions when stopping + JETTY-243 FULL + JETTY-244 Fixed UTF-8 buffer overflow + JETTY-245 Client API improvements + JETTY-246 spaces in cookies + JETTY-248 setContentLength after content written + JETTY-250 protect attribute enumerations from modification + JETTY-252 Fixed stats handling of close connection + JETTY-254 prevent close of jar file by bad JVMs jetty-6.1.2rc0 - 15 February 2007 + JETTY-223 Fix disassociate of UserPrincipal on dispatches + JETTY-226 Fixed SSLEngine close issue + JETTY-232 Fixed use of override web.xml + JETTY-236 Buffer leak + JETTY-237 AJPParser Buffer Data Handling + JETTY-238 prevent form truncation + Patches from sybase for ClientCertAuthenticator + Coma separated cookies + Cometd timeout clients jetty-6.1.2pre1 5 Feb 2007 + JETTY-224 run build up to process-test before invoking jetty:run + Added error handling for incorrect keystore/truststore password in SslSelectChannelConnector + fixed bug with virtual host handling in ContextHandlerCollection + added win32service to standard build + refactored cometd to be continuation independent + allow ResourceHandler to use resource base from an enclosing ContextHandler jetty-6.1.2pre0 1 Feb 2007 + Fixed 1.4 method in jetty plus + Fixed generation of errors during jsp compilation for jsp-2.1 + Added cometd jsonp transport from aabeling + Added terracotta cluster support for cometd + JETTY-213 request.isUserInRole(String) fixed + JETTY-215 exclude more transitive dependencies from tomcat jars for jsp-2.0 + JETTY-216 handle AJP packet fragmentation + JETTY-218 handle AJP ssl key size and integer + JETTY-219 fixed trailing encoded chars in cookies + JETTY-220 fixed AJP content + JETTY-222 fix problem parsing faces-config.xml + add support for Annotations in servlet, filter and listener sources + improved writer buffering + moved JSON parser to util to support reuse + handle virtual hosts in ContextHandlerCollection + enable SslSelectChannelConnector to modify the SslEngine's client authentication settings jetty-6.1.1 - 15 Jan 2007 jetty-6.1.1rc1 - 12 Jan 2007 + Use timers for Rollover logs and scanner + JETTY-210 Build jsp-api-2.0 for java 1.4 jetty-6.1.1rc0 - 10 Jan 2007 + Fixed unpacking WAR + extras/win32service download only if no JavaServiceWrapper exist + MultiPartFilter deleteFiles option + CGI servlet fails without exception + JETTY-209 Added ServletTester.createSocketConnector + JETTY-210 Build servlet-api-2.5 for java 1.4 + JETTY-211 fixed jboss build + ensure response headers on AjaxFilter messsages turn off caching + start webapps on deployment with jboss, use isDistributed() method from WebAppContext + simplified chat demo jetty-6.1.0 - 9 Jan 2007 + Fixed unpacking WAR jetty-6.1.0 - 5 Jan 2007 + Improved config of java5 threadpool + Protect context deployer from Errors + Added WebAppContext.setCopyWebDir to avoid JVM jar caching issues. + GERONIMO-2677 refactor of session id handling for clustering + ServletTester sets content length + Added extras/win32service + JETTY-206 fixed AJP getServerPort and getRemotePort jetty-6.1.0rc3 - 2 Jan 2007 + JETTY-195 fixed ajp ssl_cert handling + JETTY-197 fixed getRemoteHost + JETTY-203 initialize ServletHandler if no Context instance + JETTY-204 setuid fix + setLocale does not use default content type + Use standard releases of servlet and jsp APIs. + implement resource injection and lifecycle callbacks declared in web.xml + extras/servlet-tester jetty-6.1.0rc2 - 20 December 2006 + AJP13Parser, throw IllegalStateException on unimplemented AJP13 Requests + ContextHandlerCollection is noop with no handlers + ensure servlets initialized if only using ServletHandler + fixed Jetty-197 AJP13 getRemoteHost() + Refactored AbstractSessionManager for ehcache + ensure classpath passed to jspc contains file paths not urls + JETTY-194 doubles slashes are significant in URIs + JETTY-167 cometd refactor + remove code to remove SecurityHandler if no constraints present + JETTY-201 make run-as work for both web container and ejb container in jboss + ensure com.sun.el.Messages.properties included in jsp-2.1 jar jetty-6.1.0rc1 - 14 December 2006 + simplified idle timeout handling + JETTY-193 MailSessionReference without authentication + JETTY-199 newClassPathResource + ensure unique name for ServletHolder instances + added cache session manager(pre-alpha) jetty-6.1.0rc0 - 8 December 2006 + JETTY-181 Allow injection of a java:comp Context + JETTY-182 Optionally set JSP classpath initparameter + Dispatcher does not protect javax.servlet attributes + DefaultHandler links virtual hosts. + Fixed cachesize on invalidate + Optimization of writers + ServletHandler allows non REQUEST exceptions to propogate + TCK fixes from Sybase: * Handle request content encodings * forward query attribute fix * session attribute listener * Servlet role ref * flush if content-length written * 403 for BASIC authorization failure * null for unknown named dispatches + JETTY-184 cometd connect non blocking + Support for RFC2518 102-processing response + JETTY-123 fix improved + Added org.mortbay.thread.concurrent.ThreadPool + Added extras/gwt + Fixed idle timeout + JETTY-189 ProxyConnection + Added spring ejb3 demo example + update jasper to glassfish SJSAS-9_1-B27-EA-07_Dec_2006 + fixed JETTY-185 tmp filename generation jetty-6.1.0pre3 - 22 November 2006 + fixed NIO endpoint flush. Avoid duplicate sends + CVE-2006-6969 Upgraded session ID generation to use SecureRandom + updated glassfish jasper to tag SJSAS-9_1-B25-EA-08_Nov_2006 + Support TLS_DHE_RSA_WITH_AES_256_CBC_SHA + JETTY-180 XBean support for context deploy + JETTY-154 Cookies are double quotes only + Expose isResumed on Continuations + Refactored AJP generator jetty-6.0.2 - 22 November 2006 + Moved all modules updates from 6.1pre2 to 6.0 + Added concept of bufferred endpoint + Added conversion Object -> ObjectName for the result of method calls made on MBeans + Added DataFilter configuration to cometd + added examples/test-jaas-webapp + Added extraClassPath to WebAppContext + Added hierarchical destroy of mbeans + Added ID constructor to AbstractSessionManager.Session + added isStopped() in LifeCycle and AbstractLifeCycle + Added override descriptor for deployment of RO webapps + add replacement in jetty xml config files + alternate optimizations of writer (use -Dbuffer.writers=true) + Allow session cookie to be refreshed + Apply queryEncoding to getQueryString + CGI example in test webapp + change examples/test-jndi-webapp so it can be regularly built + Default soLinger is -1 (disabled) + ensure "" returned for ServletContext.getContextPath() for root context + ensure sessions nulled out on request recycle; ensure session null after invalidate + ensure setContextPath() works when invoked from jetty-web.xml + fixed NIO endpoint flush. Avoid duplicate sends + Fixed NPE in bio.SocketEndPoint.getRemoteAddr() + Fixed resource cache flushing + Fixed tld parsing for maven plugin + HttpGenerator can generate requests + Improved *-mbean.properties files and specialized some MBean + JETTY-118 ignore extra content after close. + JETTY-119 cleanedup Security optimizatoin + JETTY-123 handle windows UNC paths + JETTY-126 handle content > Integer.MAX_VALUE + JETTY-129 ServletContextListeners called after servlets are initialized + JETTY-151 Idle timeout only applies to blocking operations + JETTY-151 refactored writers + JETTY-154 Cookies are double quotes only + JETTY-171 Fixed filter mapping + JETTY-172 use getName() instead of toString + JETTY-173 restore servletpath after dispatch + Major refactor of SelectChannel EndPoint for client selector + make .tag files work in packed wars + Plugin shutdown context before stopping it. + Refactored session lifecycle and additional tests + release resource lookup in Default servlet + (re)make JAAS classes available to webapp classloader + Reverted UnixCrypt to use coersions (that effected results) + Session IDs can change worker ID + Simplified ResourceCache and Default servlet + SocketConnector closes all connections in doStop + Upgraded session ID generation to use SecureRandom + updated glassfish jasper to tag SJSAS-9_1-B25-EA-08_Nov_2006 + Support TLS_DHE_RSA_WITH_AES_256_CBC_SHA Jetty-5.1.14 - 9 Aug 2007 + patched with correct version + JETTY-155 force close with content length. + JETTY-369 failed state in Container Jetty-5.1.13 + Sourceforge 1648335: problem setting version for AJP13 Jetty-5.1.12 - 22 November 2006 + Added support for TLS_DHE_RSA_WITH_AES_256_CBC_SHA + Upgraded session ID generation to use SecureRandom + Quote single quotes in cookies + AJP protected against bad requests from mod_jk + JETTY-154 Cookies ignore single quotes Jetty-4.2.27 - 22 November 2006 + Upgraded session ID generation to use SecureRandom + AJP protected against bad requests from mod_jk jetty-6.1.0pre2 - 20 Nov 2006 + Added extraClassPath to WebAppContext + Fixed resource cache flushing + Clean up jboss module licensing jetty-6.1.0pre1 - 19 Nov 2006 + Use ContextDeployer as main deployer in jetty.xml + Added extras/jboss + Major refactor of SelectChannel EndPoint for client selector + Fixed NPE in bio.SocketEndPoint.getRemoteAddr() + Reverted UnixCrypt to use coersions (that effected results) + JETTY-151 Idle timeout only applies to blocking operations + alternate optimizations of writer (use -Dbuffer.writers=true) + JETTY-171 Fixed filter mapping + JETTY-172 use getName() instead of toString + JETTY-173 restore servletpath after dispatch + release resource lookup in Default servlet + Simplified ResourceCache and Default servlet + Added override descriptor for deployment of RO webapps + Added hierarchical destroy of mbeans + JETTY-151 refactored writers jetty-6.1.0pre0 - 21 Oct 2006 + add replacement in jetty xml config files + make .tag files work in packed wars + add hot deployment capability + ensure setContextPath() works when invoked from jetty-web.xml + ensure sessions nulled out on request recycle; ensure session null after invalidate + ensure "" returned for ServletContext.getContextPath() for root context + Fixed tld parsing for maven plugin + Improved *-mbean.properties files and specialized some MBean + Added conversion Object -> ObjectName for the result of method calls made on MBeans + JETTY-129 ServletContextListeners called after servlets are initialized + change examples/test-jndi-webapp so it can be regularly built + added isStopped() in LifeCycle and AbstractLifeCycle + fixed isUserInRole checking for JAASUserRealm + fixed ClassCastException in JAASUserRealm.setRoleClassNames(String[]) + add a maven-jetty-jspc-plugin to do jspc precompilation + added examples/test-jaas-webapp + (re)make JAAS classes available to webapp classloader + CGI example in test webapp + Plugin shutdown context before stopping it. + Added concept of bufferred endpoint + Factored ErrorPageErrorHandler out of WebAppContext + Refactored ErrorHandler to avoid statics + Transforming classloader does not transform resources. + SocketConnector closes all connections in doStop + Improved charset handling in URLs + minor optimization of bytes to UTF8 strings + JETTY-112 ContextHandler checks if started + JETTY-113 support optional query char encoding on requests + JETTY-114 removed utf8 characters from code + JETTY-115 Fixed addHeader + added cometd chat demo + JETTY-119 cleanedup Security optimizatoin + Refactored session lifecycle and additional tests + JETTY-121 init not called on externally constructed servlets + JETTY-124 always initialize filter caches + JETTY-126 handle content > Integer.MAX_VALUE + JETTY-123 handle windows UNC paths + JETYY-120 SelectChannelConnector closes all connections on stop + Added ID constructor to AbstractSessionManager.Session + Allow session cookie to be refreshed + Added DataFilter configuration to cometd + Added extras/setuid to support start as root + Apply queryEncoding to getQueryString + JETTY-118 ignore extra content after close. + HttpGenerator can generate requests + Ported HtAccessHandler + Start of a client API + Session IDs can change worker ID + Default soLinger is -1 (disabled) + AJP Connector Jetty-5.1.11 - 8 October 2006 + fixed ByteBufferOutputStream capacity calculation + Fixed AJP handling of certificate length (1494939) + Fixed AJP chunk header (1507377) + Fixed order of destruction event calls + Fix to HttpOutputStream from M.Traverso + Default servlet only uses setContentLength on wrapped responses Jetty-4.2.26 - 8 October 2006 + Backport of AJP fixes jetty-6.0.1 - 24 September 2006 + fixed isUserInRole checking for JAASUserRealm + fixed ClassCastException in JAASUserRealm.setRoleClassNames(String[]) + Improved charset handling in URLs + Factored ErrorPageErrorHandler out of WebAppContext + Refactored ErrorHandler to avoid statics + JETTY-112 ContextHandler checks if started + JETTY-114 removed utf8 characters from code + JETTY-115 Fixed addHeader + JETTY-121 init not called on externally constructed servlets + Improved charset handling in URLs + minor optimization of bytes to UTF8 strings + JETTY-113 support optional query char encoding on requests + JETTY-124 always initialize filter caches + JETYY-120 SelectChannelConnector closes all connections on stop jetty-6.0.0 - 10 September 2006 + SocketConnector closes all connections in doStop + Conveniance builder methods for listeners and filters + Transforming classloader does not transform resources. + Plugin shutdown context before stopping it. jetty-6.0.0rc4 - 5 September 2006 + bind jetty-env.xml entries to java:comp/env + Fix for JETTY-107. Poor cast in SessionDump demo. + Set charset on error pages jetty-6.0.0rc3 - 1 September 2006 + pulled 6.0.0 branch + turn URLConnection caching off when searching for tlds [JETTY-103] + Move MailSessionReference to org.mortbay.naming.factories + Less verbose handling of BadResources from bad URLs + Avoid double error handling of Bad requests + don't warn for content length on head requests + temp fix for JETTY-104 (raised glassfish ISSUE-1044) hide JSP forced path attribute + Fixed JETTY-68. Complete request after sendRedirect + Transferred the sslengine patch from the patches directory to extras jetty-6.0.0rc2 - 25 August 2006 + use mvn -Dslf4j=false jetty:run to disable use of slf4j logging with jdk1.4/jsp2.0 + added org.apache.commons.logging package to system classes that can't be overridden by a webapp classloader + mvn -Djetty.port=x jetty:run uses port number given for the default connector + Fixed NPE when no resource cache + Refactored WebXmlConfiguration to allow custom web.xml resource + Moved more utility packagtes to the util jar + Direct buffer useage is optional + Destroy HttpConnection to improve buffer pooling + Timestamp in StdErrLog jetty-6.0.0rc1 - 16 August 2006 + Support for binding References and Referenceables and javax.mail.Sessions in JNDI + Added TransformingWebAppClassLoader for spring 2.0 byte code modification support + Ensure classes come before dependencies for plugin [JETTY-90] + Fixed FD leak for bad TCP acks. JETTY-63 + new Server().addHandler(handler) no longer throws NPE [JETTY-87] + Change path mapping so that a path spec of /foo/* does not match /foo.bar : JETTY-88 + add config param to jetty plugin + Improve Ssl config JETTY-85 JETTY-86 (TrustManager and SecureRandom are now configurable; better handling of null/default values) + parse jsp-property-group in web.xml for additional JSP servlet mappings + protected setContentType from being set during include + added toString() on JAASUserPrincipal (JETTY-91) + added modules/spring with XmlBeanFactory configuration + removed support for lowResources from SelectChannelConnector + added start of cometd implementation (JSON only) + added start of grizzly connector + removed org.mortbay. from context system classes configuration + -DSTOP.PORT must be specified. + moved optional modules to extras + fixed bug that caused Response.setStatus to ignore the provided message + refactored resource cache + Allow direct filling of buffers for uncached static content. + Added simple ResourceHandler and FileServer example jetty-6.0.0rc0 - 7 July 2006 + change prefix from "jetty6" to just "jetty" for plugin: eg is now mvn jetty:run + allow or in for plugin + simplified jetty.xml with new constructor injections + added setters and getters on SessionManager API for session related config: cookie name, url parameter name, domain, max age and path. + add ability to have a lib/ext dir from which to recursively add all jars and zips to the classpath + patch to allow Jetty to use JSP2.1 from Glassfish instead of Jasper from Tomcat + fixed classesDirectory param for maven plugin to be configurable + ensure explicitly set tmp directory called "work" is not deleted on exit + ensure war is only unpacked if war is newer than "work" directory + change name of generated tmp directory to be "Jetty_"+host+"_"+port+"_"+contextpath+"_"+virtualhost + Cleaned up idle expiry. + Ssl algorithm taken from system property + Added 8 random letters&digits to Jetty-generated tmp work dir name to ensure uniqueness + Simplify runtime resolution of JSP library for plugin + Ensure mvn clean cleans the build + Do not wrap EofException with EofException + reverse order for destroy event listeners + added StatisticsHandler and statistics on Connector. + Simplified Servlet Context API + Added maximum limit to filter chain cache. + refactor HttpChannelEndPoint in preparation for SslEngine + ContextHandlerCollection addContext and setContextClass + Discard excess bytes in header buffer if connection is closing + Updated javax code from http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java/javax@417727 + Threadpool does not need to be a LifeCycle + support graceful shutdown + Added WebAppContextClassLoader.newInstance to better support exensible loaders. + immutable getParameterMap() + support for SingleThreadModel + changed ServletContext.getResourcePaths() to not return paths containing double slashes + fixed HttpGenerator convertion of non UTF-8: JETTY-82 + added html module from jetty 5 - but deprecated until maintainer found jetty-6.0.0beta17 - 1/6/2006 + Added config to disable file memory mapped buffers for windows + Added Request.isHandled() + Refactored Synchronization of SelectChannelConnector + Recovered repository from Codehaus crash + ContextHandler.setConnectors replace setHosts + Connector lowResourceMaxIdleTime implemented. + Default servlet checks for aliases resources + Added clover reports and enough tests to get >50% coverage + Fixed IE SSL issue. + Implemented runAs on servlets + Flush will flush all bytes rather than just some. + Protected WEB-INF and META-INF + don't reset headers during forward + BoundedThreadPool.doStop waits for threads to complete jetty-6.0.0beta16 - 12/5/2006 + remove a couple of System.err.printlns + replace backwards compativle API in UrlEncoded jetty-6.0.0beta15 - 11/5/2006 + Added Server attribute org.mortbay.jetty.Request.maxFormContentSize + Renamed NotFoundHandler to DefaultHandler + Added automatic scan of all WEB-INF/jetty-*.xml files for plugin + Added parameter to allow other locations to scan for plugin + Major refactor to simplify Server and handler hierarchy + setSendServerVersion method added to Server to control sending of Server: http header + removed SelectBlockingChannelConnector (unmaintained) + Improved HttpException + Moved more resources to resources + Added ThrottlingFilter and fixed race in Continuations + Added taglib resources to 2.1 jsp api jar + Reset of timer task clears expiry + improved MBeanContainer object removal + ContextHandler.setContextPath can be called after start. + Fixed handling of params after forward + Added --version to start.jar + Added embedded examples + Simplified DefaultServlet static content buffering + readded BoundedThreadPool shrinking (and then fixed resulting deadlock) + improved MBean names + improved support for java5 jconsole + Session scavenger threads from threadpool + Thread names include URI if debug set + don't accept partial authority in request line. + enforce 204 and 304 have no content jetty-6.0.0beta14 - 9/4/2006 + ignore dirs and files that don't exist in plugin scanner + added support for stopping jetty using "java -jar start.jar --stop" + added configurability for webdefault.xml in maven plugin + adding InvokerServlet + added ProxyServlet + stop JDBCUserRealm coercing all credentials to String + Change tmp dir of plugin to work to be in line with jetty convention + Modify plugin to select JSP impl at runtime + Use start.config to select which JSP impl at runtime based on jdk version + Added JSP 2.1 APIs from apache + Added Jasper 2.1 as jesper (jasper without JCL) + Started readding logging to jesper using jdk logging + fixed priority of port from url over host header + implemented request.isUserInRole + securityHandler removed if not used. + moved test webapps to examples directory + improved contentType handling and test harness + fixed forward bug (treated as include) + fixed HttpField iterator + added jetty-util.jar module + added reset to Continuation jetty-6.0.0beta12 - 16/3/2006 + Fixed maven plugin JNDI for redeploys + Fixed tld discovery for plugin (search dependencies) + Fixed JettyPlus for root contexts + Fixed error handling in error page + Added JSP2.0 demos to test webapp + Upgraded jasper to 5.5.15 + Added provider support to SslListener + Log ERROR for runtimeExceptions jetty-6.0.0beta11 - 14/3/2006 + added JAAS + added webapp-specific JNDI entries + added missing Configurations for maven plugin + fixed FORM authentication + moved dtd and xsd to standard javax location + added patch to use joda-time + refactored session ID management + refactored configuration files and start() + fixed ; decoding in URIs + Added HttpURI and improved UTF-8 parsing. + refactored writers and improved UTF-8 generation. jetty-6.0.0beta10 25/2/2006 + Added support for java:comp/env + Added support for pluggable transaction manager + Forward masks include attributes and vice versa + Fixed default servlet handling of includes + Additional accessors for request logging + added getLocalPort() to connector + Fixed content-type for range requests + Fix for sf1435795 30sec delay from c taylor + Fix for myfaces and include with close + Fix sf1431936 don't chunk the chunk + Fix http://jira.codehaus.org/browse/JETTY-6. hi byte reader + Updates javax to MR2 release jetty-6.0.0beta9 9/2/2006 + PathMap for direct context mapping. + Refactored chat demo and upgraded prototype.js + Continuation cleanup + Fixed unraw decoding of query string + Fixed dispatch of wrapped requests. + Fixed double flush of short content. + Added request log. + Added CGI servlet. + Force a tempdir to be set. + Force jasper scratch dir. + fixed setLocale bug sf1426940 + Added TLD tag listener handling. jetty-6.0.0beta8 24/1/2006 + fixed dispatch of new session problem. sf:1407090 + reinstated rfc2616 test harness + Handle pipeline requests without hangs + Removed queue from thread pool. + improved caching of content types + fixed bug in overloaded write method on HttpConnection (reported against Tapestry4.0) + hid org.apache.commons.logging and org.slf4j packages from webapp + maven-jetty6-plugin stopped transitive inclusion of log4j and commons-logging from commons-el for jasper + patch to remove spurious ; in HttpFields + improve buffer return mechanism. + conveniance addHandler removeHandler methods + maven-jetty6-plugin: ensure compile is done before invoking jetty + maven-jetty6-plugin: support all types of artifact dependencies Jetty-6.0.0Beta7 + Fixed infinite loop with chunk handling + Faster header name lookup + removed singleton Container + reduced info verbosity + null dispatch attributes not in names + maven-jetty6-plugin added tmpDirectory property + maven-jetty6-plugin stopped throwing an error if there is no target/classes directory Jetty-6.0.0Beta6 + Fixed issue with blocking reads + Fixed issue with unknown headers + optimizations Jetty-6.0.0Beta5 + Moved to SVN + Fixed writer char[] creations + Added management module for mbeans Jetty-6.0.0Beta4 + System property support in plugin + CVE-2006-2758 Fixed JSP visibility security issue. + Improved jetty-web.xml access to org.mortbay classes. + Jasper 5.5.12 Jetty-6.0.0Beta3 + Fixed error in block read + Named dispatch. + Fixed classloader issue with server classes Jetty-6.0.0Beta2 + merged util jar back into jetty jar + Simpler continuation API + loosely coupled with JSP servlet + loosely coupled with SLF4J + Improved reuse of HttpField values and cookies. + Improved buffer return Jetty-6.0.0Beta1 + Servlet 2.5 API + SSL connector + maven2 plugin + shutdown hook + refactored start/stop + Implemented all listeners + Error pages + Virtual hosts + Multiple select sets Jetty-6.0.0Beta0 + Maven 2 build + Dispatcher parameters + UTF-8 encoding for URLs + Fixed blocking read Jetty-6.0.0APLPA3 + Added demo for Continuations + Jasper and associated libraries. Jetty-6.0.0ALPHA2 + Continuations - way cool way to suspend a request and retry later. + Dispatchers + Security Jetty-6.0.0ALPHA1 + Filters + web.xml handling Jetty-6.0.0ALPHA0 * Totally rearchitected and rebuilt, so 10 years of cruft could be removed! * Improved "dependancy injection" and "inversion of control" design of components * Improved "interceptor" design of handlers * Smart split buffer design allows large buffers to only be allocated to active connections. The resulting memory savings allow very large buffers to be used, which increases the chance of efficient asynchronous flushing and of avoiding chunking. * Optional use of NIO Buffering so that efficient direct buffers and memory mapped files can be used. * Optional use of NIO non-blocking scheduling so that threads are not allocated per connection. * Optional use of NIO gather writes, so that for example a HTTP header and a memory mapped * file may be sent as sent is a single operation. - Missing Security - Missing Request Dispatchers - Missing web.xml based configuration - Missing war support Jetty-5.1.11RC0 - 5 April 2006 + stop JDBCUserRealm forcing all credentials to be String + force close with shutdownOutput for win32 + NPE protection if desirable client certificates + Added provider support to SslListener + logging improvements for servlet and runtime exceptions + Fixed AJP handling of ;jsessionid. + improved contentType param handling Jetty-5.1.10 - 5 January 2006 + Fixed path aliasing with // on windows. + Fix for AJP13 with multiple headers + Fix for AJP13 with encoded path + Remove null dispatch attributes from getAttributeNames + Put POST content default back to iso_8859_1. GET is UTF-8 still Jetty-4.2.25 - 4 Jan 2006 + Fixed aliasing of // for win32 Jetty-5.1.9 - 7 December 2005 + Fixed wantClientAuth(false) overriding netClientAuth(true) Jetty-6.0.0betaX - + See http://jetty.mortbay.org/jetty6 for 6.0 releases Jetty-5.1.8 - 7 December 2005 + Fixed space in URL issued created in 5.1.6 Jetty-5.1.7 - 7 December 2005 Jetty-5.1.7rc0 - 6 December 2005 + improved server stats + char encoding for MultiPartRequest + fixed merging of POST params in dispatch query string. + protect from NPE in dispatcher getValues + Updated to 2.6.2 xerces + JSP file servlet mappings copy JspServlet init params. + Prefix servlet context logs with org.mortbay.jetty.context + better support for URI character encodings + use commons logging jar instead of api jar. Jetty-5.1.6 - 18 November 2005 + CVE-2006-2758 Fixed JSP visibility security issue. + Improved jetty-web.xml access to org.mortbay classes. Jetty-5.1.5 - 10 November 2005 + Improved shutdown hook + Improved URL Decoding + Improved mapping of JSP files. Jetty-5.1.5rc2 - 7 October 2005 + Reverted dispatcher params to RI rather than spec behaviour. + ProxyHandler can handle chained proxies + unsynchronized ContextLoader + ReFixed merge of Dispatcher params + public ServerMBean constructor + UTF-8 encoding for URLs + Response.setLocale will set locale even if getWriter called. Jetty-5.1.5rc1 - 23 August 2005 + upgraded to commons logging 1.0.4 + Release commons logging factories when stopping context. + Fixed illegal state with chunks and 100 continue - Tony Seebregts + Fixed PKCS12Import input string method + Fixed merge of Dispatcher parameters + Encoded full path in ResourceHandler directory listing + handle extra params after charset in header + Fixed 100-continues with chunking and early commit Jetty-5.1.5rc0 - 16 August 2005 + Fixed component remove memory leak for stop/start cycles + Facade over commons LogFactory so that discovery may be avoided. + Applied ciphersuite patch from tonyj + Authenticators use servlet sendError + CGI sets SCRIPT_FILENAME + HttpTunnel timeout + NPE protection for double stop in ThreadedServer + Expect continues only sent if input is read. Jetty-5.1.4 - 5 June 2005 + Fixed FTP close issue. + setup MX4J with JDK1.5 in start.config + set classloader during webapp doStop + NPE protection in ThreadedServer + ModelMBean handles null signatures + Change JAAS impl to be more flexible on finding roles Jetty-5.1.4rc0 - 19 April 2005 + ServletHttpContext correctly calls super.doStop. + HttpServer delegates component handling to Container. + Allow ServletHandler in normal HttpContext again. + Stop start.jar putting current directory on classpath. + More protection from null classloaders. + Turn off web.xml validation for JBoss. Jetty-5.1.3 - 7 April 2005 + Some minor code janitorial services Jetty-4.2.24 - 7 April 2005 Jetty-5.1.3rc4 - 31 March 2005 + Moved servlet request wrapping to enterContextScope for geronimo security + refixed / mapping for filters + Allow XmlConfiguration to start with no object. + updated to mx4j 3.0.1 + rework InitialContextFactory to use static 'default' namespace + make java:comp/env immutable for webapps as per J2EE spec Jetty-5.1.3rc3 - 20 March 2005 + removed accidental enablement of DEBUG for JettyPlus jndi in log4j.properties + fixed "No getter or setter found" mbean errors Jetty-5.1.3rc2 - 16 March 2005 + Updated JSR154Filter for ERROR dispatch + Fixed context to _context refactory error Jetty-5.1.3rc1 - 13 March 2005 + Fixed typo in context-param handling. + update to demo site look and feel. + Fixed principal naming in FormAuthenticator + JettyPlus updated to JOTM 2.0.5, XAPool 1.4.2 Jetty-4.2.24rc1 + Fixed principal naming in FormAuthenticator Jetty-5.1.3rc0 - 8 March 2005 + Flush filter chain caches on servlet/filter change + Fixed rollover filename format bug + Fixed JSR154 error dispatch with explicit pass of type. + Allow system and server classes to be configured for context loader. + IOException if EOF read during chunk. + Fixed HTAccess crypt salt handling. + Added simple xpath support to XmlParser + Added TagLibConfiguration to search for listeners in TLDs. + Added SslListener for 1.4 JSSE API. + Fixed moderate load preventing ThreadPool shrinking. + Added logCookie and logLatency support to NCSARequestLog + Added new JAAS callback to allow extra login form fields in authentication Jetty-4.2.24rc0 - 8 March 2005 + Back ported Jetty 5 ThreadedServer and ThreadPool + Added logCookie and logLatency support to NCSARequestLog Jetty-5.1.2 - 18 January 2005 + Added id and ref support to XmlConfiguration + Cleaned up AbstractSessionManager synchronization. + Fixed potential concurrent login problem with JAAS + Apply patch #1103953 Jetty-4.2.23 - 16 January 2005 + Cleaned up AbstractSessionManager synchronization. + Fixed potential concurrent login problem with JAAS Jetty-5.1.2pre0 - 22 December 2004 + Fixed case of Cookie parameters + Support Secure and HttpOnly in session cookies + Modified useRequestedID handling to only use IDs from other contexts + Added global invalidation to AbstractSessionManager + UnavailableException handling from handle + Fixed suffix filters Jetty-4.2.23RC0 - 17 December 2004 + LineInput handles readers with small internal buffer + Added LogStream to capture stderr and stdout to logging + Support Secure and HttpOnly in session cookies + Build unsealed jars Jetty-5.1.1 - 1 December 2004 Jetty-5.1.1RC1 + Some minor findbugs code cleanups + Made more WebApplicationHandle configuration methods public. + Fixed ordering of filters with multiple interleaved mappings. + Allow double // within URIs + Applied patch for MD5 hashed credentials for MD5 Jetty-5.1.1RC0 - 17 November 2004 + fix for adding recognized EventListeners + fix commons logging imports to IbmJsseListener + added new contributed shell start/stop script + excluded ErrorPageHandler from standard build in extra/jdk1.2 build Jetty-5.1.0 - 14 November 2004 Jetty-5.1.RC1 - 24 October 2004 + Allow JSSE listener to be just confidential or just integral. + Fixed NPE for null contenttype + improved clean targets + when committed setHeader is a noop rather than IllegalStateException + Partially flush writers on every write so content length can be detected. + Build unsealed jars + default / mapping does not apply to Filters + many minor cleanups suggested from figbug utility + Allow multiple accepting threads Jetty-5.1.RC0 - 11 October 2004 + Fixed many minor issues from J2EE 1.4 TCK testing See sf.net bugs 1031520 - 1032205 + Refactored, simplified and optimized HttpOutputStream + LineInput handles readers with small internal buffer + Added LogStream to capture stderr and stdout to logging + Added filter chain cache + Added JSR77 servlet statistic support + Refactored webapp context configurations + Added LifeCycle events and generic container. + Upgraded to ant-1.6 for jasper + Fixed HTAccessHandler + JBoss 4.0.0 support Jetty-5.0.0 - 10 September 2004 Jetty-5.0.RC4 - 5 September 2004 + Fixed configuration of URL alias checking + JettyJBoss: Use realm-name from web.xml if present, otherwise use security-domain from jboss-web.xml Jetty-5.0.RC3 - 28 August 2004 + DIGEST auth handles qop, stale and maxNonceAge. + Less verbose warning for non validating xml parser. + fixed jaas logout for jetty-jboss + fixed deployment of ejb-link elements in web.xml with jboss + Update to jasper 5.0.27 + Added parameters for acceptQueueSize and lowResources level. + Changed default URI encoding to UTF-8 + Fixes to work with java 1.5 + JettyPlus upgrade to XAPool 1.3.3. and HSQLDB 1.7.2 + JettyPlus addition of pluggable DataSources + Always say close for HTTP/1.0 non keep alive. Jetty-4.2.22 - 23 August + fixed jaas logout for jetty-jboss integration + fixed deployment of ejb-link elements in web.xml for jboss + Added parameters for acceptQueueSize and lowResources level. Jetty-5.0.RC2 - 2 July 2004 + Fixed DIGEST challenge delimiters + HTAccess calls UnixCrypt correctly + integrated jetty-jboss with jboss-3.2.4 + Error dispatchers are always GET requests. + OPTIONS works for all URLs on default servlet + add JMX support for JettyPlus + add listing of java:comp/env for webapp with JMX + make choice of override of JNDI ENC entries: config.xml or web.xml + Default servlet may use only pathInfo for resource + Fixed session leak in j2ee + Fixed no-role security constraint combination. + Fix to use runas roles during servlet init and destroy + Fixed JAAS logout + HttpContext sendError for authentication errors Jetty-4.2.21 - 2 July 2004 + integrated jetty-jboss with jboss-3.2.4 + add JMX support for JettyPlus + add listing of java:comp/env for webapp with JMX + make choice of override of JNDI ENC entries: config.xml or web.xml + Fixed JAAS logout Jetty-5.0.RC1 - 24 May 2004 + Changed to apache 2.0 license + added extra/etc/start-plus.config to set up main.class for jettyplus + maxFormContentLength may be unlimited with <0 value + Fixed HTTP tunnel timeout setting. + Improved handling of exception from servlet init. + FORM auth redirects to context on a re-auth + Handle multiple virutal hosts from JBoss 3.2.4RC2 Jetty-4.2.20 - 22 May 2004 + maxFormContentLength may be unlimited with <0 value + Fixed HTTP tunnel timeout setting. + Improved handling of exception from servlet init. + FORM auth redirects to context on a re-auth Jetty-5.0.0RC0 - 7 April 2004 + Updated JettyPlus to JOTM 1.4.3 (carol-1.5.2, xapool-1.3.1) + ServletContext attributes wrap HttpContext attributes. + Factored out XML based config from WebApplicationContext + Improved RequestLog performance + Fixed j2se 1.3 problem with HttpFields + Default servlet respectes servlet path + Fixed setCharacterEncoding for parameters. + Fixed DOS problem + Worked around bad jboss URL handler in XMLParser + Forced close of connections over stop/start + ProxiedFor field support added to NCSARequestLog + Fixed Default servlet for non empty servlet paths + Updated mx4j to V2 + Updated jasper to 5.0.19 + Changed dist naming convention to lowercase Jetty-4.2.20RC0 - 7 April 2004 + Worked around bad jboss URL handler in XMLParser + Forced close of connections over stop/start + HttpFields protected headers + ProxiedFor field support added to NCSARequestLog + Fixed Default servlet for non empty servlet paths + Changed dist naming convention to lowercase Jetty-4.2.19 - 19 Mar 2004 + Fixed DOS attack problem Jetty-5.0.beta2 - 12 Feb 2004 + Added skeleton JMX MBean for jetty plus + Fixed HEAD with empty chunk bug. + Fixed jetty.home/work handling + Fixed setDate thread safety + Fixed SessionManager init + Improved low thread handling + FileResource better handles non sun JVM + Monitor closes socket before exit + Updated to Japser 5.0.16 + RequestDispatcher uses request encoding for query params + Fixed busy loop in threadpool run + Reorganized ServletHolder init + Added log4j context repository to jettyplus + NPE guard for no-listener junit deployment + Added experimental NIO listeners again. + fixed filter dispatch configuration. + fixed lazy authentication with FORMs Jetty-4.2.18 - 1 Mar 2004 + Added log4j context repository to jettyplus + NPE guard for no-listener junit deployment + Improved log performance + Fixed j2se 1.3 problem with HttpFields + Suppress some more IOExceptions + Default servlet respectes servlet path Jetty-4.2.17 - 1 Feb 2004 + Fixed busy loop in threadpool run + Reorganized ServletHolder init Jetty-4.2.16 - 30 Jan 2004 + Fixed setDate multi-cpu race + Improved low thread handling + FileResource better handles non sun JVM + Fixed HttpTunnel for JDK 1.2 + Monitor closes socket before exit + RequestDispatcher uses request encoding for query params + Update jasper to 4.1.29 Jetty-5.0.beta1 - 24 December 2003 + SecurityConstraints not reset by stop() on custom context + Fixed UnixCrypt handling in HTAccessHandler + Added patch for JBoss realm single sign on + Reorganized FAQ + Env variables for CGI + Removed support for old JBoss clustering Jetty-4.2.15 - 24 December 2003 + SecurityConstraints not reset by stop() on custom context + Fixed UnixCrypt handling in HTAccessHandler + Added patch for JBoss realm single sign on + Environment variables for CGI + Removed support for old JBoss clustering Jetty-5.0.beta0 - 22 November 2003 + Removed support for HTTP trailers + PathMap uses own Map.Entry impl for IBM JVMs + Use ${jetty.home}/work or WEB-INF/work for temp directories if present + Protect ThreadPool.run() from interrupted exceptions + Added org.mortbay.http.ErrorHandler for error pages. + Fixed init race in HttpFields cache + Allow per listener handlers + Added MsieSslHandler to handle browsers that don't grok persistent SSL (msie 5) + Respect content length when decoding form content. + JBoss integration uses writer rather than stream for XML config handling + Expire pages that contain set-cookie as per RFC2109 recommendation + Updated jasper to 5.0.14beta + Removed the CMR/CMP distributed session implementation Jetty-4.2.15rc0 - 22 November 2003 + PathMap uses own Map.Entry impl for IBM JVMs + Race in HttpFields cache + Use ${jetty.home}/work or WEB-INF/work for temp directories if present + Protect ThreadPool.run() from interrupted exceptions + Added org.mortbay.http.ErrorHandler for error pages. + JsseListener checks UserAgent for browsers that can't grok persistent SSL (msie5) + Removed the CMR/CMP distributed session implementation Jetty-4.2.14 - 04 November 2003 + respect content length when decoding form content. + JBoss integration uses writer rather than stream for XML config handling + Fixed NPE in SSO + Expire pages that contain set-cookie as per RFC2109 recommendation Jetty-5.0.alpha3 - 19 October 2003 + Reworked Dispatcher to better support cross context sessions. + Use File.toURI().toURL() when jdk 1.2 alternative is available. + Priority added to ThreadPool + replaced win32 service with http://wrapper.tanukisoftware.org + FileClassPath derived from walk of classloader hierarchy. + Implemented security constraint combinations + Set TransactionManager on JettyPlus datasources and pools + Fixed null pointer if no sevices configured for JettyPlus + Updated jasper and examples to 5.0.12 + Lazy authentication if no auth constraint. + Restore servlet handler after dispatch + Allow customization of HttpConnections + Failed requests excluded from duration stats Jetty-4.2.14RC1 - 19 October 2003 + Reworked Dispatcher to better support cross context sessions. + Added UserRealm.logout and arrange for form auth + Allow customization of HttpConnections + Failed requests excluded from Jetty-4.2.14RC0 - 7 October 2003 + Correctly setup context classloader in cross context dispatch. + Put a semi busy loop into proxy tunnels for IE problems + Fixed handling of error pages for IO and Servlet exceptions + updated extra/j2ee to jboss 3.2.1+ + Use File.toURI().toURL() when jdk 1.2 alternative is available. + cookie timestamps are in GMT + Priority on ThreadedServer + replaced win32 service with http://wrapper.tanukisoftware.org + Build fileclasspath from a walk of the classloaders + Set TransactionManager on JettyPlus datasources and pools + Fixed null pointer if no sevices configured for JettyPlus + Fixed comments with embedded double dashes on jettyplus.xml file Jetty-5.0.alpha2 - 19 September 2003 + Use commons logging. + Use log4j if extra is present. + Improved JMX start. + Update jakarta examples + Correctly setup context classloader in cross context dispatch. + Turn off validation without non-xerces errors + minor doco updates. + moved mailing lists to sourceforge. + Put a semi busy loop into proxy tunnels for IE problems + MultipartRequest supports multi value headers. + XML entity resolution uses URLs not Resources + Implemented ServletRequestListeners as optional filter. + Moved error page mechanism to be webapp only. + Fixed error page handling of IO and Servlet exceptions. Jetty-5.0.alpha1 - 12 August 2003 + Switched to mx4j + Improve combinations of Security Constraints + Implemented locale encoding mapping. + Synced with 4.2.12 + Updated to Jasper 5.0.7 + Server javadoc from war Jetty-5.0.alpha0 - 16 Jul 2003 + Compiled against 2.4 servlet spec. + Implemented remote/local addr/port methods + Updated authentication so that a normal Principal is used. + updated to jasper 5.0.3 + Implemented setCharaterEncoding + Implemented filter-mapping element + Implemented Dispatcher forward attributes. Jetty-4.2.12 - 12 August 2003 + Restore max inactive interval for session manager + Removed protection of org.mortbay.http attributes + Fixed parameter ordering for a forward request. + Fixed up HTAccessHandler + Improved error messages from ProxyHandler + Added missing S to some OPTIONS strings + Added open method to threaded server. + FORMAuthenticator does 403 with empty error page. + Fixed MIME types for chemicals + Padding for IE in RootNotFoundHandler Jetty-4.2.11 - 12 July 2003 + Fixed race in servlet initialization code. + Cookie params all in lower case. + Simplified AJP13 connection handling. + Prevent AJP13 from reordering query. + Support separate Monitor class for start + Branched for Jetty 5 development. Jetty-4.2.10 - 7 July 2003 + Updates to JettyPlus documentation + Updates to Jetty tutorial for start.jar, jmx etc Jetty-4.2.10pre2 - 4 July 2003 + Improvement to JettyPlus config of datasources and connection pools + Addition of mail service for JettyPlus + Move to Service-based architecture for JettyPlus features + Re-implementation of JNDI + Many improvements in JettyPlus java:comp handling + Allow multiple security-role-ref elements per servlet. + Handle Proxy-Connection better + Cleaned up alias handling. + Confidential redirection includes query + handle multiple security role references + Fixed cookie handling for old cookies and safari + Restricted ports in ProxyHandler. + URI always encodes % + Session statistics + XmlConfiguration can get/set fields. Jetty-4.2.10pre1 - 2 June 2003 + Fixed JSP code visibility problem introduced in Jetty-4.2.10pre0 + Added stop.jar + Added SSO implementation for FORM authentication. + WebApplicationContext does not reassign defaults descriptor value. + Fixed AJP13 protocol so that request/response header enums are correct. + Fixed form auth success redirect after retry, introduced in 4.2.9rc1 + Trace support is now optional (in AbstractHttpHandler). + Deprecated forced chunking. + Form authentication remembers URL over 403 + ProxyHandler has improved test for request content + Removed support of org.mortbay.http.User role. + Fixed problem with shared session for inter context dispatching. Jetty-4.2.10pre0 - 5 May 2003 + Moved Log4JLogSink into JettyPlus + Added ability to override jetty startup class by using -Djetty.server on runline + Incorporate JettyPlus jotm etc into build. + Massive reorg of the CVS tree. + Incorporate jetty extra and plus into build + Integrate with JAAS + Apply the append flag of RolloverFileOutputStream constructor. + RolloverFileOutputStream manages Rollover thread. + New look and feel for www site. + Fixed table refs in JDBCUserRealm. + Allow params in form auth URLs + Updated to jasper jars from tomcat 4.1.24 + Allow query params in error page URL. + ProxyHandler checks black and white lists for Connect. + Merge multivalued parameters in dispatcher. + Fixed CRLF bug in MultiPartRequest + Warn if max form content size is reached. + getAuthType returns CLIENT_CERT instead of CLIENT-CERT. + getAuthType maps the HttpServletRequest final strings. + FORM Authentication is serializable for session distribution. Jetty-4.2.9 - 19 March 2003 + Conditional headers check after /dir to /dir/ redirection. Jetty-4.2.9rc2 - 16 March 2003 + Fixed build.xml for source release + Made rfc2068 PUT/POST Continues support optional. + Defaults descriptor has context classloader set. + Allow dispatch to j_security_check + Added X-Forwarded-For header in ProxyHandler + Updated included jmx jars Jetty-4.2.9rc1 - 6 March 2003 + Work around URLClassloader not handling leading / + Dump servlet can load resources for testing now. + Added trust manager support to SunJsseListener. + Added support for client certs to AJP13. + Cleaned up includes + Removed checking for single valued headers. + Optional 2.4 behaviour for sessionDestroyed notification. + Stop proxy url from doing user interaction. + Turn request log buffering off by default. + Reduced default context cache sizes (Total 1MB file 100KB). + ProxyHandler has black and white host list. + Added requestlog to HttpContext. + Allow delegated creation of WebApplication derivations. + Check Data contraints before Auth constraints Jetty-4.2.8_01 - 18 February 2003 + Patched first release of 4.2.8 with correct version number + Fixed CGI servlet to handle multiple headers. + Added a SetResponseHeadersHandler, can set P3P headers etc. + ProxyHandler can handle multiple cookies. + Fixed AdminServlet to handle changed getServletPath better. + Default servlet can have own resourceBase. + Rolled back SocketChannelListener to 4.2.5 version + Added option to resolve remote hostnames. Defaults to off. + Added MBeans for Servlets and Filters + Moved ProxyHandler to the src1.4 tree Jetty-4.2.7 - 4 February 2003 + Upgraded to JSSE 1.0.3_01 to fix security problem. + Fixed proxy tunnel for non persistent connections. + Relative sendRedirect handles trailing / correctly. + Changed PathMap to conform to / getServletPath handling. Jetty-4.2.6 - 24 January 2003 + Improved synchronization on AbstractSessionManager. + Allow AJP13 buffers to be resized. + Fixed LineInput problem with expanded buffers. + ClientCertAuthentication updates request. + Fixed rel sendRedirects for root context. + Added HttpContext.setHosts to restrict context by real interface. + Added MBeans for session managers + Improved SocketChannelListener contributed. + Added version to HttpServerMBean. Jetty-4.2.5 - 14 January 2003 + Fixed pathParam bug for ;jsessionid + Don't process conditional headers and ranges for includes + Added Log4jSink in the contrib directory. + Fixed requestedSessionId null bug. Jetty-4.2.4 - 4 January 2003 + Fixed stop/start handling of servlet context + Reuse empty LogSink slots. + HTAccessHandler checks realm as well as htpassword. + Clear context listeners after stop. + Clear context attributes after stop. + Use requestedSessionId as default session ID. + Added MBeans for handlers + Upgraded jasper to 4.1.18 Jetty-4.2.4rc0 - 12 December 2002 + Simplified ThreadedServer + Use ThreadLocals for ByteArrayPool to avoid synchronization. + Use Version to reset HttpFields + Cheap clear for HttpFields + Fixed setBufferSize NPE. + Cleaned up some unused listener throws. + Handle chunked form data. + Allow empty host header. + Avoid optional 100 continues. + Limit form content size. + Handle = in param values. + Added HttpContext.flushCache + Configurable root context. + RootNotFoundHandler to help when no context found. + Update jasper to 4.1.16beta + Fixed dir listing from jars. + Dir listings in UTF8 + Character encoding handling for GET requests. + Removed container transfer encoding handling. + Improved setBufferSize handling + Code logs objects rather than strings. + Better access to session manager. + Fixed isSecure and getScheme for SSL over AJP13 + Improved ProxyHandler to the point is works well for non SSL. + Implemented RFC2817 CONNECT in ProxyHandler + Added gzip content encoding support to Default and ResourceHandler Jetty-4.2.3 - 2 December 2002 + Removed aggressive threadpool shrinkage to avoid deadlock on SMP machines. + Fixed some typos + Added links to Jetty Powered page + Clean up of ThreadedServer.stop() + Updated bat scripts + Added PKCS12Import class to import PKCS12 key directly + removed old HttpContext.setDirAllowed() + added main() to org.mortbay.http.Version + Check form authentication config for leading / + Cleaner servlet stop to avoid extra synchronization on handle + org.mortbay.http.HttpContext.FileClassPathAttribute Jetty-4.2.2 - 20 November 2002 + Fixed sendRedirect for non http URLS + Fixed URI query recycling for persistent connections + Fixed handling of empty headers + Added EOFException to reduce log verbosity on closed connections. + Avoided bad buffer status after closed connection. Jetty-4.2.1 - 18 November 2002 + Fixed bad optimization in UrlEncoding + Re-enabled UrlEncoding test harnesses Jetty-4.2.0 - 16 November 2002 + Fixed AJP13 buffer size. + Fixed remove listener bug. + Fixed include of Invoker servlet. + Restrict 304 responses to seconds time resolution. + Use IE date formatting for speed. + Removed jasper source and just include jars from 4.1.12 + Worked around JVM1.3 bug for JSPs + Lowercase jsessionid for URLs only. + Made NCSARequestLog easier to extend. + Added definitions for RFC2518 WebDav response codes. + Removed remaining non portable getBytes() calls + Added upload demo to dump servlet. + Many more optimizations. Jetty-4.1.4 - 16 November + Fixed ContextLoader parent delegation bug + Fixed remove SocketListener bug. + Fixed Invoker servlet for RD.include + Use IE date formatting for last-modified efficiency + Last modified handling uses second resolution. + Made NCSARequestLog simpler to extend. Jetty-4.2.0rc1 - 2 November 2002 + Support default mime mapping defined by * + Recycling of HttpFields class. + Renamed Filter application methods. + Fixed firstWrite after commit. + Fixed ContextLoader parent delegation bug. + Fixed problem setting the size of chunked buffers. + Removed unused Servlet and Servlet-Engine headers. + Fixed servletpath on invoker for named servlets. + Fixed directory resource bug in JarFileResource. + Improved handling of 2 byte encoded characters within forms. Jetty-4.2.0rc0 - 24 October 2002 + Greg's birthday release! + Added embedded iso8859 writer to HttpOutputStream. + Removed duplicate classes from jar + Fixed RolloverFileOutputStream without date. + Fixed SessionManager initialization + Added authenticator to admin.xml + Fixed Session timeout NPE. Jetty-4.1.3 - 24 October 2002 + Fixed RolloverFileOutputStream without date. + Fixed SessionManager initialization + Added authenticator to admin.xml + Fixed Session timeout NPE. Jetty-4.0.6 - 24 October 2002 + Clear interrupted status in ThreadPool + Fixed forward query string handling + fixed forward attribute handling for jsp-file servlets + Fixed setCharacterEncoding to work with getReader + Fixed handling of relative sendRedirect after forward. + Fixed virtual hosts temp directories. Jetty-4.2.0beta0 - 13 October 2002 + New ThreadPool implementation. + New Buffering implementation. + New AJP13 implementation. + Removed Dispatcher dependancy on ServletHttpContext + getNamedDispatcher(null) returns containers default servlet. + unquote charset in content type + Stop/Start filters in declaration order. + Use "standard" names for default,jsp & invoker servlets. + Fixed caching of directories to avoid shared buffers. + Fixed bad log dir detection + Fix Session invalidation bug + Build without jmx + 404 instead of 403 for WEB-INF requests + FORM authentication sets 403 error page + Allow %3B encoded ; in URLs + Allow anonymous realm + Update jasper to 4.1.12 tag Jetty-4.1.2 - 13 October 2002 + Some AJP13 optimizations. + getNamedDispatcher(null) returns containers default servlet. + unquote charset in content type + Stop/Start filters in declaration order. + Use "standard" names for default,jsp & invoker servlets. + Fixed caching of directories to avoid shared buffers. + Fixed bad log dir detection + Fix Session invalidation bug + Build without jmx + 404 instead of 403 for WEB-INF requests + FORM authentication sets 403 error page + Allow %3B encoded ; in URLs + Allow anonymous realm + Update jasper to 4.1.12 tag Jetty-4.1.1 - 30 September 2002 + Fixed client scripting vulnerability with jasper2. + Merged LimitedNCSARequestLog into NCSARequestLog + Fixed space in resource name handling for jdk1.4 + Moved launcher/src to src/org/mortbay/start + Fixed infinite recursion in JDBCUserRealm + Avoid setting sotimeout for optimization. + String comparison of If-Modified-Since headers. + Touch files when expanding jars + Deprecated maxReadTime. + Cache directory listings. Jetty-4.1.0 - 22 September 2002 + Fixed CGI+windows security hole. + Fixed AJP13 handling of mod_jk loadbalancing. + Stop servlets in opposite order to start. + NCSARequest log buffered default + WEB-INF/classes before WEB-INF/lib + Sorted directory listings. + Handle unremovable tempdir. + Context Initparams to control session cookie domain, path and age. + ClientCertAuthenticator protected from null subjectDN + Added LimitedNCSARequestLog + Use javac -target 1.2 for normal classes Jetty-4.1.0RC6 - 14 September 2002 + Don't URL encode FileURLS. + Improved HashUserRealm doco + FormAuthenticator uses normal redirections now. + Encode URLs of Authentication redirections. + Added logon.jsp for no cookie form authentication. + Extended Session API to pass request for jvmRoute handling + Fixed problem with AJP 304 responses. + Improved look and feel of demo + Cleaned up old debug. + Added redirect to welcome file option. Jetty-4.1.0RC5 - 8 September 2002 + AJP13Listener caught up with HttpConnection changes. + Added commandPrefix init param to CGI + More cleanup in ThreadPool for idle death. + Improved errors for misconfigured realms. + Implemented security-role-ref for isUserInRole. Jetty-4.1.0RC4 - 30 August 2002 + Included IbmJsseListener in the contrib directory. + Updated jasper2 to 4.1.10 tag. + Reverted to 302 for all redirections as all clients do not understand 303 + Created statsLock sync objects to avoid deadlock when stopping. Jetty-4.1.0RC3 - 28 August 2002 + Fixed security problem for suffix matching with trailing "/" + addWebApplications encodes paths to allow for spaces in file names. + Improved handling of PUT,DELETE & MOVE. + Improved handling of path encoding in Resources for bad JVMs + Added buffering to request log + Created and integrated the Jetty Launcher + Made Resource canonicalize it's base path for directories + Allow WebApplicationHandler to be used with other handlers. + Added defaults descriptor to addWebApplications. + Allow FORM auth pages to be within security constraint. Jetty-4.1.0RC2 - 20 August 2002 + Conveninace setClassLoaderJava2Compliant method. + Clear interrupted status in ThreadPool + Fixed HttpFields cache overflow + Improved ByteArrayPool to handle multiple sizes. + Added HttpListener.bufferReserve + Use system line separator for log files. + Updated to Jasper2 (4_1_9 tag) + Build ant, src and zip versions with the release Jetty-4.1.0RC1 - 11 August 2002 + Fixed forward query string handling + Fixed setCharacterEncoding to work with getReader + Fixed getContext to use canonical contextPathSpec + Improved the return codes for PUT + Made HttpServer serializable + Updated international URI doco + Updated jasper to CVS snapshot 200208011920 + Fixed forward to jsp-file servlet + Fixed handling of relative sendRedirect after forward. Jetty-4.1.0RC0 - 31 July 2002 + Fixed getRealPath for packed war files. + Changed URI default charset back to ISO_8859_1 + Restructured Password into Password and Credentials + Added DigestAuthenticator + Added link to a Jetty page in Korean. + Added ExpiryHandler which can set a default Expires header. Jetty-4.0.5 - 31 July 2002 + Fixed getRealPath for packed war files. + Reversed order of ServletContextListener.contextDestroyed calls + Fixed getRequestURI for RD.forward to return new URI. Jetty-4.1.B1 - 19 July 2002 + Updated mini.http.jar target + CGI Servlet, pass all HTTP headers through. + CGI Servlet, catch and report program invocation failure status. + CGI Servlet, fixed suffix mapping problem. + CGI Servlet, set working directory for exec + Support HTTP/0.9 requests again + Reversed order of ServletContextListener.contextDestroyed calls + Moved dynamic servlet handling to Invoker servlet. + Moved webapp resource handling to Default servlet. + Sessions create attribute map lazily. + Added PUT,DELETE,MOVE support to webapps. + Added 2.4 Filter dispatching support. Jetty-3.1.9 - 15 July 2002 + Allow doHead requests to be forwarded. + Fixed race in ThreadPool for minThreads <= CPUs Jetty-4.1.B0 - 13 July 2002 + Added work around of JDK1.4 bug with NIO listener + Moved 3rd party jars to $JETTY_HOME/ext + Fixed ThreadPool bug when minThreads <= CPUs + close rather than disable stream after forward + Allow filter init to access servlet context methods. + Keep notFoundContext out of context mapping lists. + mod_jk FAQ + Fixed close problem with load balancer. + Stopped RD.includes closing response. + RD.forward changes getRequestURI. + NCSARequestLog can log to stderr Jetty-4.1.D2 - 24 June 2002 + Support trusted external authenticators. + Moved jmx classes from JettyExtra to here. + Set contextloader during webapplicationcontext.start + Added AJP13 listener for apache integration. + Fixed ChunkableOutputStream close propagation + Better recycling of HttpRequests. + Protect session.getAttributeNames from concurrent modifications. + Allow comma separated cookies and headers + Back out Don't chunk 30x empty responses. + Conditional header tested against welcome file not directory. + Improved ThreadedServer stopping on bad networks + Use ThreadLocals to avoid unwrapping in Dispatcher. Jetty-4.0.4 - 23 June 2002 + Back out change: Don't chunk 30x empty responses. + Conditional header tested against welcome file not directory. + Improved ThreadedServer stopping on bad networks Jetty-4.0.3 - 20 June 2002 + WebapplicationContext.start sets context loader + Fixed close propagation of on-chunked output streams + Force security disassociation. + Better recycling of HttpRequests. + Protect session.getAttributeNames from concurrent modifications. + Allow session manager to be initialized when set. + Fixed japanese locale + Allow comma separated cookies and headers Jetty-4.1.D1 - 8 June 2002 + Recycle servlet requests and responses + Added simple buffer pool. + Reworked output buffering to keep constant sized buffers. + Don't chunk 30x empty responses. + Fixed "" contextPaths in Dispatcher. + Removed race for the starting of session scavaging + Fixed /foo/../bar// bug in canonical path. + Merged ResourceBase and SecurityBase into HttpContext Jetty-4.0.2 - 6 June 2002 + Fixed web.dtd references. + Fixed handler/context start order. + Added OptimizeIt plug + Fixed /foo/../bar// bug in canonical path. + Don't chunk 30x empty responses. + Fixed "" contextPaths in Dispatcher. + Removed race for the starting of session scavaging Jetty-3.1.8 - 6 June 2002 + Made SecurityConstraint.addRole() require authentication. + Fixed singled threaded dynamic servlets + Fixed no slash context redirection. + Fixed /foo/../bar// bug in canonical path. Jetty-4.1.D0 - 5 June 2002 + The 4.1 Series started looking for even more performance within the 2.3 specification. + Removed the HttpMessage facade mechanism + BRAND NEW WebApplicationHandler & WebApplicationContext + Added TypeUtil to reduce Integer creation. + General clean up of the API for for MBean getters/setters. + Experimental CLIENT-CERT Authenticator + Restructured ResourceHandler into ResourceBase + Fixed web.dtd references. + Fixed handler/context start order. + Added OptimizeIt plug. Jetty-4.0.1 - 22 May 2002 + Fixed contextclassloader on ServletContextEvents. + Support graceful stopping of context and server. + Fixed "null" return from getRealPath + OutputStreamLogSink config improvements + Updated jasper to 16 May snapshot Jetty-4.0.1RC2 - 14 May 2002 + Better error for jre1.3 with 1.4 classes + Cleaned up RD query string regeneration. + 3DES Keylength was being reported as 0. Now reports 168 bits. + Implemented the run-as servlet tag. + Added confidential and integral redirections to HttpListener + Fixed ServletResponse.reset() to resetBuffer. Jetty-4.0.1RC1 - 29 April 2002 + Improved flushing of chunked responses + Better handling if no realm configured. + Expand ByteBuffer full limit with capacity. + Fixed double filtering of welcome files. + Fixed FORM authentication auth of login page bug. + Fixed setTempDirectory creation bug + Avoid flushes during RequestDispatcher.includes Jetty-4.0.1RC0 - 18 April 2002 + Updated Jasper to CVS snapshot from Apr 18 18:50:59 BST 2002 + Pass pathParams via welcome file forward for jsessionid + Extended facade interfaces to HttpResponse.sendError + Moved basic auth handling to HttpRequest + AbstractSessionManager sets contextClassLoader for scavanging + Set thread context classloader for webapp load-on-startup inits + Added extract arg to addWebApplications + Fixed delayed response bug: Stopped HttpConnection consuming input from timedout connection. + DTD allows static "Get" and "Set" methods to be invoked. Jetty-4.0.0 - 22 March 2002 + Updated tutorial configure version + Added IPAddressHandler for IP restrictions + Updated contributors. + Minor documentation updates. + Jetty.sh cygwin support Jetty-4.0.RC3 - 20 March 2002 + Fixed ZZZ offset format to +/-HHMM + Updated history + JDBCUserRealm instantiates JDBC driver + ContextInitialized notified before load-on-startup servlets. + Suppress WriterOutputStream warning. + Changed html attribute order for mozilla quirk. Jetty-4.0.RC2 - 12 March 2002 + Fixed security constraint problem with // + Fixed version for String XmlConfigurations + Fixed empty referrer in NCSA log. + Dont try to extract directories + Added experimental nio SocketChannelListener + Added skeleton load balancer + Fixed column name in JDBCUserRealm + Remove last of the Class.forName calls. + Removed redundant sessionID check. + Security FAQ + Disabled the Password EXEC mechanism by default Jetty-3.1.7 - 12 Mar 2002 + Fixed security problem with constraints being bypassed with // in URLs Jetty-4.0.RC1 - 06 March 2002 + Added ContentEncodingHandler for compression. + Fixed filter vs forward bug. + Improved efficiency of quality list handling + Simplified filter API to chunkable streams + XmlParser is validating by default. use o.m.x.XmlParser.NotValidating property to change. + contextDestroyed event sent before destruction. + Minor changes to make HttpServer work on J2ME CVM + Warn if jdk 1.4 classes used on JVM <1.4 + WebApplication will use ContextLoader even without WEB-INF directory. + FileResource depends less on FilePermissions. + Call response.flushBuffer after service to flush wrappers. + Empty suffix for temp directory. + Contributors list as an image to prevent SPAM! + Fixed recursive DEBUG loop in Logging. + Updated jetty.sh to always respect arguments. Jetty-3.1.6 - 28 Feb 2002 + Implemented 2.3 clarifications to security constraint semantics PLEASE REVIEW YOUR SECURITY CONSTRAINTS (see README). + Empty suffix for temp directory. + Fixed HttpFields remove bug + Set Listeners default scheme + LineInput can handle any sized marks + HttpResponse.sendError makes a better attempt at finding an error page. + Dispatcher.forward dispatches directly to ServletHolder to avoid premature exception handling. Jetty-4.0.B2 - 25 Feb 2002 + Minor Jasper updates + Improve handling of unknown URL protocols. + Improved default jetty.xml + Adjust servlet facades for welcome redirection + User / mapping rather than /* for servlet requests to static content + Accept jetty-web.xml or web-jetty.xml in WEB-INF + Added optional JDK 1.4 src tree + o.m.u.Frame uses JDK1.4 stack frame handling + Added LoggerLogSink to direct Jetty Logs to JDK1.4 Log. + Start ServletHandler as part of the FilterHandler start. + Simplified addWebApplication + Added String constructor to XmlConfiguration. + Added org.mortbay.http.JDBCUserRealm + Init classloader for JspServlet + Slightly more agressive eating unused input from non persistent connection. Jetty-4.0.B1 - 13 Feb 2002 + WriterOutputStream so JSPs can include static resources. + Suppress error only for IOExceptions not derivitives. + HttpConnection always eats unused bodies + Merged HttpMessage and Message + LineInput waits for LF after CF if seen CRLF before. + Added setClassLoader and moved getFileClassPath to HttpContext + Updated examples webapp from tomcat + getRequestURI returns encoded path + Servlet request destined for static content returns paths as default servlet Jetty-4.0.B0 - 4 Feb 2002 + Implemented 2.3 security constraint semantics PLEASE REVIEW YOUR SECURITY CONSTRAINTS (see README). + Stop and remove NotFound context for HttpServer + HttpContext destroy + Release process builds JettyExtra + Welcome files may be relative + Fixed HttpFields remove bug + Added Array element to XMLConfiguration + Allow listener schemes to be set. + Added index links to tutorial + Renamed getHttpServers and added setAnonymous + Updated crimson to 1.1.3 + Added hack for compat tests in watchdog for old tomcat stuff + Added AbstractSessionManager + Support Random Session IDs in HashSessionManager. + Common handling of TRACE + Updated tutorial and FAQ + Reduce object count and add hash width to StringMap + Factor out RolloverFileOutputStream from OutputStreamLogSink + Remove request logSink and replace with RequestLog using RolloverFileOutputStream + Handle special characters in resource file names better. + Welcome file dispatch sets requestURI. + Removed triggers from Code. Jetty-4.0.D4 - 14 Jan 2002 + Prevent output after forward + Handle ServletRequestWrappers for Generic Servlets + Improved handling of UnavailableException + Extract WAR files to standard temp directory + URI uses UTF8 for % encodings. + Added BlueRibbon campaign. + RequestDispatcher uses cached resources for include + Improved HttpResponsse.sendError error page matching. + Fixed noaccess auth demo. + FORM auth caches UserPrincipal + Added isAuthenticated to UserPrincipal Jetty-4.0.D3 - 31 Dec 2001 + Fixed cached filter wrapping. + Fixed getLocale again + Patch jasper to 20011229101000 + Removed limits on mark in LineInput. + Corrected name to HTTP_REFERER in CGI Servlet. + Fixed UrlEncoding for % + combination. + Generalized temp file handling + Fixed ContextLoader lib handling. + DateCache handles misses better. + HttpFields uses DateCache more. + Moved admin port to 8081 to avoid JBuilder + Made Frame members private and fixed test harness + cookies with maxAge==0 expire on 1 jan 1970 + setCookie always has equals Jetty-3.1.5 - 11 Dec 2001 + setCookie always has equals for cookie value + cookies with maxage==0 expired 1 jan 1970 + Fixed formatting of redirectURLs for NS4.08 + Fixed ChunableInputStream.resetStream bug. + Ignore IO errors when trying to persist connections. + Allow POSTs to static resources. + stopJob/killStop in ThreadPool to improve stopping ThreadedServer on some platforms. + Branched at Jetty_3_1 Jetty-4.0.D2 - 2 Dec 2001 + Removed most of the old doco, which needs to be rewritten and added again. + Restructured for demo and test hierarchies + Fixed formatting of redirect URLs. + Removed ForwardHandler. + Removed Demo.java (until updated). + Made the root context a webapplication. + Moved demo docroot/servlets to demo directory + added addWebApplications auto discovery + Disabled last forwarding by setPath() + Removed Request set methods (will be replaced) + New event model to decouple from beans container. + Better handling of charset in form encoding. + Allow POSTs to static resources. + Fixed ChunableInputStream.resetStream bug. + Ignore IO errors when trying to persist connections. + Allow POSTs to static resources. + stopJob/killStop in ThreadPool to improve stopping ThreadedServer on some platforms. Jetty-4.0.D1 - 14 Nov 2001 + Fixed ServletHandler with no servlets + Fixed bug with request dispatcher parameters + New ContextLoader implementation. + New Dispatcher implementation + Added Context and Session Event Handling + Added FilterHolder + Added FilterHandler + Changed HandlerContext to HttpContext + Simplified ServletHandler + Removed destroy methods + Simplified MultiMap Jetty-4.0.D0 - 06 Nov 2001 + Branched from Jetty_3_1 == Jetty_3_1_4 + 2.3 Servlet API + 1.2 JSP API + Jasper from tomcat4 + Start SessionManager abstraction. + Added examples webapp from tomcat4 + Branched at Jetty_3_1 Jetty-3.1.4 - 06 Nov 2001 + Added RequestLogFormat to allow extensible request logs. + Support the ZZZ timezone offset format in DateCache + HTAccessHandler made stricter on misconfiguration + Generate session unbind events on a context.stop() + Default PathMap separator changed to ":," + PathMap now ignores paths after ; or ? characters. + Remove old stuff from contrib that had been moved to extra + getRealPath accepts \ URI separator on platforms using \ file separator. Jetty-3.1.3 - 26 Oct 2001 + Fix security problem with trailing special characters. Trailing %00 enabled JSP source to be viewed or other servlets to be bypassed. + Fixed several problems with external role authentication. Role authentication in JBoss was not working correctly and there were possible object leaks. The fix required an API change to UserPrinciple and UserRealm. + Allow a per context UserRealm instance. + Upgraded JSSE to 1.0.2 + Improved FORM auth handling of role failure. + Improved Jasper debug output. + Improved ThreadedServer timeout defaults + Fixed binary files in CVS + Fixed Virtual hosts to case insensitive. + PathMap spec separator changed from ',' to ':'. May be set with org.mortbay.http.PathMap.separators system property. + Correct dispatch to error pages with javax attributes set. Jetty-3.1.2 - 13 Oct 2001 + Fixed double entry on PathMap.getMatches + Fixed servlet handling of non session url params. + Fixed attr handling in XmlParser.toString + Fixed request log date formatting + Fixed NotFoundHandler handling of unknown methods + Fixed FORM Authentication username. + Fixed authentication role handling in FORM auth. + FORM authentication passes query params. + Added short delay to shutdown hook for JVM bug. + Added ServletHandler.sessionCount() + Added run target to ant + Changed 304 responses for Opera browser. + Changed JSESSIONID to jsessionid + Log OK state after thread low warnings. + Changed unsatisfiable range warnings to debug. + Further improvements in handling of shutdown. Jetty-3.1.1 - 27 Sep 2001 + Fixed jar manifest format - patched 28 Sep 2001 + Removed JDK 1.3 dependancy + Fixed ServletRequest.getLocale(). + Removed incorrect warning for WEB-INF/lib jar files. + Handle requestdispatcher during init. + Use lowercase tags in html package to be XHTML-like. + Correctly ignore auth-constraint descriptions. + Reduced verbosity of bad URL errors from IIS virus attacks Jetty-3.1.0 - 21 Sep 2001 + Added long overdue Tutorial documentation. + Improved some other documentation. + Fix ResourceHandler cache invalidate. + Fix ServletResponse.setLocale() + Fix reuse of Resource + Fix Jetty.bat for spaces. + Fix .. handling in URI + Fix REFFERER in CGI + Fix FORM authentication on exact patterns + Fix flush on stop bug in logs. + Fix param reading on CGI servlet + New simplified jetty.bat + Improved closing of listeners. + Optimized List creation + Removed win32 service.exe + Added HandlerContext.registerHost Jetty-3.1.rc9 - 02 Sep 2001 + Added bin/orgPackage.sh script to change package names. + Changed to org.mortbay domain names. + Form auth login and error pages relative to context path. + Fixed handling of rel form authentication URLs + Added support for Nonblocking listener. + Added lowResourcePersistTimeMs for more graceful degradation when we run out of threads. + Patched Jasper to 3.2.3. + Added handlerContext.setClassPaths + Fixed bug with non cookie sessions. + Format cookies in HttpFields. Jetty-3.1.rc8 - 22 Aug 2001 + Support WEB-INF/web-jetty.xml configuration extension for webapps + Allow per context log files. + Updated sponsors page + Added HttpServer statistics + Don't add notfound context. + Many major and minor optimizations: * ISO8859 conversion * Buffer allocation * URI pathAdd * StringMap * URI canonicalPath * OutputStreamLogSink replaces WriterLogSink + Separation of URL params in HttpHandler API. + Fixed handling of default mime types + Allow contextpaths without leading / + Removed race from dynamic servlet initialization. Jetty-3.1.rc7 - 9 Aug 2001 + Fix bug in sendRedirect for HTTP/1.1 + Added doco for Linux port redirection. + Don't persist connections if low on threads. + Added shutdown hooks to Jetty.Server to trap Ctl-C + Fixed bug with session ID generation. + Added FORM authentication. + Remove old context path specs + Added UML diagrams to Jetty architecture documentation. + Use Enumerations to reduce conversions for servlet API. + Optimized HttpField handling to reduce object creatiyon. + ServletRequest SSL attributes in line with 2.2 and 2.3 specs. + Dump Servlet displays cert chains + Fixed redirect handling by the CGI Servlet. + Fixed request.getPort for redirections from 80 + Added utility methods to ServletHandler for wrapping req/res pairs. + Added method handling to HTAccessHandler. + ServletResponse.sendRedirect puts URLs into absolute format. Jetty-3.1.rc6 - 10 Jul 2001 + Avoid script vulnerability in error pages. + Close persistent HTTP/1.0 connections on missing Content-Length + Use exec for jetty.sh run + Improved SSL debugging information. + KeyPairTool can now load cert chains. + KeyPairTool is more robust to provider setup. + Fixed bug in B64Code. Optimised B64Code. + Added Client authentication to the JsseListener + Fixed a problem with Netscape and the acrobat plugin. + Improved debug output for IOExceptions. + Updated to JSSE-1.0.2, giving full strength crypto. + Win32 Service uses Jetty.Server instead of HttpServer. + Added getResource to HandleContext. + WebApps initialize resourceBase before start. + Fixed XmlParser to handle xerces1.3 OK + Added Get element to the XmlConfiguration class. + Added Static calls to the XmlConfiguration class. + Added debug and logging config example to demo.xml + Moved mime types and encodings to property bundles. + RequestDispatch.forward() uses normal HandlerContext.handle() path if possible. + Cleaned up destroy handling of listeners and contexts. + Removed getConfiguration from LifeCycleThread to avoid JMX clash. + Cleaned up Win32 Service server creation. + Moved gimp image files to Jetty3Extra Jetty-3.1.rc5 - 1 May 2001 + Added build target for mini.jetty.jar - see README. + Major restructing of packages to separate servlet dependancies. c.m.XML - moved XML dependant classes from c.m.Util c.m.HTTP - No servlet or XML dependant classes: c.m.Jetty.Servlet - moved from c.m.HTTP.Handler.Servlet c.m.Servlet - received some servlet dependant classes from HTTP. + Added UnixCrypt support to c.m.U.Password + Added HTaccessHandler to authenitcate against apache .htaccess files. + Added query param handling to ForwardHandler + Added ServletHandler().setUsingCookies(). + Optimized canonical path calculations. + Warn and close connections if content-length is incorrectly set. + Request log contains bytes actually returned. + Fixed handling of empty responses at header commit. + Fixed ResourceHandler handling of ;JSESSIONID + Fixed forwarding to null pathInfo requests. + Fixed handling of multiple cookies. + Fixed EOF handling in MultiPartRequest. + Fixed sync of ThreadPool idleSet. + Fixed jetty.bat classpath problems. Jetty-3.0.6 - 26 Apr 2001 + Fixed handling of empty responses at header commit. + Fixed ResourceHandler handling of ;JSESSIONID + Fixed forwarding to null pathInfo requests. + Fixed EOF handlding in MultiPartRequest. + Fixed sync of ThreadPool idleSet. + Load-on-startup the JspServlet so that precompiled servlets work. Jetty-3.1.rc4 - 14 April 2001 + Include full versions of JAXP and Crimson + Added idle thread getter to ThreadPool. + Load-on-startup the JspServlet so that precompiled servlets work. + Removed stray debug println from the Frame class. Jetty-3.0.5 - 14 Apr 2001 + Branched from 3.1 trunk to fix major errors + Fixed LineInput bug EOF + Improved flush ordering for forwarded requests. + Turned off range handling by default until bugs resolved + Don't chunk if content length is known. + fixed getLocales handling of quality params + Created better random session ID + Resource handler strips URL params like JSESSION. + Fixed session invalidation unbind notification to conform with spec + Load-on-startup the JspServlet so that precompiled servlets work. Jetty-3.1.rc3 - 9 April 2001 + Implemented multi-part ranges so that acrobat is happy. + Simplified multipart response class. + Improved flush ordering for forwarded requests. + Improved ThreadPool stop handling + Frame handles more JIT stacks. + Cleaned up handling of exceptions thrown by servlets. + Handle zero length POSTs + Start session scavenger if needed. + Added ContentHandler Observer to XmlParser. + Allow webapp XmlParser to be observed for ejb-ref tags etc. + Created better random session ID Jetty-3.1.rc2 - 30 Mar 2001 + Lifecycle.start() may throw Exception + Added MultiException to throw multiple nested exceptions. + Improved logging of nested exceptions. + Only one instance of default MIME map. + Use reference JAXP1.1 for XML parsing.y + Version 1.1 of configuration dtd supports New objects. + Improved handling of Primitive classes in XmlConfig + Renamed getConnection to getHttpConnection + fixed getLocales handling of quality params + fixed getParameter(name) handling for multiple values. + added options to turn off ranges and chunking to support acrobat requests. Jetty-3.1.rc1 - 18 Mar 2001 + Moved JMX and SASL handling to Jetty3Extra release + Fixed problem with ServletContext.getContext(uri) + Added Jetty documentation pages from JettyWiki + Cleaned up build.xml script + Minimal handling of Servlet.log before initialization. + Various SSL cleanups + Resource handler strips URL params like JSESSION. Jetty-3.1.rc0 - 23 Feb 2001 + Added JMX management framework. + Use Thread context classloader as default context loader parent. + Fixed init order for unnamed servlets. + Fixed session invalidation unbind notification to conform with spec + Improved handling of primitives in utilities. + Socket made available via HttpConnection. + Improved InetAddrPort and ThreadedServer to reduce DNS lookups. + Dynamic servlets may be restricted to Context classloader. + Reoganized packages to allowed sealed Jars + Changed getter and setter methods that did not conform to beans API. Jetty-3.0.4 - 23 Feb 2001 + Fixed LineInput bug with split CRLF. Jetty-3.0.3 - 3 Feb 2001 + Fixed pipelined request buffer bug. + Handle empty form content without exception. + Allow Log to be disabled before initialization. + Included new Jetty Logo + Implemented web.xml servlet mapping to a JSP + Fixed handling of directories without trailing / Jetty-3.0.2 - 13 Jan 2001 + Replaced ResourceHandler FIFO cache with LRU cache. + Greatly improved buffering in ChunkableOutputStream + Padded error bodies for IE bug. + Improved HTML.Block efficiency + Improved jetty.bat + Improved jetty.sh + Handle unknown status reasons in HttpResponse + Ignore included response updates rather than IllegalStateException + Removed classloading stats which were causing circular class loading problems. + Allow '+' in path portion of a URL. + Try ISO8859_1 encoding if can't find ISO-8859-1 + Restructured demo site pages. + Context specific security permissions. + Added etc/jetty.policy as example policy file. Jetty-3.0.1 - 20 Dec 2000 + Fixed value unbind notification for session invalidation. + Removed double null check possibility from ServletHolder Jetty-3.0.0 - 17 Dec 2000 + Improved jetty.sh logging + Improved dtd resolution in XML parser. + Fixed taglib parsing + Fixed rel path handling in default configurations. + Optional extract war files. + Fixed WriterLogSink init bug + Use inner class to avoid double null check sync problems + Fixed rollover bug in WriterLogSink Jetty-3.0.0.rc8 - 13 Dec 2000 + Optional alias checking added to FileResource. Turned on by default on all platforms without the "/" file separator. + Mapped *.jsp,*.jsP,*.jSp,*.jSP,*.Jsp,*.JsP,*.JSp,*.JSP + Tidied handling of ".", ".." and "//" in resource paths + Protected META-INF as well as WEB-INF in web applications. + Jetty.Server catches init exceptions per server + getSecurityHandler creates handler at position 0. + SysV unix init script + Improved exit admin handling + Change PathMap handling of /* to give precedence over suffix mapping. + Forward to welcome pages rather than redirect. + Removed special characters from source. + Default log options changed if in debug mode. + Removed some unused variables. + Added ForwardHandler + Removed security constraint on demo admin server. + Patched jasper to tomcat 3.2.1 Jetty-3.0.0.rc7 - 02 Dec 2000 + Fixed security problem with lowercase WEB-INF uris on windows. + Extended security constraints (see README and WebApp Demo). + Set thread context classloader during handler start/stop calls. + Don't set MIME-Version in response. + Allow dynamic servlets to be served from / + Handle multiple inits of same servlet class. + Auto add a NotFoundHandler if needed. + Added NotFoundServlet + Added range handling to ResourceHandler. + CGI servlet handles not found better. + WEB-INF protected by NotFoundServlet rather than security constraint. + PUT, MOVE disabled in WebApplication unless defaults file is passed. + Conditionals apply to puts, dels and moves in ResourceHandler. + URIs accept all characters < 0xff. + Set the AcceptRanges header. + Depreciated RollOverLogSink and moved functionality to an improved WriterLogSink. + Changed log options to less verbose defaults. + ThreadedServer.forceStop() now makes a connection to itself to handle non-premptive close. + Double null lock checks use ThreadPool.__nullLockChecks. + Split Debug servlet out of Admin Servlet. + Added Com.mortbay.HTTP.Handler.Servlet.Context.LogSink attribute to Servlet Context. If set, it is used in preference to the system log. Jetty-3.0.0.rc6 - 20 Nov 2000 + RequestDispatcher.forward() only resets buffer, not headers. + Added ServletWriter that can be disabled. + Resource gets systemresources from it's own classloader. + don't include classes in release. + Allow load-on-startup with no content. + Fixed RollOverFileLogSink bug with extra log files. + Improved Log defaults + Don't start HttpServer log sink on add. + Admin servlet uses unique links for IE. + Added Win32 service support + Reduced risk of double null check sync problem. + Don't set connection:close for normal HTTP/1.0 responses. + RequestDispatcher new queries params replace old. + Servlet init order may be negative. + Corrected a few of the many spelling mistakes. + Javadoc improvements. + Webapps serve dynamics servlets by default. + Warn for missing WEB-INF or web.xml + Sessions try version 1 cookies in set-cookie2 header. + Session cookies are given context path + Put extra server and servlet info in header. + Version details in header can be suppressed with System property java.com.mortbay.HTTP.Version.paranoid + Prevent reloading dynamic servlets at different paths. + Implemented resource aliases in HandlerContext - used by Servlet Context + Map tablib configuration to resource aliases. + Implemented customizable error pages. + Simple stats in ContextLoader. + Allow HttpMessage state to be manipulated. + Allow multiple set cookies. Jetty-3.0.0.rc5 - 12 Nov 2000 + Default writer encoding set by mime type if not explicitly set. + Relax webapp rules, accept no web.xml or no WEB-INF + Pass flush through ServletOut + Avoid jprobe race warnings in DateCache + Allow null cookie values + Servlet exceptions cause 503 unavailable rather than 500 server error + RequestDispatcher can dispatch static resources. + Merged DynamicHandler into ServletHandler. + Added debug form to Admin servlet. + Implemented servlet load ordering. + Moved JSP classpath hack to ServletHolder + Removed Makefile build system. + Many javadoc cleanups. Jetty-2.4.9 - 12 Nov 2000 + HttpListener ignore InterruptedIOExceptions + HttpListener default max idle time = 20s + HtmlFilter handles non default encodings + Writing HttpRequests encodes path + HttpRequest.write uses ISO8859_1 encoding. Jetty-3.0.0.rc4 - 6 Nov 2000 + Provide default JettyIndex.properties + Fixed mis-synchronization in ThreadPool.stop() + Fixed mime type mapping bug introduced in RC3 + Ignore more IOExceptions (still visible with debug). Jetty-3.0.0.rc3 - 5 Nov 2000 + Changed ThreadPool.stop for IBM 1.3 JVM + Added bin/jetty.sh run script. + upgraded build.xml to ant v1.2 + Set MaxReadTimeMs in all examples + Further clean up of the connection close actions + Moved unused classes from com.mortbay.Util to com.mortbay.Tools in new distribution package. + Handle mime suffixes containing dots. + Added gz tgz tar.gz .z mime mappings. + Fixed default mimemap initialization bug + Optimized persistent connections by recycling objects + Added HandlerContext.setHttpServerAccess for trusted contexts. + Set the thread context class loader in HandlerContext.handle + Prevent servlet setAttribute calls to protected context attributes. + Removed redundant context attributes. + Implemented mime mapping in webapplications. + Strip ./ from relative resources. + Added context class path dynamic servlet demo Jetty-3.0.0.rc2 - 29 Oct 2000 + Replaced ISO-8859-1 literals with StringUtil static + Pass file based classpath to JspServlet (see README). + Prevented multiple init of ServletHolder + ErlEncoding treats params without values as empty rather than null. + Accept public DTD for XmlConfiguration (old style still supported). + Cleaned up non persistent connection close. + Accept HTTP/1. as HTTP/1.0 (for netscape bug). + Fixed thread name problem in ThreadPool Jetty-3.0.0.rc1 - 22 Oct 2000 + Added simple admin servlet. + Added CGI to demo + Added HashUserRealm and cleaned up security constraints + Added Multipart request and response classes from Jetty2 + Moved and simplified ServletLoader to ContextLoader. + Initialize JSP with classloader. + All attributes in javax. java. and com.mortbay. name spaces to be set. + Partial handling of 0.9 requests. + removed Thread.destroy() calls. + Cleaned up exception handling. Jetty-2.4.8 23 Oct 2000 + Fixed bug with 304 replies with bodies. + Improved win32 make files. + Fixed closing socket problem Jetty-3.0.B05 - 18 Oct 2000 + Improved null returns to get almost clean watchdog test. + Cleaned up response committing and flushing + Handler RFC2109 cookies (like any browser handles them!) + Added default webapp servlet mapping /servlet/name/* + Improved path spec interpretation by looking at 2.3 spec + Implemented security-role-ref for servlets + Protected servletConfig from downcast security problems + Made test harnesses work with ant. + improved ant documentation. + Removed most deprecation warnings + Fixed JarFileResource to handle jar files without directories. + Implemented war file support + Java2 style classloading + Improved default log format for clarity. + Separated context attributes and initParams. Jetty-3.0.B04 - 12 Oct 2000 + Restricted context mapping to simple model for servlets. + Fixed problem with session ID in paths + Added modified version of JasperB3.2 for JSP + Moved FileBase to docroot + Merged and renamed third party jars. + Do not try multiple servlets for a request. + Implemented Context.getContext(uri) + Added webdefault.xml for web applications. + Redirect to index files, so index.jsp works. + Filthy hack to teach jasper JspServer Jetty classpath Jetty-3.0.B03 - 9th Oct 2000 + Expanded import package.*; lines + Expanded leading tabs to spaces + Improved Context to Handler contract. + Parse but not handler startup ordering in web applications. + Send request log via a LogSink + Added append mode in RolloverFileLogSink + Made LogSink a Lifecycle interface + Improved handler toString + Redirect context only paths. + Pass object to LogSink + Implemented request dispatching. + Redo dynamic servlets handling + Improved Log rollover. + Simplified path translation and real path calculation. + Catch stop and destroy exceptions in HttpServer.stop() + Handle ignorable spaces in XmlConfiguration + Handle ignorable spaces in WebApplication + Warn about explicit sets of WebApplication + Remove 411 checks as IE breaks this rule after redirect. + Removed last remnants JDK 1.1 support + Added release script Jetty-2.4.7 - 6th Oct 2000 + Allow Objects to be passed to LogSink + Set content length on errors for keep alive. + Added encode methods to URI + Improved win32 build + fixes to SSL doco + Support key and keystore passwords + Various improvements to ServletDispatch, PropertyTree and associated classes. Jetty-3.0.B02 - 24st Aug 2000 + Fixed LineInput bug with SSL giving CR pause LF. + Fixed HTTP/1.0 input close bug + Fixed bug in TestRFC2616 + Improved ThreadedServer stop and destroy + Use resources in WebApplication + Added CGI servlet Jetty-3.0.B01 - 21st Aug 2000 + SSL implemented with JsseListener + Partial implementation of webapp securitycontraints + Implemented more webapp configuration + Switched to the aelfred XML parser from microstar, which is only partially validating, but small and lightweight Jetty-2.4.6 - 16th Aug 2000 + Turn Linger off before closing sockets, to allow restart. + JsseListener & SunJsseListener added and documented + com.mortbay.Util.KeyPairTool added to handle openSSL SSL keys. + Minor changes to compile with jikes. + Added passive mode methods to FTP Jetty-3.0.A99 - 10 Aug 2000 + Implemented jetty.xml configuration + Added Xmlconfiguration utility + ServletLoader simplied and uses ResourcePath + Replaced FileHandler with ResourceHandler + Use SAX XML parsing instead of DOM for space saving. + Removed FileBase. Now use ResourceBase instead + Added Resource abstraction + Make it compile cleanly with jikes. + Re-added commented out imports for JDK-1.1 compile Jetty-3.0.A98 - 20 July 2000 + Implemented Jetty demos and Site as Web Application. + Implemented WebApplicationContext + Switched to JDK1.2 only + ServletRequest.getServerPort() returns 80 rather than 0 + Fixed constructor to RolloverFileLogSink + Improved synchronization on LogSink + Allow HttpRequest.toString() handles bad requests. Jetty-3.0.A97 - 13 July 2000 + Tempory request log implementation + Less verbose debug + Better tuned SocketListener parameters + Started RequestDispatcher implementation. + Added WML mappings + Fixed makefiles for BSD ls + Fixed persistent commits with no content (eg redirect+keep-alive). + Implemented servlet isSecure(). + Implemented servlet getLocale(s). + Formatted version in server info string. + Protect setContentLength from a late set in default servlet HEAD handling. + Added error handling to LifeCycleThread + implemented removeAttribute on requests Jetty-2.4.5 - 9th July 2000 + Don't mark a session invalid until after values unbound. + Formatted version in server info. + Added HtmlExpireFilter and removed response cache revention from HtmlFilter. + Fixed transaction handling in JDBC wrappers Jetty-3.0.A96 - 27 June 2000 + Fixed bug with HTTP/1.1 Head reqests to servlets. + Supressed un-needed chunking EOF indicators. Jetty-3.0.A95 - 24 June 2000 + Fixed getServletPath for default "/" + Handle spaces in file names in FileHandler. Jetty-3.0.A94 - 19 June 2000 + Implemented Sessions. + PathMap exact matches can terminate with ; or # for URL sessions and targets. + Added HandlerContext to allow grouping of handlers into units with the same file, resource and class configurations. + Cleaned up commit() and added complete() to HttpResponse + Updated license to clarify that commercial usage IS OK! Jetty-3.0.A93 - 14 June 2000 + Major rethink! Moved to 2.2 servlet API + Lots of changes and probably unstable Jetty-3.0.A92 - 7 June 2000 + Added HTML classes to jar + Fixed redirection bug in FileHandler Jetty-2.4.4 - 3rd June 2000 + Many debug call optimizations + Added RolloverFileLogSink + Improved LogSink configuration + Support System.property expansions in PropertyTrees. + Added uk.org.gosnell.Servlets.CgiServlet to contrib + HttpRequest.setRequestPath does not null pathInfo. + BasicAuthHandler uses getResourcePath so it can be used behind request dispatching + Added HTML.Composite.replace + FileHandler implements IfModifiedSince on index files. + Added build-win32.mak Jetty-3.0.A91 - 3 June 2000 + Improved LogSink mechanism + Implemented realPath and getResource methods for servlets. + Abstracted ServletHandler + Simplified HttpServer configuration methods and arguments + Simplified class loading + Added HTML classes from Jetty2 Jetty-3.0.A9 - 7 May 2000 + Improvided finally handling of output end game. + Fixed double chunking bug in SocketListener. + File handler checks modified headers on directory indexes. + ServletLoader tries unix then platform separator for zip separator. Jetty-3.0.A8 4th May 2000 + Servlet2_1 class loading re-acrchitected. See README. + Moved Sevlet2_1 handler to com.mortbay.Servlet2_1 + addCookie takes an int maxAge rather than a expires date. + Added LogSink extensible log architecture. + Code.ignore only outputs when debug is verbose. + Added Tenlet class for reverse telnet. Jetty-2.4.3 - 4th May 2000 STABLE + Pass Cookies with 0 max age to browser. + Allow CRLF in UrlEncoded Jetty-2.4.2 - 23rd April 2000 + Added LogSink and FileLogSink classes to allow extensible Log handling. + Handle nested RequestDispatcher includes. + Modified GNUJSP to prevent close in nested requests. + Added GNUJSP to JettyServer.prp file. Jetty-3.0.A7 - 15 Apr 2000 + Include java 1.2 source hierarchy + removed excess ';' from source + fixed flush problem with chunked output for IE5 + Added InetGateway to help debug IE5 problems + added removeValue method to MultiMap Jetty-2.4.1 - 9th April 2000 + Removed debug println from ServletHolder. + Set encoding before exception in FileHandler. + Fixed bug in HtmlFilter for tags split between writes. Jetty-3.0.A6 - 9 Apr 2000 + Integrated skeleton 2.1 Servlet container + Improved portability of Frame and Debug. + Dates forced to use US locale + Removed Converter utilities and InetGateway. + added bin/useJava2Collections to convert to JDK1.2 Jetty-2.4.0 - 24th March 2000 + Upgraded to gnujsp 1.0.0 + Added per servlet resourceBase configuration. + Absolute URIs are returned by getRequestURI (if sent by browser). + Improved parsing of stack trace in debug mode. + Implemented full handling of cookie max age. + Moved SetUID native code to contrib hierarchy + Form parameters only decoded for POSTs + RequestDispatcher handles URI parameters + Fixed bug with RequestDispatcher.include() + Fixed caste problem in UrlEncoded + Fixed null pointer in ThreadedServer with stopAll + Added VirtualHostHandler for virtual host handling + Added doc directory with a small start Jetty-2.3.5 - 25th January 2000 + Fixed nasty bug with HTTP/1.1 redirects. + ProxyHandler sends content for POSTs etc. + Force locale of date formats to US. + Fixed expires bug in Cookies + Added configuration option to turn off Keep-Alive in HTTP/1.0 + Allow configured servlets to be auto reloaded. + Allow properties to be configured for dynamic servlets. + Added contrib/com/kiwiconsulting/jetty JSSE SSL adaptor to release. Jetty-2.3.4 - 18th January 2000 + include from linux rather than genunix for native builds + Fixed IllegalStateException handling in DefaultExceptionHandler + MethodTag.invoke() is now public. + Improved HtmlFilter.activate header modifications. + Cookie map keyed on domain as well as name and path. + DictionaryConverter handles null values. + URI decodes applies URL decoding to the path. + Servlet properties allow objects to be stored. + Fixed interaction with resourcePaths and proxy demo. Jetty-3.0.A5 - 19 Oct 1999 + Use ISO8859_1 instead of UTF8 for headers etc. + Use char array in UrlEncoded.decode + Do our own URL string encoding with 8859-1 + Replaced LF wait in LineInput with state boolean. Jetty-2.3.3 - 19th October 1999 STABLE + Replaced UTF8 encoding with ISO-8859-1 for headers. + Use UrlEncoded for form parameters. + Do our own URL encoding with ISO-8859-1 + HTTP.HTML.EmbedUrl uses contents encoding. Jetty-2.3.2 - 17th October 1999 + Fixed getReader bug with HttpRequest. + Updated UrlEncoded with Jetty3 version. Jetty-3.0.A4 - 16 Oct 1999 + Request attributes + Basic Authentication Handler. + Added LF wait after CR to LineInput. + UTF8 in UrlDecoded.decodeString. Jetty-2.3.1 - 14th October 1999 + Force UTF8 for FTP commands + Force UTF8 for HTML + Changed demo servlets to use writers in preference to outputstreams + NullHandler/Server default name.name.PROPERTIES to load prefix/name.name.properties + Use UTF8 in HTTP headers + Added Oracle DB adapter + Added assert with no message to Code + ThreadedServer calls setSoTimeout(_maxThreadIdleMs) on accepted sockets. Idle reads will timeout. + Prevented thread churn on idle server. + HTTP/1.0 Keep-Alive (about time!). + Fixed GNUJSP 1.0 resource bug. Jetty-3.0.A3 - 14 Oct 1999 + Added LifeCycle interface to Utils implemented by ThreadPool, ThreadedServer, HttpListener & HttpHandler + StartAll, stopAll and destroyAll methods added to HttpServer. + MaxReadTimeMs added to ThreadedServer. + Added service method to HttpConnection for specialization. Jetty-3.0.A2 - 13 Oct 1999 + UTF8 handling on raw output stream. + Reduced flushing on writing response. + Fixed LineInput problem with repeated CRs + Cleaned up Util TestHarness. + Prevent entity content for responses 100-199,203,304 + Added cookie support and demo. + HTTP/1.0 Keep-alive (about time!) + Virtual Hosts. + NotFound Handler + OPTION * Handling. + TRACE handling. + HEAD handling. Jetty-3.0.A1 - 12 Oct 1999 + LineInput uses own buffering and uses character encodings. + Added MultiMap for common handling of multiple valued parameters. + Added parameters to HttpRequest + Quick port of FileHandler + Setup demo pages. + Added PathMap implementing mapping as defined in the 2.2 API specification (ie. /exact, /prefix/*, *.extention & default ). + Added HttpHandler interface with start/stop/destroy lifecycle + Updated HttpListener is start/stop/destroy lifecycle. + Implemented simple extension architecture in HttpServer. Jetty-3.0.A0 - 9 Oct 1999 + Started fresh repository in CVS + Moved com.mortbay.Base classes to com.mortbay.Util + Cleanup of UrlEncoded, using 1.2 Collections. + Cleanup of URI, using 1.2 Collections. + Extended URI to handle absolute URLs + Cleanup of LineInput, using 1.2 Collections. + Moved HttpInput/OutputStream to ChunkableInput/OutputStream. + Cleaned up chunking code to use LineInput and reduce buffering. + Added support for transfer and content encoding filters. + Added support for servlet 2.2 outbut buffer control. + Generalized notification of outputStream events. + Split HttpHeader into HttpFields and HttpMessage. + HttpMessage supports chunked trailers. + HttpMessage supports message states. + Added generalized HTTP Connection. + Cleanup of HttpRequest and decoupled from Servlet API + Cleanup and abstraction of ThreadPool. + ThreadedServer based on ThreadPool. + Cleanup of HttpResponse and decoupled from Servlet API + Created RFC2616 test harness. + gzip and deflate request transfer encodings + TE field coding and trailer handler + HttpExceptions now produce error pages with specific detail of the exception. Jetty-2.3.0 - 5th October 1999 + Added SetUID class with native Unix call to set the effective User ID. + FTP closes files after put/get. + FTP uses InetAddress of command socket for data socket. Jetty-2.3.0A - 22 Sep 1999 + Added GNUJSP 1.0 for the JSP 1.0 API. + Use javax.servlet classes from JWSDK1.0 + Added "Powered by Jetty" button. + ServerContext available to HtmlFilters via context param + Made session IDs less predictable and removed race. + Added BuildJetty.java file. + Expanded tabs to spaces in source. Jetty-2.2.8 - 15 Sep 1999 + Fixed bug in Element.attribute with empty string values. + Made translation of getRequestURI() optional. + Removed recursion from TranslationHandler + Added disableLog() to turn off logging. + Allow default table attributes to be overriden. + Improved quoting in HTML element values Jetty-2.2.7 - 9 Sep 1999 + Reverted semantics of getRequestURI() to return untranslated URI. + Added GzipFilter for content encoding. + Added default row, head and cell elements to Table. + FileHandler passes POST request through if the file does not exist. Jetty-2.2.6 - 5 Sep 1999 + New implementation of ThreadPool, avoids a thread leak problem. + Fixed Cookie max age order of magnitude bug. + Cookies always available from getCookies. + Cookies parameter renamed to CookiesAsParameters + HttpRequest.getSession() always returns a session as per the latest API spec. + Added destroy() method on all HttpHandlers. + ServletHandler.destroy destroys all servlets. + FileHandler does not server files ending in '/' + Ignore duplicate single valued headers, rather than reply with bad request, as IE4 breaks the rules. + Allow the handling of getPathTranslated to be configured in ServletHandler. + Removed JRUN options from ServletHandler configuration. + Added ServletRunnerHandler to the contrib directories. + Updated HTML package to better support CSS: - cssClass, cssID and style methods added to element. - SPAN added to Block - media added to Style - class StyleLink added. Jetty-2.2.5 - 19 Aug 1999 + Fixed bug with closing connections in ThreadedServer + Made start and stop non final in ThreadedServer + Better default handling of ServletExceptions + Always close connection after a bad request. + Set Expires header in HtmlFilter. + Don't override the cookie as parameter option. + Limited growth in MultiPartResponse boundary. + Improved error messages from Jetty.Server. + Close loaded class files so Win32 can overwrite them before GC (what a silly file system!). Jetty-2.2.4 - 2 Aug 1999 + ThreadedServer can use subclasses of Thread. + Better help on Jetty.Server + HttpRequests may be passed to HttpFilter constructors. + HtmlFilter blanks IfModifiedSince headers on construction + Fixed bugs in HtmlFilter parser and added TestHarness. + Improved cfg RCS script. Jetty-2.2.3 - 27 July 1999 + Fixed parser bug in HtmlFilter + Made setInitialize public in ServletHolder + Improved performance of com.mortbay.HTML.Heading + Added stop call to HttpServer, used by Exit Servlet. + Simplified JDBC connection handling so that it works with Java1.2 - albeit less efficiently. + FileHandler defaults to allowing directory access. + JDBC tests modified to use cloudscape as DB. Jetty-2.2.2 - 22 July 1999 + Fixed bug in HtmlFilter that prevented single char buffers from being written. + Implemented getResourceAsStream in FileJarServletLoader + Fixed bug with CLASSPATH in FileJarServletLoader after attempt to load from a jar. + Fixed bug in com.mortbay.Util.IO with thread routines. + Moved more test harnesses out of classes. + File handler passes through not allowed options for non existant files. + NotFoundHandler can repond with SC_METHOD_NOT_ALLOWED. + Improved com.mortbay.Base.Log handling of different JVMs + Minor fixes to README Jetty-2.2.1 - 18 July 1999 + Comma separate header fields. + Protect against duplicate single valued headers. + Less verbose debug in PropertyTree + Ignore IOException in ThreadedServer.run() when closing. + Limit maximum line length in HttpInputStream. + Response with SC_BAD_REQUEST rather than close in more circumstances + Handle continuation lines in HttpHeader. + HtmlFilter resets last-modified and content-length headers. + Implemented com.mortbay.Util.IO as a ThreadPool + Decoupled ExceptionHandler configuration from Handler stacks. Old config style will produce warning and Default behavior. See new config file format for changes. + Added TerseExceptionHandler + Added optional resourceBase property to HttpConfiguration. This is used as a URL prefix in the getResource API and was suggested by the JSERV and Tomcat implementors. Jetty-2.2.0 - 1 July 1999 + Improved feature description page. + Added Protekt SSL HttpListener + Moved GNUJSP and Protekt listener to a contrib hierarchy. + ThreadedServer.stop() closes socket before interrupting threads. + Exit servlet improved (a little). + Fixed some of the javadoc formatting. Jetty-2.2.Beta4 - 29 June 1999 + FileHandler flushes files from cache in DELETE method. + ThreadedServer.stop() now waits until all threads are stopped. + Options "allowDir" added to FileHandler. + Added getGlobalProperty to Jetty.Server and used this to configure default page type. + Updated README.txt + Restructured com.mortbay.Jetty.Server for better clarity and documentation. + Added comments to configuration files. + Made ServerSocket and accept call generic in ThreadedServer for SSL listeners. + Altered meaning of * in PropertyTree to assist in abbreviated configuration files. + Added JettyMinimalDemo.prp as an example of an abbreviated configuration. + Expanded Mime.prp file + Added property handling to ServletHandler to read JRUN servlet configuration files. Jetty-2.2.Beta3 - 22 June 1999 + Re-implemented ThreadedServer to improve and balance performance. + Added file cache to FileHandler + Implemented efficient version of ServletContext.getResourceAsStream() that does not open a new socket connection (as does getResource()). + LookAndFeelServlet uses getResourceAsStream to get the file to wrap. This allows it to benefit from any caching done and to wrap arbitrary content (not just files). + Restructure demo so that LookAndFeel content comes from simple handler stack. + Fixed file and socket leaks in Include and Embed tags. + Ran dos2unix on all text files + Applied contributed patch of spelling and typo corrections + Added alternate constructors to HTML.Include for InputStream. + Server.shutdown() clears configuration so that server may be restarted in same virtual machine. + Improved Block.write. + Fixed bug in HttpResponse flush. Jetty-2.2.Beta2 - 12 June 1999 + Added all write methods to HttpOutputStream$SwitchOutputStream + Added com.mortbay.Jetty.Server.shutdown() for gentler shutdown of server. Called from Exit servlet + HttpRequest.getParameterNames() no longer alters the order returned by getQueryString(). + Handle path info of a dynamic loaded servlets and correctly set the servlet path. + Standardized date format in persistent cookies. Jetty-2.2.Beta1 - 7 June 1999 + Defined abstract ServletLoader, derivations of which can be specified in HttpConfiguration properties. + Implemented all HttpServer attribute methods by mapping to the HttpConfiguration properties. Dynamic reconfiguration is NOT supported by these methods (but we are thinking about it). + Close files after use to avoid "file leak" under heavy load. + Fixed missing copyright messages from some contributions + Fixed incorrect version numbers in a few places. + Improved ThreadPool synchronization and added minThreads. + Allow configuration of MinListenerThreads, MaxListenerThreads, MaxListenerThreadIdleMs + HtmlFilter optimized for being called by a buffered writer. + Don't warn about IOExceptions unless Debug is on. + Limit the job queue only grow to the max number of threads. + Included GNUJSP 0.9.9 + Optional use of DateCache in log file format + Fixed cache in FileJarServletLoader + Destroy requests and responses to help garbage collector. + Restructure ThreadedServer to reduce object creation. Jetty-2.2.Beta0 - 31 May 1999 + Servlet loader handles jar files with different files separator. + ThreadedServer gently shuts down. + Handle malformed % characters in URLs. + Included and improved version of ThreadPool for significant performance improvement under high load. + HttpRequest.getCookies returns empty array rather than null for no cookies. + Added HttpResponse.requestHandled() method to avoid bug with servlet doHead method. + Added Page.rewind() method to allow a page to be written multiple times + Added "Initialize" attribute to servlet configuration to allow servlet to be initialized when loaded. + LogHandler changed to support only a single outfile and optional append. + Included contributed com.mortbay.Jetty.StressTester class + Token effort to keep test files out of the jar + Removed support for STF Jetty-2.2.Alpha1 - 7 May 1999 + ServletHolder can auto reload servlets + Dynamic servlets can have autoReload configured + Wait for requests to complete before reloading. + Call destroy on old servlets when reloading. + Made capitalization of config file more consistent(ish) + Fixed bug in SessionDump Jetty-2.2.Alpha0 - 6 May 1999 + Improved PropertyTree implementation + Old Jetty.Server class renamed to Jetty.Server21 + New Server class using PropertyTree for configuration + HttpHandlers given setProperties method to configure via Properties. + HttpListener class can be configured + Mime suffix mapping can be configured. + Removed historic API from sessions + Improved SessionDump servlet + Fixed date overflow in Cookies + HttpResponse.sendError avoids IllegalStateException + Added ServletLoader implementation if ClassLoader. + Dynamic loading of servlets. + Added reload method to ServletHolder, but no way to call it yet. + Changed options for FileServer + Implemented ServletServer + Removed SimpleServletServer Jetty-2.1.7 - 22 April 1999 + Fixed showstopper bug with getReader and getWriter in requests and responses. + HttpFilter uses package interface to get HttpOutputStream Jetty-2.1.6 - 21 April 1999 + Reduced initial size of most hashtables to reduce default memory overheads. + Throw IllegalStateException as required from gets of input/output/reader/writer in requests/responses. + New simpler version of PropertyTree + Updated PropertyTreeEditor + Return EOF from HttpInputStream that has a content length. + Added additional date formats for HttpHeader.getDateHeader Jetty-2.1.5 - 15 April 1999 + Session URL encoding fixed for relative URLs. + Reduced session memory overhead of sessions + Form parameters protected against multiple decodes when redirected. + Added setType methods to com.mortbay.FTP.Ftp + Fixed bugs with invalid sessions + Page factory requires response for session encoding + Moved SessionHandler to front of stacks + HtmlFilter now expands to the URL encoded session if required. + Instrumented most of the demo to support URL session encoding. + Implemented HttpRequest.getReader() + Servlet log has been diverted to com.mortbay.Base.Log.event() Thus debug does not need to be turned on to see servlet logs. + Fixed alignment bug in TableForm + Removed RFCs from package + Fixed bug in ServletDispatch for null pathInfo Jetty-2.1.4 - 26 March 1999 + Fixed problem compiling PathMap under some JDKs. + Reduced HTML dependence in HTTP package to allow minimal configuration + Tightened license agreement so that binary distributions are required to include the license file. + HttpRequest attributes implemented. + Session max idle time implemented. + pathInfo returns null for zero length pathInfo (as per spec). Sorry if this breaks your servlets - it is a pain! + fixed bug in getRealPath + getPathTranslated now call getRealPath with pathInfo (as per spec). Jetty-2.1.3 - 19 March 1999 + Added support for suffixes to PathMap + Included GNUJSP implementation of Java Server Pages + Use Java2 javadoc Jetty-2.1.2 - 9 March 1999 + JSDK 2.1.1 + API documentation for JSDK 2.1.1 + Cascading style sheet HTML element added. + Fixed trailing / bug in FileHandler (again!). + Converted most servlets to HttpServlets using do Methods. Jetty-2.1.1 - 5 March 1999 + Reduced number of calls to getRemoteHost for optimization + Faster version of HttpInputStream.readLine(). + com.mortbay.Base.DateCache class added and used to speed date handling. + Handle '.' in configured paths (temp fix until PropertyTrees) + Fast char buffer handling in HttpInputStream + Faster version of HttpHeader.read() + Faster version of HttpRequest + Size all StringBuffers Jetty-2.1.0 - 22 February 1999 + Session URL Encoding + PropertyTrees (see new Demo page) + ServletDispatch (see new Demo page) + image/jpg -> image/jpeg + Deprecated com.mortbay.Util.STF + getServlet methods return null. Jetty-2.1.B1 - 13 February 1999 + Fixed bug with if-modified-since in FileHandler + Added video/quicktime to default MIME types. + Fixed bug with MultipartRequest. + Updated DefaultExceptionHandler. + Updated InetAddrPort. + Updated URI. + Implemented Handler translations and getRealPath. + Improved handling of File.separator in FileHandler. + Implemented RequestDispatcher (NOT Tested!). + Implemented getResource and getResourceAsStream (NOT Tested!). + Replace package com.mortbay.Util.Gateway with class com.mortbay.Util.InetGateway Jetty-2.1.B0 - 30 January 1999 + Uses JSDK2.1 API, but not all methods implemented. + Added support for PUT, MOVE, DELETE in FileHandler + FileHandler now sets content length. + Added plug gateway classes com.mortbay.Util.Gateway + Fixed command line bug with SimpleServletConfig + Minor changes to support MS J++ and its non standard language extensions - MMMmmm should have left it unchanged! Jetty-2.0.5 - 15 December 1998 + Temp fix to getCharacterEncoding + added getHeaderNoParams Jetty-2.0.4 - 10 December 1998 + Use real release of JSDK2.0 (rather than beta). + Portability issues solved for Apple's + Improved error code returns + Removed MORTBAY_HOME support from Makefiles + Improved default Makefile behaviour + Implement getCharacterEncoding Jetty-2.0.3 - 13 November 1998 + Limit threads in ThreadedServer and low priority listener option greatly improve performance under worse case loads. + Fix bug with index files for Jetty.Server. Previously servers configured with com.mortbay.Jetty.Server would not handle index.html files. Need to make this configurable in the prp file. + Fixed errors in README file: com.mortbay.Jetty.Server was called com.mortbay.HTTP.Server Jetty-2.0.2 - 1 November 1998 + Use JETTY_HOME rather than MORTBAY_HOME for build environment + Add thread pool to threaded server for significant performance improvement. + Buffer files during configuration + Buffer HTTP Response headers. Jetty-2.0.1 - 27 October 1998 + Released under an Open Source license. Jetty-2.0.0 - 25 October 1998 + Removed exceptional case from FileHandler redirect. + Removed Chat demo (too many netscape dependencies). + Fixed Code.formatObject handling of null objects. + Added multipart/form-data demo. Jetty-2.0.Beta3 - 29 Sep 1998 + Send 301 for directories without trailing / in FileHandler + Ignore exception from HttpListener + Properly implemented multiple listening addresses + Added com.mortbay.Jetty.Server (see README.Jetty) + Demo converted to an instance of com.mortbay.Jetty.Server + Fixed Log Handler again. + Added com.mortbay.HTTP.MultiPartRequest to handle file uploads Jetty-2.0Beta2 - July 1998 + Fixed Log Handler for HTTP/1.1 + Slight improvement in READMEEs Jetty-2.0Beta1 - June 1998 + Improved performance of Code.debug() calls, significantly in the case of non matching debug patterns. + Fixed bug with calls to service during initialization of servlet + Provided addSection on com.mortbay.HTML.Page + Provided reset on com.mortbay.HTML.Composite. + Proxy demo in different server instance + Handle full URLs in HTTP requests (to some extent) + Improved performance with special asciiToLowerCase + Warn if MSIE used for multi part MIME. Jetty-2.0Alpha2 - May 1998 + JDK1.2 javax.servlet API + Added date format to Log + Added timezone to Log + Handle params in getIntHeader and getDateHeader + Removed HttpRequest.getByteContent + Use javax.servlet.http.HttpUtils.parsePostData + Use javax.servlet.http.Cookie + Use javax.servlet.http.HttpSession + Handle Single Threaded servlets with servlet pool Jetty-1.3.5 May 1998 + Fixed socket inet bug in FTP + Debug triggers added to com.mortbay.Base.Code + Added date format to Log + Correct handling of multiple parameters Jetty-2.0Alpha1 Wed 8 April 1998 + Fixed forward bug with no port number + Removed HttpRequestHeader class + Debug triggers added to com.mortbay.Base.Code + Handle HTTP/1.1 Host: header + Correct formatting of Date HTTP headers + HttpTests test harness + Add HTTP/1.1 Date: header + Handle file requests with If-Modified-Since: or If-Unmodified-Since: + Handle HEAD properly + Send Connection: close + Requires Host: header for 1.1 requests + Sends chunked data for 1.1 responses of unknown length. + handle extra spaces in HTTP headers + Really fixed handling of multiple parameters + accept chunked data + Send 100 Continue for HTTP/1.1 requests (concerned about push???) + persistent connections Jetty-1.3.4 - Sun 15 Mar 1998 + Fixed handling of multiple parameters in query and form content. "?A=1%2C2&A=C%2CD" now returns two values ("1,2" & "C,D") rather than 4. + ServletHandler now takes an optional file base directory name which is used to set the translated path for pathInfo in servlet requests. + Dump servlet enhanced to exercise these changes. Jetty-1.3.3 + Fixed TableForm.addButtonArea bug. + TableForm.extendRow() uses existing cell + Closed exception window in HttpListener.java Jetty-1.3.2 + Fixed proxy bug with no port number + Added per Table cell composite factories Jetty-1.3.1 + Minor fixes in SmtpMail + ForwardHandler only forwards as http/1.0 (from Tobias.Miller) + Improved parsing of stack traces + Better handling of InvocationTargetException in debug + Minor release adjustments for Tracker Jetty-1.3.0 + Added DbAdaptor to JDBC wrappers + Beta release of Tracker Jetty-1.2.0 + Reintroduced STF + Fixed install bug for nested classes + Better Debug configuration + DebugServlet + Alternate look and feel for Jetty Jetty-1.1.1 + Improved documentation Jetty-1.1 + Improved connection caching in java.mortbay.JDBC + Moved HttpCode to com.mortbay.Util Jetty-1.0.1 + Bug fixes Jetty-1.0 + First release in com.mortbay package structure + Included Util, JDBC, HTML, HTTP, Jetty jetty-6.1.26/logs/0000755000175000017500000000000011745736447012435 5ustar moonmoonjetty-6.1.26/extras/0000755000175000017500000000000011745736535012775 5ustar moonmoonjetty-6.1.26/extras/jetty-java5-stats/0000755000175000017500000000000011745736447016276 5ustar moonmoonjetty-6.1.26/extras/jetty-java5-stats/src/0000755000175000017500000000000011745736447017065 5ustar moonmoonjetty-6.1.26/extras/jetty-java5-stats/src/test/0000755000175000017500000000000011745736447020044 5ustar moonmoonjetty-6.1.26/extras/jetty-java5-stats/src/test/java/0000755000175000017500000000000011745736447020765 5ustar moonmoonjetty-6.1.26/extras/jetty-java5-stats/src/test/java/org/0000755000175000017500000000000011745736447021554 5ustar moonmoonjetty-6.1.26/extras/jetty-java5-stats/src/test/java/org/mortbay/0000755000175000017500000000000011745736447023231 5ustar moonmoonjetty-6.1.26/extras/jetty-java5-stats/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736447024370 5ustar moonmoonjetty-6.1.26/extras/jetty-java5-stats/src/test/java/org/mortbay/jetty/handler/0000755000175000017500000000000011745736447026005 5ustar moonmoon././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjetty-6.1.26/extras/jetty-java5-stats/src/test/java/org/mortbay/jetty/handler/StatisticsHandlerTest.javajetty-6.1.26/extras/jetty-java5-stats/src/test/java/org/mortbay/jetty/handler/StatisticsHandlerTest.0000644000175000017500000001363011223263707032262 0ustar moonmoon// ======================================================================== // Copyright 2009-2009 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.util.IO; /** * @version $Revision: 5303 $ $Date: 2009-07-03 04:07:03 +0200 (Fri, 03 Jul 2009) $ */ public class StatisticsHandlerTest extends TestCase { private final int workerCount = 100; private final int requestCount = 50; public void testSynchronizedStatisticsHandler() throws Exception { StatisticsHandler statisticsHandler = new StatisticsHandler(); runTestWithStatisticsHandler(statisticsHandler); } public void testAtomicStatisticsHandler() throws Exception { AtomicStatisticsHandler statisticsHandler = new AtomicStatisticsHandler(); runTestWithStatisticsHandler(statisticsHandler); } private void runTestWithStatisticsHandler(AbstractStatisticsHandler statisticsHandler) throws Exception { Server server = new Server(); Connector connector = new SelectChannelConnector(); server.setConnectors(new Connector[]{connector}); server.setHandler(statisticsHandler); TestHandler test = new TestHandler(); statisticsHandler.setHandler(test); server.start(); int serverPort = connector.getLocalPort(); try { AtomicInteger count = new AtomicInteger(); test.count=count; CountDownLatch latch = new CountDownLatch(workerCount); Worker[] workers = new Worker[workerCount]; for (int i = 0; i < workers.length; ++i) workers[i] = new Worker(i, serverPort, requestCount, latch); long start = System.nanoTime(); for (Worker worker : workers) worker.start(); boolean latched = latch.await(100 * requestCount, TimeUnit.MILLISECONDS); long end = System.nanoTime(); Thread.sleep(1000); assertTrue(latched); assertEquals(workers.length * requestCount,count.get()); assertEquals(workers.length * requestCount, statisticsHandler.getRequests()); assertEquals(workers.length * requestCount, statisticsHandler.getResponses2xx()); System.out.println(statisticsHandler.getClass().getSimpleName() + " - " + workerCount + " threads: " + TimeUnit.NANOSECONDS.toMillis(end - start) + " ms"); } finally { server.stop(); } } private static class Worker extends Thread { private final int id; private final int port; private final int requestCount; private final CountDownLatch latch; private Worker(int id, int port, int requestCount, CountDownLatch latch) { this.id = id; this.port = port; this.requestCount = requestCount; this.latch = latch; } public void run() { for (int i = 0; i < requestCount; i++) { try { Socket socket = new Socket(InetAddress.getByName(null), port); OutputStream output = socket.getOutputStream(); for (int j=20;j-->0 && i+1 oldMaxActives) { if (_requestsActiveMax.compareAndSet(oldMaxActives, actives)) break; oldMaxActives = _requestsActiveMax.get(); } long requestStartTime = System.currentTimeMillis(); try { super.handle(target, request, response, dispatch); } finally { long requestTime = System.currentTimeMillis() - requestStartTime; // Set to 0 if the value is negative, using a non-blocking algorithm actives = _requestsActive.decrementAndGet(); while (actives < 0) { if (_requestsActive.compareAndSet(actives, 0)) break; actives = _requestsActive.get(); } // Update the times, using a non-blocking algorithm long oldMinTime = _minRequestTime.get(); while (requestTime < oldMinTime) { if (_minRequestTime.compareAndSet(oldMinTime, requestTime)) break; oldMinTime = _minRequestTime.get(); } long oldMaxTime = _maxRequestTime.get(); while (requestTime > oldMaxTime) { if (_maxRequestTime.compareAndSet(oldMaxTime, requestTime)) break; oldMaxTime = _maxRequestTime.get(); } _totalRequestTime.addAndGet(requestTime); Response jettyResponse = (response instanceof Response) ? (Response) response : HttpConnection.getCurrentConnection().getResponse(); switch (jettyResponse.getStatus() / 100) { case 1: _responses1xx.incrementAndGet(); break; case 2: _responses2xx.incrementAndGet(); break; case 3: _responses3xx.incrementAndGet(); break; case 4: _responses4xx.incrementAndGet(); break; case 5: _responses5xx.incrementAndGet(); break; default: break; } } } public void statsReset() { _statsStartedAt.set(System.currentTimeMillis()); _requests.set(0); _minRequestTime.set(Long.MAX_VALUE); _maxRequestTime.set(0L); _totalRequestTime.set(0L); _requestsActive.set(0); _requestsActiveMax.set(0); _responses1xx.set(0); _responses2xx.set(0); _responses3xx.set(0); _responses4xx.set(0); _responses5xx.set(0); } public int getRequests() { return _requests.get(); } public int getRequestsActive() { return _requestsActive.get(); } public int getRequestsActiveMax() { return _requestsActiveMax.get(); } public int getResponses1xx() { return _responses1xx.get(); } public int getResponses2xx() { return _responses2xx.get(); } public int getResponses3xx() { return _responses3xx.get(); } public int getResponses4xx() { return _responses4xx.get(); } public int getResponses5xx() { return _responses5xx.get(); } public long getStatsOnMs() { return System.currentTimeMillis() - _statsStartedAt.get(); } public long getRequestTimeMin() { return _minRequestTime.get(); } public long getRequestTimeMax() { return _maxRequestTime.get(); } public long getRequestTimeTotal() { return _totalRequestTime.get(); } public long getRequestTimeAverage() { int requests = getRequests(); return requests == 0 ? 0 : getRequestTimeTotal() / requests; } } jetty-6.1.26/extras/jetty-java5-stats/pom.xml0000644000175000017500000000515611466510412017600 0ustar moonmoon org.mortbay.jetty project 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-java5-stats Jetty Java5 Statistics maven-compiler-plugin 1.5 1.5 maven-antrun-plugin copyfiles install run clean clean run org.mortbay.jetty jetty ${project.version} junit junit jetty-6.1.26/extras/gwt/0000755000175000017500000000000011745736450013572 5ustar moonmoonjetty-6.1.26/extras/gwt/src/0000755000175000017500000000000011745736447014367 5ustar moonmoonjetty-6.1.26/extras/gwt/src/test/0000755000175000017500000000000011745736447015346 5ustar moonmoonjetty-6.1.26/extras/gwt/src/test/java/0000755000175000017500000000000011745736447016267 5ustar moonmoonjetty-6.1.26/extras/gwt/src/test/java/org/0000755000175000017500000000000011745736447017056 5ustar moonmoonjetty-6.1.26/extras/gwt/src/test/java/org/mortbay/0000755000175000017500000000000011745736447020533 5ustar moonmoonjetty-6.1.26/extras/gwt/src/test/java/org/mortbay/gwt/0000755000175000017500000000000011745736447021334 5ustar moonmoonjetty-6.1.26/extras/gwt/src/test/java/org/mortbay/gwt/AsyncRemoteServiceServletTest.java0000644000175000017500000000726611173372264030155 0ustar moonmoon//======================================================================== //Copyright 2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.gwt; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import junit.framework.TestCase; import org.mortbay.jetty.Server; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.servlet.Context; public class AsyncRemoteServiceServletTest extends TestCase { private Server _server; public void setUp() throws Exception { startServer(); } public void tearDown() throws Exception { stopServer(); } private void startServer() throws Exception { _server = new Server(); SelectChannelConnector scc = new SelectChannelConnector(); scc.setPort(8010); _server.addConnector(scc); Context context = new Context(); context.setContextPath("/"); context.addServlet(HelloWorldServiceImpl.class, "/helloworld"); _server.setHandler(context); _server.start(); } private void stopServer() throws Exception { _server.stop(); _server = null; } public void testRPC() throws Exception { // place holder... have to figure out the exact output string the gwt-client sends. // sending "foo" to HelloWorldServiceImpl.sayHello(String); String content = "3ï¿¿0ï¿¿6ï¿¿http://localhost:8080/org.mortbay.gwt.example.HelloWorld/" + "ï¿¿5BA8A5B3E35F40698BB0BF65F390BCF2ï¿¿" + "org.mortbay.gwt.example.client.HelloWorldServiceï¿¿" + "sayHelloï¿¿java.lang.Stringï¿¿fooï¿¿1ï¿¿2ï¿¿3ï¿¿4ï¿¿1ï¿¿5ï¿¿6ï¿¿"; long now = System.currentTimeMillis(); URL url = new URL("http://localhost:8010/helloworld"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "text/x-gwt-rpc; charset=utf-8"); conn.setDoOutput(true); conn.setInstanceFollowRedirects(true); conn.connect(); conn.getOutputStream().write(content.getBytes()); conn.getOutputStream().flush(); isTokenPresent(conn, "//OK"); conn.disconnect(); System.err.println("ELAPSED: " + (System.currentTimeMillis() - now)); } protected static boolean isTokenPresent(HttpURLConnection conn, String token) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; boolean present = false; System.err.println("RESPONSE"); while((line=br.readLine())!=null) { System.err.println(line); if(line.indexOf(token)!=-1) { present = true; break; } } conn.disconnect(); return present; } } jetty-6.1.26/extras/gwt/src/test/java/org/mortbay/gwt/HelloWorldServiceAsync.java0000644000175000017500000000175611173372264026566 0ustar moonmoon//======================================================================== //Copyright 2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.gwt; import com.google.gwt.user.client.rpc.AsyncCallback; public interface HelloWorldServiceAsync { public void sayHello(String sender, AsyncCallback callback); } jetty-6.1.26/extras/gwt/src/test/java/org/mortbay/gwt/HelloWorldService.java0000644000175000017500000000175111173372264025563 0ustar moonmoon//======================================================================== //Copyright 2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.gwt; import com.google.gwt.user.client.rpc.RemoteService; public interface HelloWorldService extends RemoteService { public String sayHello(String sender); } jetty-6.1.26/extras/gwt/src/test/java/org/mortbay/gwt/HelloWorldServiceImpl.java0000644000175000017500000000332411173372264026403 0ustar moonmoon//======================================================================== //Copyright 2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.gwt; import javax.servlet.http.HttpServletRequest; import org.mortbay.util.ajax.Continuation; import org.mortbay.util.ajax.ContinuationSupport; public class HelloWorldServiceImpl extends AsyncRemoteServiceServlet implements HelloWorldService { private static final long serialVersionUID = 1L; public String sayHello(String sender) { HttpServletRequest request = getThreadLocalRequest(); Continuation continuation = ContinuationSupport.getContinuation(request, null); if(continuation.isNew() || !continuation.isPending()) { request.setAttribute("ts", Long.valueOf(System.currentTimeMillis())); continuation.suspend(5000); } long elapsed = System.currentTimeMillis() - ((Long)request.getAttribute("ts")).longValue(); return "Hello world *" + sender + "* resumed after " + elapsed + " ms"; } } jetty-6.1.26/extras/gwt/src/test/resources/0000755000175000017500000000000011745736447017360 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/0000755000175000017500000000000011745736447015313 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/0000755000175000017500000000000011745736447016234 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/org/0000755000175000017500000000000011745736447017023 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/org/mortbay/0000755000175000017500000000000011745736447020500 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/org/mortbay/gwt/0000755000175000017500000000000011745736447021301 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/org/mortbay/gwt/AsyncRemoteServiceServlet.java0000644000175000017500000000470510764137030027250 0ustar moonmoon/* * Copyright 2006 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.mortbay.gwt; import com.google.gwt.user.server.rpc.OpenRemoteServiceServlet; import com.google.gwt.user.server.rpc.UnexpectedException; import javax.servlet.http.HttpServletRequest; import javax.servlet.ServletException; import java.io.IOException; /** * Jetty Continuation support for GWT RPC. * * @author Craig Day (craig@alderaan.com.au) */ public class AsyncRemoteServiceServlet extends OpenRemoteServiceServlet { public static final String PAYLOAD = "com.google.gwt.payload"; private static final String JETTY_RETRY_REQUEST_EXCEPTION = "org.mortbay.jetty.RetryRequest"; /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see com.google.gwt.user.server.rpc.OpenRemoteServiceServlet#readPayloadAsUtf8(javax.servlet.http.HttpServletRequest) */ protected String readPayloadAsUtf8(HttpServletRequest request) throws IOException, ServletException { String payload = (String) request.getAttribute(PAYLOAD); if (payload == null) { payload = super.readPayloadAsUtf8(request); request.setAttribute(PAYLOAD, payload); } return payload; } /** * Overridden to really throw Jetty RetryRequest Exception (as opposed to sending failure to client). * * @param caught the exception */ protected void doUnexpectedFailure(Throwable caught) { throwIfRetryRequest(caught); super.doUnexpectedFailure(caught); } /** * Throws the Jetty RetryRequest if found. * * @param caught the exception */ protected void throwIfRetryRequest(Throwable caught) { if (caught instanceof UnexpectedException) { caught = caught.getCause(); } if (JETTY_RETRY_REQUEST_EXCEPTION.equals(caught.getClass().getName())) { throw (RuntimeException) caught; } } } jetty-6.1.26/extras/gwt/src/main/java/com/0000755000175000017500000000000011745736447017012 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/com/google/0000755000175000017500000000000011745736447020266 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/com/google/gwt/0000755000175000017500000000000011745736447021067 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/com/google/gwt/user/0000755000175000017500000000000011745736447022045 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/com/google/gwt/user/server/0000755000175000017500000000000011745736447023353 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/com/google/gwt/user/server/rpc/0000755000175000017500000000000011745736450024131 5ustar moonmoonjetty-6.1.26/extras/gwt/src/main/java/com/google/gwt/user/server/rpc/OpenRemoteServiceServlet.java0000644000175000017500000005574111046501446031740 0ustar moonmoon/* * Copyright 2006 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.user.server.rpc; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.text.ParseException; import java.util.HashMap; import java.util.Map; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException; import com.google.gwt.user.client.rpc.SerializationException; /** * RemoteServiceServlet changes to allow extensions required for Jetty Continuatution support. * * Changes: * * readPayloadAsUtf8 now protected non-static * * @author Craig Day (craig@alderaan.com.au) * */ public class OpenRemoteServiceServlet extends HttpServlet implements SerializationPolicyProvider { /* * These members are used to get and set the different HttpServletResponse and * HttpServletRequest headers. */ private static final String ACCEPT_ENCODING = "Accept-Encoding"; private static final String CHARSET_UTF8 = "UTF-8"; private static final String CONTENT_ENCODING = "Content-Encoding"; private static final String CONTENT_ENCODING_GZIP = "gzip"; private static final String CONTENT_TYPE_TEXT_PLAIN_UTF8 = "text/plain; charset=utf-8"; private static final String GENERIC_FAILURE_MSG = "The call failed on the server; see server log for details"; private static final String EXPECTED_CONTENT_TYPE = "text/x-gwt-rpc"; private static final String EXPECTED_CHARSET = "charset=utf-8"; /** * Controls the compression threshold at and below which no compression will * take place. */ private static final int UNCOMPRESSED_BYTE_SIZE_LIMIT = 256; /** * Return true if the response object accepts Gzip encoding. This is done by * checking that the accept-encoding header specifies gzip as a supported * encoding. */ private static boolean acceptsGzipEncoding(HttpServletRequest request) { assert (request != null); String acceptEncoding = request.getHeader(ACCEPT_ENCODING); if (null == acceptEncoding) { return false; } return (acceptEncoding.indexOf(CONTENT_ENCODING_GZIP) != -1); } /** * This method attempts to estimate the number of bytes that a string will * consume when it is sent out as part of an HttpServletResponse. This really * a hack since we are assuming that every character will consume two bytes * upon transmission. This is definitely not true since some characters * actually consume more than two bytes and some consume less. This is even * less accurate if the string is converted to UTF8. However, it does save us * from converting every string that we plan on sending back to UTF8 just to * determine that we should not compress it. */ private static int estimateByteSize(final String buffer) { return (buffer.length() * 2); } /** * Read the payload as UTF-8 from the request stream. */ protected String readPayloadAsUtf8(HttpServletRequest request) throws IOException, ServletException { int contentLength = request.getContentLength(); if (contentLength == -1) { // Content length must be known. throw new ServletException("Content-Length must be specified"); } String contentType = request.getContentType(); boolean contentTypeIsOkay = false; // Content-Type must be specified. /*if (contentType != null) { // The type must be plain text. if (contentType.startsWith("text/plain")) { // And it must be UTF-8 encoded (or unspecified, in which case we assume // that it's either UTF-8 or ASCII). if (contentType.indexOf("charset=") == -1) { contentTypeIsOkay = true; } else if (contentType.indexOf("charset=utf-8") != -1) { contentTypeIsOkay = true; } } } if (!contentTypeIsOkay) { throw new ServletException( "Content-Type must be 'text/plain' with 'charset=utf-8' (or unspecified charset)"); }*/ if (contentType != null) { contentType = contentType.toLowerCase(); /* * The Content-Type must be text/x-gwt-rpc. * * NOTE:We use startsWith because some servlet engines, i.e. Tomcat, do * not remove the charset component but others do. */ if (contentType.startsWith(EXPECTED_CONTENT_TYPE)) { String characterEncoding = request.getCharacterEncoding(); if (characterEncoding != null) { /* * TODO: It would seem that we should be able to use equalsIgnoreCase * here instead of indexOf. Need to be sure that servlet engines * return a properly parsed character encoding string if we decide to * make this change. */ if (characterEncoding.toLowerCase().indexOf(CHARSET_UTF8.toLowerCase()) != -1) contentTypeIsOkay = true; } } } if (!contentTypeIsOkay) { throw new ServletException("Content-Type must be '" + EXPECTED_CONTENT_TYPE + "' with '" + EXPECTED_CHARSET + "'."); } InputStream in = request.getInputStream(); try { byte[] payload = new byte[contentLength]; int offset = 0; int len = contentLength; int byteCount; while (offset < contentLength) { byteCount = in.read(payload, offset, len); if (byteCount == -1) { throw new ServletException("Client did not send " + contentLength + " bytes as expected"); } offset += byteCount; len -= byteCount; } return new String(payload, "UTF-8"); } finally { if (in != null) { in.close(); } } } private final ThreadLocal perThreadRequest = new ThreadLocal(); private final ThreadLocal perThreadResponse = new ThreadLocal(); /** * A cache of moduleBaseURL and serialization policy strong name to * {@link SerializationPolicy}. */ private final Map serializationPolicyCache = new HashMap(); /** * The default constructor. */ public OpenRemoteServiceServlet() { } /** * Standard HttpServlet method: handle the POST. *

* This doPost method swallows ALL exceptions, logs them in the * ServletContext, and returns a GENERIC_FAILURE_MSG response with status code * 500. */ public final void doPost(HttpServletRequest request, HttpServletResponse response) { try { // Store the request & response objects in thread-local storage. // perThreadRequest.set(request); perThreadResponse.set(response); // Read the request fully. // String requestPayload = readPayloadAsUtf8(request); // Let subclasses see the serialized request. // onBeforeRequestDeserialized(requestPayload); // Invoke the core dispatching logic, which returns the serialized // result. // String responsePayload = processCall(requestPayload); // Let subclasses see the serialized response. // onAfterResponseSerialized(responsePayload); // Write the response. // writeResponse(request, response, responsePayload); return; } catch (Throwable e) { // Give a subclass a chance to either handle the exception or rethrow it // doUnexpectedFailure(e); } finally { // null the thread-locals to avoid holding request/response // perThreadRequest.set(null); perThreadResponse.set(null); } } /** * Process a call originating from the given request. Uses the * {@link RPC#invokeAndEncodeResponse(Object,java.lang.reflect.Method,Object[])} * method to do the actual work. *

* Subclasses may optionally override this method to handle the payload in any * way they desire (by routing the request to a framework component, for * instance). The {@link HttpServletRequest} and {@link HttpServletResponse} * can be accessed via the {@link #getThreadLocalRequest()} and * {@link #getThreadLocalResponse()} methods. *

* This is public so that it can be unit tested easily without HTTP. * * @param payload the UTF-8 request payload * @return a string which encodes either the method's return, a checked * exception thrown by the method, or an * {@link IncompatibleRemoteServiceException} * @throws SerializationException if we cannot serialize the response * @throws UnexpectedException if the invocation throws a checked exception * that is not declared in the service method's signature * @throws RuntimeException if the service method throws an unchecked * exception (the exception will be the one thrown by the service) */ public String processCall(String payload) throws SerializationException { try { RPCRequest rpcRequest = RPC.decodeRequest(payload, this.getClass(), this); return RPC.invokeAndEncodeResponse(this, rpcRequest.getMethod(), rpcRequest.getParameters(), rpcRequest.getSerializationPolicy()); } catch (IncompatibleRemoteServiceException ex) { return RPC.encodeResponseForFailure(null, ex); } } /** * Override this method to control what should happen when an exception * escapes the {@link #processCall(String)} method. The default implementation * will log the failure and send a generic failure response to the client.

*

* An "expected failure" is an exception thrown by a service method that is * declared in the signature of the service method. These exceptions are * serialized back to the client, and are not passed to this method. This * method is called only for exceptions or errors that are not part of the * service method's signature, or that result from SecurityExceptions, * SerializationExceptions, or other failures within the RPC framework.

*

* Note that if the desired behavior is to both send the GENERIC_FAILURE_MSG * response AND to rethrow the exception, then this method should first send * the GENERIC_FAILURE_MSG response itself (using getThreadLocalResponse), and * then rethrow the exception. Rethrowing the exception will cause it to * escape into the servlet container. * * @param e the exception which was thrown */ protected void doUnexpectedFailure(Throwable e) { ServletContext servletContext = getServletContext(); servletContext.log("Exception while dispatching incoming RPC call", e); // Send GENERIC_FAILURE_MSG with 500 status. // respondWithFailure(getThreadLocalResponse()); } /** * Gets the HttpServletRequest object for the current call. It * is stored thread-locally so that simultaneous invocations can have * different request objects. */ protected final HttpServletRequest getThreadLocalRequest() { return (HttpServletRequest) perThreadRequest.get(); } /** * Gets the HttpServletResponse object for the current call. It * is stored thread-locally so that simultaneous invocations can have * different response objects. */ protected final HttpServletResponse getThreadLocalResponse() { return (HttpServletResponse) perThreadResponse.get(); } /** * Override this method to examine the serialized response that will be * returned to the client. The default implementation does nothing and need * not be called by subclasses. */ protected void onAfterResponseSerialized(String serializedResponse) { } /** * Override this method to examine the serialized version of the request * payload before it is deserialized into objects. The default implementation * does nothing and need not be called by subclasses. */ protected void onBeforeRequestDeserialized(String serializedRequest) { } /** * Determines whether the response to a given servlet request should or should * not be GZIP compressed. This method is only called in cases where the * requestor accepts GZIP encoding. *

* This implementation currently returns true if the response * string's estimated byte length is longer than 256 bytes. Subclasses can * override this logic. *

* * @param request the request being served * @param response the response that will be written into * @param responsePayload the payload that is about to be sent to the client * @return true if responsePayload should be GZIP compressed, * otherwise false. */ protected boolean shouldCompressResponse(HttpServletRequest request, HttpServletResponse response, String responsePayload) { return estimateByteSize(responsePayload) > UNCOMPRESSED_BYTE_SIZE_LIMIT; } /** * Called when the machinery of this class itself has a problem, rather than * the invoked third-party method. It writes a simple 500 message back to the * client. */ private void respondWithFailure(HttpServletResponse response) { try { response.setContentType("text/plain"); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getOutputStream().write(GENERIC_FAILURE_MSG.getBytes()); } catch (IOException e) { getServletContext().log( "respondWithFailure failed while sending the previous failure to the client", e); } } /** * Write the response payload to the response stream. */ private void writeResponse(HttpServletRequest request, HttpServletResponse response, String responsePayload) throws IOException { byte[] reply = responsePayload.getBytes(CHARSET_UTF8); String contentType = CONTENT_TYPE_TEXT_PLAIN_UTF8; if (acceptsGzipEncoding(request) && shouldCompressResponse(request, response, responsePayload)) { // Compress the reply and adjust headers. // ByteArrayOutputStream output = null; GZIPOutputStream gzipOutputStream = null; Throwable caught = null; try { output = new ByteArrayOutputStream(reply.length); gzipOutputStream = new GZIPOutputStream(output); gzipOutputStream.write(reply); gzipOutputStream.finish(); gzipOutputStream.flush(); response.setHeader(CONTENT_ENCODING, CONTENT_ENCODING_GZIP); reply = output.toByteArray(); } catch (IOException e) { caught = e; } finally { if (null != gzipOutputStream) { gzipOutputStream.close(); } if (null != output) { output.close(); } } if (caught != null) { getServletContext().log("Unable to compress response", caught); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); return; } } // Send the reply. // response.setContentLength(reply.length); response.setContentType(contentType); response.setStatus(HttpServletResponse.SC_OK); response.getOutputStream().write(reply); } public final SerializationPolicy getSerializationPolicy(String moduleBaseURL, String strongName) { SerializationPolicy serializationPolicy = getCachedSerializationPolicy(moduleBaseURL, strongName); if (serializationPolicy != null) return serializationPolicy; serializationPolicy = doGetSerializationPolicy(getThreadLocalRequest(), moduleBaseURL, strongName); if (serializationPolicy == null) { // Failed to get the requested serialization policy; use the default getServletContext().log( "WARNING: Failed to get the SerializationPolicy '" + strongName + "' for module '" + moduleBaseURL + "'; a legacy, 1.3.3 compatible, serialization policy will be used. You may experience SerializationExceptions as a result."); serializationPolicy = RPC.getDefaultSerializationPolicy(); } // This could cache null or an actual instance. Either way we will not // attempt to lookup the policy again. putCachedSerializationPolicy(moduleBaseURL, strongName, serializationPolicy); return serializationPolicy; } private SerializationPolicy getCachedSerializationPolicy(String moduleBaseURL, String strongName) { synchronized (serializationPolicyCache) { return serializationPolicyCache.get(moduleBaseURL + strongName); } } private void putCachedSerializationPolicy(String moduleBaseURL, String strongName, SerializationPolicy serializationPolicy) { synchronized (serializationPolicyCache) { serializationPolicyCache.put(moduleBaseURL + strongName, serializationPolicy); } } /** * Gets the {@link SerializationPolicy} for given module base URL and strong * name if there is one. * * Override this method to provide a {@link SerializationPolicy} using an * alternative approach. * * @param request the HTTP request being serviced * @param moduleBaseURL as specified in the incoming payload * @param strongName a strong name that uniquely identifies a serialization * policy file * @return a {@link SerializationPolicy} for the given module base URL and * strong name, or null if there is none */ protected SerializationPolicy doGetSerializationPolicy(HttpServletRequest request, String moduleBaseURL, String strongName) { // The request can tell you the path of the web app relative to the // container root. String contextPath = request.getContextPath(); String modulePath = null; if (moduleBaseURL != null) { try { modulePath = new URL(moduleBaseURL).getPath(); } catch (MalformedURLException ex) { // log the information, we will default getServletContext().log("Malformed moduleBaseURL: " + moduleBaseURL, ex); } } SerializationPolicy serializationPolicy = null; /* * Check that the module path must be in the same web app as the servlet * itself. If you need to implement a scheme different than this, override * this method. */ if (modulePath == null || !modulePath.startsWith(contextPath)) { String message = "ERROR: The module path requested, " + modulePath + ", is not in the same web application as this servlet, " + contextPath + ". Your module may not be properly configured or your client and server code maybe out of date."; getServletContext().log(message); } else { // Strip off the context path from the module base URL. It should be a // strict prefix. String contextRelativePath = modulePath.substring(contextPath.length()); String serializationPolicyFilePath = SerializationPolicyLoader.getSerializationPolicyFileName(contextRelativePath + strongName); // Open the RPC resource file read its contents. InputStream is = getServletContext().getResourceAsStream( serializationPolicyFilePath); try { if (is != null) { try { serializationPolicy = SerializationPolicyLoader.loadFromStream(is, null); } catch (ParseException e) { getServletContext().log( "ERROR: Failed to parse the policy file '" + serializationPolicyFilePath + "'", e); } catch (IOException e) { getServletContext().log( "ERROR: Could not read the policy file '" + serializationPolicyFilePath + "'", e); } } else { String message = "ERROR: The serialization policy file '" + serializationPolicyFilePath + "' was not found; did you forget to include it in this deployment?"; getServletContext().log(message); } } finally { if (is != null) { try { is.close(); } catch (IOException e) { // Ignore this error } } } } return serializationPolicy; } } jetty-6.1.26/extras/gwt/pom.xml0000644000175000017500000000356411466510412015103 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-gwt jar Jetty Contrib :: jetty-gwt RemoteServiceServlet maven-compiler-plugin 1.5 1.5 true gwt-maven-repo GWT Maven Repo http://gwt-maven.googlecode.com/svn/trunk/mavenrepo com.google.gwt gwt-servlet ${gwt-version} org.mortbay.jetty servlet-api ${servlet-version} provided org.mortbay.jetty jetty ${project.version} test junit junit test 1.5.0-rc1 jetty-6.1.26/extras/threadpool/0000755000175000017500000000000011745736450015132 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/0000755000175000017500000000000011745736450015721 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/0000755000175000017500000000000011745736450016645 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/java/0000755000175000017500000000000011745736450017566 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/java/org/0000755000175000017500000000000011745736450020355 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/java/org/mortbay/0000755000175000017500000000000011745736450022032 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/java/org/mortbay/thread/0000755000175000017500000000000011745736450023301 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/java/org/mortbay/thread/concurrent/0000755000175000017500000000000011745736450025463 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/java/org/mortbay/thread/concurrent/ThreadPool.java0000644000175000017500000001634511063754660030374 0ustar moonmoon// ======================================================================== // Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.thread.concurrent; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.mortbay.component.LifeCycle; import org.mortbay.log.Log; /* ------------------------------------------------------------ */ /** Jetty ThreadPool using java 5 ThreadPoolExecutor * This class wraps a {@link ThreadPoolExecutor} with the {@link org.mortbay.thread.ThreadPool} and * {@link LifeCycle} interfaces so that it may be used by the Jetty {@link org.mortbay.jetty.Server} * * @author gregw * */ public class ThreadPool extends ThreadPoolExecutor implements org.mortbay.thread.ThreadPool, LifeCycle { /* ------------------------------------------------------------ */ /** Default constructor. * Core size is 32, max pool size is 256, pool thread timeout after 60 seconds and * an unbounded {@link LinkedBlockingQueue} is used for the job queue; */ public ThreadPool() { super(32,256,60,TimeUnit.SECONDS,new LinkedBlockingQueue()); } /* ------------------------------------------------------------ */ /** Default constructor. * Core size is 32, max pool size is 256, pool thread timeout after 60 seconds * @param queueSize if -1, an unbounded {@link LinkedBlockingQueue} is used, if 0 then a * {@link SynchronousQueue} is used, other a {@link ArrayBlockingQueue} of the given size is used. */ public ThreadPool(int queueSize) { super(32,256,60,TimeUnit.SECONDS, queueSize<0?new LinkedBlockingQueue() : (queueSize==0?new SynchronousQueue() :new ArrayBlockingQueue(queueSize))); } /* ------------------------------------------------------------ */ /** Size constructor. * an unbounded {@link LinkedBlockingQueue} is used for the jobs queue; */ public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit) { super(corePoolSize,maximumPoolSize,keepAliveTime,unit,new LinkedBlockingQueue()); } /* ------------------------------------------------------------ */ public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) { super(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue); } /* ------------------------------------------------------------ */ public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) { super(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,handler); } /* ------------------------------------------------------------ */ public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { super(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler); } /* ------------------------------------------------------------ */ public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory) { super(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory); } /* ------------------------------------------------------------ */ public boolean dispatch(Runnable job) { try { execute(job); return true; } catch(RejectedExecutionException e) { Log.warn(e); return false; } } /* ------------------------------------------------------------ */ public int getIdleThreads() { return getPoolSize()-getActiveCount(); } /* ------------------------------------------------------------ */ public int getThreads() { return getPoolSize(); } /* ------------------------------------------------------------ */ public boolean isLowOnThreads() { return getActiveCount()>=getMaximumPoolSize(); } /* ------------------------------------------------------------ */ public void join() throws InterruptedException { this.awaitTermination(Long.MAX_VALUE,TimeUnit.MILLISECONDS); } /* ------------------------------------------------------------ */ public boolean isFailed() { return false; } /* ------------------------------------------------------------ */ public boolean isRunning() { return !isTerminated() && !isTerminating(); } /* ------------------------------------------------------------ */ public boolean isStarted() { return !isTerminated() && !isTerminating(); } /* ------------------------------------------------------------ */ public boolean isStarting() { return false; } /* ------------------------------------------------------------ */ public boolean isStopped() { return isTerminated(); } /* ------------------------------------------------------------ */ public boolean isStopping() { return isTerminating(); } /* ------------------------------------------------------------ */ public void start() throws Exception { if (isTerminated() || isTerminating() || isShutdown()) throw new IllegalStateException("Cannot restart"); } /* ------------------------------------------------------------ */ public void stop() throws Exception { super.shutdown(); if (!super.awaitTermination(60,TimeUnit.SECONDS)) super.shutdownNow(); } /* ------------------------------------------------------------ */ public void addLifeCycleListener(LifeCycle.Listener listener) { throw new UnsupportedOperationException(); } /* ------------------------------------------------------------ */ public void removeLifeCycleListener(LifeCycle.Listener listener) { } } jetty-6.1.26/extras/threadpool/src/main/resources/0000755000175000017500000000000011745736450020657 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/resources/org/0000755000175000017500000000000011745736450021446 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/resources/org/mortbay/0000755000175000017500000000000011745736450023123 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/resources/org/mortbay/thread/0000755000175000017500000000000011745736450024372 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/resources/org/mortbay/thread/concurrent/0000755000175000017500000000000011745736450026554 5ustar moonmoonjetty-6.1.26/extras/threadpool/src/main/resources/org/mortbay/thread/concurrent/management/0000755000175000017500000000000011745736450030670 5ustar moonmoon././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootjetty-6.1.26/extras/threadpool/src/main/resources/org/mortbay/thread/concurrent/management/ThreadPool-mbean.propertiesjetty-6.1.26/extras/threadpool/src/main/resources/org/mortbay/thread/concurrent/management/ThreadPoo0000644000175000017500000000133210536001467032465 0ustar moonmoonThreadPool: A thread pool with a job queue activeCount: Returns the approximate number of threads that are actively executing tasks. completedTaskCount: Returns the approximate total number of tasks that have completed execution. corePoolSize: Returns the core number of threads. largestPoolSize: Returns the largest number of threads that have ever simultaneously been in the pool. maximumPoolSize: Returns the maximum allowed number of threads. poolSize: Returns the current number of threads in the pool. taskCount: Returns the approximate total number of tasks that have been scheduled for execution. shutdown: Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. jetty-6.1.26/extras/threadpool/pom.xml0000644000175000017500000000405711466510412016441 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-java5-threadpool Jetty Java5 Threadpool maven-compiler-plugin 1.5 1.5 maven-antrun-plugin copyfiles install run clean clean run org.mortbay.jetty jetty-util ${project.version} junit junit test jetty-6.1.26/extras/spring/0000755000175000017500000000000011745736450014273 5ustar moonmoonjetty-6.1.26/extras/spring/src/0000755000175000017500000000000011745736450015062 5ustar moonmoonjetty-6.1.26/extras/spring/src/main/0000755000175000017500000000000011745736450016006 5ustar moonmoonjetty-6.1.26/extras/spring/src/main/java/0000755000175000017500000000000011745736450016727 5ustar moonmoonjetty-6.1.26/extras/spring/src/main/java/org/0000755000175000017500000000000011745736450017516 5ustar moonmoonjetty-6.1.26/extras/spring/src/main/java/org/mortbay/0000755000175000017500000000000011745736450021173 5ustar moonmoonjetty-6.1.26/extras/spring/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736450022332 5ustar moonmoonjetty-6.1.26/extras/spring/src/main/java/org/mortbay/jetty/spring/0000755000175000017500000000000011745736450023634 5ustar moonmoonjetty-6.1.26/extras/spring/src/main/java/org/mortbay/jetty/spring/jee/0000755000175000017500000000000011745736450024377 5ustar moonmoonjetty-6.1.26/extras/spring/src/main/java/org/mortbay/jetty/spring/jee/JEEContextLoader.java0000644000175000017500000000402410535762567030345 0ustar moonmoon//======================================================================== //$Id: JEEContextLoader.java 1360 2006-12-07 09:57:11Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.spring.jee; import javax.servlet.ServletContext; import org.mortbay.log.Log; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.web.context.ContextLoader; /** * JEEContextLoader * * Loads the spring-ejb.xml files describing ejbs from any META-INF dir in any * jar or classes dir on the runtime classpath. * * Also loads the jee bootstrapper to perform resource injection etc on the * ejbs. The bootstrapper config file is part of the jetty spring jar. * * This spring context will be the parent context of the usual spring web app * context (ie applicationContext.xml). */ public class JEEContextLoader extends ContextLoader { protected ApplicationContext loadParentContext(ServletContext servletContext) throws BeansException { Log.info("Bootstrapping JEE application context"); ApplicationContext parentContext = new ClassPathXmlApplicationContext( new String[] { "classpath*:/META-INF/spring-ejb-jar.xml"}); return parentContext; } } jetty-6.1.26/extras/spring/src/main/java/org/mortbay/jetty/spring/jee/JEEContextLoaderListener.java0000644000175000017500000000265410535577016032053 0ustar moonmoon//======================================================================== //$Id: JEEContextLoaderListener.java 1359 2006-12-06 17:29:50Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.spring.jee; import org.springframework.web.context.ContextLoader; import org.springframework.web.context.ContextLoaderListener; /** * JEEContextLoaderListener * * This creates the JEEContextLoader to hook the pitchfork ebj3 * environment into webapps. * */ public class JEEContextLoaderListener extends ContextLoaderListener { /** * @see org.springframework.web.context.ContextLoaderListener#createContextLoader() */ protected ContextLoader createContextLoader() { return new JEEContextLoader(); } } jetty-6.1.26/extras/spring/src/main/java/org/mortbay/jetty/spring/Main.java0000644000175000017500000000253511044235703025353 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.spring; import org.mortbay.jetty.Server; import org.mortbay.resource.Resource; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.UrlResource; public class Main { public static void main(String[] args) throws Exception { Resource config=Resource.newResource(args.length==1?args[0]:"etc/jetty-spring.xml"); XmlBeanFactory bf = new XmlBeanFactory(new UrlResource(config.getURL())); Server server = (Server) bf.getBean(args.length==2?args[1]:"Server"); server.join(); } } jetty-6.1.26/extras/spring/src/main/resources/0000755000175000017500000000000011745736450020020 5ustar moonmoonjetty-6.1.26/extras/spring/pom.xml0000644000175000017500000000222311466510412015573 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-spring Jetty Spring junit junit test org.mortbay.jetty jetty ${project.version} org.mortbay.jetty jetty-plus ${project.version} org.springframework spring 1.2.8 jetty-6.1.26/extras/spring/etc/0000755000175000017500000000000011745736450015046 5ustar moonmoonjetty-6.1.26/extras/spring/etc/jetty-spring.xml0000644000175000017500000000521310610004161020201 0ustar moonmoon jetty-6.1.26/extras/sslengine/0000755000175000017500000000000011745736450014760 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/0000755000175000017500000000000011745736450015547 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/test/0000755000175000017500000000000011745736450016526 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/test/java/0000755000175000017500000000000011745736450017447 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/test/java/org/0000755000175000017500000000000011745736450020236 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/test/java/org/mortbay/0000755000175000017500000000000011745736450021713 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736450023052 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/test/java/org/mortbay/jetty/security/0000755000175000017500000000000011745736450024721 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/test/java/org/mortbay/jetty/security/SSLEngineTest.java0000644000175000017500000003213611351770332030206 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== // JettyTest.java -- // // Junit test that shows the Jetty SSL bug. // package org.mortbay.jetty.security; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.Socket; import java.net.URL; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.jetty.security.SslSelectChannelConnector; import org.mortbay.jetty.servlet.ServletHandler; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.util.IO; /** * HttpServer Tester. */ public class SSLEngineTest extends TestCase { // ~ Static fields/initializers // --------------------------------------------- // Useful constants private static final int BODY_SIZE = 300; private static final String HELLO_WORLD="Hello world\r\n"; private static final String JETTY_VERSION=Server.getVersion(); private static final String PROTOCOL_VERSION="2.0"; /** The request. */ private static final String REQUEST0_HEADER="POST / HTTP/1.1\n"+"Host: localhost\n"+"Content-Type: text/xml\n"+"Content-Length: "; private static final String REQUEST1_HEADER="POST / HTTP/1.1\n"+"Host: localhost\n"+"Content-Type: text/xml\n"+"Connection: close\n"+"Content-Length: "; private static final String REQUEST_CONTENT="\n" +"\n"+""; private static final String REQUEST0=REQUEST0_HEADER+REQUEST_CONTENT.getBytes().length+"\n\n"+REQUEST_CONTENT; private static final String REQUEST1=REQUEST1_HEADER+REQUEST_CONTENT.getBytes().length+"\n\n"+REQUEST_CONTENT; /** The expected response. */ private static final String RESPONSE0="HTTP/1.1 200 OK\n"+"Content-Length: "+HELLO_WORLD.length()+"\n"+"Server: Jetty("+JETTY_VERSION+")\n"+'\n'+"Hello world\n"; private static final String RESPONSE1="HTTP/1.1 200 OK\n"+"Connection: close\n"+"Server: Jetty("+JETTY_VERSION+")\n"+'\n'+"Hello world\n"; private static class CredulousTM implements TrustManager, X509TrustManager { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return; } public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return; } } private static final TrustManager[] s_dummyTrustManagers=new TrustManager[] { new CredulousTM() }; /** * Feed the server the entire request at once. * * @throws Exception */ public void testBigResponse() throws Exception { Server server=new Server(); SslSelectChannelConnector connector=new SslSelectChannelConnector(); String keystore = System.getProperty("user.dir")+File.separator+"src"+File.separator+"test"+File.separator+"resources"+File.separator+"keystore"; connector.setPort(0); connector.setKeystore(keystore); connector.setPassword("storepwd"); connector.setKeyPassword("keypwd"); server.setConnectors(new Connector[] { connector }); server.setHandler(new HelloWorldHandler()); server.start(); SSLContext ctx=SSLContext.getInstance("SSLv3"); ctx.init(null,s_dummyTrustManagers,new java.security.SecureRandom()); int port=connector.getLocalPort(); Socket client=ctx.getSocketFactory().createSocket("localhost",port); OutputStream os=client.getOutputStream(); String request = "GET /?dump=102400 HTTP/1.1\r\n"+ "Host: localhost:8080\r\n"+ "Connection: close\r\n"+ "\r\n"; os.write(request.getBytes()); os.flush(); String response = IO.toString(client.getInputStream()); System.err.println("response "+response.length()); assertTrue(response.length()>102400); } // ~ Methods // ---------------------------------------------------------------- /** * Feed the server the entire request at once. * * @throws Exception */ public void testRequest1_jetty_https() throws Exception { Server server=new Server(); SslSelectChannelConnector connector=new SslSelectChannelConnector(); String keystore = System.getProperty("user.dir")+File.separator+"src"+File.separator+"test"+File.separator+"resources"+File.separator+"keystore"; connector.setPort(0); connector.setKeystore(keystore); connector.setPassword("storepwd"); connector.setKeyPassword("keypwd"); server.setConnectors(new Connector[] { connector }); server.setHandler(new HelloWorldHandler()); final int numConns=200; Socket[] socket=new Socket[numConns]; try { server.start(); SSLContext ctx=SSLContext.getInstance("SSLv3"); ctx.init(null,s_dummyTrustManagers,new java.security.SecureRandom()); int port=connector.getLocalPort(); for (int i=0; i -1) bytes+=len; is.close(); assertEquals(BODY_SIZE,servlet.bytes); assertEquals(BODY_SIZE,bytes); } finally { server.stop(); } } public static class TestServlet extends HttpServlet { public int bytes=0; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/plain"); resp.setBufferSize(128); byte[] b = new byte[BODY_SIZE]; int len = 0; InputStream is = req.getInputStream(); // !!!! UNDER HTTPS, FIRST CHUNK IS READ HERE BUT THEN SERVER IS // WAITING FOR // !!!! MORE DATA while ((len = is.read(b)) > -1) { bytes+=len; } OutputStream os = resp.getOutputStream(); for (int i = 0; i < BODY_SIZE; i++) { b[i] = 'x'; } os.write(b); resp.flushBuffer(); } } } jetty-6.1.26/extras/sslengine/src/test/java/org/mortbay/jetty/security/SslRenegotiateTest.java0000644000175000017500000002300311360714754031346 0ustar moonmoonpackage org.mortbay.jetty.security; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngineResult; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import javax.net.ssl.SSLEngineResult.HandshakeStatus; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.io.nio.IndirectNIOBuffer; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.log.Log; import org.mortbay.util.StringUtil; public class SslRenegotiateTest extends TestCase { static TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType ) { } public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType ) { } } }; static HostnameVerifier hostnameVerifier = new HostnameVerifier() { public boolean verify( String urlHostName, SSLSession session ) { Log.warn( "Warning: URL Host: " + urlHostName + " vs." + session.getPeerHost() ); return true; } }; ByteBuffer _outAppB; ByteBuffer _outPacketB; ByteBuffer _inAppB; ByteBuffer _inPacketB; SocketChannel _socket; SSLEngine _engine; public void testRenegNIO() throws Exception { /* TODO This fails on JVM's with fixed security doRequests(new SslSelectChannelConnector(),true); */ } public void testNoRenegNIO() throws Exception { doRequests(new SslSelectChannelConnector(),false); } public void testRenegBIO() throws Exception { /* TODO - this test does not always work??? need to investigate why doRequests(new SslSocketConnector(),true); */ } public void testNoRenegBIO() throws Exception { /* TODO - this test does not always work??? need to investigate why doRequests(new SslSocketConnector(),false); */ } public void doRequests(SslSocketConnector connector,boolean reneg) throws Exception { String keystore = System.getProperty("user.dir")+File.separator+"src"+File.separator+"test"+File.separator+"resources"+File.separator+"keystore"; connector.setPort(0); connector.setKeystore(keystore); connector.setPassword("storepwd"); connector.setKeyPassword("keypwd"); connector.setAllowRenegotiate(reneg); doRequests((Connector)connector,reneg); } public void doRequests(SslSelectChannelConnector connector,boolean reneg) throws Exception { String keystore = System.getProperty("user.dir")+File.separator+"src"+File.separator+"test"+File.separator+"resources"+File.separator+"keystore"; connector.setPort(0); connector.setKeystore(keystore); connector.setPassword("storepwd"); connector.setKeyPassword("keypwd"); connector.setAllowRenegotiate(reneg); doRequests((Connector)connector,reneg); } public void doRequests(Connector connector,boolean reneg) throws Exception { Server server=new Server(); try { server.setConnectors(new Connector[] { connector }); server.setHandler(new HelloWorldHandler()); server.start(); SocketAddress addr = new InetSocketAddress("localhost",connector.getLocalPort()); _socket = SocketChannel.open(addr); _socket.configureBlocking(true); SSLContext context=SSLContext.getInstance("SSL"); context.init( null, trustAllCerts, new java.security.SecureRandom() ); _engine = context.createSSLEngine(); _engine.setUseClientMode(true); SSLSession session=_engine.getSession(); _outAppB = ByteBuffer.allocate(session.getApplicationBufferSize()); _outPacketB = ByteBuffer.allocate(session.getPacketBufferSize()); _inAppB = ByteBuffer.allocate(session.getApplicationBufferSize()); _inPacketB = ByteBuffer.allocate(session.getPacketBufferSize()); _outAppB.put("GET /1 HTTP/1.1\r\nHost: localhost\r\n\r\n".getBytes(StringUtil.__ISO_8859_1)); _outAppB.flip(); _engine.beginHandshake(); runHandshake(); doWrap(); doUnwrap(); _inAppB.flip(); String response=new IndirectNIOBuffer(_inAppB,true).toString(); // System.err.println(response); assertTrue(response.startsWith("HTTP/1.1 200 OK")); if (response.indexOf("HELLO WORLD")<0) { _inAppB.clear(); doUnwrap(); _inAppB.flip(); response=new IndirectNIOBuffer(_inAppB,true).toString(); } assertTrue(response.indexOf("HELLO WORLD")>=0); _inAppB.clear(); _outAppB.clear(); _outAppB.put("GET /2 HTTP/1.1\r\nHost: localhost\r\n\r\n".getBytes(StringUtil.__ISO_8859_1)); _outAppB.flip(); try { session.invalidate(); _engine.beginHandshake(); runHandshake(); doWrap(); doUnwrap(); _inAppB.flip(); response=new IndirectNIOBuffer(_inAppB,true).toString(); assertTrue(response.startsWith("HTTP/1.1 200 OK")); if (response.indexOf("HELLO WORLD")<0) { doUnwrap(); _inAppB.flip(); response=new IndirectNIOBuffer(_inAppB,true).toString(); } assertTrue(response.indexOf("HELLO WORLD")>0); assertTrue(reneg); } catch(IOException e) { // System.err.println(e); assertFalse(reneg); return; } } finally { server.stop(); } } void runHandshake() throws Exception { SSLEngineResult result; while (true) { //System.err.println(); //System.err.println(_engine.getHandshakeStatus()); switch(_engine.getHandshakeStatus()) { case NEED_TASK: { //System.err.println("running task"); _engine.getDelegatedTask().run(); break; } case NEED_WRAP: { doWrap(); break; } case NEED_UNWRAP: { doUnwrap(); break; } default: return; } } } private void doWrap() throws Exception { SSLEngineResult result =_engine.wrap(_outAppB,_outPacketB); // System.err.println("wrapped "+result.bytesConsumed()+" to "+result.bytesProduced()); _outPacketB.flip(); while (_outPacketB.hasRemaining()) { int p = _outPacketB.remaining(); int l =_socket.write(_outPacketB); // System.err.println("wrote "+l+" of "+p); } _outPacketB.clear(); } private void doUnwrap() throws Exception { _inPacketB.clear(); int l=_socket.read(_inPacketB); // System.err.println("read "+l); if (l<0) throw new IOException("EOF"); _inPacketB.flip(); SSLEngineResult result; do { result =_engine.unwrap(_inPacketB,_inAppB); // System.err.println("unwrapped "+result.bytesConsumed()+" to "+result.bytesProduced()+" "+_engine.getHandshakeStatus()); } while(result.bytesConsumed()>0 && _inPacketB.remaining()>0 && (_engine.getHandshakeStatus()==HandshakeStatus.NEED_UNWRAP || _engine.getHandshakeStatus()==HandshakeStatus.NOT_HANDSHAKING)); } private static class HelloWorldHandler extends AbstractHandler { public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { Request baseRequest = (Request)request; baseRequest.setHandled(true); //System.err.println("HELLO WORLD HANDLING"); // System.err.println("hello "+baseRequest.getUri()); byte[] b=("HELLO WORLD "+baseRequest.getUri()).getBytes(StringUtil.__UTF8); response.setContentLength(b.length); response.getOutputStream().write(b); response.getOutputStream().flush(); } } } jetty-6.1.26/extras/sslengine/src/test/resources/0000755000175000017500000000000011745736450020540 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/test/resources/keystore0000644000175000017500000000262210630750104022312 0ustar moonmoonþíþímykeyâ]ÝAº0‚¶0 +*‚¢+!¨Ûì†×u䛪–Àñ7lMꔄ½½‰\%à˜p.G#Ý¥‡„zgZ½›-×mšvðÖ[á´Â¸êà7‰ùœ3i:2Ò$å

C— $,½Ê‰@g…À Alùèx‡ q*¶ ãàì¯ÙðIq"?¯®1ž~®jÜ©¶ˆO¿Ål›"‡­Ì[z{5anˆbñ],*Lu||<6=a«$ìÝìc+ú9ÄêÜ¢—ÄówÆmÅÕ`Óï¸óX.509’0‚Ž0‚÷9òñà0  *†H†÷ 010UUnknown10UUnknown10UUnknown10U Mort Bay Consulting1 0U Open Source Development10U Jetty Server0 001022135544Z 010120135544Z010UUnknown10UUnknown10UUnknown10U Mort Bay Consulting1 0U Open Source Development10U Jetty Server0Ÿ0  *†H†÷ 0‰µõ4銴*?Ôð’€TVËhU•îžzi„‘-¸. H?Ó °q€¤«9>‹˜ø?*ì]žšÀR@Nb‘aI\@Á`Á¶ÅŽ ¤LÇ~ƒoà==uz‡¥¾ÐÊÕ»ÂI l üÜEÊà;r¸¡ÈNßT+–4J¯PdÝõ`0  *†H†÷ =6BkјêÀ@ÚЪÛ>hµTñ8£Vä$Gwc\2èá¿Hz%¦Ée³£êNs"îøֶh–.[•7©C¤ð¾|àxä5»mp“Ê7=ª–Oð«gi‰?Q±CÍDƪO»´ÎALr›ÍP€ÿ‰p>ç¾´øV[Ï×¼q"x?js>!sô¦IAéúмðxÌ8*l:†jetty-6.1.26/extras/sslengine/src/main/0000755000175000017500000000000011745736450016473 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/main/java/0000755000175000017500000000000011745736450017414 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/main/java/org/0000755000175000017500000000000011745736450020203 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/main/java/org/mortbay/0000755000175000017500000000000011745736450021660 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736450023017 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/main/java/org/mortbay/jetty/security/0000755000175000017500000000000011745736450024666 5ustar moonmoon././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootjetty-6.1.26/extras/sslengine/src/main/java/org/mortbay/jetty/security/SslSelectChannelConnector.javajetty-6.1.26/extras/sslengine/src/main/java/org/mortbay/jetty/security/SslSelectChannelConnector.jav0000644000175000017500000005734211276763221032443 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.security; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; import java.security.KeyStore; import java.security.SecureRandom; import java.security.Security; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLPeerUnverifiedException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import org.mortbay.io.Buffer; import org.mortbay.io.Connection; import org.mortbay.io.EndPoint; import org.mortbay.io.bio.SocketEndPoint; import org.mortbay.io.nio.DirectNIOBuffer; import org.mortbay.io.nio.IndirectNIOBuffer; import org.mortbay.io.nio.NIOBuffer; import org.mortbay.io.nio.SelectChannelEndPoint; import org.mortbay.io.nio.SelectorManager.SelectSet; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.HttpParser; import org.mortbay.jetty.HttpSchemes; import org.mortbay.jetty.Request; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.log.Log; import org.mortbay.resource.Resource; /* ------------------------------------------------------------ */ /** * SslSelectChannelConnector. * * @author Nik Gonzalez * @author Greg Wilkins */ public class SslSelectChannelConnector extends SelectChannelConnector { /** * The name of the SSLSession attribute that will contain any cached * information. */ static final String CACHED_INFO_ATTR=CachedInfo.class.getName(); /** Default value for the keystore location path. */ public static final String DEFAULT_KEYSTORE=System.getProperty("user.home")+File.separator+".keystore"; /** String name of key password property. */ public static final String KEYPASSWORD_PROPERTY="jetty.ssl.keypassword"; /** String name of keystore password property. */ public static final String PASSWORD_PROPERTY="jetty.ssl.password"; /** Default value for the cipher Suites. */ private String _excludeCipherSuites[]=null; /** Default value for the keystore location path. */ private String _keystore=DEFAULT_KEYSTORE; private String _keystoreType="JKS"; // type of the key store /** Set to true if we require client certificate authentication. */ private boolean _needClientAuth=false; private boolean _wantClientAuth=false; private transient Password _password; private transient Password _keyPassword; private transient Password _trustPassword; private String _protocol="TLS"; private String _algorithm="SunX509"; // cert algorithm private String _provider; private String _secureRandomAlgorithm; // cert algorithm private String _sslKeyManagerFactoryAlgorithm=(Security.getProperty("ssl.KeyManagerFactory.algorithm")==null?"SunX509":Security .getProperty("ssl.KeyManagerFactory.algorithm")); // cert // algorithm private String _sslTrustManagerFactoryAlgorithm=(Security.getProperty("ssl.TrustManagerFactory.algorithm")==null?"SunX509":Security .getProperty("ssl.TrustManagerFactory.algorithm")); // cert // algorithm private String _truststore; private String _truststoreType="JKS"; // type of the key store private SSLContext _context; private int _packetBufferSize; private int _applicationBufferSize; private ConcurrentLinkedQueue _packetBuffers = new ConcurrentLinkedQueue(); private ConcurrentLinkedQueue _applicationBuffers = new ConcurrentLinkedQueue(); private boolean _allowRenegotiate=false; /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.jetty.AbstractBuffers#getBuffer(int) */ public Buffer getBuffer(int size) { Buffer buffer; if (size==_applicationBufferSize) { buffer = _applicationBuffers.poll(); if (buffer==null) buffer=new IndirectNIOBuffer(size); } else if (size==_packetBufferSize) { buffer = _packetBuffers.poll(); if (buffer==null) buffer=getUseDirectBuffers() ?(NIOBuffer)new DirectNIOBuffer(size) :(NIOBuffer)new IndirectNIOBuffer(size); } else buffer=super.getBuffer(size); return buffer; } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.jetty.AbstractBuffers#returnBuffer(org.mortbay.io.Buffer) */ public void returnBuffer(Buffer buffer) { buffer.clear(); int size=buffer.capacity(); ByteBuffer bbuf = ((NIOBuffer)buffer).getByteBuffer(); bbuf.position(0); bbuf.limit(size); if (size==_applicationBufferSize) _applicationBuffers.add(buffer); else if (size==_packetBufferSize) _packetBuffers.add(buffer); else super.returnBuffer(buffer); } /** * Return the chain of X509 certificates used to negotiate the SSL Session. *

* Note: in order to do this we must convert a * javax.security.cert.X509Certificate[], as used by JSSE to a * java.security.cert.X509Certificate[],as required by the Servlet specs. * * @param sslSession * the javax.net.ssl.SSLSession to use as the source of the * cert chain. * @return the chain of java.security.cert.X509Certificates used to * negotiate the SSL connection.
* Will be null if the chain is missing or empty. */ private static X509Certificate[] getCertChain(SSLSession sslSession) { try { javax.security.cert.X509Certificate javaxCerts[]=sslSession.getPeerCertificateChain(); if (javaxCerts==null||javaxCerts.length==0) return null; int length=javaxCerts.length; X509Certificate[] javaCerts=new X509Certificate[length]; java.security.cert.CertificateFactory cf=java.security.cert.CertificateFactory.getInstance("X.509"); for (int i=0; i * This allows the required attributes to be set for SSL requests.
* The requirements of the Servlet specs are: *

    *
  • an attribute named "javax.servlet.request.cipher_suite" of type * String.
  • *
  • an attribute named "javax.servlet.request.key_size" of type Integer.
  • *
  • an attribute named "javax.servlet.request.X509Certificate" of type * java.security.cert.X509Certificate[]. This is an array of objects of type * X509Certificate, the order of this array is defined as being in ascending * order of trust. The first certificate in the chain is the one set by the * client, the next is the one used to authenticate the first, and so on. *
  • *
* * @param endpoint * The Socket the request arrived on. This should be a * {@link SocketEndPoint} wrapping a {@link SSLSocket}. * @param request * HttpRequest to be customised. */ public void customize(EndPoint endpoint, Request request) throws IOException { super.customize(endpoint,request); request.setScheme(HttpSchemes.HTTPS); SslHttpChannelEndPoint sslHttpChannelEndpoint=(SslHttpChannelEndPoint)endpoint; SSLEngine sslEngine=sslHttpChannelEndpoint.getSSLEngine(); try { SSLSession sslSession=sslEngine.getSession(); String cipherSuite=sslSession.getCipherSuite(); Integer keySize; X509Certificate[] certs; CachedInfo cachedInfo=(CachedInfo)sslSession.getValue(CACHED_INFO_ATTR); if (cachedInfo!=null) { keySize=cachedInfo.getKeySize(); certs=cachedInfo.getCerts(); } else { keySize=new Integer(ServletSSL.deduceKeyLength(cipherSuite)); certs=getCertChain(sslSession); cachedInfo=new CachedInfo(keySize,certs); sslSession.putValue(CACHED_INFO_ATTR,cachedInfo); } if (certs!=null) request.setAttribute("javax.servlet.request.X509Certificate",certs); request.setAttribute("javax.servlet.request.cipher_suite",cipherSuite); request.setAttribute("javax.servlet.request.key_size",keySize); } catch (Exception e) { Log.warn(Log.EXCEPTION,e); } } /* ------------------------------------------------------------ */ public SslSelectChannelConnector() { // Buffer sizes should be from SSL session, but not known at this stage. // size should be 16k, but appears to need 16k+1 byte? Giving it 16k+2k // just // to be safe. TODO investigate } /* ------------------------------------------------------------ */ /** * @return True if SSL re-negotiation is allowed (default false) */ public boolean isAllowRenegotiate() { return _allowRenegotiate; } /* ------------------------------------------------------------ */ /** * Set if SSL re-negotiation is allowed. CVE-2009-3555 discovered * a vulnerability in SSL/TLS with re-negotiation. If your JVM * does not have CVE-2009-3555 fixed, then re-negotiation should * not be allowed. * @param allowRenegotiate true if re-negotiation is allowed (default false) */ public void setAllowRenegotiate(boolean allowRenegotiate) { _allowRenegotiate = allowRenegotiate; } /** * * @deprecated As of Java Servlet API 2.0, with no replacement. * */ public String[] getCipherSuites() { return getExcludeCipherSuites(); } public String[] getExcludeCipherSuites() { return _excludeCipherSuites; } /** * * @deprecated As of Java Servlet API 2.0, with no replacement. * * @author Tony Jiang */ public void setCipherSuites(String[] cipherSuites) { setExcludeCipherSuites(cipherSuites); } public void setExcludeCipherSuites(String[] cipherSuites) { this._excludeCipherSuites=cipherSuites; } /* ------------------------------------------------------------ */ public void setPassword(String password) { _password=Password.getPassword(PASSWORD_PROPERTY,password,null); } /* ------------------------------------------------------------ */ public void setTrustPassword(String password) { _trustPassword=Password.getPassword(PASSWORD_PROPERTY,password,null); } /* ------------------------------------------------------------ */ public void setKeyPassword(String password) { _keyPassword=Password.getPassword(KEYPASSWORD_PROPERTY,password,null); } /* ------------------------------------------------------------ */ public String getAlgorithm() { return (this._algorithm); } /* ------------------------------------------------------------ */ public void setAlgorithm(String algorithm) { this._algorithm=algorithm; } /* ------------------------------------------------------------ */ public String getProtocol() { return _protocol; } /* ------------------------------------------------------------ */ public void setProtocol(String protocol) { _protocol=protocol; } /* ------------------------------------------------------------ */ public void setKeystore(String keystore) { _keystore=keystore; } /* ------------------------------------------------------------ */ public String getKeystore() { return _keystore; } /* ------------------------------------------------------------ */ public String getKeystoreType() { return (_keystoreType); } /* ------------------------------------------------------------ */ public boolean getNeedClientAuth() { return _needClientAuth; } /* ------------------------------------------------------------ */ public boolean getWantClientAuth() { return _wantClientAuth; } /* ------------------------------------------------------------ */ /** * Set the value of the needClientAuth property * * @param needClientAuth * true iff we require client certificate authentication. */ public void setNeedClientAuth(boolean needClientAuth) { _needClientAuth=needClientAuth; } public void setWantClientAuth(boolean wantClientAuth) { _wantClientAuth=wantClientAuth; } /* ------------------------------------------------------------ */ public void setKeystoreType(String keystoreType) { _keystoreType=keystoreType; } /* ------------------------------------------------------------ */ public String getProvider() { return _provider; } public String getSecureRandomAlgorithm() { return (this._secureRandomAlgorithm); } /* ------------------------------------------------------------ */ public String getSslKeyManagerFactoryAlgorithm() { return (this._sslKeyManagerFactoryAlgorithm); } /* ------------------------------------------------------------ */ public String getSslTrustManagerFactoryAlgorithm() { return (this._sslTrustManagerFactoryAlgorithm); } /* ------------------------------------------------------------ */ public String getTruststore() { return _truststore; } /* ------------------------------------------------------------ */ public String getTruststoreType() { return _truststoreType; } /* ------------------------------------------------------------ */ public void setProvider(String _provider) { this._provider=_provider; } /* ------------------------------------------------------------ */ public void setSecureRandomAlgorithm(String algorithm) { this._secureRandomAlgorithm=algorithm; } /* ------------------------------------------------------------ */ public void setSslKeyManagerFactoryAlgorithm(String algorithm) { this._sslKeyManagerFactoryAlgorithm=algorithm; } /* ------------------------------------------------------------ */ public void setSslTrustManagerFactoryAlgorithm(String algorithm) { this._sslTrustManagerFactoryAlgorithm=algorithm; } public void setTruststore(String truststore) { _truststore=truststore; } public void setTruststoreType(String truststoreType) { _truststoreType=truststoreType; } /* ------------------------------------------------------------ */ /** * By default, we're confidential, given we speak SSL. But, if we've been * told about an confidential port, and said port is not our port, then * we're not. This allows separation of listeners providing INTEGRAL versus * CONFIDENTIAL constraints, such as one SSL listener configured to require * client certs providing CONFIDENTIAL, whereas another SSL listener not * requiring client certs providing mere INTEGRAL constraints. */ public boolean isConfidential(Request request) { final int confidentialPort=getConfidentialPort(); return confidentialPort==0||confidentialPort==request.getServerPort(); } /* ------------------------------------------------------------ */ /** * By default, we're integral, given we speak SSL. But, if we've been told * about an integral port, and said port is not our port, then we're not. * This allows separation of listeners providing INTEGRAL versus * CONFIDENTIAL constraints, such as one SSL listener configured to require * client certs providing CONFIDENTIAL, whereas another SSL listener not * requiring client certs providing mere INTEGRAL constraints. */ public boolean isIntegral(Request request) { final int integralPort=getIntegralPort(); return integralPort==0||integralPort==request.getServerPort(); } /* ------------------------------------------------------------------------------- */ protected SelectChannelEndPoint newEndPoint(SocketChannel channel, SelectSet selectSet, SelectionKey key) throws IOException { SslHttpChannelEndPoint endp = new SslHttpChannelEndPoint(this,channel,selectSet,key,createSSLEngine()); endp.setAllowRenegotiate(_allowRenegotiate); return endp; } /* ------------------------------------------------------------------------------- */ protected Connection newConnection(SocketChannel channel, SelectChannelEndPoint endpoint) { HttpConnection connection=(HttpConnection)super.newConnection(channel,endpoint); ((HttpParser)connection.getParser()).setForceContentBuffer(true); return connection; } /* ------------------------------------------------------------ */ protected SSLEngine createSSLEngine() throws IOException { SSLEngine engine=null; try { engine=_context.createSSLEngine(); engine.setUseClientMode(false); if (_wantClientAuth) engine.setWantClientAuth(_wantClientAuth); if (_needClientAuth) engine.setNeedClientAuth(_needClientAuth); if (_excludeCipherSuites!=null&&_excludeCipherSuites.length>0) { List excludedCSList=Arrays.asList(_excludeCipherSuites); String[] enabledCipherSuites=engine.getEnabledCipherSuites(); List enabledCSList=new ArrayList(Arrays.asList(enabledCipherSuites)); for (String cipherName : excludedCSList) { if (enabledCSList.contains(cipherName)) { enabledCSList.remove(cipherName); } } enabledCipherSuites=enabledCSList.toArray(new String[enabledCSList.size()]); engine.setEnabledCipherSuites(enabledCipherSuites); } } catch (Exception e) { Log.warn("Error creating sslEngine -- closing this connector",e); close(); throw new IllegalStateException(e); } return engine; } protected void doStart() throws Exception { _context=createSSLContext(); SSLEngine engine=_context.createSSLEngine(); SSLSession session=engine.getSession(); if (getHeaderBufferSize() * @author Greg Wilkins */ public class SslHttpChannelEndPoint extends SelectChannelConnector.ConnectorEndPoint implements Runnable { private static final ByteBuffer[] __NO_BUFFERS={}; private Buffers _buffers; private SSLEngine _engine; private ByteBuffer _inBuffer; private NIOBuffer _inNIOBuffer; private ByteBuffer _outBuffer; private NIOBuffer _outNIOBuffer; private ByteBuffer[] _gather=new ByteBuffer[2]; private boolean _closing=false; private SSLEngineResult _result; private boolean _handshook=false; private boolean _allowRenegotiate=false; // ssl protected SSLSession _session; /* ------------------------------------------------------------ */ public SslHttpChannelEndPoint(Buffers buffers,SocketChannel channel, SelectorManager.SelectSet selectSet, SelectionKey key, SSLEngine engine) throws SSLException, IOException { super(channel,selectSet,key); _buffers=buffers; // ssl _engine=engine; _session=engine.getSession(); // TODO pool buffers and use only when needed. _outNIOBuffer=(NIOBuffer)buffers.getBuffer(_session.getPacketBufferSize()); _outBuffer=_outNIOBuffer.getByteBuffer(); _inNIOBuffer=(NIOBuffer)buffers.getBuffer(_session.getPacketBufferSize()); _inBuffer=_inNIOBuffer.getByteBuffer(); } /* ------------------------------------------------------------ */ /** * @return True if SSL re-negotiation is allowed (default false) */ public boolean isAllowRenegotiate() { return _allowRenegotiate; } /* ------------------------------------------------------------ */ /** * Set if SSL re-negotiation is allowed. CVE-2009-3555 discovered * a vulnerability in SSL/TLS with re-negotiation. If your JVM * does not have CVE-2009-3555 fixed, then re-negotiation should * not be allowed. * @param allowRenegotiate true if re-negotiation is allowed (default false) */ public void setAllowRenegotiate(boolean allowRenegotiate) { _allowRenegotiate = allowRenegotiate; } /* ------------------------------------------------------------ */ // TODO get rid of these dumps public void dump() { System.err.println(_result); // System.err.println(h.toString()); // System.err.println("--"); } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.io.nio.SelectChannelEndPoint#idleExpired() */ protected void idleExpired() { try { _selectSet.getManager().dispatch(new Runnable() { public void run() { doIdleExpired(); } }); } catch(Exception e) { Log.ignore(e); } } /* ------------------------------------------------------------ */ protected void doIdleExpired() { super.idleExpired(); } /* ------------------------------------------------------------ */ public void shutdownOutput() throws IOException { close(); } /* ------------------------------------------------------------ */ public void close() throws IOException { // TODO - this really should not be done in a loop here - but with async callbacks. _closing=true; long end=System.currentTimeMillis()+((SocketChannel)_channel).socket().getSoTimeout(); try { if (isBufferingOutput()) { flush(); while (isOpen() && isBufferingOutput() && System.currentTimeMillis()0) _handshook=true; return filled; } } /* ------------------------------------------------------------ */ public int flush(Buffer buffer) throws IOException { return flush(buffer,null,null); } /* ------------------------------------------------------------ */ /* */ public int flush(Buffer header, Buffer buffer, Buffer trailer) throws IOException { int consumed=0; int available=header.length(); if (buffer!=null) available+=buffer.length(); int tries=0; loop: while (true) { if (_outNIOBuffer.length()>0) { flush(); if (isBufferingOutput()) break loop; } // System.err.println(_channel+" flush "+_engine.getHandshakeStatus()+" "+_closing); switch(_engine.getHandshakeStatus()) { case FINISHED: case NOT_HANDSHAKING: if (_closing || available==0) { if (consumed==0) consumed= -1; break loop; } int c; if (header!=null && header.length()>0) { if (buffer!=null && buffer.length()>0) c=wrap(header,buffer); else c=wrap(header); } else c=wrap(buffer); if (c>0) { _handshook=true; consumed+=c; available-=c; } else if (c<0) { if (consumed==0) consumed=-1; break loop; } break; case NEED_UNWRAP: checkRenegotiate(); Buffer buf =_buffers.getBuffer(_engine.getSession().getApplicationBufferSize()); try { ByteBuffer bbuf = ((NIOBuffer)buf).getByteBuffer(); if (!unwrap(bbuf) && _engine.getHandshakeStatus()==HandshakeStatus.NEED_UNWRAP) { break loop; } } finally { _buffers.returnBuffer(buf); } break; case NEED_TASK: { Runnable task; while ((task=_engine.getDelegatedTask())!=null) { task.run(); } break; } case NEED_WRAP: { checkRenegotiate(); synchronized(_outBuffer) { try { _outNIOBuffer.compact(); int put=_outNIOBuffer.putIndex(); _outBuffer.position(); _result=null; _result=_engine.wrap(__NO_BUFFERS,_outBuffer); switch(_result.getStatus()) { case BUFFER_OVERFLOW: case BUFFER_UNDERFLOW: Log.warn("wrap {}",_result); case CLOSED: _closing=true; } _outNIOBuffer.setPutIndex(put+_result.bytesProduced()); } finally { _outBuffer.position(0); } } flush(); if (isBufferingOutput()) break loop; break; } } } return consumed; } /* ------------------------------------------------------------ */ public void flush() throws IOException { int len=_outNIOBuffer.length(); if (len>0) { int flushed=super.flush(_outNIOBuffer); len=_outNIOBuffer.length(); if (len>0) { Thread.yield(); flushed=super.flush(_outNIOBuffer); len=_outNIOBuffer.length(); } } } /* ------------------------------------------------------------ */ private void checkRenegotiate() throws IOException { if (_handshook && !_allowRenegotiate && _channel!=null && _channel.isOpen()) { Log.warn("SSL renegotiate denied: "+_channel); close(); } } /* ------------------------------------------------------------ */ private ByteBuffer extractInputBuffer(Buffer buffer) { assert buffer instanceof NIOBuffer; NIOBuffer nbuf=(NIOBuffer)buffer; ByteBuffer bbuf=nbuf.getByteBuffer(); bbuf.position(buffer.putIndex()); return bbuf; } /* ------------------------------------------------------------ */ /** * @return true if progress is made */ private boolean unwrap(ByteBuffer buffer) throws IOException { if (_inNIOBuffer.hasContent()) _inNIOBuffer.compact(); else _inNIOBuffer.clear(); int total_filled=0; while (_inNIOBuffer.space()>0 && super.isOpen()) { try { int filled=super.fill(_inNIOBuffer); if (filled<=0) break; total_filled+=filled; } catch(IOException e) { if (_inNIOBuffer.length()==0) { _outNIOBuffer.clear(); throw e; } break; } } if (total_filled==0 && _inNIOBuffer.length()==0) { if(!isOpen()) { _outNIOBuffer.clear(); throw new EofException(); } return false; } try { _inBuffer.position(_inNIOBuffer.getIndex()); _inBuffer.limit(_inNIOBuffer.putIndex()); _result=null; _result=_engine.unwrap(_inBuffer,buffer); _inNIOBuffer.skip(_result.bytesConsumed()); } finally { _inBuffer.position(0); _inBuffer.limit(_inBuffer.capacity()); } switch(_result.getStatus()) { case BUFFER_OVERFLOW: throw new IllegalStateException(_result.toString()); case BUFFER_UNDERFLOW: if (Log.isDebugEnabled()) Log.debug("unwrap {}",_result); if(!isOpen()) { _inNIOBuffer.clear(); _outNIOBuffer.clear(); throw new EofException(); } return (total_filled > 0); case CLOSED: _closing=true; case OK: boolean progress=total_filled>0 ||_result.bytesConsumed()>0 || _result.bytesProduced()>0; return progress; default: Log.warn("unwrap "+_result); throw new IOException(_result.toString()); } } /* ------------------------------------------------------------ */ private ByteBuffer extractOutputBuffer(Buffer buffer,int n) { if (buffer.buffer() instanceof NIOBuffer) return ((NIOBuffer)buffer.buffer()).getByteBuffer(); return ByteBuffer.wrap(buffer.array()); } /* ------------------------------------------------------------ */ private int wrap(Buffer header, Buffer buffer) throws IOException { _gather[0]=extractOutputBuffer(header,0); synchronized(_gather[0]) { _gather[0].position(header.getIndex()); _gather[0].limit(header.putIndex()); _gather[1]=extractOutputBuffer(buffer,1); synchronized(_gather[1]) { _gather[1].position(buffer.getIndex()); _gather[1].limit(buffer.putIndex()); synchronized(_outBuffer) { int consumed=0; try { _outNIOBuffer.clear(); _outBuffer.position(0); _outBuffer.limit(_outBuffer.capacity()); _result=null; _result=_engine.wrap(_gather,_outBuffer); _outNIOBuffer.setGetIndex(0); _outNIOBuffer.setPutIndex(_result.bytesProduced()); consumed=_result.bytesConsumed(); } finally { _outBuffer.position(0); if (consumed>0 && header!=null) { int len=consumed0 && buffer!=null) { int len=consumed0?_result.bytesConsumed():-1; default: Log.warn("wrap "+_result); throw new IOException(_result.toString()); } } /* ------------------------------------------------------------ */ private int wrap(Buffer buffer) throws IOException { _gather[0]=extractOutputBuffer(buffer,0); synchronized(_gather[0]) { _gather[0].position(buffer.getIndex()); _gather[0].limit(buffer.putIndex()); int consumed=0; synchronized(_outBuffer) { try { _outNIOBuffer.clear(); _outBuffer.position(0); _outBuffer.limit(_outBuffer.capacity()); _result=null; _result=_engine.wrap(_gather[0],_outBuffer); _outNIOBuffer.setGetIndex(0); _outNIOBuffer.setPutIndex(_result.bytesProduced()); consumed=_result.bytesConsumed(); } finally { _outBuffer.position(0); if (consumed>0 && buffer!=null) { int len=consumed0?_result.bytesConsumed():-1; default: Log.warn("wrap "+_result); throw new IOException(_result.toString()); } } /* ------------------------------------------------------------ */ public boolean isBufferingInput() { return _inNIOBuffer.hasContent(); } /* ------------------------------------------------------------ */ public boolean isBufferingOutput() { return _outNIOBuffer.hasContent(); } /* ------------------------------------------------------------ */ public boolean isBufferred() { return true; } /* ------------------------------------------------------------ */ public SSLEngine getSSLEngine() { return _engine; } /* ------------------------------------------------------------ */ public String toString() { return super.toString()+","+_engine.getHandshakeStatus()+", in/out="+_inNIOBuffer.length()+"/"+_outNIOBuffer.length()+" "+_result; } } jetty-6.1.26/extras/sslengine/src/main/config/0000755000175000017500000000000011745736450017740 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/main/config/etc/0000755000175000017500000000000011745736450020513 5ustar moonmoonjetty-6.1.26/extras/sslengine/src/main/config/etc/jetty-sslengine.xml0000644000175000017500000000221411155102430024334 0ustar moonmoon 8444 30000 2 100 /etc/keystore OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4 OBF:1u2u1wml1z7s1z7a1wnl1u2g jetty-6.1.26/extras/sslengine/pom.xml0000644000175000017500000000733111466510412016265 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-sslengine Jetty SSLEngine http://jetty.mortbay.org Apache License Version 2 http://www.apache.org/licenses/LICENSE-2.0 install maven-compiler-plugin 1.5 1.5 maven-antrun-plugin copyfiles install run clean clean run org.apache.felix maven-bundle-plugin ${maven-bundle-plugin-version} true manifest org.mortbay.jetty.security J2SE-1.4 * org.mortbay.jetty.security;version=${project.version} http://jetty.mortbay.org org.apache.maven.plugins maven-jar-plugin ${maven-jar-plugin-version} ${project.build.outputDirectory}/META-INF/MANIFEST.MF org.mortbay.jetty jetty ${project.version} junit junit test jetty-6.1.26/extras/servlet-tester/0000755000175000017500000000000011745736451015762 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/0000755000175000017500000000000011745736451016551 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/test/0000755000175000017500000000000011745736450017527 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/test/java/0000755000175000017500000000000011745736451020451 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/test/java/ServletTest.java0000644000175000017500000002520311044235703023564 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== import java.io.IOException; import java.net.URL; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.jetty.testing.HttpTester; import org.mortbay.jetty.testing.ServletTester; import org.mortbay.util.IO; public class ServletTest extends TestCase { ServletTester tester; /* ------------------------------------------------------------ */ protected void setUp() throws Exception { super.setUp(); tester=new ServletTester(); tester.setContextPath("/context"); tester.addServlet(TestServlet.class, "/servlet/*"); tester.addServlet(HelloServlet.class, "/hello/*"); tester.addServlet("org.mortbay.jetty.servlet.DefaultServlet", "/"); tester.start(); } /* ------------------------------------------------------------ */ protected void tearDown() throws Exception { tester.stop(); tester=null; super.tearDown(); } /* ------------------------------------------------------------ */ public void testServletTesterRaw() throws Exception { // Raw HTTP test requests String requests= "GET /context/servlet/info?query=foo HTTP/1.1\r\n"+ "Host: tester\r\n"+ "\r\n"+ "GET /context/hello HTTP/1.1\r\n"+ "Host: tester\r\n"+ "\r\n"; String responses = tester.getResponses(requests); String expected= "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Content-Length: 21\r\n"+ "\r\n"+ "

Test Servlet

" + "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Content-Length: 22\r\n"+ "\r\n"+ "

Hello Servlet

"; assertEquals(expected,responses); } /* ------------------------------------------------------------ */ public void testServletTesterClient() throws Exception { String base_url=tester.createSocketConnector(true); URL url = new URL(base_url+"/context/hello/info"); String result = IO.toString(url.openStream()); assertEquals("

Hello Servlet

",result); } /* ------------------------------------------------------------ */ public void testHttpTester() throws Exception { // generated and parsed test HttpTester request = new HttpTester(); HttpTester response = new HttpTester(); // test GET request.setMethod("GET"); request.setVersion("HTTP/1.0"); request.setHeader("Host","tester"); request.setURI("/context/hello/info"); response.parse(tester.getResponses(request.generate())); assertTrue(response.getMethod()==null); assertEquals(200,response.getStatus()); assertEquals("

Hello Servlet

",response.getContent()); // test GET with content request.setMethod("POST"); request.setContent("
Some Test Content
"); request.setHeader("Content-Type","text/html"); response.parse(tester.getResponses(request.generate())); assertTrue(response.getMethod()==null); assertEquals(200,response.getStatus()); assertEquals("

Hello Servlet

Some Test Content
",response.getContent()); // test redirection request.setMethod("GET"); request.setURI("/context"); request.setContent(null); response.parse(tester.getResponses(request.generate())); assertEquals(302,response.getStatus()); assertEquals("http://tester/context/",response.getHeader("location")); // test not found request.setURI("/context/xxxx"); response.parse(tester.getResponses(request.generate())); assertEquals(404,response.getStatus()); } /* ------------------------------------------------------------ */ public void testBigPost() throws Exception { // generated and parsed test HttpTester request = new HttpTester(); HttpTester response = new HttpTester(); String content = "0123456789abcdef"; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+="!"; request.setMethod("POST"); request.setVersion("HTTP/1.1"); request.setURI("/context/hello/info"); request.setHeader("Host","tester"); request.setHeader("Content-Type","text/plain"); request.setContent(content); String r=request.generate(); r = tester.getResponses(r); response.parse(r); assertTrue(response.getMethod()==null); assertEquals(200,response.getStatus()); assertEquals("

Hello Servlet

"+content,response.getContent()); } /* ------------------------------------------------------------ */ public void testCharset() throws Exception { byte[] content_iso_8859_1="abcd=1234&AAA=xxx".getBytes("iso8859-1"); byte[] content_utf_8="abcd=1234&AAA=xxx".getBytes("utf-8"); byte[] content_utf_16="abcd=1234&AAA=xxx".getBytes("utf-16"); String request_iso_8859_1= "POST /context/servlet/post HTTP/1.1\r\n"+ "Host: whatever\r\n"+ "Content-Type: application/x-www-form-urlencoded\r\n"+ "Content-Length: "+content_iso_8859_1.length+"\r\n"+ "\r\n"; String request_utf_8= "POST /context/servlet/post HTTP/1.1\r\n"+ "Host: whatever\r\n"+ "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n"+ "Content-Length: "+content_utf_8.length+"\r\n"+ "\r\n"; String request_utf_16= "POST /context/servlet/post HTTP/1.1\r\n"+ "Host: whatever\r\n"+ "Content-Type: application/x-www-form-urlencoded; charset=utf-16\r\n"+ "Content-Length: "+content_utf_16.length+"\r\n"+ "Connection: close\r\n"+ "\r\n"; ByteArrayBuffer out = new ByteArrayBuffer(4096); out.put(request_iso_8859_1.getBytes("iso8859-1")); out.put(content_iso_8859_1); out.put(request_utf_8.getBytes("iso8859-1")); out.put(content_utf_8); out.put(request_utf_16.getBytes("iso8859-1")); out.put(content_utf_16); ByteArrayBuffer responses = tester.getResponses(out); String expected= "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Content-Length: 21\r\n"+ "\r\n"+ "

Test Servlet

"+ "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Content-Length: 21\r\n"+ "\r\n"+ "

Test Servlet

"+ "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Connection: close\r\n"+ "\r\n"+ "

Test Servlet

"; assertEquals(expected,responses.toString()); } /* ------------------------------------------------------------ */ public static class HelloServlet extends HttpServlet { private static final long serialVersionUID=2779906630657190712L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.getWriter().print("

Hello Servlet

"); if (request.getContentLength()>0) response.getWriter().write(IO.toString(request.getInputStream())); } } public static class TestServlet extends HttpServlet { private static final long serialVersionUID=2779906630657190712L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { assertEquals("/context",request.getContextPath()); assertEquals("/servlet",request.getServletPath()); assertEquals("/post",request.getPathInfo()); assertEquals(2,request.getParameterMap().size()); assertEquals("1234",request.getParameter("abcd")); assertEquals("xxx",request.getParameter("AAA")); response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); response.getWriter().print("

Test Servlet

"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { assertEquals("/context",request.getContextPath()); assertEquals("/servlet",request.getServletPath()); assertEquals("/info",request.getPathInfo()); assertEquals("query=foo",request.getQueryString()); assertEquals(1,request.getParameterMap().size()); assertEquals(1,request.getParameterValues("query").length); assertEquals("foo",request.getParameter("query")); response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); response.getWriter().print("

Test Servlet

"); } } } jetty-6.1.26/extras/servlet-tester/src/test/java/org/0000755000175000017500000000000011745736451021240 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/test/java/org/mortbay/0000755000175000017500000000000011745736451022715 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736451024054 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/test/java/org/mortbay/jetty/testing/0000755000175000017500000000000011745736451025531 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/test/java/org/mortbay/jetty/testing/HttpTesterTest.java0000644000175000017500000000334711173372264031342 0ustar moonmoon//======================================================================== //Copyright 2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.testing; import junit.framework.TestCase; public class HttpTesterTest extends TestCase { public void testCharset() throws Exception { HttpTester tester = new HttpTester(); tester.parse( "POST /uri© HTTP/1.1\r\n"+ "Host: fakehost\r\n"+ "Content-Length: 11\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "\r\n" + "123456789©"); System.err.println(tester.getMethod()); System.err.println(tester.getURI()); System.err.println(tester.getVersion()); System.err.println(tester.getHeader("Host")); System.err.println(tester.getContentType()); System.err.println(tester.getCharacterEncoding()); System.err.println(tester.getContent()); assertEquals(tester.getContent(), "123456789©"); System.err.println(tester.generate()); } } jetty-6.1.26/extras/servlet-tester/src/test/java/org/mortbay/servlet/0000755000175000017500000000000011745736451024401 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/test/java/org/mortbay/servlet/QoSFilterTest.java0000644000175000017500000002071611044232704027742 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.servlet; import java.io.IOException; import java.net.URL; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.jetty.Handler; import org.mortbay.jetty.LocalConnector; import org.mortbay.jetty.servlet.FilterHolder; import org.mortbay.jetty.testing.HttpTester; import org.mortbay.jetty.testing.ServletTester; import org.mortbay.log.Log; public class QoSFilterTest extends TestCase { private ServletTester _tester; private FakeCountDownLatch _doneRequests; private final int NUM_CONNECTIONS = 20; private final int NUM_LOOPS = 10; private final int MAX_QOS = 5; protected void setUp() throws Exception { _tester = new ServletTester(); _tester.setContextPath("/context"); _tester.addServlet(TestServlet.class, "/test"); TestServlet.__maxSleepers=0; TestServlet.__sleepers=0; _doneRequests = new FakeCountDownLatch(NUM_CONNECTIONS*NUM_LOOPS); _tester.start(); } protected void tearDown() throws Exception { _tester.stop(); } public void testNoFilter() throws Exception { for(int i = 0; i < NUM_CONNECTIONS; ++i ) { new Thread(new Worker(i)).start(); } _doneRequests.await(10); if (TestServlet.__maxSleepers<=MAX_QOS) Log.warn("TEST WAS NOT PARALLEL ENOUGH!"); assertTrue(TestServlet.__maxSleepers<=NUM_CONNECTIONS); } public void testBlockingQosFilter() throws Exception { FilterHolder holder = new FilterHolder(QoSFilter2.class); holder.setInitParameter(QoSFilter.MAX_REQUESTS_INIT_PARAM, ""+MAX_QOS); _tester.getContext().getServletHandler().addFilterWithMapping(holder,"/*",Handler.REQUEST); for(int i = 0; i < NUM_CONNECTIONS; ++i ) { new Thread(new Worker(i)).start(); } _doneRequests.await(10); if (TestServlet.__maxSleepers0 && System.currentTimeMillis()0;) { socket.getOutputStream().write(requests.getBytes("UTF-8")); socket.getOutputStream().flush(); if (i>0 && pause0>0) Thread.sleep(pause0); } if (pause1>0) Thread.sleep(pause1); socket.getOutputStream().write(request.getBytes("UTF-8")); socket.getOutputStream().flush(); String response = ""; if (requests.indexOf("/unresponsive") != -1) { // don't read in anything, forcing the request to time out Thread.sleep(_maxRequestMs * 2); response = IO.toString(socket.getInputStream(),"UTF-8"); } else { response = IO.toString(socket.getInputStream(),"UTF-8"); } socket.close(); return response; } private int count(String responses,String substring) { int count=0; int i=responses.indexOf(substring); while (i>=0) { count++; i=responses.indexOf(substring,i+substring.length()); } return count; } public void testEvenLowRateIP() throws Exception { String request="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\n\r\n"; String last="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String responses = doRequests(request,11,300,300,last); assertEquals(12,count(responses,"HTTP/1.1 200 OK")); assertEquals(0,count(responses,"DoSFilter:")); } public void testBurstLowRateIP() throws Exception { String request="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\n\r\n"; String last="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String responses = doRequests(request+request+request+request,2,1100,1100,last); assertEquals(9,count(responses,"HTTP/1.1 200 OK")); assertEquals(0,count(responses,"DoSFilter:")); } public void testDelayedIP() throws Exception { String request="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\n\r\n"; String last="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String responses = doRequests(request+request+request+request+request,2,1100,1100,last); assertEquals(11,count(responses,"HTTP/1.1 200 OK")); assertEquals(2,count(responses,"DoSFilter: delayed")); } public void testThrottledIP() throws Exception { Thread other = new Thread() { public void run() { try { // Cause a delay, then sleep while holding pass String request="GET /ctx/dos/sleeper HTTP/1.1\r\nHost: localhost\r\n\r\n"; String last="GET /ctx/dos/sleeper?sleep=2000 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String responses = doRequests(request+request+request+request,1,0,0,last); } catch(Exception e) { e.printStackTrace(); } } }; other.start(); Thread.sleep(1500); String request="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\n\r\n"; String last="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String responses = doRequests(request+request+request+request,1,0,0,last); assertEquals(5,count(responses,"HTTP/1.1 200 OK")); assertEquals(1,count(responses,"DoSFilter: delayed")); assertEquals(1,count(responses,"DoSFilter: throttled")); assertEquals(0,count(responses,"DoSFilter: unavailable")); other.join(); } public void testUnavailableIP() throws Exception { Thread other = new Thread() { public void run() { try { // Cause a delay, then sleep while holding pass String request="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\n\r\n"; String last="GET /ctx/dos/test?sleep=5000 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String responses = doRequests(request+request+request+request,1,0,0,last); } catch(Exception e) { e.printStackTrace(); } } }; other.start(); Thread.sleep(500); String request="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\n\r\n"; String last="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String responses = doRequests(request+request+request+request,1,0,0,last); assertEquals(4,count(responses,"HTTP/1.1 200 OK")); assertEquals(1,count(responses,"HTTP/1.1 503")); assertEquals(1,count(responses,"DoSFilter: delayed")); assertEquals(1,count(responses,"DoSFilter: throttled")); assertEquals(1,count(responses,"DoSFilter: unavailable")); other.join(); } public void testSessionTracking() throws Exception { // get a session, first String requestSession="GET /ctx/dos/test?session=true HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String response=doRequests("",1,0,0,requestSession); String sessionId=response.substring(response.indexOf("Set-Cookie: ")+12, response.indexOf(";")); // all other requests use this session String request="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nCookie: " + sessionId + "\r\n\r\n"; String last="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\nCookie: " + sessionId + "\r\n\r\n"; String responses = doRequests(request+request+request+request+request,2,1100,1100,last); assertEquals(11,count(responses,"HTTP/1.1 200 OK")); assertEquals(2,count(responses,"DoSFilter: delayed")); } public void testMultipleSessionTracking() throws Exception { // get some session ids, first String requestSession="GET /ctx/dos/test?session=true HTTP/1.1\r\nHost: localhost\r\n\r\n"; String closeRequest="GET /ctx/dos/test?session=true HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String response=doRequests(requestSession+requestSession,1,0,0,closeRequest); String[] sessions = response.split("\r\n\r\n"); String sessionId1=sessions[0].substring(sessions[0].indexOf("Set-Cookie: ")+12, sessions[0].indexOf(";")); String sessionId2=sessions[1].substring(sessions[1].indexOf("Set-Cookie: ")+12, sessions[1].indexOf(";")); String request1="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nCookie: " + sessionId1 + "\r\n\r\n"; String request2="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nCookie: " + sessionId2 + "\r\n\r\n"; String last="GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\nCookie: " + sessionId2 + "\r\n\r\n"; // Make sure the sessions are not new. String responses = doRequests(request1+request2+request1+request2+request1,1,1100,1100,last); Thread.sleep(1000); // alternate between sessions responses = doRequests(request1+request2+request1+request2+request1,2,1100,1100,last); assertEquals(11,count(responses,"HTTP/1.1 200 OK")); assertEquals(0,count(responses,"DoSFilter: delayed")); // alternate between sessions responses = doRequests(request1+request2+request1+request2+request1,2,550,550,last); assertEquals(11,count(responses,"HTTP/1.1 200 OK")); int delayedRequests = count(responses,"DoSFilter: delayed"); assertTrue(delayedRequests >= 2 && delayedRequests <= 3); } public void testUnresponsiveClient() throws Exception { int numRequests = 1000; String last="GET /ctx/timeout/unresponsive?lines="+numRequests+" HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; String responses = doRequests("",0,0,0,last); // was expired, and stopped before reaching the end of the requests int responseLines = count(responses, "Line:"); assertTrue(responses.indexOf("DoSFilter: timeout") != -1); assertTrue(responseLines > 0 && responseLines < numRequests); } public static class TestServlet extends HttpServlet implements Servlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getParameter("session")!=null) request.getSession(true); if (request.getParameter("sleep")!=null) { try { Thread.sleep(Long.parseLong(request.getParameter("sleep"))); } catch(InterruptedException e) { } } if (request.getParameter("lines")!=null) { int count = Integer.parseInt(request.getParameter("lines")); for(int i = 0; i < count; ++i) { response.getWriter().write("Line: " + i+"\n"); response.flushBuffer(); try { Thread.sleep(10); } catch(InterruptedException e) { } } } response.setContentType("text/plain"); } } public static class DoSFilter2 extends DoSFilter { public void closeConnection(HttpServletRequest request, HttpServletResponse response, Thread thread) { try { response.getWriter().write("DoSFilter: timeout"); super.closeConnection(request,response,thread); } catch (Exception e) { Log.warn(e); } } } } jetty-6.1.26/extras/servlet-tester/src/main/0000755000175000017500000000000011745736451017475 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/main/java/0000755000175000017500000000000011745736451020416 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/main/java/org/0000755000175000017500000000000011745736451021205 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/main/java/org/mortbay/0000755000175000017500000000000011745736451022662 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736451024021 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/main/java/org/mortbay/jetty/servlet/0000755000175000017500000000000011745736451025505 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/main/java/org/mortbay/jetty/testing/0000755000175000017500000000000011745736451025476 5ustar moonmoonjetty-6.1.26/extras/servlet-tester/src/main/java/org/mortbay/jetty/testing/HttpTester.java0000644000175000017500000003347011130337600030433 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.testing; import java.io.IOException; import java.util.Enumeration; import javax.servlet.http.Cookie; import org.mortbay.io.Buffer; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.io.ByteArrayEndPoint; import org.mortbay.io.SimpleBuffers; import org.mortbay.io.View; import org.mortbay.io.bio.StringEndPoint; import org.mortbay.jetty.HttpFields; import org.mortbay.jetty.HttpGenerator; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.HttpParser; import org.mortbay.jetty.HttpVersions; import org.mortbay.jetty.MimeTypes; import org.mortbay.util.ByteArrayOutputStream2; /* ------------------------------------------------------------ */ /** Test support class. * Assist with parsing and generating HTTP requests and responses. * *
 *      HttpTester tester = new HttpTester();
 *      
 *      tester.parse(
 *          "GET /uri HTTP/1.1\r\n"+
 *          "Host: fakehost\r\n"+
 *          "Content-Length: 10\r\n" +
 *          "\r\n");
 *     
 *      System.err.println(tester.getMethod());
 *      System.err.println(tester.getURI());
 *      System.err.println(tester.getVersion());
 *      System.err.println(tester.getHeader("Host"));
 *      System.err.println(tester.getContent());
 * 
* * @author gregw * @see org.mortbay.jetty.testing.ServletTester */ public class HttpTester { protected HttpFields _fields=new HttpFields(); protected String _method; protected String _uri; protected String _version; protected int _status; protected String _reason; protected ByteArrayOutputStream2 _parsedContent; protected byte[] _genContent; private String _charset, _defaultCharset; private Buffer _contentType; public HttpTester() { this("UTF-8"); } public HttpTester(String charset) { _defaultCharset = charset; } public void reset() { _fields.clear(); _method=null; _uri=null; _version=null; _status=0; _reason=null; _parsedContent=null; _genContent=null; } private String getString(Buffer buffer) { return getString(buffer.asArray()); } private String getString(byte[] b) { if(_charset==null) return new String(b); try { return new String(b, _charset); } catch(Exception e) { return new String(b); } } private byte[] getByteArray(String str) { if(_charset==null) return str.getBytes(); try { return str.getBytes(_charset); } catch(Exception e) { return str.getBytes(); } } /* ------------------------------------------------------------ */ /** * Parse one HTTP request or response * @param rawHTTP Raw HTTP to parse * @return Any unparsed data in the rawHTTP (eg pipelined requests) * @throws IOException */ public String parse(String rawHTTP) throws IOException { _charset = _defaultCharset; ByteArrayBuffer buf = new ByteArrayBuffer(getByteArray(rawHTTP)); View view = new View(buf); HttpParser parser = new HttpParser(view,new PH()); parser.parse(); return getString(view.asArray()); } /* ------------------------------------------------------------ */ public String generate() throws IOException { _charset = _defaultCharset; _contentType = _fields.get(HttpHeaders.CONTENT_TYPE_BUFFER); if(_contentType!=null) { String charset = MimeTypes.getCharsetFromContentType(_contentType); if(charset!=null) _charset = charset; } Buffer bb=new ByteArrayBuffer(32*1024 + (_genContent!=null?_genContent.length:0)); Buffer sb=new ByteArrayBuffer(4*1024); StringEndPoint endp = new StringEndPoint(_charset); HttpGenerator generator = new HttpGenerator(new SimpleBuffers(new Buffer[]{sb,bb}),endp, sb.capacity(), bb.capacity()); if (_method!=null) { generator.setRequest(getMethod(),getURI()); if (_version==null) generator.setVersion(HttpVersions.HTTP_1_1_ORDINAL); else generator.setVersion(HttpVersions.CACHE.getOrdinal(HttpVersions.CACHE.lookup(_version))); generator.completeHeader(_fields,false); if (_genContent!=null) generator.addContent(new View(new ByteArrayBuffer(_genContent)),false); else if (_parsedContent!=null) generator.addContent(new ByteArrayBuffer(_parsedContent.toByteArray()),false); } generator.complete(); generator.flush(); return endp.getOutput(); } /* ------------------------------------------------------------ */ /** * @return the method */ public String getMethod() { return _method; } /* ------------------------------------------------------------ */ /** * @param method the method to set */ public void setMethod(String method) { _method=method; } /* ------------------------------------------------------------ */ /** * @return the reason */ public String getReason() { return _reason; } /* ------------------------------------------------------------ */ /** * @param reason the reason to set */ public void setReason(String reason) { _reason=reason; } /* ------------------------------------------------------------ */ /** * @return the status */ public int getStatus() { return _status; } /* ------------------------------------------------------------ */ /** * @param status the status to set */ public void setStatus(int status) { _status=status; } /* ------------------------------------------------------------ */ /** * @return the uri */ public String getURI() { return _uri; } /* ------------------------------------------------------------ */ /** * @param uri the uri to set */ public void setURI(String uri) { _uri=uri; } /* ------------------------------------------------------------ */ /** * @return the version */ public String getVersion() { return _version; } /* ------------------------------------------------------------ */ /** * @param version the version to set */ public void setVersion(String version) { _version=version; } /* ------------------------------------------------------------ */ public String getContentType() { return getString(_contentType); } /* ------------------------------------------------------------ */ public String getCharacterEncoding() { return _charset; } /* ------------------------------------------------------------ */ /** * @param name * @param value * @throws IllegalArgumentException * @see org.mortbay.jetty.HttpFields#add(java.lang.String, java.lang.String) */ public void addHeader(String name, String value) throws IllegalArgumentException { _fields.add(name,value); } /* ------------------------------------------------------------ */ /** * @param name * @param date * @see org.mortbay.jetty.HttpFields#addDateField(java.lang.String, long) */ public void addDateHeader(String name, long date) { _fields.addDateField(name,date); } /* ------------------------------------------------------------ */ /** * @param name * @param value * @see org.mortbay.jetty.HttpFields#addLongField(java.lang.String, long) */ public void addLongHeader(String name, long value) { _fields.addLongField(name,value); } /* ------------------------------------------------------------ */ /** * @param cookie * @see org.mortbay.jetty.HttpFields#addSetCookie(javax.servlet.http.Cookie) */ public void addSetCookie(Cookie cookie) { _fields.addSetCookie(cookie); } /* ------------------------------------------------------------ */ /** * @param name * @return * @see org.mortbay.jetty.HttpFields#getDateField(java.lang.String) */ public long getDateHeader(String name) { return _fields.getDateField(name); } /* ------------------------------------------------------------ */ /** * @return * @see org.mortbay.jetty.HttpFields#getFieldNames() */ public Enumeration getHeaderNames() { return _fields.getFieldNames(); } /* ------------------------------------------------------------ */ /** * @param name * @return * @throws NumberFormatException * @see org.mortbay.jetty.HttpFields#getLongField(java.lang.String) */ public long getLongHeader(String name) throws NumberFormatException { return _fields.getLongField(name); } /* ------------------------------------------------------------ */ /** * @param name * @return * @see org.mortbay.jetty.HttpFields#getStringField(java.lang.String) */ public String getHeader(String name) { return _fields.getStringField(name); } /* ------------------------------------------------------------ */ /** * @param name * @return * @see org.mortbay.jetty.HttpFields#getValues(java.lang.String) */ public Enumeration getHeaderValues(String name) { return _fields.getValues(name); } /* ------------------------------------------------------------ */ /** * @param name * @param value * @see org.mortbay.jetty.HttpFields#put(java.lang.String, java.lang.String) */ public void setHeader(String name, String value) { _fields.put(name,value); } /* ------------------------------------------------------------ */ /** * @param name * @param date * @see org.mortbay.jetty.HttpFields#putDateField(java.lang.String, long) */ public void setDateHeader(String name, long date) { _fields.putDateField(name,date); } /* ------------------------------------------------------------ */ /** * @param name * @param value * @see org.mortbay.jetty.HttpFields#putLongField(java.lang.String, long) */ public void setLongHeader(String name, long value) { _fields.putLongField(name,value); } /* ------------------------------------------------------------ */ /** * @param name * @see org.mortbay.jetty.HttpFields#remove(java.lang.String) */ public void removeHeader(String name) { _fields.remove(name); } /* ------------------------------------------------------------ */ public String getContent() { if (_parsedContent!=null) return getString(_parsedContent.toByteArray()); if (_genContent!=null) return getString(_genContent); return null; } /* ------------------------------------------------------------ */ public void setContent(String content) { _parsedContent=null; if (content!=null) { _genContent=getByteArray(content); setLongHeader(HttpHeaders.CONTENT_LENGTH,_genContent.length); } else { removeHeader(HttpHeaders.CONTENT_LENGTH); _genContent=null; } } /* ------------------------------------------------------------ */ private class PH extends HttpParser.EventHandler { public void startRequest(Buffer method, Buffer url, Buffer version) throws IOException { reset(); _method=getString(method); _uri=getString(url); _version=getString(version); } public void startResponse(Buffer version, int status, Buffer reason) throws IOException { reset(); _version=getString(version); _status=status; _reason=getString(reason); } public void parsedHeader(Buffer name, Buffer value) throws IOException { _fields.add(name,value); } public void headerComplete() throws IOException { _contentType = _fields.get(HttpHeaders.CONTENT_TYPE_BUFFER); if(_contentType!=null) { String charset = MimeTypes.getCharsetFromContentType(_contentType); if(charset!=null) _charset = charset; } } public void messageComplete(long contextLength) throws IOException { } public void content(Buffer ref) throws IOException { if (_parsedContent==null) _parsedContent=new ByteArrayOutputStream2(); _parsedContent.write(ref.asArray()); } } } jetty-6.1.26/extras/servlet-tester/src/main/java/org/mortbay/jetty/testing/ServletTester.java0000644000175000017500000003031511204456542031144 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.testing; import java.io.IOException; import java.net.Inet4Address; import java.net.InetAddress; import java.net.URL; import java.util.Enumeration; import java.util.EventListener; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.jetty.LocalConnector; import org.mortbay.jetty.Server; import org.mortbay.jetty.bio.SocketConnector; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.FilterHolder; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.util.Attributes; /* ------------------------------------------------------------ */ /** Testing support for servlets and filters. * * Allows a programatic setup of a context with servlets and filters for * testing. Raw HTTP requests may be sent to the context and responses received. * To avoid handling raw HTTP see {@link org.mortbay.jetty.testing.HttpTester}. *
 *      ServletTester tester=new ServletTester();
 *      tester.setContextPath("/context");
 *      tester.addServlet(TestServlet.class, "/servlet/*");
 *      tester.addServlet("org.mortbay.jetty.servlet.DefaultServlet", "/");
 *      tester.start();
 *      String response = tester.getResponses("GET /context/servlet/info HTTP/1.0\r\n\r\n");
 * 
* * @see org.mortbay.jetty.testing.HttpTester * @author gregw * */ public class ServletTester { Server _server = new Server(); LocalConnector _connector = new LocalConnector(); Context _context = new Context(Context.SESSIONS|Context.SECURITY); int _maxIdleTime = -1; public ServletTester() { try { _server.setSendServerVersion(false); _server.addConnector(_connector); _server.addHandler(_context); } catch (Error e) { throw e; } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } } /* ------------------------------------------------------------ */ public void start() throws Exception { _server.start(); } /* ------------------------------------------------------------ */ public void stop() throws Exception { _server.stop(); } /* ------------------------------------------------------------ */ public Context getContext() { return _context; } /* ------------------------------------------------------------ */ /** Get raw HTTP responses from raw HTTP requests. * Multiple requests and responses may be handled, but only if * persistent connections conditions apply. * @param rawRequests String of raw HTTP requests * @return String of raw HTTP responses * @throws Exception */ public String getResponses(String rawRequests) throws Exception { _connector.reopen(); String responses = _connector.getResponses(rawRequests); return responses; } /* ------------------------------------------------------------ */ /** Get raw HTTP responses from raw HTTP requests. * Multiple requests and responses may be handled, but only if * persistent connections conditions apply. * @param rawRequests String of raw HTTP requests * @param connector The connector to handle the responses * @return String of raw HTTP responses * @throws Exception */ public String getResponses(String rawRequests, LocalConnector connector) throws Exception { connector.reopen(); String responses = connector.getResponses(rawRequests); return responses; } /* ------------------------------------------------------------ */ /** Get raw HTTP responses from raw HTTP requests. * Multiple requests and responses may be handled, but only if * persistent connections conditions apply. * @param rawRequests String of raw HTTP requests * @return String of raw HTTP responses * @throws Exception */ public ByteArrayBuffer getResponses(ByteArrayBuffer rawRequests) throws Exception { _connector.reopen(); ByteArrayBuffer responses = _connector.getResponses(rawRequests,false); return responses; } /* ------------------------------------------------------------ */ /** Get raw HTTP responses from raw HTTP requests. * Multiple requests and responses may be handled, but only if * persistent connections conditions apply. * @param rawRequests String of raw HTTP requests * @param connector The connector to handle the responses * @return String of raw HTTP responses * @throws Exception */ public ByteArrayBuffer getResponses(ByteArrayBuffer rawRequests, LocalConnector connector) throws Exception { connector.reopen(); ByteArrayBuffer responses = connector.getResponses(rawRequests,false); return responses; } /* ------------------------------------------------------------ */ /** Create a Socket connector. * This methods adds a socket connector to the server * @param locahost if true, only listen on local host, else listen on all interfaces. * @return A URL to access the server via the socket connector. * @throws Exception */ public String createSocketConnector(boolean localhost) throws Exception { synchronized (this) { SelectChannelConnector connector = new SelectChannelConnector(); if (localhost) connector.setHost("127.0.0.1"); _server.addConnector(connector); if (_maxIdleTime != -1 ) connector.setMaxIdleTime(_maxIdleTime); if (_server.isStarted()) connector.start(); else connector.open(); return "http://"+(localhost?"127.0.0.1": InetAddress.getLocalHost().getHostAddress() )+":"+connector.getLocalPort(); } } /* ------------------------------------------------------------ */ /** Create a Socket connector. * This methods adds a socket connector to the server * @param locahost if true, only listen on local host, else listen on all interfaces. * @return A URL to access the server via the socket connector. * @throws Exception */ public LocalConnector createLocalConnector() throws Exception { synchronized (this) { LocalConnector connector = new LocalConnector(); _server.addConnector(connector); if (_server.isStarted()) connector.start(); return connector; } } /* ------------------------------------------------------------ */ /** * @param listener * @see org.mortbay.jetty.handler.ContextHandler#addEventListener(java.util.EventListener) */ public void addEventListener(EventListener listener) { _context.addEventListener(listener); } /* ------------------------------------------------------------ */ /** * @param filterClass * @param pathSpec * @param dispatches * @return * @see org.mortbay.jetty.servlet.Context#addFilter(java.lang.Class, java.lang.String, int) */ public FilterHolder addFilter(Class filterClass, String pathSpec, int dispatches) { return _context.addFilter(filterClass,pathSpec,dispatches); } /* ------------------------------------------------------------ */ /** * @param filterClass * @param pathSpec * @param dispatches * @return * @see org.mortbay.jetty.servlet.Context#addFilter(java.lang.String, java.lang.String, int) */ public FilterHolder addFilter(String filterClass, String pathSpec, int dispatches) { return _context.addFilter(filterClass,pathSpec,dispatches); } /* ------------------------------------------------------------ */ /** * @param servlet * @param pathSpec * @return * @see org.mortbay.jetty.servlet.Context#addServlet(java.lang.Class, java.lang.String) */ public ServletHolder addServlet(Class servlet, String pathSpec) { return _context.addServlet(servlet,pathSpec); } /* ------------------------------------------------------------ */ /** * @param className * @param pathSpec * @return * @see org.mortbay.jetty.servlet.Context#addServlet(java.lang.String, java.lang.String) */ public ServletHolder addServlet(String className, String pathSpec) { return _context.addServlet(className,pathSpec); } /* ------------------------------------------------------------ */ /** * @param name * @return * @see org.mortbay.jetty.handler.ContextHandler#getAttribute(java.lang.String) */ public Object getAttribute(String name) { return _context.getAttribute(name); } /* ------------------------------------------------------------ */ /** * @return * @see org.mortbay.jetty.handler.ContextHandler#getAttributeNames() */ public Enumeration getAttributeNames() { return _context.getAttributeNames(); } /* ------------------------------------------------------------ */ /** * @return * @see org.mortbay.jetty.handler.ContextHandler#getAttributes() */ public Attributes getAttributes() { return _context.getAttributes(); } /* ------------------------------------------------------------ */ /** * @return * @see org.mortbay.jetty.handler.ContextHandler#getResourceBase() */ public String getResourceBase() { return _context.getResourceBase(); } /* ------------------------------------------------------------ */ /** * @param name * @param value * @see org.mortbay.jetty.handler.ContextHandler#setAttribute(java.lang.String, java.lang.Object) */ public void setAttribute(String name, Object value) { _context.setAttribute(name,value); } /* ------------------------------------------------------------ */ /** * @param classLoader * @see org.mortbay.jetty.handler.ContextHandler#setClassLoader(java.lang.ClassLoader) */ public void setClassLoader(ClassLoader classLoader) { _context.setClassLoader(classLoader); } /* ------------------------------------------------------------ */ /** * @param contextPath * @see org.mortbay.jetty.handler.ContextHandler#setContextPath(java.lang.String) */ public void setContextPath(String contextPath) { _context.setContextPath(contextPath); } /* ------------------------------------------------------------ */ /** * @param eventListeners * @see org.mortbay.jetty.handler.ContextHandler#setEventListeners(java.util.EventListener[]) */ public void setEventListeners(EventListener[] eventListeners) { _context.setEventListeners(eventListeners); } /* ------------------------------------------------------------ */ /** * @param resourceBase * @see org.mortbay.jetty.handler.ContextHandler#setResourceBase(java.lang.String) */ public void setResourceBase(String resourceBase) { _context.setResourceBase(resourceBase); } /* ------------------------------------------------------------ */ public void setMaxIdleTime(int maxIdleTime) { _maxIdleTime = maxIdleTime; } } jetty-6.1.26/extras/servlet-tester/pom.xml0000644000175000017500000000407711466510412017272 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-servlet-tester jar Jetty Servlet Tester maven-antrun-plugin copyfiles install run clean clean run org.mortbay.jetty jetty ${project.version} org.mortbay.jetty jetty-util5 ${project.version} test junit junit test jetty-6.1.26/extras/ajp/0000755000175000017500000000000011745736452013545 5ustar moonmoonjetty-6.1.26/extras/ajp/src/0000755000175000017500000000000011745736451014333 5ustar moonmoonjetty-6.1.26/extras/ajp/src/test/0000755000175000017500000000000011745736451015312 5ustar moonmoonjetty-6.1.26/extras/ajp/src/test/java/0000755000175000017500000000000011745736451016233 5ustar moonmoonjetty-6.1.26/extras/ajp/src/test/java/org/0000755000175000017500000000000011745736451017022 5ustar moonmoonjetty-6.1.26/extras/ajp/src/test/java/org/mortbay/0000755000175000017500000000000011745736451020477 5ustar moonmoonjetty-6.1.26/extras/ajp/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736451021636 5ustar moonmoonjetty-6.1.26/extras/ajp/src/test/java/org/mortbay/jetty/ajp/0000755000175000017500000000000011745736451022410 5ustar moonmoonjetty-6.1.26/extras/ajp/src/test/java/org/mortbay/jetty/ajp/TestAjpParser.java0000644000175000017500000007451111101507024025764 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import java.io.IOException; import org.mortbay.io.Buffer; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.io.ByteArrayEndPoint; import org.mortbay.io.EndPoint; import org.mortbay.io.SimpleBuffers; import org.mortbay.util.TypeUtil; import junit.framework.TestCase; public class TestAjpParser extends TestCase { public void testPacket1() throws Exception { String packet = "123401070202000f77696474683d20485454502f312e300000122f636f6e74726f6c2f70726f647563742f2200000e3230382e32372e3230332e31323800ffff000c7777772e756c74612e636f6d000050000005a006000a6b6565702d616c69766500a00b000c7777772e756c74612e636f6d00a00e002b4d6f7a696c6c612f342e302028636f6d70617469626c653b20426f726465724d616e6167657220332e302900a0010043696d6167652f6769662c20696d6167652f782d786269746d61702c20696d6167652f6a7065672c20696d6167652f706a7065672c20696d6167652f706d672c202a2f2a00a008000130000600067570726f64310008000a4145533235362d53484100ff"; byte[] src = TypeUtil.fromHexString(packet); ByteArrayBuffer buffer= new ByteArrayBuffer(Ajp13Packet.MAX_PACKET_SIZE); SimpleBuffers buffers=new SimpleBuffers(new Buffer[]{buffer}); EndPoint endp = new ByteArrayEndPoint(src,Ajp13Packet.MAX_PACKET_SIZE); Ajp13Parser parser = new Ajp13Parser(buffers,endp); parser.setEventHandler(new EH()); parser.setGenerator(new Ajp13Generator(buffers,endp,0,0)); parser.parseAvailable(); assertTrue(true); } public void testPacket2() throws Exception { String packet="1234020102020008485454502f312e3100000f2f6363632d7777777777772f61616100000c38382e3838382e38382e383830ffff00116363632e6363636363636363632e636f6d0001bb010009a00b00116363632e6363636363636363632e636f6d00a00e005a4d6f7a696c6c612f352e30202857696e646f77733b20553b2057696e646f7773204e5420352e313b20656e2d55533b2072763a312e382e312e3129204765636b6f2f32303036313230342046697265666f782f322e302e302e3100a0010063746578742f786d6c2c6170706c69636174696f6e2f786d6c2c6170706c69636174696f6e2f7868746d6c2b786d6c2c746578742f68746d6c3b713d302e392c746578742f706c61696e3b713d302e382c696d6167652f706e672c2a2f2a3b713d302e3500a004000e656e2d75732c656e3b713d302e3500a003000c677a69702c6465666c61746500a002001e49534f2d383835392d312c7574662d383b713d302e372c2a3b713d302e3700000a4b6565702d416c69766500000333303000a006000a6b6565702d616c69766500000c4d61782d466f7277617264730000023130000800124448452d5253412d4145533235362d5348410009004039324643303544413043444141443232303137413743443141453939353132413330443938363838423843433041454643364231363035323543433232353341000b0100ff"; byte[] src=TypeUtil.fromHexString(packet); ByteArrayBuffer buffer=new ByteArrayBuffer(Ajp13Packet.MAX_PACKET_SIZE); SimpleBuffers buffers=new SimpleBuffers(new Buffer[] { buffer }); EndPoint endp=new ByteArrayEndPoint(src,Ajp13Packet.MAX_PACKET_SIZE); Ajp13Parser parser = new Ajp13Parser(buffers,endp); parser.setEventHandler(new EH()); parser.setGenerator(new Ajp13Generator(buffers,endp,0,0)); parser.parse(); assertTrue(true); } public void testPacket3() throws Exception { String packet="1234028f02020008485454502f312e3100000d2f666f726d746573742e6a737000000d3139322e3136382e342e31383000ffff00107777772e777265636b6167652e6f726700005000000aa0010063746578742f786d6c2c6170706c69636174696f6e2f786d6c2c6170706c69636174696f6e2f7868746d6c2b786d6c2c746578742f68746d6c3b713d302e392c746578742f706c61696e3b713d302e382c696d6167652f706e672c2a2f2a3b713d302e3500a00200075554462d382c2a00a003000c677a69702c6465666c61746500a004000e656e2d67622c656e3b713d302e3500a006000a6b6565702d616c69766500a00900f95048505345535349443d37626361383232616638333466316465373663633630336366636435313938633b20667041757468436f6f6b69653d433035383430394537393344364245434633324230353234344242303039343230383344443645443533304230454637464137414544413745453231313538333745363033454435364332364446353531383635333335423433374531423637414641343533364345304546323342333642323133374243423932333943363631433131443330393842333938414546334546334146454344423746353842443b204a53455353494f4e49443d7365366331623864663432762e6a657474793300a00b00107777772e777265636b6167652e6f726700000a6b6565702d616c69766500000333303000a00e00654d6f7a696c6c612f352e3020285831313b20553b204c696e7578207838365f36343b20656e2d55533b2072763a312e382e302e3929204765636b6f2f3230303631323035202844656269616e2d312e382e302e392d3129204570697068616e792f322e313400a008000130000600066a657474793300ff"; byte[] src=TypeUtil.fromHexString(packet); ByteArrayBuffer buffer=new ByteArrayBuffer(Ajp13Packet.MAX_PACKET_SIZE); SimpleBuffers buffers=new SimpleBuffers(new Buffer[] { buffer }); EndPoint endp=new ByteArrayEndPoint(src,Ajp13Packet.MAX_PACKET_SIZE); Ajp13Parser parser = new Ajp13Parser(buffers,endp); parser.setEventHandler(new EH()); parser.setGenerator(new Ajp13Generator(buffers,endp,0,0)); parser.parse(); assertTrue(true); } public void testSSLPacketWithIntegerKeySize() throws Exception { String packet = "1234025002020008485454502f312e3100000f2f746573742f64756d702f696e666f00000e3139322e3136382e3130302e343000ffff000c776562746964652d746573740001bb01000ca00b000c776562746964652d7465737400a00e005a4d6f7a696c6c612f352e30202857696e646f77733b20553b2057696e646f7773204e5420352e313b20656e2d55533b2072763a312e382e312e3129204765636b6f2f32303036313230342046697265666f782f322e302e302e3100a0010063746578742f786d6c2c6170706c69636174696f6e2f786d6c2c6170706c69636174696f6e2f7868746d6c2b786d6c2c746578742f68746d6c3b713d302e392c746578742f706c61696e3b713d302e382c696d6167652f706e672c2a2f2a3b713d302e3500a004000e656e2d75732c656e3b713d302e3500a003000c677a69702c6465666c61746500a002001e49534f2d383835392d312c7574662d383b713d302e372c2a3b713d302e3700000a4b6565702d416c69766500000333303000a006000a6b6565702d616c69766500a00d001a68747470733a2f2f776562746964652d746573742f746573742f00a00900174a53455353494f4e49443d69326c6e307539773573387300000d43616368652d436f6e74726f6c0000096d61782d6167653d3000000c4d61782d466f7277617264730000023130000800124448452d5253412d4145533235362d5348410009004032413037364245323330433238393130383941414132303631344139384441443131314230323132343030374130363642454531363742303941464337383942000b0100ff"; byte[] src = TypeUtil.fromHexString(packet); ByteArrayBuffer buffer= new ByteArrayBuffer(Ajp13Packet.MAX_PACKET_SIZE); SimpleBuffers buffers=new SimpleBuffers(new Buffer[]{buffer}); EndPoint endp = new ByteArrayEndPoint(src,Ajp13Packet.MAX_PACKET_SIZE); Ajp13Parser parser = new Ajp13Parser(buffers,endp); parser.setEventHandler(new EH()); parser.setGenerator(new Ajp13Generator(buffers,endp,0,0)); parser.parseAvailable(); assertTrue(true); } public void testSSLPacketWithStringKeySize() throws Exception { String packet = "1234025002020008485454502f312e3100000f2f746573742f64756d702f696e666f00000e3139322e3136382e3130302e343000ffff000c776562746964652d746573740001bb01000ca00b000c776562746964652d7465737400a00e005a4d6f7a696c6c612f352e30202857696e646f77733b20553b2057696e646f7773204e5420352e313b20656e2d55533b2072763a312e382e312e3129204765636b6f2f32303036313230342046697265666f782f322e302e302e3100a0010063746578742f786d6c2c6170706c69636174696f6e2f786d6c2c6170706c69636174696f6e2f7868746d6c2b786d6c2c746578742f68746d6c3b713d302e392c746578742f706c61696e3b713d302e382c696d6167652f706e672c2a2f2a3b713d302e3500a004000e656e2d75732c656e3b713d302e3500a003000c677a69702c6465666c61746500a002001e49534f2d383835392d312c7574662d383b713d302e372c2a3b713d302e3700000a4b6565702d416c69766500000333303000a006000a6b6565702d616c69766500a00d001a68747470733a2f2f776562746964652d746573742f746573742f00a00900174a53455353494f4e49443d69326c6e307539773573387300000d43616368652d436f6e74726f6c0000096d61782d6167653d3000000c4d61782d466f7277617264730000023130000800124448452d5253412d4145533235362d5348410009004032413037364245323330433238393130383941414132303631344139384441443131314230323132343030374130363642454531363742303941464337383942000b000332353600ff"; byte[] src = TypeUtil.fromHexString(packet); ByteArrayBuffer buffer= new ByteArrayBuffer(Ajp13Packet.MAX_PACKET_SIZE); SimpleBuffers buffers=new SimpleBuffers(new Buffer[]{buffer}); EndPoint endp = new ByteArrayEndPoint(src,Ajp13Packet.MAX_PACKET_SIZE); Ajp13Parser parser = new Ajp13Parser(buffers,endp); parser.setEventHandler(new EH()); parser.setGenerator(new Ajp13Generator(buffers,endp,0,0)); parser.parseAvailable(); assertTrue(true); } public void testSSLPacketFragment() throws Exception { String packet = "1234025002020008485454502f312e3100000f2f746573742f64756d702f696e666f00000e3139322e3136382e3130302e343000ffff000c776562746964652d746573740001bb01000ca00b000c776562746964652d7465737400a00e005a4d6f7a696c6c612f352e30202857696e646f77733b20553b2057696e646f7773204e5420352e313b20656e2d55533b2072763a312e382e312e3129204765636b6f2f32303036313230342046697265666f782f322e302e302e3100a0010063746578742f786d6c2c6170706c69636174696f6e2f786d6c2c6170706c69636174696f6e2f7868746d6c2b786d6c2c746578742f68746d6c3b713d302e392c746578742f706c61696e3b713d302e382c696d6167652f706e672c2a2f2a3b713d302e3500a004000e656e2d75732c656e3b713d302e3500a003000c677a69702c6465666c61746500a002001e49534f2d383835392d312c7574662d383b713d302e372c2a3b713d302e3700000a4b6565702d416c69766500000333303000a006000a6b6565702d616c69766500a00d001a68747470733a2f2f776562746964652d746573742f746573742f00a00900174a53455353494f4e49443d69326c6e307539773573387300000d43616368652d436f6e74726f6c0000096d61782d6167653d3000000c4d61782d466f7277617264730000023130000800124448452d5253412d4145533235362d5348410009004032413037364245323330433238393130383941414132303631344139384441443131314230323132343030374130363642454531363742303941464337383942000b0100ff"; byte[] src = TypeUtil.fromHexString(packet); for (int f=1;f0); assertEquals(1,parser.getState()); assertEquals(2,count[0]); endp.setIn(new ByteArrayBuffer(TypeUtil.fromHexString("12340042004048452532304c415a59253230444f472532302676616c75656f66323d6162636465666768696a6b6c6d6e6f707172737475767778797a31323334353637383930"))); while (parser.parseNext()>0); assertEquals(1,parser.getState()); assertEquals(3,count[0]); endp.setIn(new ByteArrayBuffer(TypeUtil.fromHexString("123400020000"))); while (parser.getState()!=0 && parser.parseNext()>0); assertEquals(0,parser.getState()); assertEquals(3,count[0]); assertTrue(true); } public void testPacketFragment() throws Exception { String packet = "123401070202000f77696474683d20485454502f312e300000122f636f6e74726f6c2f70726f647563742f2200000e3230382e32372e3230332e31323800ffff000c7777772e756c74612e636f6d000050000005a006000a6b6565702d616c69766500a00b000c7777772e756c74612e636f6d00a00e002b4d6f7a696c6c612f342e302028636f6d70617469626c653b20426f726465724d616e6167657220332e302900a0010043696d6167652f6769662c20696d6167652f782d786269746d61702c20696d6167652f6a7065672c20696d6167652f706a7065672c20696d6167652f706d672c202a2f2a00a008000130000600067570726f64310008000a4145533235362d53484100ff"; byte[] src = TypeUtil.fromHexString(packet); for (int f=1;f */ public class Ajp13RequestPacket { public static boolean isEmpty(Buffer _buffer) { return _buffer.length()==0; } public static int getInt(Buffer _buffer) { return ((_buffer.get()&0xFF)<<8)|(_buffer.get()&0xFF); } public static Buffer getString(Buffer _buffer, View tok) { int len=((_buffer.peek()&0xFF)<<8)|(_buffer.peek(_buffer.getIndex()+1)&0xFF); if (len==0xffff) { _buffer.skip(2); return null; } int start=_buffer.getIndex(); tok.update(start+2,start+len+2); _buffer.skip(len+3); return tok; } public static byte getByte(Buffer _buffer) { return _buffer.get(); } public static boolean getBool(Buffer _buffer) { return _buffer.get()>0; } public static Buffer getMethod(Buffer _buffer) { return Ajp13PacketMethods.CACHE.get(_buffer.get()); } public static Buffer getHeaderName(Buffer _buffer, View tok) { int len=((_buffer.peek()&0xFF)<<8)|(_buffer.peek(_buffer.getIndex()+1)&0xFF); if ((0xFF00&len)==0xA000) { _buffer.skip(1); return Ajp13RequestHeaders.CACHE.get(_buffer.get()); } int start=_buffer.getIndex(); tok.update(start+2,start+len+2); _buffer.skip(len+3); return tok; } public static Buffer get(Buffer buffer, int length) { return buffer.get(length); } } jetty-6.1.26/extras/ajp/src/main/java/org/mortbay/jetty/ajp/Ajp13SocketConnector.java0000644000175000017500000001074611145325621027115 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import java.io.IOException; import org.mortbay.io.EndPoint; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.HttpSchemes; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.bio.SocketConnector; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.security.HashUserRealm; import org.mortbay.jetty.security.UserRealm; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.log.Log; import org.mortbay.jetty.deployer.WebAppDeployer; /** * @author Greg Wilkins * @author Markus Kobler markus(at)inquisitive-mind.com * */ public class Ajp13SocketConnector extends SocketConnector { static String __secretWord = null; static boolean __allowShutdown = false; public Ajp13SocketConnector() { super.setHeaderBufferSize(Ajp13Packet.MAX_DATA_SIZE); super.setRequestBufferSize(Ajp13Packet.MAX_DATA_SIZE); super.setResponseBufferSize(Ajp13Packet.MAX_DATA_SIZE); // IN AJP protocol the socket stay open, so // by default the time out is set to 900 seconds super.setMaxIdleTime(900000); } protected void doStart() throws Exception { super.doStart(); Log.info("AJP13 is not a secure protocol. Please protect port {}",Integer.toString(getLocalPort())); } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.jetty.bio.SocketConnector#customize(org.mortbay.io.EndPoint, org.mortbay.jetty.Request) */ public void customize(EndPoint endpoint, Request request) throws IOException { super.customize(endpoint,request); if (request.isSecure()) request.setScheme(HttpSchemes.HTTPS); } /* ------------------------------------------------------------ */ protected HttpConnection newHttpConnection(EndPoint endpoint) { return new Ajp13Connection(this,endpoint,getServer()); } /* ------------------------------------------------------------ */ // Secured on a packet by packet bases not by connection public boolean isConfidential(Request request) { return ((Ajp13Request) request).isSslSecure(); } /* ------------------------------------------------------------ */ // Secured on a packet by packet bases not by connection public boolean isIntegral(Request request) { return ((Ajp13Request) request).isSslSecure(); } /* ------------------------------------------------------------ */ public void setHeaderBufferSize(int headerBufferSize) { Log.debug(Log.IGNORED); } /* ------------------------------------------------------------ */ public void setRequestBufferSize(int requestBufferSize) { Log.debug(Log.IGNORED); } /* ------------------------------------------------------------ */ public void setResponseBufferSize(int responseBufferSize) { Log.debug(Log.IGNORED); } /* ------------------------------------------------------------ */ public void setAllowShutdown(boolean allowShutdown) { Log.warn("AJP13: Shutdown Request is: " + allowShutdown); __allowShutdown = allowShutdown; } /* ------------------------------------------------------------ */ public void setSecretWord(String secretWord) { Log.warn("AJP13: Shutdown Request secret word is : " + secretWord); __secretWord = secretWord; } } jetty-6.1.26/extras/ajp/src/main/java/org/mortbay/jetty/ajp/Ajp13RequestHeaders.java0000644000175000017500000000643510545150443026737 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import org.mortbay.io.BufferCache; import org.mortbay.io.Buffer; /** * XXX Should this implement the Buffer interface? * * @author Markus Kobler */ public class Ajp13RequestHeaders extends BufferCache { public final static int MAGIC=0x1234; public final static String ACCEPT="accept", ACCEPT_CHARSET="accept-charset", ACCEPT_ENCODING="accept-encoding", ACCEPT_LANGUAGE="accept-language", AUTHORIZATION="authorization", CONNECTION="connection", CONTENT_TYPE="content-type", CONTENT_LENGTH="content-length", COOKIE="cookie", COOKIE2="cookie2", HOST="host", PRAGMA="pragma", REFERER="referer", USER_AGENT="user-agent"; public final static int ACCEPT_ORDINAL=1, ACCEPT_CHARSET_ORDINAL=2, ACCEPT_ENCODING_ORDINAL=3, ACCEPT_LANGUAGE_ORDINAL=4, AUTHORIZATION_ORDINAL=5, CONNECTION_ORDINAL=6, CONTENT_TYPE_ORDINAL=7, CONTENT_LENGTH_ORDINAL=8, COOKIE_ORDINAL=9, COOKIE2_ORDINAL=10, HOST_ORDINAL=11, PRAGMA_ORDINAL=12, REFERER_ORDINAL=13, USER_AGENT_ORDINAL=14; public final static BufferCache CACHE=new BufferCache(); public final static Buffer ACCEPT_BUFFER=CACHE.add(ACCEPT,ACCEPT_ORDINAL), ACCEPT_CHARSET_BUFFER=CACHE.add(ACCEPT_CHARSET,ACCEPT_CHARSET_ORDINAL), ACCEPT_ENCODING_BUFFER=CACHE.add(ACCEPT_ENCODING,ACCEPT_ENCODING_ORDINAL), ACCEPT_LANGUAGE_BUFFER=CACHE .add(ACCEPT_LANGUAGE,ACCEPT_LANGUAGE_ORDINAL), AUTHORIZATION_BUFFER=CACHE.add(AUTHORIZATION,AUTHORIZATION_ORDINAL), CONNECTION_BUFFER=CACHE .add(CONNECTION,CONNECTION_ORDINAL), CONTENT_TYPE_BUFFER=CACHE.add(CONTENT_TYPE,CONTENT_TYPE_ORDINAL), CONTENT_LENGTH_BUFFER=CACHE.add( CONTENT_LENGTH,CONTENT_LENGTH_ORDINAL), COOKIE_BUFFER=CACHE.add(COOKIE,COOKIE_ORDINAL), COOKIE2_BUFFER=CACHE.add(COOKIE2,COOKIE2_ORDINAL), HOST_BUFFER=CACHE.add(HOST,HOST_ORDINAL), PRAGMA_BUFFER=CACHE.add(PRAGMA,PRAGMA_ORDINAL), REFERER_BUFFER=CACHE.add(REFERER,REFERER_ORDINAL), USER_AGENT_BUFFER=CACHE.add(USER_AGENT,USER_AGENT_ORDINAL); public final static byte CONTEXT_ATTR=1, // Legacy SERVLET_PATH_ATTR=2, // Legacy REMOTE_USER_ATTR=3, AUTH_TYPE_ATTR=4, QUERY_STRING_ATTR=5, JVM_ROUTE_ATTR=6, SSL_CERT_ATTR=7, SSL_CIPHER_ATTR=8, SSL_SESSION_ATTR=9, REQUEST_ATTR=10, SSL_KEYSIZE_ATTR=11, SECRET_ATTR=12, STORED_METHOD_ATTR=13; } jetty-6.1.26/extras/ajp/src/main/java/org/mortbay/jetty/ajp/Ajp13Generator.java0000644000175000017500000005443511350000143025726 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Iterator; import org.mortbay.io.Buffer; import org.mortbay.io.Buffers; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.io.EndPoint; import org.mortbay.jetty.*; import org.mortbay.jetty.HttpFields.Field; import org.mortbay.log.Log; import org.mortbay.util.StringUtil; import org.mortbay.util.TypeUtil; /** * @author lagdeppa (at) exist.com * @author Greg Wilkins */ public class Ajp13Generator extends AbstractGenerator { private static HashMap __headerHash = new HashMap(); static { byte[] xA001 = { (byte) 0xA0, (byte) 0x01 }; byte[] xA002 = { (byte) 0xA0, (byte) 0x02 }; byte[] xA003 = { (byte) 0xA0, (byte) 0x03 }; byte[] xA004 = { (byte) 0xA0, (byte) 0x04 }; byte[] xA005 = { (byte) 0xA0, (byte) 0x05 }; byte[] xA006 = { (byte) 0xA0, (byte) 0x06 }; byte[] xA007 = { (byte) 0xA0, (byte) 0x07 }; byte[] xA008 = { (byte) 0xA0, (byte) 0x08 }; byte[] xA009 = { (byte) 0xA0, (byte) 0x09 }; byte[] xA00A = { (byte) 0xA0, (byte) 0x0A }; byte[] xA00B = { (byte) 0xA0, (byte) 0x0B }; __headerHash.put("Content-Type", xA001); __headerHash.put("Content-Language", xA002); __headerHash.put("Content-Length", xA003); __headerHash.put("Date", xA004); __headerHash.put("Last-Modified", xA005); __headerHash.put("Location", xA006); __headerHash.put("Set-Cookie", xA007); __headerHash.put("Set-Cookie2", xA008); __headerHash.put("Servlet-Engine", xA009); __headerHash.put("Status", xA00A); __headerHash.put("WWW-Authenticate", xA00B); } // A, B ajp response header // 0, 1 ajp int 1 packet length // 9 CPONG response Code private static final byte[] AJP13_CPONG_RESPONSE = { 'A', 'B', 0, 1, 9}; private static final byte[] AJP13_END_RESPONSE = { 'A', 'B', 0, 2, 5, 1 }; // AB ajp respose // 0, 3 int = 3 packets in length // 6, send signal to get more data // 31, -7 byte values for int 8185 = (8 * 1024) - 7 MAX_DATA private static final byte[] AJP13_MORE_CONTENT = { 'A', 'B', 0, 3, 6, 31, -7 }; private static String SERVER = "Server: Jetty(6.0.x)"; public static void setServerVersion(String version) { SERVER = "Jetty(" + version + ")"; } /* ------------------------------------------------------------ */ private boolean _expectMore = false; private boolean _needMore = false; private boolean _needEOC = false; private boolean _bufferPrepared = false; /* ------------------------------------------------------------ */ public Ajp13Generator(Buffers buffers, EndPoint io, int headerBufferSize, int contentBufferSize) { super(buffers, io, headerBufferSize, contentBufferSize); } /* ------------------------------------------------------------ */ public void reset(boolean returnBuffers) { super.reset(returnBuffers); _needEOC = false; _needMore = false; _expectMore = false; _bufferPrepared = false; _last=false; _state = STATE_HEADER; _status = 0; _version = HttpVersions.HTTP_1_1_ORDINAL; _reason = null; _method = null; _uri = null; _contentWritten = 0; _contentLength = HttpTokens.UNKNOWN_CONTENT; _last = false; _head = false; _noContent = false; _close = false; _header = null; // Buffer for HTTP header (and maybe small _content) _buffer = null; // Buffer for copy of passed _content _content = null; // Buffer passed to addContent } /* ------------------------------------------------------------ */ /** * Add content. * * @param content * @param last * @throws IllegalArgumentException * if content is * {@link Buffer#isImmutable immutable}. * @throws IllegalStateException * If the request is not expecting any more content, or if the * buffers are full and cannot be flushed. * @throws IOException * if there is a problem flushing the buffers. */ public void addContent(Buffer content, boolean last) throws IOException { if (_noContent) { content.clear(); return; } if (content.isImmutable()) throw new IllegalArgumentException("immutable"); if (_last || _state == STATE_END) { Log.debug("Ignoring extra content {}", content); content.clear(); return; } _last = last; if(!_endp.isOpen()) { _state = STATE_END; return; } // Handle any unfinished business? if (_content != null && _content.length() > 0) { flush(); if (_content != null && _content.length() > 0) throw new IllegalStateException("FULL"); } _content = content; _contentWritten += content.length(); // Handle the _content if (_head) { content.clear(); _content = null; } else { // Yes - so we better check we have a buffer initContent(); // Copy _content to buffer; int len = 0; len = _buffer.put(_content); // make sure there is space for a trailing null if (len > 0 && _buffer.space() == 0) { len--; _buffer.setPutIndex(_buffer.putIndex() - 1); } _content.skip(len); if (_content.length() == 0) _content = null; } } /* ------------------------------------------------------------ */ /** * Add content. * * @param b * byte * @return true if the buffers are full * @throws IOException */ public boolean addContent(byte b) throws IOException { if (_noContent) return false; if (_last || _state == STATE_END) throw new IllegalStateException("Closed"); if(!_endp.isOpen()) { _state = STATE_END; return false; } // Handle any unfinished business? if (_content != null && _content.length() > 0) { flush(); if (_content != null && _content.length() > 0) throw new IllegalStateException("FULL"); } _contentWritten++; // Handle the _content if (_head) return false; // we better check we have a buffer initContent(); // Copy _content to buffer; _buffer.put(b); return _buffer.space() <= 1; } /* ------------------------------------------------------------ */ /** * Prepare buffer for unchecked writes. Prepare the generator buffer to * receive unchecked writes * * @return the available space in the buffer. * @throws IOException */ protected int prepareUncheckedAddContent() throws IOException { if (_noContent) return -1; if (_last || _state == STATE_END) throw new IllegalStateException("Closed"); if(!_endp.isOpen()) { _state = STATE_END; return -1; } // Handle any unfinished business? Buffer content = _content; if (content != null && content.length() > 0) { flush(); if (content != null && content.length() > 0) throw new IllegalStateException("FULL"); } // we better check we have a buffer initContent(); _contentWritten -= _buffer.length(); // Handle the _content if (_head) return Integer.MAX_VALUE; return _buffer.space() - 1; } /* ------------------------------------------------------------ */ public void completeHeader(HttpFields fields, boolean allContentAdded) throws IOException { if (_state != STATE_HEADER) return; if (_last && !allContentAdded) throw new IllegalStateException("last?"); _last = _last | allContentAdded; boolean has_server = false; if (_version == HttpVersions.HTTP_1_0_ORDINAL) _close = true; // get a header buffer if (_header == null) _header = _buffers.getBuffer(_headerBufferSize); Buffer tmpbuf = _buffer; _buffer = _header; try { // start the header _buffer.put((byte) 'A'); _buffer.put((byte) 'B'); addInt(0); _buffer.put((byte) 0x4); addInt(_status); if (_reason == null) _reason = getReasonBuffer(_status); if (_reason == null) _reason = new ByteArrayBuffer(TypeUtil.toString(_status)); addBuffer(_reason); if (_status == 100 || _status == 204 || _status == 304) { _noContent = true; _content = null; } // allocate 2 bytes for number of headers int field_index = _buffer.putIndex(); addInt(0); int num_fields = 0; if (fields != null) { // Add headers Iterator i = fields.getFields(); while (i.hasNext()) { num_fields++; Field f = (Field) i.next(); byte[] codes = (byte[]) __headerHash.get(f.getName()); if (codes != null) { _buffer.put(codes); } else { addString(f.getName()); } addString(f.getValue()); } } if (!has_server && _status > 100 && getSendServerVersion()) { num_fields++; addString("Server"); addString(SERVER); } // TODO Add content length if last content known. // insert the number of headers int tmp = _buffer.putIndex(); _buffer.setPutIndex(field_index); addInt(num_fields); _buffer.setPutIndex(tmp); // get the payload size ( - 4 bytes for the ajp header) // excluding the // ajp header int payloadSize = _buffer.length() - 4; // insert the total packet size on 2nd and 3rd byte that // was previously // allocated addInt(2, payloadSize); } finally { _buffer = tmpbuf; } _state = STATE_CONTENT; } /* ------------------------------------------------------------ */ /** * Complete the message. * * @throws IOException */ public void complete() throws IOException { if (_state == STATE_END) return; super.complete(); if (_state < STATE_FLUSHING) { _state = STATE_FLUSHING; _needEOC = true; } flush(); } /* ------------------------------------------------------------ */ public long flush() throws IOException { try { if (_state == STATE_HEADER && !_expectMore) throw new IllegalStateException("State==HEADER"); prepareBuffers(); if (_endp == null) { // TODO - probably still needed! // if (_rneedMore && _buffe != null) // { // if(!_hasSentEOC) // _buffer.put(AJP13_MORE_CONTENT); // } if (!_expectMore && _needEOC && _buffer != null) { _buffer.put(AJP13_END_RESPONSE); } _needEOC = false; return 0; } // Keep flushing while there is something to flush // (except break below) int total = 0; long last_len = -1; Flushing: while (true) { int len = -1; int to_flush = ((_header != null && _header.length() > 0) ? 4 : 0) | ((_buffer != null && _buffer.length() > 0) ? 2 : 0); switch (to_flush) { case 7: throw new IllegalStateException(); // should // never // happen! case 6: len = _endp.flush(_header, _buffer, null); break; case 5: throw new IllegalStateException(); // should // never // happen! case 4: len = _endp.flush(_header); break; case 3: throw new IllegalStateException(); // should // never // happen! case 2: len = _endp.flush(_buffer); break; case 1: throw new IllegalStateException(); // should // never // happen! case 0: { // Nothing more we can write now. if (_header != null) _header.clear(); _bufferPrepared = false; if (_buffer != null) { _buffer.clear(); // reserve some space for the // header _buffer.setPutIndex(7); _buffer.setGetIndex(7); // Special case handling for // small left over buffer from // an addContent that caused a // buffer flush. if (_content != null && _content.length() < _buffer.space() && _state != STATE_FLUSHING) { _buffer.put(_content); _content.clear(); _content = null; break Flushing; } } // Are we completely finished for now? if (!_expectMore && !_needEOC && (_content == null || _content.length() == 0)) { if (_state == STATE_FLUSHING) _state = STATE_END; // if (_state == STATE_END) // { // _endp.close(); // } // break Flushing; } // Try to prepare more to write. prepareBuffers(); } } // If we failed to flush anything twice in a row // break if (len <= 0) { if (last_len <= 0) break Flushing; break; } last_len = len; total += len; } return total; } catch (IOException e) { Log.ignore(e); throw (e instanceof EofException) ? e : new EofException(e); } } /* ------------------------------------------------------------ */ private void prepareBuffers() { if (!_bufferPrepared) { // Refill buffer if possible if (_content != null && _content.length() > 0 && _buffer != null && _buffer.space() > 0) { int len = _buffer.put(_content); // Make sure there is space for a trailing null if (len > 0 && _buffer.space() == 0) { len--; _buffer.setPutIndex(_buffer.putIndex() - 1); } _content.skip(len); if (_content.length() == 0) _content = null; if (_buffer.length() == 0) { _content = null; } } // add header if needed if (_buffer != null) { int payloadSize = _buffer.length(); // 4 bytes for the ajp header // 1 byte for response type // 2 bytes for the response size // 1 byte because we count from zero?? if (payloadSize > 0) { _bufferPrepared = true; _buffer.put((byte) 0); int put = _buffer.putIndex(); _buffer.setGetIndex(0); _buffer.setPutIndex(0); _buffer.put((byte) 'A'); _buffer.put((byte) 'B'); addInt(payloadSize + 4); _buffer.put((byte) 3); addInt(payloadSize); _buffer.setPutIndex(put); } } if (_needMore) { if (_header == null) { _header = _buffers.getBuffer(_headerBufferSize); } if (_buffer == null && _header != null && _header.space() >= AJP13_MORE_CONTENT.length) { _header.put(AJP13_MORE_CONTENT); _needMore = false; } else if (_buffer != null && _buffer.space() >= AJP13_MORE_CONTENT.length) { // send closing packet if all contents // are added _buffer.put(AJP13_MORE_CONTENT); _needMore = false; _bufferPrepared = true; } } if (!_expectMore && _needEOC) { if (_buffer == null && _header.space() >= AJP13_END_RESPONSE.length) { _header.put(AJP13_END_RESPONSE); _needEOC = false; } else if (_buffer != null && _buffer.space() >= AJP13_END_RESPONSE.length) { // send closing packet if all contents // are added _buffer.put(AJP13_END_RESPONSE); _needEOC = false; _bufferPrepared = true; } } } } /* ------------------------------------------------------------ */ public boolean isComplete() { return !_expectMore && _state == STATE_END; } /* ------------------------------------------------------------ */ private void initContent() throws IOException { if (_buffer == null) { _buffer = _buffers.getBuffer(_contentBufferSize); _buffer.setPutIndex(7); _buffer.setGetIndex(7); } } /* ------------------------------------------------------------ */ private void addInt(int i) { _buffer.put((byte) ((i >> 8) & 0xFF)); _buffer.put((byte) (i & 0xFF)); } /* ------------------------------------------------------------ */ private void addInt(int startIndex, int i) { _buffer.poke(startIndex, (byte) ((i >> 8) & 0xFF)); _buffer.poke((startIndex + 1), (byte) (i & 0xFF)); } /* ------------------------------------------------------------ */ private void addString(String str) throws UnsupportedEncodingException { if (str == null) { addInt(0xFFFF); return; } // TODO - need to use a writer to convert, to avoid this hacky // conversion and temp buffer byte[] b = str.getBytes(StringUtil.__ISO_8859_1); addInt(b.length); _buffer.put(b); _buffer.put((byte) 0); } /* ------------------------------------------------------------ */ private void addBuffer(Buffer b) { if (b == null) { addInt(0xFFFF); return; } addInt(b.length()); _buffer.put(b); _buffer.put((byte) 0); } /* ------------------------------------------------------------ */ public void getBodyChunk() throws IOException { _needMore = true; _expectMore = true; flush(); } /* ------------------------------------------------------------ */ public void gotBody() { _needMore = false; _expectMore = false; } /* ------------------------------------------------------------ */ public void sendCPong() throws IOException { Buffer buff = _buffers.getBuffer(AJP13_CPONG_RESPONSE.length); buff.put(AJP13_CPONG_RESPONSE); // flushing cpong response do { _endp.flush(buff); } while(buff.length() >0); _buffers.returnBuffer(buff); reset(true); } } jetty-6.1.26/extras/ajp/src/main/java/org/mortbay/jetty/ajp/Ajp13Packet.java0000644000175000017500000000475310531007047025217 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import org.mortbay.io.BufferCache; /** * @author Markus Kobler */ public class Ajp13Packet { public final static int MAX_PACKET_SIZE=(8*1024); public final static int HDR_SIZE=4; // Used in writing response... public final static int DATA_HDR_SIZE=7; public final static int MAX_DATA_SIZE=MAX_PACKET_SIZE-DATA_HDR_SIZE; public final static String // Server -> Container FORWARD_REQUEST="FORWARD REQUEST", SHUTDOWN="SHUTDOWN", PING_REQUEST="PING REQUEST", // Obsolete CPING_REQUEST="CPING REQUEST", // Server <- Container SEND_BODY_CHUNK="SEND BODY CHUNK", SEND_HEADERS="SEND HEADERS", END_RESPONSE="END RESPONSE", GET_BODY_CHUNK="GET BODY CHUNK", CPONG_REPLY="CPONG REPLY"; public final static int FORWARD_REQUEST_ORDINAL=2, SHUTDOWN_ORDINAL=7, PING_REQUEST_ORDINAL=8, // Obsolete CPING_REQUEST_ORDINAL=10, SEND_BODY_CHUNK_ORDINAL=3, SEND_HEADERS_ORDINAL=4, END_RESPONSE_ORDINAL=5, GET_BODY_CHUNK_ORDINAL=6, CPONG_REPLY_ORDINAL=9; public final static BufferCache CACHE=new BufferCache(); static { CACHE.add(FORWARD_REQUEST,FORWARD_REQUEST_ORDINAL); CACHE.add(SHUTDOWN,SHUTDOWN_ORDINAL); CACHE.add(PING_REQUEST,PING_REQUEST_ORDINAL); // Obsolete CACHE.add(CPING_REQUEST,CPING_REQUEST_ORDINAL); CACHE.add(SEND_BODY_CHUNK,SEND_BODY_CHUNK_ORDINAL); CACHE.add(SEND_HEADERS,SEND_HEADERS_ORDINAL); CACHE.add(END_RESPONSE,END_RESPONSE_ORDINAL); CACHE.add(GET_BODY_CHUNK,GET_BODY_CHUNK_ORDINAL); CACHE.add(CPONG_REPLY,CPONG_REPLY_ORDINAL); } } jetty-6.1.26/extras/ajp/src/main/java/org/mortbay/jetty/ajp/Ajp13Request.java0000644000175000017500000000647711173372264025456 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.Request; public class Ajp13Request extends Request { protected String _remoteAddr; protected String _remoteHost; protected String _remoteUser; protected boolean _sslSecure; /* ------------------------------------------------------------ */ public Ajp13Request() { super(); _remoteAddr = null; _remoteHost = null; _remoteUser = null; _sslSecure = false; } /* ------------------------------------------------------------ */ protected void setConnection(HttpConnection connection) { super.setConnection(connection); } /* ------------------------------------------------------------ */ public void setRemoteUser(String remoteUser) { _remoteUser = remoteUser; } /* ------------------------------------------------------------ */ public String getRemoteUser() { if(_remoteUser != null) return _remoteUser; return super.getRemoteUser(); } /* ------------------------------------------------------------ */ public String getRemoteAddr() { if (_remoteAddr != null) return _remoteAddr; if (_remoteHost != null) return _remoteHost; return super.getRemoteAddr(); } /* ------------------------------------------------------------ */ public void setRemoteAddr(String remoteAddr) { _remoteAddr = remoteAddr; } /* ------------------------------------------------------------ */ public String getRemoteHost() { if (_remoteHost != null) return _remoteHost; if (_remoteAddr != null) return _remoteAddr; return super.getRemoteHost(); } /* ------------------------------------------------------------ */ public void setRemoteHost(String remoteHost) { _remoteHost = remoteHost; } /* ------------------------------------------------------------ */ public boolean isSslSecure() { return _sslSecure; } /* ------------------------------------------------------------ */ public void setSslSecure(boolean sslSecure) { _sslSecure = sslSecure; } /* ------------------------------------------------------------ */ protected void recycle() { super.recycle(); _remoteAddr = null; _remoteHost = null; _remoteUser = null; _sslSecure = false; } } jetty-6.1.26/extras/ajp/src/main/java/org/mortbay/jetty/ajp/Ajp13ResponseHeaders.java0000644000175000017500000000503010531007047027067 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import org.mortbay.io.BufferCache; import org.mortbay.io.Buffer; /** * @author Markus Kobler */ public class Ajp13ResponseHeaders extends BufferCache { public final static int MAGIC=0xab00; public final static String CONTENT_TYPE="Content-Type", CONTENT_LANGUAGE="Content-Language", CONTENT_LENGTH="Content-Length", DATE="Date", LAST_MODIFIED="Last-Modified", LOCATION="Location", SET_COOKIE="Set-Cookie", SET_COOKIE2="Set-Cookie2", SERVLET_ENGINE="Servlet-Engine", STATUS="Status", WWW_AUTHENTICATE="WWW-Authenticate"; public final static int CONTENT_TYPE_ORDINAL=1, CONTENT_LANGUAGE_ORDINAL=2, CONTENT_LENGTH_ORDINAL=3, DATE_ORDINAL=4, LAST_MODIFIED_ORDINAL=5, LOCATION_ORDINAL=6, SET_COOKIE_ORDINAL=7, SET_COOKIE2_ORDINAL=8, SERVLET_ENGINE_ORDINAL=9, STATUS_ORDINAL=10, WWW_AUTHENTICATE_ORDINAL=11; public final static BufferCache CACHE=new BufferCache(); public final static Buffer CONTENT_TYPE_BUFFER=CACHE.add(CONTENT_TYPE,CONTENT_TYPE_ORDINAL), CONTENT_LANGUAGE_BUFFER=CACHE.add(CONTENT_LANGUAGE, CONTENT_LANGUAGE_ORDINAL), CONTENT_LENGTH_BUFFER=CACHE.add(CONTENT_LENGTH,CONTENT_LENGTH_ORDINAL), DATE_BUFFER=CACHE.add(DATE,DATE_ORDINAL), LAST_MODIFIED_BUFFER=CACHE.add(LAST_MODIFIED,LAST_MODIFIED_ORDINAL), LOCATION_BUFFER=CACHE.add(LOCATION,LOCATION_ORDINAL), SET_COOKIE_BUFFER=CACHE .add(SET_COOKIE,SET_COOKIE_ORDINAL), SET_COOKIE2_BUFFER=CACHE.add(SET_COOKIE2,SET_COOKIE2_ORDINAL), SERVLET_ENGINE_BUFFER=CACHE.add( SERVLET_ENGINE,SERVLET_ENGINE_ORDINAL), STATUS_BUFFER=CACHE.add(STATUS,STATUS_ORDINAL), WWW_AUTHENTICATE_BUFFER=CACHE.add(WWW_AUTHENTICATE, WWW_AUTHENTICATE_ORDINAL); } jetty-6.1.26/extras/ajp/src/main/java/org/mortbay/jetty/ajp/Ajp13PacketMethods.java0000644000175000017500000000761710531007047026545 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import org.mortbay.io.Buffer; import org.mortbay.io.BufferCache; /** * @author Markus Kobler */ public class Ajp13PacketMethods { // TODO - this can probably be replaced by HttpMethods or at least an // extension of it. // It is probably most efficient if "GET" ends up as the same instance public final static String OPTIONS="OPTIONS", GET="GET", HEAD="HEAD", POST="POST", PUT="PUT", DELETE="DELETE", TRACE="TRACE", PROPFIND="PROPFIND", PROPPATCH="PROPPATCH", MKCOL="MKCOL", COPY="COPY", MOVE="MOVE", LOCK="LOCK", UNLOCK="UNLOCK", ACL="ACL", REPORT="REPORT", VERSION_CONTROL="VERSION-CONTROL", CHECKIN="CHECKIN", CHECKOUT="CHECKOUT", UNCHCKOUT="UNCHECKOUT", SEARCH="SEARCH", MKWORKSPACE="MKWORKSPACE", UPDATE="UPDATE", LABEL="LABEL", MERGE="MERGE", BASELINE_CONTROL="BASELINE-CONTROL", MKACTIVITY="MKACTIVITY"; public final static int OPTIONS_ORDINAL=1, GET_ORDINAL=2, HEAD_ORDINAL=3, POST__ORDINAL=4, PUT_ORDINAL=5, DELETE_ORDINAL=6, TRACE_ORDINAL=7, PROPFIND_ORDINAL=8, PROPPATCH_ORDINAL=9, MKCOL_ORDINAL=10, COPY_ORDINAL=11, MOVE_ORDINAL=12, LOCK_ORDINAL=13, UNLOCK_ORDINAL=14, ACL_ORDINAL=15, REPORT_ORDINAL=16, VERSION_CONTROL_ORDINAL=17, CHECKIN_ORDINAL=18, CHECKOUT_ORDINAL=19, UNCHCKOUT_ORDINAL=20, SEARCH_ORDINAL=21, MKWORKSPACE_ORDINAL=22, UPDATE_ORDINAL=23, LABEL_ORDINAL=24, MERGE_ORDINAL=25, BASELINE_CONTROL_ORDINAL=26, MKACTIVITY_ORDINAL=27; public final static BufferCache CACHE=new BufferCache(); public final static Buffer OPTIONS_BUFFER=CACHE.add(OPTIONS,OPTIONS_ORDINAL), GET_BUFFER=CACHE.add(GET,GET_ORDINAL), HEAD_BUFFER=CACHE.add(HEAD, HEAD_ORDINAL), POST__BUFFER=CACHE.add(POST,POST__ORDINAL), PUT_BUFFER=CACHE.add(PUT,PUT_ORDINAL), DELETE_BUFFER=CACHE.add(DELETE,DELETE_ORDINAL), TRACE_BUFFER=CACHE.add(TRACE,TRACE_ORDINAL), PROPFIND_BUFFER=CACHE.add(PROPFIND,PROPFIND_ORDINAL), PROPPATCH_BUFFER=CACHE.add(PROPPATCH, PROPPATCH_ORDINAL), MKCOL_BUFFER=CACHE.add(MKCOL,MKCOL_ORDINAL), COPY_BUFFER=CACHE.add(COPY,COPY_ORDINAL), MOVE_BUFFER=CACHE.add(MOVE,MOVE_ORDINAL), LOCK_BUFFER=CACHE.add(LOCK,LOCK_ORDINAL), UNLOCK_BUFFER=CACHE.add(UNLOCK,UNLOCK_ORDINAL), ACL_BUFFER=CACHE.add(ACL,ACL_ORDINAL), REPORT_BUFFER=CACHE.add(REPORT,REPORT_ORDINAL), VERSION_CONTROL_BUFFER=CACHE.add(VERSION_CONTROL,VERSION_CONTROL_ORDINAL), CHECKIN_BUFFER=CACHE.add(CHECKIN,CHECKIN_ORDINAL), CHECKOUT_BUFFER=CACHE.add(CHECKOUT,CHECKOUT_ORDINAL), UNCHCKOUT_BUFFER=CACHE.add(UNCHCKOUT,UNCHCKOUT_ORDINAL), SEARCH_BUFFER=CACHE.add(SEARCH,SEARCH_ORDINAL), MKWORKSPACE_BUFFER=CACHE.add(MKWORKSPACE,MKWORKSPACE_ORDINAL), UPDATE_BUFFER=CACHE.add(UPDATE,UPDATE_ORDINAL), LABEL_BUFFER=CACHE.add(LABEL,LABEL_ORDINAL), MERGE_BUFFER=CACHE.add(MERGE,MERGE_ORDINAL), BASELINE_CONTROL_BUFFER=CACHE.add(BASELINE_CONTROL,BASELINE_CONTROL_ORDINAL), MKACTIVITY_BUFFER=CACHE.add(MKACTIVITY,MKACTIVITY_ORDINAL); } jetty-6.1.26/extras/ajp/src/main/java/org/mortbay/jetty/ajp/Ajp13Parser.java0000644000175000017500000007433611453210672025254 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import java.io.IOException; import java.io.InterruptedIOException; import javax.servlet.ServletInputStream; import org.mortbay.io.Buffer; import org.mortbay.io.BufferUtil; import org.mortbay.io.Buffers; import org.mortbay.io.EndPoint; import org.mortbay.io.View; import org.mortbay.jetty.EofException; import org.mortbay.jetty.HttpTokens; import org.mortbay.jetty.Parser; import org.mortbay.log.Log; /** * @author Markus Kobler */ public class Ajp13Parser implements Parser { private final static int STATE_START = -1; private final static int STATE_END = 0; private final static int STATE_AJP13CHUNK_START = 1; private final static int STATE_AJP13CHUNK_START_AFTER_LENGTH = 2; private final static int STATE_AJP13CHUNK = 3; private int _state = STATE_START; private long _contentLength; private long _contentPosition; private int _chunkLength; private int _chunkPosition; private int _headers; private Buffers _buffers; private EndPoint _endp; private Buffer _buffer; private Buffer _header; // Buffer for header data (and small _content) private Buffer _body; // Buffer for large content private View _contentView = new View(); private EventHandler _handler; private Ajp13Generator _generator; private View _tok0; // Saved token: header name, request method or response version private View _tok1; // Saved token: header value, request URI orresponse code protected int _length; protected int _packetLength; /* ------------------------------------------------------------------------------- */ public Ajp13Parser(Buffers buffers, EndPoint endPoint) { _buffers = buffers; _endp = endPoint; } /* ------------------------------------------------------------------------------- */ public void setEventHandler(EventHandler handler) { _handler=handler; } /* ------------------------------------------------------------------------------- */ public void setGenerator(Ajp13Generator generator) { _generator=generator; } /* ------------------------------------------------------------------------------- */ public long getContentLength() { return _contentLength; } /* ------------------------------------------------------------------------------- */ public int getState() { return _state; } /* ------------------------------------------------------------------------------- */ public boolean inContentState() { return _state > 0; } /* ------------------------------------------------------------------------------- */ public boolean inHeaderState() { return _state < 0; } /* ------------------------------------------------------------------------------- */ public boolean isIdle() { return _state == STATE_START; } /* ------------------------------------------------------------------------------- */ public boolean isComplete() { return _state == STATE_END; } /* ------------------------------------------------------------------------------- */ public boolean isMoreInBuffer() { if (_header != null && _header.hasContent() || _body != null && _body.hasContent()) return true; return false; } /* ------------------------------------------------------------------------------- */ public boolean isState(int state) { return _state == state; } /* ------------------------------------------------------------------------------- */ public void parse() throws IOException { if (_state == STATE_END) reset(false); if (_state != STATE_START) throw new IllegalStateException("!START"); // continue parsing while (!isComplete()) { parseNext(); } } /* ------------------------------------------------------------------------------- */ public long parseAvailable() throws IOException { long len = parseNext(); long total = len > 0 ? len : 0; // continue parsing while (!isComplete() && _buffer != null && _buffer.length() > 0) { len = parseNext(); if (len > 0) total += len; else break; } return total; } /* ------------------------------------------------------------------------------- */ private int fill() throws IOException { int filled = -1; if (_body != null && _buffer != _body) { // mod_jk implementations may have some partial data from header // check if there are partial contents in the header // copy it to the body if there are any if(_header.length() > 0) { // copy the patial data from the header to the body _body.put(_header); } _buffer = _body; if (_buffer.length()>0) { filled = _buffer.length(); return filled; } } if (_buffer.markIndex() == 0 && _buffer.putIndex() == _buffer.capacity()) throw new IOException("FULL"); if (_endp != null && filled <= 0) { // Compress buffer if handling _content buffer // TODO check this is not moving data too much if (_buffer == _body) _buffer.compact(); if (_buffer.space() == 0) throw new IOException("FULL"); try { filled = _endp.fill(_buffer); } catch (IOException e) { // This is normal in AJP since the socket closes on timeout only Log.debug(e); reset(true); throw (e instanceof EofException) ? e : new EofException(e); } } if (filled < 0) { if (_state > STATE_END) { _state = STATE_END; _handler.messageComplete(_contentPosition); return filled; } reset(true); throw new EofException(); } return filled; } /* ------------------------------------------------------------------------------- */ public long parseNext() throws IOException { long total_filled = -1; if (_buffer == null) { if (_header == null) { _header = _buffers.getBuffer(Ajp13Packet.MAX_PACKET_SIZE); _header.clear(); } _buffer = _header; _tok0 = new View(_header); _tok1 = new View(_header); _tok0.setPutIndex(_tok0.getIndex()); _tok1.setPutIndex(_tok1.getIndex()); } if (_state == STATE_END) throw new IllegalStateException("STATE_END"); if (_state > STATE_END && _contentPosition == _contentLength) { _state = STATE_END; _handler.messageComplete(_contentPosition); return total_filled; } if (_state < 0) { // have we seen a packet? if (_packetLength<=0) { if (_buffer.length()<4) { if (total_filled<0) total_filled=0; total_filled+=fill(); if (_buffer.length()<4) return total_filled; } _contentLength = HttpTokens.UNKNOWN_CONTENT; int _magic = Ajp13RequestPacket.getInt(_buffer); if (_magic != Ajp13RequestHeaders.MAGIC) throw new IOException("Bad AJP13 rcv packet: " + "0x" + Integer.toHexString(_magic) + " expected " + "0x" + Integer.toHexString(Ajp13RequestHeaders.MAGIC) + " " + this); _packetLength = Ajp13RequestPacket.getInt(_buffer); if (_packetLength > Ajp13Packet.MAX_PACKET_SIZE) throw new IOException("AJP13 packet (" + _packetLength + "bytes) too large for buffer"); } if (_buffer.length() < _packetLength) { if (total_filled<0) total_filled=0; total_filled+=fill(); if (_buffer.length() < _packetLength) return total_filled; } // Parse Header Buffer bufHeaderName = null; Buffer bufHeaderValue = null; int attr_type = 0; byte packetType = Ajp13RequestPacket.getByte(_buffer); switch (packetType) { case Ajp13Packet.FORWARD_REQUEST_ORDINAL: _handler.startForwardRequest(); break; case Ajp13Packet.CPING_REQUEST_ORDINAL: ((Ajp13Generator) _generator).sendCPong(); if(_header != null) { _buffers.returnBuffer(_header); _header = null; } if(_body != null) { _buffers.returnBuffer(_body); _body = null; } _buffer= null; reset(true); return -1; case Ajp13Packet.SHUTDOWN_ORDINAL: shutdownRequest(); return -1; default: // XXX Throw an Exception here?? Close // connection! Log.warn("AJP13 message type ({PING}: "+packetType+" ) not supported/recognized as an AJP request"); throw new IllegalStateException("PING is not implemented"); } _handler.parsedMethod(Ajp13RequestPacket.getMethod(_buffer)); _handler.parsedProtocol(Ajp13RequestPacket.getString(_buffer, _tok0)); _handler.parsedUri(Ajp13RequestPacket.getString(_buffer, _tok1)); _handler.parsedRemoteAddr(Ajp13RequestPacket.getString(_buffer, _tok1)); _handler.parsedRemoteHost(Ajp13RequestPacket.getString(_buffer, _tok1)); _handler.parsedServerName(Ajp13RequestPacket.getString(_buffer, _tok1)); _handler.parsedServerPort(Ajp13RequestPacket.getInt(_buffer)); _handler.parsedSslSecure(Ajp13RequestPacket.getBool(_buffer)); _headers = Ajp13RequestPacket.getInt(_buffer); for (int h=0;h<_headers;h++) { bufHeaderName = Ajp13RequestPacket.getHeaderName(_buffer, _tok0); bufHeaderValue = Ajp13RequestPacket.getString(_buffer, _tok1); if (bufHeaderName != null && bufHeaderName.toString().equals(Ajp13RequestHeaders.CONTENT_LENGTH)) { _contentLength = BufferUtil.toLong(bufHeaderValue); if (_contentLength == 0) _contentLength = HttpTokens.NO_CONTENT; } _handler.parsedHeader(bufHeaderName, bufHeaderValue); } attr_type = Ajp13RequestPacket.getByte(_buffer) & 0xff; while (attr_type != 0xFF) { switch (attr_type) { // XXX How does this plug into the web // containers // authentication? case Ajp13RequestHeaders.REMOTE_USER_ATTR: _handler.parsedRemoteUser(Ajp13RequestPacket.getString(_buffer, _tok1)); break; case Ajp13RequestHeaders.AUTH_TYPE_ATTR: _handler.parsedAuthorizationType(Ajp13RequestPacket.getString(_buffer, _tok1)); break; case Ajp13RequestHeaders.QUERY_STRING_ATTR: _handler.parsedQueryString(Ajp13RequestPacket.getString(_buffer, _tok1)); break; case Ajp13RequestHeaders.JVM_ROUTE_ATTR: // XXX Using old Jetty 5 key, // should change! // Note used in // org.mortbay.jetty.servlet.HashSessionIdManager _handler.parsedRequestAttribute("org.mortbay.http.ajp.JVMRoute", Ajp13RequestPacket.getString(_buffer, _tok1)); break; case Ajp13RequestHeaders.SSL_CERT_ATTR: _handler.parsedSslCert(Ajp13RequestPacket.getString(_buffer, _tok1)); break; case Ajp13RequestHeaders.SSL_CIPHER_ATTR: _handler.parsedSslCipher(Ajp13RequestPacket.getString(_buffer, _tok1)); // SslSocketConnector.customize() break; case Ajp13RequestHeaders.SSL_SESSION_ATTR: _handler.parsedSslSession(Ajp13RequestPacket.getString(_buffer, _tok1)); break; case Ajp13RequestHeaders.REQUEST_ATTR: _handler.parsedRequestAttribute(Ajp13RequestPacket.getString(_buffer, _tok0).toString(), Ajp13RequestPacket.getString(_buffer, _tok1)); break; // New Jk API? // Check if experimental or can they // assumed to be // supported case Ajp13RequestHeaders.SSL_KEYSIZE_ATTR: // This has been implemented in AJP13 as either a string or a integer. // Servlet specs say javax.servlet.request.key_size must be an Integer // Does it look like a string containing digits? int length = Ajp13RequestPacket.getInt(_buffer); if (length>0 && length<16) { // this must be a string length rather than a key length _buffer.skip(-2); _handler.parsedSslKeySize(Integer.parseInt(Ajp13RequestPacket.getString(_buffer, _tok1).toString())); } else _handler.parsedSslKeySize(length); break; // Used to lock down jk requests with a // secreate // key. case Ajp13RequestHeaders.SECRET_ATTR: // XXX Investigate safest way to // deal with // this... // should this tie into shutdown // packet? break; case Ajp13RequestHeaders.STORED_METHOD_ATTR: // XXX Confirm this should // really overide // previously parsed method? // _handler.parsedMethod(Ajp13PacketMethods.CACHE.get(Ajp13RequestPacket.getString())); break; case Ajp13RequestHeaders.CONTEXT_ATTR: _handler.parsedContextPath(Ajp13RequestPacket.getString(_buffer, _tok1)); break; case Ajp13RequestHeaders.SERVLET_PATH_ATTR: _handler.parsedServletPath(Ajp13RequestPacket.getString(_buffer, _tok1)); break; default: Log.warn("Unsupported Ajp13 Request Attribute {}", new Integer(attr_type)); break; } attr_type = Ajp13RequestPacket.getByte(_buffer) & 0xff; } _contentPosition = 0; switch ((int) _contentLength) { case HttpTokens.NO_CONTENT: _state = STATE_END; _handler.headerComplete(); _handler.messageComplete(_contentPosition); break; case HttpTokens.UNKNOWN_CONTENT: _generator.getBodyChunk(); if (_buffers != null && _body == null && _buffer == _header && _header.length() <= 0) { _body = _buffers.getBuffer(Ajp13Packet.MAX_PACKET_SIZE); _body.clear(); } _state = STATE_AJP13CHUNK_START; _handler.headerComplete(); // May recurse here! return total_filled; default: if (_buffers != null && _body == null && _buffer == _header && _contentLength > (_header.capacity() - _header.getIndex())) { _body = _buffers.getBuffer(Ajp13Packet.MAX_PACKET_SIZE); _body.clear(); } _state = STATE_AJP13CHUNK_START; _handler.headerComplete(); // May recurse here! return total_filled; } } Buffer chunk; while (_state>STATE_END) { switch (_state) { case STATE_AJP13CHUNK_START: if (_buffer.length()<4) { if (total_filled<0) total_filled=0; total_filled+=fill(); if (_buffer.length()<4) return total_filled; } int _magic=Ajp13RequestPacket.getInt(_buffer); if (_magic!=Ajp13RequestHeaders.MAGIC) { throw new IOException("Bad AJP13 rcv packet: "+"0x"+Integer.toHexString(_magic)+" expected "+"0x" +Integer.toHexString(Ajp13RequestHeaders.MAGIC)+" "+this); } _chunkPosition=0; int rawChunkLength=Ajp13RequestPacket.getInt(_buffer); _chunkLength = rawChunkLength - 2; if (rawChunkLength==0 || _chunkLength==0) { _state=STATE_END; _generator.gotBody(); _handler.messageComplete(_contentPosition); return total_filled; } _state=STATE_AJP13CHUNK_START_AFTER_LENGTH; case STATE_AJP13CHUNK_START_AFTER_LENGTH: if (_buffer.length() < 2) { if (total_filled < 0) total_filled = 0; total_filled += fill(); if (_buffer.length() < 2) return total_filled; } Ajp13RequestPacket.getInt(_buffer); _state = STATE_AJP13CHUNK; case STATE_AJP13CHUNK: if (_buffer.length()<_chunkLength) { if (total_filled<0) total_filled=0; total_filled+=fill(); if (_buffer.length()<_chunkLength) return total_filled; } int remaining=_chunkLength-_chunkPosition; if (remaining==0) { _state=STATE_AJP13CHUNK_START; if (_contentPosition<_contentLength) { _generator.getBodyChunk(); } else { _generator.gotBody(); } return total_filled; } if (_buffer.length() 0) return true; if (_parser.isState(Ajp13Parser.STATE_END)) return false; // Handle simple end points. if (_endp == null) _parser.parseNext(); // Handle blocking end points else if (_endp.isBlocking()) { _parser.parseNext(); // parse until some progress is made (or IOException thrown for timeout) while (_content.length() == 0 && !_parser.isState(Ajp13Parser.STATE_END)) { // Try to get more _parser._content _parser.parseNext(); } } else // Handle non-blocking end point { long filled = _parser.parseNext(); boolean blocked = false; // parse until some progress is made (or // IOException thrown for timeout) while (_content.length() == 0 && !_parser.isState(Ajp13Parser.STATE_END)) { // if fill called, but no bytes read, // then block if (filled > 0) blocked = false; else if (filled == 0) { if (blocked) throw new InterruptedIOException("timeout"); blocked = true; _endp.blockReadable(_maxIdleTime); } // Try to get more _parser._content filled = _parser.parseNext(); } } return _content.length() > 0; } } } jetty-6.1.26/extras/ajp/src/main/java/org/mortbay/jetty/ajp/Ajp13Connection.java0000644000175000017500000002006311145325621026102 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ajp; import java.io.ByteArrayInputStream; import java.io.IOException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.Collection; import java.util.Iterator; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletResponse; import org.mortbay.io.Buffer; import org.mortbay.io.EndPoint; import org.mortbay.jetty.Connector; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.HttpException; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; /** * Connection implementation of the Ajp13 protocol.

XXX Refactor to remove * duplication of HttpConnection * * @author Markus Kobler markus(at)inquisitive-mind.com * @author Greg Wilkins */ public class Ajp13Connection extends HttpConnection { public Ajp13Connection(Connector connector, EndPoint endPoint, Server server) { super(connector, endPoint, server, new Ajp13Parser(connector, endPoint), new Ajp13Generator(connector, endPoint, connector.getHeaderBufferSize(), connector.getResponseBufferSize()), new Ajp13Request() ); ((Ajp13Parser)_parser).setEventHandler(new RequestHandler()); ((Ajp13Parser)_parser).setGenerator((Ajp13Generator)_generator); ((Ajp13Request)_request).setConnection(this); } public boolean isConfidential(Request request) { return ((Ajp13Request) request).isSslSecure(); } public boolean isIntegral(Request request) { return ((Ajp13Request) request).isSslSecure(); } public ServletInputStream getInputStream() { if (_in == null) _in = new Ajp13Parser.Input((Ajp13Parser) _parser, _connector.getMaxIdleTime()); return _in; } private class RequestHandler implements Ajp13Parser.EventHandler { boolean _delayedHandling = false; public void startForwardRequest() throws IOException { _delayedHandling = false; _uri.clear(); ((Ajp13Request) _request).setSslSecure(false); _request.setTimeStamp(System.currentTimeMillis()); _request.setUri(_uri); } public void parsedAuthorizationType(Buffer authType) throws IOException { _request.setAuthType(authType.toString()); } public void parsedRemoteUser(Buffer remoteUser) throws IOException { ((Ajp13Request)_request).setRemoteUser(remoteUser.toString()); } public void parsedServletPath(Buffer servletPath) throws IOException { _request.setServletPath(servletPath.toString()); } public void parsedContextPath(Buffer context) throws IOException { _request.setContextPath(context.toString()); } public void parsedSslCert(Buffer sslCert) throws IOException { try { CertificateFactory cf = CertificateFactory.getInstance("X.509"); ByteArrayInputStream bis = new ByteArrayInputStream(sslCert.toString().getBytes()); Collection certCollection = cf.generateCertificates(bis); X509Certificate[] certificates = new X509Certificate[certCollection.size()]; int i=0; Iterator iter=certCollection.iterator(); while(iter.hasNext()) certificates[i++] = (X509Certificate)iter.next(); _request.setAttribute("javax.servlet.request.X509Certificate", certificates); } catch (Exception e) { org.mortbay.log.Log.warn(e.toString()); org.mortbay.log.Log.ignore(e); if (sslCert!=null) _request.setAttribute("javax.servlet.request.X509Certificate", sslCert.toString()); } } public void parsedSslCipher(Buffer sslCipher) throws IOException { _request.setAttribute("javax.servlet.request.cipher_suite", sslCipher.toString()); } public void parsedSslSession(Buffer sslSession) throws IOException { _request.setAttribute("javax.servlet.request.ssl_session", sslSession.toString()); } public void parsedSslKeySize(int keySize) throws IOException { _request.setAttribute("javax.servlet.request.key_size", new Integer(keySize)); } public void parsedMethod(Buffer method) throws IOException { if (method == null) throw new HttpException(HttpServletResponse.SC_BAD_REQUEST); _request.setMethod(method.toString()); } public void parsedUri(Buffer uri) throws IOException { _uri.parse(uri.toString()); } public void parsedProtocol(Buffer protocol) throws IOException { if (protocol != null && protocol.length()>0) { _request.setProtocol(protocol.toString()); } } public void parsedRemoteAddr(Buffer addr) throws IOException { if (addr != null && addr.length()>0) { ((Ajp13Request) _request).setRemoteAddr(addr.toString()); } } public void parsedRemoteHost(Buffer name) throws IOException { if (name != null && name.length()>0) { ((Ajp13Request) _request).setRemoteHost(name.toString()); } } public void parsedServerName(Buffer name) throws IOException { if (name != null && name.length()>0) { _request.setServerName(name.toString()); } } public void parsedServerPort(int port) throws IOException { ((Ajp13Request) _request).setServerPort(port); } public void parsedSslSecure(boolean secure) throws IOException { ((Ajp13Request) _request).setSslSecure(secure); } public void parsedQueryString(Buffer value) throws IOException { String u = _uri + "?" + value; _uri.parse(u); } public void parsedHeader(Buffer name, Buffer value) throws IOException { _requestFields.add(name, value); } public void parsedRequestAttribute(String key, Buffer value) throws IOException { _request.setAttribute(key, value.toString()); } public void parsedRequestAttribute(String key, int value) throws IOException { _request.setAttribute(key, Integer.toString(value)); } public void headerComplete() throws IOException { if (((Ajp13Parser) _parser).getContentLength() <= 0) { handleRequest(); } else { _delayedHandling = true; } } public void messageComplete(long contextLength) throws IOException { } public void content(Buffer ref) throws IOException { if (_delayedHandling) { _delayedHandling = false; handleRequest(); } } } } jetty-6.1.26/extras/ajp/src/main/config/0000755000175000017500000000000011745736452016525 5ustar moonmoonjetty-6.1.26/extras/ajp/src/main/config/jetty-ajp.xml0000644000175000017500000000113310476614207021145 0ustar moonmoon 8009 jetty-6.1.26/extras/ajp/src/main/config/etc/0000755000175000017500000000000011745736452017300 5ustar moonmoonjetty-6.1.26/extras/ajp/src/main/config/etc/jetty-ajp.xml0000644000175000017500000000113311155102430021701 0ustar moonmoon 8009 jetty-6.1.26/extras/ajp/pom.xml0000644000175000017500000000400411466510412015042 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-ajp Jetty AJP maven-antrun-plugin copyfiles install run clean clean run org.mortbay.jetty jetty ${project.version} junit junit test jetty-6.1.26/extras/setuid/0000755000175000017500000000000011745736452014270 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/0000755000175000017500000000000011745736452015740 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/java/0000755000175000017500000000000011745736452016661 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/java/src/0000755000175000017500000000000011745736452017450 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/java/src/main/0000755000175000017500000000000011745736452020374 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/java/src/main/java/0000755000175000017500000000000011745736452021315 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/java/src/main/java/org/0000755000175000017500000000000011745736452022104 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/java/src/main/java/org/mortbay/0000755000175000017500000000000011745736452023561 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/java/src/main/java/org/mortbay/setuid/0000755000175000017500000000000011745736452025056 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/java/src/main/java/org/mortbay/setuid/RLimit.java0000644000175000017500000000073711250352675027120 0ustar moonmoonpackage org.mortbay.setuid; public class RLimit { int _soft; int _hard; public int getSoft () { return _soft; } public void setSoft (int soft) { _soft = soft; } public int getHard () { return _hard; } public void setHard (int hard) { _hard = hard; } public String toString() { return "rlimit_nofiles (soft="+_soft+", hard="+_hard+")"; } } jetty-6.1.26/extras/setuid/modules/java/src/main/java/org/mortbay/setuid/Passwd.java0000644000175000017500000000544010666675200027157 0ustar moonmoon// ======================================================================== // Copyright 2002-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.setuid; /** * Class is the equivalent java class used for holding values from native c code structure passwd. for more information please see man pages for getpwuid and getpwnam * struct passwd { * char *pw_name; // user name * char *pw_passwd; // user password * uid_t pw_uid; // user id * gid_t pw_gid; // group id * char *pw_gecos; // real name * char *pw_dir; // home directory * char *pw_shell; // shell program * }; * * @author Leopoldo Lee Agdeppa III */ public class Passwd { private String _pwName; /* user name */ private String _pwPasswd; /* user password */ private int _pwUid; /* user id */ private int _pwGid; /* group id */ private String _pwGecos; /* real name */ private String _pwDir; /* home directory */ private String _pwShell; /* shell program */ public String getPwName() { return _pwName; } public void setPwName(String pwName) { _pwName = pwName; } public String getPwPasswd() { return _pwPasswd; } public void setPwPasswd(String pwPasswd) { _pwPasswd = pwPasswd; } public int getPwUid() { return _pwUid; } public void setPwUid(int pwUid) { _pwUid = pwUid; } public int getPwGid() { return _pwGid; } public void setPwGid(int pwGid) { _pwGid = pwGid; } public String getPwGecos() { return _pwGecos; } public void setPwGid(String pwGecos) { _pwGecos = pwGecos; } public String getPwDir() { return _pwDir; } public void setPwDir(String pwDir) { _pwDir = pwDir; } public String getPwShell() { return _pwShell; } public void setPwShell(String pwShell) { _pwShell = pwShell; } } jetty-6.1.26/extras/setuid/modules/java/src/main/java/org/mortbay/setuid/SetUIDServer.java0000644000175000017500000001221611250352675030177 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.setuid; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Server; import org.mortbay.log.Log; /** * This extension of {@link Server} will make a JNI call to set the unix UID. * * This can be used to start the server as root so that privileged ports may * be accessed and then switch to a non-root user for security. * Depending on the value of {@link #setStartServerAsPrivileged(boolean)}, either the * server will be started and then the UID set; or the {@link Server#getConnectors()} will be * opened with a call to {@link Connector#open()}, the UID set and then the server is started. * The later is the default and avoids any webapplication code being run as a privileged user, * but will not work if the application code also needs to open privileged ports. * *

* The configured umask is set before the server is started and the configured * uid is set after the server is started. *

* @author gregw * */ public class SetUIDServer extends Server { private int _uid=0; private int _gid=0; private int _umask=0; private boolean _startServerAsPrivileged; private RLimit _rlimitNoFiles = null; public void setUsername(String username) { Passwd passwd = SetUID.getpwnam(username); _uid = passwd.getPwUid(); } public String getUsername() { Passwd passwd = SetUID.getpwuid(_uid); return passwd.getPwName(); } public void setGroupname(String groupname) { Group group = SetUID.getgrnam(groupname); _gid = group.getGrGid(); } public String getGroupname() { Group group = SetUID.getgrgid(_gid); return group.getGrName(); } public int getUmask () { return _umask; } public void setUmask(int umask) { _umask=umask; } public int getUid() { return _uid; } public void setUid(int uid) { _uid=uid; } public void setGid(int gid) { _gid=gid; } public int getGid() { return _gid; } public void setRLimitNoFiles(RLimit rlimit) { _rlimitNoFiles = rlimit; } public RLimit getRLimitNoFiles () { return _rlimitNoFiles; } protected void doStart() throws Exception { if (_umask!=0) { Log.info("Setting umask=0"+Integer.toString(_umask,8)); SetUID.setumask(_umask); } if (_rlimitNoFiles != null) { Log.info("Current "+SetUID.getrlimitnofiles()); int success = SetUID.setrlimitnofiles(_rlimitNoFiles); if (success < 0) Log.warn("Failed to set rlimit_nofiles, returned status "+success); Log.info("Set "+SetUID.getrlimitnofiles()); } if (_startServerAsPrivileged) { super.doStart(); if (_gid!=0) { Log.info("Setting GID="+_gid); SetUID.setgid(_gid); } if (_uid!=0) { Log.info("Setting UID="+_uid); SetUID.setuid(_uid); } } else { Connector[] connectors = getConnectors(); for (int i=0;connectors!=null && i false 2 jetty jetty jetty-6.1.26/extras/setuid/modules/java/pom.xml0000644000175000017500000000450711466510412020166 0ustar moonmoon jetty-setuid org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-setuid-java Jetty SetUID Java http://jetty.mortbay.org jar install maven-antrun-plugin copy-jar-files package run org.mortbay.jetty jetty ${project.version} jetty-6.1.26/extras/setuid/modules/java/etc/0000755000175000017500000000000011745736452017434 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/native/0000755000175000017500000000000011745736452017226 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/native/src/0000755000175000017500000000000011745736452020015 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/native/src/test/0000755000175000017500000000000011745736452020774 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/native/src/test/java/0000755000175000017500000000000011745736452021715 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/native/src/test/java/org/0000755000175000017500000000000011745736452022504 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/native/src/test/java/org/mortbay/0000755000175000017500000000000011745736452024161 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/native/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736452025320 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/native/src/test/java/org/mortbay/jetty/setuid/0000755000175000017500000000000011745736452026615 5ustar moonmoonjetty-6.1.26/extras/setuid/modules/native/src/test/java/org/mortbay/jetty/setuid/TestSetuid.java0000644000175000017500000001035510666675200031553 0ustar moonmoon// ======================================================================== // Copyright 2002-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== /** * JUnit test for SetUID Class, used to check if native code is working. * @author Leopoldo Lee Agdeppa III */ package org.mortbay.jetty.setuid; import junit.framework.TestCase; import org.mortbay.setuid.SetUID; import java.io.File; import org.mortbay.setuid.Passwd; import org.mortbay.setuid.Group; public class TestSetuid extends TestCase { public void testSetuid() throws Exception { try { File lib = new File("target/libsetuid.so"); String libPath = lib.getCanonicalPath(); System.setProperty("jetty.libsetuid.path", libPath); try { SetUID.getpwnam("TheQuickBrownFoxJumpsOverToTheLazyDog"); assertTrue(false); } catch(SecurityException se) { assertTrue(true); } try { SetUID.getpwuid(-9999); assertTrue(false); } catch(SecurityException se) { assertTrue(true); } // get the passwd info of root Passwd passwd1 = SetUID.getpwnam("root"); // get the roots passwd info using the aquired uid Passwd passwd2 = SetUID.getpwuid(passwd1.getPwUid()); assertEquals(passwd1.getPwName(), passwd2.getPwName()); assertEquals(passwd1.getPwPasswd(), passwd2.getPwPasswd()); assertEquals(passwd1.getPwUid(), passwd2.getPwUid()); assertEquals(passwd1.getPwGid(), passwd2.getPwGid()); assertEquals(passwd1.getPwGecos(), passwd2.getPwGecos()); assertEquals(passwd1.getPwDir(), passwd2.getPwDir()); assertEquals(passwd1.getPwShell(), passwd2.getPwShell()); try { SetUID.getgrnam("TheQuickBrownFoxJumpsOverToTheLazyDog"); assertTrue(false); } catch(SecurityException se) { assertTrue(true); } try { SetUID.getgrgid(-9999); assertTrue(false); } catch(SecurityException se) { assertTrue(true); } // get the group using the roots groupid Group gr1 = SetUID.getgrgid(passwd1.getPwGid()); // get the group name using the aquired name Group gr2 = SetUID.getgrnam(gr1.getGrName()); assertEquals(gr1.getGrName(), gr2.getGrName()); assertEquals(gr1.getGrPasswd(), gr2.getGrPasswd()); assertEquals(gr1.getGrGid(), gr2.getGrGid()); // search and check through membership lists if(gr1.getGrMem() != null) { assertEquals(gr1.getGrMem().length, gr2.getGrMem().length); for(int i=0; i #include "org_mortbay_setuid_SetUID.h" #include #include #include #include #include #include #include #include /** * Native code for SetUID, class is for changing user and groupId, it can also be use to retrieve user information by using getpwuid(uid) or getpwnam(username) of both linux and unix systems */ /* Start of Helper functions Declaration */ jmethodID getJavaMethodId(JNIEnv *env, jclass clazz, const char *name, const char *sig); void setJavaFieldInt(JNIEnv *env, jobject obj, const char *name, int value); void setJavaFieldLong(JNIEnv *env, jobject obj, const char *name, long value); void setJavaFieldString(JNIEnv *env, jobject obj, const char *name, const char *value); void throwNewJavaException(JNIEnv *env, const char *name, const char *msg); void throwNewJavaSecurityException(JNIEnv *env, const char *msg); int getJavaFieldInt(JNIEnv *env, jobject obj, const char *name); /* End of Helper functions Declaration */ JNIEXPORT jint JNICALL Java_org_mortbay_setuid_SetUID_setuid (JNIEnv * env, jclass j, jint uid) { return((jint)setuid((uid_t)uid)); } JNIEXPORT jint JNICALL Java_org_mortbay_setuid_SetUID_setumask (JNIEnv * env, jclass j, jint mask) { return((jint)umask((mode_t)mask)); } JNIEXPORT jint JNICALL Java_org_mortbay_setuid_SetUID_setgid (JNIEnv * env, jclass j, jint gid) { return((jint)setgid((gid_t)gid)); } /* User informaton implementatons */ JNIEXPORT jobject JNICALL Java_org_mortbay_setuid_SetUID_getpwnam(JNIEnv * env, jclass j, jstring name) { struct passwd* pw; jboolean iscopy; char *pname; pname = (char*) (*env)->GetStringUTFChars(env, name, &iscopy); pw=getpwnam((char *) pname); if (!pw) { char strErr[255]; sprintf(strErr, "User %s is not found!!!", pname); throwNewJavaSecurityException(env, strErr); return NULL; } // free as in amnesty (*env)->ReleaseStringUTFChars( env, name, pname ); // get The java class org.mortbay.setuid.Passwd jclass cls; cls = (*env)->FindClass(env,"org/mortbay/setuid/Passwd"); if(!cls) { throwNewJavaSecurityException(env, "Class: org.mortbay.setuid.Passwd is not found!!!"); return NULL; } // get the default constructor of org.mortbay.setuid.Passwd jmethodID constructorMethod = getJavaMethodId(env, cls, "", "()V"); // construct org.mortbay.setuid.Passwd java object jobject retVal = (*env)->NewObject(env, cls,constructorMethod); if(!retVal) { throwNewJavaSecurityException(env, "Object Construction error of Class: org.mortbay.setuid.Passwd!!!"); return NULL; } // copy the struct passwd values to java object org.mortbay.setuid.Passwd //char *pw_name; setJavaFieldString(env, retVal, "_pwName", pw->pw_name); //char *pw_passwd; setJavaFieldString(env, retVal, "_pwPasswd", pw->pw_passwd); //uid_t pw_uid; setJavaFieldInt(env, retVal, "_pwUid", pw->pw_uid); //gid_t pw_gid; setJavaFieldInt(env, retVal, "_pwGid", pw->pw_gid); //char *pw_gecos; setJavaFieldString(env, retVal, "_pwGecos", pw->pw_gecos); //char *pw_dir; setJavaFieldString(env, retVal, "_pwDir", pw->pw_dir); //char *pw_shell; setJavaFieldString(env, retVal, "_pwShell", pw->pw_shell); (*env)->DeleteLocalRef(env, cls); return retVal; } JNIEXPORT jobject JNICALL Java_org_mortbay_setuid_SetUID_getpwuid(JNIEnv * env, jclass j, jint uid) { struct passwd* pw; pw=getpwuid((uid_t) uid); if (!pw) { char strErr[255]; sprintf(strErr, "User with uid %d is not found!!!", uid); throwNewJavaSecurityException(env, strErr); return NULL; } // get The java class org.mortbay.setuid.Passwd jclass cls; cls = (*env)->FindClass(env,"org/mortbay/setuid/Passwd"); if(!cls) { throwNewJavaSecurityException(env, "Class: org.mortbay.setuid.Passwd is not found!!!"); return NULL; } // get the default constructor of org.mortbay.setuid.Passwd jmethodID constructorMethod = getJavaMethodId(env, cls, "", "()V"); // construct org.mortbay.setuid.Passwd java object jobject retVal = (*env)->NewObject(env, cls,constructorMethod); if(!retVal) { throwNewJavaSecurityException(env, "Object Construction error of Class: org.mortbay.setuid.Passwd!!!"); return NULL; } // copy the struct passwd values to java object org.mortbay.setuid.Passwd //char *pw_name; setJavaFieldString(env, retVal, "_pwName", pw->pw_name); //char *pw_passwd; setJavaFieldString(env, retVal, "_pwPasswd", pw->pw_passwd); //uid_t pw_uid; setJavaFieldInt(env, retVal, "_pwUid", pw->pw_uid); //gid_t pw_gid; setJavaFieldInt(env, retVal, "_pwGid", pw->pw_gid); //char *pw_gecos; setJavaFieldString(env, retVal, "_pwGecos", pw->pw_gecos); //char *pw_dir; setJavaFieldString(env, retVal, "_pwDir", pw->pw_dir); //char *pw_shell; setJavaFieldString(env, retVal, "_pwShell", pw->pw_shell); (*env)->DeleteLocalRef(env, cls); return retVal; } /* Group information implimentations */ JNIEXPORT jobject JNICALL Java_org_mortbay_setuid_SetUID_getgrnam(JNIEnv * env, jclass j, jstring name) { struct group* gr; jboolean iscopy; char *pname; pname = (char*) (*env)->GetStringUTFChars(env, name, &iscopy); gr=getgrnam((char *) pname); if (!gr) { char strErr[255]; sprintf(strErr, "Group %s is not found!!!", pname); throwNewJavaSecurityException(env, strErr); return NULL; } // free as in amnesty (*env)->ReleaseStringUTFChars( env, name, pname ); // get The java class org.mortbay.setuid.Passwd jclass cls; cls = (*env)->FindClass(env,"org/mortbay/setuid/Group"); if(!cls) { throwNewJavaSecurityException(env, "Class: org.mortbay.setuid.Group is not found!!!"); return NULL; } // get the default constructor of org.mortbay.setuid.Group jmethodID constructorMethod = getJavaMethodId(env, cls, "", "()V"); // construct org.mortbay.setuid.Group java object jobject retVal = (*env)->NewObject(env, cls,constructorMethod); if(!retVal) { throwNewJavaSecurityException(env, "Object Construction error of Class: org.mortbay.setuid.Group!!!"); return NULL; } // copy the struct grpup values to java object org.mortbay.setuid.Group //char *gr_name; setJavaFieldString(env, retVal, "_grName", gr->gr_name); //char *gr_passwd; setJavaFieldString(env, retVal, "_grPasswd", gr->gr_passwd); //gid_t gr_gid; setJavaFieldInt(env, retVal, "_grGid", gr->gr_gid); if (gr->gr_mem != NULL) { int array_size, i; jobjectArray gr_mems; for(array_size =0; gr->gr_mem[array_size] != NULL; array_size++); if(array_size) { jobjectArray strArr = (*env)->NewObjectArray(env, array_size, (*env)->FindClass(env, "java/lang/String"), (*env)->NewStringUTF(env, "")); for(i=0;iSetObjectArrayElement(env,strArr,i, (*env)->NewStringUTF(env, gr->gr_mem[i])); } // set string array field; // find field jfieldID fieldId = (*env)->GetFieldID(env, cls, "_grMem", "[Ljava/lang/String;"); if(!fieldId) { throwNewJavaSecurityException(env, "Class: Java Object Field is not found: String[] _grMem!!!"); } (*env)->SetObjectField(env, retVal, fieldId, strArr); } } (*env)->DeleteLocalRef(env, cls); return retVal; } JNIEXPORT jobject JNICALL Java_org_mortbay_setuid_SetUID_getgrgid(JNIEnv * env, jclass j, jint gid) { struct group* gr; gr=getgrgid(gid); if (!gr) { char strErr[255]; sprintf(strErr, "Group with gid %d is not found!!!", gid); throwNewJavaSecurityException(env, strErr); return NULL; } // get The java class org.mortbay.setuid.Passwd jclass cls; cls = (*env)->FindClass(env,"org/mortbay/setuid/Group"); if(!cls) { throwNewJavaSecurityException(env, "Class: org.mortbay.setuid.Group is not found!!!"); return NULL; } // get the default constructor of org.mortbay.setuid.Group jmethodID constructorMethod = getJavaMethodId(env, cls, "", "()V"); // construct org.mortbay.setuid.Group java object jobject retVal = (*env)->NewObject(env, cls,constructorMethod); if(!retVal) { throwNewJavaSecurityException(env, "Object Construction Error of Class: org.mortbay.setuid.Group!!!"); return NULL; } // copy the struct grpup values to java object org.mortbay.setuid.Group //char *gr_name; setJavaFieldString(env, retVal, "_grName", gr->gr_name); //char *gr_passwd; setJavaFieldString(env, retVal, "_grPasswd", gr->gr_passwd); //gid_t gr_gid; setJavaFieldInt(env, retVal, "_grGid", gr->gr_gid); if (gr->gr_mem != NULL) { int array_size, i; jobjectArray gr_mems; for(array_size =0; gr->gr_mem[array_size] != NULL; array_size++); if(array_size) { jobjectArray strArr = (*env)->NewObjectArray(env, array_size, (*env)->FindClass(env, "java/lang/String"), (*env)->NewStringUTF(env, "")); for(i=0;iSetObjectArrayElement(env,strArr,i, (*env)->NewStringUTF(env, gr->gr_mem[i])); } // set string array field; // find field jfieldID fieldId = (*env)->GetFieldID(env, cls, "_grMem", "[Ljava/lang/String;"); if(!fieldId) { throwNewJavaSecurityException(env, "Java Object Field is not found: String _grMem!!!"); } (*env)->SetObjectField(env, retVal, fieldId, strArr); } } (*env)->DeleteLocalRef(env, cls); return retVal; } /* * Class: org_mortbay_setuid_SetUID * Method: getrlimitnofiles * Signature: ()Lorg/mortbay/setuid/RLimit; */ JNIEXPORT jobject JNICALL Java_org_mortbay_setuid_SetUID_getrlimitnofiles (JNIEnv *env, jclass j) { struct rlimit rlim; int success = getrlimit(RLIMIT_NOFILE, &rlim); if (success < 0) { throwNewJavaSecurityException(env, "getrlimit failed"); return NULL; } // get The java class org.mortbay.setuid.RLimit jclass cls = (*env)->FindClass(env, "org/mortbay/setuid/RLimit"); if(!cls) { throwNewJavaSecurityException(env, "Class: org.mortbay.setuid.RLimit is not found!!!"); return NULL; } // get the default constructor of org.mortbay.setuid.RLimit jmethodID constructorMethod = getJavaMethodId(env, cls, "", "()V"); // construct org.mortbay.setuid.RLimit java object jobject retVal = (*env)->NewObject(env, cls,constructorMethod); if(!retVal) { throwNewJavaSecurityException(env, "Object Construction Error of Class: org.mortbay.setuid.RLimit!!!"); return NULL; } setJavaFieldInt(env, retVal, "_soft", rlim.rlim_cur); setJavaFieldInt(env, retVal, "_hard", rlim.rlim_max); (*env)->DeleteLocalRef(env, cls); return retVal; } /* * Class: org_mortbay_setuid_SetUID * Method: setrlimitnofiles * Signature: (Lorg/mortbay/setuid/RLimit;)I */ JNIEXPORT jint JNICALL Java_org_mortbay_setuid_SetUID_setrlimitnofiles (JNIEnv *env, jclass j, jobject jo) { struct rlimit rlim; jclass cls = (*env)->FindClass(env, "org/mortbay/setuid/RLimit"); rlim.rlim_cur=getJavaFieldInt(env,jo, "_soft"); rlim.rlim_max=getJavaFieldInt(env,jo, "_hard"); int success = setrlimit(RLIMIT_NOFILE, &rlim); (*env)->DeleteLocalRef(env, cls); return (jint)success; } /* Start of Helper Functions Implimentations */ jmethodID getJavaMethodId(JNIEnv *env, jclass clazz, const char *name, const char *sig) { jmethodID methodId = (*env)->GetMethodID(env, clazz,name,sig); if(!methodId) { char strErr[255]; sprintf(strErr, "Java Method is not found: %s !!!", name); throwNewJavaSecurityException(env, strErr); return NULL; } return methodId; } int getJavaFieldInt(JNIEnv *env, jobject obj, const char *name) { jclass clazz = (*env)->GetObjectClass(env, obj); jfieldID fieldId = (*env)->GetFieldID(env, clazz, name, "I"); if(!fieldId) { char strErr[255]; sprintf(strErr, "Java Object Field is not found: int %s !!!", name); throwNewJavaSecurityException(env, strErr); } int val = (*env)->GetIntField(env, obj, fieldId); (*env)->DeleteLocalRef(env, clazz); return val; } void setJavaFieldInt(JNIEnv *env, jobject obj, const char *name, int value) { jclass clazz = (*env)->GetObjectClass(env, obj); jfieldID fieldId = (*env)->GetFieldID(env, clazz, name, "I"); if(!fieldId) { char strErr[255]; sprintf(strErr, "Java Object Field is not found: int %s !!!", name); throwNewJavaSecurityException(env, strErr); } (*env)->SetIntField(env, obj, fieldId, value); (*env)->DeleteLocalRef(env, clazz); } void setJavaFieldLong(JNIEnv *env, jobject obj, const char *name, long value) { jclass clazz = (*env)->GetObjectClass(env, obj); jfieldID fieldId = (*env)->GetFieldID(env, clazz, name, "L"); if(!fieldId) { char strErr[255]; sprintf(strErr, "Java Object Field is not found: long %s !!!", name); throwNewJavaSecurityException(env, strErr); } (*env)->SetLongField(env, obj, fieldId, value); (*env)->DeleteLocalRef(env, clazz); } void setJavaFieldString(JNIEnv *env, jobject obj, const char *name, const char *value) { jclass clazz = (*env)->GetObjectClass(env, obj); jfieldID fieldId = (*env)->GetFieldID(env, clazz, name, "Ljava/lang/String;"); if(!fieldId) { char strErr[255]; sprintf(strErr, "Java Object Field is not found: String %s !!!", name); throwNewJavaSecurityException(env, strErr); } jstring jstr = (*env)->NewStringUTF(env, value); (*env)->SetObjectField(env, obj, fieldId, jstr); (*env)->DeleteLocalRef(env, clazz); } void throwNewJavaException(JNIEnv *env, const char *name, const char *msg) { jclass clazz = (*env)->FindClass(env, name); if (clazz) { (*env)->ThrowNew(env, clazz, msg); } (*env)->DeleteLocalRef(env, clazz); } void throwNewJavaSecurityException(JNIEnv *env, const char *msg) { throwNewJavaException(env, "java/lang/SecurityException", msg); } /* End of Helper Functions Implimentations */ jetty-6.1.26/extras/setuid/modules/native/pom.xml0000644000175000017500000001150011466510412020522 0ustar moonmoon jetty-setuid org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty libsetuid Jetty SetUID Native http://jetty.mortbay.org so libsetuid install maven-antrun-plugin copy-jni-implementation generate-sources run copy-native-library package run org.codehaus.mojo native-maven-plugin true linux -fPIC -O target/generated org_mortbay_setuid_SetUID.c ${jetty-setuid-linkerStartOption} -o ${project.build.directory}/libsetuid.so javah generate-sources org.mortbay.setuid.SetUID target/generated javah compile compile compile org.mortbay.jetty jetty-setuid-java ${project.version} junit junit test jetty-6.1.26/extras/setuid/pom.xml0000644000175000017500000001224111466510412015567 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-setuid Jetty SetUID pom maven-antrun-plugin clean clean run env-linux Linux modules/java modules/native -shared -lc -ldl target/libsetuid.so env-SunOs SunOS modules/java modules/native -lc -ldl target/libsetuid.so env-unix unix !Linux modules/java modules/native -lc -ldl target/libsetuid.so env-mac mac modules/java modules/native -lc -ldl -dynamiclib -undefined dynamic_lookup -single_module target/libsetuid.so org.codehaus.mojo native-maven-plugin mac ${java.home}/../Headers env-dos dos env-windows windows env-windows-9x win9x jetty-6.1.26/extras/setuid/README.TXT0000644000175000017500000000310011466510412015602 0ustar moonmoon Build and Install ----------------- On Linux or Unix with gcc installed, do: mvn install On other systems, you may need to manually generate the lib. Here are some guidelines to get you started, but you may need to vary the arguments to the gcc command depending on your environment: + run mvn install at the top level of this project + mkdir -p modules/native/target/generated + cp modules/native/src/main/native/org_mortbay_setuid_SetUID.c modules/native/target/generated + javah -d modules/native/target/generated -classpath modules/java/target/jetty-setuid-java-6.1.26.jar org.mortbay.setuid.SetUID + gcc -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/ \ -shared modules/native/target/generated/org_mortbay_setuid_SetUID.c -o \ ../../lib/ext/libsetuid.so Configuration ------------- Change etc/jetty-setuid.xml to use the userid or username, and/or group id or group name you want. Running ------- In the top level jetty directory do: + if your libsetuid.so is located at /lib/ext (the default location): sudo java -jar start.jar etc/jetty-setuid.xml etc/jetty.xml + or set the System property java.library.path to the directory where your libsetuid.so is located: sudo java -Djava.library.path=/directory/path/to/your/jetty/lib -jar start.jar etc/jetty-setuid.xml etc/jetty.xml + alternatively, set the System property jetty.libsetuid.path to the location of your libsetuid.so file: sudo java -Djetty.libsetuid.path=/directory/path/to/your/jetty/lib/libsetuid.so -jar start.jar etc/jetty-setuid.xml etc/jetty.xml jetty-6.1.26/extras/xbean/0000755000175000017500000000000011745736452014070 5ustar moonmoonjetty-6.1.26/extras/xbean/src/0000755000175000017500000000000011745736452014657 5ustar moonmoonjetty-6.1.26/extras/xbean/src/test/0000755000175000017500000000000011745736452015636 5ustar moonmoonjetty-6.1.26/extras/xbean/src/test/java/0000755000175000017500000000000011745736452016557 5ustar moonmoonjetty-6.1.26/extras/xbean/src/test/java/org/0000755000175000017500000000000011745736452017346 5ustar moonmoonjetty-6.1.26/extras/xbean/src/test/java/org/mortbay/0000755000175000017500000000000011745736452021023 5ustar moonmoonjetty-6.1.26/extras/xbean/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736452022162 5ustar moonmoonjetty-6.1.26/extras/xbean/src/test/java/org/mortbay/jetty/xbean/0000755000175000017500000000000011745736452023257 5ustar moonmoonjetty-6.1.26/extras/xbean/src/test/java/org/mortbay/jetty/xbean/xbean.xml0000644000175000017500000000210711463533153025064 0ustar moonmoon jetty-6.1.26/extras/xbean/src/test/java/org/mortbay/jetty/xbean/XBeanTest.java0000755000175000017500000001003510531253623025743 0ustar moonmoon/** * * Copyright 2005-2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mortbay.jetty.xbean; import java.net.URL; import java.util.Collection; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.apache.xbean.spring.context.ResourceXmlApplicationContext; import org.mortbay.component.LifeCycle; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.deployer.ContextDeployer; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.webapp.WebAppContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.core.io.UrlResource; public class XBeanTest extends TestCase { protected AbstractApplicationContext context; protected URL url; protected Server server; public void setUp() throws Exception { url = getClass().getClassLoader().getResource("org/mortbay/jetty/xbean/xbean.xml"); assertNotNull("Could not find xbean.xml on the classpath!", url); context = new ResourceXmlApplicationContext(new UrlResource(url)); } public void testUsingXBeanXmlConfig() throws Exception { System.setProperty("DEBUG", "false"); String[] names = context.getBeanNamesForType(Server.class); assertEquals("Should have the name of a Jetty server", 1, names.length); server = (Server) context.getBean(names[0]); assertNotNull("Should have a Jetty Server", server); HandlerCollection hcollection = (HandlerCollection) server.getChildHandlerByClass(HandlerCollection.class); assertNotNull("Should have a HandlerCollection", hcollection); assertNotNull("HandlerCollection should contain handlers", hcollection.getHandlers()); Handler[] handlers = hcollection.getHandlers(); assertEquals("Should be 3 handlers", 3,handlers.length); assertTrue("First handler should be a ContextHandlerCollection", handlers[0] instanceof ContextHandlerCollection); Handler[] webapps = ((ContextHandlerCollection)handlers[0]).getChildHandlers(); assertNotNull("Should be at least one webapp", webapps); assertTrue("Should be an instance of WebAppContext", webapps[0] instanceof WebAppContext); } public void testHotDeployer() throws Exception { System.setProperty("DEBUG", "false"); String[] names = context.getBeanNamesForType(Server.class); assertEquals("Should have the name of a Jetty server", 1, names.length); server = (Server) context.getBean(names[0]); assertNotNull("Should have a Jetty Server", server); Collection deployers = ((JettyFactoryBean) server).getDeployers(); assertTrue( "Should be a deployer", !deployers.isEmpty()); ContextDeployer deployer = null; for (Iterator iter = deployers.iterator(); iter.hasNext();) { deployer = (ContextDeployer) iter.next(); } assertNotNull("Should be a ContextDeployer", deployer); // Cannot get the following to work properly because the MacOS X java.io.tmpdir // resolves to /private/tmp instead of /tmp // assertEquals("", deployer.getConfigurationDir(), System.getProperty("java.io.tmpdir") + "/deploy"); } protected void tearDown() throws Exception { if (context != null) { context.destroy(); } server.stop(); } } jetty-6.1.26/extras/xbean/src/main/0000755000175000017500000000000011745736452015603 5ustar moonmoonjetty-6.1.26/extras/xbean/src/main/java/0000755000175000017500000000000011745736452016524 5ustar moonmoonjetty-6.1.26/extras/xbean/src/main/java/org/0000755000175000017500000000000011745736452017313 5ustar moonmoonjetty-6.1.26/extras/xbean/src/main/java/org/mortbay/0000755000175000017500000000000011745736452020770 5ustar moonmoonjetty-6.1.26/extras/xbean/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736452022127 5ustar moonmoonjetty-6.1.26/extras/xbean/src/main/java/org/mortbay/jetty/xbean/0000755000175000017500000000000011745736452023224 5ustar moonmoonjetty-6.1.26/extras/xbean/src/main/java/org/mortbay/jetty/xbean/JettyFactoryBean.java0000644000175000017500000000326410531253623027273 0ustar moonmoon/** * * Copyright 2005-2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mortbay.jetty.xbean; import java.util.Collection; import org.mortbay.jetty.Server; import org.mortbay.jetty.deployer.ContextDeployer; /** * Creates an instance of Jetty inside an XBean * configuration file * * @org.apache.xbean.XBean element="jetty" rootElement="true" description="Creates an * embedded Jetty web server with optional web application * context" * * @version $Revision: 1294 $ */ public class JettyFactoryBean extends Server { public Collection deployers; public ContextDeployer hotDeployer; /** * @org.apache.xbean.InitMethod * @throws Exception */ public void run () throws Exception { start(); } public Collection getDeployers() { return deployers; } public void setDeployers(Collection deployers) { this.deployers = deployers; } public ContextDeployer getHotDeployer() { return hotDeployer; } public void setHotDeployer(ContextDeployer hotDeployer) { this.hotDeployer = hotDeployer; addLifeCycle(hotDeployer); } }jetty-6.1.26/extras/xbean/src/main/resources/0000755000175000017500000000000011745736452017615 5ustar moonmoonjetty-6.1.26/extras/xbean/pom.xml0000644000175000017500000001144311466510412015372 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-xbean Jetty XBean src/test/java **/*Test.java org/mortbay/**/*.xml **/Abstract*.java maven-antrun-plugin clean clean run copyjar install run genxsd process-classes run junit junit test org.apache.xbean xbean-spring 2.2 org.mortbay.jetty jetty ${project.version} org.mortbay.jetty jetty-plus ${project.version} org.springframework spring 1.2.8 jetty-6.1.26/extras/client/0000755000175000017500000000000011745736455014254 5ustar moonmoonjetty-6.1.26/extras/client/src/0000755000175000017500000000000011745736453015041 5ustar moonmoonjetty-6.1.26/extras/client/src/test/0000755000175000017500000000000011745736453016020 5ustar moonmoonjetty-6.1.26/extras/client/src/test/java/0000755000175000017500000000000011745736452016740 5ustar moonmoonjetty-6.1.26/extras/client/src/test/java/org/0000755000175000017500000000000011745736452017527 5ustar moonmoonjetty-6.1.26/extras/client/src/test/java/org/mortbay/0000755000175000017500000000000011745736452021204 5ustar moonmoonjetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736452022343 5ustar moonmoonjetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/0000755000175000017500000000000011745736453023622 5ustar moonmoonjetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/SslSecurityListenerTest.java0000644000175000017500000001706611173372264031325 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.client; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.jetty.Connector; import org.mortbay.jetty.EofException; import org.mortbay.jetty.Handler; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.client.security.HashRealmResolver; import org.mortbay.jetty.client.security.Realm; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.jetty.security.BasicAuthenticator; import org.mortbay.jetty.security.Constraint; import org.mortbay.jetty.security.ConstraintMapping; import org.mortbay.jetty.security.HashUserRealm; import org.mortbay.jetty.security.SecurityHandler; import org.mortbay.jetty.security.SslSocketConnector; import org.mortbay.jetty.security.UserRealm; /** * Functional testing. */ public class SslSecurityListenerTest extends TestCase { protected Server _server; protected int _port; protected HttpClient _httpClient; protected Realm _jettyRealm; protected int _type = HttpClient.CONNECTOR_SOCKET; protected void setUp() throws Exception { startServer(); _httpClient = new HttpClient(); _httpClient.setConnectorType(_type); _httpClient.setMaxConnectionsPerAddress(2); _httpClient.start(); _jettyRealm = new Realm() { public String getId() { return "MyRealm"; } public String getPrincipal() { return "jetty"; } public String getCredentials() { return "jetty"; } }; HashRealmResolver resolver = new HashRealmResolver(); resolver.addSecurityRealm(_jettyRealm); _httpClient.setRealmResolver(resolver); } protected void tearDown() throws Exception { Thread.sleep(1000); _httpClient.stop(); Thread.sleep(1000); stopServer(); } public void testSslGet() throws Exception { final CyclicBarrier barrier = new CyclicBarrier(2); ContentExchange httpExchange = new ContentExchange() { protected void onResponseComplete() throws IOException { super.onResponseComplete(); try{barrier.await();}catch(Exception e){} } }; // httpExchange.setURL("https://dav.codehaus.org/user/jesse/index.html"); httpExchange.setURL("https://localhost:" + _port + "/"); httpExchange.setMethod(HttpMethods.GET); // httpExchange.setRequestHeader("Connection","close"); _httpClient.send(httpExchange); barrier.await(10,TimeUnit.SECONDS); assertEquals(HttpServletResponse.SC_OK,httpExchange.getResponseStatus()); // System.err.println(httpExchange.getResponseContent()); assertTrue(httpExchange.getResponseContent().length()>400); } protected void startServer() throws Exception { _server = new Server(); //SslSelectChannelConnector connector = new SslSelectChannelConnector(); SslSocketConnector connector = new SslSocketConnector(); String keystore = System.getProperty("user.dir") + File.separator + "src" + File.separator + "test" + File.separator + "resources" + File.separator + "keystore"; connector.setPort(0); connector.setKeystore(keystore); connector.setPassword("storepwd"); connector.setKeyPassword("keypwd"); _server.setConnectors(new Connector[] { connector }); UserRealm userRealm = new HashUserRealm("MyRealm","src/test/resources/realm.properties"); Constraint constraint = new Constraint(); constraint.setName("Need User or Admin"); constraint.setRoles(new String[] { "user", "admin" }); constraint.setAuthenticate(true); ConstraintMapping cm = new ConstraintMapping(); cm.setConstraint(constraint); cm.setPathSpec("/*"); SecurityHandler sh = new SecurityHandler(); _server.setHandler(sh); sh.setUserRealm(userRealm); sh.setConstraintMappings(new ConstraintMapping[] { cm }); sh.setAuthenticator(new BasicAuthenticator()); Handler testHandler = new AbstractHandler() { public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { System.err.println("passed authentication!\n"+((Request)request).getConnection().getRequestFields()); Request base_request = (request instanceof Request)?(Request)request:HttpConnection.getCurrentConnection().getRequest(); base_request.setHandled(true); response.setStatus(200); response.setContentType("text/plain"); if (request.getServerName().equals("jetty.mortbay.org")) { response.getOutputStream().println("Proxy request: " + request.getRequestURL()); } else if (request.getMethod().equalsIgnoreCase("GET")) { response.getOutputStream().println(""); for (int i = 0; i < 100; i++) { response.getOutputStream().println(" " + i + ""); if (i % 20 == 0) response.getOutputStream().flush(); } response.getOutputStream().println(""); } else { copyStream(request.getInputStream(),response.getOutputStream()); } } }; sh.setHandler(testHandler); _server.start(); _port = connector.getLocalPort(); } public static void copyStream(InputStream in, OutputStream out) { try { byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) >= 0) { out.write(buffer,0,len); } } catch (EofException e) { System.err.println(e); } catch (IOException e) { e.printStackTrace(); } } private void stopServer() throws Exception { _server.stop(); } }jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/TimeoutDelayPerExchangeTest.java0000644000175000017500000002277311426026437032045 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.Assert; import junit.framework.TestCase; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.HttpStatus; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.jetty.nio.SelectChannelConnector; public class TimeoutDelayPerExchangeTest extends TestCase { protected HttpClient _httpClient; protected int _maxConnectionsPerAddress = 2; protected String _scheme = "http://"; protected Server _server; protected int _port; protected Connector _connector; public void setUp() throws Exception { startServer(); createClient(); } public void tearDown() throws Exception { _httpClient.stop(); Thread.sleep(500); stopServer(); } private void startServer() throws Exception { _server = new Server(); _server.setGracefulShutdown(500); _connector = new SelectChannelConnector(); _connector.setPort(0); _server.setConnectors(new Connector[] { _connector }); Handler handler = new AbstractHandler() { public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { try { // let's sleep for 0.7 sec as the default timeout is 0.5 sec Thread.sleep(700); } catch (Exception e) { e.printStackTrace(); } response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); response.getWriter().println("

Hello

"); ((Request)request).setHandled(true); } }; _server.setHandler(handler); _server.start(); _port = _connector.getLocalPort(); } private void stopServer() throws Exception { if (_server != null) { _server.stop(); _server = null; } } private void createClient() throws Exception { _httpClient = new HttpClient(); _httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); _httpClient.setMaxConnectionsPerAddress(_maxConnectionsPerAddress); // default timeout = 500 ms _httpClient.setTimeout(500); _httpClient.start(); } public void testTimeouts() throws Exception { CustomContentExchange httpExchange = new CustomContentExchange(); httpExchange.setURL(_scheme + "localhost:" + _port); httpExchange.setMethod(HttpMethods.POST); httpExchange.setRequestContent(new ByteArrayBuffer("

??

")); // let's use the default timeout - the one set on the HttpClient // (500 ms) _httpClient.send(httpExchange); httpExchange.getDoneLatch().await(900,TimeUnit.MILLISECONDS); // we should get a timeout - the server sleeps for 700 ms Assert.assertTrue(httpExchange.isTimeoutOccurred()); Assert.assertFalse(httpExchange.isResponseReceived()); // let's do it again - with a custom timeout httpExchange = new CustomContentExchange(); httpExchange.setURL(_scheme + "localhost:" + _port); httpExchange.setMethod(HttpMethods.POST); httpExchange.setRequestContent(new ByteArrayBuffer("

??

")); httpExchange.setTimeout(500); // let's use a custom timeout - 500 ms (the default one) + 500 ms // delay = 1000 ms _httpClient.send(httpExchange); httpExchange.getDoneLatch().await(1100,TimeUnit.MILLISECONDS); // we should not get a timeout - the server sleeps for 700 ms // while we wait for 1000 ms Assert.assertFalse(httpExchange.isTimeoutOccurred()); Assert.assertTrue(httpExchange.isResponseReceived()); } class CustomContentExchange extends ContentExchange { protected final CountDownLatch _doneLatch = new CountDownLatch(1); protected boolean _errorOccurred = false; protected boolean _timeoutOccurred = false; protected boolean _responseReceived = false; public boolean isErrorOccurred() { return _errorOccurred; } public boolean isTimeoutOccurred() { return _timeoutOccurred; } public boolean isResponseReceived() { return _responseReceived; } public CustomContentExchange() { super(true); } @Override protected void onRequestComplete() throws IOException { // close the input stream when its not needed anymore InputStream is = getRequestContentSource(); if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } @Override protected void onResponseComplete() throws IOException { try { super.onResponseComplete(); } finally { doTaskCompleted(); } } @Override protected void onExpire() { try { super.onExpire(); } finally { doTaskCompleted(); } } @Override protected void onException(Throwable ex) { try { super.onException(ex); } finally { doTaskCompleted(ex); } } @Override protected void onConnectionFailed(Throwable ex) { try { super.onConnectionFailed(ex); } finally { doTaskCompleted(ex); } } public String getBody() throws UnsupportedEncodingException { return super.getResponseContent(); } public String getUrl() { String params = getRequestFields().getStringField(HttpHeaders.CONTENT_ENCODING); return getScheme() + "//" + getAddress().toString() + getURI() + (params != null?"?" + params:""); } protected void doTaskCompleted() { int exchangeState = getStatus(); try { if (exchangeState == HttpExchange.STATUS_COMPLETED) { // process the response as the state is ok try { int responseCode = getResponseStatus(); if (responseCode >= HttpStatus.ORDINAL_100_Continue && responseCode < HttpStatus.ORDINAL_300_Multiple_Choices) { _responseReceived = true; } else { _errorOccurred = true; } } catch (Exception e) { _errorOccurred = true; e.printStackTrace(); } } else if (exchangeState == HttpExchange.STATUS_EXPIRED) { _timeoutOccurred = true; } else { _errorOccurred = true; } } finally { // make sure to lower the latch getDoneLatch().countDown(); } } protected void doTaskCompleted(Throwable ex) { try { _errorOccurred = true; } finally { // make sure to lower the latch getDoneLatch().countDown(); } } public CountDownLatch getDoneLatch() { return _doneLatch; } } } jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/AsyncSslHttpExchangeTest.java0000644000175000017500000000230611044235703031350 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client; public class AsyncSslHttpExchangeTest extends SslHttpExchangeTest { protected void setUp() throws Exception { _scheme="https://"; startServer(); _httpClient=new HttpClient(); _httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); _httpClient.setMaxConnectionsPerAddress(2); _httpClient.start(); } }jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/HttpExchangeTest.java0000644000175000017500000003713311363551200027673 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.client; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.io.Buffer; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.io.nio.DirectNIOBuffer; import org.mortbay.jetty.Connector; import org.mortbay.jetty.EofException; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.client.security.ProxyAuthorization; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.log.Log; import org.mortbay.util.IO; /** * Functional testing for HttpExchange. * * @author Matthew Purland * @author Greg Wilkins */ public class HttpExchangeTest extends TestCase { private boolean _stress=Boolean.getBoolean("STRESS"); protected int _maxConnectionsPerAddress = 2; protected String _scheme = "http://"; protected Server _server; protected int _port; protected HttpClient _httpClient; protected Connector _connector; protected AtomicInteger _count = new AtomicInteger(); protected void setUp() throws Exception { startServer(); _httpClient=new HttpClient(); _httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); _httpClient.setMaxConnectionsPerAddress(_maxConnectionsPerAddress); _httpClient.start(); } protected void tearDown() throws Exception { _httpClient.stop(); Thread.sleep(500); stopServer(); } public void testPerf() throws Exception { sender(1,false); sender(1,true); sender(10,false); sender(10,true); sender(100,false); sender(100,true); if (_stress) { sender(1000,false); sender(1000,true); } } /** * Test sending data through the exchange. * * @throws IOException */ public void sender(final int nb,final boolean close) throws Exception { _count.set(0); final CountDownLatch complete=new CountDownLatch(nb); final CountDownLatch latch=new CountDownLatch(nb); HttpExchange[] httpExchange = new HttpExchange[nb]; long start=System.currentTimeMillis(); for (int i=0; i0) System.err.println(nb+"/"+_count+" c="+close+" rate="+(nb*1000/elapsed)); assertEquals("nb="+nb+" close="+close,0,latch.getCount()); } public void testPostWithContentExchange() throws Exception { for (int i=0;i<200;i++) { ContentExchange httpExchange=new ContentExchange(); //httpExchange.setURL(_scheme+"localhost:"+_port+"/"); httpExchange.setURL(_scheme+"localhost:"+_port); httpExchange.setMethod(HttpMethods.POST); httpExchange.setRequestContent(new ByteArrayBuffer("")); _httpClient.send(httpExchange); int status = httpExchange.waitForDone(); //httpExchange.waitForStatus(HttpExchange.STATUS_COMPLETED); String result=httpExchange.getResponseContent(); assertEquals(HttpExchange.STATUS_COMPLETED, status); assertEquals("i="+i,"",result); } } public void testGetWithContentExchange() throws Exception { for (int i=0;i<200;i++) { ContentExchange httpExchange=new ContentExchange(); httpExchange.setURL(_scheme+"localhost:"+_port+"/?i="+i); httpExchange.setMethod(HttpMethods.GET); _httpClient.send(httpExchange); int status = httpExchange.waitForDone(); //httpExchange.waitForStatus(HttpExchange.STATUS_COMPLETED); String result=httpExchange.getResponseContent(); assertEquals("i="+i,0,result.indexOf("")); assertEquals("i="+i,result.length()-10,result.indexOf("")); assertEquals(HttpExchange.STATUS_COMPLETED, status); Thread.sleep(5); } } public void testBigPostWithContentExchange() throws Exception { int size =32; ContentExchange httpExchange=new ContentExchange(); Buffer babuf = new ByteArrayBuffer(size*36*1024); Buffer niobuf = new DirectNIOBuffer(size*36*1024); byte[] bytes="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".getBytes(); for (int i=0;i"); for (; i<100; i++) { response.getOutputStream().println(" "+i+""); } else { response.setContentType(request.getContentType()); int size=request.getContentLength(); ByteArrayOutputStream bout = new ByteArrayOutputStream(size>0?size:32768); IO.copy(request.getInputStream(),bout); response.getOutputStream().write(bout.toByteArray()); } } catch(IOException e) { e.printStackTrace(); throw e; } catch(Throwable e) { e.printStackTrace(); throw new ServletException(e); } finally { // System.err.println("HANDLED "+i); } } }); _server.start(); _port=_connector.getLocalPort(); } private void stopServer() throws Exception { _server.stop(); } } jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/SslHttpExchangeTest.java0000644000175000017500000000424511173372264030365 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.client; import java.io.File; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Server; import org.mortbay.jetty.security.SslSocketConnector; /** * Functional testing for HttpExchange. * * @author Matthew Purland * @author Greg Wilkins */ public class SslHttpExchangeTest extends HttpExchangeTest { protected void setUp() throws Exception { _scheme="https://"; startServer(); _httpClient=new HttpClient(); // _httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); _httpClient.setConnectorType(HttpClient.CONNECTOR_SOCKET); _httpClient.setMaxConnectionsPerAddress(2); _httpClient.start(); } protected void newServer() { _server = new Server(); //SslSelectChannelConnector connector = new SslSelectChannelConnector(); SslSocketConnector connector = new SslSocketConnector(); String keystore = System.getProperty("user.dir") + File.separator + "src" + File.separator + "test" + File.separator + "resources" + File.separator + "keystore"; connector.setPort(0); connector.setKeystore(keystore); connector.setPassword("storepwd"); connector.setKeyPassword("keypwd"); _server.setConnectors(new Connector[] { connector }); _connector=connector; } } jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/security/0000755000175000017500000000000011745736453025471 5ustar moonmoonjetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/security/SecurityResolverTest.java0000644000175000017500000000353111173372264032516 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; import junit.framework.TestCase; public class SecurityResolverTest extends TestCase { public void testNothing() { } /* TODO public void testCredentialParsing() throws Exception { SecurityListener resolver = new SecurityListener(); Buffer value = new ByteArrayBuffer("basic a=b".getBytes()); assertEquals( "basic", resolver.scrapeAuthenticationType( value.toString() ) ); assertEquals( 1, resolver.scrapeAuthenticationDetails( value.toString() ).size() ); value = new ByteArrayBuffer("digest a=boo, c=\"doo\" , egg=foo".getBytes()); assertEquals( "digest", resolver.scrapeAuthenticationType( value.toString() ) ); Map testMap = resolver.scrapeAuthenticationDetails( value.toString() ); assertEquals( 3, testMap.size() ); assertEquals( "boo", testMap.get("a") ); assertEquals( "doo", testMap.get("c") ); assertEquals( "foo", testMap.get("egg") ); } */ } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootjetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/ExternalKeyStoreAsyncSslHttpExchangeTest.javajetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/ExternalKeyStoreAsyncSslHttpExchan0000644000175000017500000000311211330312131032426 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client; import java.io.File; public class ExternalKeyStoreAsyncSslHttpExchangeTest extends SslHttpExchangeTest { protected void setUp() throws Exception { _scheme="https://"; startServer(); _httpClient=new HttpClient(); _httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); _httpClient.setMaxConnectionsPerAddress(2); String keystore = System.getProperty("user.dir") + File.separator + "src" + File.separator + "test" + File.separator + "resources" + File.separator + "keystore"; _httpClient.setKeyStoreLocation( keystore ); _httpClient.setKeyStorePassword( "storepwd"); _httpClient.setKeyManagerPassword( "keypwd" ); _httpClient.start(); } }jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/ExpireTest.java0000644000175000017500000001162411173372264026554 0ustar moonmoonpackage org.mortbay.jetty.client; //======================================================================== //Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== import java.io.IOException; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.log.Log; /* Test expiring connections * * Test contributed by: Michiel Thuys for JETTY-806 */ public class ExpireTest extends TestCase { HttpClient client; Server server; AtomicInteger expireCount = new AtomicInteger(); final String host = "localhost"; int _port; @Override protected void setUp() throws Exception { client = new HttpClient(); client.setConnectorType( HttpClient.CONNECTOR_SELECT_CHANNEL ); client.setTimeout( 200 ); client.setMaxRetries( 0 ); client.setMaxConnectionsPerAddress(100); try { client.start(); } catch ( Exception e ) { throw new Error( "Cannot start HTTP client: " + e ); } // Create server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setHost( host ); connector.setPort( 0 ); server.setConnectors( new Connector[] { connector } ); server.setHandler( new AbstractHandler() { public void handle( String target, HttpServletRequest servletRequest, HttpServletResponse response, int dispatch ) throws IOException, ServletException { Request request = (Request) servletRequest; try { Thread.sleep( 2000 ); } catch ( InterruptedException e ) { // TODO Auto-generated catch block e.printStackTrace(); } request.setHandled( true ); } } ); try { server.start(); _port = connector.getLocalPort(); } catch ( Exception e ) { Log.warn( "Cannot create server: " + e ); } } @Override protected void tearDown() throws Exception { client.stop(); server.stop(); } public void testExpire() throws IOException { String baseUrl = "http://" + host + ":" + _port + "/"; int count = 200; expireCount.set( 0 ); Log.info( "Starting test on " + baseUrl ); for (int i=0;i0 && loops < 10 ) // max out at 30 seconds { Log.info( "waiting for test to complete: "+expireCount.get()+" of "+count ); ++loops; Thread.sleep( 2000 ); } Thread.sleep( 2000 ); } catch ( InterruptedException e ) { e.printStackTrace(); } System.err.println('!'); assertEquals( 0, expireCount.get() ); } } jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/AsyncSslSecurityListenerTest.java0000644000175000017500000000206011044235703032300 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client; public class AsyncSslSecurityListenerTest extends SslSecurityListenerTest { protected void setUp() throws Exception { _type = HttpClient.CONNECTOR_SELECT_CHANNEL; super.setUp(); } }jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/SecurityListenerTest.java0000644000175000017500000002460711173372264030642 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.io.Buffer; import org.mortbay.jetty.Connector; import org.mortbay.jetty.EofException; import org.mortbay.jetty.Handler; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.client.security.HashRealmResolver; import org.mortbay.jetty.client.security.Realm; import org.mortbay.jetty.client.security.SimpleRealmResolver; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.security.BasicAuthenticator; import org.mortbay.jetty.security.Constraint; import org.mortbay.jetty.security.ConstraintMapping; import org.mortbay.jetty.security.HashUserRealm; import org.mortbay.jetty.security.SecurityHandler; import org.mortbay.jetty.security.UserRealm; /** * Functional testing for HttpExchange. * * @author Matthew Purland * @author Greg Wilkins */ public class SecurityListenerTest extends TestCase { private Server _server; private int _port; private HttpClient _httpClient; private Realm _jettyRealm; protected void setUp() throws Exception { startServer(); _httpClient=new HttpClient(); _httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); _httpClient.setMaxConnectionsPerAddress(2); _httpClient.start(); _jettyRealm = new Realm() { public String getId() { return "MyRealm"; } public String getPrincipal() { return "jetty"; } public String getCredentials() { return "jetty"; } }; _httpClient.setRealmResolver(new SimpleRealmResolver(_jettyRealm)); } protected void tearDown() throws Exception { stopServer(); _httpClient.stop(); } public void xtestPerf() throws Exception { sender(1); Thread.sleep(200); sender(10); Thread.sleep(200); sender(100); Thread.sleep(200); sender(1000); Thread.sleep(200); sender(10000); } public void sender(final int nb) throws Exception { final CountDownLatch latch=new CountDownLatch(nb); long l0=System.currentTimeMillis(); for (int i=0; i0) { // System.err.println("waiting for "+last+" sent "+(System.currentTimeMillis()-l0)/1000 + "s ago ..."); latch.await(5,TimeUnit.SECONDS); long next=latch.getCount(); if (last==next) break; last=next; } // System.err.println("missed "+latch.getCount()+" sent "+(System.currentTimeMillis()-l0)/1000 + "s ago."); assertEquals(0,latch.getCount()); long l1=System.currentTimeMillis(); } public void testGetWithContentExchange() throws Exception { int i = 1; final CyclicBarrier barrier = new CyclicBarrier(2); ContentExchange httpExchange = new ContentExchange() { protected void onResponseComplete() throws IOException { super.onResponseComplete(); try{barrier.await();}catch(Exception e){} } }; httpExchange.setURL("http://localhost:" + _port + "/?i=" + i); httpExchange.setMethod(HttpMethods.GET); _httpClient.send(httpExchange); try{barrier.await();}catch(Exception e){} } public void testDestinationSecurityCaching() throws Exception { final CyclicBarrier barrier = new CyclicBarrier(2); ContentExchange httpExchange = new ContentExchange() { protected void onResponseComplete() throws IOException { super.onResponseComplete(); try{barrier.await();}catch(Exception e){} } }; httpExchange.setURL("http://localhost:" + _port + "/?i=1"); httpExchange.setMethod(HttpMethods.GET); _httpClient.send(httpExchange); try{barrier.await();}catch(Exception e){} barrier.reset(); ContentExchange httpExchange2 = new ContentExchange() { protected void onResponseComplete() throws IOException { super.onResponseComplete(); try{barrier.await();}catch(Exception e){} } }; httpExchange2.setURL("http://localhost:" + _port + "/?i=2"); httpExchange2.setMethod(HttpMethods.GET); _httpClient.send(httpExchange2); try{barrier.await();}catch(Exception e){} assertFalse( "exchange was retried", httpExchange2.getRetryStatus() ); } public static void copyStream(InputStream in, OutputStream out) { try { byte[] buffer=new byte[1024]; int len; while ((len=in.read(buffer))>=0) { out.write(buffer,0,len); } } catch (EofException e) { System.err.println(e); } catch (IOException e) { e.printStackTrace(); } } private void startServer() throws Exception { _server = new Server(); _server.setGracefulShutdown(500); Connector connector = new SelectChannelConnector(); connector.setPort(0); _server.setConnectors(new Connector[]{connector}); UserRealm userRealm = new HashUserRealm("MyRealm", "src/test/resources/realm.properties"); Constraint constraint = new Constraint(); constraint.setName("Need User or Admin"); constraint.setRoles(new String[]{"user", "admin"}); constraint.setAuthenticate(true); ConstraintMapping cm = new ConstraintMapping(); cm.setConstraint(constraint); cm.setPathSpec("/*"); SecurityHandler sh = new SecurityHandler(); _server.setHandler(sh); sh.setUserRealm(userRealm); sh.setConstraintMappings(new ConstraintMapping[]{cm}); sh.setAuthenticator(new BasicAuthenticator()); Handler testHandler = new AbstractHandler() { public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { System.out.println("passed authentication!"); Request base_request=(request instanceof Request)?(Request)request:HttpConnection.getCurrentConnection().getRequest(); base_request.setHandled(true); response.setStatus(200); if (request.getServerName().equals("jetty.mortbay.org")) { response.getOutputStream().println("Proxy request: "+request.getRequestURL()); } else if (request.getMethod().equalsIgnoreCase("GET")) { response.getOutputStream().println(""); for (int i=0; i<100; i++) { response.getOutputStream().println(" "+i+""); if (i%20==0) response.getOutputStream().flush(); } response.getOutputStream().println(""); } else { copyStream(request.getInputStream(),response.getOutputStream()); } } }; sh.setHandler(testHandler); _server.start(); _port = connector.getLocalPort(); } private void stopServer() throws Exception { _server.stop(); } }jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/JettyClientTest.java0000644000175000017500000001777511361046136027566 0ustar moonmoonpackage org.mortbay.jetty.client; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; import java.util.Arrays; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.io.EndPoint; import org.mortbay.io.bio.SocketEndPoint; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.bio.SocketConnector; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.ServletHolder; public class JettyClientTest extends TestCase { private volatile Server _server; private volatile SocketConnector _connector; private volatile EndPoint _endp; private volatile HttpClient _client; private volatile static int _PORT = 0; private volatile static String _url; // Restart the Jetty server public synchronized void breakConnection() { try { if (_endp!=null) { ((Socket)((SocketEndPoint)_endp).getTransport()).close(); _endp=null; } } catch(IOException e) { e.printStackTrace(); } } public synchronized void startServer() throws Exception { // Create a Jetty server with a simple servlet that returns immediately _server = new Server(); _connector = new SocketConnector() { @Override public void customize(EndPoint endpoint, Request request) throws IOException { super.customize(endpoint,request); if (_endp!=null) throw new IllegalStateException("ENDP SET"); _endp=endpoint; } }; _connector.setHost("127.0.0.1"); _connector.setStatsOn(true); if (_PORT == 0) { _connector.setPort(0); } else { _connector.setPort(_PORT); } _server.addConnector(_connector); Context context = new Context(_server,"",Context.NO_SECURITY | Context.NO_SESSIONS); ServletHolder h = new ServletHolder(new HttpServlet() { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/plain"); resp.setStatus(HttpServletResponse.SC_OK); resp.getWriter().write("ok\n"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/plain"); resp.setStatus(HttpServletResponse.SC_OK); resp.getWriter().write("ok\n"); } }); context.addServlet(h,"/ping"); _server.start(); _PORT = _connector.getLocalPort(); _url = String.format("http://localhost:%d/ping",_PORT); } // Restart the Jetty client public void startClient() throws Exception { if (_client != null) { _client.stop(); _client = null; } _client = new HttpClient(); _client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); _client.setIdleTimeout(60000); _client.setMaxRetries(0); _client.setTimeout(60000); _client.setSoTimeout(60000); _client.setMaxConnectionsPerAddress(1); _client.start(); } // Simple HTTP exchange public static class SimpleExchange extends CachedExchange { SimpleExchange() { super(true); } public void setup(String url) throws IOException { setMethod("POST"); setURL(url); byte[] content = "hello".getBytes(); setRequestHeader(HttpHeaders.CONTENT_TYPE,"text/plain"); setRequestHeader(HttpHeaders.CONTENT_LENGTH,Integer.toString(content.length)); setRequestContentSource(new ByteArrayInputStream(content)); } @Override protected void onException(Throwable exc) { // super.onException(exc); } @Override protected void onConnectionFailed(Throwable exc) { // super.onConnectionFailed(exc); } @Override protected void onExpire() { // super.onExpire(); } } // An exchange that restarts the server while flushing data, to simulate // the case where the server dies while the client is sending. public class InterruptedExchange extends SimpleExchange { @Override public void setup(String url) { setMethod("POST"); setURL(url); final byte[] content = new byte[4096]; final int content_length=4096*4096; Arrays.fill(content,(byte)'x'); setRequestHeader(HttpHeaders.CONTENT_TYPE,"text/plain"); setRequestHeader(HttpHeaders.CONTENT_LENGTH,Integer.toString(content_length)); // Restart the server every RESET_INTERVAL bytes setRequestContentSource(new InputStream() { private int pos = 0; private void checkReset() throws IOException { if (_endp!=null) { breakConnection(); } } @Override public int read() throws IOException { checkReset(); return (pos < content_length?(int)'x':-1); } @Override public int available() { return content_length-pos; } @Override public int read(byte[] b, int offset, int length) throws IOException { checkReset(); int available = available(); if (available == 0) return -1; if (length>4096) length=4096; length = Math.min(length,available); System.arraycopy(content,0,b,offset,length); pos += length; return length; } }); } } public int runExchange(SimpleExchange exchange) throws Exception { exchange.setup(_url); _client.send(exchange); exchange.waitForDone(); return exchange.getStatus(); } public void setUp() throws Exception { startServer(); startClient(); } public void tearDown() throws Exception { _server.stop(); _server = null; _client.stop(); _client = null; } public void testSimple() throws Exception { assertEquals(HttpExchange.STATUS_COMPLETED,runExchange(new SimpleExchange())); } public void testReconnect() throws Exception { for (int i = 0; i < 10; i++) { final int id=i; // System.err.println("\nerror "+i); assertEquals("error " + i,HttpExchange.STATUS_EXCEPTED,runExchange(new InterruptedExchange() { /* (non-Javadoc) * @see org.mortbay.jetty.client.JettyClientTest.SimpleExchange#onException(java.lang.Throwable) */ @Override protected void onException(Throwable exc) { // System.err.println(exc+" "+id); super.onException(exc); } })); // System.err.println("success "+i); assertEquals("reconnect " + i,HttpExchange.STATUS_COMPLETED,runExchange(new SimpleExchange())); } } } jetty-6.1.26/extras/client/src/test/java/org/mortbay/jetty/client/WebdavListenerTest.java0000644000175000017500000001262111173372264030234 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.client; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import junit.framework.TestCase; import org.mortbay.io.Buffer; import org.mortbay.jetty.Connector; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.Server; import org.mortbay.jetty.client.security.HashRealmResolver; import org.mortbay.jetty.client.security.Realm; import org.mortbay.jetty.client.security.SimpleRealmResolver; import org.mortbay.jetty.client.webdav.WebdavListener; /** * Functional testing for HttpExchange. * * @author Matthew Purland * @author Greg Wilkins */ public class WebdavListenerTest extends TestCase//extends HttpExchangeTest { protected String _scheme = "http://"; protected Server _server; protected int _port; protected HttpClient _httpClient; protected Connector _connector; private String _username = "janb"; private String _password = "xxxxx"; private String _singleFileURL; private String _dirFileURL; private String _dirURL; protected void setUp() throws Exception { _singleFileURL = "https://dav.codehaus.org/user/" + _username + "/foo.txt"; _dirURL = "https://dav.codehaus.org/user/" + _username + "/ttt/"; _dirFileURL = _dirURL+"foo.txt"; _scheme="https://"; _httpClient=new HttpClient(); _httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); //_httpClient.setMaxConnectionsPerAddress(4); _httpClient.setRealmResolver( new SimpleRealmResolver ( new Realm(){ public String getId() { return _username + "'s webspace"; //To change body of implemented methods use File | Settings | File Templates. } public String getPrincipal() { return _username; //To change body of implemented methods use File | Settings | File Templates. } public String getCredentials() { return _password; //To change body of implemented methods use File | Settings | File Templates. } } )); _httpClient.registerListener( "org.mortbay.jetty.client.webdav.WebdavListener"); _httpClient.start(); } public void tearDown () throws Exception { _httpClient.stop(); } public void testPUTandDELETEwithSSL() throws Exception { File file = new File("src/test/resources/foo.txt"); assertTrue(file.exists()); /* * UNCOMMENT TO TEST WITH REAL DAV SERVER * Remember to set _username and _password to a real user's account. * */ /* //PUT a FILE ContentExchange singleFileExchange = new ContentExchange(); singleFileExchange.setURL(_singleFileURL); singleFileExchange.setMethod( HttpMethods.PUT ); singleFileExchange.setFileForUpload(file); singleFileExchange.setRequestHeader( "Content-Type", "application/octet-stream"); singleFileExchange.setRequestHeader("Content-Length", String.valueOf( file.length() )); _httpClient.send(singleFileExchange); singleFileExchange.waitForDone(); String result = singleFileExchange.getResponseContent(); assertEquals(201, singleFileExchange.getResponseStatus()); //PUT a FILE in a directory hierarchy ContentExchange dirFileExchange = new ContentExchange(); dirFileExchange.setURL(_dirFileURL); dirFileExchange.setMethod( HttpMethods.PUT ); dirFileExchange.setFileForUpload(file); dirFileExchange.setRequestHeader( "Content-Type", "application/octet-stream"); dirFileExchange.setRequestHeader("Content-Length", String.valueOf( file.length() )); _httpClient.send(dirFileExchange); dirFileExchange.waitForDone(); result = dirFileExchange.getResponseContent(); assertEquals(201, singleFileExchange.getResponseStatus()); //DELETE the single file HttpExchange del = new HttpExchange(); del.setURL(_singleFileURL); del.setMethod(HttpMethods.DELETE); _httpClient.send(del); del.waitForCompletion(); //DELETE the whole dir del.setURL(_dirURL); del.setMethod(HttpMethods.DELETE); del.setRequestHeader("Depth", "infinity"); _httpClient.send(del); del.waitForCompletion(); */ } }jetty-6.1.26/extras/client/src/test/resources/0000755000175000017500000000000011745736453020032 5ustar moonmoonjetty-6.1.26/extras/client/src/test/resources/foo.txt0000644000175000017500000000000711173372264021342 0ustar moonmoonjetty-6.1.26/extras/client/src/test/resources/keystore0000644000175000017500000000262211041571566021613 0ustar moonmoonþíþímykeyâ]ÝAº0‚¶0 +*‚¢+!¨Ûì†×u䛪–Àñ7lMꔄ½½‰\%à˜p.G#Ý¥‡„zgZ½›-×mšvðÖ[á´Â¸êà7‰ùœ3i:2Ò$å

C— $,½Ê‰@g…À Alùèx‡ q*¶ ãàì¯ÙðIq"?¯®1ž~®jÜ©¶ˆO¿Ål›"‡­Ì[z{5anˆbñ],*Lu||<6=a«$ìÝìc+ú9ÄêÜ¢—ÄówÆmÅÕ`Óï¸óX.509’0‚Ž0‚÷9òñà0  *†H†÷ 010UUnknown10UUnknown10UUnknown10U Mort Bay Consulting1 0U Open Source Development10U Jetty Server0 001022135544Z 010120135544Z010UUnknown10UUnknown10UUnknown10U Mort Bay Consulting1 0U Open Source Development10U Jetty Server0Ÿ0  *†H†÷ 0‰µõ4銴*?Ôð’€TVËhU•îžzi„‘-¸. H?Ó °q€¤«9>‹˜ø?*ì]žšÀR@Nb‘aI\@Á`Á¶ÅŽ ¤LÇ~ƒoà==uz‡¥¾ÐÊÕ»ÂI l üÜEÊà;r¸¡ÈNßT+–4J¯PdÝõ`0  *†H†÷ =6BkјêÀ@ÚЪÛ>hµTñ8£Vä$Gwc\2èá¿Hz%¦Ée³£êNs"îøֶh–.[•7©C¤ð¾|àxä5»mp“Ê7=ª–Oð«gi‰?Q±CÍDƪO»´ÎALr›ÍP€ÿ‰p>ç¾´øV[Ï×¼q"x?js>!sô¦IAéúмðxÌ8*l:†jetty-6.1.26/extras/client/src/test/resources/realm.properties0000644000175000017500000000140511173372264023237 0ustar moonmoon# # This file defines users passwords and roles for a HashUserRealm # # The format is # : [, ...] # # Passwords may be clear text, obfuscated or checksummed. The class # org.mortbay.util.Password should be used to generate obfuscated # passwords or password checksums # # If DIGEST Authentication is used, the password must be in a recoverable # format, either plain text or OBF:. # # if using digest authentication, do not MD5-hash the password jetty: jetty,user admin: CRYPT:ad1ks..kc.1Ug,server-administrator,content-administrator,admin other: OBF:1xmk1w261u9r1w1c1xmq plain: plain user: password # This entry is for digest auth. The credential is a MD5 hash of username:realmname:password digest: MD5:6e120743ad67abfbc385bc2bb754e297 jetty-6.1.26/extras/client/src/main/0000755000175000017500000000000011745736453015765 5ustar moonmoonjetty-6.1.26/extras/client/src/main/assembly/0000755000175000017500000000000011745736453017604 5ustar moonmoonjetty-6.1.26/extras/client/src/main/assembly/assembly.xml0000644000175000017500000000247411173372264022143 0ustar moonmoon assembly jar false true true / javax/servlet/http/Local* javax/servlet/http/No* javax/servlet/resources/** javax/servlet/jsp/** org/mortbay/jetty/handler/** org/mortbay/jetty/servlet/** org/mortbay/xml/** org/mortbay/jetty/xbean/** org/mortbay/jetty/deployer/** org/mortbay/jetty/webapp/** org/mortbay/jetty/resource/** org/mortbay/jetty/Server* org/mortbay/util/ajax/** org/mortbay/servlet/** org/mortbay/proxy/AsyncProxyServlet* META-INF/maven/** jetty-sslengine.xml jetty-6.1.26/extras/client/src/main/java/0000755000175000017500000000000011745736453016706 5ustar moonmoonjetty-6.1.26/extras/client/src/main/java/org/0000755000175000017500000000000011745736453017475 5ustar moonmoonjetty-6.1.26/extras/client/src/main/java/org/mortbay/0000755000175000017500000000000011745736454021153 5ustar moonmoonjetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736453022311 5ustar moonmoonjetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/0000755000175000017500000000000011745736454023570 5ustar moonmoonjetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/HttpConnection.java0000644000175000017500000005206211426021057027355 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; import java.util.concurrent.atomic.AtomicBoolean; import org.mortbay.io.Buffer; import org.mortbay.io.Buffers; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.io.Connection; import org.mortbay.io.EndPoint; import org.mortbay.io.View; import org.mortbay.io.nio.SelectChannelEndPoint; import org.mortbay.jetty.HttpGenerator; import org.mortbay.jetty.HttpHeaderValues; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.HttpParser; import org.mortbay.jetty.HttpSchemes; import org.mortbay.jetty.HttpVersions; import org.mortbay.jetty.client.security.Authorization; import org.mortbay.jetty.security.SslHttpChannelEndPoint; import org.mortbay.log.Log; import org.mortbay.thread.Timeout; /** * * @author Greg Wilkins * @author Guillaume Nodet */ public class HttpConnection implements Connection { HttpDestination _destination; EndPoint _endp; HttpGenerator _generator; HttpParser _parser; boolean _http11 = true; Buffer _connectionHeader; Buffer _requestContentChunk; boolean _requestComplete; public boolean _reserved; // The current exchange waiting for a response volatile HttpExchange _exchange; HttpExchange _pipeline; private final Timeout.Task _timeout = new TimeoutTask(); private AtomicBoolean _idle = new AtomicBoolean(false); public void dump() throws IOException { System.err.println("endp=" + _endp + " " + _endp.isBufferingInput() + " " + _endp.isBufferingOutput()); System.err.println("generator=" + _generator); System.err.println("parser=" + _parser.getState() + " " + _parser.isMoreInBuffer()); System.err.println("exchange=" + _exchange); if (_endp instanceof SslHttpChannelEndPoint) ((SslHttpChannelEndPoint)_endp).dump(); } /* ------------------------------------------------------------ */ HttpConnection(Buffers buffers, EndPoint endp, int hbs, int cbs) { _endp = endp; _generator = new HttpGenerator(buffers,endp,hbs,cbs); _parser = new HttpParser(buffers,endp,new Handler(),hbs,cbs); } public void setReserved (boolean reserved) { _reserved = reserved; } public boolean isReserved() { return _reserved; } /* ------------------------------------------------------------ */ public HttpDestination getDestination() { return _destination; } /* ------------------------------------------------------------ */ public void setDestination(HttpDestination destination) { _destination = destination; } /* ------------------------------------------------------------ */ public boolean send(HttpExchange ex) throws IOException { // _message = // Thread.currentThread().getName()+": Generator instance="+_generator // .hashCode()+" state= "+_generator.getState()+" _exchange="+_exchange; synchronized (this) { if (_exchange != null) { if (_pipeline != null) throw new IllegalStateException(this + " PIPELINED!!! _exchange=" + _exchange); _pipeline = ex; return true; } if (!_endp.isOpen()) return false; _exchange = ex; _exchange.setStatus(HttpExchange.STATUS_WAITING_FOR_COMMIT); if (_endp.isBlocking()) { this.notify(); } else { SelectChannelEndPoint scep = (SelectChannelEndPoint)_endp; scep.scheduleWrite(); } long exchTimeout = _exchange.getTimeout(); if (exchTimeout > 0) { _destination.getHttpClient().schedule(_timeout, exchTimeout); } else { _destination.getHttpClient().schedule(_timeout); } return true; } } /* ------------------------------------------------------------ */ public void handle() throws IOException { int no_progress = 0; boolean failed = false; while (_endp.isBufferingInput() || _endp.isOpen()) { synchronized (this) { while (_exchange == null) { if (_endp.isBlocking()) { try { this.wait(); } catch (InterruptedException e) { throw new InterruptedIOException(); } } else { // Hopefully just space? _parser.fill(); _parser.skipCRLF(); if (_parser.isMoreInBuffer()) { Log.warn("Unexpected data received but no request sent"); close(); } return; } } } if (_exchange.getStatus() == HttpExchange.STATUS_WAITING_FOR_COMMIT) { no_progress = 0; commitRequest(); } try { long io = 0; _endp.flush(); if (_generator.isComplete()) { if (!_requestComplete) { _requestComplete = true; _exchange.getEventListener().onRequestComplete(); } } else { // Write as much of the request as possible synchronized (this) { if (_exchange == null) continue; long flushed = _generator.flush(); io += flushed; } if (!_generator.isComplete()) { InputStream in = _exchange.getRequestContentSource(); if (in != null) { if (_requestContentChunk == null || _requestContentChunk.length() == 0) { _requestContentChunk = _exchange.getRequestContentChunk(); if (_requestContentChunk != null) _generator.addContent(_requestContentChunk,false); else _generator.complete(); io += _generator.flush(); } } else _generator.complete(); } } if (_generator.isComplete() && !_requestComplete) { _requestComplete = true; _exchange.getEventListener().onRequestComplete(); } // If we are not ended then parse available if (!_parser.isComplete() && _generator.isCommitted()) { long filled = _parser.parseAvailable(); io += filled; } if (io > 0) no_progress = 0; else if (no_progress++ >= 2 && !_endp.isBlocking()) { // SSL may need an extra flush as it may have made "no progress" while actually doing a handshake. if (_endp instanceof SslHttpChannelEndPoint && !_generator.isComplete() && !_generator.isEmpty()) { if (_generator.flush()>0) continue; } return; } } catch (Throwable e) { Log.debug("Failure on " + _exchange, e); if (e instanceof ThreadDeath) throw (ThreadDeath)e; synchronized (this) { if (_exchange != null) { _exchange.setStatus(HttpExchange.STATUS_EXCEPTED); _exchange.getEventListener().onException(e); } } failed = true; if (e instanceof IOException) throw (IOException)e; if (e instanceof Error) throw (Error)e; if (e instanceof RuntimeException) throw (RuntimeException)e; throw new RuntimeException(e); } finally { boolean complete = false; boolean close = failed; // always close the connection on error if (!failed) { // are we complete? if (_generator.isComplete()) { if (!_requestComplete) { _requestComplete = true; _exchange.getEventListener().onRequestComplete(); } // we need to return the HttpConnection to a state that // it can be reused or closed out if (_parser.isComplete()) { _destination.getHttpClient().cancel(_timeout); complete = true; } } } if (complete || failed) { synchronized (this) { if (!close) close = shouldClose(); reset(true); no_progress = 0; if (_exchange != null) { _exchange = null; if (_pipeline == null) { if (!isReserved()) _destination.returnConnection(this,close); } else { if (close) { if (!isReserved()) _destination.returnConnection(this,close); HttpExchange exchange = _pipeline; _pipeline = null; _destination.send(exchange); } else { HttpExchange exchange = _pipeline; _pipeline = null; send(exchange); } } } } } } } } /* ------------------------------------------------------------ */ public boolean isIdle() { synchronized (this) { return _exchange == null; } } /* ------------------------------------------------------------ */ public EndPoint getEndPoint() { return _endp; } /* ------------------------------------------------------------ */ private void commitRequest() throws IOException { synchronized (this) { if (_exchange.getStatus() != HttpExchange.STATUS_WAITING_FOR_COMMIT) throw new IllegalStateException(); _exchange.setStatus(HttpExchange.STATUS_SENDING_REQUEST); _generator.setVersion(_exchange._version); String uri = _exchange._uri; if (_destination.isProxied() && uri.startsWith("/")) { // TODO suppress port 80 or 443 uri = (_destination.isSecure()?HttpSchemes.HTTPS:HttpSchemes.HTTP) + "://" + _destination.getAddress().getHost() + ":" + _destination.getAddress().getPort() + uri; Authorization auth = _destination.getProxyAuthentication(); if (auth != null) auth.setCredentials(_exchange); } _generator.setRequest(_exchange._method,uri); if (_exchange._version >= HttpVersions.HTTP_1_1_ORDINAL) { if (!_exchange._requestFields.containsKey(HttpHeaders.HOST_BUFFER)) _exchange._requestFields.add(HttpHeaders.HOST_BUFFER,_destination.getHostHeader()); } if (_exchange._requestContent != null) { _exchange._requestFields.putLongField(HttpHeaders.CONTENT_LENGTH,_exchange._requestContent.length()); _generator.completeHeader(_exchange._requestFields,false); _generator.addContent(new View(_exchange._requestContent),true); } else if (_exchange._requestContentSource != null) { _generator.completeHeader(_exchange._requestFields,false); int available = _exchange._requestContentSource.available(); if (available > 0) { // TODO deal with any known content length // TODO reuse this buffer! byte[] buf = new byte[available]; int length = _exchange._requestContentSource.read(buf); _generator.addContent(new ByteArrayBuffer(buf,0,length),false); } } else { _exchange._requestFields.remove(HttpHeaders.CONTENT_LENGTH); // TODO _generator.completeHeader(_exchange._requestFields,true); } _exchange.setStatus(HttpExchange.STATUS_WAITING_FOR_RESPONSE); } } /* ------------------------------------------------------------ */ protected void reset(boolean returnBuffers) throws IOException { _requestComplete = false; _connectionHeader = null; _parser.reset(returnBuffers); _generator.reset(returnBuffers); _http11 = true; } /* ------------------------------------------------------------ */ private boolean shouldClose() { if (_connectionHeader!=null) { if (HttpHeaderValues.CLOSE_BUFFER.equals(_connectionHeader)) return true; if (HttpHeaderValues.KEEP_ALIVE_BUFFER.equals(_connectionHeader)) return false; } return !_http11; } /* ------------------------------------------------------------ */ private class Handler extends HttpParser.EventHandler { @Override public void startRequest(Buffer method, Buffer url, Buffer version) throws IOException { // System.out.println( method.toString() + "///" + url.toString() + // "///" + version.toString() ); // TODO validate this is acceptable, the HttpExchange.STATUS_START && status _connections = new LinkedList(); private final ArrayList _idle = new ArrayList(); private final HttpClient _client; private final boolean _ssl; private int _maxConnections; private int _pendingConnections=0; private ArrayBlockingQueue _newQueue = new ArrayBlockingQueue(10,true); private int _newConnection=0; private Address _proxy; private Authorization _proxyAuthentication; private PathMap _authorizations; private List _cookies; public void dump() throws IOException { synchronized (this) { System.err.println(this); System.err.println("connections="+_connections.size()); System.err.println("idle="+_idle.size()); System.err.println("pending="+_pendingConnections); for (HttpConnection c : _connections) { if (!c.isIdle()) c.dump(); } } } /* The queue of exchanged for this destination if connections are limited */ private LinkedList _queue=new LinkedList(); /* ------------------------------------------------------------ */ HttpDestination(HttpClient pool, Address address, boolean ssl, int maxConnections) { _client=pool; _address=address; _ssl=ssl; _maxConnections=maxConnections; String addressString = address.getHost(); if (address.getPort() != (_ssl ? 443 : 80)) addressString += ":" + address.getPort(); _hostHeader = new ByteArrayBuffer(addressString); } /* ------------------------------------------------------------ */ public Address getAddress() { return _address; } /* ------------------------------------------------------------ */ public Buffer getHostHeader() { return _hostHeader; } /* ------------------------------------------------------------ */ public HttpClient getHttpClient() { return _client; } /* ------------------------------------------------------------ */ public boolean isSecure() { return _ssl; } /* ------------------------------------------------------------ */ public int getConnections() { synchronized (this) { return _connections.size(); } } /* ------------------------------------------------------------ */ public int getIdleConnections() { synchronized (this) { return _idle.size(); } } /* ------------------------------------------------------------ */ public void addAuthorization(String pathSpec,Authorization authorization) { synchronized (this) { if (_authorizations==null) _authorizations=new PathMap(); _authorizations.put(pathSpec,authorization); } // TODO query and remove methods } /* ------------------------------------------------------------------------------- */ public void addCookie(Cookie cookie) { synchronized (this) { if (_cookies==null) _cookies=new ArrayList(); _cookies.add(cookie); } // TODO query, remove and age methods } /* ------------------------------------------------------------------------------- */ /** * Get a connection. We either get an idle connection if one is available, or * we make a new connection, if we have not yet reached maxConnections. If we * have reached maxConnections, we wait until the number reduces. * @param timeout max time prepared to block waiting to be able to get a connection * @return * @throws IOException */ private HttpConnection getConnection(long timeout) throws IOException { HttpConnection connection = null; while ((connection == null) && (connection = getIdleConnection()) == null && timeout>0) { boolean starting = false; synchronized (this) { int totalConnections = _connections.size() + _pendingConnections; if (totalConnections < _maxConnections) { _newConnection++; startNewConnection(); starting = true; } } if (!starting) { try { Thread.sleep(200); timeout-=200; } catch (InterruptedException e) { Log.ignore(e); } } else { try { Object o = _newQueue.take(); if (o instanceof HttpConnection) { connection = (HttpConnection)o; } else throw (IOException)o; } catch (InterruptedException e) { Log.ignore(e); } } } return connection; } /* ------------------------------------------------------------------------------- */ public HttpConnection reserveConnection(long timeout) throws IOException { HttpConnection connection = getConnection(timeout); if (connection != null) connection.setReserved(true); return connection; } /* ------------------------------------------------------------------------------- */ public HttpConnection getIdleConnection() throws IOException { HttpConnection connection = null; while (true) { synchronized (this) { if (connection!=null) { _connections.remove(connection); connection.close(); connection=null; } if (_idle.size() > 0) connection = _idle.remove(_idle.size()-1); } if (connection==null) return null; if (connection.cancelIdleTimeout() ) return connection; } } /* ------------------------------------------------------------------------------- */ protected void startNewConnection() { try { synchronized (this) { _pendingConnections++; } _client._connector.startConnection(this); } catch(Exception e) { Log.debug(e); onConnectionFailed(e); } } /* ------------------------------------------------------------------------------- */ public void onConnectionFailed(Throwable throwable) { Throwable connect_failure=null; synchronized (this) { _pendingConnections--; if (_newConnection>0) { connect_failure=throwable; _newConnection--; } else if (_queue.size()>0) { HttpExchange ex=_queue.removeFirst(); ex.setStatus(HttpExchange.STATUS_EXCEPTED); ex.getEventListener().onConnectionFailed(throwable); } } if(connect_failure!=null) { try { _newQueue.put(connect_failure); } catch (InterruptedException e) { Log.ignore(e); } } } /* ------------------------------------------------------------------------------- */ public void onException(Throwable throwable) { synchronized (this) { _pendingConnections--; if (_queue.size()>0) { HttpExchange ex=_queue.removeFirst(); ex.setStatus(HttpExchange.STATUS_EXCEPTED); ex.getEventListener().onException(throwable); } } } /* ------------------------------------------------------------------------------- */ public void onNewConnection(HttpConnection connection) throws IOException { HttpConnection q_connection=null; synchronized (this) { _pendingConnections--; _connections.add(connection); if (_newConnection>0) { q_connection=connection; _newConnection--; } else if (_queue.size()==0) { connection.setIdleTimeout(); _idle.add(connection); } else { HttpExchange ex=_queue.removeFirst(); connection.send(ex); } } if (q_connection!=null) { try { _newQueue.put(q_connection); } catch (InterruptedException e) { Log.ignore(e); } } } /* ------------------------------------------------------------------------------- */ public void returnConnection(HttpConnection connection, boolean close) throws IOException { if (connection.isReserved()) connection.setReserved(false); if (close) { try { connection.close(); } catch(IOException e) { Log.ignore(e); } } if (!_client.isStarted()) return; if (!close && connection.getEndPoint().isOpen()) { synchronized (this) { if (_queue.size()==0) { connection.setIdleTimeout(); _idle.add(connection); } else { HttpExchange ex = _queue.removeFirst(); connection.send(ex); } this.notifyAll(); } } else { synchronized (this) { _connections.remove(connection); if (!_queue.isEmpty()) startNewConnection(); } } } /* ------------------------------------------------------------ */ public void returnIdleConnection(HttpConnection connection) throws IOException { try { connection.close(); } catch (IOException e) { Log.ignore(e); } synchronized (this) { _idle.remove(connection); _connections.remove(connection); if (!_queue.isEmpty() && _client.isStarted()) startNewConnection(); } } /* ------------------------------------------------------------ */ public void send(HttpExchange ex) throws IOException { LinkedList listeners = _client.getRegisteredListeners(); if (listeners != null) { // Add registered listeners, fail if we can't load them for (int i = listeners.size(); i > 0; --i) { String listenerClass = listeners.get(i - 1); try { Class listener = Class.forName(listenerClass); Constructor constructor = listener.getDeclaredConstructor(HttpDestination.class, HttpExchange.class); HttpEventListener elistener = (HttpEventListener) constructor.newInstance(this, ex); ex.setEventListener(elistener); } catch (Exception e) { Log.debug(e); throw new IOException("Unable to instantiate registered listener for destination: " + listenerClass ); } } } // Security is supported by default and should be the first consulted if ( _client.hasRealms() ) { ex.setEventListener( new SecurityListener( this, ex ) ); } doSend(ex); } /* ------------------------------------------------------------ */ public void resend(HttpExchange ex) throws IOException { ex.getEventListener().onRetry(); ex.reset(); doSend(ex); } /* ------------------------------------------------------------ */ protected void doSend(HttpExchange ex) throws IOException { // add cookies // TODO handle max-age etc. if (_cookies!=null) { StringBuilder buf=null; for (Cookie cookie : _cookies) { if (buf==null) buf=new StringBuilder(); else buf.append("; "); buf.append(cookie.getName()); // TODO quotes buf.append("="); buf.append(cookie.getValue()); // TODO quotes } if (buf!=null) ex.addRequestHeader(HttpHeaders.COOKIE,buf.toString()); } // Add any known authorizations if (_authorizations!=null) { Authorization auth= (Authorization)_authorizations.match(ex.getURI()); if (auth !=null) auth.setCredentials(ex); } HttpConnection connection = getIdleConnection(); if (connection != null) { boolean sent = connection.send(ex); if (!sent) connection = null; } if (connection == null) { synchronized (this) { _queue.add(ex); if (_connections.size() + _pendingConnections < _maxConnections) { startNewConnection(); } } } } /* ------------------------------------------------------------ */ public synchronized String toString() { return "HttpDestination@" + hashCode() + "//" + _address.getHost() + ":" + _address.getPort() + "(" + _connections.size() + "," + _idle.size() + "," + _queue.size() + ")"; } /* ------------------------------------------------------------ */ public synchronized String toDetailString() { StringBuilder b = new StringBuilder(); b.append(toString()); b.append('\n'); synchronized(this) { for (HttpConnection connection : _connections) { if (connection._exchange!=null) { b.append(connection.toDetailString()); if (_idle.contains(connection)) b.append(" IDLE"); b.append('\n'); } } } b.append("--"); b.append('\n'); return b.toString(); } /* ------------------------------------------------------------ */ public void setProxy(Address proxy) { _proxy=proxy; } /* ------------------------------------------------------------ */ public Address getProxy() { return _proxy; } /* ------------------------------------------------------------ */ public Authorization getProxyAuthentication() { return _proxyAuthentication; } /* ------------------------------------------------------------ */ public void setProxyAuthentication(Authorization authentication) { _proxyAuthentication = authentication; } /* ------------------------------------------------------------ */ public boolean isProxied() { return _proxy!=null; } /* ------------------------------------------------------------ */ public void close() throws IOException { synchronized (this) { for (HttpConnection connection : _connections) { connection.close(); } } } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/HttpExchange.java0000644000175000017500000005452511426021057027006 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; import org.mortbay.io.Buffer; import org.mortbay.io.BufferCache.CachedBuffer; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.jetty.HttpFields; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.HttpSchemes; import org.mortbay.jetty.HttpURI; import org.mortbay.jetty.HttpVersions; import org.mortbay.log.Log; /** * An HTTP client API that encapsulates Exchange with a HTTP server. * * This object encapsulates:
    *
  • The HTTP server. (see {@link #setAddress(InetSocketAddress)} or {@link #setURL(String)}) *
  • The HTTP request method, URI and HTTP version (see {@link #setMethod(String)}, {@link #setURI(String)}, and {@link #setVersion(int)} *
  • The Request headers (see {@link #addRequestHeader(String, String)} or {@link #setRequestHeader(String, String)}) *
  • The Request content (see {@link #setRequestContent(Buffer)} or {@link #setRequestContentSource(InputStream)}) *
  • The status of the exchange (see {@link #getStatus()}) *
  • Callbacks to handle state changes (see the onXxx methods such as {@link #onRequestComplete()} or {@link #onResponseComplete()}) *
  • The ability to intercept callbacks (see {@link #setEventListener(HttpEventListener)} *
* * The HttpExchange class is intended to be used by a developer wishing to have close asynchronous * interaction with the the exchange. Typically a developer will extend the HttpExchange class with a derived * class that implements some or all of the onXxx callbacks. There are also some predefined HttpExchange subtypes * that can be used as a basis (see {@link ContentExchange} and {@link CachedExchange}. * *

Typically the HttpExchange is passed to a the {@link HttpClient#send(HttpExchange)} method, which in * turn selects a {@link HttpDestination} and calls it's {@link HttpDestination#send(HttpExchange), which * then creates or selects a {@link HttpConnection} and calls its {@link HttpConnection#send(HttpExchange). * A developer may wish to directly call send on the destination or connection if they wish to bypass * some handling provided (eg Cookie handling in the HttpDestination). * *

In some circumstances, the HttpClient or HttpDestination may wish to retry a HttpExchange (eg. failed * pipeline request, authentication retry or redirection). In such cases, the HttpClient and/or HttpDestination * may insert their own HttpExchangeListener to intercept and filter the call backs intended for the * HttpExchange. * * @author gregw * @author Guillaume Nodet */ public class HttpExchange { public static final int STATUS_START = 0; public static final int STATUS_WAITING_FOR_CONNECTION = 1; public static final int STATUS_WAITING_FOR_COMMIT = 2; public static final int STATUS_SENDING_REQUEST = 3; public static final int STATUS_WAITING_FOR_RESPONSE = 4; public static final int STATUS_PARSING_HEADERS = 5; public static final int STATUS_PARSING_CONTENT = 6; public static final int STATUS_COMPLETED = 7; public static final int STATUS_EXPIRED = 8; public static final int STATUS_EXCEPTED = 9; String _method = HttpMethods.GET; Buffer _scheme = HttpSchemes.HTTP_BUFFER; String _uri; int _version = HttpVersions.HTTP_1_1_ORDINAL; Address _address; HttpFields _requestFields = new HttpFields(); Buffer _requestContent; InputStream _requestContentSource; long _timeout = -1; volatile int _status = STATUS_START; Buffer _requestContentChunk; boolean _retryStatus = false; // controls if the exchange will have listeners autoconfigured by the destination boolean _configureListeners = true; private HttpEventListener _listener = new Listener(); boolean _onRequestCompleteDone; boolean _onResponseCompleteDone; boolean _onDone; // == onConnectionFail || onException || onExpired || onCancelled || onResponseCompleted && onRequestCompleted /* ------------------------------------------------------------ */ public int getStatus() { return _status; } /* ------------------------------------------------------------ */ /** * @deprecated */ public void waitForStatus(int status) throws InterruptedException { synchronized (this) { while (_status < status) { this.wait(); } } } /** * Wait until the exchange is "done". * Done is defined as when a final state has been passed to the * HttpExchange via the associated onXxx call. Note that an * exchange can transit a final state when being used as part * of a dialog (eg {@link SecurityListener}. Done status * is thus defined as:

     *   done == onConnectionFailed 
     *        || onException
     *        || onExpire
     *        || onRequestComplete && onResponseComplete
     * 
* @return * @throws InterruptedException */ public int waitForDone () throws InterruptedException { synchronized (this) { while (!isDone(_status)) this.wait(); return _status; } } /* ------------------------------------------------------------ */ public void reset() { // TODO - this should do a cancel and wakeup everybody that was waiting. // might need a version number concept synchronized(this) { _onRequestCompleteDone=false; _onResponseCompleteDone=false; _onDone=false; setStatus(STATUS_START); } } /* ------------------------------------------------------------ */ void setStatus(int status) { // _status is volatile _status = status; try { switch (status) { case STATUS_WAITING_FOR_CONNECTION: break; case STATUS_WAITING_FOR_COMMIT: break; case STATUS_SENDING_REQUEST: break; case HttpExchange.STATUS_WAITING_FOR_RESPONSE: getEventListener().onRequestCommitted(); break; case STATUS_PARSING_HEADERS: break; case STATUS_PARSING_CONTENT: getEventListener().onResponseHeaderComplete(); break; case STATUS_COMPLETED: getEventListener().onResponseComplete(); break; case STATUS_EXPIRED: getEventListener().onExpire(); break; } } catch (IOException e) { Log.warn(e); } } /* ------------------------------------------------------------ */ public boolean isDone (int status) { synchronized (this) { return _onDone; } } /* ------------------------------------------------------------ */ public HttpEventListener getEventListener() { return _listener; } /* ------------------------------------------------------------ */ public void setEventListener(HttpEventListener listener) { _listener=listener; } /* ------------------------------------------------------------ */ /** * @param url Including protocol, host and port */ public void setURL(String url) { HttpURI uri = new HttpURI(url); String scheme = uri.getScheme(); if (scheme != null) { if (HttpSchemes.HTTP.equalsIgnoreCase(scheme)) setScheme(HttpSchemes.HTTP_BUFFER); else if (HttpSchemes.HTTPS.equalsIgnoreCase(scheme)) setScheme(HttpSchemes.HTTPS_BUFFER); else setScheme(new ByteArrayBuffer(scheme)); } int port = uri.getPort(); if (port <= 0) port = "https".equalsIgnoreCase(scheme)?443:80; setAddress(new Address(uri.getHost(),port)); String completePath = uri.getCompletePath(); if (completePath == null) completePath = "/"; setURI(completePath); } /* ------------------------------------------------------------ */ /** * @param address */ public void setAddress(Address address) { _address = address; } /* ------------------------------------------------------------ */ /** * @return */ public Address getAddress() { return _address; } /* ------------------------------------------------------------ */ /** * @param scheme */ public void setScheme(Buffer scheme) { _scheme = scheme; } /* ------------------------------------------------------------ */ /** * @return */ public Buffer getScheme() { return _scheme; } /* ------------------------------------------------------------ */ /** * @param version as integer, 9, 10 or 11 for 0.9, 1.0 or 1.1 */ public void setVersion(int version) { _version = version; } /* ------------------------------------------------------------ */ public void setVersion(String version) { CachedBuffer v = HttpVersions.CACHE.get(version); if (v == null) _version = 10; else _version = v.getOrdinal(); } /* ------------------------------------------------------------ */ /** * @return */ public int getVersion() { return _version; } /* ------------------------------------------------------------ */ /** * @param method */ public void setMethod(String method) { _method = method; } /* ------------------------------------------------------------ */ /** * @return */ public String getMethod() { return _method; } /* ------------------------------------------------------------ */ /** * @return */ public String getURI() { return _uri; } /* ------------------------------------------------------------ */ /** * @param uri */ public void setURI(String uri) { _uri = uri; } /* ------------------------------------------------------------ */ /** * @param name * @param value */ public void addRequestHeader(String name, String value) { getRequestFields().add(name,value); } /* ------------------------------------------------------------ */ /** * @param name * @param value */ public void addRequestHeader(Buffer name, Buffer value) { getRequestFields().add(name,value); } /* ------------------------------------------------------------ */ /** * @param name * @param value */ public void setRequestHeader(String name, String value) { getRequestFields().put(name,value); } /* ------------------------------------------------------------ */ /** * @param name * @param value */ public void setRequestHeader(Buffer name, Buffer value) { getRequestFields().put(name,value); } /* ------------------------------------------------------------ */ /** * @param value */ public void setRequestContentType(String value) { getRequestFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,value); } /* ------------------------------------------------------------ */ /** * @return */ public HttpFields getRequestFields() { return _requestFields; } /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ // methods to commit and/or send the request /* ------------------------------------------------------------ */ /** * @param requestContent */ public void setRequestContent(Buffer requestContent) { _requestContent = requestContent; } /* ------------------------------------------------------------ */ /** * @param in */ public void setRequestContentSource(InputStream in) { _requestContentSource = in; if (_requestContentSource.markSupported()) _requestContentSource.mark(Integer.MAX_VALUE); } /* ------------------------------------------------------------ */ public InputStream getRequestContentSource() { return _requestContentSource; } /* ------------------------------------------------------------ */ public Buffer getRequestContentChunk() throws IOException { synchronized (this) { if (_requestContentChunk == null) _requestContentChunk = new ByteArrayBuffer(4096); // TODO configure else { if (_requestContentChunk.hasContent()) throw new IllegalStateException(); _requestContentChunk.clear(); } int read = _requestContentChunk.capacity(); int length = _requestContentSource.read(_requestContentChunk.array(),0,read); if (length >= 0) { _requestContentChunk.setPutIndex(length); return _requestContentChunk; } return null; } } /* ------------------------------------------------------------ */ public Buffer getRequestContent() { return _requestContent; } /* ------------------------------------------------------------ */ public boolean getRetryStatus() { return _retryStatus; } /* ------------------------------------------------------------ */ public void setRetryStatus( boolean retryStatus ) { _retryStatus = retryStatus; } /* ------------------------------------------------------------ */ public long getTimeout() { return _timeout; } /* ------------------------------------------------------------ */ public void setTimeout(long timeout) { _timeout = timeout; } /* ------------------------------------------------------------ */ /** Cancel this exchange * Currently this implementation does nothing. */ public void cancel() { } /* ------------------------------------------------------------ */ public String toString() { return getClass().getName() + "@" + hashCode() + "=" + _method + "//" + _address + _uri + "#" + _status; } /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ // methods to handle response /** * Called when the request headers has been sent * @throws IOException */ protected void onRequestCommitted() throws IOException { } /** * Called when the request and it's body have been sent. * @throws IOException */ protected void onRequestComplete() throws IOException { } /** * Called when a response status line has been received. * @param version HTTP version * @param status HTTP status code * @param reason HTTP status code reason string * @throws IOException */ protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { } /** * Called for each response header received * @param name header name * @param value header value * @throws IOException */ protected void onResponseHeader(Buffer name, Buffer value) throws IOException { } /** * Called when the response header has been completely received. * @throws IOException */ protected void onResponseHeaderComplete() throws IOException { } /** * Called for each chunk of the response content received. * @param content * @throws IOException */ protected void onResponseContent(Buffer content) throws IOException { } /** * Called when the entire response has been received * @throws IOException */ protected void onResponseComplete() throws IOException { } /** * Called when an exception was thrown during an attempt to open a connection * @param ex */ protected void onConnectionFailed(Throwable ex) { Log.warn("CONNECTION FAILED on " + this,ex); } /** * Called when any other exception occurs during handling for the exchange * @param ex */ protected void onException(Throwable ex) { Log.warn("EXCEPTION on " + this,ex); } /** * Called when no response has been received within the timeout. */ protected void onExpire() { Log.warn("EXPIRED " + this); } /** * Called when the request is retried (due to failures or authentication). * Implementations may need to reset any consumable content that needs to * be sent. * @throws IOException */ protected void onRetry() throws IOException { if (_requestContentSource != null) { if (_requestContentSource.markSupported()) { _requestContent = null; _requestContentSource.reset(); } else { throw new IOException("Unsupported retry attempt"); } } } /** * true of the exchange should have listeners configured for it by the destination * * false if this is being managed elsewhere * * @return */ public boolean configureListeners() { return _configureListeners; } public void setConfigureListeners(boolean autoConfigure ) { this._configureListeners = autoConfigure; } private class Listener implements HttpEventListener { public void onConnectionFailed(Throwable ex) { try { HttpExchange.this.onConnectionFailed(ex); } finally { synchronized(HttpExchange.this) { _onDone=true; HttpExchange.this.notifyAll(); } } } public void onException(Throwable ex) { try { HttpExchange.this.onException(ex); } finally { synchronized(HttpExchange.this) { _onDone=true; HttpExchange.this.notifyAll(); } } } public void onExpire() { try { HttpExchange.this.onExpire(); } finally { synchronized(HttpExchange.this) { _onDone=true; HttpExchange.this.notifyAll(); } } } public void onRequestCommitted() throws IOException { HttpExchange.this.onRequestCommitted(); } public void onRequestComplete() throws IOException { try { HttpExchange.this.onRequestComplete(); } finally { synchronized(HttpExchange.this) { _onRequestCompleteDone=true; _onDone=_onResponseCompleteDone; HttpExchange.this.notifyAll(); } } } public void onResponseComplete() throws IOException { try { HttpExchange.this.onResponseComplete(); } finally { synchronized(HttpExchange.this) { _onResponseCompleteDone=true; _onDone=_onRequestCompleteDone; HttpExchange.this.notifyAll(); } } } public void onResponseContent(Buffer content) throws IOException { HttpExchange.this.onResponseContent(content); } public void onResponseHeader(Buffer name, Buffer value) throws IOException { HttpExchange.this.onResponseHeader(name,value); } public void onResponseHeaderComplete() throws IOException { HttpExchange.this.onResponseHeaderComplete(); } public void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { HttpExchange.this.onResponseStatus(version,status,reason); } public void onRetry() { HttpExchange.this.setRetryStatus( true ); try { HttpExchange.this.onRetry(); } catch (IOException e) { onException(e); } } } /** * @deprecated use {@link org.mortbay.jetty.client.CachedExchange} * */ public static class CachedExchange extends org.mortbay.jetty.client.CachedExchange { public CachedExchange(boolean cacheFields) { super(cacheFields); } } /** * @deprecated use {@link org.mortbay.jetty.client.ContentExchange} * */ public static class ContentExchange extends org.mortbay.jetty.client.ContentExchange { } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/SocketConnector.java0000644000175000017500000000571511347722163027534 0ustar moonmoon//======================================================================== //Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import java.io.InterruptedIOException; import java.net.Socket; import javax.net.SocketFactory; import javax.net.ssl.SSLContext; import org.mortbay.component.AbstractLifeCycle; import org.mortbay.io.EndPoint; import org.mortbay.io.bio.SocketEndPoint; import org.mortbay.log.Log; class SocketConnector extends AbstractLifeCycle implements HttpClient.Connector { /** * */ private final HttpClient _httpClient; /** * @param httpClient */ SocketConnector(HttpClient httpClient) { _httpClient = httpClient; } public void startConnection(final HttpDestination destination) throws IOException { Socket socket=null; if ( destination.isSecure() ) { SSLContext sslContext = _httpClient.getSSLContext(); socket = sslContext.getSocketFactory().createSocket(); } else { Log.debug("Using Regular Socket"); socket = SocketFactory.getDefault().createSocket(); } socket.setSoTimeout(_httpClient.getSoTimeout()); socket.setTcpNoDelay(true); Address address = destination.isProxied() ? destination.getProxy() : destination.getAddress(); socket.connect(address.toSocketAddress()); EndPoint endpoint=new SocketEndPoint(socket); final HttpConnection connection=new HttpConnection(_httpClient,endpoint,_httpClient.getHeaderBufferSize(),_httpClient.getRequestBufferSize()); connection.setDestination(destination); destination.onNewConnection(connection); _httpClient.getThreadPool().dispatch(new Runnable() { public void run() { try { connection.handle(); } catch (IOException e) { if (e instanceof InterruptedIOException) Log.ignore(e); else { Log.warn(e); destination.onException(e); } } } }); } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/Address.java0000644000175000017500000000302211115211650025766 0ustar moonmoonpackage org.mortbay.jetty.client; import java.net.InetSocketAddress; /** * @version $Revision: 3753 $ $Date: 2008-12-02 11:53:28 +0100 (Tue, 02 Dec 2008) $ */ public class Address { private final String host; private final int port; public static Address from(String hostAndPort) { String host; int port; int colon = hostAndPort.indexOf(':'); if (colon >= 0) { host = hostAndPort.substring(0, colon); port = Integer.parseInt(hostAndPort.substring(colon + 1)); } else { host = hostAndPort; port = 0; } return new Address(host, port); } public Address(String host, int port) { this.host = host.trim(); this.port = port; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Address that = (Address)obj; if (!host.equals(that.host)) return false; return port == that.port; } public int hashCode() { int result = host.hashCode(); result = 31 * result + port; return result; } public String getHost() { return host; } public int getPort() { return port; } public InetSocketAddress toSocketAddress() { return new InetSocketAddress(getHost(), getPort()); } @Override public String toString() { return host + ":" + port; } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/HttpEventListener.java0000644000175000017500000000331311050674733030050 0ustar moonmoon//======================================================================== //Copyright 2006-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import org.mortbay.io.Buffer; /** * * @author jesse * */ public interface HttpEventListener { // TODO review the methods here, we can probably trim these down on what to expose public void onRequestCommitted() throws IOException; public void onRequestComplete() throws IOException; public void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException; public void onResponseHeader(Buffer name, Buffer value) throws IOException; public void onResponseHeaderComplete() throws IOException; public void onResponseContent(Buffer content) throws IOException; public void onResponseComplete() throws IOException; public void onConnectionFailed(Throwable ex); public void onException(Throwable ex); public void onExpire(); public void onRetry(); } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/0000755000175000017500000000000011745736454025437 5ustar moonmoonjetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/Authorization.java0000644000175000017500000000214711050674733031134 0ustar moonmoon//======================================================================== //Copyright 2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; import java.io.IOException; import org.mortbay.jetty.client.HttpExchange; /** * Simple authentication interface that sets required fields on the exchange. */ public interface Authorization { public void setCredentials( HttpExchange exchange) throws IOException; } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/DigestAuthorization.java0000644000175000017500000001260611050674733032275 0ustar moonmoon//======================================================================== //Copyright 2006-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; import java.io.IOException; import java.security.MessageDigest; import java.util.Map; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.client.HttpExchange; import org.mortbay.util.StringUtil; import org.mortbay.util.TypeUtil; public class DigestAuthorization implements Authorization { private static final String NC = "00000001"; Realm securityRealm; Map details; public DigestAuthorization(Realm realm, Map details) { this.securityRealm=realm; this.details=details; } public void setCredentials( HttpExchange exchange ) throws IOException { StringBuilder buffer = new StringBuilder().append("Digest"); buffer.append(" ").append("username").append('=').append('"').append(securityRealm.getPrincipal()).append('"'); buffer.append(", ").append("realm").append('=').append('"').append(String.valueOf(details.get("realm"))).append('"'); buffer.append(", ").append("nonce").append('=').append('"').append(String.valueOf(details.get("nonce"))).append('"'); buffer.append(", ").append("uri").append('=').append('"').append(exchange.getURI()).append('"'); buffer.append(", ").append("algorithm").append('=').append(String.valueOf(details.get("algorithm"))); String cnonce = newCnonce(exchange, securityRealm, details); buffer.append(", ").append("response").append('=').append('"').append(newResponse(cnonce, exchange, securityRealm, details)).append('"'); buffer.append(", ").append("qop").append('=').append(String.valueOf(details.get("qop"))); buffer.append(", ").append("nc").append('=').append(NC); buffer.append(", ").append("cnonce").append('=').append('"').append(cnonce).append('"'); exchange.setRequestHeader( HttpHeaders.AUTHORIZATION, new String(buffer.toString().getBytes(StringUtil.__ISO_8859_1))); } protected String newResponse(String cnonce, HttpExchange exchange, Realm securityRealm, Map details) { try{ MessageDigest md = MessageDigest.getInstance("MD5"); // calc A1 digest md.update(securityRealm.getPrincipal().getBytes(StringUtil.__ISO_8859_1)); md.update((byte)':'); md.update(String.valueOf(details.get("realm")).getBytes(StringUtil.__ISO_8859_1)); md.update((byte)':'); md.update(securityRealm.getCredentials().getBytes(StringUtil.__ISO_8859_1)); byte[] ha1 = md.digest(); // calc A2 digest md.reset(); md.update(exchange.getMethod().getBytes(StringUtil.__ISO_8859_1)); md.update((byte)':'); md.update(exchange.getURI().getBytes(StringUtil.__ISO_8859_1)); byte[] ha2=md.digest(); md.update(TypeUtil.toString(ha1,16).getBytes(StringUtil.__ISO_8859_1)); md.update((byte)':'); md.update(String.valueOf(details.get("nonce")).getBytes(StringUtil.__ISO_8859_1)); md.update((byte)':'); md.update(NC.getBytes(StringUtil.__ISO_8859_1)); md.update((byte)':'); md.update(cnonce.getBytes(StringUtil.__ISO_8859_1)); md.update((byte)':'); md.update(String.valueOf(details.get("qop")).getBytes(StringUtil.__ISO_8859_1)); md.update((byte)':'); md.update(TypeUtil.toString(ha2,16).getBytes(StringUtil.__ISO_8859_1)); byte[] digest=md.digest(); // check digest return encode(digest); } catch(Exception e) { e.printStackTrace(); return null; } } protected String newCnonce(HttpExchange exchange, Realm securityRealm, Map details) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] b= md.digest(String.valueOf(System.currentTimeMillis()).getBytes(StringUtil.__ISO_8859_1)); return encode(b); } catch(Exception e) { e.printStackTrace(); return null; } } private static String encode(byte[] data) { StringBuilder buffer = new StringBuilder(); for (int i=0; i>> 4)); buffer.append(Integer.toHexString(data[i] & 0x0f)); } return buffer.toString(); } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/Realm.java0000644000175000017500000000200511050674733027325 0ustar moonmoon//======================================================================== //Copyright 2006-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; /** * Simple security realm interface. */ public interface Realm { public String getId(); public String getPrincipal(); public String getCredentials(); } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/BasicAuthorization.java0000644000175000017500000000360611070116205032062 0ustar moonmoon//======================================================================== //Copyright 2006-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; import java.io.IOException; import org.mortbay.io.Buffer; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.client.HttpExchange; import org.mortbay.jetty.security.B64Code; import org.mortbay.util.StringUtil; /** * Sets authentication headers for BASIC authentication challenges * * @author jesse */ public class BasicAuthorization implements Authorization { private Buffer _authorization; public BasicAuthorization(Realm realm) throws IOException { String authenticationString = "Basic " + B64Code.encode( realm.getPrincipal() + ":" + realm.getCredentials(), StringUtil.__ISO_8859_1); _authorization= new ByteArrayBuffer(authenticationString); } /** * BASIC authentication is of the form * * encoded credentials are of the form: username:password * * */ public void setCredentials( HttpExchange exchange ) throws IOException { exchange.setRequestHeader( HttpHeaders.AUTHORIZATION_BUFFER, _authorization); } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/ProxyAuthorization.java0000644000175000017500000000362211070116205032160 0ustar moonmoon//======================================================================== //Copyright 2006-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; import java.io.IOException; import org.mortbay.io.Buffer; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.client.HttpExchange; import org.mortbay.jetty.security.B64Code; import org.mortbay.util.StringUtil; /** * Sets proxy authentication headers for BASIC authentication challenges * * @author jesse */ public class ProxyAuthorization implements Authorization { private Buffer _authorization; public ProxyAuthorization(String username,String password) throws IOException { String authenticationString = "Basic " + B64Code.encode( username + ":" + password, StringUtil.__ISO_8859_1); _authorization= new ByteArrayBuffer(authenticationString); } /** * BASIC proxy authentication is of the form * * encoded credentials are of the form: username:password * * */ public void setCredentials( HttpExchange exchange ) throws IOException { exchange.setRequestHeader( HttpHeaders.PROXY_AUTHORIZATION_BUFFER, _authorization); } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/RealmResolver.java0000644000175000017500000000207211050674733031053 0ustar moonmoon//======================================================================== //Copyright 2006-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; import java.io.IOException; import org.mortbay.jetty.client.HttpDestination; public interface RealmResolver { public Realm getRealm( String realmName, HttpDestination destination, String path ) throws IOException; } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/HashRealmResolver.java0000644000175000017500000000270111050674733031656 0ustar moonmoon//======================================================================== //Copyright 2006-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.mortbay.jetty.client.HttpDestination; public class HashRealmResolver implements RealmResolver { private Map_realmMap; public void addSecurityRealm( Realm realm ) { if (_realmMap == null) { _realmMap = new HashMap(); } _realmMap.put( realm.getId(), realm ); } public Realm getRealm( String realmName, HttpDestination destination, String path ) throws IOException { return _realmMap.get( realmName ); } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/SimpleRealmResolver.java0000644000175000017500000000260211042222477032217 0ustar moonmoon//======================================================================== //Copyright 2006-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.mortbay.jetty.client.HttpDestination; /** * Simple Realm Resolver. *

A Realm Resolver that wraps a single realm. * @author gregw * */ public class SimpleRealmResolver implements RealmResolver { private Realm _realm; public SimpleRealmResolver( Realm realm ) { _realm=realm; } public Realm getRealm( String realmName, HttpDestination destination, String path ) throws IOException { return _realm; } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/security/SecurityListener.java0000644000175000017500000002160711062067120031600 0ustar moonmoon//======================================================================== //Copyright 2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.security; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import javax.servlet.http.HttpServletResponse; import org.mortbay.io.Buffer; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.client.HttpDestination; import org.mortbay.jetty.client.HttpEventListenerWrapper; import org.mortbay.jetty.client.HttpExchange; import org.mortbay.log.Log; import org.mortbay.util.StringUtil; /** * SecurityListener * * Allow for insertion of security dialog when performing an * HttpExchange. */ public class SecurityListener extends HttpEventListenerWrapper { private HttpDestination _destination; private HttpExchange _exchange; private boolean _requestComplete; private boolean _responseComplete; private boolean _needIntercept; private int _attempts = 0; // TODO remember to settle on winning solution public SecurityListener(HttpDestination destination, HttpExchange ex) { // Start of sending events through to the wrapped listener // Next decision point is the onResponseStatus super(ex.getEventListener(),true); _destination=destination; _exchange=ex; } /** * scrapes an authentication type from the authString * * @param authString * @return */ protected String scrapeAuthenticationType( String authString ) { String authType; if ( authString.indexOf( " " ) == -1 ) { authType = authString.toString().trim(); } else { String authResponse = authString.toString(); authType = authResponse.substring( 0, authResponse.indexOf( " " ) ).trim(); } return authType; } /** * scrapes a set of authentication details from the authString * * @param authString * @return */ protected Map scrapeAuthenticationDetails( String authString ) { Map authenticationDetails = new HashMap(); authString = authString.substring( authString.indexOf( " " ) + 1, authString.length() ); StringTokenizer strtok = new StringTokenizer( authString, ","); while ( strtok.hasMoreTokens() ) { String[] pair = strtok.nextToken().split( "=" ); if ( pair.length == 2 ) { String itemName = pair[0].trim(); String itemValue = pair[1].trim(); itemValue = StringUtil.unquote( itemValue ); authenticationDetails.put( itemName, itemValue ); } else { throw new IllegalArgumentException( "unable to process authentication details" ); } } return authenticationDetails; } public void onResponseStatus( Buffer version, int status, Buffer reason ) throws IOException { if (Log.isDebugEnabled()) Log.debug("SecurityListener:Response Status: " + status ); if ( status == HttpServletResponse.SC_UNAUTHORIZED && _attempts<_destination.getHttpClient().maxRetries()) { // Let's absorb events until we have done some retries setDelegatingResponses(false); _needIntercept = true; } else { setDelegatingResponses(true); setDelegatingRequests(true); _needIntercept = false; } super.onResponseStatus(version,status,reason); } public void onResponseHeader( Buffer name, Buffer value ) throws IOException { if (Log.isDebugEnabled()) Log.debug( "SecurityListener:Header: " + name.toString() + " / " + value.toString() ); if (!isDelegatingResponses()) { int header = HttpHeaders.CACHE.getOrdinal(name); switch (header) { case HttpHeaders.WWW_AUTHENTICATE_ORDINAL: // TODO don't hard code this bit. String authString = value.toString(); String type = scrapeAuthenticationType( authString ); // TODO maybe avoid this map creation Map details = scrapeAuthenticationDetails( authString ); String pathSpec="/"; // TODO work out the real path spec RealmResolver realmResolver = _destination.getHttpClient().getRealmResolver(); if ( realmResolver == null ) { break; } Realm realm = realmResolver.getRealm( details.get("realm"), _destination, pathSpec ); // TODO work our realm correctly if ( realm == null ) { Log.warn( "Unknown Security Realm: " + details.get("realm") ); } else if ("digest".equalsIgnoreCase(type)) { _destination.addAuthorization("/",new DigestAuthorization(realm,details)); } else if ("basic".equalsIgnoreCase(type)) { _destination.addAuthorization(pathSpec,new BasicAuthorization(realm)); } break; } } super.onResponseHeader(name,value); } public void onRequestComplete() throws IOException { _requestComplete = true; if (_needIntercept) { if (_requestComplete && _responseComplete) { if (Log.isDebugEnabled()) Log.debug("onRequestComplete, Both complete: Resending from onResponseComplete "+_exchange); _responseComplete = false; _requestComplete = false; setDelegatingRequests(true); setDelegatingResponses(true); _destination.resend(_exchange); } else { if (Log.isDebugEnabled()) Log.debug("onRequestComplete, Response not yet complete onRequestComplete, calling super for "+_exchange); super.onRequestComplete(); } } else { if (Log.isDebugEnabled()) Log.debug("onRequestComplete, delegating to super with Request complete="+_requestComplete+", response complete="+_responseComplete+" "+_exchange); super.onRequestComplete(); } } public void onResponseComplete() throws IOException { _responseComplete = true; if (_needIntercept) { if (_requestComplete && _responseComplete) { if (Log.isDebugEnabled()) Log.debug("onResponseComplete, Both complete: Resending from onResponseComplete"+_exchange); _responseComplete = false; _requestComplete = false; setDelegatingResponses(true); setDelegatingRequests(true); _destination.resend(_exchange); } else { if (Log.isDebugEnabled()) Log.debug("onResponseComplete, Request not yet complete from onResponseComplete, calling super "+_exchange); super.onResponseComplete(); } } else { if (Log.isDebugEnabled()) Log.debug("OnResponseComplete, delegating to super with Request complete="+_requestComplete+", response complete="+_responseComplete+" "+_exchange); super.onResponseComplete(); } } public void onRetry() { _attempts++; setDelegatingRequests(true); setDelegatingResponses(true); _requestComplete=false; _responseComplete=false; _needIntercept=false; super.onRetry(); } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/HttpEventListenerWrapper.java0000644000175000017500000001016511250014236031400 0ustar moonmoon//======================================================================== //Copyright 2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import org.mortbay.io.Buffer; public class HttpEventListenerWrapper implements HttpEventListener { HttpEventListener _listener; boolean _delegatingRequests; boolean _delegatingResponses; boolean _delegationResult = true; private Buffer _version; private int _status; private Buffer _reason; public HttpEventListenerWrapper() { _listener=null; _delegatingRequests=false; _delegatingResponses=false; } public HttpEventListenerWrapper(HttpEventListener eventListener,boolean delegating) { _listener=eventListener; _delegatingRequests=delegating; _delegatingResponses=delegating; } public void setDelegationResult( boolean result ) { _delegationResult = result; } public HttpEventListener getEventListener() { return _listener; } public void setEventListener(HttpEventListener listener) { _listener = listener; } public boolean isDelegatingRequests() { return _delegatingRequests; } public boolean isDelegatingResponses() { return _delegatingResponses; } public void setDelegatingRequests(boolean delegating) { _delegatingRequests = delegating; } public void setDelegatingResponses(boolean delegating) { _delegatingResponses = delegating; } public void onConnectionFailed(Throwable ex) { if (_delegatingRequests) _listener.onConnectionFailed(ex); } public void onException(Throwable ex) { if (_delegatingRequests||_delegatingResponses) _listener.onException(ex); } public void onExpire() { if (_delegatingRequests||_delegatingResponses) _listener.onExpire(); } public void onRequestCommitted() throws IOException { if (_delegatingRequests) _listener.onRequestCommitted(); } public void onRequestComplete() throws IOException { if (_delegatingRequests) _listener.onRequestComplete(); } public void onResponseComplete() throws IOException { if (_delegatingResponses) { if (_delegationResult == false) { _listener.onResponseStatus(_version, _status, _reason); } _listener.onResponseComplete(); } } public void onResponseContent(Buffer content) throws IOException { if (_delegatingResponses) _listener.onResponseContent(content); } public void onResponseHeader(Buffer name, Buffer value) throws IOException { if (_delegatingResponses) _listener.onResponseHeader(name,value); } public void onResponseHeaderComplete() throws IOException { if (_delegatingResponses) _listener.onResponseHeaderComplete(); } public void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { if (_delegatingResponses) { _listener.onResponseStatus(version,status,reason); } else { _version = version; _status = status; _reason = reason; } } public void onRetry() { if (_delegatingRequests) _listener.onRetry(); } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/webdav/0000755000175000017500000000000011745736454025040 5ustar moonmoon././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootjetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/webdav/WebdavSupportedExchange.javajetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/webdav/WebdavSupportedExchange.jav0000644000175000017500000000404411173372264032313 0ustar moonmoon//======================================================================== //Copyright 2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.webdav; import java.io.IOException; import org.mortbay.io.Buffer; import org.mortbay.jetty.client.HttpExchange; import org.mortbay.log.Log; public class WebdavSupportedExchange extends HttpExchange { private boolean _webdavSupported = false; private boolean _isComplete = false; protected void onResponseHeader(Buffer name, Buffer value) throws IOException { if (Log.isDebugEnabled()) Log.debug("WebdavSupportedExchange:Header:" + name.toString() + " / " + value.toString() ); if ( "DAV".equals( name.toString() ) ) { if ( value.toString().indexOf( "1" ) >= 0 || value.toString().indexOf( "2" ) >= 0 ) { _webdavSupported = true; } } super.onResponseHeader(name, value); } public void waitTilCompletion() throws InterruptedException { synchronized (this) { while ( !_isComplete) { this.wait(); } } } protected void onResponseComplete() throws IOException { _isComplete = true; super.onResponseComplete(); } public boolean isWebdavSupported() { return _webdavSupported; } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/webdav/PropfindExchange.java0000644000175000017500000000324611173372264031122 0ustar moonmoon//======================================================================== //Copyright 2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.webdav; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.mortbay.io.Buffer; import org.mortbay.jetty.client.HttpExchange; import org.mortbay.log.Log; public class PropfindExchange extends HttpExchange { boolean _propertyExists = false; /* ------------------------------------------------------------ */ protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { if ( status == HttpServletResponse.SC_OK ) { Log.debug( "PropfindExchange:Status: Exists" ); _propertyExists = true; } else { Log.debug( "PropfindExchange:Status: Not Exists" ); } super.onResponseStatus(version, status, reason); } public boolean exists() { return _propertyExists; } }jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/webdav/MkcolExchange.java0000644000175000017500000000353311173372264030405 0ustar moonmoon//======================================================================== //Copyright 2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.webdav; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.mortbay.io.Buffer; import org.mortbay.jetty.client.CachedExchange; import org.mortbay.log.Log; public class MkcolExchange extends CachedExchange { boolean exists = false; public MkcolExchange() { super(true); } /* ------------------------------------------------------------ */ protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { if ( status == HttpServletResponse.SC_CREATED ) { Log.debug( "MkcolExchange:Status: Successfully created resource" ); exists = true; } if ( status == HttpServletResponse.SC_METHOD_NOT_ALLOWED ) // returned when resource exists { Log.debug( "MkcolExchange:Status: Resource must exist" ); exists = true; } super.onResponseStatus(version, status, reason); } public boolean exists() { return exists; } }jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/webdav/WebdavListener.java0000644000175000017500000002444011250014236030577 0ustar moonmoon//======================================================================== //Copyright 2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client.webdav; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.mortbay.io.Buffer; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.HttpDestination; import org.mortbay.jetty.client.HttpEventListenerWrapper; import org.mortbay.jetty.client.HttpExchange; import org.mortbay.jetty.client.security.SecurityListener; import org.mortbay.log.Log; import org.mortbay.util.URIUtil; /** * WebdavListener * * * * */ public class WebdavListener extends HttpEventListenerWrapper { private HttpDestination _destination; private HttpExchange _exchange; private boolean _requestComplete; private boolean _responseComplete; private boolean _webdavEnabled; private boolean _needIntercept; public WebdavListener(HttpDestination destination, HttpExchange ex) { // Start of sending events through to the wrapped listener // Next decision point is the onResponseStatus super(ex.getEventListener(),true); _destination=destination; _exchange=ex; // We'll only enable webdav if this is a PUT request if ( HttpMethods.PUT.equalsIgnoreCase( _exchange.getMethod() ) ) { _webdavEnabled = true; } } public void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { if ( !_webdavEnabled ) { _needIntercept = false; super.onResponseStatus(version, status, reason); return; } if (Log.isDebugEnabled()) Log.debug("WebdavListener:Response Status: " + status ); // The dav spec says that CONFLICT should be returned when the parent collection doesn't exist but I am seeing // FORBIDDEN returned instead so running with that. if ( status == HttpServletResponse.SC_CONFLICT || status == HttpServletResponse.SC_FORBIDDEN ) { if ( _webdavEnabled ) { if (Log.isDebugEnabled()) Log.debug("WebdavListener:Response Status: dav enabled, taking a stab at resolving put issue" ); setDelegatingResponses( false ); // stop delegating, we can try and fix this request _needIntercept = true; } else { if (Log.isDebugEnabled()) Log.debug("WebdavListener:Response Status: Webdav Disabled" ); setDelegatingResponses( true ); // just make sure we delegate setDelegatingRequests( true ); _needIntercept = false; } } else { _needIntercept = false; setDelegatingResponses( true ); setDelegatingRequests( true ); } super.onResponseStatus(version, status, reason); } public void onResponseComplete() throws IOException { _responseComplete = true; if (_needIntercept) { if ( _requestComplete && _responseComplete) { try { // we have some work to do before retrying this if ( resolveCollectionIssues() ) { setDelegatingRequests( true ); setDelegatingResponses(true); _requestComplete = false; _responseComplete = false; _destination.resend(_exchange); } else { // admit defeat but retry because someone else might have setDelegationResult(false); setDelegatingRequests( true ); setDelegatingResponses(true); super.onResponseComplete(); } } catch ( IOException ioe ) { Log.debug("WebdavListener:Complete:IOException: might not be dealing with dav server, delegate"); super.onResponseComplete(); } } else { if (Log.isDebugEnabled()) Log.debug("WebdavListener:Not ready, calling super"); super.onResponseComplete(); } } else { super.onResponseComplete(); } } public void onRequestComplete () throws IOException { _requestComplete = true; if (_needIntercept) { if ( _requestComplete && _responseComplete) { try { // we have some work to do before retrying this if ( resolveCollectionIssues() ) { setDelegatingRequests( true ); setDelegatingResponses(true); _requestComplete = false; _responseComplete = false; _destination.resend(_exchange); } else { // admit defeat but retry because someone else might have setDelegatingRequests( true ); setDelegatingResponses(true); super.onRequestComplete(); } } catch ( IOException ioe ) { Log.debug("WebdavListener:Complete:IOException: might not be dealing with dav server, delegate"); super.onRequestComplete(); } } else { if (Log.isDebugEnabled()) Log.debug("WebdavListener:Not ready, calling super"); super.onRequestComplete(); } } else { super.onRequestComplete(); } } /** * walk through the steps to try and resolve missing parent collection issues via webdav * * @return * @throws IOException */ private boolean resolveCollectionIssues() throws IOException { String uri = _exchange.getURI(); String[] uriCollection = _exchange.getURI().split("/"); int checkNum = uriCollection.length; int rewind = 0; String parentUri = URIUtil.parentPath( uri ); while ( parentUri != null && !checkExists( parentUri ) ) { ++rewind; parentUri = URIUtil.parentPath( parentUri ); } // confirm webdav is supported for this collection if ( checkWebdavSupported() ) { for (int i = 0; i < rewind;) { makeCollection(parentUri + "/" + uriCollection[checkNum - rewind - 1]); parentUri = parentUri + "/" + uriCollection[checkNum - rewind - 1]; --rewind; } } else { return false; } return true; } private boolean checkExists( String uri ) throws IOException { PropfindExchange propfindExchange = new PropfindExchange(); propfindExchange.setAddress( _exchange.getAddress() ); propfindExchange.setMethod( HttpMethods.GET ); // PROPFIND acts wonky, just use get propfindExchange.setScheme( _exchange.getScheme() ); propfindExchange.setEventListener( new SecurityListener( _destination, propfindExchange ) ); propfindExchange.setConfigureListeners( false ); propfindExchange.setURI( uri ); _destination.send( propfindExchange ); try { propfindExchange.waitForDone(); return propfindExchange.exists(); } catch ( InterruptedException ie ) { Log.ignore( ie ); return false; } } private boolean makeCollection( String uri ) throws IOException { MkcolExchange mkcolExchange = new MkcolExchange(); mkcolExchange.setAddress( _exchange.getAddress() ); mkcolExchange.setMethod( "MKCOL " + uri + " HTTP/1.1" ); mkcolExchange.setScheme( _exchange.getScheme() ); mkcolExchange.setEventListener( new SecurityListener( _destination, mkcolExchange ) ); mkcolExchange.setConfigureListeners( false ); mkcolExchange.setURI( uri ); _destination.send( mkcolExchange ); try { mkcolExchange.waitForDone(); return mkcolExchange.exists(); } catch ( InterruptedException ie ) { Log.ignore( ie ); return false; } } private boolean checkWebdavSupported() throws IOException { WebdavSupportedExchange supportedExchange = new WebdavSupportedExchange(); supportedExchange.setAddress( _exchange.getAddress() ); supportedExchange.setMethod( HttpMethods.OPTIONS ); supportedExchange.setScheme( _exchange.getScheme() ); supportedExchange.setEventListener( new SecurityListener( _destination, supportedExchange ) ); supportedExchange.setConfigureListeners( false ); supportedExchange.setURI( _exchange.getURI() ); _destination.send( supportedExchange ); try { supportedExchange.waitTilCompletion(); return supportedExchange.isWebdavSupported(); } catch (InterruptedException ie ) { Log.ignore( ie ); return false; } } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/CachedExchange.java0000644000175000017500000000461611133150075027230 0ustar moonmoon//======================================================================== //Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import org.mortbay.io.Buffer; import org.mortbay.jetty.HttpFields; /** * An exchange that caches response status and fields for later use. * * @author gregw * */ public class CachedExchange extends HttpExchange { protected int _responseStatus; protected HttpFields _responseFields; public CachedExchange(boolean cacheFields) { if (cacheFields) _responseFields = new HttpFields(); } /* ------------------------------------------------------------ */ public int getResponseStatus() { if (getStatus() < HttpExchange.STATUS_PARSING_HEADERS) throw new IllegalStateException("Response not received"); return _responseStatus; } /* ------------------------------------------------------------ */ public HttpFields getResponseFields() { if (getStatus() < HttpExchange.STATUS_PARSING_HEADERS) throw new IllegalStateException("Headers not complete"); return _responseFields; } /* ------------------------------------------------------------ */ protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { _responseStatus = status; super.onResponseStatus(version,status,reason); } /* ------------------------------------------------------------ */ protected void onResponseHeader(Buffer name, Buffer value) throws IOException { if (_responseFields != null) _responseFields.add(name,value); super.onResponseHeader(name,value); } }jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/SelectConnector.java0000644000175000017500000001547311347722163027525 0ustar moonmoon//======================================================================== //Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import org.mortbay.component.AbstractLifeCycle; import org.mortbay.io.Buffer; import org.mortbay.io.Connection; import org.mortbay.io.nio.IndirectNIOBuffer; import org.mortbay.io.nio.SelectChannelEndPoint; import org.mortbay.io.nio.SelectorManager; import org.mortbay.jetty.AbstractBuffers; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.HttpVersions; import org.mortbay.jetty.security.SslHttpChannelEndPoint; import org.mortbay.log.Log; class SelectConnector extends AbstractLifeCycle implements HttpClient.Connector, Runnable { private final HttpClient _httpClient; private SSLContext _sslContext; private AbstractBuffers _sslBuffers; SelectorManager _selectorManager=new Manager(); /** * @param httpClient */ SelectConnector(HttpClient httpClient) { _httpClient = httpClient; } protected void doStart() throws Exception { _selectorManager.start(); _httpClient._threadPool.dispatch(this); } protected void doStop() throws Exception { _selectorManager.stop(); } public void startConnection( HttpDestination destination ) throws IOException { SocketChannel channel = SocketChannel.open(); Address address = destination.isProxied() ? destination.getProxy() : destination.getAddress(); channel.configureBlocking( false ); channel.socket().setTcpNoDelay(true); channel.connect(address.toSocketAddress()); _selectorManager.register( channel, destination ); } public void run() { while (_httpClient.isRunning()) { try { _selectorManager.doSelect(0); } catch (Exception e) { e.printStackTrace(); } } } class Manager extends SelectorManager { protected SocketChannel acceptChannel(SelectionKey key) throws IOException { throw new IllegalStateException(); } public boolean dispatch(Runnable task) { return SelectConnector.this._httpClient._threadPool.dispatch(task); } protected void endPointOpened(SelectChannelEndPoint endpoint) { } protected void endPointClosed(SelectChannelEndPoint endpoint) { } protected Connection newConnection(SocketChannel channel, SelectChannelEndPoint endpoint) { if (endpoint instanceof SslHttpChannelEndPoint) return new HttpConnection(_sslBuffers,endpoint,_sslBuffers.getHeaderBufferSize(),_sslBuffers.getRequestBufferSize()); return new HttpConnection(_httpClient,endpoint,SelectConnector.this._httpClient.getHeaderBufferSize(),SelectConnector.this._httpClient.getRequestBufferSize()); } protected SelectChannelEndPoint newEndPoint(SocketChannel channel, SelectSet selectSet, SelectionKey key) throws IOException { // key should have destination at this point (will be replaced by endpoint after this call) HttpDestination dest=(HttpDestination)key.attachment(); SelectChannelEndPoint ep=null; if (dest.isSecure()) { if (dest.isProxied()) { String connect = HttpMethods.CONNECT+" "+dest.getAddress()+HttpVersions.HTTP_1_0+"\r\n\r\n"; // TODO need to send this over channel unencrypted and setup endpoint to ignore the 200 OK response. throw new IllegalStateException("Not Implemented"); } SSLEngine engine=newSslEngine(); ep = new SslHttpChannelEndPoint(_sslBuffers,channel,selectSet,key,engine); } else { ep=new SelectChannelEndPoint(channel,selectSet,key); } HttpConnection connection=(HttpConnection)ep.getConnection(); connection.setDestination(dest); dest.onNewConnection(connection); return ep; } private synchronized SSLEngine newSslEngine() throws IOException { if (_sslContext==null) { _sslContext = SelectConnector.this._httpClient.getSSLContext(); } SSLEngine sslEngine = _sslContext.createSSLEngine(); sslEngine.setUseClientMode(true); sslEngine.beginHandshake(); if (_sslBuffers==null) { AbstractBuffers buffers = new AbstractBuffers() { protected Buffer newBuffer( int size ) { return new IndirectNIOBuffer( size); } }; buffers.setHeaderBufferSize( sslEngine.getSession().getApplicationBufferSize()); buffers.setRequestBufferSize( sslEngine.getSession().getApplicationBufferSize()); buffers.setResponseBufferSize(sslEngine.getSession().getApplicationBufferSize()); try { buffers.start(); } catch(Exception e) { throw new IllegalStateException(e); } _sslBuffers=buffers; } return sslEngine; } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.io.nio.SelectorManager#connectionFailed(java.nio.channels.SocketChannel, java.lang.Throwable, java.lang.Object) */ protected void connectionFailed(SocketChannel channel, Throwable ex, Object attachment) { if (attachment instanceof HttpDestination) ((HttpDestination)attachment).onConnectionFailed(ex); else Log.warn(ex); } } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/ContentExchange.java0000644000175000017500000001332511347476641027511 0ustar moonmoon//======================================================================== //Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.client; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import org.mortbay.io.Buffer; import org.mortbay.io.BufferUtil; import org.mortbay.jetty.HttpHeaders; import org.mortbay.util.ByteArrayOutputStream2; import org.mortbay.util.StringUtil; /* ------------------------------------------------------------ */ /** * A CachedExchange that retains response content for later use. * */ public class ContentExchange extends CachedExchange { protected int _responseStatus; protected int _contentLength = -1; protected String _encoding = "utf-8"; protected ByteArrayOutputStream2 _responseContent; protected File _fileForUpload; /* ------------------------------------------------------------ */ public ContentExchange() { super(false); } /* ------------------------------------------------------------ */ public ContentExchange(boolean keepHeaders) { super(keepHeaders); } /* ------------------------------------------------------------ */ public int getResponseStatus() { if (getStatus() < HttpExchange.STATUS_PARSING_HEADERS) throw new IllegalStateException("Response not received"); return _responseStatus; } /* ------------------------------------------------------------ */ /** * @return The response content as a String * @throws UnsupportedEncodingException */ public String getResponseContent() throws UnsupportedEncodingException { if (_responseContent != null) return _responseContent.toString(_encoding); return null; } /* ------------------------------------------------------------ */ /** * @return The response content as a byte array; */ public byte[] getResponseBytes() { if (_responseContent != null) { if (_contentLength>=0 && _responseContent.getBuf().length==_contentLength) return _responseContent.getBuf(); return _responseContent.toByteArray(); } return null; } /* ------------------------------------------------------------ */ /** * @param out An output stream to write the content to. * @throws IOException */ public void writeResponseBytesTo(OutputStream out) throws IOException { if (_responseContent != null) out.write(_responseContent.getBuf(),0,_responseContent.getCount()); } /* ------------------------------------------------------------ */ protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { if (_responseContent!=null) _responseContent.reset(); _responseStatus = status; super.onResponseStatus(version,status,reason); } /* ------------------------------------------------------------ */ protected void onResponseHeader(Buffer name, Buffer value) throws IOException { super.onResponseHeader(name,value); int header = HttpHeaders.CACHE.getOrdinal(name); switch (header) { case HttpHeaders.CONTENT_LENGTH_ORDINAL: _contentLength = BufferUtil.toInt(value); break; case HttpHeaders.CONTENT_TYPE_ORDINAL: String mime = StringUtil.asciiToLowerCase(value.toString()); int i = mime.indexOf("charset="); if (i > 0) _encoding = mime.substring(i + 8); break; } } /* ------------------------------------------------------------ */ protected void onResponseContent(Buffer content) throws IOException { super.onResponseContent( content ); if (_responseContent == null) _responseContent = (_contentLength>=0)?new ByteArrayOutputStream2(_contentLength):new ByteArrayOutputStream2(); content.writeTo(_responseContent); } /* ------------------------------------------------------------ */ protected void onRetry() throws IOException { if (_fileForUpload != null) { setRequestContent(null); setRequestContentSource(getInputStream()); } else super.onRetry(); } /* ------------------------------------------------------------ */ private InputStream getInputStream() throws IOException { return new FileInputStream( _fileForUpload ); } /* ------------------------------------------------------------ */ public File getFileForUpload() { return _fileForUpload; } /* ------------------------------------------------------------ */ public void setFileForUpload(File fileForUpload) throws IOException { this._fileForUpload = fileForUpload; _requestContentSource = getInputStream(); } }jetty-6.1.26/extras/client/src/main/java/org/mortbay/jetty/client/HttpClient.java0000644000175000017500000005661711457400136026511 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.client; import java.io.IOException; import java.io.InputStream; import java.net.UnknownHostException; import java.security.KeyStore; import java.security.SecureRandom; import java.util.Enumeration; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Set; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; import org.mortbay.component.LifeCycle; import org.mortbay.io.Buffer; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.io.nio.DirectNIOBuffer; import org.mortbay.io.nio.IndirectNIOBuffer; import org.mortbay.jetty.AbstractBuffers; import org.mortbay.jetty.HttpSchemes; import org.mortbay.jetty.client.security.Authorization; import org.mortbay.jetty.client.security.RealmResolver; import org.mortbay.log.Log; import org.mortbay.resource.Resource; import org.mortbay.thread.QueuedThreadPool; import org.mortbay.thread.ThreadPool; import org.mortbay.thread.Timeout; import org.mortbay.util.Attributes; import org.mortbay.util.AttributesMap; /** * Http Client. *

* HttpClient is the main active component of the client API implementation. * It is the opposite of the Connectors in standard Jetty, in that it listens * for responses rather than requests. Just like the connectors, there is a * blocking socket version and a non-blocking NIO version (implemented as nested classes * selected by {@link #setConnectorType(int)}). *

* The an instance of {@link HttpExchange} is passed to the {@link #send(HttpExchange)} method * to send a request. The exchange contains both the headers and content (source) of the request * plus the callbacks to handle responses. A HttpClient can have many exchanges outstanding * and they may be queued on the {@link HttpDestination} waiting for a {@link HttpConnection}, * queued in the {@link HttpConnection} waiting to be transmitted or pipelined on the actual * TCP/IP connection waiting for a response. *

* The {@link HttpDestination} class is an aggregation of {@link HttpConnection}s for the * same host, port and protocol. A destination may limit the number of connections * open and they provide a pool of open connections that may be reused. Connections may also * be allocated from a destination, so that multiple request sources are not multiplexed * over the same connection. * * @see {@link HttpExchange} * @see {@link HttpDestination} * @author Greg Wilkins * @author Matthew Purland * @author Guillaume Nodet */ public class HttpClient extends AbstractBuffers implements Attributes { public static final int CONNECTOR_SOCKET=0; public static final int CONNECTOR_SELECT_CHANNEL=2; private int _connectorType=CONNECTOR_SELECT_CHANNEL; private boolean _useDirectBuffers=true; private int _maxConnectionsPerAddress=32; private Map _destinations = new HashMap(); ThreadPool _threadPool; Connector _connector; private long _idleTimeout=20000; private long _timeout=320000; private int _soTimeout = 10000; private Timeout _timeoutQ = new Timeout(); private Timeout _idleTimeoutQ = new Timeout(); private Address _proxy; private Authorization _proxyAuthentication; private Set _noProxy; private int _maxRetries = 3; private LinkedList _registeredListeners; // TODO clean up and add getters/setters to some of this maybe private String _keyStoreLocation; private String _keyStoreType="JKS"; private String _keyStorePassword; private String _keyManagerAlgorithm = "SunX509"; private String _keyManagerPassword; private String _trustStoreLocation; private String _trustStoreType="JKS"; private String _trustStorePassword; private String _trustManagerAlgorithm = "SunX509"; private SSLContext _sslContext; private String _protocol="TLS"; private String _provider; private String _secureRandomAlgorithm; private RealmResolver _realmResolver; private AttributesMap _attributes=new AttributesMap(); /* ------------------------------------------------------------------------------- */ public void dump() throws IOException { for (Map.Entry entry : _destinations.entrySet()) { System.err.println("\n"+entry.getKey()+":"); entry.getValue().dump(); } } /* ------------------------------------------------------------------------------- */ public void send(HttpExchange exchange) throws IOException { if (!isStarted()) throw new IllegalStateException("!started"); boolean ssl=HttpSchemes.HTTPS_BUFFER.equalsIgnoreCase(exchange.getScheme()); exchange.setStatus(HttpExchange.STATUS_WAITING_FOR_CONNECTION); HttpDestination destination=getDestination(exchange.getAddress(),ssl); destination.send(exchange); } /* ------------------------------------------------------------ */ /** * @return the threadPool */ public ThreadPool getThreadPool() { return _threadPool; } /* ------------------------------------------------------------ */ /** * @param threadPool the threadPool to set */ public void setThreadPool(ThreadPool threadPool) { _threadPool=threadPool; } /* ------------------------------------------------------------ */ /** * @param name * @return Attribute associated with client */ public Object getAttribute(String name) { return _attributes.getAttribute(name); } /* ------------------------------------------------------------ */ /** * @return names of attributes associated with client */ public Enumeration getAttributeNames() { return _attributes.getAttributeNames(); } /* ------------------------------------------------------------ */ /** * @param name */ public void removeAttribute(String name) { _attributes.removeAttribute(name); } /* ------------------------------------------------------------ */ /** * Set an attribute on the HttpClient. * Attributes are not used by the client, but are provided for * so that users of a shared HttpClient may share other structures. * @param name * @param attribute */ public void setAttribute(String name, Object attribute) { _attributes.setAttribute(name,attribute); } /* ------------------------------------------------------------ */ /** * @param name * @return */ public void clearAttributes() { _attributes.clearAttributes(); } /* ------------------------------------------------------------------------------- */ public HttpDestination getDestination(Address remote, boolean ssl) throws UnknownHostException, IOException { if (remote==null) throw new UnknownHostException("Remote socket address cannot be null."); synchronized (_destinations) { HttpDestination destination=_destinations.get(remote); if (destination==null) { destination=new HttpDestination(this,remote,ssl,_maxConnectionsPerAddress); if (_proxy != null && (_noProxy == null || !_noProxy.contains(remote.getHost()))) { destination.setProxy(_proxy); if (_proxyAuthentication!=null) destination.setProxyAuthentication(_proxyAuthentication); } _destinations.put(remote,destination); } return destination; } } /* ------------------------------------------------------------ */ public void schedule(Timeout.Task task) { _timeoutQ.schedule(task); } /* ------------------------------------------------------------ */ public void schedule(Timeout.Task task, long timeout) { _timeoutQ.schedule(task, timeout); } /* ------------------------------------------------------------ */ public void scheduleIdle(Timeout.Task task) { _idleTimeoutQ.schedule(task); } /* ------------------------------------------------------------ */ public void cancel(Timeout.Task task) { task.cancel(); } /* ------------------------------------------------------------ */ /** * Get whether the connector can use direct NIO buffers. */ public boolean getUseDirectBuffers() { return _useDirectBuffers; } /* ------------------------------------------------------------ */ public void setRealmResolver( RealmResolver resolver ) { _realmResolver = resolver; } /* ------------------------------------------------------------ */ /** * returns the SecurityRealmResolver registered with the HttpClient or null * * @return */ public RealmResolver getRealmResolver() { return _realmResolver; } /* ------------------------------------------------------------ */ public boolean hasRealms() { return _realmResolver==null?false:true; } /** * Registers a listener that can listen to the stream of execution between the client and the * server and influence events. Sequential calls to the method wrapper sequentially wrap the preceeding * listener in a delegation model. *

* NOTE: the SecurityListener is a special listener which doesn't need to be added via this * mechanic, if you register security realms then it will automatically be added as the top listener of the * delegation stack. * * @param listenerClass */ public void registerListener( String listenerClass ) { if ( _registeredListeners == null ) { _registeredListeners = new LinkedList(); } _registeredListeners.add( listenerClass ); } public LinkedList getRegisteredListeners() { return _registeredListeners; } /* ------------------------------------------------------------ */ /** * Set to use NIO direct buffers. * * @param direct * If True (the default), the connector can use NIO direct * buffers. Some JVMs have memory management issues (bugs) with * direct buffers. */ public void setUseDirectBuffers(boolean direct) { _useDirectBuffers=direct; } /* ------------------------------------------------------------ */ /** * Get the type of connector (socket, blocking or select) in use. */ public int getConnectorType() { return _connectorType; } /* ------------------------------------------------------------ */ public void setConnectorType(int connectorType) { this._connectorType=connectorType; } /* ------------------------------------------------------------ */ /** * Create a new NIO buffer. If using direct buffers, it will create a direct * NIO buffer, other than an indirect buffer. */ @Override protected Buffer newBuffer(int size) { if (_connectorType!=CONNECTOR_SOCKET) { Buffer buf=null; if (size==getHeaderBufferSize()) buf=new IndirectNIOBuffer(size); else if (_useDirectBuffers) buf=new DirectNIOBuffer(size); else buf=new IndirectNIOBuffer(size); return buf; } else { return new ByteArrayBuffer(size); } } /* ------------------------------------------------------------ */ public int getMaxConnectionsPerAddress() { return _maxConnectionsPerAddress; } /* ------------------------------------------------------------ */ public void setMaxConnectionsPerAddress(int maxConnectionsPerAddress) { _maxConnectionsPerAddress=maxConnectionsPerAddress; } /* ------------------------------------------------------------ */ protected void doStart() throws Exception { super.doStart(); _timeoutQ.setDuration(_timeout); _timeoutQ.setNow(); _idleTimeoutQ.setDuration(_idleTimeout); _idleTimeoutQ.setNow(); if(_threadPool==null) { QueuedThreadPool pool = new QueuedThreadPool(); pool.setMaxThreads(16); pool.setDaemon(true); pool.setName("HttpClient"); _threadPool=pool; } if (_threadPool instanceof LifeCycle) { ((LifeCycle)_threadPool).start(); } if (_connectorType==CONNECTOR_SELECT_CHANNEL) { _connector=new SelectConnector(this); } else { _connector=new SocketConnector(this); } _connector.start(); _threadPool.dispatch(new Runnable() { public void run() { while (isRunning()) { _timeoutQ.tick(System.currentTimeMillis()); _idleTimeoutQ.tick(_timeoutQ.getNow()); try { Thread.sleep(200); } catch (InterruptedException e) { Log.ignore(e); } } } }); } /* ------------------------------------------------------------ */ long getNow() { return _timeoutQ.getNow(); } /* ------------------------------------------------------------ */ protected void doStop() throws Exception { _connector.stop(); _connector=null; if (_threadPool instanceof LifeCycle) { ((LifeCycle)_threadPool).stop(); } for (HttpDestination destination : _destinations.values()) { destination.close(); } _timeoutQ.cancelAll(); _idleTimeoutQ.cancelAll(); super.doStop(); } /* ------------------------------------------------------------ */ interface Connector extends LifeCycle { public void startConnection(HttpDestination destination) throws IOException; } /** * if a keystore location has been provided then client will attempt to use it as the keystore, * otherwise we simply ignore certificates and run with a loose ssl context. * * @return * @throws IOException */ protected SSLContext getSSLContext() throws IOException { if (_sslContext == null) { if (_keyStoreLocation == null) { _sslContext = getLooseSSLContext(); } else { _sslContext = getStrictSSLContext(); } } return _sslContext; } protected SSLContext getStrictSSLContext() throws IOException { try { if (_trustStoreLocation==null) { _trustStoreLocation=_keyStoreLocation; _trustStoreType=_keyStoreType; } KeyManager[] keyManagers=null; InputStream keystoreInputStream = null; keystoreInputStream= Resource.newResource(_keyStoreLocation).getInputStream(); KeyStore keyStore=KeyStore.getInstance(_keyStoreType); keyStore.load(keystoreInputStream,_keyStorePassword==null?null:_keyStorePassword.toString().toCharArray()); keystoreInputStream.close(); KeyManagerFactory keyManagerFactory=KeyManagerFactory.getInstance(_keyManagerAlgorithm); keyManagerFactory.init(keyStore,_keyManagerPassword==null?null:_keyManagerPassword.toString().toCharArray()); keyManagers=keyManagerFactory.getKeyManagers(); TrustManager[] trustManagers=null; InputStream truststoreInputStream = null; truststoreInputStream = Resource.newResource(_trustStoreLocation).getInputStream(); KeyStore trustStore=KeyStore.getInstance(_trustStoreType); trustStore.load(truststoreInputStream,_trustStorePassword==null?null:_trustStorePassword.toString().toCharArray()); truststoreInputStream.close(); TrustManagerFactory trustManagerFactory=TrustManagerFactory.getInstance(_trustManagerAlgorithm); trustManagerFactory.init(trustStore); trustManagers=trustManagerFactory.getTrustManagers(); SecureRandom secureRandom=_secureRandomAlgorithm==null?null:SecureRandom.getInstance(_secureRandomAlgorithm); SSLContext context=_provider==null?SSLContext.getInstance(_protocol):SSLContext.getInstance(_protocol,_provider); context.init(keyManagers,trustManagers,secureRandom); return context; } catch ( Exception e ) { Log.debug(e); throw new IOException( "error generating ssl context for " + _keyStoreLocation + " " + e.getMessage() ); } } protected SSLContext getLooseSSLContext() throws IOException { // Create a trust manager that does not validate certificate // chains TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType ) { } public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType ) { } } }; HostnameVerifier hostnameVerifier = new HostnameVerifier() { public boolean verify( String urlHostName, SSLSession session ) { Log.warn( "Warning: URL Host: " + urlHostName + " vs." + session.getPeerHost() ); return true; } }; // Install the all-trusting trust manager try { // TODO real trust manager SSLContext sslContext = SSLContext.getInstance( "SSL" ); sslContext.init( null, trustAllCerts, new java.security.SecureRandom() ); return sslContext; } catch ( Exception e ) { Log.debug(e); throw new IOException( "issue ignoring certs" ); } } /* ------------------------------------------------------------ */ /** * @return the period in milliseconds a {@link HttpConnection} can be idle for before it is closed. */ public long getIdleTimeout() { return _idleTimeout; } /* ------------------------------------------------------------ */ /** * @param ms the period in milliseconds a {@link HttpConnection} can be idle for before it is closed. */ public void setIdleTimeout(long ms) { _idleTimeout=ms; } /* ------------------------------------------------------------ */ public int getSoTimeout() { return _soTimeout; } /* ------------------------------------------------------------ */ public void setSoTimeout(int so) { _soTimeout = so; } /* ------------------------------------------------------------ */ /** * @return the period in ms that an exchange will wait for a response from the server. */ public long getTimeout() { return _timeout; } /* ------------------------------------------------------------ */ /** * @param ms the period in ms that an exchange will wait for a response from the server. */ public void setTimeout(long ms) { _timeout=ms; } /* ------------------------------------------------------------ */ public Address getProxy() { return _proxy; } /* ------------------------------------------------------------ */ public void setProxy(Address proxy) { this._proxy = proxy; } /* ------------------------------------------------------------ */ public Authorization getProxyAuthentication() { return _proxyAuthentication; } /* ------------------------------------------------------------ */ public void setProxyAuthentication(Authorization authentication) { _proxyAuthentication = authentication; } /* ------------------------------------------------------------ */ public boolean isProxied() { return this._proxy!=null; } /* ------------------------------------------------------------ */ public Set getNoProxy() { return _noProxy; } /* ------------------------------------------------------------ */ public void setNoProxy(Set noProxyAddresses) { _noProxy = noProxyAddresses; } /* ------------------------------------------------------------ */ public int maxRetries() { return _maxRetries; } /* ------------------------------------------------------------ */ public void setMaxRetries( int retries ) { _maxRetries = retries; } /* ------------------------------------------------------------ */ public String getTrustStoreLocation() { return _trustStoreLocation; } /* ------------------------------------------------------------ */ public void setTrustStoreLocation(String trustStoreLocation) { this._trustStoreLocation = trustStoreLocation; } /* ------------------------------------------------------------ */ public String getKeyStoreLocation() { return _keyStoreLocation; } /* ------------------------------------------------------------ */ public void setKeyStoreLocation(String keyStoreLocation) { this._keyStoreLocation = keyStoreLocation; } /* ------------------------------------------------------------ */ public void setKeyStorePassword(String _keyStorePassword) { this._keyStorePassword = _keyStorePassword; } /* ------------------------------------------------------------ */ public void setKeyManagerPassword(String _keyManagerPassword) { this._keyManagerPassword = _keyManagerPassword; } /* ------------------------------------------------------------ */ public void setTrustStorePassword(String _trustStorePassword) { this._trustStorePassword = _trustStorePassword; } } jetty-6.1.26/extras/client/src/main/java/org/mortbay/proxy/0000755000175000017500000000000011745736454022334 5ustar moonmoonjetty-6.1.26/extras/client/src/main/java/org/mortbay/proxy/AsyncProxyServlet.java0000644000175000017500000003367511221113775026661 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.proxy; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.MalformedURLException; import java.net.Socket; import java.net.URL; import java.util.Enumeration; import java.util.HashSet; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.UnavailableException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import org.mortbay.io.Buffer; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.HttpSchemes; import org.mortbay.jetty.HttpURI; import org.mortbay.jetty.Server; import org.mortbay.jetty.bio.SocketConnector; import org.mortbay.jetty.client.Address; import org.mortbay.jetty.client.HttpClient; import org.mortbay.jetty.client.HttpExchange; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.util.IO; import org.mortbay.util.ajax.Continuation; import org.mortbay.util.ajax.ContinuationSupport; /** * Asynchronous Proxy Servlet. * * Forward requests to another server either as a standard web proxy (as defined by * RFC2616) or as a transparent proxy. * * This servlet needs the jetty-util and jetty-client classes to be available to * the web application. * */ public class AsyncProxyServlet implements Servlet { HttpClient _client; protected HashSet _DontProxyHeaders = new HashSet(); { _DontProxyHeaders.add("proxy-connection"); _DontProxyHeaders.add("connection"); _DontProxyHeaders.add("keep-alive"); _DontProxyHeaders.add("transfer-encoding"); _DontProxyHeaders.add("te"); _DontProxyHeaders.add("trailer"); _DontProxyHeaders.add("proxy-authorization"); _DontProxyHeaders.add("proxy-authenticate"); _DontProxyHeaders.add("upgrade"); } private ServletConfig config; private ServletContext context; /* (non-Javadoc) * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig) */ public void init(ServletConfig config) throws ServletException { this.config=config; this.context=config.getServletContext(); _client=new HttpClient(); //_client.setConnectorType(HttpClient.CONNECTOR_SOCKET); _client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); try { _client.start(); } catch (Exception e) { throw new ServletException(e); } } /* (non-Javadoc) * @see javax.servlet.Servlet#getServletConfig() */ public ServletConfig getServletConfig() { return config; } /* (non-Javadoc) * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) */ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { while (res instanceof HttpServletResponseWrapper) res=(HttpServletResponse)((HttpServletResponseWrapper)res).getResponse(); final HttpServletRequest request = (HttpServletRequest)req; final HttpServletResponse response = (HttpServletResponse)res; if ("CONNECT".equalsIgnoreCase(request.getMethod())) { handleConnect(request,response); } else { final InputStream in=request.getInputStream(); final OutputStream out=response.getOutputStream(); final Continuation continuation = ContinuationSupport.getContinuation(request,request); if (!continuation.isPending()) { final byte[] buffer = new byte[4096]; // TODO avoid this! String uri=request.getRequestURI(); if (request.getQueryString()!=null) uri+="?"+request.getQueryString(); HttpURI url=proxyHttpURI(request.getScheme(), request.getServerName(), request.getServerPort(), uri); if (url==null) { response.sendError(HttpServletResponse.SC_FORBIDDEN); return; } HttpExchange exchange = new HttpExchange() { protected void onRequestCommitted() throws IOException { } protected void onRequestComplete() throws IOException { } protected void onResponseComplete() throws IOException { continuation.resume(); } protected void onResponseContent(Buffer content) throws IOException { // TODO Avoid this copy while (content.hasContent()) { int len=content.get(buffer,0,buffer.length); out.write(buffer,0,len); // May block here for a little bit! } } protected void onResponseHeaderComplete() throws IOException { } protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { if (reason!=null && reason.length()>0) response.setStatus(status,reason.toString()); else response.setStatus(status); } protected void onResponseHeader(Buffer name, Buffer value) throws IOException { String s = name.toString().toLowerCase(); if (!_DontProxyHeaders.contains(s)) response.addHeader(name.toString(),value.toString()); } }; exchange.setVersion(request.getProtocol()); exchange.setMethod(request.getMethod()); exchange.setURL(url.toString()); // check connection header String connectionHdr = request.getHeader("Connection"); if (connectionHdr!=null) { connectionHdr=connectionHdr.toLowerCase(); if (connectionHdr.indexOf("keep-alive")<0 && connectionHdr.indexOf("close")<0) connectionHdr=null; } // copy headers boolean xForwardedFor=false; boolean hasContent=false; long contentLength=-1; Enumeration enm = request.getHeaderNames(); while (enm.hasMoreElements()) { // TODO could be better than this! String hdr=(String)enm.nextElement(); String lhdr=hdr.toLowerCase(); if (_DontProxyHeaders.contains(lhdr)) continue; if (connectionHdr!=null && connectionHdr.indexOf(lhdr)>=0) continue; if ("content-type".equals(lhdr)) hasContent=true; if ("content-length".equals(lhdr)) contentLength=request.getContentLength(); Enumeration vals = request.getHeaders(hdr); while (vals.hasMoreElements()) { String val = (String)vals.nextElement(); if (val!=null) { exchange.setRequestHeader(lhdr,val); xForwardedFor|="X-Forwarded-For".equalsIgnoreCase(hdr); } } } // Proxy headers exchange.setRequestHeader("Via","1.1 (jetty)"); if (!xForwardedFor) exchange.addRequestHeader("X-Forwarded-For", request.getRemoteAddr()); if (hasContent) exchange.setRequestContentSource(in); _client.send(exchange); continuation.suspend(30000); } } } /* ------------------------------------------------------------ */ /** /** Resolve requested URL to the Proxied HttpURI * @param scheme The scheme of the received request. * @param serverName The server encoded in the received request(which * may be from an absolute URL in the request line). * @param serverPort The server port of the received request (which * may be from an absolute URL in the request line). * @param uri The URI of the received request. * @return The HttpURI to which the request should be proxied. * @throws MalformedURLException */ protected HttpURI proxyHttpURI(String scheme, String serverName, int serverPort, String uri) throws MalformedURLException { return new HttpURI(scheme+"://"+serverName+":"+serverPort+uri); } /* ------------------------------------------------------------ */ public void handleConnect(HttpServletRequest request, HttpServletResponse response) throws IOException { String uri = request.getRequestURI(); String port = ""; String host = ""; int c = uri.indexOf(':'); if (c>=0) { port = uri.substring(c+1); host = uri.substring(0,c); if (host.indexOf('/')>0) host = host.substring(host.indexOf('/')+1); } InetSocketAddress inetAddress = new InetSocketAddress (host, Integer.parseInt(port)); //if (isForbidden(HttpMessage.__SSL_SCHEME,addrPort.getHost(),addrPort.getPort(),false)) //{ // sendForbid(request,response,uri); //} //else { InputStream in=request.getInputStream(); OutputStream out=response.getOutputStream(); Socket socket = new Socket(inetAddress.getAddress(),inetAddress.getPort()); response.setStatus(200); response.setHeader("Connection","close"); response.flushBuffer(); IO.copyThread(socket.getInputStream(),out); IO.copy(in,socket.getOutputStream()); } } /* (non-Javadoc) * @see javax.servlet.Servlet#getServletInfo() */ public String getServletInfo() { return "Proxy Servlet"; } /* (non-Javadoc) * @see javax.servlet.Servlet#destroy() */ public void destroy() { } /** * Transparent Proxy. * * This convenience extension to AsyncProxyServlet configures the servlet * as a transparent proxy. The servlet is configured with init parameter:

    *
  • ProxyTo - a URI like http://host:80/context to which the request is proxied. *
  • Prefix - a URI prefix that is striped from the start of the forwarded URI. *
* For example, if a request was received at /foo/bar and the ProxyTo was http://host:80/context * and the Prefix was /foo, then the request would be proxied to http://host:80/context/bar * */ public static class Transparent extends AsyncProxyServlet { String _prefix; String _proxyTo; public Transparent() { } public Transparent(String prefix,String server, int port) { _prefix=prefix; _proxyTo="http://"+server+":"+port; } public void init(ServletConfig config) throws ServletException { if (config.getInitParameter("ProxyTo")!=null) _proxyTo=config.getInitParameter("ProxyTo"); if (config.getInitParameter("Prefix")!=null) _prefix=config.getInitParameter("Prefix"); if (_proxyTo==null) throw new UnavailableException("No ProxyTo"); super.init(config); config.getServletContext().log("Transparent AsyncProxyServlet @ "+(_prefix==null?"-":_prefix)+ " to "+_proxyTo); } protected HttpURI proxyHttpURI(final String scheme, final String serverName, int serverPort, final String uri) throws MalformedURLException { if (_prefix!=null && !uri.startsWith(_prefix)) return null; if (_prefix!=null) return new HttpURI(_proxyTo+uri.substring(_prefix.length())); return new HttpURI(_proxyTo+uri); } } } jetty-6.1.26/extras/client/pom.xml0000644000175000017500000001152311466510412015552 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-client Jetty HTTP Client maven-compiler-plugin 1.5 1.5 maven-antrun-plugin copyfiles install run clean clean run org.apache.felix maven-bundle-plugin ${maven-bundle-plugin-version} true manifest org.mortbay.jetty.client J2SE-1.4 * org.mortbay.jetty.client;version=${project.version} http://jetty.mortbay.org org.apache.maven.plugins maven-jar-plugin ${project.build.outputDirectory}/META-INF/MANIFEST.MF maven-assembly-plugin 2.2-beta-3 src/main/assembly/assembly.xml package single org.mortbay.jetty jetty-sslengine ${project.version} org.mortbay.jetty jetty ${project.version} org.mortbay.jetty jetty-util ${project.version} org.mortbay.jetty jetty-util5 ${project.version} junit junit test jetty-6.1.26/contexts/0000755000175000017500000000000011745736455013337 5ustar moonmoonjetty-6.1.26/contexts/javadoc.xml0000644000175000017500000000172710606340003015446 0ustar moonmoon Configure javadoc.xml /javadoc /javadoc/ index.html contents.html max-age=3600,public jetty-6.1.26/contexts/README.TXT0000644000175000017500000000101310521215356014647 0ustar moonmoon This directory is scanned by the ContextDeployer instance configured by the standard $JETTY_HOME/etc/jetty.xml configuration. It should contain XmlConfiguration files that describe individual contexts to be deployed to the server. This directory is scanned for additions, removals and updates for hot deployment. Frequenty the context configuration files here will reference war files or directories from $JETTY_HOME/webapps. Care must be taken to avoid a WebAppDeployer deploying duplicates of such webapplications. jetty-6.1.26/javadoc/0000755000175000017500000000000011745736455013077 5ustar moonmoonjetty-6.1.26/javadoc/contents.html0000644000175000017500000000012510517754340015605 0ustar moonmoon

Jetty Javadoc - NOT BUILT!

Please run build the project-website module jetty-6.1.26/patches/0000755000175000017500000000000011745736455013117 5ustar moonmoonjetty-6.1.26/patches/continue.patch0000644000175000017500000001606310703426335015754 0ustar moonmoonIndex: VERSION.txt =================================================================== --- VERSION.txt (revision 2128) +++ VERSION.txt (working copy) @@ -1,5 +1,6 @@ jetty-SNAPSHOT + Improved JSON parsing from Readers + + Delay 100 continues until getInputStream jetty-6.1.6rc0 - 3 October 2007 + Added jetty.lib system property to start.config Index: modules/jetty/src/test/java/org/mortbay/jetty/DumpHandler.java =================================================================== --- modules/jetty/src/test/java/org/mortbay/jetty/DumpHandler.java (revision 2127) +++ modules/jetty/src/test/java/org/mortbay/jetty/DumpHandler.java (working copy) @@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.handler.AbstractHandler; +import org.mortbay.log.Log; import org.mortbay.util.StringUtil; import org.mortbay.util.ajax.Continuation; import org.mortbay.util.ajax.ContinuationSupport; @@ -168,7 +169,7 @@ writer.write(new String(content,0,len)); } catch(IOException e) - { + { writer.write(e.toString()); } @@ -178,16 +179,24 @@ // commit now writer.flush(); response.setContentLength(buf.size()+1000); - buf.writeTo(out); - - buf.reset(); - writer.flush(); - for (int pad=998-buf.size();pad-->0;) - writer.write(" "); - writer.write("\015\012"); - writer.flush(); - buf.writeTo(out); - - response.setHeader("IgnoreMe","ignored"); + + try + { + buf.writeTo(out); + + buf.reset(); + writer.flush(); + for (int pad=998-buf.size();pad-->0;) + writer.write(" "); + writer.write("\015\012"); + writer.flush(); + buf.writeTo(out); + + response.setHeader("IgnoreMe","ignored"); + } + catch(Exception e) + { + Log.ignore(e); + } } } \ No newline at end of file Index: modules/jetty/src/test/java/org/mortbay/jetty/RFC2616Test.java =================================================================== --- modules/jetty/src/test/java/org/mortbay/jetty/RFC2616Test.java (revision 2133) +++ modules/jetty/src/test/java/org/mortbay/jetty/RFC2616Test.java (working copy) @@ -383,9 +383,11 @@ "\n",true); offset=checkContains(response,offset,"HTTP/1.1 100 ","8.2.3 expect 100")+1; checkNotContained(response,offset,"HTTP/1.1 200","8.2.3 expect 100"); + /* can't test this with localconnector. response=connector.getResponses("654321\015\012"); offset=checkContains(response,offset,"HTTP/1.1 200","8.2.3 expect 100")+1; offset=checkContains(response,offset,"654321","8.2.3 expect 100")+1; + */ } catch (Exception e) Index: modules/jetty/src/main/java/org/mortbay/jetty/HttpConnection.java =================================================================== --- modules/jetty/src/main/java/org/mortbay/jetty/HttpConnection.java (revision 2127) +++ modules/jetty/src/main/java/org/mortbay/jetty/HttpConnection.java (working copy) @@ -283,8 +283,21 @@ /** * @return The input stream for this connection. The stream will be created if it does not already exist. */ - public ServletInputStream getInputStream() + public ServletInputStream getInputStream() throws IOException { + if (_expect == HttpHeaderValues.CONTINUE_ORDINAL) + { + // TODO delay sending 100 response until a read is attempted. + if (((HttpParser)_parser).getHeaderBuffer()==null || ((HttpParser)_parser).getHeaderBuffer().length()<2) + { + _generator.setResponse(HttpStatus.ORDINAL_100_Continue, null); + _generator.completeHeader(null, true); + _generator.complete(); + _generator.reset(false); + } + _expect = UNKNOWN; + } + if (_in == null) _in = new HttpParser.Input(((HttpParser)_parser),_connector.getMaxIdleTime()); return _in; @@ -543,6 +556,14 @@ if (!retrying) { + if (_expect == HttpHeaderValues.CONTINUE_ORDINAL) + { + // Continue not sent so don't parse any content + _expect = UNKNOWN; + if (_parser instanceof HttpParser) + ((HttpParser)_parser).setState(HttpParser.STATE_END); + } + if (_request.getContinuation()!=null) { Log.debug("continuation still pending {}"); @@ -565,7 +586,7 @@ } else { - _response.complete(); // TODO ???????????? + _response.complete(); } } } @@ -798,14 +819,6 @@ { if (_expect == HttpHeaderValues.CONTINUE_ORDINAL) { - // TODO delay sending 100 response until a read is attempted. - if (((HttpParser)_parser).getHeaderBuffer()==null || ((HttpParser)_parser).getHeaderBuffer().length()<2) - { - _generator.setResponse(HttpStatus.ORDINAL_100_Continue, null); - _generator.completeHeader(null, true); - _generator.complete(); - _generator.reset(false); - } } else if (_expect == HttpHeaderValues.PROCESSING_ORDINAL) { @@ -825,7 +838,7 @@ _request.setCharacterEncodingUnchecked(_charset); // Either handle now or wait for first content - if (((HttpParser)_parser).getContentLength()<=0 && !((HttpParser)_parser).isChunking()) + if ((((HttpParser)_parser).getContentLength()<=0 && !((HttpParser)_parser).isChunking())||_expect==HttpHeaderValues.CONTINUE_ORDINAL) handleRequest(); else _delayedHandling=true; Index: modules/jetty/src/main/java/org/mortbay/jetty/AbstractGenerator.java =================================================================== --- modules/jetty/src/main/java/org/mortbay/jetty/AbstractGenerator.java (revision 2127) +++ modules/jetty/src/main/java/org/mortbay/jetty/AbstractGenerator.java (working copy) @@ -316,7 +316,8 @@ */ public void setVersion(int version) { - if (_state != STATE_HEADER) throw new IllegalStateException("STATE!=START"); + if (_state != STATE_HEADER) + throw new IllegalStateException("STATE!=START "+_state); _version = version; if (_version==HttpVersions.HTTP_0_9_ORDINAL && _method!=null) _noContent=true; jetty-6.1.26/patches/java5.patch0000644000175000017500000035404411365327116015144 0ustar moonmoonIndex: patches/java5.patch =================================================================== --- patches/java5.patch (revision 5958) +++ patches/java5.patch (working copy) @@ -1,1578 +0,0 @@ -Index: modules/jetty/pom.xml -=================================================================== ---- modules/jetty/pom.xml (revision 4733) -+++ modules/jetty/pom.xml (working copy) -@@ -36,6 +36,13 @@ - - - -+ maven-compiler-plugin -+ -+ 1.5 -+ 1.5 -+ -+ -+ - maven-antrun-plugin - - -Index: modules/jetty/src/main/java/org/mortbay/io/AbstractBuffer.java -=================================================================== ---- modules/jetty/src/main/java/org/mortbay/io/AbstractBuffer.java (revision 4733) -+++ modules/jetty/src/main/java/org/mortbay/io/AbstractBuffer.java (working copy) -@@ -558,7 +558,7 @@ - - public String toDetailString() - { -- StringBuffer buf = new StringBuffer(); -+ StringBuilder buf = new StringBuilder(); - buf.append("["); - buf.append(super.hashCode()); - buf.append(","); -Index: modules/jetty/src/main/java/org/mortbay/io/BufferUtil.java -=================================================================== ---- modules/jetty/src/main/java/org/mortbay/io/BufferUtil.java (revision 4733) -+++ modules/jetty/src/main/java/org/mortbay/io/BufferUtil.java (working copy) -@@ -315,7 +315,7 @@ - if (bytes!=null) - return new String(bytes,buffer.getIndex(),buffer.length(),StringUtil.__ISO_8859_1); - -- StringBuffer b = new StringBuffer(buffer.length()); -+ StringBuilder b = new StringBuilder(buffer.length()); - for (int i=buffer.getIndex(),c=0;c 0 && ((scheme.equalsIgnoreCase("http") && port != 80) || (scheme.equalsIgnoreCase("https") && port != 443))) -- { -- url.append(':'); -- url.append(port); -- } -- return url; -+ url.append(scheme); -+ url.append("://"); -+ url.append(getServerName()); -+ -+ if (port > 0 && ((scheme.equalsIgnoreCase("http") && port != 80) || (scheme.equalsIgnoreCase("https") && port != 443))) -+ { -+ url.append(':'); -+ url.append(port); - } -+ return url; - } - - /* ------------------------------------------------------------ */ -Index: modules/jetty/src/main/java/org/mortbay/jetty/Response.java -=================================================================== ---- modules/jetty/src/main/java/org/mortbay/jetty/Response.java (revision 4733) -+++ modules/jetty/src/main/java/org/mortbay/jetty/Response.java (working copy) -@@ -387,7 +387,7 @@ - - if (!URIUtil.hasScheme(location)) - { -- StringBuffer buf = _connection.getRequest().getRootURL(); -+ StringBuilder buf = _connection.getRequest().getRootURL(); - if (location.startsWith("/")) - buf.append(URIUtil.canonicalPath(location)); - else -Index: modules/jetty/src/main/java/org/mortbay/jetty/security/HTAccessHandler.java -=================================================================== ---- modules/jetty/src/main/java/org/mortbay/jetty/security/HTAccessHandler.java (revision 4733) -+++ modules/jetty/src/main/java/org/mortbay/jetty/security/HTAccessHandler.java (working copy) -@@ -668,7 +668,7 @@ - /* ------------------------------------------------------------ */ - public String toString() - { -- StringBuffer buf=new StringBuffer(); -+ StringBuilder buf=new StringBuilder(); - - buf.append("AuthUserFile="); - buf.append(_userFile); -Index: modules/jetty/src/main/java/org/mortbay/jetty/security/Password.java -=================================================================== ---- modules/jetty/src/main/java/org/mortbay/jetty/security/Password.java (revision 4733) -+++ modules/jetty/src/main/java/org/mortbay/jetty/security/Password.java (working copy) -@@ -122,31 +122,29 @@ - /* ------------------------------------------------------------ */ - public static String obfuscate(String s) - { -- StringBuffer buf = new StringBuffer(); -+ StringBuilder buf = new StringBuilder(); - byte[] b = s.getBytes(); -- -- synchronized(buf) -+ -+ buf.append(__OBFUSCATE); -+ for (int i=0;i 0) - chain= new CachedChain(filters, servletHolder); -- synchronized(this) -- { -- if (_maxFilterChainsCacheSize>0 && _chainCache[requestType].size()>_maxFilterChainsCacheSize) -- _chainCache[requestType].clear(); -- _chainCache[requestType].put(key,chain); -- } -+ if (_maxFilterChainsCacheSize>0 && _chainCache[requestType].size()>_maxFilterChainsCacheSize) -+ _chainCache[requestType].clear(); -+ _chainCache[requestType].put(key,chain); - } - else if (LazyList.size(filters) > 0) - chain = new Chain(filters, servletHolder); -@@ -1205,7 +1201,7 @@ - /* ------------------------------------------------------------ */ - public String toString() - { -- StringBuffer b = new StringBuffer(); -+ StringBuilder b = new StringBuilder(); - for (int i=0; i"); - buf.append(title); - buf.append("\n

"); -Index: modules/jetty/src/main/java/org/mortbay/xml/XmlConfiguration.java -=================================================================== ---- modules/jetty/src/main/java/org/mortbay/xml/XmlConfiguration.java (revision 4733) -+++ modules/jetty/src/main/java/org/mortbay/xml/XmlConfiguration.java (working copy) -@@ -838,16 +838,13 @@ - else - { - // Get the multiple items as a single string -- StringBuffer buf = new StringBuffer(); -- synchronized (buf) -+ StringBuilder buf = new StringBuilder(); -+ for (int i = first; i <= last; i++) - { -- for (int i = first; i <= last; i++) -- { -- Object item = node.get(i); -- buf.append(itemValue(obj, item)); -- } -- value = buf.toString(); -+ Object item = node.get(i); -+ buf.append(itemValue(obj, item)); - } -+ value = buf.toString(); - } - } - -Index: modules/jetty/src/main/java/org/mortbay/xml/XmlParser.java -=================================================================== ---- modules/jetty/src/main/java/org/mortbay/xml/XmlParser.java (revision 4733) -+++ modules/jetty/src/main/java/org/mortbay/xml/XmlParser.java (working copy) -@@ -669,12 +669,9 @@ - */ - public synchronized String toString(boolean tag) - { -- StringBuffer buf = new StringBuffer(); -- synchronized (buf) -- { -- toString(buf, tag); -- return buf.toString(); -- } -+ StringBuilder buf = new StringBuilder(); -+ toString(buf, tag); -+ return buf.toString(); - } - - /* ------------------------------------------------------------ */ -@@ -692,7 +689,7 @@ - } - - /* ------------------------------------------------------------ */ -- private synchronized void toString(StringBuffer buf, boolean tag) -+ private synchronized void toString(StringBuilder buf, boolean tag) - { - if (tag) - { -Index: modules/jetty/src/test/java/org/mortbay/jetty/HttpServerTestBase.java -=================================================================== ---- modules/jetty/src/test/java/org/mortbay/jetty/HttpServerTestBase.java (revision 4733) -+++ modules/jetty/src/test/java/org/mortbay/jetty/HttpServerTestBase.java (working copy) -@@ -251,7 +251,7 @@ - { - - int[] points=new int[pointCount]; -- StringBuffer message=new StringBuffer(); -+ StringBuilder message=new StringBuilder(); - - message.append("iteration #"+(i+1)); - -@@ -296,7 +296,7 @@ - for (int i=0; i - - -+ maven-compiler-plugin -+ -+ 1.5 -+ 1.5 -+ -+ -+ - maven-antrun-plugin - - -Index: modules/util/src/main/java/org/mortbay/servlet/CGI.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/servlet/CGI.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/servlet/CGI.java (working copy) -@@ -373,7 +373,7 @@ - * @throws IOException - */ - private String getTextLineFromStream( InputStream is ) throws IOException { -- StringBuffer buffer = new StringBuffer(); -+ StringBuilder buffer = new StringBuilder(); - int b; - - while( (b = is.read()) != -1 && b != (int) '\n' ) { -Index: modules/util/src/main/java/org/mortbay/servlet/GzipFilter.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/servlet/GzipFilter.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/servlet/GzipFilter.java (working copy) -@@ -330,7 +330,7 @@ - } - catch (IOException e) - { -- throw new IllegalStateException(); -+ throw new IllegalStateException(e); - } - } - } -Index: modules/util/src/main/java/org/mortbay/servlet/UserAgentFilter.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/servlet/UserAgentFilter.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/servlet/UserAgentFilter.java (working copy) -@@ -20,6 +20,7 @@ - import java.util.HashMap; - import java.util.List; - import java.util.Map; -+import java.util.concurrent.ConcurrentHashMap; - import java.util.regex.Matcher; - import java.util.regex.Pattern; - -@@ -55,7 +56,7 @@ - public class UserAgentFilter implements Filter - { - private Pattern _pattern; -- private Map _agentCache = new HashMap(); -+ private Map _agentCache = new ConcurrentHashMap(); - private int _agentCacheSize=1024; - private String _attribute; - -@@ -118,11 +119,8 @@ - if (ua==null) - return null; - -- String tag; -- synchronized(_agentCache) -- { -- tag = (String)_agentCache.get(ua); -- } -+ String tag = (String)_agentCache.get(ua); -+ - - if (tag==null) - { -@@ -144,12 +142,9 @@ - else - tag=ua; - -- synchronized(_agentCache) -- { -- if (_agentCache.size()>=_agentCacheSize) -+ if (_agentCache.size()>=_agentCacheSize) - _agentCache.clear(); - _agentCache.put(ua,tag); -- } - - } - return tag; -Index: modules/util/src/main/java/org/mortbay/thread/Timeout.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/thread/Timeout.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/thread/Timeout.java (working copy) -@@ -237,7 +237,7 @@ - /* ------------------------------------------------------------ */ - public String toString() - { -- StringBuffer buf = new StringBuffer(); -+ StringBuilder buf = new StringBuilder(); - buf.append(super.toString()); - - Task task = _head._next; -Index: modules/util/src/main/java/org/mortbay/util/ajax/JSON.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/ajax/JSON.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/util/ajax/JSON.java (working copy) -@@ -1031,7 +1031,7 @@ - { - boolean minus=false; - long number=0; -- StringBuffer buffer=null; -+ StringBuilder buffer=null; - - longLoop: while (source.hasNext()) - { -@@ -1063,7 +1063,7 @@ - case '.': - case 'e': - case 'E': -- buffer=new StringBuffer(16); -+ buffer=new StringBuilder(16); - if(minus) - buffer.append('-'); - buffer.append(number); -@@ -1079,8 +1079,6 @@ - if (buffer==null) - return TypeUtil.newLong(minus?-1*number:number); - -- synchronized (buffer) -- { - doubleLoop: while (source.hasNext()) - { - char c=source.peek(); -@@ -1110,7 +1108,6 @@ - } - } - return new Double(buffer.toString()); -- } - } - - protected void seekTo(char seek, Source source) -Index: modules/util/src/main/java/org/mortbay/util/ConcurrentMultiMap.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/ConcurrentMultiMap.java (revision 0) -+++ modules/util/src/main/java/org/mortbay/util/ConcurrentMultiMap.java (revision 0) -@@ -0,0 +1,303 @@ -+// ======================================================================== -+// Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. -+// ------------------------------------------------------------------------ -+// Licensed under the Apache License, Version 2.0 (the "License"); -+// you may not use this file except in compliance with the License. -+// You may obtain a copy of the License at -+// http://www.apache.org/licenses/LICENSE-2.0 -+// Unless required by applicable law or agreed to in writing, software -+// distributed under the License is distributed on an "AS IS" BASIS, -+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+// See the License for the specific language governing permissions and -+// limitations under the License. -+// ======================================================================== -+ -+package org.mortbay.util; -+ -+import java.util.Arrays; -+import java.util.concurrent.ConcurrentHashMap; -+import java.util.HashMap; -+import java.util.Iterator; -+import java.util.List; -+import java.util.Map; -+ -+/* ------------------------------------------------------------ */ -+/** A multi valued Map. -+ * This Map specializes HashMap and provides methods -+ * that operate on multi valued items. -+ *

-+ * Implemented as a map of LazyList values -+ * -+ * @see LazyList -+ * @author Greg Wilkins (gregw) -+ */ -+public class ConcurrentMultiMap extends ConcurrentHashMap -+ implements Cloneable -+{ -+ /* ------------------------------------------------------------ */ -+ /** Constructor. -+ */ -+ public ConcurrentMultiMap() -+ {} -+ -+ /* ------------------------------------------------------------ */ -+ /** Constructor. -+ * @param size Capacity of the map -+ */ -+ public ConcurrentMultiMap(int size) -+ { -+ super(size); -+ } -+ -+ /* ------------------------------------------------------------ */ -+ /** Constructor. -+ * @param map -+ */ -+ public ConcurrentMultiMap(Map map) -+ { -+ super((map.size()*3)/2); -+ putAll(map); -+ } -+ -+ /* ------------------------------------------------------------ */ -+ /** Get multiple values. -+ * Single valued entries are converted to singleton lists. -+ * @param name The entry key. -+ * @return Unmodifieable List of values. -+ */ -+ public List getValues(Object name) -+ { -+ return LazyList.getList(super.get(name),true); -+ } -+ -+ /* ------------------------------------------------------------ */ -+ /** Get a value from a multiple value. -+ * If the value is not a multivalue, then index 0 retrieves the -+ * value or null. -+ * @param name The entry key. -+ * @param i Index of element to get. -+ * @return Unmodifieable List of values. -+ */ -+ public Object getValue(Object name,int i) -+ { -+ Object l=super.get(name); -+ if (i==0 && LazyList.size(l)==0) -+ return null; -+ return LazyList.get(l,i); -+ } -+ -+ -+ /* ------------------------------------------------------------ */ -+ /** Get value as String. -+ * Single valued items are converted to a String with the toString() -+ * Object method. Multi valued entries are converted to a comma separated -+ * List. No quoting of commas within values is performed. -+ * @param name The entry key. -+ * @return String value. -+ */ -+ public String getString(Object name) -+ { -+ Object l=super.get(name); -+ switch(LazyList.size(l)) -+ { -+ case 0: -+ return null; -+ case 1: -+ Object o=LazyList.get(l,0); -+ return o==null?null:o.toString(); -+ default: -+ StringBuffer values=new StringBuffer(128); -+ synchronized(values) -+ { -+ for (int i=0; i0) -+ values.append(','); -+ values.append(e.toString()); -+ } -+ } -+ return values.toString(); -+ } -+ } -+ } -+ -+ /* ------------------------------------------------------------ */ -+ public Object get(Object name) -+ { -+ Object l=super.get(name); -+ switch(LazyList.size(l)) -+ { -+ case 0: -+ return null; -+ case 1: -+ Object o=LazyList.get(l,0); -+ return o; -+ default: -+ return LazyList.getList(l,true); -+ } -+ } -+ -+ /* ------------------------------------------------------------ */ -+ /** Put and entry into the map. -+ * @param name The entry key. -+ * @param value The entry value. -+ * @return The previous value or null. -+ */ -+ public Object put(Object name, Object value) -+ { -+ return super.put(name,LazyList.add(null,value)); -+ } -+ -+ /* ------------------------------------------------------------ */ -+ /** Put multi valued entry. -+ * @param name The entry key. -+ * @param values The List of multiple values. -+ * @return The previous value or null. -+ */ -+ public Object putValues(Object name, List values) -+ { -+ return super.put(name,values); -+ } -+ -+ /* ------------------------------------------------------------ */ -+ /** Put multi valued entry. -+ * @param name The entry key. -+ * @param values The String array of multiple values. -+ * @return The previous value or null. -+ */ -+ public Object putValues(Object name, String[] values) -+ { -+ Object list=null; -+ for (int i=0;i0) -+ { -+ ln=LazyList.remove(lo,value); -+ if (ln==null) -+ super.remove(name); -+ else -+ super.put(name, ln); -+ } -+ return LazyList.size(ln)!=s; -+ } -+ -+ /* ------------------------------------------------------------ */ -+ /** Put all contents of map. -+ * @param m Map -+ */ -+ public void putAll(Map m) -+ { -+ Iterator i = m.entrySet().iterator(); -+ boolean multi=m instanceof MultiMap; -+ while(i.hasNext()) -+ { -+ Map.Entry entry = -+ (Map.Entry)i.next(); -+ if (multi) -+ super.put(entry.getKey(),LazyList.clone(entry.getValue())); -+ else -+ put(entry.getKey(),entry.getValue()); -+ } -+ } -+ -+ /* ------------------------------------------------------------ */ -+ /** -+ * @return Map of String arrays -+ */ -+ public Map toStringArrayMap() -+ { -+ HashMap map = new HashMap(size()*3/2); -+ -+ Iterator i = super.entrySet().iterator(); -+ while(i.hasNext()) -+ { -+ Map.Entry entry = (Map.Entry)i.next(); -+ Object l = entry.getValue(); -+ String[] a = LazyList.toStringArray(l); -+ // for (int j=a.length;j-->0;) -+ // if (a[j]==null) -+ // a[j]=""; -+ map.put(entry.getKey(),a); -+ } -+ return map; -+ } -+ -+ /* ------------------------------------------------------------ */ -+ public Object clone() -+ throws CloneNotSupportedException -+ { -+ ConcurrentMultiMap mm = (ConcurrentMultiMap) super.clone(); -+ -+ Iterator iter = mm.entrySet().iterator(); -+ while (iter.hasNext()) -+ { -+ Map.Entry entry = (Map.Entry)iter.next(); -+ entry.setValue(LazyList.clone(entry.getValue())); -+ } -+ -+ return mm; -+ } -+} -Index: modules/util/src/main/java/org/mortbay/util/DateCache.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/DateCache.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/util/DateCache.java (working copy) -@@ -155,7 +155,7 @@ - String ss2 = _formatString.substring( zIndex+3 ); - int tzOffset = tz.getRawOffset(); - -- StringBuffer sb = new StringBuffer(_formatString.length()+10); -+ StringBuilder sb = new StringBuilder(_formatString.length()+10); - sb.append(ss1); - sb.append("'"); - if( tzOffset >= 0 ) -@@ -254,17 +254,15 @@ - - // Always format if we get here - _lastSeconds = seconds; -- StringBuffer sb=new StringBuffer(_secFormatString.length()); -- synchronized(sb) -- { -- sb.append(_secFormatString0); -- int s=(int)(seconds%60); -- if (s<10) -- sb.append('0'); -- sb.append(s); -- sb.append(_secFormatString1); -- _lastResult=sb.toString(); -- } -+ StringBuilder sb=new StringBuilder(_secFormatString.length()); -+ sb.append(_secFormatString0); -+ int s=(int)(seconds%60); -+ if (s<10) -+ sb.append('0'); -+ sb.append(s); -+ sb.append(_secFormatString1); -+ _lastResult=sb.toString(); -+ - - return _lastResult; - } -@@ -272,9 +270,9 @@ - /* ------------------------------------------------------------ */ - /** Format to string buffer. - * @param inDate Date the format -- * @param buffer StringBuffer -+ * @param buffer StringBuilder - */ -- public void format(long inDate, StringBuffer buffer) -+ public void format(long inDate, StringBuilder buffer) - { - buffer.append(format(inDate)); - } -Index: modules/util/src/main/java/org/mortbay/util/MultiMap.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/MultiMap.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/util/MultiMap.java (working copy) -@@ -105,21 +105,20 @@ - Object o=LazyList.get(l,0); - return o==null?null:o.toString(); - default: -- StringBuffer values=new StringBuffer(128); -- synchronized(values) -+ { -+ StringBuilder values=new StringBuilder(128); -+ for (int i=0; i0) -- values.append(','); -- values.append(e.toString()); -- } -- } -- return values.toString(); -- } -+ if (values.length()>0) -+ values.append(','); -+ values.append(e.toString()); -+ } -+ } -+ return values.toString(); -+ } - } - } - -Index: modules/util/src/main/java/org/mortbay/util/RolloverFileOutputStream.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/RolloverFileOutputStream.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/util/RolloverFileOutputStream.java (working copy) -@@ -166,7 +166,7 @@ - synchronized(RolloverFileOutputStream.class) - { - if (__rollover==null) -- __rollover=new Timer(true); -+ __rollover=new Timer(RolloverFileOutputStream.class.getName(),true); - - _rollTask=new RollTask(); - -Index: modules/util/src/main/java/org/mortbay/util/Scanner.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/Scanner.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/util/Scanner.java (working copy) -@@ -43,6 +43,7 @@ - */ - public class Scanner - { -+ private static int __scannerId=0; - private int _scanInterval; - private List _listeners = Collections.synchronizedList(new ArrayList()); - private Map _prevScan = new HashMap(); -@@ -235,7 +236,7 @@ - - public Timer newTimer () - { -- return new Timer(true); -+ return new Timer("Scanner-"+__scannerId++, true); - } - - public void schedule () -Index: modules/util/src/main/java/org/mortbay/util/StringMap.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/StringMap.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/util/StringMap.java (working copy) -@@ -613,15 +613,12 @@ - public Object setValue(Object o){Object old=_value;_value=o;return old;} - public String toString() - { -- StringBuffer buf=new StringBuffer(); -- synchronized(buf) -- { -- toString(buf); -- } -+ StringBuilder buf=new StringBuilder(); -+ toString(buf); - return buf.toString(); - } - -- private void toString(StringBuffer buf) -+ private void toString(StringBuilder buf) - { - buf.append("{["); - if (_char==null) -Index: modules/util/src/main/java/org/mortbay/util/StringUtil.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/StringUtil.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/util/StringUtil.java (working copy) -@@ -191,22 +191,20 @@ - if (i == -1) - return s; - -- StringBuffer buf = new StringBuffer(s.length()+with.length()); -+ StringBuilder buf = new StringBuilder(s.length()+with.length()); - -- synchronized(buf) -+ do - { -- do -- { -- buf.append(s.substring(c,i)); -- buf.append(with); -- c=i+sub.length(); -- } while ((i=s.indexOf(sub,c))!=-1); -- -- if (c=0) - { -- buf=new StringBuffer(path.length()<<1); -+ buf=new StringBuilder(path.length()<<1); - break loop; - } - } -@@ -169,7 +169,7 @@ - /* ------------------------------------------------------------ */ - /* Decode a URI path. - * @param path The path the encode -- * @param buf StringBuffer to encode path into -+ * @param buf StringBuilder to encode path into - */ - public static String decodePath(String path) - { -@@ -247,7 +247,7 @@ - /* ------------------------------------------------------------ */ - /* Decode a URI path. - * @param path The path the encode -- * @param buf StringBuffer to encode path into -+ * @param buf StringBuilder to encode path into - */ - public static String decodePath(byte[] buf, int offset, int length) - { -@@ -312,7 +312,7 @@ - if (split<0) - split=p1.length(); - -- StringBuffer buf = new StringBuffer(p1.length()+p2.length()+2); -+ StringBuilder buf = new StringBuilder(p1.length()+p2.length()+2); - buf.append(p1); - - if (buf.charAt(split-1)=='/') -@@ -406,7 +406,7 @@ - if (start>=end) - return path; - -- StringBuffer buf = new StringBuffer(path); -+ StringBuilder buf = new StringBuilder(path); - int delStart=-1; - int delEnd=-1; - int skip=0; -Index: modules/util/src/main/java/org/mortbay/util/UrlEncoded.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/UrlEncoded.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/util/UrlEncoded.java (working copy) -@@ -116,57 +116,56 @@ - { - if (charset==null) - charset=StringUtil.__UTF8; -- -- StringBuffer result = new StringBuffer(128); -- synchronized(result) -+ -+ StringBuilder result = new StringBuilder(128); -+ -+ Iterator iter = map.entrySet().iterator(); -+ while(iter.hasNext()) - { -- Iterator iter = map.entrySet().iterator(); -- while(iter.hasNext()) -+ Map.Entry entry = (Map.Entry)iter.next(); -+ -+ String key = entry.getKey().toString(); -+ Object list = entry.getValue(); -+ int s=LazyList.size(list); -+ -+ if (s==0) - { -- Map.Entry entry = (Map.Entry)iter.next(); -- -- String key = entry.getKey().toString(); -- Object list = entry.getValue(); -- int s=LazyList.size(list); -- -- if (s==0) -+ result.append(encodeString(key,charset)); -+ if(equalsForNullValue) -+ result.append('='); -+ } -+ else -+ { -+ for (int i=0;i0) -+ result.append('&'); -+ Object val=LazyList.get(list,i); - result.append(encodeString(key,charset)); -- if(equalsForNullValue) -- result.append('='); -- } -- else -- { -- for (int i=0;i0) -- result.append('&'); -- Object val=LazyList.get(list,i); -- result.append(encodeString(key,charset)); - -- if (val!=null) -+ if (val!=null) -+ { -+ String str=val.toString(); -+ if (str.length()>0) - { -- String str=val.toString(); -- if (str.length()>0) -- { -- result.append('='); -- result.append(encodeString(str,charset)); -- } -- else if (equalsForNullValue) -- result.append('='); -+ result.append('='); -+ result.append(encodeString(str,charset)); - } - else if (equalsForNullValue) - result.append('='); - } -+ else if (equalsForNullValue) -+ result.append('='); - } -- if (iter.hasNext()) -- result.append('&'); - } -- return result.toString(); -+ if (iter.hasNext()) -+ result.append('&'); - } -+ return result.toString(); - } - - -+ - /* -------------------------------------------------------------- */ - /** Decoded parameters to Map. - * @param content the string containing the encoded parameters -Index: modules/util/src/main/java/org/mortbay/util/Utf8StringBuffer.java -=================================================================== ---- modules/util/src/main/java/org/mortbay/util/Utf8StringBuffer.java (revision 4733) -+++ modules/util/src/main/java/org/mortbay/util/Utf8StringBuffer.java (working copy) -@@ -26,6 +26,7 @@ - * The UTF-8 decoding is done by this class and no additional buffers or Readers are used. - * The UTF-8 code was inspired by http://javolution.org - * -+ * This class is not synchronized and should probably be called Utf8StringBuilder - */ - public class Utf8StringBuffer - { -Index: modules/util/src/test/java/org/mortbay/util/StringMapTest.java -=================================================================== ---- modules/util/src/test/java/org/mortbay/util/StringMapTest.java (revision 4733) -+++ modules/util/src/test/java/org/mortbay/util/StringMapTest.java (working copy) -@@ -133,7 +133,7 @@ - m5.put("aBc", "x"); - m5i.put("AbC", "x"); - -- StringBuffer buffer=new StringBuffer(); -+ StringBuilder buffer=new StringBuilder(); - buffer.append("aBc"); - assertEquals("2",m5.get("abc")); - assertEquals("x",m5.get(buffer)); -Index: modules/util/src/test/java/org/mortbay/util/StringUtilTest.java -=================================================================== ---- modules/util/src/test/java/org/mortbay/util/StringUtilTest.java (revision 4733) -+++ modules/util/src/test/java/org/mortbay/util/StringUtilTest.java (working copy) -@@ -137,7 +137,7 @@ - - public void testAppend() - { -- StringBuffer buf = new StringBuffer(); -+ StringBuilder buf = new StringBuilder(); - buf.append('a'); - StringUtil.append(buf, "abc", 1, 1); - StringUtil.append(buf, (byte)12, 16); -Index: modules/util/src/test/java/org/mortbay/util/URITest.java -=================================================================== ---- modules/util/src/test/java/org/mortbay/util/URITest.java (revision 4733) -+++ modules/util/src/test/java/org/mortbay/util/URITest.java (working copy) -@@ -45,7 +45,7 @@ - public void testEncodePath() - { - // test basic encode/decode -- StringBuffer buf = new StringBuffer(); -+ StringBuilder buf = new StringBuilder(); - - - buf.setLength(0); Index: modules/jetty/src/test/java/org/mortbay/jetty/HttpServerTestBase.java =================================================================== --- modules/jetty/src/test/java/org/mortbay/jetty/HttpServerTestBase.java (revision 5958) +++ modules/jetty/src/test/java/org/mortbay/jetty/HttpServerTestBase.java (working copy) @@ -251,7 +251,7 @@ { int[] points=new int[pointCount]; - StringBuffer message=new StringBuffer(); + StringBuilder message=new StringBuilder(); message.append("iteration #"+(i+1)); @@ -296,7 +296,7 @@ for (int i=0; i 0) chain= new CachedChain(filters, servletHolder); - synchronized(this) - { - if (_maxFilterChainsCacheSize>0 && _chainCache[requestType].size()>_maxFilterChainsCacheSize) - _chainCache[requestType].clear(); - _chainCache[requestType].put(key,chain); - } + if (_maxFilterChainsCacheSize>0 && _chainCache[requestType].size()>_maxFilterChainsCacheSize) + _chainCache[requestType].clear(); + _chainCache[requestType].put(key,chain); } else if (LazyList.size(filters) > 0) chain = new Chain(filters, servletHolder); @@ -1223,7 +1219,7 @@ /* ------------------------------------------------------------ */ public String toString() { - StringBuffer b = new StringBuffer(); + StringBuilder b = new StringBuilder(); for (int i=0; i 0 && ((scheme.equalsIgnoreCase("http") && port != 80) || (scheme.equalsIgnoreCase("https") && port != 443))) - { - url.append(':'); - url.append(port); - } - return url; + url.append(scheme); + url.append("://"); + url.append(getServerName()); + + if (port > 0 && ((scheme.equalsIgnoreCase("http") && port != 80) || (scheme.equalsIgnoreCase("https") && port != 443))) + { + url.append(':'); + url.append(port); } + return url; } /* ------------------------------------------------------------ */ Index: modules/jetty/src/main/java/org/mortbay/xml/XmlConfiguration.java =================================================================== --- modules/jetty/src/main/java/org/mortbay/xml/XmlConfiguration.java (revision 5958) +++ modules/jetty/src/main/java/org/mortbay/xml/XmlConfiguration.java (working copy) @@ -838,16 +838,13 @@ else { // Get the multiple items as a single string - StringBuffer buf = new StringBuffer(); - synchronized (buf) + StringBuilder buf = new StringBuilder(); + for (int i = first; i <= last; i++) { - for (int i = first; i <= last; i++) - { - Object item = node.get(i); - buf.append(itemValue(obj, item)); - } - value = buf.toString(); + Object item = node.get(i); + buf.append(itemValue(obj, item)); } + value = buf.toString(); } } Index: modules/jetty/src/main/java/org/mortbay/xml/XmlParser.java =================================================================== --- modules/jetty/src/main/java/org/mortbay/xml/XmlParser.java (revision 5958) +++ modules/jetty/src/main/java/org/mortbay/xml/XmlParser.java (working copy) @@ -669,12 +669,9 @@ */ public synchronized String toString(boolean tag) { - StringBuffer buf = new StringBuffer(); - synchronized (buf) - { - toString(buf, tag); - return buf.toString(); - } + StringBuilder buf = new StringBuilder(); + toString(buf, tag); + return buf.toString(); } /* ------------------------------------------------------------ */ @@ -692,7 +689,7 @@ } /* ------------------------------------------------------------ */ - private synchronized void toString(StringBuffer buf, boolean tag) + private synchronized void toString(StringBuilder buf, boolean tag) { if (tag) { Index: modules/jetty/src/main/java/org/mortbay/io/BufferUtil.java =================================================================== --- modules/jetty/src/main/java/org/mortbay/io/BufferUtil.java (revision 5958) +++ modules/jetty/src/main/java/org/mortbay/io/BufferUtil.java (working copy) @@ -315,7 +315,7 @@ if (bytes!=null) return new String(bytes,buffer.getIndex(),buffer.length(),StringUtil.__ISO_8859_1); - StringBuffer b = new StringBuffer(buffer.length()); + StringBuilder b = new StringBuilder(buffer.length()); for (int i=buffer.getIndex(),c=0;c"); buf.append(title); buf.append("\n

"); Index: modules/jetty/pom.xml =================================================================== --- modules/jetty/pom.xml (revision 5958) +++ modules/jetty/pom.xml (working copy) @@ -36,6 +36,13 @@ + maven-compiler-plugin + + 1.5 + 1.5 + + + maven-antrun-plugin Index: modules/util/src/test/java/org/mortbay/util/URITest.java =================================================================== --- modules/util/src/test/java/org/mortbay/util/URITest.java (revision 5958) +++ modules/util/src/test/java/org/mortbay/util/URITest.java (working copy) @@ -45,7 +45,7 @@ public void testEncodePath() { // test basic encode/decode - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.setLength(0); Index: modules/util/src/test/java/org/mortbay/util/StringMapTest.java =================================================================== --- modules/util/src/test/java/org/mortbay/util/StringMapTest.java (revision 5958) +++ modules/util/src/test/java/org/mortbay/util/StringMapTest.java (working copy) @@ -133,7 +133,7 @@ m5.put("aBc", "x"); m5i.put("AbC", "x"); - StringBuffer buffer=new StringBuffer(); + StringBuilder buffer=new StringBuilder(); buffer.append("aBc"); assertEquals("2",m5.get("abc")); assertEquals("x",m5.get(buffer)); Index: modules/util/src/test/java/org/mortbay/util/StringUtilTest.java =================================================================== --- modules/util/src/test/java/org/mortbay/util/StringUtilTest.java (revision 5958) +++ modules/util/src/test/java/org/mortbay/util/StringUtilTest.java (working copy) @@ -137,7 +137,7 @@ public void testAppend() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append('a'); StringUtil.append(buf, "abc", 1, 1); StringUtil.append(buf, (byte)12, 16); Index: modules/util/src/main/java/org/mortbay/servlet/GzipFilter.java =================================================================== --- modules/util/src/main/java/org/mortbay/servlet/GzipFilter.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/servlet/GzipFilter.java (working copy) @@ -373,7 +373,7 @@ } catch (IOException e) { - throw new IllegalStateException(); + throw new IllegalStateException(e); } } } Index: modules/util/src/main/java/org/mortbay/servlet/CGI.java =================================================================== --- modules/util/src/main/java/org/mortbay/servlet/CGI.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/servlet/CGI.java (working copy) @@ -379,7 +379,7 @@ * @throws IOException */ private String getTextLineFromStream( InputStream is ) throws IOException { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); int b; while( (b = is.read()) != -1 && b != (int) '\n' ) { Index: modules/util/src/main/java/org/mortbay/servlet/UserAgentFilter.java =================================================================== --- modules/util/src/main/java/org/mortbay/servlet/UserAgentFilter.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/servlet/UserAgentFilter.java (working copy) @@ -17,6 +17,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -52,7 +53,7 @@ public class UserAgentFilter implements Filter { private Pattern _pattern; - private Map _agentCache = new HashMap(); + private Map _agentCache = new ConcurrentHashMap(); private int _agentCacheSize=1024; private String _attribute; @@ -115,11 +116,8 @@ if (ua==null) return null; - String tag; - synchronized(_agentCache) - { - tag = (String)_agentCache.get(ua); - } + String tag = (String)_agentCache.get(ua); + if (tag==null) { @@ -141,12 +139,9 @@ else tag=ua; - synchronized(_agentCache) - { - if (_agentCache.size()>=_agentCacheSize) + if (_agentCache.size()>=_agentCacheSize) _agentCache.clear(); _agentCache.put(ua,tag); - } } return tag; Index: modules/util/src/main/java/org/mortbay/thread/Timeout.java =================================================================== --- modules/util/src/main/java/org/mortbay/thread/Timeout.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/thread/Timeout.java (working copy) @@ -223,7 +223,7 @@ /* ------------------------------------------------------------ */ public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append(super.toString()); Task task = _head._next; Index: modules/util/src/main/java/org/mortbay/util/DateCache.java =================================================================== --- modules/util/src/main/java/org/mortbay/util/DateCache.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/util/DateCache.java (working copy) @@ -155,7 +155,7 @@ String ss2 = _formatString.substring( zIndex+3 ); int tzOffset = tz.getRawOffset(); - StringBuffer sb = new StringBuffer(_formatString.length()+10); + StringBuilder sb = new StringBuilder(_formatString.length()+10); sb.append(ss1); sb.append("'"); if( tzOffset >= 0 ) @@ -254,17 +254,15 @@ // Always format if we get here _lastSeconds = seconds; - StringBuffer sb=new StringBuffer(_secFormatString.length()); - synchronized(sb) - { - sb.append(_secFormatString0); - int s=(int)(seconds%60); - if (s<10) - sb.append('0'); - sb.append(s); - sb.append(_secFormatString1); - _lastResult=sb.toString(); - } + StringBuilder sb=new StringBuilder(_secFormatString.length()); + sb.append(_secFormatString0); + int s=(int)(seconds%60); + if (s<10) + sb.append('0'); + sb.append(s); + sb.append(_secFormatString1); + _lastResult=sb.toString(); + return _lastResult; } @@ -272,9 +270,9 @@ /* ------------------------------------------------------------ */ /** Format to string buffer. * @param inDate Date the format - * @param buffer StringBuffer + * @param buffer StringBuilder */ - public void format(long inDate, StringBuffer buffer) + public void format(long inDate, StringBuilder buffer) { buffer.append(format(inDate)); } Index: modules/util/src/main/java/org/mortbay/util/RolloverFileOutputStream.java =================================================================== --- modules/util/src/main/java/org/mortbay/util/RolloverFileOutputStream.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/util/RolloverFileOutputStream.java (working copy) @@ -162,7 +162,7 @@ synchronized(RolloverFileOutputStream.class) { if (__rollover==null) - __rollover=new Timer(true); + __rollover=new Timer(RolloverFileOutputStream.class.getName(),true); _rollTask=new RollTask(); Index: modules/util/src/main/java/org/mortbay/util/ajax/JSON.java =================================================================== --- modules/util/src/main/java/org/mortbay/util/ajax/JSON.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/util/ajax/JSON.java (working copy) @@ -1057,7 +1057,7 @@ { boolean minus=false; long number=0; - StringBuffer buffer=null; + StringBuilder buffer=null; longLoop: while (source.hasNext()) { @@ -1089,7 +1089,7 @@ case '.': case 'e': case 'E': - buffer=new StringBuffer(16); + buffer=new StringBuilder(16); if(minus) buffer.append('-'); buffer.append(number); @@ -1105,8 +1105,6 @@ if (buffer==null) return TypeUtil.newLong(minus?-1*number:number); - synchronized (buffer) - { doubleLoop: while (source.hasNext()) { char c=source.peek(); @@ -1136,7 +1134,6 @@ } } return new Double(buffer.toString()); - } } protected void seekTo(char seek, Source source) Index: modules/util/src/main/java/org/mortbay/util/StringUtil.java =================================================================== --- modules/util/src/main/java/org/mortbay/util/StringUtil.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/util/StringUtil.java (working copy) @@ -191,22 +191,20 @@ if (i == -1) return s; - StringBuffer buf = new StringBuffer(s.length()+with.length()); + StringBuilder buf = new StringBuilder(s.length()+with.length()); - synchronized(buf) + do { - do - { - buf.append(s.substring(c,i)); - buf.append(with); - c=i+sub.length(); - } while ((i=s.indexOf(sub,c))!=-1); - - if (c0) - values.append(','); - values.append(e.toString()); - } - } - return values.toString(); - } + if (values.length()>0) + values.append(','); + values.append(e.toString()); + } + } + return values.toString(); + } } } Index: modules/util/src/main/java/org/mortbay/util/Scanner.java =================================================================== --- modules/util/src/main/java/org/mortbay/util/Scanner.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/util/Scanner.java (working copy) @@ -43,6 +43,7 @@ */ public class Scanner { + private static int __scannerId=0; private int _scanInterval; private List _listeners = Collections.synchronizedList(new ArrayList()); private Map _prevScan = new HashMap(); @@ -235,7 +236,7 @@ public Timer newTimer () { - return new Timer(true); + return new Timer("Scanner-"+__scannerId++, true); } public void schedule () Index: modules/util/src/main/java/org/mortbay/util/ConcurrentMultiMap.java =================================================================== --- modules/util/src/main/java/org/mortbay/util/ConcurrentMultiMap.java (revision 0) +++ modules/util/src/main/java/org/mortbay/util/ConcurrentMultiMap.java (revision 0) @@ -0,0 +1,303 @@ +// ======================================================================== +// Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ======================================================================== + +package org.mortbay.util; + +import java.util.Arrays; +import java.util.concurrent.ConcurrentHashMap; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/* ------------------------------------------------------------ */ +/** A multi valued Map. + * This Map specializes HashMap and provides methods + * that operate on multi valued items. + *

+ * Implemented as a map of LazyList values + * + * @see LazyList + * @author Greg Wilkins (gregw) + */ +public class ConcurrentMultiMap extends ConcurrentHashMap + implements Cloneable +{ + /* ------------------------------------------------------------ */ + /** Constructor. + */ + public ConcurrentMultiMap() + {} + + /* ------------------------------------------------------------ */ + /** Constructor. + * @param size Capacity of the map + */ + public ConcurrentMultiMap(int size) + { + super(size); + } + + /* ------------------------------------------------------------ */ + /** Constructor. + * @param map + */ + public ConcurrentMultiMap(Map map) + { + super((map.size()*3)/2); + putAll(map); + } + + /* ------------------------------------------------------------ */ + /** Get multiple values. + * Single valued entries are converted to singleton lists. + * @param name The entry key. + * @return Unmodifieable List of values. + */ + public List getValues(Object name) + { + return LazyList.getList(super.get(name),true); + } + + /* ------------------------------------------------------------ */ + /** Get a value from a multiple value. + * If the value is not a multivalue, then index 0 retrieves the + * value or null. + * @param name The entry key. + * @param i Index of element to get. + * @return Unmodifieable List of values. + */ + public Object getValue(Object name,int i) + { + Object l=super.get(name); + if (i==0 && LazyList.size(l)==0) + return null; + return LazyList.get(l,i); + } + + + /* ------------------------------------------------------------ */ + /** Get value as String. + * Single valued items are converted to a String with the toString() + * Object method. Multi valued entries are converted to a comma separated + * List. No quoting of commas within values is performed. + * @param name The entry key. + * @return String value. + */ + public String getString(Object name) + { + Object l=super.get(name); + switch(LazyList.size(l)) + { + case 0: + return null; + case 1: + Object o=LazyList.get(l,0); + return o==null?null:o.toString(); + default: + StringBuffer values=new StringBuffer(128); + synchronized(values) + { + for (int i=0; i0) + values.append(','); + values.append(e.toString()); + } + } + return values.toString(); + } + } + } + + /* ------------------------------------------------------------ */ + public Object get(Object name) + { + Object l=super.get(name); + switch(LazyList.size(l)) + { + case 0: + return null; + case 1: + Object o=LazyList.get(l,0); + return o; + default: + return LazyList.getList(l,true); + } + } + + /* ------------------------------------------------------------ */ + /** Put and entry into the map. + * @param name The entry key. + * @param value The entry value. + * @return The previous value or null. + */ + public Object put(Object name, Object value) + { + return super.put(name,LazyList.add(null,value)); + } + + /* ------------------------------------------------------------ */ + /** Put multi valued entry. + * @param name The entry key. + * @param values The List of multiple values. + * @return The previous value or null. + */ + public Object putValues(Object name, List values) + { + return super.put(name,values); + } + + /* ------------------------------------------------------------ */ + /** Put multi valued entry. + * @param name The entry key. + * @param values The String array of multiple values. + * @return The previous value or null. + */ + public Object putValues(Object name, String[] values) + { + Object list=null; + for (int i=0;i0) + { + ln=LazyList.remove(lo,value); + if (ln==null) + super.remove(name); + else + super.put(name, ln); + } + return LazyList.size(ln)!=s; + } + + /* ------------------------------------------------------------ */ + /** Put all contents of map. + * @param m Map + */ + public void putAll(Map m) + { + Iterator i = m.entrySet().iterator(); + boolean multi=m instanceof MultiMap; + while(i.hasNext()) + { + Map.Entry entry = + (Map.Entry)i.next(); + if (multi) + super.put(entry.getKey(),LazyList.clone(entry.getValue())); + else + put(entry.getKey(),entry.getValue()); + } + } + + /* ------------------------------------------------------------ */ + /** + * @return Map of String arrays + */ + public Map toStringArrayMap() + { + HashMap map = new HashMap(size()*3/2); + + Iterator i = super.entrySet().iterator(); + while(i.hasNext()) + { + Map.Entry entry = (Map.Entry)i.next(); + Object l = entry.getValue(); + String[] a = LazyList.toStringArray(l); + // for (int j=a.length;j-->0;) + // if (a[j]==null) + // a[j]=""; + map.put(entry.getKey(),a); + } + return map; + } + + /* ------------------------------------------------------------ */ + public Object clone() + throws CloneNotSupportedException + { + ConcurrentMultiMap mm = (ConcurrentMultiMap) super.clone(); + + Iterator iter = mm.entrySet().iterator(); + while (iter.hasNext()) + { + Map.Entry entry = (Map.Entry)iter.next(); + entry.setValue(LazyList.clone(entry.getValue())); + } + + return mm; + } +} Property changes on: modules/util/src/main/java/org/mortbay/util/ConcurrentMultiMap.java ___________________________________________________________________ Added: svn:eol-style + native Index: modules/util/src/main/java/org/mortbay/util/URIUtil.java =================================================================== --- modules/util/src/main/java/org/mortbay/util/URIUtil.java (revision 5958) +++ modules/util/src/main/java/org/mortbay/util/URIUtil.java (working copy) @@ -56,17 +56,17 @@ if (path==null || path.length()==0) return path; - StringBuffer buf = encodePath(null,path); + StringBuilder buf = encodePath(null,path); return buf==null?path:buf.toString(); } /* ------------------------------------------------------------ */ /** Encode a URI path. * @param path The path the encode - * @param buf StringBuffer to encode path into (or null) - * @return The StringBuffer or null if no substitutions required. + * @param buf StringBuilder to encode path into (or null) + * @return The StringBuilder or null if no substitutions required. */ - public static StringBuffer encodePath(StringBuffer buf, String path) + public static StringBuilder encodePath(StringBuilder buf, String path) { if (buf==null) { @@ -85,7 +85,7 @@ case '<': case '>': case ' ': - buf=new StringBuffer(path.length()<<1); + buf=new StringBuilder(path.length()<<1); break loop; } } @@ -140,13 +140,13 @@ /* ------------------------------------------------------------ */ /** Encode a URI path. * @param path The path the encode - * @param buf StringBuffer to encode path into (or null) + * @param buf StringBuilder to encode path into (or null) * @param encode String of characters to encode. % is always encoded. - * @return The StringBuffer or null if no substitutions required. + * @return The StringBuilder or null if no substitutions required. */ - public static StringBuffer encodeString(StringBuffer buf, - String path, - String encode) + public static StringBuilder encodeString(StringBuilder buf, + String path, + String encode) { if (buf==null) { @@ -156,7 +156,7 @@ char c=path.charAt(i); if (c=='%' || encode.indexOf(c)>=0) { - buf=new StringBuffer(path.length()<<1); + buf=new StringBuilder(path.length()<<1); break loop; } } @@ -185,7 +185,7 @@ /* ------------------------------------------------------------ */ /* Decode a URI path. * @param path The path the encode - * @param buf StringBuffer to encode path into + * @param buf StringBuilder to encode path into */ public static String decodePath(String path) { @@ -263,7 +263,7 @@ /* ------------------------------------------------------------ */ /* Decode a URI path. * @param path The path the encode - * @param buf StringBuffer to encode path into + * @param buf StringBuilder to encode path into */ public static String decodePath(byte[] buf, int offset, int length) { @@ -328,7 +328,7 @@ if (split<0) split=p1.length(); - StringBuffer buf = new StringBuffer(p1.length()+p2.length()+2); + StringBuilder buf = new StringBuilder(p1.length()+p2.length()+2); buf.append(p1); if (buf.charAt(split-1)=='/') @@ -421,7 +421,7 @@ if (start>=end) return path; - StringBuffer buf = new StringBuffer(path); + StringBuilder buf = new StringBuilder(path); int delStart=-1; int delEnd=-1; int skip=0; @@ -555,7 +555,7 @@ if (state<2) return path; - StringBuffer buf = new StringBuffer(path.length()); + StringBuilder buf = new StringBuilder(path.length()); char[] chars = path.toCharArray(); buf.append(chars,0,i); Index: modules/util/pom.xml =================================================================== --- modules/util/pom.xml (revision 5958) +++ modules/util/pom.xml (working copy) @@ -25,6 +25,13 @@ + maven-compiler-plugin + + 1.5 + 1.5 + + + maven-antrun-plugin jetty-6.1.26/bin/0000755000175000017500000000000011745736456012241 5ustar moonmoonjetty-6.1.26/bin/jetty-xinetd.sh0000644000175000017500000000042211143721260015176 0ustar moonmoon#!/bin/bash # look for JETTY_HOME if [ -z "$JETTY_HOME" ] then JETTY_HOME_1=`dirname "$0"` JETTY_HOME_1=`dirname "$JETTY_HOME_1"` JETTY_HOME=${JETTY_HOME_1} fi cd $JETTY_HOME exec /usr/bin/java -Djetty.port=8088 -jar start.jar etc/jetty.xml etc/jetty-xinetd.xml jetty-6.1.26/bin/change_version.sh0000755000175000017500000007374311062361260015563 0ustar moonmoon#!/bin/sh [ $# -eq 1 ] || { echo Usage - $0 new_version >&2 ; exit 1 ; } sed s/__JETTY_VERSION__/$1/g << "_EOF_" | patch -p0 Index: pom.xml =================================================================== --- pom.xml (revision 3630) +++ pom.xml (working copy) @@ -9,7 +9,7 @@ project pom Jetty Server Project - 6.1-SNAPSHOT + __JETTY_VERSION__ http://jetty.mortbay.org Index: extras/jboss/pom.xml =================================================================== --- extras/jboss/pom.xml (revision 3630) +++ extras/jboss/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/gwt/pom.xml =================================================================== --- extras/gwt/pom.xml (revision 3630) +++ extras/gwt/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/threadpool/pom.xml =================================================================== --- extras/threadpool/pom.xml (revision 3630) +++ extras/threadpool/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/spring/pom.xml =================================================================== --- extras/spring/pom.xml (revision 3630) +++ extras/spring/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/win32service/pom.xml =================================================================== --- extras/win32service/pom.xml (revision 3630) +++ extras/win32service/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../../pom.xml 4.0.0 Index: extras/sslengine/pom.xml =================================================================== --- extras/sslengine/pom.xml (revision 3630) +++ extras/sslengine/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/servlet-tester/pom.xml =================================================================== --- extras/servlet-tester/pom.xml (revision 3630) +++ extras/servlet-tester/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/ajp/pom.xml =================================================================== --- extras/ajp/pom.xml (revision 3630) +++ extras/ajp/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/setuid/modules/java/pom.xml =================================================================== --- extras/setuid/modules/java/pom.xml (revision 3630) +++ extras/setuid/modules/java/pom.xml (working copy) @@ -3,7 +3,7 @@ jetty-setuid org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/setuid/modules/native/pom.xml =================================================================== --- extras/setuid/modules/native/pom.xml (revision 3630) +++ extras/setuid/modules/native/pom.xml (working copy) @@ -5,7 +5,7 @@ jetty-setuid org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/setuid/pom.xml =================================================================== --- extras/setuid/pom.xml (revision 3630) +++ extras/setuid/pom.xml (working copy) @@ -3,7 +3,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/xbean/pom.xml =================================================================== --- extras/xbean/pom.xml (revision 3630) +++ extras/xbean/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: extras/client/pom.xml =================================================================== --- extras/client/pom.xml (revision 3630) +++ extras/client/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ 4.0.0 org.mortbay.jetty Index: project-website/project-site/src/site/site.xml =================================================================== --- project-website/project-site/src/site/site.xml (revision 3630) +++ project-website/project-site/src/site/site.xml (working copy) @@ -5,7 +5,7 @@ org.mortbay.jetty jetty-skin - 6.1-SNAPSHOT + __JETTY_VERSION__ Jetty Index: project-website/project-site/pom.xml =================================================================== --- project-website/project-site/pom.xml (revision 3630) +++ project-website/project-site/pom.xml (working copy) @@ -3,7 +3,7 @@ project-website org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../pom.xml 4.0.0 @@ -11,7 +11,7 @@ project-site pom Jetty Site - 6.1-SNAPSHOT + __JETTY_VERSION__ Index: project-website/project-skin/pom.xml =================================================================== --- project-website/project-skin/pom.xml (revision 3630) +++ project-website/project-skin/pom.xml (working copy) @@ -7,7 +7,7 @@ org.mortbay.jetty jetty-skin - 6.1-SNAPSHOT + __JETTY_VERSION__ Maven Jetty Site Skin Maven Jetty Site Skin Index: project-website/pom.xml =================================================================== --- project-website/pom.xml (revision 3630) +++ project-website/pom.xml (working copy) @@ -3,7 +3,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../pom.xml 4.0.0 @@ -11,7 +11,7 @@ project-website pom Jetty WebSite - 6.1-SNAPSHOT + __JETTY_VERSION__ project-skin project-site Index: modules/plus/pom.xml =================================================================== --- modules/plus/pom.xml (revision 3630) +++ modules/plus/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/jsp-2.0/pom.xml =================================================================== --- modules/jsp-2.0/pom.xml (revision 3630) +++ modules/jsp-2.0/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/jsp-2.1/pom.xml =================================================================== --- modules/jsp-2.1/pom.xml (revision 3630) +++ modules/jsp-2.1/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/annotations/pom.xml =================================================================== --- modules/annotations/pom.xml (revision 3630) +++ modules/annotations/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/servlet-api-2.5/pom.xml =================================================================== --- modules/servlet-api-2.5/pom.xml (revision 3630) +++ modules/servlet-api-2.5/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/start/pom.xml =================================================================== --- modules/start/pom.xml (revision 3630) +++ modules/start/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/jetty/pom.xml =================================================================== --- modules/jetty/pom.xml (revision 3630) +++ modules/jetty/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/jspc-maven-plugin/pom.xml =================================================================== --- modules/jspc-maven-plugin/pom.xml (revision 3630) +++ modules/jspc-maven-plugin/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/jsp-api-2.0/pom.xml =================================================================== --- modules/jsp-api-2.0/pom.xml (revision 3630) +++ modules/jsp-api-2.0/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/jsp-api-2.1/pom.xml =================================================================== --- modules/jsp-api-2.1/pom.xml (revision 3630) +++ modules/jsp-api-2.1/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/maven-plugin/pom.xml =================================================================== --- modules/maven-plugin/pom.xml (revision 3630) +++ modules/maven-plugin/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/util5/pom.xml =================================================================== --- modules/util5/pom.xml (revision 3630) +++ modules/util5/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/html/pom.xml =================================================================== --- modules/html/pom.xml (revision 3630) +++ modules/html/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/naming/pom.xml =================================================================== --- modules/naming/pom.xml (revision 3630) +++ modules/naming/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/management/pom.xml =================================================================== --- modules/management/pom.xml (revision 3630) +++ modules/management/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: modules/util/pom.xml =================================================================== --- modules/util/pom.xml (revision 3630) +++ modules/util/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: examples/tests/pom.xml =================================================================== --- examples/tests/pom.xml (revision 3630) +++ examples/tests/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: examples/spring-ebj3-demo/pom.xml =================================================================== --- examples/spring-ebj3-demo/pom.xml (revision 3630) +++ examples/spring-ebj3-demo/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ 4.0.0 org.mortbay.jetty Index: examples/test-jaas-webapp/pom.xml =================================================================== --- examples/test-jaas-webapp/pom.xml (revision 3630) +++ examples/test-jaas-webapp/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: examples/embedded/pom.xml =================================================================== --- examples/embedded/pom.xml (revision 3630) +++ examples/embedded/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: examples/test-annotations/pom.xml =================================================================== --- examples/test-annotations/pom.xml (revision 3630) +++ examples/test-annotations/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: examples/test-webapp/pom.xml =================================================================== --- examples/test-webapp/pom.xml (revision 3630) +++ examples/test-webapp/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: examples/test-jndi-webapp/pom.xml =================================================================== --- examples/test-jndi-webapp/pom.xml (revision 3630) +++ examples/test-jndi-webapp/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: contrib/jetty-ant/pom.xml =================================================================== --- contrib/jetty-ant/pom.xml (revision 1197) +++ contrib/jetty-ant/pom.xml (working copy) @@ -3,7 +3,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ 4.0.0 org.mortbay.jetty Index: contrib/jetty-ant-demo/build.xml =================================================================== --- contrib/jetty-ant-demo/build.xml (revision 1197) +++ contrib/jetty-ant-demo/build.xml (working copy) @@ -1,9 +1,9 @@ - + - + Index: contrib/debian/src/main/debian/changelog =================================================================== --- contrib/debian/src/main/debian/changelog (revision 1197) +++ contrib/debian/src/main/debian/changelog (working copy) @@ -1,6 +1,6 @@ -jetty6 (6.1-SNAPSHOT-1) unstable; urgency=low +jetty6 (__JETTY_VERSION__-1) unstable; urgency=low - * Initial Release for jetty 6 + * Initial Release for jetty 6.1.12 -- Greg Wilkins Thu, 08 Nov 2007 18:23:39 +1100 Index: contrib/debian/pom.xml =================================================================== --- contrib/debian/pom.xml (revision 1197) +++ contrib/debian/pom.xml (working copy) @@ -3,14 +3,14 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 org.mortbay.jetty jetty-deb - 6.1-SNAPSHOT + __JETTY_VERSION__ Jetty Deb Packages pom Index: contrib/wadi/pom.xml =================================================================== --- contrib/wadi/pom.xml (revision 1197) +++ contrib/wadi/pom.xml (working copy) @@ -2,13 +2,13 @@ 4.0.0 org.mortbay.jetty jetty-wadi-session-manager - 6.1-SNAPSHOT + __JETTY_VERSION__ Wadi - Jetty Session Cache http://jetty.mortbay.org Index: contrib/jetty-deb/pom.xml =================================================================== --- contrib/jetty-deb/pom.xml (revision 1197) +++ contrib/jetty-deb/pom.xml (working copy) @@ -3,14 +3,14 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 org.mortbay.jetty jetty-deb - 6.1-SNAPSHOT + __JETTY_VERSION__ Jetty Deb Packages pom Index: contrib/terracotta/pom.xml =================================================================== --- contrib/terracotta/pom.xml (revision 1197) +++ contrib/terracotta/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ 4.0.0 Index: contrib/j2se6/pom.xml =================================================================== --- contrib/j2se6/pom.xml (revision 1197) +++ contrib/j2se6/pom.xml (working copy) @@ -3,7 +3,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ 4.0.0 org.mortbay.jetty Index: contrib/jetty-rewrite-handler/pom.xml =================================================================== --- contrib/jetty-rewrite-handler/pom.xml (revision 1197) +++ contrib/jetty-rewrite-handler/pom.xml (working copy) @@ -3,7 +3,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: contrib/grizzly/pom.xml =================================================================== --- contrib/grizzly/pom.xml (revision 1197) +++ contrib/grizzly/pom.xml (working copy) @@ -3,7 +3,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml 4.0.0 Index: contrib/cometd/demo/pom.xml =================================================================== --- contrib/cometd/demo/pom.xml (revision 1197) +++ contrib/cometd/demo/pom.xml (working copy) @@ -2,7 +2,7 @@ org.mortbay.jetty cometd-project - 6.1-SNAPSHOT + __JETTY_VERSION__ ../pom.xml 4.0.0 Index: contrib/cometd/install/pom.xml =================================================================== --- contrib/cometd/install/pom.xml (revision 1197) +++ contrib/cometd/install/pom.xml (working copy) @@ -2,13 +2,13 @@ org.mortbay.jetty cometd-project - 6.1-SNAPSHOT + __JETTY_VERSION__ ../pom.xml 4.0.0 org.mortbay.jetty cometd-install - 6.1-SNAPSHOT + __JETTY_VERSION__ pom Cometd :: Jetty :: Install http://www.cometd.com Index: contrib/cometd/pom.xml =================================================================== --- contrib/cometd/pom.xml (revision 1197) +++ contrib/cometd/pom.xml (working copy) @@ -3,12 +3,12 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ ../../pom.xml org.mortbay.jetty cometd-project - 6.1-SNAPSHOT + __JETTY_VERSION__ pom Cometd :: Jetty http://www.cometd.com Index: contrib/cometd/bayeux/pom.xml =================================================================== --- contrib/cometd/bayeux/pom.xml (revision 1197) +++ contrib/cometd/bayeux/pom.xml (working copy) @@ -2,7 +2,7 @@ org.mortbay.jetty cometd-project - 6.1-SNAPSHOT + __JETTY_VERSION__ ../pom.xml 4.0.0 Index: contrib/cometd/client/bin/run.sh =================================================================== --- contrib/cometd/client/bin/run.sh (revision 1197) +++ contrib/cometd/client/bin/run.sh (working copy) @@ -1,2 +1,2 @@ #!/bin/sh -java -Xmx2048M -cp target/classes:target/test-classes/:../bayeux/target/classes/:../../../lib/cometd/cometd-api-1.0-SNAPSHOT.jar:../../../lib/ext/jetty-client-6.1-SNAPSHOT.jar:../../../lib/ext/jetty-sslengine-6.1-SNAPSHOT.jar:../../../lib/jre1.5/jetty-util5-6.1-SNAPSHOT.jar:../../../lib/jetty-util-6.1-SNAPSHOT.jar:../../../lib/jetty-6.1-SNAPSHOT.jar:../../../lib/servlet-api-2.5-6.1-SNAPSHOT.jar org.mortbay.cometd.client.BayeuxLoadGenerator +java -Xmx2048M -cp target/classes:target/test-classes/:../bayeux/target/classes/:../../../lib/cometd/cometd-api-1.0-SNAPSHOT.jar:../../../lib/ext/jetty-client-__JETTY_VERSION__.jar:../../../lib/ext/jetty-sslengine-__JETTY_VERSION__.jar:../../../lib/jre1.5/jetty-util5-__JETTY_VERSION__.jar:../../../lib/jetty-util-__JETTY_VERSION__.jar:../../../lib/jetty-__JETTY_VERSION__.jar:../../../lib/servlet-api-2.5-__JETTY_VERSION__.jar org.mortbay.cometd.client.BayeuxLoadGenerator Index: contrib/cometd/client/pom.xml =================================================================== --- contrib/cometd/client/pom.xml (revision 1197) +++ contrib/cometd/client/pom.xml (working copy) @@ -2,7 +2,7 @@ org.mortbay.jetty cometd-project - 6.1-SNAPSHOT + __JETTY_VERSION__ ../pom.xml 4.0.0 Index: contrib/jetty-openspaces/pom.xml =================================================================== --- contrib/jetty-openspaces/pom.xml (revision 1197) +++ contrib/jetty-openspaces/pom.xml (working copy) @@ -2,7 +2,7 @@ project org.mortbay.jetty - 6.1-SNAPSHOT + __JETTY_VERSION__ 4.0.0 _EOF_ jetty-6.1.26/bin/build_release_bundles.sh0000755000175000017500000000075010550706263017077 0ustar moonmoon#!/bin/sh [ $# -eq 1 ] || { echo "Usage - $0 jetty-dir" >&2 ; exit 1 ; } cd $1 D=$(pwd) N=$(basename $D) D=$(dirname $D) cd $D find $N -type f |\ egrep -v /\\.svn |\ egrep -v /target |\ egrep -v /\\. |\ egrep -v $N/start.jar |\ egrep -v $N/lib |\ egrep -v $N/logs |\ egrep -v $N/webapp |\ egrep -v $N/javadoc |\ xargs zip $D/$N-src.zip $N/logs find $N -type f |\ egrep -v /\\.svn |\ egrep -v /target |\ egrep -v /\\. |\ egrep -v $N/logs |\ xargs zip $D/$N.zip $N/logs jetty-6.1.26/bin/README.jetty-cygwin.txt.txt0000644000175000017500000000065711207431757017206 0ustar moonmoonBefore running jetty-cygwin.sh on cygwin, define the JAVA_HOME and JETTY_HOME first. $ export JAVA_HOME=/path/to/jvm $ export JETTY_HOME=/path/to/jetty Examples: $ export JAVA_HOME=/usr/bin/jvm So assuming you installed cygwin on C:\cygwin, the jvm needs to be in C:\cygwin\usr\bin\jvm $ export JETTY_HOME=/usr/share/jetty6 So assuming you installed cygwin on C:\cygwin, jetty needs to be in C:\cygwin\usr\share\jetty6jetty-6.1.26/bin/jetty-cygwin.sh0000755000175000017500000004357711207431757015242 0ustar moonmoon#!/bin/bash # # Startup script for jetty under *nix systems (it works under NT/cygwin too). # To get the service to restart correctly on reboot, uncomment below (3 lines): # ======================== # chkconfig: 3 99 99 # description: Jetty 6 webserver # processname: jetty # ======================== # Configuration files # # /etc/default/jetty # If it exists, this is read at the start of script. It may perform any # sequence of shell commands, like setting relevant environment variables. # # $HOME/.jettyrc # If it exists, this is read at the start of script. It may perform any # sequence of shell commands, like setting relevant environment variables. # # /etc/jetty.conf # If found, and no configurations were given on the command line, # the file will be used as this script's configuration. # Each line in the file may contain: # - A comment denoted by the pound (#) sign as first non-blank character. # - The path to a regular file, which will be passed to jetty as a # config.xml file. # - The path to a directory. Each *.xml file in the directory will be # passed to jetty as a config.xml file. # # The files will be checked for existence before being passed to jetty. # # $JETTY_HOME/etc/jetty.xml # If found, used as this script's configuration file, but only if # /etc/jetty.conf was not present. See above. # # Configuration variables # # JAVA_HOME # Home of Java installation. # # JAVA # Command to invoke Java. If not set, $JAVA_HOME/bin/java will be # used. # # JAVA_OPTIONS # Extra options to pass to the JVM # # JETTY_HOME # Where Jetty is installed. If not set, the script will try go # guess it by first looking at the invocation path for the script, # and then by looking in standard locations as $HOME/opt/jetty # and /opt/jetty. The java system property "jetty.home" will be # set to this value for use by configure.xml files, f.e.: # # /webapps/jetty.war # # JETTY_PORT # Override the default port for Jetty servers. If not set then the # default value in the xml configuration file will be used. The java # system property "jetty.port" will be set to this value for use in # configure.xml files. For example, the following idiom is widely # used in the demo config files to respect this property in Listener # configuration elements: # # # # Note: that the config file could ignore this property simply by saying: # # 8080 # # JETTY_RUN # Where the jetty.pid file should be stored. It defaults to the # first available of /var/run, /usr/var/run, and /tmp if not set. # # JETTY_PID # The Jetty PID file, defaults to $JETTY_RUN/jetty.pid # # JETTY_ARGS # The default arguments to pass to jetty. # # JETTY_USER # if set, then used as a username to run the server as # usage() { echo "Usage: $0 {start|stop|run|restart|check|supervise} [ CONFIGS ... ] " exit 1 } [ $# -gt 0 ] || usage ################################################## # Some utility functions ################################################## findDirectory() { OP=$1 shift for L in $* ; do [ $OP $L ] || continue echo $L break done } running() { [ -f $1 ] || return 1 PID=$(cat $1) ps -p $PID >/dev/null 2>/dev/null || return 1 return 0 } ################################################## # Get the action & configs ################################################## ACTION=$1 shift ARGS="$*" CONFIGS="" NO_START=0 ################################################## # See if there's a default configuration file ################################################## if [ -f /etc/default/jetty6 ] ; then . /etc/default/jetty6 elif [ -f /etc/default/jetty ] ; then . /etc/default/jetty fi ################################################## # See if there's a user-specific configuration file ################################################## if [ -f $HOME/.jettyrc ] ; then . $HOME/.jettyrc fi ################################################## # Set tmp if not already set. ################################################## if [ -z "$TMP" ] then TMP=/tmp fi ################################################## # Jetty's hallmark ################################################## JETTY_INSTALL_TRACE_FILE="etc/jetty.xml" TMPJ=$TMP/j$$ ################################################## # Try to determine JETTY_HOME if not set ################################################## if [ -z "$JETTY_HOME" ] then JETTY_HOME_1=`dirname "$0"` JETTY_HOME_1=`dirname "$JETTY_HOME_1"` if [ -f "${JETTY_HOME_1}/${JETTY_INSTALL_TRACE_FILE}" ] ; then JETTY_HOME=${JETTY_HOME_1} fi fi ################################################## # if no JETTY_HOME, search likely locations. ################################################## if [ "$JETTY_HOME" = "" ] ; then STANDARD_LOCATIONS=" \ /usr/share \ /usr/share/java \ $HOME \ $HOME/src \ ${HOME}/opt/ \ /opt \ /java \ /usr/local \ /usr/local/share \ /usr/local/share/java \ /home \ " JETTY_DIR_NAMES=" \ jetty-6 \ jetty6 \ jetty-6.* \ jetty \ Jetty-6 \ Jetty6 \ Jetty-6.* \ Jetty \ " JETTY_HOME= for L in $STANDARD_LOCATIONS do for N in $JETTY_DIR_NAMES do if [ -d $L/$N ] && [ -f "$L/${N}/${JETTY_INSTALL_TRACE_FILE}" ] ; then JETTY_HOME="$L/$N" fi done [ ! -z "$JETTY_HOME" ] && break done fi ################################################## # No JETTY_HOME yet? We're out of luck! ################################################## if [ -z "$JETTY_HOME" ] ; then echo "** ERROR: JETTY_HOME not set, you need to set it or install in a standard location" exit 1 fi cd $JETTY_HOME JETTY_HOME=`pwd` ##################################################### # Check that jetty is where we think it is ##################################################### if [ ! -r $JETTY_HOME/$JETTY_INSTALL_TRACE_FILE ] then echo "** ERROR: Oops! Jetty doesn't appear to be installed in $JETTY_HOME" echo "** ERROR: $JETTY_HOME/$JETTY_INSTALL_TRACE_FILE is not readable!" exit 1 fi ########################################################### # Get the list of config.xml files from the command line. ########################################################### if [ ! -z "$ARGS" ] then for A in $ARGS do if [ -f $A ] then CONF="$A" elif [ -f $JETTY_HOME/etc/$A ] then CONF="$JETTY_HOME/etc/$A" elif [ -f ${A}.xml ] then CONF="${A}.xml" elif [ -f $JETTY_HOME/etc/${A}.xml ] then CONF="$JETTY_HOME/etc/${A}.xml" else echo "** ERROR: Cannot find configuration '$A' specified in the command line." exit 1 fi if [ ! -r $CONF ] then echo "** ERROR: Cannot read configuration '$A' specified in the command line." exit 1 fi CONFIGS="$CONFIGS $CONF" done fi ################################################## # Try to find this script's configuration file, # but only if no configurations were given on the # command line. ################################################## if [ -z "$JETTY_CONF" ] then if [ -f /etc/jetty.conf ] then JETTY_CONF=/etc/jetty.conf elif [ -f "${JETTY_HOME}/etc/jetty.conf" ] then JETTY_CONF="${JETTY_HOME}/etc/jetty.conf" fi fi ################################################## # Read the configuration file if one exists ################################################## CONFIG_LINES= if [ -z "$CONFIGS" ] && [ -f "$JETTY_CONF" ] && [ -r "$JETTY_CONF" ] then CONFIG_LINES=`cat $JETTY_CONF | grep -v "^[:space:]*#" | tr "\n" " "` fi ################################################## # Get the list of config.xml files from jetty.conf ################################################## if [ ! -z "${CONFIG_LINES}" ] then for CONF in ${CONFIG_LINES} do if [ ! -r "$CONF" ] then echo "** WARNING: Cannot read '$CONF' specified in '$JETTY_CONF'" elif [ -f "$CONF" ] then # assume it's a configure.xml file CONFIGS="$CONFIGS $CONF" elif [ -d "$CONF" ] then # assume it's a directory with configure.xml files # for example: /etc/jetty.d/ # sort the files before adding them to the list of CONFIGS XML_FILES=`ls ${CONF}/*.xml | sort | tr "\n" " "` for FILE in ${XML_FILES} do if [ -r "$FILE" ] && [ -f "$FILE" ] then CONFIGS="$CONFIGS $FILE" else echo "** WARNING: Cannot read '$FILE' specified in '$JETTY_CONF'" fi done else echo "** WARNING: Don''t know what to do with '$CONF' specified in '$JETTY_CONF'" fi done fi ##################################################### # Run the standard server if there's nothing else to run ##################################################### if [ -z "$CONFIGS" ] then CONFIGS="${JETTY_HOME}/etc/jetty-logging.xml ${JETTY_HOME}/etc/jetty.xml" fi ##################################################### # Find a location for the pid file ##################################################### if [ -z "$JETTY_RUN" ] then JETTY_RUN=`findDirectory -w /var/run /usr/var/run /tmp` fi ##################################################### # Find a PID for the pid file ##################################################### if [ -z "$JETTY_PID" ] then JETTY_PID="$JETTY_RUN/jetty.pid" fi ################################################## # Check for JAVA_HOME ################################################## if [ -z "$JAVA_HOME" ] then # If a java runtime is not defined, search the following # directories for a JVM and sort by version. Use the highest # version number. # Java search path JAVA_LOCATIONS="\ /usr/java \ /usr/bin \ /usr/local/bin \ /usr/local/java \ /usr/local/jdk \ /usr/local/jre \ /usr/lib/jvm \ /opt/java \ /opt/jdk \ /opt/jre \ " JAVA_NAMES="java jdk jre" for N in $JAVA_NAMES ; do for L in $JAVA_LOCATIONS ; do [ -d $L ] || continue find $L -name "$N" ! -type d | grep -v threads | while read J ; do [ -x $J ] || continue VERSION=`eval $J -version 2>&1` [ $? = 0 ] || continue VERSION=`expr "$VERSION" : '.*"\(1.[0-9\.]*\)["_]'` [ "$VERSION" = "" ] && continue expr $VERSION \< 1.2 >/dev/null && continue echo $VERSION:$J done done done | sort | tail -1 > $TMPJ JAVA=`cat $TMPJ | cut -d: -f2` JVERSION=`cat $TMPJ | cut -d: -f1` JAVA_HOME=`dirname $JAVA` while [ ! -z "$JAVA_HOME" -a "$JAVA_HOME" != "/" -a ! -f "$JAVA_HOME/lib/tools.jar" ] ; do JAVA_HOME=`dirname $JAVA_HOME` done [ "$JAVA_HOME" = "" ] && JAVA_HOME= echo "Found JAVA=$JAVA in JAVA_HOME=$JAVA_HOME" fi ################################################## # Determine which JVM of version >1.2 # Try to use JAVA_HOME ################################################## if [ "$JAVA" = "" -a "$JAVA_HOME" != "" ] then if [ ! -z "$JAVACMD" ] then JAVA="$JAVACMD" else [ -x $JAVA_HOME/bin/jre -a ! -d $JAVA_HOME/bin/jre ] && JAVA=$JAVA_HOME/bin/jre [ -x $JAVA_HOME/bin/java -a ! -d $JAVA_HOME/bin/java ] && JAVA=$JAVA_HOME/bin/java fi fi if [ "$JAVA" = "" ] then echo "Cannot find a JRE or JDK. Please set JAVA_HOME to a >=1.2 JRE" 2>&2 exit 1 fi JAVA_VERSION=`expr "$($JAVA -version 2>&1 | head -1)" : '.*1\.\([0-9]\)'` ##################################################### # See if JETTY_PORT is defined ##################################################### if [ "$JETTY_PORT" != "" ] then JAVA_OPTIONS="$JAVA_OPTIONS -Djetty.port=$JETTY_PORT" fi ##################################################### # See if JETTY_LOGS is defined ##################################################### if [ "$JETTY_LOGS" != "" ] then JAVA_OPTIONS="$JAVA_OPTIONS -Djetty.logs=$JETTY_LOGS" fi ##################################################### # Are we running on Windows? Could be, with Cygwin/NT. ##################################################### case "`uname`" in CYGWIN*) PATH_SEPARATOR=";";; *) PATH_SEPARATOR=":";; esac ##################################################### # Add jetty properties to Java VM options. ##################################################### JAVA_OPTIONS="$JAVA_OPTIONS -Djetty.home=$JETTY_HOME -Djava.io.tmpdir=$TMP" [ -f $JETTY_HOME/etc/start.config ] && JAVA_OPTIONS="-DSTART=$JETTY_HOME/etc/start.config $JAVA_OPTIONS" ##################################################### # This is how the Jetty server will be started ##################################################### JETTY_START=$JETTY_HOME/start.jar [ ! -f $JETTY_START ] && JETTY_START=$JETTY_HOME/lib/start.jar case "`uname`" in CYGWIN*) JETTY_START="`cygpath -w $JETTY_START`" echo $JETTY_START CONFIGS="`cygpath -w $CONFIGS`" echo $CONFIGS ;; esac RUN_ARGS="$JAVA_OPTIONS -jar $JETTY_START $JETTY_ARGS $CONFIGS" RUN_CMD="$JAVA $RUN_ARGS" ##################################################### # Comment these out after you're happy with what # the script is doing. ##################################################### #echo "JETTY_HOME = $JETTY_HOME" #echo "JETTY_CONF = $JETTY_CONF" #echo "JETTY_RUN = $JETTY_RUN" #echo "JETTY_PID = $JETTY_PID" #echo "JETTY_ARGS = $JETTY_ARGS" #echo "CONFIGS = $CONFIGS" #echo "JAVA_OPTIONS = $JAVA_OPTIONS" #echo "JAVA = $JAVA" ################################################## # Do the action ################################################## case "$ACTION" in start) echo -n "Starting Jetty: " if [ "$NO_START" = "1" ]; then echo "Not starting jetty - NO_START=1 in /etc/default/jetty6"; exit 0; fi if [ "$START_STOP_DAEMON" = "1" ] && type start-stop-daemon > /dev/null 2>&1 then [ x$JETTY_USER = x ] && JETTY_USER=$(whoami) [ $UID = 0 ] && CH_USER="-c $JETTY_USER" if start-stop-daemon -S -p$JETTY_PID $CH_USER -d $JETTY_HOME -b -m -a $JAVA -- $RUN_ARGS then sleep 1 if running $JETTY_PID then echo OK else echo FAILED fi fi else if [ -f $JETTY_PID ] then if running $JETTY_PID then echo "Already Running!!" exit 1 else # dead pid file - remove rm -f $JETTY_PID fi fi if [ x$JETTY_USER != x ] then touch $JETTY_PID chown $JETTY_USER $JETTY_PID su - $JETTY_USER -c " $RUN_CMD & PID=\$! disown \$PID echo \$PID > $JETTY_PID" else $RUN_CMD & PID=$! disown $PID echo $PID > $JETTY_PID fi echo "STARTED Jetty `date`" fi ;; stop) echo -n "Stopping Jetty: " if [ "$START_STOP_DAEMON" = "1" ] && type start-stop-daemon > /dev/null 2>&1; then start-stop-daemon -K -p $JETTY_PID -d $JETTY_HOME -a $JAVA -s HUP sleep 1 if running $JETTY_PID then sleep 3 if running $JETTY_PID then sleep 30 if running $JETTY_PID then start-stop-daemon -K -p $JETTY_PID -d $JETTY_HOME -a $JAVA -s KILL fi fi fi rm -f $JETTY_PID echo OK else PID=`cat $JETTY_PID 2>/dev/null` TIMEOUT=30 while running $JETTY_PID && [ $TIMEOUT -gt 0 ] do kill $PID 2>/dev/null sleep 1 let TIMEOUT=$TIMEOUT-1 done [ $TIMEOUT -gt 0 ] || kill -9 $PID 2>/dev/null rm -f $JETTY_PID echo OK fi ;; restart) JETTY_SH=$0 if [ ! -f $JETTY_SH ]; then if [ ! -f $JETTY_HOME/bin/jetty.sh ]; then echo "$JETTY_HOME/bin/jetty.sh does not exist." exit 1 fi JETTY_SH=$JETTY_HOME/bin/jetty.sh fi $JETTY_SH stop $* sleep 5 $JETTY_SH start $* ;; supervise) # # Under control of daemontools supervise monitor which # handles restarts and shutdowns via the svc program. # exec $RUN_CMD ;; run|demo) echo "Running Jetty: " if [ -f $JETTY_PID ] then if running $JETTY_PID then echo "Already Running!!" exit 1 else # dead pid file - remove rm -f $JETTY_PID fi fi exec $RUN_CMD ;; check) echo "Checking arguments to Jetty: " echo "JETTY_HOME = $JETTY_HOME" echo "JETTY_CONF = $JETTY_CONF" echo "JETTY_RUN = $JETTY_RUN" echo "JETTY_PID = $JETTY_PID" echo "JETTY_PORT = $JETTY_PORT" echo "JETTY_LOGS = $JETTY_LOGS" echo "CONFIGS = $CONFIGS" echo "JAVA_OPTIONS = $JAVA_OPTIONS" echo "JAVA = $JAVA" echo "CLASSPATH = $CLASSPATH" echo "RUN_CMD = $RUN_CMD" echo if [ -f $JETTY_RUN/jetty.pid ] then echo "Jetty running pid="`cat $JETTY_RUN/jetty.pid` exit 0 fi exit 1 ;; *) usage ;; esac exit 0 jetty-6.1.26/bin/jetty.sh0000755000175000017500000004352711177762536013747 0ustar moonmoon#!/bin/bash # # Startup script for jetty under *nix systems (it works under NT/cygwin too). # To get the service to restart correctly on reboot, uncomment below (3 lines): # ======================== # chkconfig: 3 99 99 # description: Jetty 6 webserver # processname: jetty # ======================== # Configuration files # # /etc/default/jetty # If it exists, this is read at the start of script. It may perform any # sequence of shell commands, like setting relevant environment variables. # # $HOME/.jettyrc # If it exists, this is read at the start of script. It may perform any # sequence of shell commands, like setting relevant environment variables. # # /etc/jetty.conf # If found, and no configurations were given on the command line, # the file will be used as this script's configuration. # Each line in the file may contain: # - A comment denoted by the pound (#) sign as first non-blank character. # - The path to a regular file, which will be passed to jetty as a # config.xml file. # - The path to a directory. Each *.xml file in the directory will be # passed to jetty as a config.xml file. # # The files will be checked for existence before being passed to jetty. # # $JETTY_HOME/etc/jetty.xml # If found, used as this script's configuration file, but only if # /etc/jetty.conf was not present. See above. # # Configuration variables # # JAVA_HOME # Home of Java installation. # # JAVA # Command to invoke Java. If not set, $JAVA_HOME/bin/java will be # used. # # JAVA_OPTIONS # Extra options to pass to the JVM # # JETTY_HOME # Where Jetty is installed. If not set, the script will try go # guess it by first looking at the invocation path for the script, # and then by looking in standard locations as $HOME/opt/jetty # and /opt/jetty. The java system property "jetty.home" will be # set to this value for use by configure.xml files, f.e.: # # /webapps/jetty.war # # JETTY_PORT # Override the default port for Jetty servers. If not set then the # default value in the xml configuration file will be used. The java # system property "jetty.port" will be set to this value for use in # configure.xml files. For example, the following idiom is widely # used in the demo config files to respect this property in Listener # configuration elements: # # # # Note: that the config file could ignore this property simply by saying: # # 8080 # # JETTY_RUN # Where the jetty.pid file should be stored. It defaults to the # first available of /var/run, /usr/var/run, and /tmp if not set. # # JETTY_PID # The Jetty PID file, defaults to $JETTY_RUN/jetty.pid # # JETTY_ARGS # The default arguments to pass to jetty. # # JETTY_USER # if set, then used as a username to run the server as # # Set to 0 if you do not want to use start-stop-daemon (especially on SUSE boxes) START_STOP_DAEMON=1 usage() { echo "Usage: $0 {start|stop|run|restart|check|supervise} [ CONFIGS ... ] " exit 1 } [ $# -gt 0 ] || usage ################################################## # Some utility functions ################################################## findDirectory() { OP=$1 shift for L in $* ; do [ $OP $L ] || continue echo $L break done } running() { [ -f $1 ] || return 1 PID=$(cat $1) ps -p $PID >/dev/null 2>/dev/null || return 1 return 0 } ################################################## # Get the action & configs ################################################## ACTION=$1 shift ARGS="$*" CONFIGS="" NO_START=0 ################################################## # See if there's a default configuration file ################################################## if [ -f /etc/default/jetty6 ] ; then . /etc/default/jetty6 elif [ -f /etc/default/jetty ] ; then . /etc/default/jetty fi ################################################## # See if there's a user-specific configuration file ################################################## if [ -f $HOME/.jettyrc ] ; then . $HOME/.jettyrc fi ################################################## # Set tmp if not already set. ################################################## if [ -z "$TMP" ] then TMP=/tmp fi ################################################## # Jetty's hallmark ################################################## JETTY_INSTALL_TRACE_FILE="etc/jetty.xml" TMPJ=$TMP/j$$ ################################################## # Try to determine JETTY_HOME if not set ################################################## if [ -z "$JETTY_HOME" ] then JETTY_HOME_1=`dirname "$0"` JETTY_HOME_1=`dirname "$JETTY_HOME_1"` if [ -f "${JETTY_HOME_1}/${JETTY_INSTALL_TRACE_FILE}" ] ; then JETTY_HOME=${JETTY_HOME_1} fi fi ################################################## # if no JETTY_HOME, search likely locations. ################################################## if [ "$JETTY_HOME" = "" ] ; then STANDARD_LOCATIONS=" \ /usr/share \ /usr/share/java \ $HOME \ $HOME/src \ ${HOME}/opt/ \ /opt \ /java \ /usr/local \ /usr/local/share \ /usr/local/share/java \ /home \ " JETTY_DIR_NAMES=" \ jetty-6 \ jetty6 \ jetty-6.* \ jetty \ Jetty-6 \ Jetty6 \ Jetty-6.* \ Jetty \ " JETTY_HOME= for L in $STANDARD_LOCATIONS do for N in $JETTY_DIR_NAMES do if [ -d $L/$N ] && [ -f "$L/${N}/${JETTY_INSTALL_TRACE_FILE}" ] ; then JETTY_HOME="$L/$N" fi done [ ! -z "$JETTY_HOME" ] && break done fi ################################################## # No JETTY_HOME yet? We're out of luck! ################################################## if [ -z "$JETTY_HOME" ] ; then echo "** ERROR: JETTY_HOME not set, you need to set it or install in a standard location" exit 1 fi cd $JETTY_HOME JETTY_HOME=`pwd` ##################################################### # Check that jetty is where we think it is ##################################################### if [ ! -r $JETTY_HOME/$JETTY_INSTALL_TRACE_FILE ] then echo "** ERROR: Oops! Jetty doesn't appear to be installed in $JETTY_HOME" echo "** ERROR: $JETTY_HOME/$JETTY_INSTALL_TRACE_FILE is not readable!" exit 1 fi ########################################################### # Get the list of config.xml files from the command line. ########################################################### if [ ! -z "$ARGS" ] then for A in $ARGS do if [ -f $A ] then CONF="$A" elif [ -f $JETTY_HOME/etc/$A ] then CONF="$JETTY_HOME/etc/$A" elif [ -f ${A}.xml ] then CONF="${A}.xml" elif [ -f $JETTY_HOME/etc/${A}.xml ] then CONF="$JETTY_HOME/etc/${A}.xml" else echo "** ERROR: Cannot find configuration '$A' specified in the command line." exit 1 fi if [ ! -r $CONF ] then echo "** ERROR: Cannot read configuration '$A' specified in the command line." exit 1 fi CONFIGS="$CONFIGS $CONF" done fi ################################################## # Try to find this script's configuration file, # but only if no configurations were given on the # command line. ################################################## if [ -z "$JETTY_CONF" ] then if [ -f /etc/jetty.conf ] then JETTY_CONF=/etc/jetty.conf elif [ -f "${JETTY_HOME}/etc/jetty.conf" ] then JETTY_CONF="${JETTY_HOME}/etc/jetty.conf" fi fi ################################################## # Read the configuration file if one exists ################################################## CONFIG_LINES= if [ -z "$CONFIGS" ] && [ -f "$JETTY_CONF" ] && [ -r "$JETTY_CONF" ] then CONFIG_LINES=`cat $JETTY_CONF | grep -v "^[:space:]*#" | tr "\n" " "` fi ################################################## # Get the list of config.xml files from jetty.conf ################################################## if [ ! -z "${CONFIG_LINES}" ] then for CONF in ${CONFIG_LINES} do if [ ! -r "$CONF" ] then echo "** WARNING: Cannot read '$CONF' specified in '$JETTY_CONF'" elif [ -f "$CONF" ] then # assume it's a configure.xml file CONFIGS="$CONFIGS $CONF" elif [ -d "$CONF" ] then # assume it's a directory with configure.xml files # for example: /etc/jetty.d/ # sort the files before adding them to the list of CONFIGS XML_FILES=`ls ${CONF}/*.xml | sort | tr "\n" " "` for FILE in ${XML_FILES} do if [ -r "$FILE" ] && [ -f "$FILE" ] then CONFIGS="$CONFIGS $FILE" else echo "** WARNING: Cannot read '$FILE' specified in '$JETTY_CONF'" fi done else echo "** WARNING: Don''t know what to do with '$CONF' specified in '$JETTY_CONF'" fi done fi ##################################################### # Run the standard server if there's nothing else to run ##################################################### if [ -z "$CONFIGS" ] then CONFIGS="${JETTY_HOME}/etc/jetty-logging.xml ${JETTY_HOME}/etc/jetty.xml" fi ##################################################### # Find a location for the pid file ##################################################### if [ -z "$JETTY_RUN" ] then JETTY_RUN=`findDirectory -w /var/run /usr/var/run /tmp` fi ##################################################### # Find a PID for the pid file ##################################################### if [ -z "$JETTY_PID" ] then JETTY_PID="$JETTY_RUN/jetty.pid" fi ################################################## # Check for JAVA_HOME ################################################## if [ -z "$JAVA_HOME" ] then # If a java runtime is not defined, search the following # directories for a JVM and sort by version. Use the highest # version number. # Java search path JAVA_LOCATIONS="\ /usr/java \ /usr/bin \ /usr/local/bin \ /usr/local/java \ /usr/local/jdk \ /usr/local/jre \ /usr/lib/jvm \ /opt/java \ /opt/jdk \ /opt/jre \ " JAVA_NAMES="java jdk jre" for N in $JAVA_NAMES ; do for L in $JAVA_LOCATIONS ; do [ -d $L ] || continue find $L -name "$N" ! -type d | grep -v threads | while read J ; do [ -x $J ] || continue VERSION=`eval $J -version 2>&1` [ $? = 0 ] || continue VERSION=`expr "$VERSION" : '.*"\(1.[0-9\.]*\)["_]'` [ "$VERSION" = "" ] && continue expr $VERSION \< 1.2 >/dev/null && continue echo $VERSION:$J done done done | sort | tail -1 > $TMPJ JAVA=`cat $TMPJ | cut -d: -f2` JVERSION=`cat $TMPJ | cut -d: -f1` JAVA_HOME=`dirname $JAVA` while [ ! -z "$JAVA_HOME" -a "$JAVA_HOME" != "/" -a ! -f "$JAVA_HOME/lib/tools.jar" ] ; do JAVA_HOME=`dirname $JAVA_HOME` done [ "$JAVA_HOME" = "" ] && JAVA_HOME= echo "Found JAVA=$JAVA in JAVA_HOME=$JAVA_HOME" fi ################################################## # Determine which JVM of version >1.2 # Try to use JAVA_HOME ################################################## if [ "$JAVA" = "" -a "$JAVA_HOME" != "" ] then if [ ! -z "$JAVACMD" ] then JAVA="$JAVACMD" else [ -x $JAVA_HOME/bin/jre -a ! -d $JAVA_HOME/bin/jre ] && JAVA=$JAVA_HOME/bin/jre [ -x $JAVA_HOME/bin/java -a ! -d $JAVA_HOME/bin/java ] && JAVA=$JAVA_HOME/bin/java fi fi if [ "$JAVA" = "" ] then echo "Cannot find a JRE or JDK. Please set JAVA_HOME to a >=1.2 JRE" 2>&2 exit 1 fi JAVA_VERSION=`expr "$($JAVA -version 2>&1 | head -1)" : '.*1\.\([0-9]\)'` ##################################################### # See if JETTY_PORT is defined ##################################################### if [ "$JETTY_PORT" != "" ] then JAVA_OPTIONS="$JAVA_OPTIONS -Djetty.port=$JETTY_PORT" fi ##################################################### # See if JETTY_LOGS is defined ##################################################### if [ "$JETTY_LOGS" != "" ] then JAVA_OPTIONS="$JAVA_OPTIONS -Djetty.logs=$JETTY_LOGS" fi ##################################################### # Are we running on Windows? Could be, with Cygwin/NT. ##################################################### case "`uname`" in CYGWIN*) PATH_SEPARATOR=";";; *) PATH_SEPARATOR=":";; esac ##################################################### # Add jetty properties to Java VM options. ##################################################### JAVA_OPTIONS="$JAVA_OPTIONS -Djetty.home=$JETTY_HOME -Djava.io.tmpdir=$TMP" [ -f $JETTY_HOME/etc/start.config ] && JAVA_OPTIONS="-DSTART=$JETTY_HOME/etc/start.config $JAVA_OPTIONS" ##################################################### # This is how the Jetty server will be started ##################################################### JETTY_START=$JETTY_HOME/start.jar [ ! -f $JETTY_START ] && JETTY_START=$JETTY_HOME/lib/start.jar RUN_ARGS="$JAVA_OPTIONS -jar $JETTY_START $JETTY_ARGS $CONFIGS" RUN_CMD="$JAVA $RUN_ARGS" ##################################################### # Comment these out after you're happy with what # the script is doing. ##################################################### #echo "JETTY_HOME = $JETTY_HOME" #echo "JETTY_CONF = $JETTY_CONF" #echo "JETTY_RUN = $JETTY_RUN" #echo "JETTY_PID = $JETTY_PID" #echo "JETTY_ARGS = $JETTY_ARGS" #echo "CONFIGS = $CONFIGS" #echo "JAVA_OPTIONS = $JAVA_OPTIONS" #echo "JAVA = $JAVA" ################################################## # Do the action ################################################## case "$ACTION" in start) echo -n "Starting Jetty: " if [ "$NO_START" = "1" ]; then echo "Not starting jetty - NO_START=1 in /etc/default/jetty6"; exit 0; fi if [ "$START_STOP_DAEMON" = "1" ] && type start-stop-daemon > /dev/null 2>&1 then [ x$JETTY_USER = x ] && JETTY_USER=$(whoami) [ $UID = 0 ] && CH_USER="-c $JETTY_USER" if start-stop-daemon -S -p$JETTY_PID $CH_USER -d $JETTY_HOME -b -m -a $JAVA -- $RUN_ARGS then sleep 1 if running $JETTY_PID then echo OK else echo FAILED fi fi else if [ -f $JETTY_PID ] then if running $JETTY_PID then echo "Already Running!!" exit 1 else # dead pid file - remove rm -f $JETTY_PID fi fi if [ x$JETTY_USER != x ] then touch $JETTY_PID chown $JETTY_USER $JETTY_PID su - $JETTY_USER -c " $RUN_CMD & PID=\$! disown \$PID echo \$PID > $JETTY_PID" else $RUN_CMD & PID=$! disown $PID echo $PID > $JETTY_PID fi echo "STARTED Jetty `date`" fi ;; stop) echo -n "Stopping Jetty: " if [ "$START_STOP_DAEMON" = "1" ] && type start-stop-daemon > /dev/null 2>&1; then start-stop-daemon -K -p $JETTY_PID -d $JETTY_HOME -a $JAVA -s HUP sleep 1 if running $JETTY_PID then sleep 3 if running $JETTY_PID then sleep 30 if running $JETTY_PID then start-stop-daemon -K -p $JETTY_PID -d $JETTY_HOME -a $JAVA -s KILL fi fi fi rm -f $JETTY_PID echo OK else PID=`cat $JETTY_PID 2>/dev/null` TIMEOUT=30 while running $JETTY_PID && [ $TIMEOUT -gt 0 ] do kill $PID 2>/dev/null sleep 1 let TIMEOUT=$TIMEOUT-1 done [ $TIMEOUT -gt 0 ] || kill -9 $PID 2>/dev/null rm -f $JETTY_PID echo OK fi ;; restart) JETTY_SH=$0 if [ ! -f $JETTY_SH ]; then if [ ! -f $JETTY_HOME/bin/jetty.sh ]; then echo "$JETTY_HOME/bin/jetty.sh does not exist." exit 1 fi JETTY_SH=$JETTY_HOME/bin/jetty.sh fi $JETTY_SH stop $* sleep 5 $JETTY_SH start $* ;; supervise) # # Under control of daemontools supervise monitor which # handles restarts and shutdowns via the svc program. # exec $RUN_CMD ;; run|demo) echo "Running Jetty: " if [ -f $JETTY_PID ] then if running $JETTY_PID then echo "Already Running!!" exit 1 else # dead pid file - remove rm -f $JETTY_PID fi fi exec $RUN_CMD ;; check) echo "Checking arguments to Jetty: " echo "JETTY_HOME = $JETTY_HOME" echo "JETTY_CONF = $JETTY_CONF" echo "JETTY_RUN = $JETTY_RUN" echo "JETTY_PID = $JETTY_PID" echo "JETTY_PORT = $JETTY_PORT" echo "JETTY_LOGS = $JETTY_LOGS" echo "CONFIGS = $CONFIGS" echo "JAVA_OPTIONS = $JAVA_OPTIONS" echo "JAVA = $JAVA" echo "CLASSPATH = $CLASSPATH" echo "RUN_CMD = $RUN_CMD" echo if [ -f $JETTY_RUN/jetty.pid ] then echo "Jetty running pid="`cat $JETTY_RUN/jetty.pid` exit 0 fi exit 1 ;; *) usage ;; esac exit 0 jetty-6.1.26/modules/0000755000175000017500000000000011745736535013137 5ustar moonmoonjetty-6.1.26/modules/jetty/0000755000175000017500000000000011745736467014302 5ustar moonmoonjetty-6.1.26/modules/jetty/src/0000755000175000017500000000000011745736461015063 5ustar moonmoonjetty-6.1.26/modules/jetty/src/test/0000755000175000017500000000000011745736461016042 5ustar moonmoonjetty-6.1.26/modules/jetty/src/test/java/0000755000175000017500000000000011745736456016767 5ustar moonmoonjetty-6.1.26/modules/jetty/src/test/java/org/0000755000175000017500000000000011745736456017556 5ustar moonmoonjetty-6.1.26/modules/jetty/src/test/java/org/mortbay/0000755000175000017500000000000011745736461021227 5ustar moonmoonjetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736461022366 5ustar moonmoonjetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/SelectChannelServerTest.java0000644000175000017500000000210211044235703027744 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty; import org.mortbay.jetty.nio.SelectChannelConnector; /** * HttpServer Tester. */ public class SelectChannelServerTest extends HttpServerTestBase { public SelectChannelServerTest() { super(new SelectChannelConnector()); } }jetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/HttpConnectionTest.java0000644000175000017500000005141711333035615027022 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== /* * Created on 9/01/2004 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package org.mortbay.jetty; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletRequest; import org.mortbay.log.Log; import org.mortbay.log.Logger; import org.mortbay.log.StdErrLog; import junit.framework.TestCase; /** * @author gregw * */ public class HttpConnectionTest extends TestCase { Server server = new Server(); LocalConnector connector = new LocalConnector(); /** * Constructor * @param arg0 */ public HttpConnectionTest(String arg0) { super(arg0); server.setConnectors(new Connector[]{connector}); server.setHandler(new DumpHandler()); } /* * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); connector.setHeaderBufferSize(1024); connector.setRequestBufferSize(2048); connector.setResponseBufferSize(4096); server.start(); } /* * @see TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); server.stop(); } /* --------------------------------------------------------------- */ public void testFragmentedChunk() { String response=null; try { int offset=0; // Chunk last offset=0; connector.reopen(); response=connector.getResponses("GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"/R1"); offset = checkContains(response,offset,"12345"); response=connector.getResponses("GET /R2 HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain\n"+ "\015\012"+ "5;\015\012",true); response=connector.getResponses("ABCDE\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"/R2"); offset = checkContains(response,offset,"ABCDE"); } catch(Exception e) { e.printStackTrace(); assertTrue(false); if (response!=null) System.err.println(response); } } /* --------------------------------------------------------------- */ public void testEmpty() throws Exception { String response=connector.getResponses("GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain\n"+ "\015\012"+ "0\015\012\015\012"); int offset=0; offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"/R1"); } /* --------------------------------------------------------------- */ public void testAutoFlush() throws Exception { String response=null; int offset=0; offset=0; connector.reopen(); response=connector.getResponses("GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"HTTP/1.1 200"); checkNotContained(response,offset,"IgnoreMe"); offset = checkContains(response,offset,"/R1"); offset = checkContains(response,offset,"12345"); } /* --------------------------------------------------------------- */ public void testCharset() { String response=null; try { int offset=0; offset=0; connector.reopen(); response=connector.getResponses("GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"/R1"); offset = checkContains(response,offset,"encoding=utf-8"); offset = checkContains(response,offset,"12345"); offset=0; connector.reopen(); response=connector.getResponses("GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain; charset = iso-8859-1 ; other=value\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"encoding=iso-8859-1"); offset = checkContains(response,offset,"/R1"); offset = checkContains(response,offset,"12345"); offset=0; connector.reopen(); response=connector.getResponses("GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain; charset=unknown\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"encoding=unknown"); offset = checkContains(response,offset,"/R1"); offset = checkContains(response,offset,"UnsupportedEncodingException"); } catch(Exception e) { e.printStackTrace(); assertTrue(false); if (response!=null) System.err.println(response); } } /* --------------------------------------------------------------- */ public void testPipeline() { String response=null; String requests=null; try { int offset=0; offset=0; connector.reopen(); requests="GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "Content-Length: 10\n"+ "\n"+ "0123456789\n"+ "GET /R2 HTTP/1.1\n"+ "Host: localhost\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "Content-Length: 10\n"+ "\n"+ "abcdefghij\n"; response=connector.getResponses(requests); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"/R1"); offset = checkContains(response,offset,"encoding=utf-8"); offset = checkContains(response,offset,"0123456789"); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"/R2"); offset = checkContains(response,offset,"encoding=utf-8"); offset = checkContains(response,offset,"abcdefghij"); offset=0; connector.reopen(); requests="GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "Content-Length: 1026\n"+ "\n"; for (int i=0;i<100;i++) requests+="0123456789"; requests+="abcdefghijklmnopqrstuvwxyz"; requests+= "GET /R2 HTTP/1.1\n"+ "Host: localhost\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "Content-Length: 10\n"+ "\n"+ "0987654321\n"; response=connector.getResponses(requests); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"/R1"); offset = checkContains(response,offset,"encoding=utf-8"); offset = checkContains(response,offset,"abcdefghijklmnopqrstuvwxyz"); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"/R2"); offset = checkContains(response,offset,"encoding=utf-8"); offset = checkContains(response,offset,"0987654321"); } catch(Exception e) { e.printStackTrace(); assertTrue(false); if (response!=null) System.err.println(response); } } /* --------------------------------------------------------------- */ public void testUnconsumedError() throws Exception { String response=null; String requests=null; int offset=0; offset=0; connector.reopen(); requests="GET /R1?error=500 HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "5;\015\012"+ "67890\015\012"+ "0;\015\012\015\012"+ "GET /R2 HTTP/1.1\n"+ "Host: localhost\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "Content-Length: 10\n"+ "\n"+ "abcdefghij\n"; response=connector.getResponses(requests); offset = checkContains(response,offset,"HTTP/1.1 500"); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"/R2"); offset = checkContains(response,offset,"encoding=utf-8"); offset = checkContains(response,offset,"abcdefghij"); } /* --------------------------------------------------------------- */ public void testUnconsumedException() throws Exception { String response=null; String requests=null; int offset=0; offset=0; connector.reopen(); requests="GET /R1?ISE=true HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "5;\015\012"+ "67890\015\012"+ "0;\015\012\015\012"+ "GET /R2 HTTP/1.1\n"+ "Host: localhost\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "Content-Length: 10\n"+ "\n"+ "abcdefghij\n"; Logger logger=null; try { if (!Log.isDebugEnabled()) { logger=Log.getLog(); Log.setLog(null); } response=connector.getResponses(requests); offset = checkContains(response,offset,"HTTP/1.1 500"); offset = checkContains(response,offset,"Connection: close"); checkNotContained(response,offset,"HTTP/1.1 200"); } finally { if (logger!=null) Log.setLog(logger); } } public void testConnection () { String response=null; try { int offset=0; offset=0; connector.reopen(); response=connector.getResponses("GET /R1 HTTP/1.1\n"+ "Host: localhost\n"+ "Connection: TE, close"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"Connection: TE"); offset = checkContains(response,offset,"Connection: close"); } catch (Exception e) { e.printStackTrace(); assertTrue(false); if (response!=null) System.err.println(response); } } public void testOversizedBuffer() { String response = null; connector.reopen(); try { int offset = 0; String cookie = "thisisastringthatshouldreachover1kbytes"; for (int i=0;i<100;i++) cookie+="xxxxxxxxxxxx"; response = connector.getResponses("GET / HTTP/1.1\n"+ "Host: localhost\n" + "Cookie: "+cookie+"\n"+ "\015\012" ); offset = checkContains(response, offset, "HTTP/1.1 413"); } catch(Exception e) { e.printStackTrace(); assertTrue(false); if(response != null) System.err.println(response); } } public void testOversizedResponse () throws Exception { String str = "thisisastringthatshouldreachover1kbytes"; for (int i=0;i<400;i++) str+="xxxxxxxxxxxx"; final String longstr = str; String response = null; server.stop(); server.setHandler(new DumpHandler() { public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { try { Request base_request = (request instanceof Request) ? (Request)request:HttpConnection.getCurrentConnection().getRequest(); base_request.setHandled(true); response.setHeader(HttpHeaders.CONTENT_TYPE,MimeTypes.TEXT_HTML); response.setHeader("LongStr", longstr); PrintWriter writer = response.getWriter(); writer.write("

FOO

"); writer.flush(); writer.close(); throw new RuntimeException("SHOULD NOT GET HERE"); } catch(ArrayIndexOutOfBoundsException e) { Log.debug(e); Log.info("correctly ignored "+e); } } }); server.start(); connector.reopen(); try { int offset = 0; response = connector.getResponses("GET / HTTP/1.1\n"+ "Host: localhost\n" + "\015\012" ); offset = checkContains(response, offset, "HTTP/1.1 500"); } catch(Exception e) { e.printStackTrace(); if(response != null) System.err.println(response); fail("Exception"); } } public void testAsterisk() { String response = null; try { int offset=0; offset=0; connector.reopen(); response=connector.getResponses("OPTIONS * HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"*"); // to prevent the DumpHandler from picking this up and returning 200 OK server.setHandler(null); offset=0; connector.reopen(); response=connector.getResponses("GET * HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"HTTP/1.1 404 Not Found"); offset=0; connector.reopen(); response=connector.getResponses("GET ** HTTP/1.1\n"+ "Host: localhost\n"+ "Transfer-Encoding: chunked\n"+ "Content-Type: text/plain; charset=utf-8\n"+ "\015\012"+ "5;\015\012"+ "12345\015\012"+ "0;\015\012\015\012"); offset = checkContains(response,offset,"HTTP/1.1 400 Bad Request"); } catch (Exception e) { e.printStackTrace(); assertTrue(false); if (response!=null) System.err.println(response); } } private int checkContains(String s,int offset,String c) { int o=s.indexOf(c,offset); if (o=offset) { System.err.println("FAILED"); System.err.println("'"+c+"' IS in:"); System.err.println(s.substring(offset)); System.err.flush(); System.out.println("--\n"+s); System.out.flush(); assertTrue(false); } } } jetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/HttpURITest.java0000644000175000017500000002543111041361244025353 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty; import junit.framework.TestCase; public class HttpURITest extends TestCase { String[][] partial_tests= { /* 0*/ {"/path/info",null,null,null,null,"/path/info",null,null,null}, /* 1*/ {"/path/info#fragment",null,null,null,null,"/path/info",null,null,"fragment"}, /* 2*/ {"/path/info?query",null,null,null,null,"/path/info",null,"query",null}, /* 3*/ {"/path/info?query#fragment",null,null,null,null,"/path/info",null,"query","fragment"}, /* 4*/ {"/path/info;param",null,null,null,null,"/path/info","param",null,null}, /* 5*/ {"/path/info;param#fragment",null,null,null,null,"/path/info","param",null,"fragment"}, /* 6*/ {"/path/info;param?query",null,null,null,null,"/path/info","param","query",null}, /* 7*/ {"/path/info;param?query#fragment",null,null,null,null,"/path/info","param","query","fragment"}, /* 8*/ {"//host/path/info",null,"//host","host",null,"/path/info",null,null,null}, /* 9*/ {"//user@host/path/info",null,"//user@host","host",null,"/path/info",null,null,null}, /*10*/ {"//user@host:8080/path/info",null,"//user@host:8080","host","8080","/path/info",null,null,null}, /*11*/ {"//host:8080/path/info",null,"//host:8080","host","8080","/path/info",null,null,null}, /*12*/ {"http:/path/info","http",null,null,null,"/path/info",null,null,null}, /*13*/ {"http:/path/info#fragment","http",null,null,null,"/path/info",null,null,"fragment"}, /*14*/ {"http:/path/info?query","http",null,null,null,"/path/info",null,"query",null}, /*15*/ {"http:/path/info?query#fragment","http",null,null,null,"/path/info",null,"query","fragment"}, /*16*/ {"http:/path/info;param","http",null,null,null,"/path/info","param",null,null}, /*17*/ {"http:/path/info;param#fragment","http",null,null,null,"/path/info","param",null,"fragment"}, /*18*/ {"http:/path/info;param?query","http",null,null,null,"/path/info","param","query",null}, /*19*/ {"http:/path/info;param?query#fragment","http",null,null,null,"/path/info","param","query","fragment"}, /*20*/ {"http://user@host:8080/path/info;param?query#fragment","http","//user@host:8080","host","8080","/path/info","param","query","fragment"}, /*21*/ {"xxxxx://user@host:8080/path/info;param?query#fragment","xxxxx","//user@host:8080","host","8080","/path/info","param","query","fragment"}, /*22*/ {"http:///;?#","http","//",null,null,"/","","",""}, /*23*/ {"/path/info?a=?query",null,null,null,null,"/path/info",null,"a=?query",null}, /*24*/ {"/path/info?a=;query",null,null,null,null,"/path/info",null,"a=;query",null}, /*25*/ {"//host:8080//",null,"//host:8080","host","8080","//",null,null,null}, /*26*/ {"file:///path/info","file","//",null,null,"/path/info",null,null,null}, /*27*/ {"//",null,"//",null,null,null,null,null,null}, /*28*/ {"/;param",null, null, null,null,"/", "param",null,null}, /*29*/ {"/?x=y",null, null, null,null,"/", null,"x=y",null}, /*30*/ {"/?abc=test",null, null, null,null,"/", null,"abc=test",null}, /*31*/ {"/#fragment",null, null, null,null,"/", null,null,"fragment"}, }; public void testPartialURIs() throws Exception { HttpURI uri = new HttpURI(true); for (int t=0;t\n" +"\n" +""; private static final String REQUEST1=REQUEST1_HEADER+REQUEST1_CONTENT.getBytes().length+"\n\n"+REQUEST1_CONTENT; /** The expected response. */ private static final String RESPONSE1="HTTP/1.1 200 OK\n"+"Connection: close\n"+"Server: Jetty(6.1.x)\n"+"\n"+"Hello world\n"; // Break the request up into three pieces, splitting the header. private static final String FRAGMENT1=REQUEST1.substring(0,16); private static final String FRAGMENT2=REQUEST1.substring(16,34); private static final String FRAGMENT3=REQUEST1.substring(34); /** Second test request. */ private static final String REQUEST2_HEADER="POST / HTTP/1.0\n"+"Host: localhost\n"+"Content-Type: text/xml\n"+"Content-Length: "; private static final String REQUEST2_CONTENT="\n" +"\n" +" \n"+" \n"+" 73\n"+" \n"+" \n" +""; private static final String REQUEST2=REQUEST2_HEADER+REQUEST2_CONTENT.getBytes().length+"\n\n"+REQUEST2_CONTENT; private static final String RESPONSE2_CONTENT= "\n"+ "\n"+ " \n"+ " \n"+ " 73\n"+ " \n"+ " \n" +"\n"; private static final String RESPONSE2= "HTTP/1.1 200 OK\n"+ "Content-Type: text/xml; charset=iso-8859-1\n"+ "Content-Length: "+RESPONSE2_CONTENT.getBytes().length+"\n"+ "Server: Jetty(6.1.x)\n"+ "\n"+ RESPONSE2_CONTENT; // Useful constants private static final long PAUSE=15L; private static final int LOOPS=stress?250:25; private static final String HOST="localhost"; private Connector _connector; private int port=0; protected void tearDown() throws Exception { super.tearDown(); Thread.sleep(100); } // ~ Methods // ---------------------------------------------------------------- /** * Feed the server the entire request at once. * * @throws Exception * @throws InterruptedException */ public void testRequest1_jetty() throws Exception, InterruptedException { Server server=startServer(new HelloWorldHandler()); Socket client=new Socket(HOST,port); client.setSoTimeout(10000); OutputStream os=client.getOutputStream(); os.write(REQUEST1.getBytes()); os.flush(); // Read the response. String response=readResponse(client); // Shut down client.close(); server.stop(); // Check the response assertEquals("response",RESPONSE1,response); } /* --------------------------------------------------------------- */ public void testFragmentedChunk() throws Exception { Server server=startServer(new EchoHandler()); Socket client=new Socket(HOST,port); client.setSoTimeout(10000); OutputStream os=client.getOutputStream(); os.write(("GET /R2 HTTP/1.1\015\012"+"Host: localhost\015\012"+"Transfer-Encoding: chunked\015\012"+"Content-Type: text/plain\015\012" +"Connection: close\015\012"+"\015\012").getBytes()); os.flush(); Thread.sleep(PAUSE); os.write(("5\015\012").getBytes()); os.flush(); Thread.sleep(PAUSE); os.write(("ABCDE\015\012"+"0;\015\012\015\012").getBytes()); os.flush(); // Read the response. String response=readResponse(client); // Shut down client.close(); server.stop(); assertTrue(true); // nothing checked yet. } /** * Feed the server fragmentary headers and see how it copes with it. * * @throws Exception * @throws InterruptedException */ public void testRequest1Fragments_jetty() throws Exception, InterruptedException { Server server=startServer(new HelloWorldHandler()); String response; try { Socket client=new Socket(HOST,port); client.setSoTimeout(10000); OutputStream os=client.getOutputStream(); // Write a fragment, flush, sleep, write the next fragment, etc. os.write(FRAGMENT1.getBytes()); os.flush(); Thread.sleep(PAUSE); os.write(FRAGMENT2.getBytes()); os.flush(); Thread.sleep(PAUSE); os.write(FRAGMENT3.getBytes()); os.flush(); // Read the response response=readResponse(client); // Shut down client.close(); } finally { server.stop(); } // Check the response assertEquals("response",RESPONSE1,response); } public void testRequest2_jetty() throws Exception { byte[] bytes=REQUEST2.getBytes(); Server server=startServer(new EchoHandler()); try { for (int i=0; i=0) { Thread.sleep(500); len=is.read(buf); if (len>0) total+=len; } assertTrue(total>(1024*256)); assertTrue(30000L>(System.currentTimeMillis()-start)); } finally { // Shut down server.stop(); Thread.yield(); } } /** * After several iterations, I generated some known bad fragment points. * * @throws Exception */ public void testPipeline() throws Exception { Server server=startServer(new HelloWorldHandler()); try { for (int pipeline=1;pipeline<32;pipeline++) { Socket client=new Socket(HOST,port); client.setSoTimeout(10000); OutputStream os=client.getOutputStream(); String request=""; for (int i=1;i=0); assertTrue(in.indexOf("abcdefghi")>=0); assertTrue(in.indexOf("Wibble")<0); in = new String(b,0,b.length,"utf-16"); assertTrue(in.indexOf("123456789")<0); assertTrue(in.indexOf("abcdefghi")<0); assertTrue(in.indexOf("Wibble")>=0); } finally { // Shut down server.stop(); Thread.yield(); } } /** */ public void testRecycledReaders() throws Exception { Server server=startServer(new EchoHandler()); try { long start=System.currentTimeMillis(); Socket client=new Socket(HOST,port); client.setSoTimeout(10000); OutputStream os=client.getOutputStream(); InputStream is=client.getInputStream(); os.write(( "POST /echo?charset=utf-8 HTTP/1.1\r\n"+ "host: "+HOST+":"+port+"\r\n"+ "content-type: text/plain; charset=utf-8\r\n"+ "content-length: 10\r\n"+ "\r\n").getBytes("iso-8859-1")); os.write(( "123456789\n" ).getBytes("utf-8")); os.write(( "POST /echo?charset=utf-8 HTTP/1.1\r\n"+ "host: "+HOST+":"+port+"\r\n"+ "content-type: text/plain; charset=utf-8\r\n"+ "content-length: 10\r\n"+ "\r\n" ).getBytes("iso-8859-1")); os.write(( "abcdefghi\n" ).getBytes("utf-8")); String content="Wibble"; byte[] contentB=content.getBytes("utf-16"); os.write(( "POST /echo?charset=utf-8 HTTP/1.1\r\n"+ "host: "+HOST+":"+port+"\r\n"+ "content-type: text/plain; charset=utf-16\r\n"+ "content-length: "+contentB.length+"\r\n"+ "connection: close\r\n"+ "\r\n" ).getBytes("iso-8859-1")); os.write(contentB); os.flush(); String in = IO.toString(is); assertTrue(in.indexOf("123456789")>=0); assertTrue(in.indexOf("abcdefghi")>=0); assertTrue(in.indexOf("Wibble")>=0); } finally { // Shut down server.stop(); Thread.yield(); } } /** * Read entire response from the client. Close the output. * * @param client * Open client socket. * * @return The response string. * * @throws IOException */ private static String readResponse(Socket client) throws IOException { BufferedReader br=null; try { br=new BufferedReader(new InputStreamReader(client.getInputStream())); StringBuffer sb=new StringBuffer(); String line; while ((line=br.readLine())!=null) { sb.append(line); sb.append('\n'); } return sb.toString(); } finally { if (br!=null) { br.close(); } } } protected HttpServerTestBase(Connector connector) { _connector=connector; } /** * Create the server. * * @param handler * * @return Newly created server, ready to start. * * @throws Exception */ private Server startServer(Handler handler) throws Exception { Server server=new Server(); _connector.setPort(0); server.setConnectors(new Connector[] { _connector }); server.setHandler(handler); server.start(); port=_connector.getLocalPort(); return server; } private void writeFragments(byte[] bytes, int[] points, StringBuffer message, OutputStream os) throws IOException, InterruptedException { int last=0; // Write out the fragments for (int j=0; j=0) throw new IllegalStateException("Not closed"); } } // ---------------------------------------------------------- private static class HelloWorldHandler extends AbstractHandler { // ------------------------------------------------------------ public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { Request base_request=(request instanceof Request)?(Request)request:HttpConnection.getCurrentConnection().getRequest(); base_request.setHandled(true); response.setStatus(200); response.getOutputStream().print("Hello world\r\n"); } } // ---------------------------------------------------------- private static class DataHandler extends AbstractHandler { // ------------------------------------------------------------ public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { Request base_request=(request instanceof Request)?(Request)request:HttpConnection.getCurrentConnection().getRequest(); base_request.setHandled(true); response.setStatus(200); InputStream in = request.getInputStream(); String input=IO.toString(in); String tmp = request.getParameter("writes"); int writes=Integer.parseInt(tmp==null?"10":tmp); tmp = request.getParameter("block"); int block=Integer.parseInt(tmp==null?"10":tmp); String encoding=request.getParameter("encoding"); String chars=request.getParameter("chars"); String chunk = (input+"\u0a870123456789A\u0a87CDEFGHIJKLMNOPQRSTUVWXYZ\u0250bcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") .substring(0,block); response.setContentType("text/plain"); if (encoding==null) { byte[] bytes=chunk.getBytes("ISO-8859-1"); OutputStream out=response.getOutputStream(); for (int i=0;i0) buffer.skip(l); return l; } return super.flush(buffer); } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.io.nio.ChannelEndPoint#fill(org.mortbay.io.Buffer) */ public int fill(Buffer buffer) throws IOException { int x=read++&0xff; if (x<32) return 0; if (x<64 & buffer.space()>0) { one.clear(); int l=super.fill(one); if (l>0) buffer.put(one.peek(0)); return l; } if (x<96 & buffer.space()>0) { two.clear(); int l=super.fill(two); if (l>0) buffer.put(two.peek(0)); if (l>1) buffer.put(two.peek(1)); return l; } if (x<128 & buffer.space()>0) { three.clear(); int l=super.fill(three); if (l>0) buffer.put(three.peek(0)); if (l>1) buffer.put(three.peek(1)); if (l>2) buffer.put(three.peek(2)); return l; } return super.fill(buffer); } }; } }); } }jetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/DumpHandler.java0000644000175000017500000001657611333035615025435 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.util.StringUtil; import org.mortbay.util.ajax.Continuation; import org.mortbay.util.ajax.ContinuationSupport; /* ------------------------------------------------------------ */ /** Dump request handler. * Dumps GET and POST requests. * Useful for testing and debugging. * * @version $Id: DumpHandler.java,v 1.14 2005/08/13 00:01:26 gregwilkins Exp $ * @author Greg Wilkins (gregw) */ public class DumpHandler extends AbstractHandler { String label="Dump HttpHandler"; public DumpHandler() { } public DumpHandler(String label) { this.label=label; } /* ------------------------------------------------------------ */ /* * @see org.mortbay.jetty.Handler#handle(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int) */ public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { Request base_request = (request instanceof Request) ? (Request)request:HttpConnection.getCurrentConnection().getRequest(); if (!isStarted()) return; if (request.getParameter("read")!=null) { Reader in = request.getReader(); for (int i=Integer.parseInt(request.getParameter("read"));i-->0;) in.read(); } if (request.getParameter("ISE")!=null) { throw new IllegalStateException(); } if (request.getParameter("error")!=null) { response.sendError(Integer.parseInt(request.getParameter("error"))); return; } if (request.getParameter("continue")!=null) { Continuation continuation = ContinuationSupport.getContinuation(request, null); continuation.suspend(Long.parseLong(request.getParameter("continue"))); } base_request.setHandled(true); response.setHeader(HttpHeaders.CONTENT_TYPE,MimeTypes.TEXT_HTML); OutputStream out = response.getOutputStream(); ByteArrayOutputStream buf = new ByteArrayOutputStream(2048); Writer writer = new OutputStreamWriter(buf,StringUtil.__ISO_8859_1); writer.write("

"+label+"

"); writer.write("
\npathInfo="+request.getPathInfo()+"\n
\n"); writer.write("
\ncontentType="+request.getContentType()+"\n
\n"); writer.write("
\nencoding="+request.getCharacterEncoding()+"\n
\n"); writer.write("

Header:

");
        writer.write(request.toString());
        writer.write("
\n

Parameters:

\n
");
        Enumeration names=request.getParameterNames();
        while(names.hasMoreElements())
        {
            String name=names.nextElement().toString();
            String[] values=request.getParameterValues(name);
            if (values==null || values.length==0)
            {
                writer.write(name);
                writer.write("=\n");
            }
            else if (values.length==1)
            {
                writer.write(name);
                writer.write("=");
                writer.write(values[0]);
                writer.write("\n");
            }
            else
            {
                for (int i=0; i0)
        {
            String cookie_action=request.getParameter("Button");
            try{
                Cookie cookie=
                    new Cookie(cookie_name.trim(),
                                    request.getParameter("CookieVal"));
                if ("Clear Cookie".equals(cookie_action))
                    cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
            catch(IllegalArgumentException e)
            {
                writer.write("
\n

BAD Set-Cookie:

\n
");
                writer.write(e.toString());
            }
        }
        
        writer.write("
\n

Cookies:

\n
");
        Cookie[] cookies=request.getCookies();
        if (cookies!=null && cookies.length>0)
        {
            for(int c=0;c\n

Attributes:

\n
");
        Enumeration attributes=request.getAttributeNames();
        if (attributes!=null && attributes.hasMoreElements())
        {
            while(attributes.hasMoreElements())
            {
                String attr=attributes.nextElement().toString();
                writer.write(attr);
                writer.write("=");
                writer.write(request.getAttribute(attr).toString());
                writer.write("\n");
            }
        }
        
        writer.write("
\n

Content:

\n
");
        char[] content= new char[4096];
        int len;
        try{
            Reader in=request.getReader();
            while((len=in.read(content))>=0)
                writer.write(new String(content,0,len));
        }
        catch(IOException e)
        {
            writer.write(e.toString());
        }
        
        writer.write("
"); writer.write(""); // commit now writer.flush(); response.setContentLength(buf.size()+1000); buf.writeTo(out); buf.reset(); writer.flush(); for (int pad=998-buf.size();pad-->0;) writer.write(" "); writer.write("\015\012"); writer.flush(); buf.writeTo(out); response.setHeader("IgnoreMe","ignored"); } }jetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/servlet/0000755000175000017500000000000011745736457024057 5ustar moonmoonjetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/servlet/SessionTestClient.java0000644000175000017500000001073211103723565030327 0ustar moonmoon// ======================================================================== // Copyright 2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.servlet; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class SessionTestClient { private String _baseUrl; // e.g http://localhost:8010 public SessionTestClient(String baseUrl) { _baseUrl = baseUrl; } public boolean send(String context, String cookie) throws Exception { HttpURLConnection conn = sendRequest("GET", new URL(_baseUrl + context + "/session/"), cookie); return isSessionAvailable(conn); } public String newSession(String context) throws Exception { HttpURLConnection conn = sendRequest("POST", new URL(_baseUrl + context + "/session/?Action=New%20Session"), null); conn.disconnect(); return getJSESSIONID(conn.getHeaderField("Set-Cookie")); } public boolean setAttribute(String context, String cookie, String name, String value) throws Exception { // should be POST, GET for now HttpURLConnection conn = sendRequest("GET", new URL(_baseUrl + context + "/session/?Action=Set&Name=" + name + "&Value=" + value), cookie); return isAttributeSet(conn, name, value); } public boolean hasAttribute(String context, String cookie, String name, String value) throws Exception { HttpURLConnection conn = sendRequest("GET", new URL(_baseUrl + context + "/session/"), cookie); return isAttributeSet(conn, name, value); } public boolean invalidate(String context, String cookie) throws Exception { // should be POST, GET for now HttpURLConnection conn = sendRequest("GET", new URL(_baseUrl + context + "/session/?Action=Invalidate"), cookie); return !isSessionAvailable(conn); } protected static boolean isSessionAvailable(HttpURLConnection conn) throws Exception { return !isTokenPresent(conn, "

No Session

"); } protected static boolean isAttributeSet(HttpURLConnection conn, String name, String value) throws Exception { return isTokenPresent(conn, "" + name + ": " + value + "
"); } protected static boolean isTokenPresent(HttpURLConnection conn, String token) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; boolean present = false; while((line=br.readLine())!=null) { if(line.indexOf(token)!=-1) { present = true; break; } } conn.disconnect(); return present; } public HttpURLConnection sendRequest(String method, URL url, String cookie) throws Exception { return sendRequest(method, url, cookie, false); } public HttpURLConnection sendRequest(String method, URL url, String cookie, boolean followRedirects) throws Exception { HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod(method); conn.setDoInput(true); conn.setInstanceFollowRedirects(followRedirects); if(cookie!=null) conn.setRequestProperty("Cookie", cookie); conn.connect(); return conn; } protected static String getJSESSIONID(String cookie) { System.err.println("COOKIE: " + cookie); int idx = cookie.indexOf("JSESSIONID"); return cookie.substring(idx, cookie.indexOf(';', idx)); } } jetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/servlet/DispatcherTest.java0000644000175000017500000003566011044235703027636 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.servlet; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.jetty.LocalConnector; import org.mortbay.jetty.Server; public class DispatcherTest extends TestCase { private Server _server = new Server(); private LocalConnector _connector; private Context _context; protected void setUp() throws Exception { _server = new Server(); _server.setSendServerVersion(false); _connector = new LocalConnector(); _context = new Context(); _context.setContextPath("/context"); _server.addHandler(_context); _server.addConnector( _connector ); _server.start(); } public void testForward() throws Exception { _context.addServlet(ForwardServlet.class, "/ForwardServlet/*"); _context.addServlet(AssertForwardServlet.class, "/AssertForwardServlet/*"); String expected= "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html\r\n"+ "Content-Length: 0\r\n"+ "\r\n"; String responses = _connector.getResponses("GET /context/ForwardServlet?do=assertforward&do=more&test=1 HTTP/1.1\n" + "Host: localhost\n\n"); assertEquals(expected, responses); } public void testInclude() throws Exception { _context.addServlet(IncludeServlet.class, "/IncludeServlet/*"); _context.addServlet(AssertIncludeServlet.class, "/AssertIncludeServlet/*"); String expected= "HTTP/1.1 200 OK\r\n"+ "Content-Length: 0\r\n"+ "\r\n"; String responses = _connector.getResponses("GET /context/IncludeServlet?do=assertinclude&do=more&test=1 HTTP/1.1\n" + "Host: localhost\n\n"); assertEquals(expected, responses); } public void testForwardThenInclude() throws Exception { _context.addServlet(ForwardServlet.class, "/ForwardServlet/*"); _context.addServlet(IncludeServlet.class, "/IncludeServlet/*"); _context.addServlet(AssertForwardIncludeServlet.class, "/AssertForwardIncludeServlet/*"); String expected= "HTTP/1.1 200 OK\r\n"+ "Content-Length: 0\r\n"+ "\r\n"; String responses = _connector.getResponses("GET /context/ForwardServlet/forwardpath?do=include HTTP/1.1\n" + "Host: localhost\n\n"); assertEquals(expected, responses); } public void testIncludeThenForward() throws Exception { _context.addServlet(IncludeServlet.class, "/IncludeServlet/*"); _context.addServlet(ForwardServlet.class, "/ForwardServlet/*"); _context.addServlet(AssertIncludeForwardServlet.class, "/AssertIncludeForwardServlet/*"); String expected= "HTTP/1.1 200 OK\r\n"+ "Transfer-Encoding: chunked\r\n"+ "\r\n"+ "0\r\n"+ "\r\n"; String responses = _connector.getResponses("GET /context/IncludeServlet/includepath?do=forward HTTP/1.1\n" + "Host: localhost\n\n"); assertEquals(expected, responses); } public static class ForwardServlet extends HttpServlet implements Servlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = null; if(request.getParameter("do").equals("include")) dispatcher = getServletContext().getRequestDispatcher("/IncludeServlet/includepath?do=assertforwardinclude"); else if(request.getParameter("do").equals("assertincludeforward")) dispatcher = getServletContext().getRequestDispatcher("/AssertIncludeForwardServlet/assertpath?do=end"); else if(request.getParameter("do").equals("assertforward")) dispatcher = getServletContext().getRequestDispatcher("/AssertForwardServlet?do=end&do=the"); dispatcher.forward(request, response); } } public static class IncludeServlet extends HttpServlet implements Servlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = null; if(request.getParameter("do").equals("forward")) dispatcher = getServletContext().getRequestDispatcher("/ForwardServlet/forwardpath?do=assertincludeforward"); else if(request.getParameter("do").equals("assertforwardinclude")) dispatcher = getServletContext().getRequestDispatcher("/AssertForwardIncludeServlet/assertpath?do=end"); else if(request.getParameter("do").equals("assertinclude")) dispatcher = getServletContext().getRequestDispatcher("/AssertIncludeServlet?do=end&do=the"); dispatcher.include(request, response); } } public static class AssertForwardServlet extends HttpServlet implements Servlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__FORWARD_JETTY) ); assertEquals( "/context/ForwardServlet", request.getAttribute(Dispatcher.__FORWARD_REQUEST_URI)); assertEquals( "/context", request.getAttribute(Dispatcher.__FORWARD_CONTEXT_PATH) ); assertEquals( "/ForwardServlet", request.getAttribute(Dispatcher.__FORWARD_SERVLET_PATH)); assertEquals( null, request.getAttribute(Dispatcher.__FORWARD_PATH_INFO)); assertEquals( "do=assertforward&do=more&test=1", request.getAttribute(Dispatcher.__FORWARD_QUERY_STRING) ); List expectedAttributeNames = Arrays.asList(new String[] { Dispatcher.__FORWARD_REQUEST_URI, Dispatcher.__FORWARD_CONTEXT_PATH, Dispatcher.__FORWARD_SERVLET_PATH, Dispatcher.__FORWARD_QUERY_STRING }); List requestAttributeNames = Collections.list(request.getAttributeNames()); assertTrue(requestAttributeNames.containsAll(expectedAttributeNames)); assertEquals(null, request.getPathInfo()); assertEquals(null, request.getPathTranslated()); assertEquals("do=end&do=the&test=1", request.getQueryString()); assertEquals("/context/AssertForwardServlet", request.getRequestURI()); assertEquals("/context", request.getContextPath()); assertEquals("/AssertForwardServlet", request.getServletPath()); response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); } } public static class AssertIncludeServlet extends HttpServlet implements Servlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__INCLUDE_JETTY) ); assertEquals( "/context/AssertIncludeServlet", request.getAttribute(Dispatcher.__INCLUDE_REQUEST_URI)); assertEquals( "/context", request.getAttribute(Dispatcher.__INCLUDE_CONTEXT_PATH) ); assertEquals( "/AssertIncludeServlet", request.getAttribute(Dispatcher.__INCLUDE_SERVLET_PATH)); assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_PATH_INFO)); assertEquals( "do=end&do=the", request.getAttribute(Dispatcher.__INCLUDE_QUERY_STRING)); List expectedAttributeNames = Arrays.asList(new String[] { Dispatcher.__INCLUDE_REQUEST_URI, Dispatcher.__INCLUDE_CONTEXT_PATH, Dispatcher.__INCLUDE_SERVLET_PATH, Dispatcher.__INCLUDE_QUERY_STRING }); List requestAttributeNames = Collections.list(request.getAttributeNames()); assertTrue(requestAttributeNames.containsAll(expectedAttributeNames)); assertEquals(null, request.getPathInfo()); assertEquals(null, request.getPathTranslated()); assertEquals("do=assertinclude&do=more&test=1", request.getQueryString()); assertEquals("/context/IncludeServlet", request.getRequestURI()); assertEquals("/context", request.getContextPath()); assertEquals("/IncludeServlet", request.getServletPath()); response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); } } public static class AssertForwardIncludeServlet extends HttpServlet implements Servlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // include doesn't hide forward assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__FORWARD_JETTY) ); assertEquals( "/context/ForwardServlet/forwardpath", request.getAttribute(Dispatcher.__FORWARD_REQUEST_URI)); assertEquals( "/context", request.getAttribute(Dispatcher.__FORWARD_CONTEXT_PATH) ); assertEquals( "/ForwardServlet", request.getAttribute(Dispatcher.__FORWARD_SERVLET_PATH)); assertEquals( "/forwardpath", request.getAttribute(Dispatcher.__FORWARD_PATH_INFO)); assertEquals( "do=include", request.getAttribute(Dispatcher.__FORWARD_QUERY_STRING) ); assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__INCLUDE_JETTY) ); assertEquals( "/context/AssertForwardIncludeServlet/assertpath", request.getAttribute(Dispatcher.__INCLUDE_REQUEST_URI)); assertEquals( "/context", request.getAttribute(Dispatcher.__INCLUDE_CONTEXT_PATH) ); assertEquals( "/AssertForwardIncludeServlet", request.getAttribute(Dispatcher.__INCLUDE_SERVLET_PATH)); assertEquals( "/assertpath", request.getAttribute(Dispatcher.__INCLUDE_PATH_INFO)); assertEquals( "do=end", request.getAttribute(Dispatcher.__INCLUDE_QUERY_STRING)); List expectedAttributeNames = Arrays.asList(new String[] { Dispatcher.__FORWARD_REQUEST_URI, Dispatcher.__FORWARD_CONTEXT_PATH, Dispatcher.__FORWARD_SERVLET_PATH, Dispatcher.__FORWARD_PATH_INFO, Dispatcher.__FORWARD_QUERY_STRING, Dispatcher.__INCLUDE_REQUEST_URI, Dispatcher.__INCLUDE_CONTEXT_PATH, Dispatcher.__INCLUDE_SERVLET_PATH, Dispatcher.__INCLUDE_PATH_INFO, Dispatcher.__INCLUDE_QUERY_STRING }); List requestAttributeNames = Collections.list(request.getAttributeNames()); assertTrue(requestAttributeNames.containsAll(expectedAttributeNames)); assertEquals("/includepath", request.getPathInfo()); assertEquals(null, request.getPathTranslated()); assertEquals("do=assertforwardinclude", request.getQueryString()); assertEquals("/context/IncludeServlet/includepath", request.getRequestURI()); assertEquals("/context", request.getContextPath()); assertEquals("/IncludeServlet", request.getServletPath()); response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); } } public static class AssertIncludeForwardServlet extends HttpServlet implements Servlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // forward hides include assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_JETTY) ); assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_REQUEST_URI)); assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_CONTEXT_PATH) ); assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_SERVLET_PATH)); assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_PATH_INFO)); assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_QUERY_STRING)); assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__FORWARD_JETTY) ); assertEquals( "/context/IncludeServlet/includepath", request.getAttribute(Dispatcher.__FORWARD_REQUEST_URI)); assertEquals( "/context", request.getAttribute(Dispatcher.__FORWARD_CONTEXT_PATH) ); assertEquals( "/IncludeServlet", request.getAttribute(Dispatcher.__FORWARD_SERVLET_PATH)); assertEquals( "/includepath", request.getAttribute(Dispatcher.__FORWARD_PATH_INFO)); assertEquals( "do=forward", request.getAttribute(Dispatcher.__FORWARD_QUERY_STRING) ); List expectedAttributeNames = Arrays.asList(new String[] { Dispatcher.__FORWARD_REQUEST_URI, Dispatcher.__FORWARD_CONTEXT_PATH, Dispatcher.__FORWARD_SERVLET_PATH, Dispatcher.__FORWARD_PATH_INFO, Dispatcher.__FORWARD_QUERY_STRING, }); List requestAttributeNames = Collections.list(request.getAttributeNames()); assertTrue(requestAttributeNames.containsAll(expectedAttributeNames)); assertEquals("/assertpath", request.getPathInfo()); assertEquals(null, request.getPathTranslated()); assertEquals("do=end", request.getQueryString()); assertEquals("/context/AssertIncludeForwardServlet/assertpath", request.getRequestURI()); assertEquals("/context", request.getContextPath()); assertEquals("/AssertIncludeForwardServlet", request.getServletPath()); response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); } } } jetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/servlet/AbstractSessionTest.java0000644000175000017500000001733311103723565030660 0ustar moonmoon// ======================================================================== // Copyright 2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.servlet; import junit.framework.TestCase; public abstract class AbstractSessionTest extends TestCase { public static final String __host1 = "localhost"; public static final String __host2 = __host1; public static final String __port1 = "8010"; public static final String __port2 = "8011"; SessionTestServer _server1; SessionTestServer _server2; public abstract SessionTestServer newServer1 (); public abstract SessionTestServer newServer2(); public void setUp () throws Exception { _server1 = newServer1(); _server2 = newServer2(); _server1.start(); _server2.start(); } public void tearDown () throws Exception { if (_server1 != null) _server1.stop(); if (_server2 != null) _server2.stop(); _server1=null; _server2=null; } public void testSessions () throws Exception { SessionTestClient client1 = new SessionTestClient("http://"+__host1+":"+__port1); SessionTestClient client2 = new SessionTestClient("http://"+__host2+":"+__port2); // confirm that user has no session assertFalse(client1.send("/contextA", null)); String cookie1 = client1.newSession("/contextA"); assertNotNull(cookie1); System.err.println("cookie1: " + cookie1); // confirm that client2 has the same session attributes as client1 assertTrue(client1.setAttribute("/contextA", cookie1, "foo", "bar")); assertTrue(client2.hasAttribute("/contextA", cookie1, "foo", "bar")); // confirm that /contextA would share same sessionId as /contextB assertTrue(client1.send("/contextA/dispatch/forward/contextB", cookie1)); assertTrue(client2.send("/contextA/dispatch/forward/contextB", cookie1)); assertTrue(client1.send("/contextB", cookie1)); // verify that session attributes on /contextA is different from /contextB assertFalse(client1.hasAttribute("/contextB/action", cookie1, "foo", "bar")); // add new session attributes on /contextB client1.setAttribute("/contextB/action", cookie1, "zzzzz", "yyyyy"); assertTrue(client1.hasAttribute("/contextB/action", cookie1, "zzzzz", "yyyyy")); // verify that client2 has same sessionAttributes on /contextB // client1's newly added attribute "zzzzz" needs to be flushed to the database first // saveInterval is configured at 10s... to test, uncomment the 2 lines below. //Thread.sleep(10000); //assertTrue(client2.hasAttribute("/contextB/action", cookie1, "zzzzz", "yyyyy")); String cookie2 = client2.newSession("/contextA"); assertNotNull(cookie2); System.err.println("cookie2: " + cookie2); // confirm that client1 has same session attributes as client2 assertTrue(client2.setAttribute("/contextA", cookie2, "hello", "world")); assertTrue(client1.hasAttribute("/contextA", cookie2, "hello", "world")); // confirm that /contextA would share same sessionId as /contextB assertTrue(client1.send("/contextA/dispatch/forward/contextB", cookie2)); assertTrue(client2.send("/contextA/dispatch/forward/contextB", cookie2)); assertTrue(client1.send("/contextB", cookie2)); // Session invalidate on contextA assertTrue(client1.invalidate("/contextA", cookie1)); // confirm that session on contextB has not been invalidated after contextA has been invalidated assertTrue(client1.send("/contextB", cookie1)); // confirm that session on contextA has been deleted assertFalse(client1.send("/contextA", cookie1)); // Session invalidate on contextB assertTrue(client1.invalidate("/contextB/action", cookie1)); // confirm that session on contextB has been deleted assertFalse(client1.send("/contextB/action", cookie1)); // wait for saveInterval and check if the session invalidation has been reflected to the other node // to test, uncomment 3 lines below //Thread.sleep(10000); //assertFalse(client2.send("/contextA", cookie1)); //assertFalse(client2.send("/contextB/action", cookie1)); } public void testSessionManagerStop() throws Exception { SessionTestClient client1 = new SessionTestClient("http://"+__host1+":"+__port1); SessionTestClient client2 = new SessionTestClient("http://"+__host2+":"+__port2); // confirm that user has no session assertFalse(client1.send("/contextA", null)); String cookie1 = client1.newSession("/contextA"); assertNotNull(cookie1); System.err.println("cookie1: " + cookie1); // creates a session for contextB assertTrue(client1.send("/contextB", cookie1)); // confirm that /contextA and /contextB sessions are available assertTrue(client1.send("/contextA", cookie1)); assertTrue(client1.send("/contextB/action", cookie1)); assertTrue(client1.setAttribute("/contextA", cookie1, "a", "b")); assertTrue(client1.setAttribute("/contextB/action", cookie1, "c", "d")); // confirm that /contextA and /contextB sessions from client2 are available assertTrue(client2.send("/contextA", cookie1)); assertTrue(client2.send("/contextB/action", cookie1)); assertTrue(client2.hasAttribute("/contextA", cookie1, "a", "b")); assertTrue(client2.hasAttribute("/contextB/action", cookie1, "c", "d")); // stop sessionManager from node1 _server1._sessionMgr1.stop(); // verify session still exists for contextB assertTrue(client1.send("/contextB/action", cookie1)); assertTrue(client1.hasAttribute("/contextB/action", cookie1, "c", "d")); // stop sessionManager from node2 _server2._sessionMgr2.stop(); // verfiy session still exists for contextA assertTrue(client2.send("/contextA", cookie1)); assertTrue(client2.hasAttribute("/contextA", cookie1, "a", "b")); } public void testFailover() throws Exception { SessionTestClient client1 = new SessionTestClient("http://"+__host1+":"+__port1); SessionTestClient client2 = new SessionTestClient("http://"+__host2+":"+__port2); // confirm that user has no session assertFalse(client1.send("/contextA", null)); String cookie1 = client1.newSession("/contextA"); assertNotNull(cookie1); System.err.println("cookie1: " + cookie1); assertTrue(client1.setAttribute("/contextA", cookie1, "a", "b")); assertTrue(client2.hasAttribute("/contextA", cookie1, "a", "b")); } } jetty-6.1.26/modules/jetty/src/test/java/org/mortbay/jetty/servlet/DefaultServletTest.java0000644000175000017500000005255111266215715030506 0ustar moonmoonpackage org.mortbay.jetty.servlet; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import junit.framework.AssertionFailedError; import junit.framework.TestCase; import org.mortbay.jetty.LocalConnector; import org.mortbay.jetty.Server; import org.mortbay.servlet.NoJspServlet; import org.mortbay.util.IO; import org.mortbay.util.StringUtil; public class DefaultServletTest extends TestCase { private Server server; private LocalConnector connector; private Context context; private String os = System.getProperty("os.name").toLowerCase(); protected void setUp() throws Exception { super.setUp(); server = new Server(); server.setSendServerVersion(false); connector = new LocalConnector(); context = new Context(); context.setContextPath("/context"); context.setWelcomeFiles(new String[] {"index.html","index.jsp","index.htm"}); // no welcome files server.addHandler(context); server.addConnector(connector); server.start(); } protected void tearDown() throws Exception { super.tearDown(); if (server != null) { server.stop(); } } public void testListingWithSession() throws Exception { ServletHolder defholder = context.addServlet(DefaultServlet.class,"/*"); defholder.setInitParameter("dirAllowed","true"); defholder.setInitParameter("redirectWelcome","false"); defholder.setInitParameter("gzip","false"); File testDir = new File("target/tests/" + getName()); prepareEmptyTestDir(testDir); /* create some content in the docroot */ File resBase = new File(testDir, "docroot"); resBase.mkdirs(); new File(resBase, "one").mkdir(); new File(resBase, "two").mkdir(); new File(resBase, "three").mkdir(); String resBasePath = resBase.getAbsolutePath(); defholder.setInitParameter("resourceBase",resBasePath); StringBuffer req1 = new StringBuffer(); req1.append("GET /context/;JSESSIONID=1234567890 HTTP/1.1\n"); req1.append("Host: localhost\n"); req1.append("\n"); String response = connector.getResponses(req1.toString()); assertResponseContains("/one/;JSESSIONID=1234567890",response); assertResponseContains("/two/;JSESSIONID=1234567890",response); assertResponseContains("/three/;JSESSIONID=1234567890",response); assertResponseNotContains(" HTTP/1.1\n"); req1.append("Host: localhost\n"); req1.append("\n"); String response = connector.getResponses(req1.toString()); assertResponseContains("/one/",response); assertResponseContains("/two/",response); assertResponseContains("/three/",response); if (os.indexOf("windows")<0) assertResponseContains("/f%3F%3Fr",response); assertResponseNotContains("">Link * * The above example would parse incorrectly on various browsers as the "<" or '"' characters * would end the href attribute value string prematurely. * * @param raw the raw text to defang. * @return the defanged text. */ private static String defangURI(String raw) { StringBuffer buf = null; if (buf==null) { for (int i=0;i': buf=new StringBuffer(raw.length()<<1); break; } } if (buf==null) return raw; } for (int i=0;i': buf.append("%3E"); continue; default: buf.append(c); continue; } } return buf.toString(); } private static String deTag(String raw) { return StringUtil.replace( StringUtil.replace(raw,"<","<"), ">", ">"); } /* ------------------------------------------------------------ */ /** * @param out * @param start First byte to write * @param count Bytes to write or -1 for all of them. */ public void writeTo(OutputStream out,long start,long count) throws IOException { InputStream in = getInputStream(); try { in.skip(start); if (count<0) IO.copy(in,out); else IO.copy(in,out,count); } finally { in.close(); } } } jetty-6.1.26/modules/jetty/src/main/java/org/mortbay/resource/URLResource.java0000644000175000017500000001745610475034331026037 0ustar moonmoon// ======================================================================== // Copyright 1996-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.resource; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.security.Permission; import org.mortbay.log.Log; import org.mortbay.util.URIUtil; /* ------------------------------------------------------------ */ /** Abstract resource class. * * @author Nuno Pregui�a * @author Greg Wilkins (gregw) */ public class URLResource extends Resource { protected URL _url; protected String _urlString; protected transient URLConnection _connection; protected transient InputStream _in=null; transient boolean _useCaches = Resource.__defaultUseCaches; /* ------------------------------------------------------------ */ protected URLResource(URL url, URLConnection connection) { _url = url; _urlString=_url.toString(); _connection=connection; } protected URLResource (URL url, URLConnection connection, boolean useCaches) { this (url, connection); _useCaches = useCaches; } /* ------------------------------------------------------------ */ protected synchronized boolean checkConnection() { if (_connection==null) { try{ _connection=_url.openConnection(); _connection.setUseCaches(_useCaches); } catch(IOException e) { Log.ignore(e); } } return _connection!=null; } /* ------------------------------------------------------------ */ /** Release any resources held by the resource. */ public synchronized void release() { if (_in!=null) { try{_in.close();}catch(IOException e){Log.ignore(e);} _in=null; } if (_connection!=null) _connection=null; } /* ------------------------------------------------------------ */ /** * Returns true if the respresened resource exists. */ public boolean exists() { try { synchronized(this) { if (checkConnection() && _in==null ) _in = _connection.getInputStream(); } } catch (IOException e) { Log.ignore(e); } return _in!=null; } /* ------------------------------------------------------------ */ /** * Returns true if the respresenetd resource is a container/directory. * If the resource is not a file, resources ending with "/" are * considered directories. */ public boolean isDirectory() { return exists() && _url.toString().endsWith("/"); } /* ------------------------------------------------------------ */ /** * Returns the last modified time */ public long lastModified() { if (checkConnection()) return _connection.getLastModified(); return -1; } /* ------------------------------------------------------------ */ /** * Return the length of the resource */ public long length() { if (checkConnection()) return _connection.getContentLength(); return -1; } /* ------------------------------------------------------------ */ /** * Returns an URL representing the given resource */ public URL getURL() { return _url; } /* ------------------------------------------------------------ */ /** * Returns an File representing the given resource or NULL if this * is not possible. */ public File getFile() throws IOException { // Try the permission hack if (checkConnection()) { Permission perm = _connection.getPermission(); if (perm instanceof java.io.FilePermission) return new File(perm.getName()); } // Try the URL file arg try {return new File(_url.getFile());} catch(Exception e) {Log.ignore(e);} // Don't know the file return null; } /* ------------------------------------------------------------ */ /** * Returns the name of the resource */ public String getName() { return _url.toExternalForm(); } /* ------------------------------------------------------------ */ /** * Returns an input stream to the resource */ public synchronized InputStream getInputStream() throws java.io.IOException { if (!checkConnection()) throw new IOException( "Invalid resource"); try { if( _in != null) { InputStream in = _in; _in=null; return in; } return _connection.getInputStream(); } finally { _connection=null; } } /* ------------------------------------------------------------ */ /** * Returns an output stream to the resource */ public OutputStream getOutputStream() throws java.io.IOException, SecurityException { throw new IOException( "Output not supported"); } /* ------------------------------------------------------------ */ /** * Deletes the given resource */ public boolean delete() throws SecurityException { throw new SecurityException( "Delete not supported"); } /* ------------------------------------------------------------ */ /** * Rename the given resource */ public boolean renameTo( Resource dest) throws SecurityException { throw new SecurityException( "RenameTo not supported"); } /* ------------------------------------------------------------ */ /** * Returns a list of resource names contained in the given resource */ public String[] list() { return null; } /* ------------------------------------------------------------ */ /** * Returns the resource contained inside the current resource with the * given name */ public Resource addPath(String path) throws IOException,MalformedURLException { if (path==null) return null; path = URIUtil.canonicalPath(path); return newResource(URIUtil.addPaths(_url.toExternalForm(),path)); } /* ------------------------------------------------------------ */ public String toString() { return _urlString; } /* ------------------------------------------------------------ */ public int hashCode() { return _url.hashCode(); } /* ------------------------------------------------------------ */ public boolean equals( Object o) { return o instanceof URLResource && _url.equals(((URLResource)o)._url); } public boolean getUseCaches () { return _useCaches; } } jetty-6.1.26/modules/jetty/src/main/java/org/mortbay/resource/BadResource.java0000644000175000017500000000654510472631505026063 0ustar moonmoon// ======================================================================== // Copyright 1996-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.resource; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; /* ------------------------------------------------------------ */ /** Bad Resource. * * A Resource that is returned for a bade URL. Acts as a resource * that does not exist and throws appropriate exceptions. * * @author Greg Wilkins (gregw) */ class BadResource extends URLResource { /* ------------------------------------------------------------ */ private String _message=null; /* -------------------------------------------------------- */ BadResource(URL url, String message) { super(url,null); _message=message; } /* -------------------------------------------------------- */ public boolean exists() { return false; } /* -------------------------------------------------------- */ public long lastModified() { return -1; } /* -------------------------------------------------------- */ public boolean isDirectory() { return false; } /* --------------------------------------------------------- */ public long length() { return -1; } /* ------------------------------------------------------------ */ public File getFile() { return null; } /* --------------------------------------------------------- */ public InputStream getInputStream() throws IOException { throw new FileNotFoundException(_message); } /* --------------------------------------------------------- */ public OutputStream getOutputStream() throws java.io.IOException, SecurityException { throw new FileNotFoundException(_message); } /* --------------------------------------------------------- */ public boolean delete() throws SecurityException { throw new SecurityException(_message); } /* --------------------------------------------------------- */ public boolean renameTo( Resource dest) throws SecurityException { throw new SecurityException(_message); } /* --------------------------------------------------------- */ public String[] list() { return null; } /* ------------------------------------------------------------ */ public String toString() { return super.toString()+"; BadResource="+_message; } } jetty-6.1.26/modules/jetty/src/main/config/0000755000175000017500000000000011745736467017262 5ustar moonmoonjetty-6.1.26/modules/jetty/src/main/config/etc/0000755000175000017500000000000011745736467020035 5ustar moonmoonjetty-6.1.26/modules/jetty/src/main/config/etc/jetty-debug.xml0000644000175000017500000000170311232714534022761 0ustar moonmoon /yyyy_mm_dd.debug.log true 90 jetty-6.1.26/modules/jetty/src/main/config/etc/jetty-bio.xml0000644000175000017500000000160711155102430022435 0ustar moonmoon 50000 1500 jetty-6.1.26/modules/jetty/src/main/config/etc/keystore0000644000175000017500000000261011155102430021570 0ustar moonmoonþíþíjettyu5‡ º0‚¶0 +*‚¢ô~­Ÿ F9ùáªSN²òó‡Ñuô\<»€KpIì| ¨´ˆªñpÚÓF #?dú#1¿šB§ŸW«IÔ2È@ ±\n]Õ.ÈI Ðè)Ñû-UˆOm‹–¥Ö¹ˆöƒ»¸¶Xq½nŒø±Þè}ÿÃj𥢞…,¿ýC@àúô8R>lzlÅr¥“šãc¤¶þZ05'Í Íž'qgïéÚ–Gÿ0é>KŸðå=ÜQW›v Crʨ؅Ÿ°$ÉïÐJîPË)ù˜\·Ôƒ·Srá€W9ô+}³Õå…Ø(tÅi&Øù$àñVÁóÚoþ&{+Ä ÜâcŽi¦e&t–@Òc¬FÍ;r ' ø½Ä¶*¼ŽËåâ3F¦R‚)@Rç2•p™+É:0C-ÃÛ/åi¼p¡ÔÿøF(.a Bœ8ù›Ê4fš®ÂUG1•Ü }ZhÆE3 'XÉ^Ósú`Öaš°–\—ŠÒÈ ,9˜¹úYxYbÓîû@,©ÒyA® âR.ôd“UòÎ ¢mn“€(Tß„µÜ[΂Y³–îþ\åz¿è.Ú…×-_5þªÍø<)ɦ¸åG‹W 1bŸŠoô‰žÊ”…o5#ÏÍžuáU(x~¸e"öÝÚçz·<ÀÊôDç®Î!ÙúøïFÒ9Ή Žei(Ú …äª9:µ‚kÖ}sm" =ß§ x…±{û’0¢lc¢mñŽ«w>Ÿ* Hÿ–'Ñ^^£I™¬p°)ˆKÖ$™-A1íU–¨¨Øá^‰Ÿk†3.gƒ_4Û/¨­rÑ…P–¨s NÃÕ‹Åé4¯³]ñJ)$KÖúºus˜—Å™B Æ±Öf™¾3 ä9ĹX.509ˆ0‚„0‚íIÃô0  *†H†÷ 0ˆ10UUnknown10UUnknown10UUnknown1$0"U Mort Bay Consulting Pty Ltd10 U Jetty10Ujetty.mortbay.org0 081107042836Z 360325042836Z0ˆ10UUnknown10UUnknown10UUnknown1$0"U Mort Bay Consulting Pty Ltd10 U Jetty10Ujetty.mortbay.org0Ÿ0  *†H†÷ 0‰ƒáá -ã%]<×7e@oŽëæ~ât ©§€“4HaO©RïH€ø"ãí%HAÖˆ/wØåÜ~Ò½'+ßD â'‚ІHìsÇþÊ¢«;ž=ÞNº¥·ó@IÒ¾øŒ—3SМ²æ¯>ÞêdKRy£ÄÍ´5,kr' ˆõcY‰fÓ}³ q0  *†H†÷ u;Q;7KúšwcEä´qì‚ ”ÍûŠåy.Æ9Æ5-l‰ @h ±‚<ßýœ¬¸s.”жNÑŸóùœC’ ißa3àvï6]ÈÕ ½¬BiY(¨r«Œ²ÀŠ×D}x_ò§è2€O"‡º<êíiˆ¡žÂxD”*H@ϸS49ìÅÑ„¸œ' }>p1(1>*ëjetty-6.1.26/modules/jetty/src/main/config/etc/jetty-xinetd.xml0000644000175000017500000000361711173372264023200 0ustar moonmoon 300000 2 false 20000 5000 jetty-6.1.26/modules/jetty/src/main/config/etc/jetty-jsp.xml0000644000175000017500000000112611245436173022472 0ustar moonmoon com.sun.org.apache.commons.logging.impl.JettyLog jetty-6.1.26/modules/jetty/src/main/config/etc/jetty-stats.xml0000644000175000017500000000142611223003502023015 0ustar moonmoon jetty-6.1.26/modules/jetty/src/main/config/etc/realm.properties0000644000175000017500000000134511155102430023222 0ustar moonmoon# # This file defines users passwords and roles for a HashUserRealm # # The format is # : [, ...] # # Passwords may be clear text, obfuscated or checksummed. The class # org.mortbay.util.Password should be used to generate obfuscated # passwords or password checksums # # If DIGEST Authentication is used, the password must be in a recoverable # format, either plain text or OBF:. # jetty: MD5:164c88b302622e17050af52c89945d44,user admin: CRYPT:ad1ks..kc.1Ug,server-administrator,content-administrator,admin other: OBF:1xmk1w261u9r1w1c1xmq plain: plain user: password # This entry is for digest auth. The credential is a MD5 hash of username:realmname:password digest: MD5:6e120743ad67abfbc385bc2bb754e297 jetty-6.1.26/modules/jetty/src/main/config/etc/jetty-ssl.xml0000644000175000017500000000307211155102430022463 0ustar moonmoon 8443 30000 2000 /etc/keystore OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4 OBF:1u2u1wml1z7s1z7a1wnl1u2g /etc/keystore OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4 2000 jetty-6.1.26/modules/jetty/src/main/config/etc/jdbcRealm.properties0000644000175000017500000000406511155102430024007 0ustar moonmoon# # This is a sample properties file for the org.mortbay.jetty.security.JDBCUserRealm # implemtation of the UserRealm interface. This allows Jetty users authentication # to work from a database. # # +-------+ +------------+ +-------+ # | users | | user_roles | | roles | # +-------+ +------------+ +-------+ # | id | /| user_id |\ | id | # | user -------| role_id |------- role | # | pwd | \| |/ | | # +-------+ +------------+ +-------+ # # # 'cachetime' is a time in seconds to cache positive database # lookups in internal hash table. Set to 0 to disable caching. # # # For MySQL: # create a MYSQL user called "jetty" with password "jetty" # # Create the tables: # create table users # ( # id integer primary key, # username varchar(100) not null unique key, # pwd varchar(20) not null # ); # # create table roles # ( # id integer primary key, # role varchar(100) not null unique key # ); # # create table user_roles # ( # user_id integer not null, # role_id integer not null, # unique key (user_id, role_id), # index(user_id) # ); # # I'm not sure unique key with a first component of user_id will be # user by MySQL in query, so additional index wouldn't hurt. # # To test JDBC implementation: # # mysql> insert into users values (1, 'admin', 'password'); # mysql> insert into roles values (1, 'server-administrator'); # mysql> insert into roles values (2, 'content-administrator'); # mysql> insert into user_roles values (1, 1); # mysql> insert into user_roles values (1, 2); # # Replace HashUserRealm in etc/admin.xml with JDBCUserRealm and # set path to properties file. # jdbcdriver = org.gjt.mm.mysql.Driver url = jdbc:mysql://localhost/jetty username = jetty password = jetty usertable = users usertablekey = id usertableuserfield = username usertablepasswordfield = pwd roletable = roles roletablekey = id roletablerolefield = role userroletable = user_roles userroletableuserkey = user_id userroletablerolekey = role_id cachetime = 300 jetty-6.1.26/modules/jetty/src/main/config/etc/jetty.xml0000644000175000017500000002353011456704370021704 0ustar moonmoon 10 200 20 30000 2 false 8443 5000 5000 /contexts 5 /webapps false true false /etc/webdefault.xml Test Realm /etc/realm.properties 0 /yyyy_mm_dd.request.log yyyy_MM_dd 90 true false false GMT true true true 1000 jetty-6.1.26/modules/jetty/src/main/resources/0000755000175000017500000000000011745736467020027 5ustar moonmoonjetty-6.1.26/modules/jetty/src/main/resources/org/0000755000175000017500000000000011745736467020616 5ustar moonmoonjetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/0000755000175000017500000000000011745736467022273 5ustar moonmoonjetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/jetty/0000755000175000017500000000000011745736467023432 5ustar moonmoonjetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/jetty/useragents0000644000175000017500000001173711146570021025517 0ustar moonmoonMozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; GTB5; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1) Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322) Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; InfoPath.2) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; Media Center PC 5.0) msnbot/1.1 (+http://search.msn.com/msnbot.htm) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; FunWebProducts; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322) Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727) FeedBurner/1.0 (http://www.FeedBurner.com) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; InfoPath.1) Mozilla/5.0 (Twiceler-0.9 http://www.cuil.com/twiceler/robot.html) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; InfoPath.2) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Jakarta Commons-HttpClient/2.0.2 Java/1.6.0 jetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/jetty/encoding.properties0000644000175000017500000000007610472631505027320 0ustar moonmoontext/html = ISO-8859-1 text/plain = US-ASCII text/xml = UTF-8 jetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/jetty/mime.properties0000644000175000017500000001203111421171213026441 0ustar moonmoonai = application/postscript aif = audio/x-aiff aifc = audio/x-aiff aiff = audio/x-aiff apk = application/vnd.android.package-archive asc = text/plain asf = video/x.ms.asf asx = video/x.ms.asx au = audio/basic avi = video/x-msvideo bcpio = application/x-bcpio bin = application/octet-stream cab = application/x-cabinet cdf = application/x-netcdf class = application/java-vm cpio = application/x-cpio cpt = application/mac-compactpro crt = application/x-x509-ca-cert csh = application/x-csh css = text/css csv = text/comma-separated-values dcr = application/x-director dir = application/x-director dll = application/x-msdownload dms = application/octet-stream doc = application/msword dtd = application/xml-dtd dvi = application/x-dvi dxr = application/x-director eps = application/postscript etx = text/x-setext exe = application/octet-stream ez = application/andrew-inset gif = image/gif gtar = application/x-gtar gz = application/gzip gzip = application/gzip hdf = application/x-hdf hqx = application/mac-binhex40 htc = text/x-component htm = text/html html = text/html ice = x-conference/x-cooltalk ico = image/x-icon ief = image/ief iges = model/iges igs = model/iges jad = text/vnd.sun.j2me.app-descriptor jar = application/java-archive java = text/plain jnlp = application/x-java-jnlp-file jpe = image/jpeg jpeg = image/jpeg jpg = image/jpeg js = application/x-javascript jsp = text/html kar = audio/midi latex = application/x-latex lha = application/octet-stream lzh = application/octet-stream man = application/x-troff-man mathml = application/mathml+xml me = application/x-troff-me mesh = model/mesh mid = audio/midi midi = audio/midi mif = application/vnd.mif mol = chemical/x-mdl-molfile mov = video/quicktime movie = video/x-sgi-movie mp2 = audio/mpeg mp3 = audio/mpeg mpe = video/mpeg mpeg = video/mpeg mpg = video/mpeg mpga = audio/mpeg ms = application/x-troff-ms msh = model/mesh msi = application/octet-stream nc = application/x-netcdf oda = application/oda odb = application/vnd.oasis.opendocument.database odc = application/vnd.oasis.opendocument.chart odf = application/vnd.oasis.opendocument.formula odg = application/vnd.oasis.opendocument.graphics odi = application/vnd.oasis.opendocument.image odm = application/vnd.oasis.opendocument.text-master odp = application/vnd.oasis.opendocument.presentation ods = application/vnd.oasis.opendocument.spreadsheet odt = application/vnd.oasis.opendocument.text ogg = application/ogg otc = application/vnd.oasis.opendocument.chart-template otf = application/vnd.oasis.opendocument.formula-template otg = application/vnd.oasis.opendocument.graphics-template oth = application/vnd.oasis.opendocument.text-web oti = application/vnd.oasis.opendocument.image-template otp = application/vnd.oasis.opendocument.presentation-template ots = application/vnd.oasis.opendocument.spreadsheet-template ott = application/vnd.oasis.opendocument.text-template pbm = image/x-portable-bitmap pdb = chemical/x-pdb pdf = application/pdf pgm = image/x-portable-graymap pgn = application/x-chess-pgn png = image/png pnm = image/x-portable-anymap ppm = image/x-portable-pixmap pps = application/vnd.ms-powerpoint ppt = application/vnd.ms-powerpoint ps = application/postscript qt = video/quicktime ra = audio/x-pn-realaudio ram = audio/x-pn-realaudio ras = image/x-cmu-raster rdf = application/rdf+xml rgb = image/x-rgb rm = audio/x-pn-realaudio roff = application/x-troff rpm = application/x-rpm rtf = application/rtf rtx = text/richtext rv = video/vnd.rn-realvideo ser = application/java-serialized-object sgm = text/sgml sgml = text/sgml sh = application/x-sh shar = application/x-shar silo = model/mesh sit = application/x-stuffit skd = application/x-koan skm = application/x-koan skp = application/x-koan skt = application/x-koan smi = application/smil smil = application/smil snd = audio/basic spl = application/x-futuresplash src = application/x-wais-source sv4cpio = application/x-sv4cpio sv4crc = application/x-sv4crc svg = image/svg+xml swf = application/x-shockwave-flash t = application/x-troff tar = application/x-tar tar.gz = application/x-gtar tcl = application/x-tcl tex = application/x-tex texi = application/x-texinfo texinfo = application/x-texinfo tgz = application/x-gtar tif = image/tiff tiff = image/tiff tr = application/x-troff tsv = text/tab-separated-values txt = text/plain ustar = application/x-ustar vcd = application/x-cdlink vrml = model/vrml vxml = application/voicexml+xml wav = audio/x-wav wbmp = image/vnd.wap.wbmp wml = text/vnd.wap.wml wmlc = application/vnd.wap.wmlc wmls = text/vnd.wap.wmlscript wmlsc = application/vnd.wap.wmlscriptc wrl = model/vrml wtls-ca-certificate = application/vnd.wap.wtls-ca-certificate xbm = image/x-xbitmap xht = application/xhtml+xml xhtml = application/xhtml+xml xls = application/vnd.ms-excel xml = application/xml xpm = image/x-xpixmap xsl = application/xml xslt = application/xslt+xml xul = application/vnd.mozilla.xul+xml xwd = image/x-xwindowdump xyz = chemical/x-xyz z = application/compress zip = application/zip jetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/jetty/favicon.ico0000644000175000017500000000217610422774361025543 0ustar moonmoon h(  øìèÿõb%ÿô\#ÿô^$ÿô\$ÿóX#ÿóZ$ÿõa'ÿóX$ÿòR"ÿóZ%ÿî@ÿë3ÿôa'ÿô\%ÿøìèÿ÷l)ÿõ`%ÿõe'ÿõd'ÿô\%ÿóW#ÿóV#ÿõa'ÿô]&ÿñO!ÿîAÿë2ÿîDÿøs.ÿó\%ÿñR ÿ÷k)ÿõa%ÿÿÿÿÿ6ÿóZ%ÿóY%ÿðKÿïEÿé*ÿô]%ÿ÷l+ÿô`&ÿóX#ÿ÷l*ÿöf'ÿÿ5üÿ5üÿ46Çÿÿ¢:ÿóX$ÿïFÿî?ÿê/ÿõe)ÿöl+ÿôb'ÿóY#ÿöh)ÿöi)ÿÿB*uÿ6üÿ6üÿ;#YÿQ ÿP ÿP ÿOÿP ÿ×Iÿõf)ÿòU"ÿó[$ÿô[$ÿöd'ÿˆ2ÿ-;ÿ7üÿ7üÿ?6¬ÿÿD1ÿ?6¬ÿ?6¬ÿ ÿ¡:ÿòU"ÿðKÿñO ÿòU"ÿóZ$ÿ¾Iÿÿ8üÿ8üÿ$9áÿÿ?6¬ÿ8üÿ8üÿ;$Yÿ¥HÿóW#ÿòV"ÿðIÿô\%ÿòU"ÿô\%ÿÿ?7¬ÿ9üÿ9üÿ-;ÿ ÿ;$Yÿ;$Yÿ-;ÿ£?ÿòV"ÿöe(ÿöi*ÿòV#ÿô]%ÿñMÿQ ÿD3ÿ:üÿ:üÿB,uÿR$ÿQ ÿQ ÿQ ÿQ ÿÙS!ÿõa'ÿõe(ÿóZ%ÿòS"ÿñMÿk! ÿ;%Yÿ;üÿ;üÿ?8¬ÿÿ?8¬ÿ?8¬ÿ?8¬ÿÿ£?ÿõc(ÿög)ÿòT#ÿñO ÿñN ÿŸ,ÿÿ<üÿ<üÿ<üÿÿ?8¬ÿ<üÿ<üÿ;%Yÿ£>ÿõ`'ÿõa'ÿóY%ÿóZ%ÿðLÿîCÿÿD4ÿ?8¬ÿ?8¬ÿÿÿ;%Yÿ;%Yÿ-;ÿ£=ÿô]%ÿô\%ÿök,ÿõb(ÿïEÿì:ÿj ÿB.uÿ=üÿ=üÿB.uÿ‡2ÿ£?ÿ£>ÿ¢;ÿ¾Gÿõ`&ÿõ_&ÿô_'ÿñR"ÿïFÿí=ÿˆ5ÿÿ;%Yÿ;%Yÿ-;ÿˆ6ÿõ`&ÿô]$ÿóX#ÿô\%ÿöd(ÿöf)ÿê+ÿê-ÿì5ÿê+ÿØO ÿ¥Lÿ¤Eÿ£Cÿ¥IÿÀPÿõb&ÿô_%ÿôZ$ÿô^%ÿöe(ÿög)ÿøìèÿîBÿîAÿé'ÿîBÿør-ÿ÷l*ÿöi)ÿög(ÿô_%ÿô]$ÿô^%ÿô\%ÿô^%ÿöc(ÿøìèÿjetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/jetty/webapp/0000755000175000017500000000000011745736467024710 5ustar moonmoonjetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/jetty/webapp/webdefault.xml0000644000175000017500000005752411176005115027542 0ustar moonmoon Default web.xml file. This file is applied to a Web application before it's own WEB_INF/web.xml file org.mortbay.jetty.webapp.NoTLDJarPattern start.jar|ant-.*\.jar|dojo-.*\.jar|jetty-.*\.jar|jsp-api-.*\.jar|junit-.*\.jar|servlet-api-.*\.jar|dnsns\.jar|rt\.jar|jsse\.jar|tools\.jar|sunpkcs11\.jar|sunjce_provider\.jar|xerces.*\.jar default org.mortbay.jetty.servlet.DefaultServlet acceptRanges true dirAllowed true welcomeServlets false redirectWelcome false maxCacheSize 256000000 maxCachedFileSize 10000000 maxCachedFiles 1000 cacheType both gzip true useFileMappedBuffer true 0 default / jsp org.apache.jasper.servlet.JspServlet logVerbosityLevel DEBUG fork false xpoweredBy false 0 jsp *.jsp *.jspf *.jspx *.xsp *.JSP *.JSPF *.JSPX *.XSP 30 index.html index.htm index.jsp arISO-8859-6 beISO-8859-5 bgISO-8859-5 caISO-8859-1 csISO-8859-2 daISO-8859-1 deISO-8859-1 elISO-8859-7 enISO-8859-1 esISO-8859-1 etISO-8859-1 fiISO-8859-1 frISO-8859-1 hrISO-8859-2 huISO-8859-2 isISO-8859-1 itISO-8859-1 iwISO-8859-8 jaShift_JIS koEUC-KR ltISO-8859-2 lvISO-8859-2 mkISO-8859-5 nlISO-8859-1 noISO-8859-1 plISO-8859-2 ptISO-8859-1 roISO-8859-2 ruISO-8859-5 shISO-8859-5 skISO-8859-2 slISO-8859-2 sqISO-8859-2 srISO-8859-5 svISO-8859-1 trISO-8859-9 ukISO-8859-5 zhGB2312 zh_TWBig5 Disable TRACE / TRACE jetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/xml/0000755000175000017500000000000011745736467023073 5ustar moonmoonjetty-6.1.26/modules/jetty/src/main/resources/org/mortbay/xml/configure_6_0.dtd0000644000175000017500000002036111173372264026201 0ustar moonmoon jetty-6.1.26/modules/jetty/pom.xml0000644000175000017500000001416311466510412015600 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty Jetty Server Jetty server core org.apache.maven.plugins maven-dependency-plugin copy-deps install copy org.mortbay.jetty servlet-api ${servlet-version} ../../lib maven-antrun-plugin clean clean run copyjar install run org.apache.felix maven-bundle-plugin ${maven-bundle-plugin-version} true manifest org.mortbay.jetty.server J2SE-1.4 http://jetty.mortbay.org !org.mortbay.jetty.*,!org.mortbay.xml.*,!org.mortbay.resource.*,!org.mortbay.io.*,!org.mortbay.servlet.jetty.*,javax.servlet.resources;resolution:=optional,javax.servlet.jsp;resolution:=optional,org.apache.jasper.servlet;resolution:=optional,org.mortbay.jetty.handler.management;resolution:=optional,* org.apache.maven.plugins maven-jar-plugin artifact-jar jar test-jar test-jar ${project.build.outputDirectory}/META-INF/MANIFEST.MF junit junit test org.mortbay.jetty jetty-util ${project.version} org.mortbay.jetty servlet-api ${servlet-version} jetty-6.1.26/modules/jspc-maven-plugin/0000755000175000017500000000000011745736470016474 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/0000755000175000017500000000000011745736470017263 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/main/0000755000175000017500000000000011745736467020215 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/main/assembly/0000755000175000017500000000000011745736467022034 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/main/assembly/site-component.xml0000644000175000017500000000051311173372264025503 0ustar moonmoon site-component jar ${basedir} jspc-maven-plugin target/site/** jetty-6.1.26/modules/jspc-maven-plugin/src/main/java/0000755000175000017500000000000011745736467021136 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/main/java/org/0000755000175000017500000000000011745736467021725 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/main/java/org/mortbay/0000755000175000017500000000000011745736467023402 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736467024541 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/main/java/org/mortbay/jetty/jspc/0000755000175000017500000000000011745736467025500 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/main/java/org/mortbay/jetty/jspc/plugin/0000755000175000017500000000000011745736470026770 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/main/java/org/mortbay/jetty/jspc/plugin/JspcMojo.java0000644000175000017500000003717611245373612031363 0ustar moonmoon//======================================================================== //$Id: JspcMojo.java 5477 2009-08-27 03:03:38Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.jspc.plugin; import org.apache.jasper.JspC; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.StringUtils; import org.mortbay.util.IO; import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; import java.io.FileReader; import java.io.FileWriter; import java.io.FilenameFilter; import java.io.PrintWriter; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** *

* This goal will compile jsps for a webapp so that they can be included in a * war. *

*

* At runtime, the plugin will use the jsp2.0 jspc compiler if you are running * on a 1.4 or lower jvm. If you are using a 1.5 jvm, then the jsp2.1 compiler * will be selected. (this is the same behaviour as the jetty plugin for executing * webapps). *

*

* Note that the same java compiler will be used as for on-the-fly compiled * jsps, which will be the Eclipse java compiler. *

* *

* See Usage * Guide for instructions on using this plugin. *

* * @author janb * * @goal jspc * @phase process-classes * @requiresDependencyResolution compile * @description Runs jspc compiler to produce .java and .class files */ public class JspcMojo extends AbstractMojo { public static final String END_OF_WEBAPP = ""; /** * The maven project. * * @parameter expression="${project}" * @required * @readonly */ private MavenProject project; /** * File into which to generate the <servlet> and * <servlet-mapping> tags for the compiled jsps * * @parameter expression="${basedir}/target/webfrag.xml" */ private String webXmlFragment; /** * Optional. A marker string in the src web.xml file which indicates where * to merge in the generated web.xml fragment. Note that the marker string * will NOT be preserved during the insertion. Can be left blank, in which * case the generated fragment is inserted just before the </web-app> * line * * @parameter */ private String insertionMarker; /** * Merge the generated fragment file with the web.xml from * webAppSourceDirectory. The merged file will go into the same directory as * the webXmlFragment. * * @parameter expression="true" */ private boolean mergeFragment; /** * The destination directory into which to put the compiled jsps. * * @parameter expression="${project.build.outputDirectory}" */ private String generatedClasses; /** * Controls whether or not .java files generated during compilation will be * preserved. * * @parameter expression="false" */ private boolean keepSources; /** * Default root package for all generated classes * * @parameter expression="jsp" */ private String packageRoot; /** * Root directory for all html/jsp etc files * * @parameter expression="${basedir}/src/main/webapp" * @required */ private String webAppSourceDirectory; /** * The comma separated list of patterns for file extensions to be processed. By default * will include all .jsp and .jspx files. * * @parameter default-value="**\/*.jsp, **\/*.jspx" */ private String includes; /** * The comma separated list of file name patters to exclude from compilation. * * @parameter default_value="**\/.svn\/**"; */ private String excludes; /** * The location of the compiled classes for the webapp * * @parameter expression="${project.build.outputDirectory}" */ private File classesDirectory; /** * Whether or not to output more verbose messages during compilation. * * @parameter expression="false"; */ private boolean verbose; /** * If true, validates tlds when parsing. * * @parameter expression="false"; */ private boolean validateXml; /** * The encoding scheme to use. * * @parameter expression="UTF-8" */ private String javaEncoding; /** * Whether or not to generate JSR45 compliant debug info * * @parameter expression="true"; */ private boolean suppressSmap; /** * Whether or not to ignore precompilation errors caused by jsp fragments. * * @parameter expression="false" */ private boolean ignoreJspFragmentErrors; /** * Allows a prefix to be appended to the standard schema locations so that * they can be loaded from elsewhere. * * @parameter */ private String schemaResourcePrefix; public void execute() throws MojoExecutionException, MojoFailureException { if (getLog().isDebugEnabled()) { getLog().info("verbose=" + verbose); getLog().info("webAppSourceDirectory=" + webAppSourceDirectory); getLog().info("generatedClasses=" + generatedClasses); getLog().info("webXmlFragment=" + webXmlFragment); getLog().info("validateXml=" + validateXml); getLog().info("packageRoot=" + packageRoot); getLog().info("javaEncoding=" + javaEncoding); getLog().info("insertionMarker="+ (insertionMarker == null || insertionMarker.equals("") ? END_OF_WEBAPP : insertionMarker)); getLog().info("keepSources=" + keepSources); getLog().info("mergeFragment=" + mergeFragment); getLog().info("suppressSmap=" + suppressSmap); getLog().info("ignoreJspFragmentErrors=" + ignoreJspFragmentErrors); getLog().info("schemaResourcePrefix=" + schemaResourcePrefix); } try { prepare(); compile(); cleanupSrcs(); mergeWebXml(); } catch (Exception e) { throw new MojoFailureException(e, "Failure processing jsps","Failure processing jsps"); } } public void compile() throws Exception { ClassLoader currentClassLoader = Thread.currentThread() .getContextClassLoader(); ArrayList urls = new ArrayList(); setUpClassPath(urls); URLClassLoader ucl = new URLClassLoader((URL[]) urls.toArray(new URL[0]), currentClassLoader); StringBuffer classpathStr = new StringBuffer(); for (int i = 0; i < urls.size(); i++) { if (getLog().isDebugEnabled()) getLog().debug("webappclassloader contains: " + urls.get(i)); classpathStr.append(((URL) urls.get(i)).getFile()); if (getLog().isDebugEnabled()) getLog().debug( "added to classpath: " + ((URL) urls.get(i)).getFile()); classpathStr.append(System.getProperty("path.separator")); } Thread.currentThread().setContextClassLoader(ucl); JspC jspc = new JspC(); jspc.setWebXmlFragment(webXmlFragment); jspc.setUriroot(webAppSourceDirectory); jspc.setPackage(packageRoot); jspc.setOutputDir(generatedClasses); jspc.setValidateXml(validateXml); jspc.setClassPath(classpathStr.toString()); jspc.setCompile(true); jspc.setSmapSuppressed(suppressSmap); jspc.setSmapDumped(!suppressSmap); jspc.setJavaEncoding(javaEncoding); // JspC#setExtensions() does not exist, so // always set concrete list of files that will be processed. String jspFiles = getJspFiles(webAppSourceDirectory); System.err.println("Compiling "+jspFiles); System.err.println("Includes="+includes); System.err.println("Excludes="+excludes); jspc.setJspFiles(jspFiles); if (verbose) { getLog().info("Files selected to precompile: " + jspFiles); } try { jspc.setIgnoreJspFragmentErrors(ignoreJspFragmentErrors); } catch (NoSuchMethodError e) { getLog().debug("Tomcat Jasper does not support configuration option 'ignoreJspFragmentErrors': ignored"); } try { if (schemaResourcePrefix != null) jspc.setSchemaResourcePrefix(schemaResourcePrefix); } catch (NoSuchMethodError e) { getLog().debug("Tomcat Jasper does not support configuration option 'schemaResourcePrefix': ignored"); } if (verbose) jspc.setVerbose(99); else jspc.setVerbose(0); jspc.execute(); Thread.currentThread().setContextClassLoader(currentClassLoader); } private String getJspFiles(String webAppSourceDirectory) throws Exception { List fileNames = FileUtils.getFileNames(new File(webAppSourceDirectory),includes, excludes, false); return StringUtils.join(fileNames.toArray(new String[0]), ","); } /** * Until Jasper supports the option to generate the srcs in a different dir * than the classes, this is the best we can do. * * @throws Exception */ public void cleanupSrcs() throws Exception { // delete the .java files - depending on keepGenerated setting if (!keepSources) { File generatedClassesDir = new File(generatedClasses); if(generatedClassesDir.exists() && generatedClassesDir.isDirectory()) { delete(generatedClassesDir, new FileFilter() { public boolean accept(File f) { return f.isDirectory() || f.getName().endsWith(".java"); } }); } } } static void delete(File dir, FileFilter filter) { File[] files = dir.listFiles(filter); for(int i=0; i if there is no // marker boolean atInsertPoint = false; boolean atEOF = false; String marker = (insertionMarker == null || insertionMarker.equals("") ? END_OF_WEBAPP : insertionMarker); while (!atInsertPoint && !atEOF) { String line = webXmlReader.readLine(); if (line == null) atEOF = true; else if (line.indexOf(marker) >= 0) { atInsertPoint = true; } else { mergedWebXmlWriter.println(line); } } // put in the generated fragment BufferedReader fragmentWebXmlReader = new BufferedReader( new FileReader(fragmentWebXml)); IO.copy(fragmentWebXmlReader, mergedWebXmlWriter); // if we inserted just before the , put it back in if (marker.equals(END_OF_WEBAPP)) mergedWebXmlWriter.println(END_OF_WEBAPP); // copy in the rest of the original web.xml file IO.copy(webXmlReader, mergedWebXmlWriter); webXmlReader.close(); mergedWebXmlWriter.close(); fragmentWebXmlReader.close(); } } private void prepare() throws Exception { // For some reason JspC doesn't like it if the dir doesn't // already exist and refuses to create the web.xml fragment File generatedSourceDirectoryFile = new File(generatedClasses); if (!generatedSourceDirectoryFile.exists()) generatedSourceDirectoryFile.mkdirs(); } /** * Set up the execution classpath for Jasper. * * Put everything in the classesDirectory and all of the dependencies on the * classpath. * * @param urls a list to which to add the urls of the dependencies * @throws Exception */ private void setUpClassPath(List urls) throws Exception { String classesDir = classesDirectory.getCanonicalPath(); classesDir = classesDir + (classesDir.endsWith(File.pathSeparator) ? "" : File.separator); urls.add(new File(classesDir).toURL()); if (getLog().isDebugEnabled()) getLog().debug("Adding to classpath classes dir: " + classesDir); for (Iterator iter = project.getArtifacts().iterator(); iter.hasNext();) { Artifact artifact = (Artifact) iter.next(); // Include runtime and compile time libraries if (!Artifact.SCOPE_TEST.equals(artifact.getScope())) { String filePath = artifact.getFile().getCanonicalPath(); if (getLog().isDebugEnabled()) getLog().debug( "Adding to classpath dependency file: " + filePath); urls.add(artifact.getFile().toURL()); } } } } jetty-6.1.26/modules/jspc-maven-plugin/src/site/0000755000175000017500000000000011745736470020227 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/src/site/apt/0000755000175000017500000000000011745736470021013 5ustar moonmoonjetty-6.1.26/modules/jspc-maven-plugin/pom.xml0000644000175000017500000000764011466510412020002 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty maven-jetty-jspc-plugin maven-plugin Maven Jetty JSPC Plugin janb Jan Bartel janb@webtide.com Webtide http://www.webtide.com maven-surefire-plugin true maven-plugin-plugin exec-plugin-doc generate-sources xdoc maven-site-plugin package site maven-assembly-plugin src/main/assembly/site-component.xml package single org.mortbay.jetty jetty-util ${project.version} org.apache.maven maven-project 2.0.3 org.apache.maven maven-plugin-api 2.0.3 org.apache.maven maven-artifact 2.0.3 org.apache.maven maven-plugin-tools-api org.mortbay.jetty servlet-api ${servlet-version} jdk1.4 true org.mortbay.jetty jsp-2.0 ${project.version} pom jdk1.5 !1.4 org.mortbay.jetty jsp-2.1-jetty ${project.version} jetty-6.1.26/modules/maven-plugin/0000755000175000017500000000000011745736472015541 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/0000755000175000017500000000000011745736472016330 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/main/0000755000175000017500000000000011745736471017253 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/main/assembly/0000755000175000017500000000000011745736471021072 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/main/assembly/site-component.xml0000644000175000017500000000050611173372264024550 0ustar moonmoon site-component jar ${basedir} maven-plugin target/site/** jetty-6.1.26/modules/maven-plugin/src/main/java/0000755000175000017500000000000011745736471020174 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/main/java/org/0000755000175000017500000000000011745736471020763 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/0000755000175000017500000000000011745736471022440 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736471023577 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/0000755000175000017500000000000011745736472025076 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/Jetty6RunMojo.java0000644000175000017500000001372410737271202030430 0ustar moonmoon//======================================================================== //$Id: Jetty6RunMojo.java 2299 2008-01-03 23:40:50Z janb $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.io.File; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.RequestLog; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.ContextHandler; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.plugin.util.JettyPluginServer; import org.mortbay.jetty.security.UserRealm; import org.mortbay.xml.XmlConfiguration; /** *

* This goal is used in-situ on a Maven project without first requiring that the project * is assembled into a war, saving time during the development cycle. * The plugin forks a parallel lifecycle to ensure that the "compile" phase has been completed before invoking Jetty. This means * that you do not need to explicity execute a "mvn compile" first. It also means that a "mvn clean jetty:run" will ensure that * a full fresh compile is done before invoking Jetty. *

*

* Once invoked, the plugin can be configured to run continuously, scanning for changes in the project and automatically performing a * hot redeploy when necessary. This allows the developer to concentrate on coding changes to the project using their IDE of choice and have those changes * immediately and transparently reflected in the running web container, eliminating development time that is wasted on rebuilding, reassembling and redeploying. *

*

* You may also specify the location of a jetty.xml file whose contents will be applied before any plugin configuration. * This can be used, for example, to deploy a static webapp that is not part of your maven build. *

*

* There is a reference guide to the configuration parameters for this plugin, and more detailed information * with examples in the Configuration Guide. *

* @author janb * * @goal run * @requiresDependencyResolution runtime * @execute phase="test-compile" * @description Runs jetty6 directly from a maven project */ public class Jetty6RunMojo extends AbstractJettyRunMojo { /** * List of connectors to use. If none are configured * then the default is a single SelectChannelConnector at port 8080. You can * override this default port number by using the system property jetty.port * on the command line, eg: mvn -Djetty.port=9999 jetty:run * * @parameter */ private Connector[] connectors; /** * List of other contexts to set up. Optional. * @parameter */ private ContextHandler[] contextHandlers; /** * List of security realms to set up. Optional. * @parameter */ private UserRealm[] userRealms; /** * A RequestLog implementation to use for the webapp at runtime. * Optional. * @parameter */ private RequestLog requestLog; public Object getConfiguredRequestLog() { return this.requestLog; } /** * * * @see org.mortbay.jetty.plugin.AbstractJettyRunMojo#getConfiguredConnectors() */ public Object[] getConfiguredConnectors() { return this.connectors; } /** * * * @see org.mortbay.jetty.plugin.AbstractJettyRunMojo#getConfiguredUserRealms() */ public Object[] getConfiguredUserRealms() { return this.userRealms; } /** * @return Returns the contextHandlers. */ public ContextHandler[] getConfiguredContextHandlers() { return this.contextHandlers; } /** * * * @see org.mortbay.jetty.plugin.AbstractJettyRunMojo#createServer() */ public JettyPluginServer createServer() { return new Jetty6PluginServer(); } public void finishConfigurationBeforeStart() throws Exception { Handler[] handlers = getConfiguredContextHandlers(); JettyPluginServer plugin=getServer(); Server server=(Server)plugin.getProxiedObject(); HandlerCollection contexts = (HandlerCollection)server.getChildHandlerByClass(ContextHandlerCollection.class); if (contexts==null) contexts = (HandlerCollection)server.getChildHandlerByClass(HandlerCollection.class); for (int i=0; (handlers != null) && (i < handlers.length); i++) { contexts.addHandler(handlers[i]); } } public void applyJettyXml() throws Exception { if (getJettyXmlFile() == null) return; getLog().info( "Configuring Jetty from xml configuration file = " + getJettyXmlFile() ); XmlConfiguration xmlConfiguration = new XmlConfiguration(getJettyXmlFile().toURL()); xmlConfiguration.configure(getServer().getProxiedObject()); } public void execute() throws MojoExecutionException, MojoFailureException { super.execute(); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootjetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/Jetty6MavenConfiguration.javajetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/Jetty6MavenConfiguration.ja0000644000175000017500000001476111447770774032331 0ustar moonmoon//======================================================================== //$Id: Jetty6MavenConfiguration.java 6184 2010-09-27 01:23:08Z janb $ //Copyright 2000-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.Iterator; import java.util.List; import org.mortbay.jetty.plus.annotation.InjectionCollection; import org.mortbay.jetty.plus.annotation.LifeCycleCallbackCollection; import org.mortbay.jetty.plus.annotation.RunAsCollection; import org.mortbay.jetty.plus.webapp.Configuration; import org.mortbay.jetty.servlet.FilterHolder; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.jetty.webapp.WebAppClassLoader; import org.mortbay.log.Log; import org.mortbay.util.LazyList; public class Jetty6MavenConfiguration extends Configuration { private List classPathFiles; private File webXmlFile; public Jetty6MavenConfiguration() { super(); } public void setClassPathConfiguration(List classPathFiles) { this.classPathFiles = classPathFiles; } public void setWebXml (File webXmlFile) { this.webXmlFile = webXmlFile; } /** Set up the classloader for the webapp, using the various parts of the Maven project * @see org.mortbay.jetty.webapp.Configuration#configureClassLoader() */ public void configureClassLoader() throws Exception { if (classPathFiles != null) { Log.debug("Setting up classpath ..."); //put the classes dir and all dependencies into the classpath Iterator itor = classPathFiles.iterator(); while (itor.hasNext()) ((WebAppClassLoader)getWebAppContext().getClassLoader()).addClassPath(((File)itor.next()).getCanonicalPath()); if (Log.isDebugEnabled()) Log.debug("Classpath = "+LazyList.array2List(((URLClassLoader)getWebAppContext().getClassLoader()).getURLs())); } else { super.configureClassLoader(); } // knock out environmental maven and plexus classes from webAppContext String[] existingServerClasses = getWebAppContext().getServerClasses(); String[] newServerClasses = new String[2+(existingServerClasses==null?0:existingServerClasses.length)]; newServerClasses[0] = "org.apache.maven."; newServerClasses[1] = "org.codehaus.plexus."; System.arraycopy( existingServerClasses, 0, newServerClasses, 2, existingServerClasses.length ); if (Log.isDebugEnabled()) { Log.debug("Server classes:"); for (int i=0;i= 1) && (minor >= 5)) { //TODO it would be nice to be able to re-use the parseAnnotations() method on //the org.mortbay.jetty.annotations.Configuration class, but it's too difficult? //able to use annotations on on jdk1.5 and above Class annotationParserClass = Thread.currentThread().getContextClassLoader().loadClass("org.mortbay.jetty.annotations.AnnotationParser"); Method parseAnnotationsMethod = annotationParserClass.getMethod("parseAnnotations", new Class[] {WebAppContext.class, Class.class, RunAsCollection.class, InjectionCollection.class, LifeCycleCallbackCollection.class }); //look thru _servlets Iterator itor = LazyList.iterator(_servlets); while (itor.hasNext()) { ServletHolder holder = (ServletHolder)itor.next(); Class servlet = getWebAppContext().loadClass(holder.getClassName()); parseAnnotationsMethod.invoke(null, new Object[] {getWebAppContext(), servlet, _runAsCollection, _injections, _callbacks}); } //look thru _filters itor = LazyList.iterator(_filters); while (itor.hasNext()) { FilterHolder holder = (FilterHolder)itor.next(); Class filter = getWebAppContext().loadClass(holder.getClassName()); parseAnnotationsMethod.invoke(null, new Object[] {getWebAppContext(), filter, null, _injections, _callbacks}); } //look thru _listeners itor = LazyList.iterator(_listeners); while (itor.hasNext()) { Object listener = itor.next(); parseAnnotationsMethod.invoke(null, new Object[] {getWebAppContext(), listener.getClass(), null, _injections, _callbacks}); } } else Log.info("Annotations are not supported on jvms prior to jdk1.5"); } } jetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/Jetty6RunWar.java0000644000175000017500000001167611057601040030252 0ustar moonmoon//======================================================================== //$Id: Jetty6RunWar.java 3591 2008-09-03 21:31:12Z jesse $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.mortbay.util.Scanner; /** *

* This goal is used to assemble your webapp into a war and automatically deploy it to Jetty. *

*

* Once invoked, the plugin can be configured to run continuously, scanning for changes in the project and to the * war file and automatically performing a * hot redeploy when necessary. *

*

* You may also specify the location of a jetty.xml file whose contents will be applied before any plugin configuration. * This can be used, for example, to deploy a static webapp that is not part of your maven build. *

*

* There is a reference guide to the configuration parameters for this plugin, and more detailed information * with examples in the Configuration Guide. *

* * @goal run-war * @requiresDependencyResolution runtime * @execute phase="package" * @description Runs jetty6 on a war file * */ public class Jetty6RunWar extends AbstractJetty6Mojo { /** * The location of the war file. * @parameter expression="${project.build.directory}/${project.build.finalName}.war" * @required */ private File webApp; /** * @see org.apache.maven.plugin.Mojo#execute() */ public void execute() throws MojoExecutionException, MojoFailureException { super.execute(); } public void configureWebApplication () throws Exception { super.configureWebApplication(); webAppConfig.setWar(webApp.getCanonicalPath()); webAppConfig.configure(); } /** * @see org.mortbay.jetty.plugin.AbstractJettyMojo#checkPomConfiguration() */ public void checkPomConfiguration() throws MojoExecutionException { return; } /* (non-Javadoc) * @see org.mortbay.jetty.plugin.util.AbstractJettyMojo#configureScanner() */ public void configureScanner() throws MojoExecutionException { final ArrayList scanList = new ArrayList(); scanList.add(getProject().getFile()); scanList.add(webApp); setScanList(scanList); ArrayList listeners = new ArrayList(); listeners.add(new Scanner.BulkListener() { public void filesChanged(List changes) { try { boolean reconfigure = changes.contains(getProject().getFile().getCanonicalPath()); restartWebApp(reconfigure); } catch (Exception e) { getLog().error("Error reconfiguring/restarting webapp after change in watched files",e); } } }); setScannerListeners(listeners); } public void restartWebApp(boolean reconfigureScanner) throws Exception { getLog().info("Restarting webapp ..."); getLog().debug("Stopping webapp ..."); webAppConfig.stop(); getLog().debug("Reconfiguring webapp ..."); checkPomConfiguration(); // check if we need to reconfigure the scanner, // which is if the pom changes if (reconfigureScanner) { getLog().info("Reconfiguring scanner after change to pom.xml ..."); ArrayList scanList = getScanList(); scanList.clear(); scanList.add(getProject().getFile()); scanList.add(webApp); setScanList(scanList); getScanner().setScanDirs(scanList); } getLog().debug("Restarting webapp ..."); webAppConfig.start(); getLog().info("Restart completed."); } /** * @see org.mortbay.jetty.plugin.AbstractJettyMojo#finishConfigurationBeforeStart() */ public void finishConfigurationBeforeStart() { return; } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/RuntimeDependencyResolver.javajetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/RuntimeDependencyResolver.j0000644000175000017500000002076110410566231032401 0ustar moonmoon//======================================================================== //$Id: RuntimeDependencyResolver.java 397 2006-03-23 18:44:41Z janb $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.resolver.ResolutionListener; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.artifact.InvalidDependencyVersionException; import org.apache.maven.project.artifact.MavenMetadataSource; import org.mortbay.jetty.plugin.util.PluginLog; /** * RuntimeDependencyResolver * * This class is able to pull down a remote pom, find all of it's * dependencies and transitively resolve them. * * */ public class RuntimeDependencyResolver { private ArtifactFactory artifactFactory; private ArtifactResolver artifactResolver; private ArtifactMetadataSource metadataSource; private ArtifactRepository localRepository; private List remoteRepositories; /** * RuntimeResolutionListener * * Just for debug printing of transitive resolution steps * */ class RuntimeResolutionListener implements ResolutionListener { public void testArtifact(Artifact arg0) { PluginLog.getLog().debug ("TESTING ARTIFACT "+arg0);} public void startProcessChildren(Artifact arg0) {PluginLog.getLog().debug("STARTING CHILDREN "+arg0);} public void endProcessChildren(Artifact arg0) {PluginLog.getLog().debug("ENDING CHILDREN "+arg0);} public void includeArtifact(Artifact arg0) {PluginLog.getLog().debug("INCLUDE ARTIFACT "+arg0);} public void omitForNearer(Artifact arg0, Artifact arg1) {PluginLog.getLog().debug("OMITTING "+arg0+" for NEARER "+arg1);} public void updateScope(Artifact arg0, String arg1) {PluginLog.getLog().debug("UPDATE of SCOPE "+arg0+ "="+arg1);} public void manageArtifact(Artifact arg0, Artifact arg1) {PluginLog.getLog().debug("MANAGE ARTIFACT "+arg0+" and "+arg1); } public void omitForCycle(Artifact arg0) {PluginLog.getLog().debug("OMIT FOR CYCLE "+arg0);} public void updateScopeCurrentPom(Artifact arg0, String arg1) {PluginLog.getLog().debug("UPDATE SCOPE CURRENT POM "+arg0+"="+arg1);} public void selectVersionFromRange(Artifact arg0) {PluginLog.getLog().debug("SELECT VERSION FROM RANGE "+arg0);} public void restrictRange(Artifact arg0, Artifact arg1, VersionRange arg2) {PluginLog.getLog().debug("RESTRICT RANGE "+arg0+" "+arg1+" range="+arg2);} } public RuntimeDependencyResolver (ArtifactFactory artifactFactory, ArtifactResolver artifactResolver, ArtifactMetadataSource metadataSource, ArtifactRepository localRepository, List remoteRepositories) { this.artifactFactory = artifactFactory; this.artifactResolver = artifactResolver; this.metadataSource = metadataSource; this.localRepository = localRepository; this.remoteRepositories = new ArrayList(remoteRepositories); } /** * Download (if necessary) a pom, and load it as a MavenProject, transitively resolving any * dependencies therein. * * @param projectBuilder * @param groupId * @param artifactId * @param versionId * @return a Set of Artifacts representing the transitively resolved dependencies. * * @throws MalformedURLException * @throws ProjectBuildingException * @throws InvalidDependencyVersionException * @throws ArtifactResolutionException * @throws ArtifactNotFoundException */ public Set transitivelyResolvePomDependencies (MavenProjectBuilder projectBuilder, String groupId, String artifactId, String versionId, boolean resolveProjectArtifact) throws MalformedURLException, ProjectBuildingException, InvalidDependencyVersionException, ArtifactResolutionException, ArtifactNotFoundException { Artifact pomArtifact = getPomArtifact(groupId, artifactId, versionId); MavenProject project = loadPomAsProject(projectBuilder, pomArtifact); List dependencies = project.getDependencies(); Set dependencyArtifacts = MavenMetadataSource.createArtifacts( artifactFactory, dependencies, null, null, null ); dependencyArtifacts.add(project.getArtifact()); List listeners = Collections.EMPTY_LIST; if (PluginLog.getLog().isDebugEnabled()) { listeners = new ArrayList(); listeners.add(new RuntimeResolutionListener()); } ArtifactResolutionResult result = artifactResolver.resolveTransitively(dependencyArtifacts, pomArtifact, Collections.EMPTY_MAP, localRepository, remoteRepositories, metadataSource, null, listeners); Set artifacts = result.getArtifacts(); if (PluginLog.getLog().isDebugEnabled()) { PluginLog.getLog().debug("RESOLVED "+artifacts.size()+" ARTIFACTS"); Iterator itor = artifacts.iterator(); while (itor.hasNext()) { Artifact a = (Artifact)itor.next(); PluginLog.getLog().debug(a.getFile().toURL().toString()); } } return artifacts; } public MavenProject loadPomAsProject (MavenProjectBuilder projectBuilder, Artifact pomArtifact) throws ProjectBuildingException { return projectBuilder.buildFromRepository(pomArtifact, remoteRepositories,localRepository); } public Artifact getArtifact (String groupId, String artifactId, String versionId, String type) { return this.artifactFactory.createBuildArtifact(groupId, artifactId, versionId, type); } public Artifact getPomArtifact (String groupId, String artifactId, String versionId) { return this.artifactFactory.createBuildArtifact(groupId, artifactId, versionId, "pom"); } public void removeDependency (Set artifacts, String groupId, String artifactId, String versionId, String type) { if ((artifacts == null) || artifacts.isEmpty()) return; Iterator itor = artifacts.iterator(); while (itor.hasNext()) { Artifact a = (Artifact)itor.next(); if (a.getGroupId().equals(groupId) && a.getArtifactId().equals(artifactId) && a.getType().equals(type)) { //remove if the versions match, or there was no version specified if (versionId == null) itor.remove(); else if (a.getVersion().equals(versionId)) itor.remove(); } } } public void addDependency (Set artifacts, String groupId, String artifactId, String versionId, String type) throws ArtifactResolutionException, ArtifactNotFoundException { Artifact a = getArtifact(groupId, artifactId, versionId, type); artifactResolver.resolve(a, remoteRepositories, localRepository); artifacts.add(a); } } jetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/AbstractJettyMojo.java0000644000175000017500000004407511450043243031337 0ustar moonmoon//======================================================================== //$Id: AbstractJettyMojo.java 6194 2010-09-27 07:24:19Z janb $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Properties; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; import org.mortbay.jetty.Server; import org.mortbay.jetty.plugin.util.ConsoleScanner; import org.mortbay.jetty.plugin.util.JettyPluginServer; import org.mortbay.jetty.plugin.util.PluginLog; import org.mortbay.jetty.plugin.util.SystemProperties; import org.mortbay.jetty.plugin.util.SystemProperty; import org.mortbay.util.Scanner; /** * AbstractJettyMojo * * */ public abstract class AbstractJettyMojo extends AbstractMojo { /** * The proxy for the Server object */ protected JettyPluginServer server; /** * The "virtual" webapp created by the plugin * @parameter */ protected Jetty6PluginWebAppContext webAppConfig; /** * The maven project. * * @parameter expression="${executedProject}" * @required * @readonly */ protected MavenProject project; /** * The context path for the webapp. Defaults to the * name of the webapp's artifact. * * @parameter expression="/${project.artifactId}" * @required */ protected String contextPath; /** * The temporary directory to use for the webapp. * Defaults to target/jetty-tmp * * @parameter expression="${project.build.directory}/work" * @required */ protected File tmpDirectory; /** * A webdefault.xml file to use instead * of the default for the webapp. Optional. * * @parameter */ protected File webDefaultXml; /** * A web.xml file to be applied AFTER * the webapp's web.xml file. Useful for * applying different build profiles, eg * test, production etc. Optional. * @parameter */ protected File overrideWebXml; /** * The interval in seconds to scan the webapp for changes * and restart the context if necessary. Ignored if reload * is enabled. Disabled by default. * * @parameter expression="${jetty.scanIntervalSeconds}" default-value="0" * @required */ protected int scanIntervalSeconds; /** * reload can be set to either 'automatic' or 'manual' * * if 'manual' then the context can be reloaded by a linefeed in the console * if 'automatic' then traditional reloading on changed files is enabled. * * @parameter expression="${jetty.reload}" default-value="automatic" */ protected String reload; /** * File containing system properties to be set before execution * * Note that these properties will NOT override System properties * that have been set on the command line, by the JVM, or directly * in the POM via systemProperties. Optional. * * @parameter expression="${jetty.systemPropertiesFile}" */ protected File systemPropertiesFile; /** * System properties to set before execution. * Note that these properties will NOT override System properties * that have been set on the command line or by the JVM. They WILL * override System properties that have been set via systemPropertiesFile. * Optional. * @parameter */ protected SystemProperties systemProperties; /** * Location of a jetty xml configuration file whose contents * will be applied before any plugin configuration. Optional. * @parameter */ protected File jettyConfig; /** * Port to listen to stop jetty on executing -DSTOP.PORT=<stopPort> * -DSTOP.KEY=<stopKey> -jar start.jar --stop * @parameter */ protected int stopPort; /** * Key to provide when stopping jetty on executing java -DSTOP.KEY=<stopKey> * -DSTOP.PORT=<stopPort> -jar start.jar --stop * @parameter */ protected String stopKey; /** *

* Determines whether or not the server blocks when started. The default * behavior (daemon = false) will cause the server to pause other processes * while it continues to handle web requests. This is useful when starting the * server with the intent to work with it interactively. *

* Often, it is desirable to let the server start and continue running subsequent * processes in an automated build environment. This can be facilitated by setting * daemon to true. *

* @parameter expression="${jetty.daemon}" default-value="false" */ protected boolean daemon; /** *

* If true, execution of the plugin is skipped. *

* @parameter expression="${jetty.skip}" default-value="false" */ protected boolean skip; /** * A scanner to check for changes to the webapp */ protected Scanner scanner; /** * List of files and directories to scan */ protected ArrayList scanList; /** * List of Listeners for the scanner */ protected ArrayList scannerListeners; /** * A scanner to check ENTER hits on the console */ protected Thread consoleScanner; public String PORT_SYSPROPERTY = "jetty.port"; /** * @return Returns the realms configured in the pom */ public abstract Object[] getConfiguredUserRealms(); /** * @return Returns the connectors configured in the pom */ public abstract Object[] getConfiguredConnectors(); public abstract Object getConfiguredRequestLog(); public abstract void checkPomConfiguration() throws MojoExecutionException; public abstract void configureScanner () throws MojoExecutionException; public abstract void applyJettyXml () throws Exception; /** * create a proxy that wraps a particular jetty version Server object * @return */ public abstract JettyPluginServer createServer() throws Exception; public abstract void finishConfigurationBeforeStart() throws Exception; public MavenProject getProject() { return this.project; } public File getTmpDirectory() { return this.tmpDirectory; } public File getWebDefaultXml() { return this.webDefaultXml; } public File getOverrideWebXml() { return this.overrideWebXml; } /** * @return Returns the contextPath. */ public String getContextPath() { return this.contextPath; } /** * @return Returns the scanIntervalSeconds. */ public int getScanIntervalSeconds() { return this.scanIntervalSeconds; } /** * @return returns the path to the systemPropertiesFile */ public File getSystemPropertiesFile() { return this.systemPropertiesFile; } public void setSystemPropertiesFile(File file) throws Exception { this.systemPropertiesFile = file; FileInputStream propFile = new FileInputStream(systemPropertiesFile); Properties properties = new Properties(); properties.load(propFile); if (this.systemProperties == null ) this.systemProperties = new SystemProperties(); for (Enumeration keys = properties.keys(); keys.hasMoreElements(); ) { String key = (String)keys.nextElement(); if ( ! systemProperties.containsSystemProperty(key) ) { SystemProperty prop = new SystemProperty(); prop.setKey(key); prop.setValue(properties.getProperty(key)); this.systemProperties.setSystemProperty(prop); } } } public void setSystemProperties(SystemProperties systemProperties) { if (this.systemProperties == null) this.systemProperties = systemProperties; else { Iterator itor = systemProperties.getSystemProperties().iterator(); while (itor.hasNext()) { SystemProperty prop = (SystemProperty)itor.next(); this.systemProperties.setSystemProperty(prop); } } } public File getJettyXmlFile () { return this.jettyConfig; } public JettyPluginServer getServer () { return this.server; } public void setServer (JettyPluginServer server) { this.server = server; } public void setScanList (ArrayList list) { this.scanList = new ArrayList(list); } public ArrayList getScanList () { return this.scanList; } public void setScannerListeners (ArrayList listeners) { this.scannerListeners = new ArrayList(listeners); } public ArrayList getScannerListeners () { return this.scannerListeners; } public Scanner getScanner () { return scanner; } public void execute() throws MojoExecutionException, MojoFailureException { getLog().info("Configuring Jetty for project: " + getProject().getName()); if (skip) { getLog().info("Skipping jetty: jetty.skip==true"); return; } PluginLog.setLog(getLog()); checkPomConfiguration(); startJetty(); } public void startJetty () throws MojoExecutionException { try { getLog().debug("Starting Jetty Server ..."); printSystemProperties(); setServer(createServer()); //apply any config from a jetty.xml file first which is able to //be overwritten by config in the pom.xml applyJettyXml (); JettyPluginServer plugin=getServer(); // if the user hasn't configured their project's pom to use a // different set of connectors, // use the default Object[] configuredConnectors = getConfiguredConnectors(); plugin.setConnectors(configuredConnectors); Object[] connectors = plugin.getConnectors(); if (connectors == null|| connectors.length == 0) { //if a SystemProperty -Djetty.port= has been supplied, use that as the default port configuredConnectors = new Object[] { plugin.createDefaultConnector(System.getProperty(PORT_SYSPROPERTY, null)) }; plugin.setConnectors(configuredConnectors); } //set up a RequestLog if one is provided if (getConfiguredRequestLog() != null) getServer().setRequestLog(getConfiguredRequestLog()); //set up the webapp and any context provided getServer().configureHandlers(); configureWebApplication(); getServer().addWebApplication(webAppConfig); // set up security realms Object[] configuredRealms = getConfiguredUserRealms(); for (int i = 0; (configuredRealms != null) && i < configuredRealms.length; i++) getLog().debug(configuredRealms[i].getClass().getName() + ": "+ configuredRealms[i].toString()); plugin.setUserRealms(configuredRealms); //do any other configuration required by the //particular Jetty version finishConfigurationBeforeStart(); // start Jetty server.start(); getLog().info("Started Jetty Server"); if(stopPort>0 && stopKey!=null) { org.mortbay.jetty.plugin.util.Monitor monitor = new org.mortbay.jetty.plugin.util.Monitor(stopPort, stopKey, new Server[]{(Server)server.getProxiedObject()}, !daemon); monitor.start(); } // start the scanner thread (if necessary) on the main webapp configureScanner (); startScanner(); // start the new line scanner thread if necessary startConsoleScanner(); // keep the thread going if not in daemon mode if (!daemon) { server.join(); } } catch (Exception e) { throw new MojoExecutionException("Failure", e); } finally { if (!daemon) { getLog().info("Jetty server exiting."); } } } public abstract void restartWebApp(boolean reconfigureScanner) throws Exception; /** * Subclasses should invoke this to setup basic info * on the webapp * * @throws MojoExecutionException */ public void configureWebApplication () throws Exception { //use EITHER a element or the now deprecated , , , //way of doing things if (webAppConfig == null) { webAppConfig = new Jetty6PluginWebAppContext(); webAppConfig.setContextPath((getContextPath().startsWith("/") ? getContextPath() : "/"+ getContextPath())); if (getTmpDirectory() != null) webAppConfig.setTempDirectory(getTmpDirectory()); if (getWebDefaultXml() != null) webAppConfig.setDefaultsDescriptor(getWebDefaultXml().getCanonicalPath()); if (getOverrideWebXml() != null) webAppConfig.setOverrideDescriptor(getOverrideWebXml().getCanonicalPath()); } if (webAppConfig.getContextPath() == null) { webAppConfig.setContextPath((getContextPath().startsWith("/") ? getContextPath() : "/"+ getContextPath())); } getLog().info("Context path = " + webAppConfig.getContextPath()); getLog().info("Tmp directory = "+ " determined at runtime"); getLog().info("Web defaults = "+(webAppConfig.getDefaultsDescriptor()==null?" jetty default":webAppConfig.getDefaultsDescriptor())); getLog().info("Web overrides = "+(webAppConfig.getOverrideDescriptor()==null?" none":webAppConfig.getOverrideDescriptor())); } /** * Run a scanner thread on the given list of files and directories, calling * stop/start on the given list of LifeCycle objects if any of the watched * files change. * */ private void startScanner() { // check if scanning is enabled if (getScanIntervalSeconds() <= 0) return; // check if reload is manual. It disables file scanning if ( "manual".equalsIgnoreCase( reload ) ) { // issue a warning if both scanIntervalSeconds and reload // are enabled getLog().warn("scanIntervalSeconds is set to " + scanIntervalSeconds + " but will be IGNORED due to manual reloading"); return; } scanner = new Scanner(); scanner.setReportExistingFilesOnStartup(false); scanner.setScanInterval(getScanIntervalSeconds()); scanner.setScanDirs(getScanList()); scanner.setRecursive(true); List listeners = getScannerListeners(); Iterator itor = (listeners==null?null:listeners.iterator()); while (itor!=null && itor.hasNext()) scanner.addListener((Scanner.Listener)itor.next()); getLog().info("Starting scanner at interval of " + getScanIntervalSeconds()+ " seconds."); scanner.start(); } /** * Run a thread that monitors the console input to detect ENTER hits. */ protected void startConsoleScanner() { if ( "manual".equalsIgnoreCase( reload ) ) { getLog().info("Console reloading is ENABLED. Hit ENTER on the console to restart the context."); consoleScanner = new ConsoleScanner(this); consoleScanner.start(); } } private void printSystemProperties () { // print out which system properties were set up if (getLog().isDebugEnabled()) { if (systemProperties != null) { Iterator itor = systemProperties.getSystemProperties().iterator(); while (itor.hasNext()) { SystemProperty prop = (SystemProperty)itor.next(); getLog().debug("Property "+prop.getName()+"="+prop.getValue()+" was "+ (prop.isSet() ? "set" : "skipped")); } } } } /** * Try and find a jetty-web.xml file, using some * historical naming conventions if necessary. * @param webInfDir * @return */ public File findJettyWebXmlFile (File webInfDir) { if (webInfDir == null) return null; if (!webInfDir.exists()) return null; File f = new File (webInfDir, "jetty-web.xml"); if (f.exists()) return f; //try some historical alternatives f = new File (webInfDir, "web-jetty.xml"); if (f.exists()) return f; f = new File (webInfDir, "jetty6-web.xml"); if (f.exists()) return f; return null; } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/Jetty6PluginWebAppContext.javajetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/Jetty6PluginWebAppContext.j0000644000175000017500000000731311251347273032252 0ustar moonmoon//======================================================================== //$Id: Jetty6PluginWebAppContext.java 5511 2009-09-08 03:25:47Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.io.File; import java.util.List; import org.mortbay.jetty.plus.webapp.EnvConfiguration; import org.mortbay.jetty.webapp.Configuration; import org.mortbay.jetty.webapp.JettyWebXmlConfiguration; import org.mortbay.jetty.webapp.TagLibConfiguration; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.jetty.webapp.WebInfConfiguration; /** * Jetty6PluginWebAppContext * * */ public class Jetty6PluginWebAppContext extends WebAppContext { private List classpathFiles; private File jettyEnvXmlFile; private File webXmlFile; private WebInfConfiguration webInfConfig = new WebInfConfiguration(); private EnvConfiguration envConfig = new EnvConfiguration(); private Jetty6MavenConfiguration mvnConfig = new Jetty6MavenConfiguration(); private JettyWebXmlConfiguration jettyWebConfig = new JettyWebXmlConfiguration(); private TagLibConfiguration tagConfig = new TagLibConfiguration(); private Configuration[] configs = new Configuration[]{webInfConfig,envConfig, mvnConfig, jettyWebConfig, tagConfig}; private String contextPath = null; public Jetty6PluginWebAppContext () { super(); setConfigurations(configs); } public void setContextPath(String path) { this.contextPath = path; } public String getContextPath() { return contextPath; } public void setClassPathFiles(List classpathFiles) { this.classpathFiles = classpathFiles; } public List getClassPathFiles() { return this.classpathFiles; } public void setWebXmlFile(File webXmlFile) { this.webXmlFile = webXmlFile; } public File getWebXmlFile() { return this.webXmlFile; } public void setJettyEnvXmlFile (File jettyEnvXmlFile) { this.jettyEnvXmlFile = jettyEnvXmlFile; } public File getJettyEnvXmlFile() { return this.jettyEnvXmlFile; } public void configure () { if (this.contextPath != null) super.setContextPath(this.contextPath); setConfigurations(configs); mvnConfig.setClassPathConfiguration (classpathFiles); mvnConfig.setWebXml (webXmlFile); try { if (this.jettyEnvXmlFile != null) envConfig.setJettyEnvXml(this.jettyEnvXmlFile.toURL()); } catch (Exception e) { throw new RuntimeException(e); } } public void doStart () throws Exception { setShutdown(false); super.doStart(); } public void doStop () throws Exception { setShutdown(true); //just wait a little while to ensure no requests are still being processed Thread.currentThread().sleep(500L); super.doStop(); } } jetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/Jetty6RunWarExploded.java0000644000175000017500000001351411057601040031730 0ustar moonmoon//======================================================================== //$Id: Jetty6RunWarExploded.java 3591 2008-09-03 21:31:12Z jesse $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.mortbay.util.Scanner; /** * *

* This goal is used to assemble your webapp into an exploded war and automatically deploy it to Jetty. *

*

* Once invoked, the plugin can be configured to run continuously, scanning for changes in the pom.xml and * to WEB-INF/web.xml, WEB-INF/classes or WEB-INF/lib and hot redeploy when a change is detected. *

*

* You may also specify the location of a jetty.xml file whose contents will be applied before any plugin configuration. * This can be used, for example, to deploy a static webapp that is not part of your maven build. *

*

* There is a reference guide to the configuration parameters for this plugin, and more detailed information * with examples in the Configuration Guide. *

* *@goal run-exploded *@execute phase=package */ public class Jetty6RunWarExploded extends AbstractJetty6Mojo { /** * The location of the war file. * @parameter expression="${project.build.directory}/${project.build.finalName}" * @required */ private File webApp; /** * * @see org.mortbay.jetty.plugin.AbstractJettyMojo#checkPomConfiguration() */ public void checkPomConfiguration() throws MojoExecutionException { return; } /** * @see org.mortbay.jetty.plugin.AbstractJettyMojo#configureScanner() */ public void configureScanner() throws MojoExecutionException { final ArrayList scanList = new ArrayList(); scanList.add(getProject().getFile()); File webInfDir = new File(webApp,"WEB-INF"); scanList.add(new File(webInfDir, "web.xml")); File jettyWebXmlFile = findJettyWebXmlFile(webInfDir); if (jettyWebXmlFile != null) scanList.add(jettyWebXmlFile); File jettyEnvXmlFile = new File(webInfDir, "jetty-env.xml"); if (jettyEnvXmlFile.exists()) scanList.add(jettyEnvXmlFile); scanList.add(new File(webInfDir, "classes")); scanList.add(new File(webInfDir, "lib")); setScanList(scanList); ArrayList listeners = new ArrayList(); listeners.add(new Scanner.BulkListener() { public void filesChanged(List changes) { try { boolean reconfigure = changes.contains(getProject().getFile().getCanonicalPath()); restartWebApp(reconfigure); } catch (Exception e) { getLog().error("Error reconfiguring/restarting webapp after change in watched files",e); } } }); setScannerListeners(listeners); } public void restartWebApp(boolean reconfigureScanner) throws Exception { getLog().info("Restarting webapp"); getLog().debug("Stopping webapp ..."); webAppConfig.stop(); getLog().debug("Reconfiguring webapp ..."); checkPomConfiguration(); // check if we need to reconfigure the scanner, // which is if the pom changes if (reconfigureScanner) { getLog().info("Reconfiguring scanner after change to pom.xml ..."); ArrayList scanList = getScanList(); scanList.clear(); scanList.add(getProject().getFile()); File webInfDir = new File(webApp,"WEB-INF"); scanList.add(new File(webInfDir, "web.xml")); File jettyWebXmlFile = findJettyWebXmlFile(webInfDir); if (jettyWebXmlFile != null) scanList.add(jettyWebXmlFile); File jettyEnvXmlFile = new File(webInfDir, "jetty-env.xml"); if (jettyEnvXmlFile.exists()) scanList.add(jettyEnvXmlFile); scanList.add(new File(webInfDir, "classes")); scanList.add(new File(webInfDir, "lib")); setScanList(scanList); getScanner().setScanDirs(scanList); } getLog().debug("Restarting webapp ..."); webAppConfig.start(); getLog().info("Restart completed."); } /* (non-Javadoc) * @see org.mortbay.jetty.plugin.util.AbstractJettyMojo#finishConfigurationBeforeStart() */ public void finishConfigurationBeforeStart() throws Exception { return; } public void configureWebApplication () throws Exception { super.configureWebApplication(); webAppConfig.setWar(webApp.getCanonicalPath()); webAppConfig.configure(); } public void execute () throws MojoExecutionException, MojoFailureException { super.execute(); } } jetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/JettyStopMojo.java0000644000175000017500000000520111207710010030476 0ustar moonmoon//======================================================================== //$Id: JettyStopMojo.java 5222 2009-05-29 07:34:32Z dyu $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.io.OutputStream; import java.net.ConnectException; import java.net.InetAddress; import java.net.Socket; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; /** * JettyStopMojo - stops a running instance of jetty. * The ff are required: * -DstopKey=someKey * -DstopPort=somePort * * @author David Yu * * @goal stop * @description Stops jetty that is configured with <stopKey> and <stopPort>. */ public class JettyStopMojo extends AbstractMojo { /** * Port to listen to stop jetty on sending stop command * @parameter * @required */ protected int stopPort; /** * Key to provide when stopping jetty on executing java -DSTOP.KEY=<stopKey> * -DSTOP.PORT=<stopPort> -jar start.jar --stop * @parameter * @required */ protected String stopKey; public void execute() throws MojoExecutionException, MojoFailureException { if (stopPort <= 0) throw new MojoExecutionException("Please specify a valid port"); if (stopKey == null) throw new MojoExecutionException("Please specify a valid stopKey"); try { Socket s=new Socket(InetAddress.getByName("127.0.0.1"),stopPort); s.setSoLinger(false, 0); OutputStream out=s.getOutputStream(); out.write((stopKey+"\r\nstop\r\n").getBytes()); out.flush(); s.close(); } catch (ConnectException e) { getLog().info("Jetty not running!"); } catch (Exception e) { getLog().error(e); } } } jetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/Jetty6PluginServer.java0000644000175000017500000001516210671160016031457 0ustar moonmoon//======================================================================== //$Id: Jetty6PluginServer.java 2094 2007-09-10 06:11:26Z janb $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.RequestLog; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.handler.RequestLogHandler; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.plugin.util.JettyPluginServer; import org.mortbay.jetty.plugin.util.PluginLog; import org.mortbay.jetty.security.UserRealm; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.resource.Resource; /** * Jetty6PluginServer * * Jetty6 version of a wrapper for the Server class. * */ public class Jetty6PluginServer implements JettyPluginServer { public static int DEFAULT_PORT = 8080; public static int DEFAULT_MAX_IDLE_TIME = 30000; private Server server; private ContextHandlerCollection contexts; //the list of ContextHandlers HandlerCollection handlers; //the list of lists of Handlers private RequestLogHandler requestLogHandler; //the request log handler private DefaultHandler defaultHandler; //default handler private RequestLog requestLog; //the particular request log implementation /** * @see org.mortbay.jetty.plugin.util.JettyPluginServer#create() */ public Jetty6PluginServer() { this.server = new Server(); this.server.setStopAtShutdown(true); //make sure Jetty does not use URLConnection caches with the plugin Resource.setDefaultUseCaches(false); } /** * @see org.mortbay.jetty.plugin.util.JettyPluginServer#setConnectorNames(org.mortbay.jetty.plugin.util.JettyPluginConnector[]) */ public void setConnectors(Object[] connectors) { if (connectors==null || connectors.length==0) return; for (int i=0; i * This goal is used to run Jetty with a pre-assembled war. *

*

* It accepts exactly the same options as the run-war goal. * However, it doesn't assume that the current artifact is a * webapp and doesn't try to assemble it into a war before its execution. * So using it makes sense only when used in conjunction with the * webApp configuration parameter pointing to a pre-built WAR. *

*

* This goal is useful e.g. for launching a web app in Jetty as a target for unit-tested * HTTP client components. *

* * @goal deploy-war * @requiresDependencyResolution runtime * @execute phase="validate" * @description Deploy a pre-assembled war * */ public class Jetty6DeployWar extends Jetty6RunWar { } jetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/AbstractJettyRunMojo.java0000644000175000017500000004712611207712455032034 0ustar moonmoon//======================================================================== //$Id: AbstractJettyRunMojo.java 5224 2009-05-29 07:56:29Z dyu $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.codehaus.plexus.util.FileUtils; import org.mortbay.jetty.plugin.util.ScanTargetPattern; import org.mortbay.resource.Resource; import org.mortbay.resource.ResourceCollection; import org.mortbay.util.Scanner; /** * AbstractJettyRunMojo * * * Base class for all jetty versions for the "run" mojo. * */ public abstract class AbstractJettyRunMojo extends AbstractJettyMojo { /** * If true, the <testOutputDirectory> * and the dependencies of <scope>test<scope> * will be put first on the runtime classpath. * @parameter default-value="false" */ private boolean useTestClasspath; /** * The location of a jetty-env.xml file. Optional. * @parameter */ private File jettyEnvXml; /** * The location of the web.xml file. If not * set then it is assumed it is in ${basedir}/src/main/webapp/WEB-INF * * @parameter expression="${maven.war.webxml}" */ private File webXml; /** * The directory containing generated classes. * * @parameter expression="${project.build.outputDirectory}" * @required * */ private File classesDirectory; /** * The directory containing generated test classes. * * @parameter expression="${project.build.testOutputDirectory}" * @required */ private File testClassesDirectory; /** * Root directory for all html/jsp etc files * * @parameter expression="${basedir}/src/main/webapp" * @required */ private File webAppSourceDirectory; /** * @parameter expression="${plugin.artifacts}" * @readonly */ private List pluginArtifacts; /** * List of files or directories to additionally periodically scan for changes. Optional. * @parameter */ private File[] scanTargets; /** * List of directories with ant-style <include> and <exclude> patterns * for extra targets to periodically scan for changes. Can be used instead of, * or in conjunction with <scanTargets>.Optional. * @parameter */ private ScanTargetPattern[] scanTargetPatterns; /** * web.xml as a File */ private File webXmlFile; /** * jetty-env.xml as a File */ private File jettyEnvXmlFile; /** * List of files on the classpath for the webapp */ private List classPathFiles; /** * Extra scan targets as a list */ private List extraScanTargets; /** * overlays (resources) */ private List _overlays; public File getWebXml() { return this.webXml; } public File getJettyEnvXml () { return this.jettyEnvXml; } public File getClassesDirectory() { return this.classesDirectory; } public File getWebAppSourceDirectory() { return this.webAppSourceDirectory; } public void setWebXmlFile (File f) { this.webXmlFile = f; } public File getWebXmlFile () { return this.webXmlFile; } public File getJettyEnvXmlFile () { return this.jettyEnvXmlFile; } public void setJettyEnvXmlFile (File f) { this.jettyEnvXmlFile = f; } public void setClassPathFiles (List list) { this.classPathFiles = new ArrayList(list); } public List getClassPathFiles () { return this.classPathFiles; } public List getExtraScanTargets () { return this.extraScanTargets; } public void setExtraScanTargets(List list) { this.extraScanTargets = list; } /** * Run the mojo * @see org.apache.maven.plugin.Mojo#execute() */ public void execute() throws MojoExecutionException, MojoFailureException { super.execute(); } /** * Verify the configuration given in the pom. * * @see org.mortbay.jetty.plugin.AbstractJettyMojo#checkPomConfiguration() */ public void checkPomConfiguration () throws MojoExecutionException { File buildDir = new File(getProject().getBuild().getDirectory()); if(!buildDir.exists()) buildDir.mkdir(); // check the location of the static content/jsps etc try { if ((getWebAppSourceDirectory() == null) || !getWebAppSourceDirectory().exists()) throw new MojoExecutionException("Webapp source directory " + (getWebAppSourceDirectory() == null ? "null" : getWebAppSourceDirectory().getCanonicalPath()) + " does not exist"); else getLog().info( "Webapp source directory = " + getWebAppSourceDirectory().getCanonicalPath()); } catch (IOException e) { throw new MojoExecutionException("Webapp source directory does not exist", e); } // check reload mechanic if ( !"automatic".equalsIgnoreCase( reload ) && !"manual".equalsIgnoreCase( reload ) ) { throw new MojoExecutionException( "invalid reload mechanic specified, must be 'automatic' or 'manual'" ); } else { getLog().info("Reload Mechanic: " + reload ); } //check if a jetty-env.xml location has been provided, if so, it must exist if (getJettyEnvXml() != null) { setJettyEnvXmlFile(jettyEnvXml); try { if (!getJettyEnvXmlFile().exists()) throw new MojoExecutionException("jetty-env.xml file does not exist at location "+jettyEnvXml); else getLog().info(" jetty-env.xml = "+getJettyEnvXmlFile().getCanonicalPath()); } catch (IOException e) { throw new MojoExecutionException("jetty-env.xml does not exist"); } } // check the classes to form a classpath with try { //allow a webapp with no classes in it (just jsps/html) if (getClassesDirectory() != null) { if (!getClassesDirectory().exists()) getLog().info( "Classes directory "+ getClassesDirectory().getCanonicalPath()+ " does not exist"); else getLog().info("Classes = " + getClassesDirectory().getCanonicalPath()); } else getLog().info("Classes directory not set"); } catch (IOException e) { throw new MojoExecutionException("Location of classesDirectory does not exist"); } setExtraScanTargets(new ArrayList()); if (scanTargets != null) { for (int i=0; i< scanTargets.length; i++) { getLog().info("Added extra scan target:"+ scanTargets[i]); getExtraScanTargets().add(scanTargets[i]); } } if (scanTargetPatterns!=null) { for (int i=0;i 0) { int inputByte = System.in.read(); if (inputByte >= 0) { char c = (char)inputByte; if (c == '\n') { restartWebApp(); } } } } /** * Skip buffered bytes of system console. */ private void clearInputBuffer() { try { while (System.in.available() > 0) { // System.in.skip doesn't work properly. I don't know why long available = System.in.available(); for (int i = 0; i < available; i++) { if (System.in.read() == -1) { break; } } } } catch (IOException e) { mojo.getLog().warn("Error discarding console input buffer", e); } } private void restartWebApp() { try { mojo.restartWebApp(false); // Clear input buffer to discard anything entered on the console // while the application was being restarted. clearInputBuffer(); } catch (Exception e) { mojo.getLog().error( "Error reconfiguring/restarting webapp after a new line on the console", e); } } }jetty-6.1.26/modules/maven-plugin/src/main/java/org/mortbay/jetty/plugin/AbstractJetty6Mojo.java0000644000175000017500000000552310707300741031423 0ustar moonmoon//======================================================================== //$Id: AbstractJetty6Mojo.java 2147 2007-10-23 05:08:49Z gregw $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plugin; import java.io.File; import org.mortbay.jetty.Connector; import org.mortbay.jetty.RequestLog; import org.mortbay.jetty.plugin.util.JettyPluginServer; import org.mortbay.jetty.security.UserRealm; import org.mortbay.xml.XmlConfiguration; /** * AbstractJetty6Mojo * * Base class for all jetty6 mojos. * */ public abstract class AbstractJetty6Mojo extends AbstractJettyMojo { /** * List of connectors to use. If none are configured * then we use a single SelectChannelConnector at port 8080 * * @parameter */ private Connector[] connectors; /** * List of security realms to set up. Optional. * @parameter */ private UserRealm[] userRealms; /** * A RequestLog implementation to use for the webapp at runtime. * Optional. * @parameter */ private RequestLog requestLog; /** * @see org.mortbay.jetty.plugin.AbstractJettyMojo#getConfiguredUserRealms() */ public Object[] getConfiguredUserRealms() { return this.userRealms; } /** * @see org.mortbay.jetty.plugin.AbstractJettyMojo#getConfiguredConnectors() */ public Object[] getConfiguredConnectors() { return this.connectors; } public Object getConfiguredRequestLog() { return this.requestLog; } public void applyJettyXml() throws Exception { if (getJettyXmlFile() == null) return; getLog().info( "Configuring Jetty from xml configuration file = " + getJettyXmlFile() ); XmlConfiguration xmlConfiguration = new XmlConfiguration(getJettyXmlFile().toURL()); xmlConfiguration.configure(getServer().getProxiedObject()); } /** * @see org.mortbay.jetty.plugin.AbstractJettyMojo#createServer() */ public JettyPluginServer createServer() throws Exception { return new Jetty6PluginServer(); } } jetty-6.1.26/modules/maven-plugin/src/site/0000755000175000017500000000000011745736472017274 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/src/site/apt/0000755000175000017500000000000011745736472020060 5ustar moonmoonjetty-6.1.26/modules/maven-plugin/pom.xml0000644000175000017500000001263011466510412017040 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty maven-jetty-plugin maven-plugin Maven Jetty Plugin janb Jan Bartel janb@apache.org Mort Bay Consulting http://www.mortbay.com maven-surefire-plugin true maven-plugin-plugin exec-plugin-doc generate-sources xdoc maven-site-plugin package site maven-assembly-plugin src/main/assembly/site-component.xml package single org.mortbay.jetty jetty ${project.version} org.apache.maven maven-project 2.0.3 org.apache.maven maven-plugin-api 2.0.3 org.apache.maven maven-artifact 2.0.3 org.apache.maven maven-plugin-tools-api org.mortbay.jetty jetty-plus ${project.version} org.mortbay.jetty jetty-naming ${project.version} org.mortbay.jetty jetty-management ${project.version} jdk1.4 true org.mortbay.jetty jsp-2.0 ${project.version} pom jdk1.4-noslf4j slf4jfalse org.mortbay.jetty jsp-2.0 ${project.version} pom org.slf4j slf4j-simple org.slf4j jcl104-over-slf4j jdk1.5 !1.4 org.mortbay.jetty jsp-2.1-jetty ${project.version} org.mortbay.jetty jetty-annotations ${project.version} org.mortbay.jetty start ${project.version} jetty-6.1.26/modules/util5/0000755000175000017500000000000011745736472014201 5ustar moonmoonjetty-6.1.26/modules/util5/src/0000755000175000017500000000000011745736472014770 5ustar moonmoonjetty-6.1.26/modules/util5/src/test/0000755000175000017500000000000011745736472015747 5ustar moonmoonjetty-6.1.26/modules/util5/src/test/java/0000755000175000017500000000000011745736472016670 5ustar moonmoonjetty-6.1.26/modules/util5/src/test/java/org/0000755000175000017500000000000011745736472017457 5ustar moonmoonjetty-6.1.26/modules/util5/src/test/java/org/mortbay/0000755000175000017500000000000011745736472021134 5ustar moonmoonjetty-6.1.26/modules/util5/src/test/java/org/mortbay/util/0000755000175000017500000000000011745736472022111 5ustar moonmoonjetty-6.1.26/modules/util5/src/test/java/org/mortbay/util/ArrayQueueTest.java0000644000175000017500000001126511151602661025663 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.util; import junit.framework.TestCase; public class ArrayQueueTest extends TestCase { public void testWrap() throws Exception { ArrayQueue queue = new ArrayQueue(3,3); assertEquals(0,queue.size()); for (int i=0;i<10;i++) { queue.offer("one"); assertEquals(1,queue.size()); queue.offer("two"); assertEquals(2,queue.size()); queue.offer("three"); assertEquals(3,queue.size()); assertEquals("one",queue.get(0)); assertEquals("two",queue.get(1)); assertEquals("three",queue.get(2)); assertEquals("[one, two, three]",queue.toString()); assertEquals("two",queue.remove(1)); assertEquals(2,queue.size()); assertEquals("one",queue.remove()); assertEquals(1,queue.size()); assertEquals("three",queue.poll()); assertEquals(0,queue.size()); assertEquals(null,queue.poll()); queue.offer("xxx"); queue.offer("xxx"); assertEquals(2,queue.size()); assertEquals("xxx",queue.poll()); assertEquals("xxx",queue.poll()); assertEquals(0,queue.size()); } } public void testRemove() throws Exception { ArrayQueue queue = new ArrayQueue(3,3); queue.add("0"); queue.add("x"); for (int i=1;i<100;i++) { queue.add(""+i); queue.add("x"); queue.remove(queue.size()-3); queue.set(queue.size()-3,queue.get(queue.size()-3)+"!"); } for (int i=0;i<99;i++) assertEquals(i+"!",queue.get(i)); } public void testGrow() throws Exception { ArrayQueue queue = new ArrayQueue(3,5); assertEquals(3,queue.getCapacity()); queue.add("0"); queue.add("a"); queue.add("b"); assertEquals(3,queue.getCapacity()); queue.add("c"); assertEquals(8,queue.getCapacity()); for (int i=0;i<4;i++) queue.add(""+('d'+i)); assertEquals(8,queue.getCapacity()); for (int i=0;i<4;i++) queue.poll(); assertEquals(8,queue.getCapacity()); for (int i=0;i<4;i++) queue.add(""+('d'+i)); assertEquals(8,queue.getCapacity()); for (int i=0;i<4;i++) queue.poll(); assertEquals(8,queue.getCapacity()); for (int i=0;i<4;i++) queue.add(""+('d'+i)); assertEquals(8,queue.getCapacity()); queue.add("z"); assertEquals(13,queue.getCapacity()); queue.clear(); assertEquals(13,queue.getCapacity()); for (int i=0;i<12;i++) queue.add(""+('a'+i)); assertEquals(13,queue.getCapacity()); queue.clear(); assertEquals(13,queue.getCapacity()); for (int i=0;i<12;i++) queue.add(""+('a'+i)); assertEquals(13,queue.getCapacity()); } public void testFullEmpty() throws Exception { ArrayQueue queue = new ArrayQueue(2); assertTrue(queue.offer("one")); assertTrue(queue.offer("two")); assertFalse(queue.offer("three")); try { queue.add("four"); assertTrue(false); } catch(Exception e) { } assertEquals("one",queue.peek()); assertEquals("one",queue.remove()); assertEquals("two",queue.remove()); try { assertEquals("three",queue.remove()); assertTrue(false); } catch(Exception e) { } assertEquals(null,queue.poll()); } } jetty-6.1.26/modules/util5/src/main/0000755000175000017500000000000011745736472015714 5ustar moonmoonjetty-6.1.26/modules/util5/src/main/java/0000755000175000017500000000000011745736472016635 5ustar moonmoonjetty-6.1.26/modules/util5/src/main/java/org/0000755000175000017500000000000011745736472017424 5ustar moonmoonjetty-6.1.26/modules/util5/src/main/java/org/mortbay/0000755000175000017500000000000011745736472021101 5ustar moonmoonjetty-6.1.26/modules/util5/src/main/java/org/mortbay/servlet/0000755000175000017500000000000011745736472022565 5ustar moonmoonjetty-6.1.26/modules/util5/src/main/java/org/mortbay/servlet/QoSFilter.java0000644000175000017500000002216411044232747025271 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.servlet; import java.io.IOException; import java.util.Queue; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.util.ArrayQueue; import org.mortbay.util.ajax.Continuation; import org.mortbay.util.ajax.ContinuationSupport; /** * Quality of Service Filter. * *

This filter limits the number of active requests * to the number set by the "maxRequests" init parameter (default 10). If more * requests are received, they are suspended and placed on priority queues. * Priorities are determined by the {@link #getPriority(ServletRequest)} method * and are a value between 0 and the value given by the "maxPriority" init * parameter (default 10), with higher values having higher priority. *

* This filter is ideal to prevent wasting threads waiting for slow/limited * resources such as a JDBC connection pool. It avoids the situation where all of a * containers thread pool may be consumed blocking on such a slow resource. * By limiting the number of active threads, a smaller thread pool may be used as * the threads are not wasted waiting. Thus more memory may be available for use by * the active threads. *

* Furthermore, this filter uses a priority when resuming waiting requests. So that if * a container is under load, and there are many requests waiting for resources, * the {@link #getPriority(ServletRequest)} method is used, so that more important * requests are serviced first. For example, this filter could be deployed with a * maxRequest limit slightly smaller than the containers thread pool and a high priority * allocated to admin users. Thus regardless of load, admin users would always be * able to access the web application. *

* The maxRequest limit is policed by a {@link Semaphore} and the filter will * wait a short while attempting to acquire the semaphore. This wait is * controlled by the "waitMs" init parameter and allows the expense of a suspend * to be avoided if the semaphore is shortly available. If the semaphore cannot be * obtained, the request will be suspended for the default suspend period of the * container or the valued set as the "suspendMs" init parameter. * * @author gregw * */ public class QoSFilter implements Filter { final static int __DEFAULT_MAX_PRIORITY=10; final static int __DEFAULT_PASSES=10; final static int __DEFAULT_WAIT_MS=50; final static long __DEFAULT_TIMEOUT_MS = 30000L; final static String MAX_REQUESTS_INIT_PARAM="maxRequests"; final static String MAX_PRIORITY_INIT_PARAM="maxPriority"; final static String MAX_WAIT_INIT_PARAM="maxWaitMs"; final static String SUSPEND_INIT_PARAM="suspendMs"; ServletContext _context; long _waitMs; long _suspendMs; Semaphore _passes; Queue[] _queue; String _suspended = "QoSFilter@" + this.hashCode(); String _continuation = "org.mortbay.jetty.ajax.Continuation"; public void init(FilterConfig filterConfig) { _context=filterConfig.getServletContext(); int max_priority=__DEFAULT_MAX_PRIORITY; if (filterConfig.getInitParameter(MAX_PRIORITY_INIT_PARAM)!=null) max_priority=Integer.parseInt(filterConfig.getInitParameter(MAX_PRIORITY_INIT_PARAM)); _queue=new Queue[max_priority+1]; for (int p=0;p<_queue.length;p++) _queue[p]=new ArrayQueue(); int passes=__DEFAULT_PASSES; if (filterConfig.getInitParameter(MAX_REQUESTS_INIT_PARAM)!=null) passes=Integer.parseInt(filterConfig.getInitParameter(MAX_REQUESTS_INIT_PARAM)); _passes=new Semaphore(passes,true); long wait = __DEFAULT_WAIT_MS; if (filterConfig.getInitParameter(MAX_WAIT_INIT_PARAM)!=null) wait=Integer.parseInt(filterConfig.getInitParameter(MAX_WAIT_INIT_PARAM)); _waitMs=wait; long suspend = __DEFAULT_TIMEOUT_MS; if (filterConfig.getInitParameter(SUSPEND_INIT_PARAM)!=null) suspend=Integer.parseInt(filterConfig.getInitParameter(SUSPEND_INIT_PARAM)); _suspendMs=suspend; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { boolean accepted = false; try { Boolean suspended = (Boolean)request.getAttribute(_suspended); if (suspended == null) { accepted = _passes.tryAcquire(_waitMs,TimeUnit.MILLISECONDS); if (accepted) { request.setAttribute(_suspended,Boolean.FALSE); } else { Continuation continuation = ContinuationSupport.getContinuation((HttpServletRequest)request,_queue); int priority = getPriority(request); suspended=Boolean.TRUE; request.setAttribute(_suspended,suspended); synchronized (_queue) { _queue[priority].add(continuation); continuation.suspend(_suspendMs); // may fall through here if waiting continuation } } } if (suspended!=null && suspended.booleanValue()) { request.setAttribute(_suspended,Boolean.FALSE); Continuation continuation = ContinuationSupport.getContinuation((HttpServletRequest)request,_queue); if (continuation.isResumed()) { _passes.acquire(); accepted = true; } else { // Timeout! try 1 more time. accepted = _passes.tryAcquire(_waitMs,TimeUnit.MILLISECONDS); } } else if (!accepted) { // pass through resume of previously accepted request _passes.acquire(); accepted = true; } if (accepted) { chain.doFilter(request,response); } else ((HttpServletResponse)response).sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); } catch (InterruptedException e) { _context.log("QoS",e); ((HttpServletResponse)response).sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); } finally { if (accepted) { synchronized (_queue) { for (int p = _queue.length; p-- > 0;) { Continuation continuation = _queue[p].poll(); if (continuation != null) { continuation.resume(); break; } } } _passes.release(); } } } /** * Get the request Priority. *

The default implementation assigns the following priorities:

    *
  • 2 - for a authenticated request *
  • 1 - for a request with valid /non new session *
  • 0 - for all other requests. *
* This method may be specialised to provide application specific priorities. * * @param request * @return a value between 0 and the maximim priority */ protected int getPriority(ServletRequest request) { HttpServletRequest base_request = (HttpServletRequest)request; if (base_request.getUserPrincipal() != null) return 2; else { HttpSession session = base_request.getSession(false); if (session != null && !session.isNew()) return 1; else return 0; } } public void destroy() { } } jetty-6.1.26/modules/util5/src/main/java/org/mortbay/servlet/DoSFilter.java0000644000175000017500000006115611354402477025263 0ustar moonmoon// ======================================================================== // Copyright 2009 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //======================================================================== package org.mortbay.servlet; import java.io.IOException; import java.util.HashSet; import java.util.Queue; import java.util.StringTokenizer; import java.util.Timer; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; import org.mortbay.log.Log; import org.mortbay.thread.Timeout; import org.mortbay.util.ArrayQueue; import org.mortbay.util.ajax.Continuation; import org.mortbay.util.ajax.ContinuationSupport; /** * Denial of Service filter * *

* This filter is based on the {@link QoSFilter}. it is useful for limiting * exposure to abuse from request flooding, whether malicious, or as a result of * a misconfigured client. *

* The filter keeps track of the number of requests from a connection per * second. If a limit is exceeded, the request is either rejected, delayed, or * throttled. *

* When a request is throttled, it is placed in a priority queue. Priority is * given first to authenticated users and users with an HttpSession, then * connections which can be identified by their IP addresses. Connections with * no way to identify them are given lowest priority. *

* The {@link #extractUserId(ServletRequest request)} function should be * implemented, in order to uniquely identify authenticated users. *

* The following init parameters control the behavior of the filter: * * maxRequestsPerSec the maximum number of requests from a connection per * second. Requests in excess of this are first delayed, * then throttled. * * delayMs is the delay given to all requests over the rate limit, * before they are considered at all. -1 means just reject request, * 0 means no delay, otherwise it is the delay. * * maxWaitMs how long to blocking wait for the throttle semaphore. * * throttledRequests is the number of requests over the rate limit able to be * considered at once. * * throttleMs how long to async wait for semaphore. * * maxRequestMs how long to allow this request to run. * * maxIdleTrackerMs how long to keep track of request rates for a connection, * before deciding that the user has gone away, and discarding it * * insertHeaders if true , insert the DoSFilter headers into the response. Defaults to true. * * trackSessions if true, usage rate is tracked by session if a session exists. Defaults to true. * * remotePort if true and session tracking is not used, then rate is tracked by IP+port (effectively connection). Defaults to false. * * ipWhitelist a comma-separated list of IP addresses that will not be rate limited */ public class DoSFilter implements Filter { final static String __TRACKER = "DoSFilter.Tracker"; final static String __THROTTLED = "DoSFilter.Throttled"; final static int __DEFAULT_MAX_REQUESTS_PER_SEC = 25; final static int __DEFAULT_DELAY_MS = 100; final static int __DEFAULT_THROTTLE = 5; final static int __DEFAULT_WAIT_MS=50; final static long __DEFAULT_THROTTLE_MS = 30000L; final static long __DEFAULT_MAX_REQUEST_MS_INIT_PARAM=30000L; final static long __DEFAULT_MAX_IDLE_TRACKER_MS_INIT_PARAM=30000L; final static String MAX_REQUESTS_PER_S_INIT_PARAM = "maxRequestsPerSec"; final static String DELAY_MS_INIT_PARAM = "delayMs"; final static String THROTTLED_REQUESTS_INIT_PARAM = "throttledRequests"; final static String MAX_WAIT_INIT_PARAM="maxWaitMs"; final static String THROTTLE_MS_INIT_PARAM = "throttleMs"; final static String MAX_REQUEST_MS_INIT_PARAM="maxRequestMs"; final static String MAX_IDLE_TRACKER_MS_INIT_PARAM="maxIdleTrackerMs"; final static String INSERT_HEADERS_INIT_PARAM="insertHeaders"; final static String TRACK_SESSIONS_INIT_PARAM="trackSessions"; final static String REMOTE_PORT_INIT_PARAM="remotePort"; final static String IP_WHITELIST_INIT_PARAM="ipWhitelist"; final static int USER_AUTH = 2; final static int USER_SESSION = 2; final static int USER_IP = 1; final static int USER_UNKNOWN = 0; ServletContext _context; protected long _delayMs; protected long _throttleMs; protected long _waitMs; protected long _maxRequestMs; protected long _maxIdleTrackerMs; protected boolean _insertHeaders; protected boolean _trackSessions; protected boolean _remotePort; protected Semaphore _passes; protected Queue[] _queue; protected int _maxRequestsPerSec; protected final ConcurrentHashMap _rateTrackers=new ConcurrentHashMap(); private HashSet _whitelist; private final Timeout _requestTimeoutQ = new Timeout(); private final Timeout _trackerTimeoutQ = new Timeout(); private Thread _timerThread; private volatile boolean _running; public void init(FilterConfig filterConfig) { _context = filterConfig.getServletContext(); _queue = new Queue[getMaxPriority() + 1]; for (int p = 0; p < _queue.length; p++) _queue[p] = new ArrayQueue(); int baseRateLimit = __DEFAULT_MAX_REQUESTS_PER_SEC; if (filterConfig.getInitParameter(MAX_REQUESTS_PER_S_INIT_PARAM) != null) baseRateLimit = Integer.parseInt(filterConfig.getInitParameter(MAX_REQUESTS_PER_S_INIT_PARAM)); _maxRequestsPerSec = baseRateLimit; long delay = __DEFAULT_DELAY_MS; if (filterConfig.getInitParameter(DELAY_MS_INIT_PARAM) != null) delay = Integer.parseInt(filterConfig.getInitParameter(DELAY_MS_INIT_PARAM)); _delayMs = delay; int passes = __DEFAULT_THROTTLE; if (filterConfig.getInitParameter(THROTTLED_REQUESTS_INIT_PARAM) != null) passes = Integer.parseInt(filterConfig.getInitParameter(THROTTLED_REQUESTS_INIT_PARAM)); _passes = new Semaphore(passes,true); long wait = __DEFAULT_WAIT_MS; if (filterConfig.getInitParameter(MAX_WAIT_INIT_PARAM) != null) wait = Integer.parseInt(filterConfig.getInitParameter(MAX_WAIT_INIT_PARAM)); _waitMs = wait; long suspend = __DEFAULT_THROTTLE_MS; if (filterConfig.getInitParameter(THROTTLE_MS_INIT_PARAM) != null) suspend = Integer.parseInt(filterConfig.getInitParameter(THROTTLE_MS_INIT_PARAM)); _throttleMs = suspend; long maxRequestMs = __DEFAULT_MAX_REQUEST_MS_INIT_PARAM; if (filterConfig.getInitParameter(MAX_REQUEST_MS_INIT_PARAM) != null ) maxRequestMs = Long.parseLong(filterConfig.getInitParameter(MAX_REQUEST_MS_INIT_PARAM)); _maxRequestMs = maxRequestMs; long maxIdleTrackerMs = __DEFAULT_MAX_IDLE_TRACKER_MS_INIT_PARAM; if (filterConfig.getInitParameter(MAX_IDLE_TRACKER_MS_INIT_PARAM) != null ) maxIdleTrackerMs = Long.parseLong(filterConfig.getInitParameter(MAX_IDLE_TRACKER_MS_INIT_PARAM)); _maxIdleTrackerMs = maxIdleTrackerMs; String whitelistString = ""; if (filterConfig.getInitParameter(IP_WHITELIST_INIT_PARAM) !=null ) whitelistString = filterConfig.getInitParameter(IP_WHITELIST_INIT_PARAM); // empty if (whitelistString.length() == 0 ) _whitelist = new HashSet(); else { StringTokenizer tokenizer = new StringTokenizer(whitelistString, ","); _whitelist = new HashSet(tokenizer.countTokens()); while (tokenizer.hasMoreTokens()) _whitelist.add(tokenizer.nextToken().trim()); Log.info("Whitelisted IP addresses: {}", _whitelist.toString()); } String tmp = filterConfig.getInitParameter(INSERT_HEADERS_INIT_PARAM); _insertHeaders = tmp==null || Boolean.parseBoolean(tmp); tmp = filterConfig.getInitParameter(TRACK_SESSIONS_INIT_PARAM); _trackSessions = tmp==null || Boolean.parseBoolean(tmp); tmp = filterConfig.getInitParameter(REMOTE_PORT_INIT_PARAM); _remotePort = tmp!=null&& Boolean.parseBoolean(tmp); _requestTimeoutQ.setNow(); _requestTimeoutQ.setDuration(_maxRequestMs); _trackerTimeoutQ.setNow(); _trackerTimeoutQ.setDuration(_maxIdleTrackerMs); _running=true; _timerThread = (new Thread() { public void run() { try { while (_running) { synchronized (_requestTimeoutQ) { _requestTimeoutQ.setNow(); _requestTimeoutQ.tick(); _trackerTimeoutQ.setNow(_requestTimeoutQ.getNow()); _trackerTimeoutQ.tick(); } try { Thread.sleep(100); } catch (InterruptedException e) { Log.ignore(e); } } } finally { Log.debug("DoSFilter timer exited "); } } }); _timerThread.start(); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterchain) throws IOException, ServletException { final HttpServletRequest srequest = (HttpServletRequest)request; final HttpServletResponse sresponse = (HttpServletResponse)response; final long now=_requestTimeoutQ.getNow(); // Look for the rate tracker for this request RateTracker tracker = (RateTracker)request.getAttribute(__TRACKER); if (tracker==null) { // This is the first time we have seen this request. // get a rate tracker associated with this request, and record one hit tracker = getRateTracker(request); // Calculate the rate and check it is over the allowed limit final boolean overRateLimit = tracker.isRateExceeded(now); // pass it through if we are not currently over the rate limit if (!overRateLimit) { doFilterChain(filterchain,srequest,sresponse); return; } // We are over the limit. Log.warn("DOS ALERT: ip="+srequest.getRemoteAddr()+",session="+srequest.getRequestedSessionId()+",user="+srequest.getUserPrincipal()); // So either reject it, delay it or throttle it switch((int)_delayMs) { case -1: { // Reject this request if (_insertHeaders) ((HttpServletResponse)response).addHeader("DoSFilter","unavailable"); ((HttpServletResponse)response).sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); return; } case 0: { // fall through to throttle code request.setAttribute(__TRACKER,tracker); break; } default: { // insert a delay before throttling the request if (_insertHeaders) ((HttpServletResponse)response).addHeader("DoSFilter","delayed"); Continuation continuation = ContinuationSupport.getContinuation((HttpServletRequest)request,this); request.setAttribute(__TRACKER,tracker); continuation.suspend(_delayMs); // can fall through if this was a waiting continuation } } } // Throttle the request boolean accepted = false; try { // check if we can afford to accept another request at this time accepted = _passes.tryAcquire(_waitMs,TimeUnit.MILLISECONDS); if (!accepted) { // we were not accepted, so either we suspend to wait,or if we were woken up we insist or we fail final Continuation continuation = ContinuationSupport.getContinuation((HttpServletRequest)request,this); Boolean throttled = (Boolean)request.getAttribute(__THROTTLED); if (throttled!=Boolean.TRUE && _throttleMs>0) { int priority = getPriority(request,tracker); request.setAttribute(__THROTTLED,Boolean.TRUE); if (_insertHeaders) ((HttpServletResponse)response).addHeader("DoSFilter","throttled"); synchronized (this) { _queue[priority].add(continuation); continuation.reset(); if(continuation.suspend(_throttleMs)) { // handle waiting continuation strangeness // continuation was waiting and was resumed. _passes.acquire(); accepted = true; } // can fall through if this was a waiting continuation } } // else were we resumed? else if (continuation.isResumed()) { // we were resumed and somebody stole our pass, so we wait for the next one. _passes.acquire(); accepted = true; } } // if we were accepted (either immediately or after throttle) if (accepted) // call the chain doFilterChain(filterchain,srequest,sresponse); else { // fail the request if (_insertHeaders) ((HttpServletResponse)response).addHeader("DoSFilter","unavailable"); ((HttpServletResponse)response).sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); } } catch (InterruptedException e) { _context.log("DoS",e); ((HttpServletResponse)response).sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); } finally { if (accepted) { // wake up the next highest priority request. synchronized (_queue) { for (int p = _queue.length; p-- > 0;) { Continuation continuation = _queue[p].poll(); if (continuation != null) { continuation.resume(); break; } } } _passes.release(); } } } /** * @param chain * @param request * @param response * @throws IOException * @throws ServletException */ protected void doFilterChain(FilterChain chain, final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException { final Thread thread=Thread.currentThread(); final Timeout.Task requestTimeout = new Timeout.Task() { public void expired() { closeConnection(request, response, thread); } }; try { synchronized (_requestTimeoutQ) { _requestTimeoutQ.schedule(requestTimeout); } chain.doFilter(request,response); } finally { synchronized (_requestTimeoutQ) { requestTimeout.cancel(); } } } /** * Takes drastic measures to return this response and stop this thread. * Due to the way the connection is interrupted, may return mixed up headers. * @param request current request * @param response current response, which must be stopped * @param thread the handling thread */ protected void closeConnection(HttpServletRequest request, HttpServletResponse response, Thread thread) { // take drastic measures to return this response and stop this thread. if( !response.isCommitted() ) { response.setHeader("Connection", "close"); } try { try { response.getWriter().close(); } catch (IllegalStateException e) { response.getOutputStream().close(); } } catch (IOException e) { Log.warn(e); } // interrupt the handling thread thread.interrupt(); } /** * Get priority for this request, based on user type * * @param request * @param tracker * @return priority */ protected int getPriority(ServletRequest request, RateTracker tracker) { if (extractUserId(request)!=null) return USER_AUTH; if (tracker!=null) return tracker.getType(); return USER_UNKNOWN; } /** * @return the maximum priority that we can assign to a request */ protected int getMaxPriority() { return USER_AUTH; } /** * Return a request rate tracker associated with this connection; keeps * track of this connection's request rate. If this is not the first request * from this connection, return the existing object with the stored stats. * If it is the first request, then create a new request tracker. * * Assumes that each connection has an identifying characteristic, and goes * through them in order, taking the first that matches: user id (logged * in), session id, client IP address. Unidentifiable connections are lumped * into one. * * When a session expires, its rate tracker is automatically deleted. * * @param request * @return the request rate tracker for the current connection */ public RateTracker getRateTracker(ServletRequest request) { HttpServletRequest srequest = (HttpServletRequest)request; String loadId; final int type; loadId = extractUserId(request); HttpSession session=srequest.getSession(false); if (_trackSessions && session!=null && !session.isNew()) { loadId=session.getId(); type = USER_SESSION; } else { loadId = _remotePort?(request.getRemoteAddr()+request.getRemotePort()):request.getRemoteAddr(); type = USER_IP; } RateTracker tracker=_rateTrackers.get(loadId); if (tracker==null) { RateTracker t; if (_whitelist.contains(request.getRemoteAddr())) { t = new FixedRateTracker(loadId,type,_maxRequestsPerSec); } else { t = new RateTracker(loadId,type,_maxRequestsPerSec); } tracker=_rateTrackers.putIfAbsent(loadId,t); if (tracker==null) tracker=t; if (type == USER_IP) { // USER_IP expiration from _rateTrackers is handled by the _trackerTimeoutQ synchronized (_trackerTimeoutQ) { _trackerTimeoutQ.schedule(tracker); } } else if (session!=null) // USER_SESSION expiration from _rateTrackers are handled by the HttpSessionBindingListener session.setAttribute(__TRACKER,tracker); } return tracker; } public void destroy() { _running=false; _timerThread.interrupt(); synchronized (_requestTimeoutQ) { _requestTimeoutQ.cancelAll(); _trackerTimeoutQ.cancelAll(); } } /** * Returns the user id, used to track this connection. * This SHOULD be overridden by subclasses. * * @param request * @return a unique user id, if logged in; otherwise null. */ protected String extractUserId(ServletRequest request) { return null; } /** * A RateTracker is associated with a connection, and stores request rate * data. */ class RateTracker extends Timeout.Task implements HttpSessionBindingListener { protected final String _id; protected final int _type; protected final long[] _timestamps; protected int _next; public RateTracker(String id, int type,int maxRequestsPerSecond) { _id = id; _type = type; _timestamps=new long[maxRequestsPerSecond]; _next=0; } /** * @return the current calculated request rate over the last second */ public boolean isRateExceeded(long now) { final long last; synchronized (this) { last=_timestamps[_next]; _timestamps[_next]=now; _next= (_next+1)%_timestamps.length; } boolean exceeded=last!=0 && (now-last)<1000L; // System.err.println("rateExceeded? "+last+" "+(now-last)+" "+exceeded); return exceeded; } public String getId() { return _id; } public int getType() { return _type; } public void valueBound(HttpSessionBindingEvent event) { } public void valueUnbound(HttpSessionBindingEvent event) { _rateTrackers.remove(_id); } public void expired() { long now = _trackerTimeoutQ.getNow(); int latestIndex = _next == 0 ? 3 : (_next - 1 ) % _timestamps.length; long last=_timestamps[latestIndex]; boolean hasRecentRequest = last != 0 && (now-last)<1000L; if (hasRecentRequest) reschedule(); else _rateTrackers.remove(_id); } public String toString() { return "RateTracker/"+_id+"/"+_type; } } class FixedRateTracker extends RateTracker { public FixedRateTracker(String id, int type, int numRecentRequestsTracked) { super(id,type,numRecentRequestsTracked); } public boolean isRateExceeded(long now) { // rate limit is never exceeded, but we keep track of the request timestamps // so that we know whether there was recent activity on this tracker // and whether it should be expired synchronized (this) { _timestamps[_next]=now; _next= (_next+1)%_timestamps.length; } return false; } public String toString() { return "Fixed"+super.toString(); } } }jetty-6.1.26/modules/util5/src/main/java/org/mortbay/servlet/PutFilter.java0000644000175000017500000002626611106760033025337 0ustar moonmoon// ======================================================================== // $Id: ProxyServlet.java 800 2006-08-20 00:01:46Z gregw $ // Copyright 2004-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.UnavailableException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.util.IO; import org.mortbay.util.URIUtil; /** * PutFilter * * A Filter that handles PUT, DELETE and MOVE methods. * Files are hidden during PUT operations, so that 404's result. * * The following init paramters pay be used:

    *
  • baseURI - The file URI of the document root for put content. *
  • delAllowed - boolean, if true DELETE and MOVE methods are supported. *
* */ public class PutFilter implements Filter { public final static String __PUT="PUT"; public final static String __DELETE="DELETE"; public final static String __MOVE="MOVE"; public final static String __OPTIONS="OPTIONS"; Set _operations = new HashSet(); protected ConcurrentMap _hidden = new ConcurrentHashMap(); protected ServletContext _context; protected String _baseURI; protected boolean _delAllowed; /* ------------------------------------------------------------ */ public void init(FilterConfig config) throws ServletException { _context=config.getServletContext(); if (_context.getRealPath("/")==null) throw new UnavailableException("Packed war"); String b = config.getInitParameter("baseURI"); if (b != null) { _baseURI=b; } else { File base=new File(_context.getRealPath("/")); _baseURI=base.toURI().toString(); } _delAllowed = getInitBoolean(config,"delAllowed"); _operations.add(__OPTIONS); _operations.add(__PUT); if (_delAllowed) { _operations.add(__DELETE); _operations.add(__MOVE); } } /* ------------------------------------------------------------ */ private boolean getInitBoolean(FilterConfig config,String name) { String value = config.getInitParameter(name); return value != null && value.length() > 0 && (value.startsWith("t") || value.startsWith("T") || value.startsWith("y") || value.startsWith("Y") || value.startsWith("1")); } /* ------------------------------------------------------------ */ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)req; HttpServletResponse response=(HttpServletResponse)res; String servletPath =request.getServletPath(); String pathInfo = request.getPathInfo(); String pathInContext = URIUtil.addPaths(servletPath, pathInfo); String resource = URIUtil.addPaths(_baseURI,pathInContext); String method = request.getMethod(); boolean op = _operations.contains(method); if (op) { File file = null; try { if (method.equals(__OPTIONS)) handleOptions(request, response); else { file=new File(new URI(resource)); boolean exists = file.exists(); if (exists && !passConditionalHeaders(request, response, file)) return; if (method.equals(__PUT)) handlePut(request, response,pathInContext, file); else if (method.equals(__DELETE)) handleDelete(request, response, pathInContext, file); else if (method.equals(__MOVE)) handleMove(request, response, pathInContext, file); else throw new IllegalStateException(); } } catch(Exception e) { _context.log(e.toString(),e); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } else { if (isHidden(pathInContext)) response.sendError(HttpServletResponse.SC_NOT_FOUND); else chain.doFilter(request,response); return; } } /* ------------------------------------------------------------ */ private boolean isHidden(String pathInContext) { return _hidden.containsKey(pathInContext); } /* ------------------------------------------------------------ */ public void destroy() { } /* ------------------------------------------------------------------- */ public void handlePut(HttpServletRequest request, HttpServletResponse response, String pathInContext, File file) throws ServletException, IOException { boolean exists = file.exists(); if (pathInContext.endsWith("/")) { if (!exists) { if (!file.mkdirs()) response.sendError(HttpServletResponse.SC_FORBIDDEN); else { response.setStatus(HttpServletResponse.SC_CREATED); response.flushBuffer(); } } else { response.setStatus(HttpServletResponse.SC_OK); response.flushBuffer(); } } else { boolean ok=false; try { _hidden.put(pathInContext,pathInContext); File parent = file.getParentFile(); parent.mkdirs(); int toRead = request.getContentLength(); InputStream in = request.getInputStream(); OutputStream out = new FileOutputStream(file,false); if (toRead >= 0) IO.copy(in, out, toRead); else IO.copy(in, out); out.close(); response.setStatus(exists ? HttpServletResponse.SC_OK : HttpServletResponse.SC_CREATED); response.flushBuffer(); ok=true; } catch (Exception ex) { _context.log(ex.toString(),ex); response.sendError(HttpServletResponse.SC_FORBIDDEN); } finally { if (!ok) { try { if (file.exists()) file.delete(); } catch(Exception e) { _context.log(e.toString(),e); } } _hidden.remove(pathInContext); } } } /* ------------------------------------------------------------------- */ public void handleDelete(HttpServletRequest request, HttpServletResponse response, String pathInContext, File file) throws ServletException, IOException { try { // delete the file if (file.delete()) { response.setStatus(HttpServletResponse.SC_NO_CONTENT); response.flushBuffer(); } else response.sendError(HttpServletResponse.SC_FORBIDDEN); } catch (SecurityException sex) { _context.log(sex.toString(),sex); response.sendError(HttpServletResponse.SC_FORBIDDEN); } } /* ------------------------------------------------------------------- */ public void handleMove(HttpServletRequest request, HttpServletResponse response, String pathInContext, File file) throws ServletException, IOException, URISyntaxException { String newPath = URIUtil.canonicalPath(request.getHeader("new-uri")); if (newPath == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } String contextPath = request.getContextPath(); if (contextPath != null && !newPath.startsWith(contextPath)) { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); return; } String newInfo = newPath; if (contextPath != null) newInfo = newInfo.substring(contextPath.length()); String new_resource = URIUtil.addPaths(_baseURI,newInfo); File new_file=new File(new URI(new_resource)); file.renameTo(new_file); response.setStatus(HttpServletResponse.SC_NO_CONTENT); response.flushBuffer(); } /* ------------------------------------------------------------ */ public void handleOptions(HttpServletRequest request, HttpServletResponse response) throws IOException { // TODO implement throw new UnsupportedOperationException("Not Implemented"); } /* ------------------------------------------------------------ */ /* * Check modification date headers. */ protected boolean passConditionalHeaders(HttpServletRequest request, HttpServletResponse response, File file) throws IOException { long date = 0; if ((date = request.getDateHeader("if-unmodified-since")) > 0) { if (file.lastModified() / 1000 > date / 1000) { response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED); return false; } } if ((date = request.getDateHeader("if-modified-since")) > 0) { if (file.lastModified() / 1000 <= date / 1000) { response.reset(); response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); response.flushBuffer(); return false; } } return true; } } jetty-6.1.26/modules/util5/src/main/java/org/mortbay/util/0000755000175000017500000000000011745736472022056 5ustar moonmoonjetty-6.1.26/modules/util5/src/main/java/org/mortbay/util/ArrayQueue.java0000644000175000017500000002422311175544317024777 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.util; import java.util.AbstractList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import java.util.Queue; /* ------------------------------------------------------------ */ /** Queue backed by circular array. * * This partial Queue implementation (also with {@link #pop()} for stack operation) * is backed by a growable circular array. * * @author gregw * * @param */ public class ArrayQueue extends AbstractList implements Queue { public final int DEFAULT_CAPACITY=64; public final int DEFAULT_GROWTH=32; protected Object _lock=this; protected Object[] _elements; protected int _nextE; protected int _nextSlot; protected int _size; protected int _growCapacity; /* ------------------------------------------------------------ */ public ArrayQueue() { _elements=new Object[64]; _growCapacity=32; } /* ------------------------------------------------------------ */ public ArrayQueue(int capacity) { _elements=new Object[capacity]; _growCapacity=-1; } /* ------------------------------------------------------------ */ public ArrayQueue(int initCapacity,int growBy) { _elements=new Object[initCapacity]; _growCapacity=growBy; } /* ------------------------------------------------------------ */ public ArrayQueue(int initCapacity,int growBy,Object lock) { _elements=new Object[initCapacity]; _growCapacity=growBy; _lock=lock; } /* ------------------------------------------------------------ */ public int getCapacity() { return _elements.length; } /* ------------------------------------------------------------ */ @Override public boolean add(E e) { if (!offer(e)) throw new IllegalStateException("Full"); return true; } /* ------------------------------------------------------------ */ public boolean offer(E e) { synchronized(_lock) { if (_size==_elements.length && !grow()) return false; _size++; _elements[_nextSlot++]=e; if (_nextSlot==_elements.length) _nextSlot=0; } return true; } /* ------------------------------------------------------------ */ /** * Add without synchronization or bounds checking * @see #add(Object) */ public void addUnsafe(E e) { if (_size==_elements.length && !grow()) throw new IllegalStateException("Full"); _size++; _elements[_nextSlot++]=e; if (_nextSlot==_elements.length) _nextSlot=0; } /* ------------------------------------------------------------ */ public E element() { synchronized(_lock) { if (_size==0) throw new NoSuchElementException(); return (E)_elements[_nextE]; } } /* ------------------------------------------------------------ */ public E peek() { synchronized(_lock) { if (_size==0) return null; return (E)_elements[_nextE]; } } /* ------------------------------------------------------------ */ public E poll() { synchronized(_lock) { if (_size==0) return null; E e = (E)_elements[_nextE]; _elements[_nextE]=null; _size--; if (++_nextE==_elements.length) _nextE=0; return e; } } /* ------------------------------------------------------------ */ public E remove() { synchronized(_lock) { if (_size==0) throw new NoSuchElementException(); E e = (E)_elements[_nextE]; _elements[_nextE]=null; _size--; if (++_nextE==_elements.length) _nextE=0; return e; } } /* ------------------------------------------------------------ */ @Override public void clear() { synchronized(_lock) { _size=0; _nextE=0; _nextSlot=0; } } /* ------------------------------------------------------------ */ public boolean isEmpty() { synchronized(_lock) { return _size==0; } } /* ------------------------------------------------------------ */ @Override public int size() { return _size; } /* ------------------------------------------------------------ */ @Override public E get(int index) { synchronized(_lock) { if (index<0 || index>=_size) throw new IndexOutOfBoundsException("!("+0+"<"+index+"<="+_size+")"); int i = (_nextE+index)%_elements.length; return (E)_elements[i]; } } /* ------------------------------------------------------------ */ /** * Get without synchronization or bounds checking. * @see get(int) */ public E getUnsafe(int index) { int i = (_nextE+index)%_elements.length; return (E)_elements[i]; } /* ------------------------------------------------------------ */ public E remove(int index) { synchronized(_lock) { if (index<0 || index>=_size) throw new IndexOutOfBoundsException("!("+0+"<"+index+"<="+_size+")"); int i = (_nextE+index)%_elements.length; E old=(E)_elements[i]; if (i<_nextSlot) { // 0 _elements.length // _nextE........._nextSlot System.arraycopy(_elements,i+1,_elements,i,_nextSlot-i); _nextSlot--; _size--; } else { // 0 _elements.length // ......_nextSlot _nextE.......... System.arraycopy(_elements,i+1,_elements,i,_elements.length-i-1); if (_nextSlot>0) { _elements[_elements.length-1]=_elements[0]; System.arraycopy(_elements,1,_elements,0,_nextSlot-1); _nextSlot--; } else _nextSlot=_elements.length-1; _size--; } return old; } } /* ------------------------------------------------------------ */ public E set(int index, E element) { synchronized(_lock) { if (index<0 || index>=_size) throw new IndexOutOfBoundsException("!("+0+"<"+index+"<="+_size+")"); int i = _nextE+index; if (i>=_elements.length) i-=_elements.length; E old=(E)_elements[i]; _elements[i]=element; return old; } } /* ------------------------------------------------------------ */ public void add(int index, E element) { synchronized(_lock) { if (index<0 || index>_size) throw new IndexOutOfBoundsException("!("+0+"<"+index+"<="+_size+")"); if (_size==_elements.length && !grow()) throw new IllegalStateException("Full"); if (index==_size) { add(element); } else { int i = _nextE+index; if (i>=_elements.length) i-=_elements.length; _size++; _nextSlot++; if (_nextSlot==_elements.length) _nextSlot=0; if (i<_nextSlot) { // 0 _elements.length // _nextE.....i..._nextSlot // 0 _elements.length // ..i..._nextSlot _nextE.......... System.arraycopy(_elements,i,_elements,i+1,_nextSlot-i); _elements[i]=element; } else { // 0 _elements.length // ......_nextSlot _nextE.....i.... if (_nextSlot>0) { System.arraycopy(_elements,0,_elements,1,_nextSlot); _elements[0]=_elements[_elements.length-1]; } System.arraycopy(_elements,i,_elements,i+1,_elements.length-i-1); _elements[i]=element; } } } } protected boolean grow() { if (_growCapacity<=0) return false; Object[] elements=new Object[_elements.length+_growCapacity]; int split=_elements.length-_nextE; if (split>0) System.arraycopy(_elements,_nextE,elements,0,split); if (_nextE!=0) System.arraycopy(_elements,0,elements,split,_nextSlot); _elements=elements; _nextE=0; _nextSlot=_size; return true; } } jetty-6.1.26/modules/util5/pom.xml0000644000175000017500000000754511466510412015511 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-util5 Jetty JRE 1.5 Utilities Utility classes for Jetty using JRE 1.5 src/test/java **/*Test.java org/mortbay/**/*.xml **/Abstract*.java maven-compiler-plugin 1.5 1.5 maven-antrun-plugin clean clean run copyjar install run org.apache.felix maven-bundle-plugin ${maven-bundle-plugin-version} true manifest org.mortbay.jetty.util5 J2SE-1.5 !org.mortbay.*,org.slf4j;resolution:=optional,* http://jetty.mortbay.org org.apache.maven.plugins maven-jar-plugin ${project.build.outputDirectory}/META-INF/MANIFEST.MF junit junit test org.mortbay.jetty jetty-util ${project.version} org.mortbay.jetty servlet-api ${servlet-version} provided jetty-6.1.26/modules/plus/0000755000175000017500000000000011745736473014123 5ustar moonmoonjetty-6.1.26/modules/plus/src/0000755000175000017500000000000011745736472014711 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/0000755000175000017500000000000011745736472015670 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/0000755000175000017500000000000011745736472016611 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/org/0000755000175000017500000000000011745736472017400 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/org/mortbay/0000755000175000017500000000000011745736472021055 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736472022214 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/plus/0000755000175000017500000000000011745736472023177 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/plus/naming/0000755000175000017500000000000011745736472024450 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/plus/naming/TestNamingEntries.java0000644000175000017500000002242111102233535030672 0ustar moonmoon// ======================================================================== // $Id: TestNamingEntries.java 3957 2008-10-30 04:26:05Z janb $ // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.naming; import java.util.Hashtable; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; import javax.naming.spi.ObjectFactory; import junit.framework.TestCase; /** * TestEnvEntry * * */ public class TestNamingEntries extends TestCase { public class ScopeA extends Object { public String toString() { return this.getClass().getName()+"@"+super.hashCode(); } } public class ScopeB extends ScopeA {} public static class SomeObject { private int value; public SomeObject (int value) {this.value = value;} public int getValue () { return this.value; } } public static class SomeObjectFactory implements ObjectFactory { public SomeObjectFactory() { } /** * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable) * @param arg0 * @param arg1 * @param arg2 * @param arg3 * @return * @throws Exception */ public Object getObjectInstance(Object arg0, Name arg1, Context arg2, Hashtable arg3) throws Exception { Reference ref = (Reference)arg0; RefAddr refAddr = ref.get(0); String valueName = refAddr.getType(); if (!valueName.equalsIgnoreCase("val")) throw new RuntimeException("Unrecognized refaddr type = "+valueName); String value = (String)refAddr.getContent(); return new SomeObject(Integer.parseInt(value.trim())); } } public static class SomeOtherObject extends SomeObject implements Referenceable { private String svalue; public SomeOtherObject (String value) { super(Integer.parseInt(value.trim())); } /** * @see javax.naming.Referenceable#getReference() * @return * @throws NamingException */ public Reference getReference() throws NamingException { RefAddr refAddr = new StringRefAddr("val", String.valueOf(getValue())); Reference ref = new Reference(SomeOtherObject.class.getName(), refAddr, SomeOtherObjectFactory.class.getName(), null); return ref; } } public static class SomeOtherObjectFactory implements ObjectFactory { public SomeOtherObjectFactory() { } /** * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable) * @param arg0 * @param arg1 * @param arg2 * @param arg3 * @return * @throws Exception */ public Object getObjectInstance(Object arg0, Name arg1, Context arg2, Hashtable arg3) throws Exception { Reference ref = (Reference)arg0; RefAddr refAddr = ref.get(0); String valueName = refAddr.getType(); if (!valueName.equalsIgnoreCase("val")) throw new RuntimeException("Unrecognized refaddr type = "+valueName); String value = (String)refAddr.getContent(); return new SomeOtherObject(value.trim()); } } public SomeObject someObject; public void setUp () { this.someObject = new SomeObject(4); } public void testEnvEntryNoScope () throws Exception { EnvEntry ee = new EnvEntry("nameZ", "zstring", true); List list = NamingEntryUtil.lookupNamingEntries(null, EnvEntry.class); assertNotNull(list); assertFalse(list.isEmpty()); assertEquals(1, list.size()); Object o = list.get(0); assertTrue (o instanceof EnvEntry); EnvEntry eo = (EnvEntry)o; assertEquals ("nameZ", eo.getJndiName()); } public void testEnvEntryOverride () throws Exception { ScopeA scope = new ScopeA(); EnvEntry ee = new EnvEntry (scope, "nameA", someObject, true); NamingEntry ne = NamingEntryUtil.lookupNamingEntry(scope, "nameA"); assertNotNull(ne); assertTrue(ne instanceof EnvEntry); assertTrue (((EnvEntry)ne).isOverrideWebXml()); Context scopeContext = NamingEntryUtil.getContextForScope(scope); assertNotNull(scopeContext); Context namingEntriesContext = NamingEntryUtil.getContextForNamingEntries(scope); assertNotNull(namingEntriesContext); assertEquals(someObject, scopeContext.lookup("nameA")); } public void testEnvEntryNonOverride () throws Exception { ScopeA scope = new ScopeA(); EnvEntry ee = new EnvEntry (scope, "nameA", someObject, false); NamingEntry ne = NamingEntryUtil.lookupNamingEntry(scope, "nameA"); assertNotNull(ne); assertTrue(ne instanceof EnvEntry); assertFalse (((EnvEntry)ne).isOverrideWebXml()); Context scopeContext = NamingEntryUtil.getContextForScope(scope); assertNotNull(scopeContext); Context namingEntriesContext = NamingEntryUtil.getContextForNamingEntries(scope); assertNotNull(namingEntriesContext); assertEquals(someObject, scopeContext.lookup("nameA")); } public void testResource () throws Exception { InitialContext icontext = new InitialContext(); Resource resource = new Resource (null, "resourceA/b/c", someObject); NamingEntry ne = NamingEntryUtil.lookupNamingEntry(null, "resourceA/b/c"); assertNotNull(ne); assertTrue(ne instanceof Resource); assertEquals(icontext.lookup("resourceA/b/c"), someObject); Object scope = new ScopeA(); Resource resource2 = new Resource (scope, "resourceB", someObject); ne = NamingEntryUtil.lookupNamingEntry(scope, "resourceB"); assertNotNull(ne); assertTrue(ne instanceof Resource); ne = NamingEntryUtil.lookupNamingEntry(null, "resourceB"); assertNull(ne); ne = NamingEntryUtil.lookupNamingEntry(new ScopeB(), "resourceB"); assertNull(ne); } public void testLink () throws Exception { ScopeA scope = new ScopeA(); InitialContext icontext = new InitialContext(); Link link = new Link ("resourceA", "resourceB"); NamingEntry ne = NamingEntryUtil.lookupNamingEntry(null, "resourceA"); assertNotNull(ne); assertTrue(ne instanceof Link); assertEquals(icontext.lookup("resourceA"), "resourceB"); link = new Link (scope, "jdbc/resourceX", "jdbc/resourceY"); ne = NamingEntryUtil.lookupNamingEntry(scope, "jdbc/resourceX"); assertNotNull(ne); assertTrue(ne instanceof Link); } public void testResourceReferenceable () throws Exception { SomeOtherObject someOtherObj = new SomeOtherObject("100"); InitialContext icontext = new InitialContext(); Resource res = new Resource("resourceByReferenceable", someOtherObj); Object o = icontext.lookup("resourceByReferenceable"); assertNotNull(o); assertTrue (o instanceof SomeOtherObject); assertEquals(((SomeOtherObject)o).getValue(), 100); } public void testResourceReference () throws Exception { RefAddr refAddr = new StringRefAddr("val", "10"); Reference ref = new Reference(SomeObject.class.getName(), refAddr, SomeObjectFactory.class.getName(), null); InitialContext icontext = new InitialContext(); Resource resource = new Resource (null, "resourceByRef", ref); NamingEntry ne = NamingEntryUtil.lookupNamingEntry(null, "resourceByRef"); assertNotNull(ne); assertTrue (ne instanceof Resource); Object o = icontext.lookup("resourceByRef"); assertNotNull (o); assertTrue (o instanceof SomeObject); assertEquals(((SomeObject)o).getValue(), 10); } } jetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/plus/naming/TestNamingEntryUtil.java0000644000175000017500000000644011065421731031230 0ustar moonmoonpackage org.mortbay.jetty.plus.naming; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NameNotFoundException; import javax.naming.NamingException; import junit.framework.TestCase; public class TestNamingEntryUtil extends TestCase { public class MyNamingEntry extends NamingEntry { public MyNamingEntry(Object scope, String name, Object value) throws NamingException { super(scope, name, value); } } public class ScopeA extends Object { public String toString() { return this.getClass().getName()+"@"+super.hashCode(); } } public void testGetNameForScope () throws Exception { ScopeA scope = new ScopeA(); Name name = NamingEntryUtil.getNameForScope(scope); assertNotNull(name); assertEquals(scope.toString(), name.toString()); } public void testGetContextForScope() throws Exception { ScopeA scope = new ScopeA(); try { Context c = NamingEntryUtil.getContextForScope(scope); fail("context should not exist"); } catch (NameNotFoundException e) { //expected } InitialContext ic = new InitialContext(); Context scopeContext = ic.createSubcontext(NamingEntryUtil.getNameForScope(scope)); assertNotNull(scopeContext); try { Context c = NamingEntryUtil.getContextForScope(scope); assertNotNull(c); } catch (NameNotFoundException e) { fail(e.getMessage()); } } public void testMakeNamingEntryName () throws Exception { Name name = NamingEntryUtil.makeNamingEntryName(null, "fee/fi/fo/fum"); assertNotNull(name); assertEquals(NamingEntry.__contextName+"/fee/fi/fo/fum", name.toString()); } public void testLookupNamingEntry () throws Exception { ScopeA scope = new ScopeA(); NamingEntry ne = NamingEntryUtil.lookupNamingEntry(scope, "foo"); assertNull(ne); MyNamingEntry mne = new MyNamingEntry(scope, "foo", new Integer(9)); ne = NamingEntryUtil.lookupNamingEntry(scope, "foo"); assertNotNull(ne); assertEquals(ne, mne); } public void testLookupNamingEntries () throws Exception { ScopeA scope = new ScopeA(); List list = NamingEntryUtil.lookupNamingEntries(scope, MyNamingEntry.class); assertTrue(list.isEmpty()); MyNamingEntry mne1 = new MyNamingEntry(scope, "a/b", new Integer(1)); MyNamingEntry mne2 = new MyNamingEntry(scope, "a/c", new Integer(2)); ScopeA scope2 = new ScopeA(); MyNamingEntry mne3 = new MyNamingEntry(scope2, "a/b", new Integer(3)); list = NamingEntryUtil.lookupNamingEntries(scope, MyNamingEntry.class); assertEquals(2, list.size()); assertTrue (list.contains(mne1)); assertTrue (list.contains(mne2)); list = NamingEntryUtil.lookupNamingEntries(scope2, MyNamingEntry.class); assertEquals(1, list.size()); assertTrue(list.contains(mne3)); } } jetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/plus/jaas/0000755000175000017500000000000011745736472024115 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/plus/jaas/spi/0000755000175000017500000000000011745736472024710 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/plus/jaas/TestJAASUserRealm.java0000644000175000017500000002303011065421731030134 0ustar moonmoon// ======================================================================== // $Id: TestJAASUserRealm.java 3680 2008-09-21 10:37:13Z janb $ // Copyright 2003-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.PrintWriter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Statement; import java.util.Properties; import java.util.Random; import javax.naming.Context; import javax.naming.InitialContext; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.derby.jdbc.EmbeddedDataSource; import org.mortbay.jetty.Request; /* ---------------------------------------------------- */ /** TestJAASUserRealm *

Test JAAS in Jetty - relies on the JDBCUserRealm. * *

Notes

*

* *

Usage

*
 */
/*
 * 
* * @see * @version 1.0 Mon Apr 28 2003 * @author Jan Bartel (janb) */ public class TestJAASUserRealm extends TestCase { private static boolean setupDone = false; private Random random = new Random(); public TestJAASUserRealm(String name) throws Exception { super (name); } public static Test suite() { return new TestSuite(TestJAASUserRealm.class); } public void setUp () throws Exception { if (setupDone) return; //set up the properties File propsFile = File.createTempFile("props", null); propsFile.deleteOnExit(); Properties props = new Properties (); props.put("user", "user,user,pleb"); FileOutputStream fout=new FileOutputStream(propsFile); props.store(fout, ""); fout.close(); //set up config File configFile = File.createTempFile ("loginConf", null); configFile.deleteOnExit(); PrintWriter writer = new PrintWriter(new FileWriter(configFile)); writer.println ("props {"); writer.println ("org.mortbay.jetty.plus.jaas.spi.PropertyFileLoginModule required"); writer.println ("debug=\"true\""); writer.println ("file=\""+propsFile.getCanonicalPath().replace('\\','/') +"\";"); writer.println ("};"); writer.println ("ds {"); writer.println ("org.mortbay.jetty.plus.jaas.spi.DataSourceLoginModule required"); writer.println ("debug=\"true\""); writer.println ("dbJNDIName=\"ds\""); writer.println ("userTable=\"myusers\""); writer.println ("userField=\"myuser\""); writer.println ("credentialField=\"mypassword\""); writer.println ("userRoleTable=\"myuserroles\""); writer.println ("userRoleUserField=\"myuser\""); writer.println ("userRoleRoleField=\"myrole\";"); writer.println ("};"); writer.flush(); writer.close(); BufferedReader reader = new BufferedReader(new FileReader(configFile)); String s = ""; for (s = reader.readLine(); (s != null); s = reader.readLine()) { System.out.println (s); } //create a login module config file System.setProperty ("java.security.auth.login.config", configFile.toURL().toExternalForm()); setupDone = true; } public void testItDataSource () throws Exception { String tmpDir = System.getProperty("java.io.tmpdir")+System.getProperty("file.separator"); System.setProperty("derby.system.home", tmpDir); String dbname = "derby-"+(int)(random.nextDouble()*10000); EmbeddedDataSource eds = new EmbeddedDataSource(); Context comp = null; Context env = null; try { //make the java:comp/env InitialContext ic = new InitialContext(); comp = (Context)ic.lookup("java:comp"); env = comp.createSubcontext ("env"); //make a DataSource eds.setDatabaseName(dbname); eds.setCreateDatabase("create"); env.createSubcontext("jdbc"); env.bind("ds", eds); Connection connection = eds.getConnection(); //create tables String sql = "create table myusers (myuser varchar(32) PRIMARY KEY, mypassword varchar(32))"; Statement createStatement = connection.createStatement(); createStatement.executeUpdate (sql); sql = " create table myuserroles (myuser varchar(32), myrole varchar(32))"; createStatement.executeUpdate (sql); createStatement.close(); //insert test users and roles sql = "insert into myusers (myuser, mypassword) values (?, ?)"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString (1, "me"); statement.setString (2, "me"); statement.executeUpdate(); sql = "insert into myuserroles (myuser, myrole) values ( ? , ? )"; statement = connection.prepareStatement (sql); statement.setString (1, "me"); statement.setString (2, "roleA"); statement.executeUpdate(); statement.setString(1, "me"); statement.setString(2, "roleB"); statement.executeUpdate(); statement.close(); connection.close(); //create a JAASUserRealm JAASUserRealm realm = new JAASUserRealm ("testRealm"); realm.setLoginModuleName ("ds"); JAASUserPrincipal userPrincipal = (JAASUserPrincipal)realm.authenticate ("me", "blah",(Request)null); assertNull (userPrincipal); userPrincipal = (JAASUserPrincipal)realm.authenticate ("me", "me", (Request)null); assertNotNull (userPrincipal); assertNotNull (userPrincipal.getName()); assertTrue (userPrincipal.getName().equals("me")); assertTrue (userPrincipal.isUserInRole("roleA")); assertTrue (userPrincipal.isUserInRole("roleB")); assertTrue (!userPrincipal.isUserInRole("roleC")); realm.pushRole (userPrincipal, "roleC"); assertTrue (userPrincipal.isUserInRole("roleC")); assertTrue (!userPrincipal.isUserInRole("roleA")); assertTrue (!userPrincipal.isUserInRole("roleB")); realm.pushRole (userPrincipal, "roleD"); assertTrue (userPrincipal.isUserInRole("roleD")); assertTrue (!userPrincipal.isUserInRole("roleC")); assertTrue (!userPrincipal.isUserInRole("roleA")); assertTrue (!userPrincipal.isUserInRole("roleB")); realm.popRole(userPrincipal); assertTrue (userPrincipal.isUserInRole("roleC")); assertTrue (!userPrincipal.isUserInRole("roleA")); assertTrue (!userPrincipal.isUserInRole("roleB")); realm.popRole(userPrincipal); assertTrue (!userPrincipal.isUserInRole("roleC")); assertTrue (userPrincipal.isUserInRole("roleA")); realm.disassociate(userPrincipal); } finally { comp.destroySubcontext("env"); try { Connection c = eds.getConnection(); Statement s = c.createStatement(); s.executeUpdate("drop table myusers"); s.executeUpdate("drop table myuserroles"); s.close(); c.close(); } catch (Exception e) { e.printStackTrace(); } } } public void testItPropertyFile () throws Exception { //create a JAASUserRealm JAASUserRealm realm = new JAASUserRealm ("props"); realm.setLoginModuleName ("props"); JAASUserPrincipal userPrincipal = (JAASUserPrincipal)realm.authenticate ("user", "wrong",(Request)null); assertNull (userPrincipal); userPrincipal = (JAASUserPrincipal)realm.authenticate ("user", "user", (Request)null); assertNotNull (userPrincipal); assertTrue (userPrincipal.getName().equals("user")); assertTrue (userPrincipal.isUserInRole("pleb")); assertTrue (userPrincipal.isUserInRole("user")); assertTrue (!userPrincipal.isUserInRole("other")); realm.disassociate (userPrincipal); } public void tearDown () throws Exception { } } jetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/plus/webapp/0000755000175000017500000000000011745736472024455 5ustar moonmoonjetty-6.1.26/modules/plus/src/test/java/org/mortbay/jetty/plus/webapp/TestConfiguration.java0000644000175000017500000001124311065421731030750 0ustar moonmoonpackage org.mortbay.jetty.plus.webapp; import javax.naming.Context; import javax.naming.InitialContext; import org.mortbay.jetty.Server; import org.mortbay.jetty.plus.naming.EnvEntry; import org.mortbay.jetty.plus.naming.NamingEntry; import org.mortbay.jetty.plus.naming.NamingEntryUtil; import org.mortbay.jetty.webapp.WebAppContext; import junit.framework.TestCase; public class TestConfiguration extends TestCase { public class MyWebAppContext extends WebAppContext { public String toString() { return this.getClass().getName()+"@"+super.hashCode(); } } public void testIt () throws Exception { InitialContext ic = new InitialContext(); Server server = new Server(); WebAppContext wac = new MyWebAppContext(); wac.setServer(server); //bind some EnvEntrys at the server level EnvEntry ee1 = new EnvEntry(server, "xxx/a", "100", true); EnvEntry ee2 = new EnvEntry(server, "yyy/b", "200", false); EnvEntry ee3 = new EnvEntry(server, "zzz/c", "300", false); EnvEntry ee4 = new EnvEntry(server, "zzz/d", "400", false); EnvEntry ee5 = new EnvEntry(server, "zzz/f", "500", true); //bind some EnvEntrys at the webapp level EnvEntry ee6 = new EnvEntry(wac, "xxx/a", "900", true); EnvEntry ee7 = new EnvEntry(wac, "yyy/b", "910", true); EnvEntry ee8 = new EnvEntry(wac, "zzz/c", "920", false); EnvEntry ee9 = new EnvEntry(wac, "zzz/e", "930", false); assertNotNull(NamingEntryUtil.lookupNamingEntry(server, "xxx/a")); assertNotNull(NamingEntryUtil.lookupNamingEntry(server, "yyy/b")); assertNotNull(NamingEntryUtil.lookupNamingEntry(server, "zzz/c")); assertNotNull(NamingEntryUtil.lookupNamingEntry(server, "zzz/d")); assertNotNull(NamingEntryUtil.lookupNamingEntry(wac, "xxx/a")); assertNotNull(NamingEntryUtil.lookupNamingEntry(wac, "yyy/b")); assertNotNull(NamingEntryUtil.lookupNamingEntry(wac, "zzz/c")); assertNotNull(NamingEntryUtil.lookupNamingEntry(wac, "zzz/e")); Configuration config = new Configuration(); config.setWebAppContext(wac); EnvConfiguration envConfig = new EnvConfiguration(); envConfig.setWebAppContext(wac); envConfig.configureDefaults(); envConfig.bindEnvEntries(); String val = (String)ic.lookup("java:comp/env/xxx/a"); assertEquals("900", val); //webapp naming overrides server val = (String)ic.lookup("java:comp/env/yyy/b"); assertEquals("910", val);//webapp overrides server val = (String)ic.lookup("java:comp/env/zzz/c"); assertEquals("920",val);//webapp overrides server val = (String)ic.lookup("java:comp/env/zzz/d"); assertEquals("400", val);//from server naming val = (String)ic.lookup("java:comp/env/zzz/e"); assertEquals("930", val);//from webapp naming NamingEntry ne = (NamingEntry)ic.lookup("java:comp/env/"+NamingEntry.__contextName+"/xxx/a"); assertNotNull(ne); ne = (NamingEntry)ic.lookup("java:comp/env/"+NamingEntry.__contextName+"/yyy/b"); assertNotNull(ne); ne = (NamingEntry)ic.lookup("java:comp/env/"+NamingEntry.__contextName+"/zzz/c"); assertNotNull(ne); ne = (NamingEntry)ic.lookup("java:comp/env/"+NamingEntry.__contextName+"/zzz/d"); assertNotNull(ne); ne = (NamingEntry)ic.lookup("java:comp/env/"+NamingEntry.__contextName+"/zzz/e"); assertNotNull(ne); config.bindEnvEntry("foo", "99"); assertEquals("99",ic.lookup( "java:comp/env/foo")); config.bindEnvEntry("xxx/a", "7"); assertEquals("900", ic.lookup("java:comp/env/xxx/a")); //webapp overrides web.xml config.bindEnvEntry("yyy/b", "7"); assertEquals("910", ic.lookup("java:comp/env/yyy/b"));//webapp overrides web.xml config.bindEnvEntry("zzz/c", "7"); assertEquals("7", ic.lookup("java:comp/env/zzz/c"));//webapp does NOT override web.xml config.bindEnvEntry("zzz/d", "7"); assertEquals("7", ic.lookup("java:comp/env/zzz/d"));//server does NOT override web.xml config.bindEnvEntry("zzz/e", "7"); assertEquals("7", ic.lookup("java:comp/env/zzz/e"));//webapp does NOT override web.xml config.bindEnvEntry("zzz/f", "7"); assertEquals("500", ic.lookup("java:comp/env/zzz/f"));//server overrides web.xml ((Context)ic.lookup("java:comp")).destroySubcontext("env"); ic.destroySubcontext("xxx"); ic.destroySubcontext("yyy"); ic.destroySubcontext("zzz"); } } jetty-6.1.26/modules/plus/src/main/0000755000175000017500000000000011745736473015636 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/0000755000175000017500000000000011745736472016556 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/0000755000175000017500000000000011745736472017345 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/mortbay/0000755000175000017500000000000011745736472021022 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736472022161 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/0000755000175000017500000000000011745736473023145 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/servlet/0000755000175000017500000000000011745736472024630 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/servlet/ServletHandler.java0000644000175000017500000000665010545277301030410 0ustar moonmoon//======================================================================== //$Id: ServletHandler.java 1448 2006-12-29 20:46:57Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.servlet; import javax.servlet.Filter; import javax.servlet.Servlet; import org.mortbay.jetty.plus.annotation.InjectionCollection; import org.mortbay.jetty.plus.annotation.LifeCycleCallbackCollection; /** * ServletHandler * * */ public class ServletHandler extends org.mortbay.jetty.servlet.ServletHandler { private InjectionCollection _injections = null; private LifeCycleCallbackCollection _callbacks = null; /** * @return the callbacks */ public LifeCycleCallbackCollection getCallbacks() { return _callbacks; } /** * @param callbacks the callbacks to set */ public void setCallbacks(LifeCycleCallbackCollection callbacks) { this._callbacks = callbacks; } /** * @return the injections */ public InjectionCollection getInjections() { return _injections; } /** * @param injections the injections to set */ public void setInjections(InjectionCollection injections) { this._injections = injections; } /** * @see org.mortbay.jetty.servlet.ServletHandler#customizeFilter(javax.servlet.Filter) */ public Filter customizeFilter(Filter filter) throws Exception { if (_injections != null) _injections.inject(filter); if (_callbacks != null) _callbacks.callPostConstructCallback(filter); return super.customizeFilter(filter); } /** * @see org.mortbay.jetty.servlet.ServletHandler#customizeServlet(javax.servlet.Servlet) */ public Servlet customizeServlet(Servlet servlet) throws Exception { if (_injections != null) _injections.inject(servlet); if (_callbacks != null) _callbacks.callPostConstructCallback(servlet); return super.customizeServlet(servlet); } /** * @see org.mortbay.jetty.servlet.ServletHandler#cusomizeFilterDestroy(javax.servlet.Filter) */ public Filter customizeFilterDestroy(Filter filter) throws Exception { if (_callbacks != null) _callbacks.callPreDestroyCallback(filter); return super.customizeFilterDestroy(filter); } /** * @see org.mortbay.jetty.servlet.ServletHandler#customizeServletDestroy(javax.servlet.Servlet) */ public Servlet customizeServletDestroy(Servlet servlet) throws Exception { if (_callbacks != null) _callbacks.callPreDestroyCallback(servlet); return super.customizeServletDestroy(servlet); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/naming/0000755000175000017500000000000011745736472024415 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/naming/Transaction.java0000644000175000017500000000644111065421731027532 0ustar moonmoon// ======================================================================== // $Id: Transaction.java 3680 2008-09-21 10:37:13Z janb $ // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.naming; import javax.naming.*; import javax.transaction.UserTransaction; import org.mortbay.log.Log; import org.mortbay.naming.NamingUtil; /** * Transaction * * Class to represent a JTA UserTransaction impl. * * */ /** * Transaction * * */ public class Transaction extends NamingEntry { public static final String USER_TRANSACTION = "UserTransaction"; public static void bindToENC () throws NamingException { Transaction txEntry = (Transaction)NamingEntryUtil.lookupNamingEntry(null, Transaction.USER_TRANSACTION); if ( txEntry != null ) { txEntry.bindToComp(); } else { throw new NameNotFoundException( USER_TRANSACTION + " not found" ); } } public Transaction (UserTransaction userTransaction) throws NamingException { super (USER_TRANSACTION, userTransaction); } /** * Allow other bindings of UserTransaction. * * These should be in ADDITION to java:comp/UserTransaction * @see org.mortbay.jetty.plus.naming.NamingEntry#bindToENC(java.lang.String) */ public void bindToENC (String localName) throws NamingException { InitialContext ic = new InitialContext(); Context env = (Context)ic.lookup("java:comp/env"); Log.debug("Binding java:comp/env"+getJndiName()+" to "+objectNameString); NamingUtil.bind(env, localName, new LinkRef(objectNameString)); } /** * Insist on the java:comp/UserTransaction binding * @throws NamingException */ private void bindToComp () throws NamingException { //ignore the name, it is always bound to java:comp InitialContext ic = new InitialContext(); Context env = (Context)ic.lookup("java:comp"); Log.debug("Binding java:comp/"+getJndiName()+" to "+objectNameString); NamingUtil.bind(env, getJndiName(), new LinkRef(objectNameString)); } /** * Unbind this Transaction from a java:comp */ public void unbindENC () { try { InitialContext ic = new InitialContext(); Context env = (Context)ic.lookup("java:comp"); Log.debug("Unbinding java:comp/"+getJndiName()); env.unbind(getJndiName()); } catch (NamingException e) { Log.warn(e); } } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/naming/Resource.java0000644000175000017500000000255511065421731027036 0ustar moonmoon// ======================================================================== // $Id: Resource.java 3680 2008-09-21 10:37:13Z janb $ // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.naming; import javax.naming.NamingException; /** * Resource * * */ public class Resource extends NamingEntry { public Resource (Object scope, String jndiName, Object objToBind) throws NamingException { super(scope, jndiName, objToBind); } /** * @param jndiName * @param objToBind */ public Resource (String jndiName, Object objToBind) throws NamingException { super(jndiName, objToBind); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/naming/NamingEntryUtil.java0000644000175000017500000001414311102160646030331 0ustar moonmoonpackage org.mortbay.jetty.plus.naming; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.naming.Binding; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NameNotFoundException; import javax.naming.NameParser; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import org.mortbay.log.Log; public class NamingEntryUtil { /** * Link a name in a webapp's java:/comp/evn namespace to a pre-existing * resource. The pre-existing resource can be either in the webapp's * naming environment, or in the container's naming environment. Webapp's * environment takes precedence over the server's namespace. * * @param asName the name to bind as * @param mappedName the name from the environment to link to asName * @param namingEntryType * @throws NamingException */ public static boolean bindToENC (Object scope, String asName, String mappedName) throws NamingException { if (asName==null||asName.trim().equals("")) throw new NamingException ("No name for NamingEntry"); if (mappedName==null || "".equals(mappedName)) mappedName=asName; NamingEntry entry = lookupNamingEntry (scope, mappedName); if (entry == null) return false; entry.bindToENC(asName); return true; } /** * Find a NamingEntry instance. * * First the webapp's naming space is searched, and then * the container's. * * @param jndiName name to lookup * @return * @throws NamingException */ public static NamingEntry lookupNamingEntry (Object scope, String jndiName) throws NamingException { NamingEntry entry = null; try { Name scopeName = getNameForScope(scope); InitialContext ic = new InitialContext(); NameParser parser = ic.getNameParser(""); Name namingEntryName = makeNamingEntryName(parser, jndiName); scopeName.addAll(namingEntryName); entry = (NamingEntry)ic.lookup(scopeName); } catch (NameNotFoundException ee) { } return entry; } /** * Get all NameEntries of a certain type in the given naming * environment scope (server-wide names or context-specific names) * * @param scope * @param clazz the type of the entry * @return * @throws NamingException */ public static List lookupNamingEntries (Object scope, Class clazz) throws NamingException { try { Context scopeContext = getContextForScope(scope); Context namingEntriesContext = (Context)scopeContext.lookup(NamingEntry.__contextName); ArrayList list = new ArrayList(); lookupNamingEntries(list, namingEntriesContext, clazz); return list; } catch (NameNotFoundException e) { return Collections.EMPTY_LIST; } } public static Name makeNamingEntryName (NameParser parser, NamingEntry namingEntry) throws NamingException { return makeNamingEntryName(parser, (namingEntry==null?null:namingEntry.getJndiName())); } public static Name makeNamingEntryName (NameParser parser, String jndiName) throws NamingException { if (jndiName==null) return null; if (parser==null) { InitialContext ic = new InitialContext(); parser = ic.getNameParser(""); } Name name = parser.parse(""); name.add(NamingEntry.__contextName); name.addAll(parser.parse(jndiName)); return name; } public static Name getNameForScope (Object scope) { try { InitialContext ic = new InitialContext(); NameParser parser = ic.getNameParser(""); Name name = parser.parse(""); if (scope != null) { name.add(canonicalizeScope(scope)); } return name; } catch (NamingException e) { Log.warn(e); return null; } } public static Context getContextForScope(Object scope) throws NamingException { InitialContext ic = new InitialContext(); NameParser parser = ic.getNameParser(""); Name name = parser.parse(""); if (scope != null) { name.add(canonicalizeScope(scope)); } return (Context)ic.lookup(name); } public static Context getContextForNamingEntries (Object scope) throws NamingException { Context scopeContext = getContextForScope(scope); return (Context)scopeContext.lookup(NamingEntry.__contextName); } /** * Build up a list of NamingEntry objects that are of a specific type. * * @param list * @param context * @param clazz * @return * @throws NamingException */ private static List lookupNamingEntries (List list, Context context, Class clazz) throws NamingException { try { NamingEnumeration nenum = context.listBindings(""); while (nenum.hasMoreElements()) { Binding binding = (Binding)nenum.next(); if (binding.getObject() instanceof Context) lookupNamingEntries (list, (Context)binding.getObject(), clazz); else if (clazz.isInstance(binding.getObject())) list.add(binding.getObject()); } } catch (NameNotFoundException e) { Log.debug("No entries of type "+clazz.getName()+" in context="+context); } return list; } private static String canonicalizeScope(Object scope) { if (scope==null) return ""; String str = scope.toString(); str=str.replace('/', '_').replace(' ', '_'); return str; } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/naming/EnvEntry.java0000644000175000017500000000376611111264535027025 0ustar moonmoon// ======================================================================== // $Id: EnvEntry.java 4070 2008-11-20 13:42:53Z janb $ // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.naming; import java.util.ArrayList; import java.util.List; import javax.naming.Binding; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NameNotFoundException; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import org.mortbay.log.Log; import org.mortbay.naming.NamingUtil; /** * EnvEntry * * */ public class EnvEntry extends NamingEntry { private boolean overrideWebXml; public EnvEntry (Object scope, String jndiName, Object objToBind, boolean overrideWebXml) throws NamingException { super (scope, jndiName, objToBind); this.overrideWebXml = overrideWebXml; } public EnvEntry (String jndiName, Object objToBind, boolean overrideWebXml) throws NamingException { super(jndiName, objToBind); this.overrideWebXml = overrideWebXml; } public EnvEntry (String jndiName, Object objToBind) throws NamingException { this(jndiName, objToBind, false); } public boolean isOverrideWebXml () { return this.overrideWebXml; } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/naming/NamingEntry.java0000644000175000017500000001437311106425132027476 0ustar moonmoon// ======================================================================== // $Id: NamingEntry.java 4027 2008-11-12 00:59:06Z janb $ // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.naming; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.LinkRef; import javax.naming.Name; import javax.naming.NameParser; import javax.naming.NamingException; import org.mortbay.log.Log; import org.mortbay.naming.NamingUtil; /** * NamingEntry * * Base class for all jndi related entities. Instances of * subclasses of this class are declared in jetty.xml or in a * webapp's WEB-INF/jetty-env.xml file. * * NOTE: that all NamingEntries will be bound in a single namespace. * The "global" level is just in the top level context. The "local" * level is a context specific to a webapp. */ public abstract class NamingEntry { public static final String __contextName = "__"; //all NamingEntries stored in context called "__" protected String jndiName; //the name representing the object associated with the NamingEntry protected Object objectToBind; //the object associated with the NamingEntry protected String namingEntryNameString; //the name of the NamingEntry relative to the context it is stored in protected String objectNameString; //the name of the object relative to the context it is stored in public NamingEntry (Object scope, String jndiName, Object object) throws NamingException { this.jndiName = jndiName; this.objectToBind = object; save(scope); } /** * Create a NamingEntry. * A NamingEntry is a name associated with a value which can later * be looked up in JNDI by a webapp. * * We create the NamingEntry and put it into JNDI where it can * be linked to the webapp's env-entry, resource-ref etc entries. * * @param jndiName the name of the object which will eventually be in java:comp/env * @param object the object to be bound * @throws NamingException */ public NamingEntry (String jndiName, Object object) throws NamingException { this (null, jndiName, object); } /** * Add a java:comp/env binding for the object represented by this NamingEntry, * but bind it as the name supplied * @throws NamingException */ public void bindToENC(String localName) throws NamingException { //TODO - check on the whole overriding/non-overriding thing InitialContext ic = new InitialContext(); Context env = (Context)ic.lookup("java:comp/env"); Log.debug("Binding java:comp/env/"+localName+" to "+objectNameString); NamingUtil.bind(env, localName, new LinkRef(objectNameString)); } /** * Unbind this NamingEntry from a java:comp/env */ public void unbindENC () { try { InitialContext ic = new InitialContext(); Context env = (Context)ic.lookup("java:comp/env"); Log.debug("Unbinding java:comp/env/"+getJndiName()); env.unbind(getJndiName()); } catch (NamingException e) { Log.warn(e); } } /** * Unbind this NamingEntry entirely */ public void release () { try { InitialContext ic = new InitialContext(); ic.unbind(objectNameString); ic.unbind(namingEntryNameString); this.jndiName=null; this.namingEntryNameString=null; this.objectNameString=null; this.objectToBind=null; } catch (NamingException e) { Log.warn(e); } } /** * Get the unique name of the object * relative to the scope * @return */ public String getJndiName () { return this.jndiName; } /** * Get the object that is to be bound * @return */ public Object getObjectToBind() throws NamingException { return this.objectToBind; } /** * Get the name of the object, fully * qualified with the scope * @return */ public String getJndiNameInScope () { return objectNameString; } /** * Save the NamingEntry for later use. * * Saving is done by binding the NamingEntry * itself, and the value it represents into * JNDI. In this way, we can link to the * value it represents later, but also * still retrieve the NamingEntry itself too. * * The object is bound at the jndiName passed in. * This NamingEntry is bound at __/jndiName. * * eg * * jdbc/foo : DataSource * __/jdbc/foo : NamingEntry * * @throws NamingException */ protected void save (Object scope) throws NamingException { InitialContext ic = new InitialContext(); NameParser parser = ic.getNameParser(""); Name prefix = NamingEntryUtil.getNameForScope(scope); //bind the NamingEntry into the context Name namingEntryName = NamingEntryUtil.makeNamingEntryName(parser, getJndiName()); namingEntryName.addAll(0, prefix); namingEntryNameString = namingEntryName.toString(); NamingUtil.bind(ic, namingEntryNameString, this); //bind the object as well Name objectName = parser.parse(getJndiName()); objectName.addAll(0, prefix); objectNameString = objectName.toString(); NamingUtil.bind(ic, objectNameString, objectToBind); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/naming/Link.java0000644000175000017500000000271711065421731026144 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.naming; import javax.naming.NamingException; public class Link extends NamingEntry { public Link(Object scope, String jndiName, Object object) throws NamingException { //jndiName is the name according to the web.xml //objectToBind is the name in the environment super(scope, jndiName, object); } public Link (String jndiName, Object object) throws NamingException { super(null, jndiName, object); } public void bindToENC(String localName) throws NamingException { throw new UnsupportedOperationException("Method not supported for Link objects"); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/annotation/0000755000175000017500000000000011745736472025316 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/annotation/Injection.java0000644000175000017500000001505111106425132030060 0ustar moonmoon//======================================================================== //$Id: Injection.java 4027 2008-11-12 00:59:06Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.annotation; import java.lang.reflect.Field; import java.lang.reflect.Member; import java.lang.reflect.Method; import javax.naming.InitialContext; import javax.naming.NamingException; import org.mortbay.log.Log; import org.mortbay.util.IntrospectionUtil; /** * Injection * * Represents the injection of a resource into a target (method or field). * The injection is performed by doing an ENC lookup using the jndi * name provided, and setting the object obtained on the target. * */ public class Injection { private Class _targetClass; private String _jndiName; private String _mappingName; private Member _target; public Injection () {} /** * @return the _className */ public Class getTargetClass() { return _targetClass; } /** * @param name the _className to set */ public void setTargetClass(Class clazz) { _targetClass = clazz; } /** * @return the jndiName */ public String getJndiName() { return _jndiName; } /** * @param jndiName the jndiName to set */ public void setJndiName(String jndiName) { this._jndiName = jndiName; } /** * @return the mappingName */ public String getMappingName() { return _mappingName; } /** * @param mappingName the mappingName to set */ public void setMappingName(String mappingName) { this._mappingName = mappingName; } /** * @return the target */ public Member getTarget() { return _target; } /** * @param target the target to set */ public void setTarget(Member target) { this._target = target; } //TODO: define an equals method public void setTarget (Class clazz, String targetName, Class targetType) { //first look for a javabeans style setter matching the targetName String setter = "set"+targetName.substring(0,1).toUpperCase()+targetName.substring(1); try { Log.debug("Looking for method for setter: "+setter+" with arg "+targetType); _target = IntrospectionUtil.findMethod(clazz, setter, new Class[] {targetType}, true, false); _targetClass = clazz; } catch (NoSuchMethodException me) { //try as a field try { _target = IntrospectionUtil.findField(clazz, targetName, targetType, true, false); _targetClass = clazz; } catch (NoSuchFieldException fe) { throw new IllegalArgumentException("No such field or method "+targetName+" on class "+_targetClass); } } } /** * Inject a value for a Resource from JNDI into an object * @param injectable * @throws Exception */ public void inject (Object injectable) { Member theTarget = getTarget(); if (theTarget instanceof Field) { injectField((Field)theTarget, injectable); } else if (theTarget instanceof Method) { injectMethod((Method)theTarget, injectable); } } /** * The Resource must already exist in the ENC of this webapp. * @return * @throws Exception */ public Object lookupInjectedValue () throws NamingException { InitialContext context = new InitialContext(); return context.lookup("java:comp/env/"+getJndiName()); } /** * Inject value from jndi into a field of an instance * @param field * @param injectable */ public void injectField (Field field, Object injectable) { try { //validateInjection(field, injectable); boolean accessibility = field.isAccessible(); field.setAccessible(true); field.set(injectable, lookupInjectedValue()); field.setAccessible(accessibility); } catch (Exception e) { Log.warn(e); throw new IllegalStateException("Inject failed for field "+field.getName()); } } /** * Inject value from jndi into a setter method of an instance * @param method * @param injectable */ public void injectMethod (Method method, Object injectable) { //validateInjection(method, injectable); try { boolean accessibility = method.isAccessible(); method.setAccessible(true); method.invoke(injectable, new Object[] {lookupInjectedValue()}); method.setAccessible(accessibility); } catch (Exception e) { Log.warn(e); throw new IllegalStateException("Inject failed for method "+method.getName()); } } private void validateInjection (Method method, Object injectable) throws NoSuchMethodException { if ((injectable==null) || (method==null)) return; //check the injection target actually has a matching method //TODO: think about this, they have to be assignable injectable.getClass().getMethod(method.getName(), method.getParameterTypes()); } private void validateInjection (Field field, Object injectable) throws NoSuchFieldException { if ((field==null) || (injectable==null)) return; Field f = injectable.getClass().getField(field.getName()); if (!f.getType().isAssignableFrom(field.getType())) throw new NoSuchFieldException("Mismatching type of field: "+f.getType().getName()+" v "+field.getType().getName()); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/annotation/RunAsCollection.java0000644000175000017500000000346710565053323031221 0ustar moonmoon//======================================================================== //$Id: RunAsCollection.java 1604 2007-02-15 12:49:23Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.annotation; import java.util.HashMap; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.log.Log; /** * RunAsCollection * * */ public class RunAsCollection { private HashMap _runAsMap = new HashMap();//map of classname to run-as public void add (RunAs runAs) { if ((runAs==null) || (runAs.getTargetClass()==null)) return; if (Log.isDebugEnabled()) Log.debug("Adding run-as for class="+runAs.getTargetClass()); _runAsMap.put(runAs.getTargetClass().getName(), runAs); } public void setRunAs (Object o) { if (o==null) return; if (!(o instanceof ServletHolder)) return; ServletHolder holder = (ServletHolder)o; RunAs runAs = (RunAs)_runAsMap.get(holder.getClassName()); if (runAs == null) return; runAs.setRunAs(holder); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/annotation/PostConstructCallback.java0000644000175000017500000000437610554134152032422 0ustar moonmoon//======================================================================== //$Id: PostConstructCallback.java 1540 2007-01-19 12:24:10Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import org.mortbay.log.Log; /** * PostConstructCallback * * */ public class PostConstructCallback extends LifeCycleCallback { /** * Commons Annotation Specification section 2.5 * - no params * - must be void return * - no checked exceptions * - cannot be static * @see org.mortbay.jetty.plus.annotation.LifeCycleCallback#validate(java.lang.Class, java.lang.reflect.Method) */ public void validate(Class clazz, Method method) { if (method.getExceptionTypes().length > 0) throw new IllegalArgumentException(clazz.getName()+"."+method.getName()+ " cannot not throw a checked exception"); if (!method.getReturnType().equals(Void.TYPE)) throw new IllegalArgumentException(clazz.getName()+"."+method.getName()+ " cannot not have a return type"); if (Modifier.isStatic(method.getModifiers())) throw new IllegalArgumentException(clazz.getName()+"."+method.getName()+ " cannot be static"); } public void callback (Object instance) throws Exception { super.callback(instance); } public boolean equals (Object o) { if (super.equals(o) && (o instanceof PostConstructCallback)) return true; return false; } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/annotation/LifeCycleCallbackCollection.javajetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/annotation/LifeCycleCallbackCollectio0000644000175000017500000000710410554134152032335 0ustar moonmoon//======================================================================== //$Id: LifeCycleCallbackCollection.java 1540 2007-01-19 12:24:10Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.annotation; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.mortbay.log.Log; /** * LifeCycleCallbackCollection * * */ public class LifeCycleCallbackCollection { private HashMap postConstructCallbacksMap = new HashMap(); private HashMap preDestroyCallbacksMap = new HashMap(); /** * Add a Callback to the list of callbacks. * * @param callback */ public void add (LifeCycleCallback callback) { if ((callback==null) || (callback.getTargetClass()==null) || (callback.getTarget()==null)) return; if (Log.isDebugEnabled()) Log.debug("Adding callback for class="+callback.getTargetClass()+ " on "+callback.getTarget()); Map map = null; if (callback instanceof PreDestroyCallback) map = preDestroyCallbacksMap; if (callback instanceof PostConstructCallback) map = postConstructCallbacksMap; if (map == null) throw new IllegalArgumentException ("Unsupported lifecycle callback type: "+callback); List callbacks = (List)map.get(callback.getTargetClass()); if (callbacks==null) { callbacks = new ArrayList(); map.put(callback.getTargetClass(), callbacks); } //don't add another callback for exactly the same method if (!callbacks.contains(callback)) callbacks.add(callback); } /** * Call the method, if one exists, that is annotated with PostConstruct * or with <post-construct> in web.xml * @param o the object on which to attempt the callback * @throws Exception */ public void callPostConstructCallback (Object o) throws Exception { if (o == null) return; List callbacks = (List)postConstructCallbacksMap.get(o.getClass()); if (callbacks == null) return; for (int i=0;i 0) throw new IllegalArgumentException(clazz.getName()+"."+method.getName()+ " cannot not throw a checked exception"); if (!method.getReturnType().equals(Void.TYPE)) throw new IllegalArgumentException(clazz.getName()+"."+method.getName()+ " cannot not have a return type"); if (Modifier.isStatic(method.getModifiers())) throw new IllegalArgumentException(clazz.getName()+"."+method.getName()+ " cannot be static"); } public void callback(Object instance) { try { super.callback(instance); } catch (Exception e) { Log.warn("Ignoring exception thrown on preDestroy call to "+getTargetClass()+"."+getTarget().getName(), e); } } public boolean equals(Object o) { if (super.equals(o) && (o instanceof PreDestroyCallback)) return true; return false; } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/annotation/InjectionCollection.java0000644000175000017500000001053410554134152032102 0ustar moonmoon//======================================================================== //$Id: InjectionCollection.java 1540 2007-01-19 12:24:10Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.annotation; import java.lang.reflect.Field; import java.lang.reflect.Member; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.mortbay.log.Log; /** * InjectionCollection * * */ public class InjectionCollection { private HashMap fieldInjectionsMap = new HashMap();//map of classname to field injections private HashMap methodInjectionsMap = new HashMap();//map of classname to method injections public void add (Injection injection) { if ((injection==null) || (injection.getTarget()==null) || (injection.getTargetClass()==null)) return; if (Log.isDebugEnabled()) Log.debug("Adding injection for class="+injection.getTargetClass()+ " on a "+injection.getTarget()); Map injectionsMap = null; if (injection.getTarget() instanceof Field) injectionsMap = fieldInjectionsMap; if (injection.getTarget() instanceof Method) injectionsMap = methodInjectionsMap; List injections = (List)injectionsMap.get(injection.getTargetClass()); if (injections==null) { injections = new ArrayList(); injectionsMap.put(injection.getTargetClass(), injections); } injections.add(injection); } public List getFieldInjections (Class clazz) { if (clazz==null) return null; List list = (List)fieldInjectionsMap.get(clazz); return (list==null?Collections.EMPTY_LIST:list); } public List getMethodInjections (Class clazz) { if (clazz==null) return null; List list = (List)methodInjectionsMap.get(clazz); return (list==null?Collections.EMPTY_LIST:list); } public List getInjections (Class clazz) { if (clazz==null) return null; List results = new ArrayList(); results.addAll(getFieldInjections(clazz)); results.addAll(getMethodInjections(clazz)); return results; } public Injection getInjection (Class clazz, Member member) { if (clazz==null) return null; if (member==null) return null; Map map = null; if (member instanceof Field) map = fieldInjectionsMap; else if (member instanceof Method) map = methodInjectionsMap; if (map==null) return null; List injections = (List)map.get(clazz); Injection injection = null; for (int i=0;injections!=null && iImplements the JAAS version of the * org.mortbay.http.UserPrincipal interface. * * @version $Id: JAASUserPrincipal.java 1001 2006-09-23 09:31:51Z janb $ * @author Jan Bartel (janb) */ public class JAASUserPrincipal implements Principal { /* ------------------------------------------------ */ /** RoleStack *

* */ public static class RoleStack { private static ThreadLocal local = new ThreadLocal(); public static boolean empty () { Stack s = (Stack)local.get(); if (s == null) return false; return s.empty(); } public static void push (JAASRole role) { Stack s = (Stack)local.get(); if (s == null) { s = new Stack(); local.set (s); } s.push (role); } public static void pop () { Stack s = (Stack)local.get(); if ((s == null) || s.empty()) return; s.pop(); } public static JAASRole peek () { Stack s = (Stack)local.get(); if ((s == null) || (s.empty())) return null; return (JAASRole)s.peek(); } public static void clear () { Stack s = (Stack)local.get(); if ((s == null) || (s.empty())) return; s.clear(); } } private Subject subject = null; private JAASUserRealm realm = null; private static RoleStack runAsRoles = new RoleStack(); private RoleCheckPolicy roleCheckPolicy = null; private String name = null; private LoginContext loginContext = null; /* ------------------------------------------------ */ /** Constructor. * @param name the name identifying the user */ public JAASUserPrincipal(JAASUserRealm realm, String name) { this.name = name; this.realm = realm; } public JAASUserRealm getRealm() { return this.realm; } /* ------------------------------------------------ */ /** Check if user is in role * @param roleName role to check * @return true or false accordint to the RoleCheckPolicy. */ public boolean isUserInRole (String roleName) { if (roleCheckPolicy == null) roleCheckPolicy = new StrictRoleCheckPolicy(); return roleCheckPolicy.checkRole (roleName, runAsRoles.peek(), getRoles()); } /* ------------------------------------------------ */ /** Determine the roles that the LoginModule has set * @return A {@link Group} of {@link Principal Principals} representing the roles this user holds */ public Group getRoles () { return getRealm().getRoles(this); } /* ------------------------------------------------ */ /** Set the type of checking for isUserInRole * @param policy */ public void setRoleCheckPolicy (RoleCheckPolicy policy) { roleCheckPolicy = policy; } /* ------------------------------------------------ */ /** Temporarily associate a user with a role. * @param roleName */ public void pushRole (String roleName) { runAsRoles.push (new JAASRole(roleName)); } /* ------------------------------------------------ */ /** Remove temporary association between user and role. */ public void popRole () { runAsRoles.pop (); } /* ------------------------------------------------ */ /** Clean out any pushed roles that haven't been popped */ public void disassociate () { runAsRoles.clear(); } /* ------------------------------------------------ */ /** Get the name identifying the user */ public String getName () { return name; } /* ------------------------------------------------ */ /** Sets the JAAS subject for this user. * The subject contains: *

    *
  • the user's credentials *
  • Principal for the user's roles * @param subject */ protected void setSubject (Subject subject) { this.subject = subject; } /* ------------------------------------------------ */ /** Provide access to the current Subject */ public Subject getSubject () { return this.subject; } protected void setLoginContext (LoginContext loginContext) { this.loginContext = loginContext; } protected LoginContext getLoginContext () { return this.loginContext; } public String toString() { return getName(); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/RoleCheckPolicy.java0000644000175000017500000000277010505177407027740 0ustar moonmoon// ======================================================================== // $Id: RoleCheckPolicy.java 1001 2006-09-23 09:31:51Z janb $ // Copyright 2003-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas; import java.security.Principal; import java.security.acl.Group; public interface RoleCheckPolicy { /* ------------------------------------------------ */ /** Check if a role is either a runAsRole or in a set of roles * @param roleName the role to check * @param runAsRole a pushed role (can be null) * @param roles a Group whose Principals are role names * @return true if role equals runAsRole or is a member of roles. */ public boolean checkRole (String roleName, Principal runAsRole, Group roles); } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/JAASPrincipal.java0000644000175000017500000000352310403260456027270 0ustar moonmoon// ======================================================================== // $Id: JAASPrincipal.java 305 2006-03-07 10:32:14Z janb $ // Copyright 2002-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas; import java.io.Serializable; import java.security.Principal; /* ---------------------------------------------------- */ /** JAASPrincipal *

    Impl class of Principal interface. * *

    Notes

    *

    * *

    Usage

    *
     */
    /*
     * 
    * * @see * @version 1.0 Tue Apr 15 2003 * @author Jan Bartel (janb) */ public class JAASPrincipal implements Principal, Serializable { private String name = null; public JAASPrincipal(String userName) { this.name = userName; } public boolean equals (Object p) { if (! (p instanceof JAASPrincipal)) return false; return getName().equals(((JAASPrincipal)p).getName()); } public int hashCode () { return getName().hashCode(); } public String getName () { return this.name; } public String toString () { return getName(); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/JAASRole.java0000644000175000017500000000227710403260456026255 0ustar moonmoon// ======================================================================== // $Id: JAASRole.java 305 2006-03-07 10:32:14Z janb $ // Copyright 2003-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas; public class JAASRole extends JAASPrincipal { public JAASRole(String name) { super (name); } public boolean equals (Object o) { if (! (o instanceof JAASRole)) return false; return getName().equals(((JAASRole)o).getName()); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/SSOJAASUserRealm.java0000644000175000017500000000721611173372264027644 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.jaas; // ======================================================================== // $Id: SSOJAASUserRealm.java 1001 2008-02-01 09:31:51Z fred nizery $ // // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== import java.security.Principal; import org.mortbay.jetty.Request; import org.mortbay.jetty.Response; import org.mortbay.jetty.security.Credential; import org.mortbay.jetty.security.SSORealm; /* ---------------------------------------------------- */ /** SSOJAASUserRealm *

    * *

    Notes

    *

    * *

    Usage

    * For SSO realm that uses JAAS * The configuration must be the same as for JAASUserRealm plus * injection of an instance of class HashSSORealm using setSSORealm() * methode. This is intended to be used with the correct LoginModule * and its fitting .conf configuration file as described in JAAS documentation. * * @author Frederic Nizery * * @org.apache.xbean.XBean element="ssoJaasUserRealm" description="Creates a UserRealm suitable for use with JAAS w/ support of SSO" */ public class SSOJAASUserRealm extends JAASUserRealm implements SSORealm { private SSORealm _ssoRealm; /** Set the SSORealm. * A SSORealm implementation may be set to enable support for SSO. * @param ssoRealm The SSORealm to delegate single sign on requests to. */ public void setSSORealm(SSORealm ssoRealm) { _ssoRealm = ssoRealm; } /* ------------------------------------------------------------ */ public Credential getSingleSignOn(Request request,Response response) { if (_ssoRealm!=null) return _ssoRealm.getSingleSignOn(request,response); return null; } /* ------------------------------------------------------------ */ public void setSingleSignOn(Request request,Response response,Principal principal,Credential credential) { if (_ssoRealm!=null) _ssoRealm.setSingleSignOn(request,response,principal,credential); } /* ------------------------------------------------------------ */ public void clearSingleSignOn(String username) { if (_ssoRealm!=null) _ssoRealm.clearSingleSignOn(username); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/StrictRoleCheckPolicy.java0000644000175000017500000000423610505177407031130 0ustar moonmoon// ======================================================================== // $Id: StrictRoleCheckPolicy.java 1001 2006-09-23 09:31:51Z janb $ // Copyright 2003-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas; import java.security.Principal; import java.security.acl.Group; import java.util.Enumeration; /* ---------------------------------------------------- */ /** StrictRoleCheckPolicy *

    Enforces that if a runAsRole is present, then the * role to check must be the same as that runAsRole and * the set of static roles is ignored. * * * * @org.apache.xbean.XBean description ="Check only topmost role in stack of roles for user" */ public class StrictRoleCheckPolicy implements RoleCheckPolicy { public boolean checkRole (String roleName, Principal runAsRole, Group roles) { //check if this user has had any temporary role pushed onto //them. If so, then only check if the user has that role. if (runAsRole != null) { return (roleName.equals(runAsRole.getName())); } else { if (roles == null) return false; Enumeration rolesEnum = roles.members(); boolean found = false; while (rolesEnum.hasMoreElements() && !found) { Principal p = (Principal)rolesEnum.nextElement(); found = roleName.equals(p.getName()); } return found; } } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/JAASGroup.java0000644000175000017500000000644710403260456026453 0ustar moonmoon// ======================================================================== // $Id: JAASGroup.java 305 2006-03-07 10:32:14Z janb $ // Copyright 2002-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas; import java.security.Principal; import java.security.acl.Group; import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; public class JAASGroup implements Group { public static final String ROLES = "__roles__"; private String name = null; private HashSet members = null; public JAASGroup(String n) { this.name = n; this.members = new HashSet(); } /* ------------------------------------------------------------ */ /** * * @param principal * @return */ public synchronized boolean addMember(Principal principal) { return members.add(principal); } /** * * @param principal * @return */ public synchronized boolean removeMember(Principal principal) { return members.remove(principal); } /** * * @param principal * @return */ public boolean isMember(Principal principal) { return members.contains(principal); } /** * * @return */ public Enumeration members() { class MembersEnumeration implements Enumeration { private Iterator itor; public MembersEnumeration (Iterator itor) { this.itor = itor; } public boolean hasMoreElements () { return this.itor.hasNext(); } public Object nextElement () { return this.itor.next(); } } return new MembersEnumeration (members.iterator()); } /** * * @return */ public int hashCode() { return getName().hashCode(); } /** * * @param object * @return */ public boolean equals(Object object) { if (! (object instanceof JAASGroup)) return false; return ((JAASGroup)object).getName().equals(getName()); } /** * * @return */ public String toString() { return getName(); } /** * * @return */ public String getName() { return name; } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/spi/0000755000175000017500000000000011745736473024656 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/spi/JDBCLoginModule.java0000644000175000017500000000762210422774361030356 0ustar moonmoon// ======================================================================== // $Id: JDBCLoginModule.java 478 2006-04-23 22:00:17Z gregw $ // Copyright 2002-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas.spi; import java.sql.Connection; import java.sql.DriverManager; import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import org.mortbay.log.Log; import org.mortbay.util.Loader; /* ---------------------------------------------------- */ /** JDBCLoginModule *

    JAAS LoginModule to retrieve user information from * a database and authenticate the user. * *

    Notes

    *

    This version uses plain old JDBC connections NOT * Datasources. * *

    Usage

    *
     */
    /*
     * 
    * * @see * @version 1.0 Tue Apr 15 2003 * @author Jan Bartel (janb) */ public class JDBCLoginModule extends AbstractDatabaseLoginModule { private String dbDriver; private String dbUrl; private String dbUserName; private String dbPassword; /** * Get a connection from the DriverManager * @see org.mortbay.jetty.plus.jaas.spi.AbstractDatabaseLoginModule#getConnection() * @return * @throws Exception */ public Connection getConnection () throws Exception { if (!((dbDriver != null) && (dbUrl != null))) throw new IllegalStateException ("Database connection information not configured"); if(Log.isDebugEnabled())Log.debug("Connecting using dbDriver="+dbDriver+"+ dbUserName="+dbUserName+", dbPassword="+dbUrl); return DriverManager.getConnection (dbUrl, dbUserName, dbPassword); } /* ------------------------------------------------ */ /** Init LoginModule. * Called once by JAAS after new instance created. * @param subject * @param callbackHandler * @param sharedState * @param options */ public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { try { super.initialize(subject, callbackHandler, sharedState, options); //get the jdbc username/password, jdbc url out of the options dbDriver = (String)options.get("dbDriver"); dbUrl = (String)options.get("dbUrl"); dbUserName = (String)options.get("dbUserName"); dbPassword = (String)options.get("dbPassword"); if (dbUserName == null) dbUserName = ""; if (dbPassword == null) dbPassword = ""; if (dbDriver != null) Loader.loadClass(this.getClass(), dbDriver).newInstance(); } catch (ClassNotFoundException e) { throw new IllegalStateException (e.toString()); } catch (InstantiationException e) { throw new IllegalStateException (e.toString()); } catch (IllegalAccessException e) { throw new IllegalStateException (e.toString()); } } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/spi/AbstractLoginModule.java0000644000175000017500000001735610452464772031431 0ustar moonmoon// ======================================================================== // $Id: AbstractLoginModule.java 641 2006-07-04 13:15:38Z tvernum $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas.spi; import java.io.IOException; import java.security.Principal; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.UnsupportedCallbackException; import javax.security.auth.login.LoginException; import javax.security.auth.spi.LoginModule; import org.mortbay.jetty.plus.jaas.JAASPrincipal; import org.mortbay.jetty.plus.jaas.JAASRole; import org.mortbay.jetty.plus.jaas.callback.ObjectCallback; /** * AbstractLoginModule * * Abstract base class for all LoginModules. Subclasses should * just need to implement getUserInfo method. * */ public abstract class AbstractLoginModule implements LoginModule { private CallbackHandler callbackHandler; private boolean authState = false; private boolean commitState = false; private JAASUserInfo currentUser; private Subject subject; public class JAASUserInfo { private UserInfo user; private Principal principal; private List roles; public JAASUserInfo (UserInfo u) { setUserInfo(u); } public String getUserName () { return this.user.getUserName(); } public Principal getPrincipal() { return this.principal; } public void setUserInfo (UserInfo u) { this.user = u; this.principal = new JAASPrincipal(u.getUserName()); this.roles = new ArrayList(); if (u.getRoleNames() != null) { Iterator itor = u.getRoleNames().iterator(); while (itor.hasNext()) this.roles.add(new JAASRole((String)itor.next())); } } public void setJAASInfo (Subject subject) { subject.getPrincipals().add(this.principal); subject.getPrivateCredentials().add(this.user.getCredential()); subject.getPrincipals().addAll(roles); } public void unsetJAASInfo (Subject subject) { subject.getPrincipals().remove(this.principal); subject.getPrivateCredentials().remove(this.user.getCredential()); subject.getPrincipals().removeAll(this.roles); } public boolean checkCredential (Object suppliedCredential) { return this.user.checkCredential(suppliedCredential); } } public Subject getSubject () { return this.subject; } public void setSubject (Subject s) { this.subject = s; } public JAASUserInfo getCurrentUser() { return this.currentUser; } public void setCurrentUser (JAASUserInfo u) { this.currentUser = u; } public CallbackHandler getCallbackHandler() { return this.callbackHandler; } public void setCallbackHandler(CallbackHandler h) { this.callbackHandler = h; } public boolean isAuthenticated() { return this.authState; } public boolean isCommitted () { return this.commitState; } public void setAuthenticated (boolean authState) { this.authState = authState; } public void setCommitted (boolean commitState) { this.commitState = commitState; } /** * @see javax.security.auth.spi.LoginModule#abort() * @throws LoginException */ public boolean abort() throws LoginException { this.currentUser = null; return (isAuthenticated() && isCommitted()); } /** * @see javax.security.auth.spi.LoginModule#commit() * @return * @throws LoginException */ public boolean commit() throws LoginException { if (!isAuthenticated()) { currentUser = null; setCommitted(false); return false; } setCommitted(true); currentUser.setJAASInfo(subject); return true; } public Callback[] configureCallbacks () { Callback[] callbacks = new Callback[2]; callbacks[0] = new NameCallback("Enter user name"); callbacks[1] = new ObjectCallback(); return callbacks; } public abstract UserInfo getUserInfo (String username) throws Exception; /** * @see javax.security.auth.spi.LoginModule#login() * @return * @throws LoginException */ public boolean login() throws LoginException { try { if (callbackHandler == null) throw new LoginException ("No callback handler"); Callback[] callbacks = configureCallbacks(); callbackHandler.handle(callbacks); String webUserName = ((NameCallback)callbacks[0]).getName(); Object webCredential = ((ObjectCallback)callbacks[1]).getObject(); if ((webUserName == null) || (webCredential == null)) { setAuthenticated(false); return isAuthenticated(); } UserInfo userInfo = getUserInfo(webUserName); if (userInfo == null) { setAuthenticated(false); return isAuthenticated(); } currentUser = new JAASUserInfo(userInfo); setAuthenticated(currentUser.checkCredential(webCredential)); return isAuthenticated(); } catch (IOException e) { throw new LoginException (e.toString()); } catch (UnsupportedCallbackException e) { throw new LoginException (e.toString()); } catch (Exception e) { e.printStackTrace(); throw new LoginException (e.toString()); } } /** * @see javax.security.auth.spi.LoginModule#logout() * @return * @throws LoginException */ public boolean logout() throws LoginException { this.currentUser.unsetJAASInfo(this.subject); return true; } /** * @see javax.security.auth.spi.LoginModule#initialize(javax.security.auth.Subject, javax.security.auth.callback.CallbackHandler, java.util.Map, java.util.Map) * @param subject * @param callbackHandler * @param sharedState * @param options */ public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { this.callbackHandler = callbackHandler; this.subject = subject; } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/spi/PropertyFileLoginModule.java0000644000175000017500000001277510422774361032305 0ustar moonmoon// ======================================================================== // $Id: PropertyFileLoginModule.java 478 2006-04-23 22:00:17Z gregw $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas.spi; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; import java.util.StringTokenizer; import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import org.mortbay.jetty.security.Credential; import org.mortbay.log.Log; /** * PropertyFileLoginModule * * */ public class PropertyFileLoginModule extends AbstractLoginModule { public static final String DEFAULT_FILENAME = "realm.properties"; public static final Map fileMap = new HashMap(); private String propertyFileName; /** * Read contents of the configured property file. * * @see javax.security.auth.spi.LoginModule#initialize(javax.security.auth.Subject, javax.security.auth.callback.CallbackHandler, java.util.Map, java.util.Map) * @param subject * @param callbackHandler * @param sharedState * @param options */ public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { super.initialize(subject, callbackHandler, sharedState, options); loadProperties((String)options.get("file")); } public void loadProperties (String filename) { File propsFile; if (filename == null) { propsFile = new File(System.getProperty("user.dir"), DEFAULT_FILENAME); //look for a file called realm.properties in the current directory //if that fails, look for a file called realm.properties in $jetty.home/etc if (!propsFile.exists()) propsFile = new File(System.getProperty("jetty.home"), DEFAULT_FILENAME); } else { propsFile = new File(filename); } //give up, can't find a property file to load if (!propsFile.exists()) { Log.warn("No property file found"); throw new IllegalStateException ("No property file specified in login module configuration file"); } try { this.propertyFileName = propsFile.getCanonicalPath(); if (fileMap.get(propertyFileName) != null) { if (Log.isDebugEnabled()) {Log.debug("Properties file "+propertyFileName+" already in cache, skipping load");} return; } Map userInfoMap = new HashMap(); Properties props = new Properties(); props.load(new FileInputStream(propsFile)); Iterator iter = props.entrySet().iterator(); while(iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); String username=entry.getKey().toString().trim(); String credentials=entry.getValue().toString().trim(); String roles=null; int c=credentials.indexOf(','); if (c>0) { roles=credentials.substring(c+1).trim(); credentials=credentials.substring(0,c).trim(); } if (username!=null && username.length()>0 && credentials!=null && credentials.length()>0) { ArrayList roleList = new ArrayList(); if(roles!=null && roles.length()>0) { StringTokenizer tok = new StringTokenizer(roles,", "); while (tok.hasMoreTokens()) roleList.add(tok.nextToken()); } userInfoMap.put(username, (new UserInfo(username, Credential.getCredential(credentials.toString()), roleList))); } } fileMap.put(propertyFileName, userInfoMap); } catch (Exception e) { Log.warn("Error loading properties from file", e); throw new RuntimeException(e); } } /** * Don't implement this as we want to pre-fetch all of the * users. * @see org.mortbay.jetty.plus.jaas.spi.AbstractLoginModule#lazyLoadUser(java.lang.String) * @param username * @throws Exception */ public UserInfo getUserInfo (String username) throws Exception { Map userInfoMap = (Map)fileMap.get(propertyFileName); if (userInfoMap == null) return null; return (UserInfo)userInfoMap.get(username); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/spi/AbstractDatabaseLoginModule.javajetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/spi/AbstractDatabaseLoginModule.0000644000175000017500000001142611044241037032165 0ustar moonmoon// ======================================================================== // $Id: AbstractDatabaseLoginModule.java 3463 2008-07-31 04:39:59Z dyu $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas.spi; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import org.mortbay.jetty.security.Credential; import org.mortbay.log.Log; /** * AbstractDatabaseLoginModule * * Abstract base class for LoginModules that interact with a * database to retrieve authentication and authorization information. * Used by the JDBCLoginModule and DataSourceLoginModule. * */ public abstract class AbstractDatabaseLoginModule extends AbstractLoginModule { private String userQuery; private String rolesQuery; private String dbUserTable; private String dbUserTableUserField; private String dbUserTableCredentialField; private String dbUserRoleTable; private String dbUserRoleTableUserField; private String dbUserRoleTableRoleField; /** * @return a java.sql.Connection from the database * @throws Exception */ public abstract Connection getConnection () throws Exception; /* ------------------------------------------------ */ /** Load info from database * @param userName user info to load * @exception SQLException */ public UserInfo getUserInfo (String userName) throws Exception { Connection connection = null; try { connection = getConnection(); //query for credential PreparedStatement statement = connection.prepareStatement (userQuery); statement.setString (1, userName); ResultSet results = statement.executeQuery(); String dbCredential = null; if (results.next()) { dbCredential = results.getString(1); } results.close(); statement.close(); //query for role names statement = connection.prepareStatement (rolesQuery); statement.setString (1, userName); results = statement.executeQuery(); List roles = new ArrayList(); while (results.next()) { String roleName = results.getString (1); roles.add (roleName); } results.close(); statement.close(); return dbCredential==null ? null : new UserInfo (userName, Credential.getCredential(dbCredential), roles); } finally { if (connection != null) connection.close(); } } public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { super.initialize(subject, callbackHandler, sharedState, options); //get the user credential query out of the options dbUserTable = (String)options.get("userTable"); dbUserTableUserField = (String)options.get("userField"); dbUserTableCredentialField = (String)options.get("credentialField"); userQuery = "select "+dbUserTableCredentialField+" from "+dbUserTable+" where "+dbUserTableUserField+"=?"; //get the user roles query out of the options dbUserRoleTable = (String)options.get("userRoleTable"); dbUserRoleTableUserField = (String)options.get("userRoleUserField"); dbUserRoleTableRoleField = (String)options.get("userRoleRoleField"); rolesQuery = "select "+dbUserRoleTableRoleField+" from "+dbUserRoleTable+" where "+dbUserRoleTableUserField+"=?"; if(Log.isDebugEnabled())Log.debug("userQuery = "+userQuery); if(Log.isDebugEnabled())Log.debug("rolesQuery = "+rolesQuery); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/spi/DataSourceLoginModule.java0000644000175000017500000000702011044235703031667 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.jaas.spi; import java.sql.Connection; import java.util.Map; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import javax.sql.DataSource; // ======================================================================== // $Id: DataSourceLoginModule.java 3462 2008-07-31 04:12:51Z gregw $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== /** * DataSourceLoginModule * * A LoginModule that uses a DataSource to retrieve user authentication * and authorisation information. * * @see org.mortbay.jetty.plus.jaas.spi.JDBCLoginModule * */ public class DataSourceLoginModule extends AbstractDatabaseLoginModule { private String dbJNDIName; private DataSource dataSource; /* ------------------------------------------------ */ /** Init LoginModule. * Called once by JAAS after new instance created. * @param subject * @param callbackHandler * @param sharedState * @param options */ public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { try { super.initialize(subject, callbackHandler, sharedState, options); //get the datasource jndi name dbJNDIName = (String)options.get("dbJNDIName"); InitialContext ic = new InitialContext(); dataSource = (DataSource)ic.lookup("java:comp/env/"+dbJNDIName); } catch (NamingException e) { throw new IllegalStateException (e.toString()); } } /** * Get a connection from the DataSource * @see org.mortbay.jetty.plus.jaas.spi.AbstractDatabaseLoginModule#getConnection() * @return * @throws Exception */ public Connection getConnection () throws Exception { return dataSource.getConnection(); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/spi/UserInfo.java0000644000175000017500000000371410403260456027237 0ustar moonmoon// ======================================================================== // $Id: UserInfo.java 305 2006-03-07 10:32:14Z janb $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas.spi; import java.util.ArrayList; import java.util.List; import org.mortbay.jetty.security.Credential; /** * UserInfo * * This is the information read from the external source * about a user. * * Can be cached by a UserInfoCache implementation */ public class UserInfo { private String userName; private Credential credential; private List roleNames; public UserInfo (String userName, Credential credential, List roleNames) { this.userName = userName; this.credential = credential; this.roleNames = new ArrayList(); if (roleNames != null) this.roleNames.addAll(roleNames); } public String getUserName() { return this.userName; } public List getRoleNames () { return new ArrayList(this.roleNames); } public boolean checkCredential (Object suppliedCredential) { return this.credential.check(suppliedCredential); } protected Credential getCredential () { return this.credential; } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/callback/0000755000175000017500000000000011745736473025617 5ustar moonmoon././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/callback/DefaultCallbackHandler.javajetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/callback/DefaultCallbackHandler.0000644000175000017500000000646310403260456032107 0ustar moonmoon// ======================================================================== // $Id: DefaultCallbackHandler.java 305 2006-03-07 10:32:14Z janb $ // Copyright 2003-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas.callback; import java.io.IOException; import java.util.Arrays; import javax.security.auth.callback.Callback; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.UnsupportedCallbackException; import org.mortbay.jetty.Request; import org.mortbay.jetty.security.Password; /* ---------------------------------------------------- */ /** DefaultUsernameCredentialCallbackHandler *

    * *

    Notes

    *

    * *

    Usage

    *
     */
    /*
     * 
    * * @see * @version 1.0 Tue Apr 15 2003 * @author Jan Bartel (janb) */ public class DefaultCallbackHandler extends AbstractCallbackHandler { private Request request; public void setRequest (Request request) { this.request = request; } public void handle (Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i=0; i < callbacks.length; i++) { if (callbacks[i] instanceof NameCallback) { ((NameCallback)callbacks[i]).setName(getUserName()); } else if (callbacks[i] instanceof ObjectCallback) { ((ObjectCallback)callbacks[i]).setObject(getCredential()); } else if (callbacks[i] instanceof PasswordCallback) { if (getCredential() instanceof Password) ((PasswordCallback)callbacks[i]).setPassword (((Password)getCredential()).toString().toCharArray()); else if (getCredential() instanceof String) { ((PasswordCallback)callbacks[i]).setPassword (((String)getCredential()).toCharArray()); } else throw new UnsupportedCallbackException (callbacks[i], "User supplied credentials cannot be converted to char[] for PasswordCallback: try using an ObjectCallback instead"); } else if (callbacks[i] instanceof RequestParameterCallback) { RequestParameterCallback callback = (RequestParameterCallback)callbacks[i]; callback.setParameterValues(Arrays.asList(request.getParameterValues(callback.getParameterName()))); } else throw new UnsupportedCallbackException(callbacks[i]); } } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/callback/ObjectCallback.java0000644000175000017500000000324610403260456031271 0ustar moonmoon// ======================================================================== // $Id: ObjectCallback.java 305 2006-03-07 10:32:14Z janb $ // Copyright 2003-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas.callback; import javax.security.auth.callback.Callback; /* ---------------------------------------------------- */ /** ObjectCallback * *

    Can be used as a LoginModule Callback to * obtain a user's credential as an Object, rather than * a char[], to which some credentials may not be able * to be converted * *

    Notes

    *

    * *

    Usage

    *
     */
    /*
     * 
    * * @see * @version 1.0 Tue Apr 15 2003 * @author Jan Bartel (janb) */ public class ObjectCallback implements Callback { protected Object _object; public void setObject(Object o) { _object = o; } public Object getObject () { return _object; } public void clearObject () { _object = null; } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/callback/RequestParameterCallback.javajetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/callback/RequestParameterCallbac0000644000175000017500000000351210403260456032255 0ustar moonmoon//======================================================================== //$Id: RequestParameterCallback.java 305 2006-03-07 10:32:14Z janb $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.plus.jaas.callback; import java.util.List; import javax.security.auth.callback.Callback; /** * * RequestParameterCallback * * Allows a JAAS callback handler to access any parameter from the j_security_check FORM. * This means that a LoginModule can access form fields other than the j_username and j_password * fields, and use it, for example, to authenticate a user. * * @author janb * @version $Revision: 305 $ $Date: 2006-03-07 11:32:14 +0100 (Tue, 07 Mar 2006) $ * */ public class RequestParameterCallback implements Callback { private String paramName; private List paramValues; public void setParameterName (String name) { paramName = name; } public String getParameterName () { return paramName; } public void setParameterValues (List values) { paramValues = values; } public List getParameterValues () { return paramValues; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/callback/AbstractCallbackHandler.javajetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/callback/AbstractCallbackHandler0000644000175000017500000000333110403260456032177 0ustar moonmoon// ======================================================================== // $Id: AbstractCallbackHandler.java 305 2006-03-07 10:32:14Z janb $ // Copyright 2003-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas.callback; import java.io.IOException; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; public abstract class AbstractCallbackHandler implements CallbackHandler { protected String _userName; protected Object _credential; public void setUserName (String userName) { _userName = userName; } public String getUserName () { return _userName; } public void setCredential (Object credential) { _credential = credential; } public Object getCredential () { return _credential; } public void handle (Callback[] callbacks) throws IOException, UnsupportedCallbackException { } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/jaas/JAASUserRealm.java0000644000175000017500000002514611351770433027257 0ustar moonmoon// ======================================================================== // $Id: JAASUserRealm.java 5888 2010-03-22 22:37:15Z gregw $ // Copyright 2003-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas; import java.security.Principal; import java.security.acl.Group; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import org.mortbay.jetty.Request; import org.mortbay.jetty.plus.jaas.callback.AbstractCallbackHandler; import org.mortbay.jetty.plus.jaas.callback.DefaultCallbackHandler; import org.mortbay.jetty.security.UserRealm; import org.mortbay.log.Log; import org.mortbay.util.Loader; /* ---------------------------------------------------- */ /** JAASUserRealm *

    * *

    Notes

    *

    * *

    Usage

    * * * * * @org.apache.xbean.XBean element="jaasUserRealm" description="Creates a UserRealm suitable for use with JAAS" */ public class JAASUserRealm implements UserRealm { public static String DEFAULT_ROLE_CLASS_NAME = "org.mortbay.jetty.plus.jaas.JAASRole"; public static String[] DEFAULT_ROLE_CLASS_NAMES = {DEFAULT_ROLE_CLASS_NAME}; protected String[] roleClassNames = DEFAULT_ROLE_CLASS_NAMES; protected String callbackHandlerClass; protected String realmName; protected String loginModuleName; protected RoleCheckPolicy roleCheckPolicy; protected JAASUserPrincipal defaultUser = new JAASUserPrincipal(null, null); /* ---------------------------------------------------- */ /** * Constructor. * */ public JAASUserRealm () { } /* ---------------------------------------------------- */ /** * Constructor. * * @param name the name of the realm */ public JAASUserRealm(String name) { this(); realmName = name; } /* ---------------------------------------------------- */ /** * Get the name of the realm. * * @return name or null if not set. */ public String getName() { return realmName; } /* ---------------------------------------------------- */ /** * Set the name of the realm * * @param name a String value */ public void setName (String name) { realmName = name; } /** * Set the name to use to index into the config * file of LoginModules. * * @param name a String value */ public void setLoginModuleName (String name) { loginModuleName = name; } public void setCallbackHandlerClass (String classname) { callbackHandlerClass = classname; } public void setRoleClassNames (String[] classnames) { ArrayList tmp = new ArrayList(); if (classnames != null) tmp.addAll(Arrays.asList(classnames)); if (!tmp.contains(DEFAULT_ROLE_CLASS_NAME)) tmp.add(DEFAULT_ROLE_CLASS_NAME); roleClassNames = (String[])tmp.toArray(new String[tmp.size()]); } public String[] getRoleClassNames() { return roleClassNames; } public void setRoleCheckPolicy (RoleCheckPolicy policy) { roleCheckPolicy = policy; } //TODO: delete?! public Principal getPrincipal(String username) { return null; } /* ------------------------------------------------------------ */ public boolean isUserInRole(Principal user, String role) { JAASUserPrincipal thePrincipal = null; if (user == null) thePrincipal = defaultUser; else { if (! (user instanceof JAASUserPrincipal)) return false; thePrincipal = (JAASUserPrincipal)user; } return thePrincipal!=null && thePrincipal.isUserInRole(role); } /* ------------------------------------------------------------ */ public boolean reauthenticate(Principal user) { if (user instanceof JAASUserPrincipal) return true; else return false; } /* ---------------------------------------------------- */ /** * Authenticate a user. * * * @param username provided by the user at login * @param credentials provided by the user at login * @param request a Request value * @return authenticated JAASUserPrincipal or null if authenticated failed */ public Principal authenticate(String username, Object credentials, Request request) { try { AbstractCallbackHandler callbackHandler = null; //user has not been authenticated if (callbackHandlerClass == null) { Log.warn("No CallbackHandler configured: using DefaultCallbackHandler"); callbackHandler = new DefaultCallbackHandler(); } else { callbackHandler = (AbstractCallbackHandler)Loader.loadClass(JAASUserRealm.class, callbackHandlerClass).getConstructors()[0].newInstance(new Object[0]); } if (callbackHandler instanceof DefaultCallbackHandler) { ((DefaultCallbackHandler)callbackHandler).setRequest (request); } callbackHandler.setUserName(username); callbackHandler.setCredential(credentials); //set up the login context LoginContext loginContext = new LoginContext(loginModuleName, callbackHandler); loginContext.login(); //login success JAASUserPrincipal userPrincipal = new JAASUserPrincipal(this, username); userPrincipal.setSubject(loginContext.getSubject()); userPrincipal.setRoleCheckPolicy (roleCheckPolicy); userPrincipal.setLoginContext(loginContext); return userPrincipal; } catch (Exception e) { Log.warn(e.toString()); Log.debug(e); return null; } } /* ---------------------------------------------------- */ /** * Removes any auth info associated with eg. the thread. * * @param user a UserPrincipal to disassociate */ public void disassociate(Principal user) { //TODO: should this apply to the default user? if (user == null) defaultUser.disassociate(); else ((JAASUserPrincipal)user).disassociate(); } /* ---------------------------------------------------- */ /** * Temporarily adds a role to a user. * * Temporarily granting a role pushes the role onto a stack * of temporary roles. Temporary roles must therefore be * removed in order. * * @param user the Principal to which to add the role * @param role the role name * @return the Principal with the role added */ public Principal pushRole(Principal user, String role) { JAASUserPrincipal thePrincipal = (JAASUserPrincipal)user; //use the default user if (thePrincipal == null) thePrincipal = defaultUser; thePrincipal.pushRole(role); return thePrincipal; } /* ------------------------------------------------------------ */ public Principal popRole(Principal user) { JAASUserPrincipal thePrincipal = (JAASUserPrincipal)user; //use the default user if (thePrincipal == null) thePrincipal = defaultUser; thePrincipal.popRole(); return thePrincipal; } public Group getRoles (JAASUserPrincipal principal) { //get all the roles of the various types String[] roleClassNames = getRoleClassNames(); Group roleGroup = new JAASGroup(JAASGroup.ROLES); try { JAASUserPrincipal thePrincipal = principal; if (thePrincipal == null) thePrincipal = defaultUser; for (int i=0; iPrincipal value */ public void logout(Principal user) { try { JAASUserPrincipal authenticUser = null; if (user == null) authenticUser = defaultUser; //TODO: should the default user ever be logged in? if (!(user instanceof JAASUserPrincipal)) throw new IllegalArgumentException (user + " is not a JAASUserPrincipal"); authenticUser = (JAASUserPrincipal)user; authenticUser.getLoginContext().logout(); Log.debug (user+" has been LOGGED OUT"); } catch (LoginException e) { Log.warn (e); } } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/webapp/0000755000175000017500000000000011745736473024423 5ustar moonmoonjetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/webapp/EnvConfiguration.java0000644000175000017500000001651611065421731030536 0ustar moonmoon// ======================================================================== // $Id: EnvConfiguration.java 3680 2008-09-21 10:37:13Z janb $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.webapp; import java.net.URL; import java.util.Iterator; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NameNotFoundException; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import org.mortbay.jetty.plus.naming.EnvEntry; import org.mortbay.jetty.plus.naming.NamingEntry; import org.mortbay.jetty.plus.naming.NamingEntryUtil; import org.mortbay.jetty.plus.naming.Resource; import org.mortbay.jetty.plus.naming.Transaction; import org.mortbay.jetty.webapp.Configuration; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.log.Log; import org.mortbay.naming.NamingUtil; import org.mortbay.xml.XmlConfiguration; /** * EnvConfiguration * * */ public class EnvConfiguration implements Configuration { private WebAppContext webAppContext; private Context compCtx; private Context envCtx; private URL jettyEnvXmlUrl; protected void createEnvContext () throws NamingException { Context context = new InitialContext(); compCtx = (Context)context.lookup ("java:comp"); envCtx = compCtx.createSubcontext("env"); if (Log.isDebugEnabled()) Log.debug("Created java:comp/env for webapp "+getWebAppContext().getContextPath()); } /** * @see org.mortbay.jetty.webapp.Configuration#setWebAppContext(org.mortbay.jetty.webapp.WebAppContext) * @param context */ public void setWebAppContext(WebAppContext context) { this.webAppContext = context; } public void setJettyEnvXml (URL url) { this.jettyEnvXmlUrl = url; } /** * @see org.mortbay.jetty.webapp.Configuration#getWebAppContext() */ public WebAppContext getWebAppContext() { return webAppContext; } /** * @see org.mortbay.jetty.webapp.Configuration#configureClassLoader() * @throws Exception */ public void configureClassLoader() throws Exception { } /** * @see org.mortbay.jetty.webapp.Configuration#configureDefaults() * @throws Exception */ public void configureDefaults() throws Exception { //create a java:comp/env createEnvContext(); } /** * @see org.mortbay.jetty.webapp.Configuration#configureWebApp() * @throws Exception */ public void configureWebApp() throws Exception { //check to see if an explicit file has been set, if not, //look in WEB-INF/jetty-env.xml if (jettyEnvXmlUrl == null) { //look for a file called WEB-INF/jetty-env.xml //and process it if it exists org.mortbay.resource.Resource web_inf = getWebAppContext().getWebInf(); if(web_inf!=null && web_inf.isDirectory()) { org.mortbay.resource.Resource jettyEnv = web_inf.addPath("jetty-env.xml"); if(jettyEnv.exists()) { jettyEnvXmlUrl = jettyEnv.getURL(); } } } if (jettyEnvXmlUrl != null) { XmlConfiguration configuration = new XmlConfiguration(jettyEnvXmlUrl); configuration.configure(getWebAppContext()); } //add java:comp/env entries for any EnvEntries that have been defined so far bindEnvEntries(); } /** * Remove all jndi setup * @see org.mortbay.jetty.webapp.Configuration#deconfigureWebApp() * @throws Exception */ public void deconfigureWebApp() throws Exception { //get rid of any bindings for comp/env for webapp ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(webAppContext.getClassLoader()); compCtx.destroySubcontext("env"); //unbind any NamingEntries that were configured in this webapp's name space try { Context scopeContext = NamingEntryUtil.getContextForScope(getWebAppContext()); scopeContext.destroySubcontext(NamingEntry.__contextName); } catch (NameNotFoundException e) { Log.ignore(e); Log.debug("No naming entries configured in environment for webapp "+getWebAppContext()); } Thread.currentThread().setContextClassLoader(oldLoader); } /** * Bind all EnvEntries that have been declared, so that the processing of the * web.xml file can potentially override them. * * We first bind EnvEntries declared in Server scope, then WebAppContext scope. * @throws NamingException */ public void bindEnvEntries () throws NamingException { Log.debug("Binding env entries from the jvm scope"); Object scope = null; List list = NamingEntryUtil.lookupNamingEntries(scope, EnvEntry.class); Iterator itor = list.iterator(); while (itor.hasNext()) { EnvEntry ee = (EnvEntry)itor.next(); ee.bindToENC(ee.getJndiName()); Name namingEntryName = NamingEntryUtil.makeNamingEntryName(null, ee); NamingUtil.bind(envCtx, namingEntryName.toString(), ee);//also save the EnvEntry in the context so we can check it later } Log.debug("Binding env entries from the server scope"); scope = getWebAppContext().getServer(); list = NamingEntryUtil.lookupNamingEntries(scope, EnvEntry.class); itor = list.iterator(); while (itor.hasNext()) { EnvEntry ee = (EnvEntry)itor.next(); ee.bindToENC(ee.getJndiName()); Name namingEntryName = NamingEntryUtil.makeNamingEntryName(null, ee); NamingUtil.bind(envCtx, namingEntryName.toString(), ee);//also save the EnvEntry in the context so we can check it later } Log.debug("Binding env entries from the context scope"); scope = getWebAppContext(); list = NamingEntryUtil.lookupNamingEntries(scope, EnvEntry.class); itor = list.iterator(); while (itor.hasNext()) { EnvEntry ee = (EnvEntry)itor.next(); ee.bindToENC(ee.getJndiName()); Name namingEntryName = NamingEntryUtil.makeNamingEntryName(null, ee); NamingUtil.bind(envCtx, namingEntryName.toString(), ee);//also save the EnvEntry in the context so we can check it later } } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/webapp/Configuration.java0000644000175000017500000002065411065421731030063 0ustar moonmoon// ======================================================================== // $Id: Configuration.java 3680 2008-09-21 10:37:13Z janb $ // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.webapp; import java.util.Random; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NameNotFoundException; import org.mortbay.jetty.plus.naming.EnvEntry; import org.mortbay.jetty.plus.naming.Link; import org.mortbay.jetty.plus.naming.NamingEntry; import org.mortbay.jetty.plus.naming.NamingEntryUtil; import org.mortbay.jetty.plus.naming.Transaction; import org.mortbay.log.Log; import org.mortbay.naming.NamingUtil; /** * Configuration * * */ public class Configuration extends AbstractConfiguration { private Integer _key; public Configuration () { } /** * @see org.mortbay.jetty.plus.webapp.AbstractConfiguration#bindEnvEntry(java.lang.String, java.lang.String) * @param name * @param value * @throws Exception */ public void bindEnvEntry(String name, Object value) throws Exception { InitialContext ic = null; boolean bound = false; //check to see if we bound a value and an EnvEntry with this name already //when we processed the server and the webapp's naming environment //@see EnvConfiguration.bindEnvEntries() ic = new InitialContext(); try { NamingEntry ne = (NamingEntry)ic.lookup("java:comp/env/"+NamingEntryUtil.makeNamingEntryName(ic.getNameParser(""), name)); if (ne!=null && ne instanceof EnvEntry) { EnvEntry ee = (EnvEntry)ne; bound = ee.isOverrideWebXml(); } } catch (NameNotFoundException e) { bound = false; } if (!bound) { //either nothing was bound or the value from web.xml should override Context envCtx = (Context)ic.lookup("java:comp/env"); NamingUtil.bind(envCtx, name, value); } } /** * Bind a resource reference. * * If a resource reference with the same name is in a jetty-env.xml * file, it will already have been bound. * * @see org.mortbay.jetty.plus.webapp.AbstractConfiguration#bindResourceRef(java.lang.String) * @param name * @throws Exception */ public void bindResourceRef(String name, Class typeClass) throws Exception { bindEntry(name, typeClass); } /** * @see org.mortbay.jetty.plus.webapp.AbstractConfiguration#bindResourceEnvRef(java.lang.String) * @param name * @throws Exception */ public void bindResourceEnvRef(String name, Class typeClass) throws Exception { bindEntry(name, typeClass); } public void bindMessageDestinationRef(String name, Class typeClass) throws Exception { bindEntry(name, typeClass); } public void bindUserTransaction () throws Exception { try { Transaction.bindToENC(); } catch (NameNotFoundException e) { Log.info("No Transaction manager found - if your webapp requires one, please configure one."); } } public void configureClassLoader () throws Exception { super.configureClassLoader(); } public void configureDefaults () throws Exception { super.configureDefaults(); } public void configureWebApp () throws Exception { super.configureWebApp(); //lock this webapp's java:comp namespace as per J2EE spec ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(getWebAppContext().getClassLoader()); lockCompEnv(); Thread.currentThread().setContextClassLoader(oldLoader); } public void deconfigureWebApp() throws Exception { ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(getWebAppContext().getClassLoader()); unlockCompEnv(); Thread.currentThread().setContextClassLoader(oldLoader); super.deconfigureWebApp(); } protected void lockCompEnv () throws Exception { Random random = new Random (); _key = new Integer(random.nextInt()); Context context = new InitialContext(); Context compCtx = (Context)context.lookup("java:comp"); compCtx.addToEnvironment("org.mortbay.jndi.lock", _key); } protected void unlockCompEnv () throws Exception { if (_key!=null) { Context context = new InitialContext(); Context compCtx = (Context)context.lookup("java:comp"); compCtx.addToEnvironment("org.mortbay.jndi.unlock", _key); } } /** * @see org.mortbay.jetty.plus.webapp.AbstractConfiguration#parseAnnotations() */ public void parseAnnotations() throws Exception { Log.info(getClass().getName()+" does not support annotations on source. Use org.mortbay.jetty.annotations.Configuration instead"); } /** * Bind a resource with the given name from web.xml of the given type * with a jndi resource from either the server or the webapp's naming * environment. * * As the servlet spec does not cover the mapping of names in web.xml with * names from the execution environment, jetty uses the concept of a Link, which is * a subclass of the NamingEntry class. A Link defines a mapping of a name * from web.xml with a name from the execution environment (ie either the server or the * webapp's naming environment). * * @param name name of the resource from web.xml * @param typeClass * @throws Exception */ private void bindEntry (String name, Class typeClass) throws Exception { String nameInEnvironment = name; boolean bound = false; //check if the name in web.xml has been mapped to something else //check a context-specific naming environment first Object scope = getWebAppContext(); NamingEntry ne = NamingEntryUtil.lookupNamingEntry(scope, name); if (ne!=null && (ne instanceof Link)) { //if we found a mapping, get out name it is mapped to in the environment nameInEnvironment = (String)((Link)ne).getObjectToBind(); Link l = (Link)ne; } //try finding that mapped name in the webapp's environment first scope = getWebAppContext(); bound = NamingEntryUtil.bindToENC(scope, name, nameInEnvironment); if (bound) return; //try the server's environment scope = getWebAppContext().getServer(); bound = NamingEntryUtil.bindToENC(scope, name, nameInEnvironment); if (bound) return; //try the jvm environment bound = NamingEntryUtil.bindToENC(null, name, nameInEnvironment); if (bound) return; //There is no matching resource so try a default name. //The default name syntax is: the [res-type]/default //eg javax.sql.DataSource/default nameInEnvironment = typeClass.getName()+"/default"; //First try the server scope NamingEntry defaultNE = NamingEntryUtil.lookupNamingEntry(getWebAppContext().getServer(), nameInEnvironment); if (defaultNE==null) defaultNE = NamingEntryUtil.lookupNamingEntry(null, nameInEnvironment); if (defaultNE!=null) defaultNE.bindToENC(name); else throw new IllegalStateException("Nothing to bind for name "+nameInEnvironment); } } jetty-6.1.26/modules/plus/src/main/java/org/mortbay/jetty/plus/webapp/AbstractConfiguration.java0000644000175000017500000004077711254330242031553 0ustar moonmoon// ======================================================================== // $Id: AbstractConfiguration.java 5533 2009-09-17 03:44:34Z janb $ // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.webapp; import java.util.EventListener; import java.util.Iterator; import javax.servlet.UnavailableException; import org.mortbay.jetty.plus.annotation.Injection; import org.mortbay.jetty.plus.annotation.InjectionCollection; import org.mortbay.jetty.plus.annotation.LifeCycleCallback; import org.mortbay.jetty.plus.annotation.LifeCycleCallbackCollection; import org.mortbay.jetty.plus.annotation.PostConstructCallback; import org.mortbay.jetty.plus.annotation.PreDestroyCallback; import org.mortbay.jetty.plus.annotation.RunAsCollection; import org.mortbay.jetty.plus.servlet.ServletHandler; import org.mortbay.jetty.security.SecurityHandler; import org.mortbay.jetty.servlet.FilterHolder; import org.mortbay.jetty.servlet.FilterMapping; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.jetty.servlet.ServletMapping; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.jetty.webapp.WebXmlConfiguration; import org.mortbay.log.Log; import org.mortbay.util.TypeUtil; import org.mortbay.xml.XmlParser; /** * Configuration * * */ public abstract class AbstractConfiguration extends WebXmlConfiguration { protected LifeCycleCallbackCollection _callbacks = new LifeCycleCallbackCollection(); protected InjectionCollection _injections = new InjectionCollection(); protected RunAsCollection _runAsCollection = new RunAsCollection(); private boolean _metadataComplete = true; public abstract void bindEnvEntry (String name, Object value) throws Exception; public abstract void bindResourceRef (String name, Class type) throws Exception; public abstract void bindResourceEnvRef (String name, Class type) throws Exception; public abstract void bindUserTransaction () throws Exception; public abstract void bindMessageDestinationRef (String name, Class type) throws Exception; public void setWebAppContext (WebAppContext context) { super.setWebAppContext(context); //set up our special ServletHandler to remember injections and lifecycle callbacks ServletHandler servletHandler = new ServletHandler(); SecurityHandler securityHandler = getWebAppContext().getSecurityHandler(); org.mortbay.jetty.servlet.ServletHandler existingHandler = getWebAppContext().getServletHandler(); servletHandler.setFilters(existingHandler.getFilters()); servletHandler.setFilterMappings(existingHandler.getFilterMappings()); servletHandler.setServlets(existingHandler.getServlets()); servletHandler.setServletMappings(existingHandler.getServletMappings()); getWebAppContext().setServletHandler(servletHandler); securityHandler.setHandler(servletHandler); } public void configureDefaults () throws Exception { super.configureDefaults(); } public void configureWebApp () throws Exception { super.configureWebApp(); bindUserTransaction(); } public void deconfigureWebApp() throws Exception { //call any preDestroy methods on the listeners callPreDestroyCallbacks(); super.deconfigureWebApp(); } public void configure(String webXml) throws Exception { //parse web.xml super.configure(webXml); //parse classes for annotations, if necessary if (!_metadataComplete) { if (Log.isDebugEnabled()) Log.debug("Processing annotations"); parseAnnotations(); } //do any injects on the listeners that were created and then //also callback any postConstruct lifecycle methods injectAndCallPostConstructCallbacks(); } protected void initialize(XmlParser.Node config) throws ClassNotFoundException,UnavailableException { super.initialize(config); //configure injections and callbacks to be called by the FilterHolder and ServletHolder //when they lazily instantiate the Filter/Servlet. ((ServletHandler)getWebAppContext().getServletHandler()).setInjections(_injections); ((ServletHandler)getWebAppContext().getServletHandler()).setCallbacks(_callbacks); //find out if we need to process annotations // servlet 2.5 web.xml && metadata-complete==false if (_version == 25) _metadataComplete = Boolean.valueOf((String)config.getAttribute("metadata-complete", "false")).booleanValue(); } protected void initWebXmlElement(String element,XmlParser.Node node) throws Exception { if ("env-entry".equals(element)) { initEnvEntry (node); } else if ("resource-ref".equals(element)) { //resource-ref entries are ONLY for connection factories //the resource-ref says how the app will reference the jndi lookup relative //to java:comp/env, but it is up to the deployer to map this reference to //a real resource in the environment. At the moment, we insist that the //jetty.xml file name of the resource has to be exactly the same as the //name in web.xml deployment descriptor, but it shouldn't have to be initResourceRef(node); } else if ("resource-env-ref".equals(element)) { //resource-env-ref elements are a non-connection factory type of resource //the app looks them up relative to java:comp/env //again, need a way for deployer to link up app naming to real naming. //Again, we insist now that the name of the resource in jetty.xml is //the same as web.xml initResourceEnvRef(node); } else if ("message-destination-ref".equals(element)) { initMessageDestinationRef(node); } else if ("post-construct".equals(element)) { //post-construct is the name of a class and method to call after all //resources have been setup but before the class is put into use initPostConstruct(node); } else if ("pre-destroy".equals(element)) { //pre-destroy is the name of a class and method to call just as //the instance is being destroyed initPreDestroy(node); } else { super.initWebXmlElement(element, node); } } /** * JavaEE 5.4.1.3 * * * @param node * @throws Exception */ protected void initEnvEntry (XmlParser.Node node) throws Exception { String name=node.getString("env-entry-name",false,true); String type = node.getString("env-entry-type",false,true); String valueStr = node.getString("env-entry-value",false,true); //if there's no value there's no point in making a jndi entry //nor processing injection entries if (valueStr==null || valueStr.equals("")) { Log.warn("No value for env-entry-name "+name); return; } //the javaee_5.xsd says that the env-entry-type is optional //if there is an element, because you can get //type from the element, but what to do if there is more //than one element, do you just pick the type //of the first one? //check for elements initInjection (node, name, TypeUtil.fromName(type)); //bind the entry into jndi Object value = TypeUtil.valueOf(type,valueStr); bindEnvEntry(name, value); } /** * Common Annotations Spec section 2.3: * resource-ref is for: * - javax.sql.DataSource * - javax.jms.ConnectionFactory * - javax.jms.QueueConnectionFactory * - javax.jms.TopicConnectionFactory * - javax.mail.Session * - java.net.URL * - javax.resource.cci.ConnectionFactory * - org.omg.CORBA_2_3.ORB * - any other connection factory defined by a resource adapter * @param node * @throws Exception */ protected void initResourceRef (XmlParser.Node node) throws Exception { String jndiName = node.getString("res-ref-name",false,true); String type = node.getString("res-type", false, true); String auth = node.getString("res-auth", false, true); String shared = node.getString("res-sharing-scope", false, true); //check for elements Class typeClass = TypeUtil.fromName(type); if (typeClass==null) typeClass = getWebAppContext().loadClass(type); initInjection (node, jndiName, typeClass); bindResourceRef(jndiName, typeClass); } /** * Common Annotations Spec section 2.3: * resource-env-ref is for: * - javax.transaction.UserTransaction * - javax.resource.cci.InteractionSpec * - anything else that is not a connection factory * @param node * @throws Exception */ protected void initResourceEnvRef (XmlParser.Node node) throws Exception { String jndiName = node.getString("resource-env-ref-name",false,true); String type = node.getString("resource-env-ref-type", false, true); //check for elements //JavaEE Spec sec 5.7.1.3 says the resource-env-ref-type //is mandatory, but the schema says it is optional! Class typeClass = TypeUtil.fromName(type); if (typeClass==null) typeClass = getWebAppContext().loadClass(type); initInjection (node, jndiName, typeClass); bindResourceEnvRef(jndiName, typeClass); } /** * Common Annotations Spec section 2.3: * message-destination-ref is for: * - javax.jms.Queue * - javax.jms.Topic * @param node * @throws Exception */ protected void initMessageDestinationRef (XmlParser.Node node) throws Exception { String jndiName = node.getString("message-destination-ref-name",false,true); String type = node.getString("message-destination-type",false,true); String usage = node.getString("message-destination-usage",false,true); Class typeClass = TypeUtil.fromName(type); if (typeClass==null) typeClass = getWebAppContext().loadClass(type); initInjection(node, jndiName, typeClass); bindMessageDestinationRef(jndiName, typeClass); } /** * Process <post-construct> * @param node */ protected void initPostConstruct(XmlParser.Node node) { String className = node.getString("lifecycle-callback-class", false, true); String methodName = node.getString("lifecycle-callback-method", false, true); if (className==null || className.equals("")) { Log.warn("No lifecycle-callback-class specified"); return; } if (methodName==null || methodName.equals("")) { Log.warn("No lifecycle-callback-method specified for class "+className); return; } try { Class clazz = getWebAppContext().loadClass(className); LifeCycleCallback callback = new PostConstructCallback(); callback.setTarget(clazz, methodName); _callbacks.add(callback); } catch (ClassNotFoundException e) { Log.warn("Couldn't load post-construct target class "+className); } } /** * Process <pre-destroy> * @param node */ protected void initPreDestroy(XmlParser.Node node) { String className = node.getString("lifecycle-callback-class", false, true); String methodName = node.getString("lifecycle-callback-method", false, true); if (className==null || className.equals("")) { Log.warn("No lifecycle-callback-class specified for pre-destroy"); return; } if (methodName==null || methodName.equals("")) { Log.warn("No lifecycle-callback-method specified for pre-destroy class "+className); return; } try { Class clazz = getWebAppContext().loadClass(className); LifeCycleCallback callback = new PreDestroyCallback(); callback.setTarget(clazz, methodName); _callbacks.add(callback); } catch (ClassNotFoundException e) { Log.warn("Couldn't load pre-destory target class "+className); } } /** * Iterate over the <injection-target> entries for a node * * @param node * @param jndiName * @param valueClass * @return the type of the injectable */ protected void initInjection (XmlParser.Node node, String jndiName, Class valueClass) { Iterator itor = node.iterator("injection-target"); while(itor.hasNext()) { XmlParser.Node injectionNode = (XmlParser.Node)itor.next(); String targetClassName = injectionNode.getString("injection-target-class", false, true); String targetName = injectionNode.getString("injection-target-name", false, true); if ((targetClassName==null) || targetClassName.equals("")) { Log.warn("No classname found in injection-target"); continue; } if ((targetName==null) || targetName.equals("")) { Log.warn("No field or method name in injection-target"); continue; } // comments in the javaee_5.xsd file specify that the targetName is looked // for first as a java bean property, then if that fails, as a field try { Class clazz = getWebAppContext().loadClass(targetClassName); Injection injection = new Injection(); injection.setTargetClass(clazz); injection.setJndiName(jndiName); injection.setTarget(clazz, targetName, valueClass); _injections.add(injection); } catch (ClassNotFoundException e) { Log.warn("Couldn't load injection target class "+targetClassName); } } } /** * Parse all classes that are mentioned in web.xml (servlets, filters, listeners) * for annotations. * * * * @throws Exception */ protected abstract void parseAnnotations () throws Exception; protected void injectAndCallPostConstructCallbacks() throws Exception { //look thru the servlets to apply any runAs annotations //NOTE: that any run-as in web.xml will already have been applied ServletHolder[] holders = getWebAppContext().getServletHandler().getServlets(); for (int i=0;holders!=null && i org.mortbay.jetty.webapp.WebInfConfiguration org.mortbay.jetty.plus.webapp.EnvConfiguration org.mortbay.jetty.plus.webapp.Configuration org.mortbay.jetty.webapp.JettyWebXmlConfiguration org.mortbay.jetty.webapp.TagLibConfiguration jetty-6.1.26/modules/plus/pom.xml0000644000175000017500000001024711466510412015423 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-plus Jetty Plus Jetty JavaEE style services maven-antrun-plugin clean clean run copyjar install run org.apache.felix maven-bundle-plugin ${maven-bundle-plugin-version} true manifest J2SE-1.4 org.mortbay.jetty.plus !org.mortbay.jetty.plus.*,* org.apache.maven.plugins maven-jar-plugin ${project.build.outputDirectory}/META-INF/MANIFEST.MF org.apache.derby derby 10.1.1.0 test junit junit test org.codehaus.plexus plexus-apacheds 1.0-alpha-1 test org.codehaus.plexus plexus-container-default 1.0-alpha-20 test geronimo-spec geronimo-spec-jta org.mortbay.jetty jetty ${project.version} provided org.mortbay.jetty jetty-naming ${project.version} provided jetty-6.1.26/modules/html/0000755000175000017500000000000011745736473014104 5ustar moonmoonjetty-6.1.26/modules/html/src/0000755000175000017500000000000011745736473014673 5ustar moonmoonjetty-6.1.26/modules/html/src/test/0000755000175000017500000000000011745736473015652 5ustar moonmoonjetty-6.1.26/modules/html/src/test/java/0000755000175000017500000000000011745736473016573 5ustar moonmoonjetty-6.1.26/modules/html/src/test/java/org/0000755000175000017500000000000011745736473017362 5ustar moonmoonjetty-6.1.26/modules/html/src/test/java/org/mortbay/0000755000175000017500000000000011745736473021037 5ustar moonmoonjetty-6.1.26/modules/html/src/test/java/org/mortbay/html/0000755000175000017500000000000011745736473022003 5ustar moonmoonjetty-6.1.26/modules/html/src/test/java/org/mortbay/html/HtmlTest.java0000644000175000017500000001736210472631505024405 0ustar moonmoon// ======================================================================== // $Id: TestHtml.java,v 1.4 2004/05/09 20:33:27 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import junit.framework.TestCase; // ==================================================================== public class HtmlTest extends TestCase { public HtmlTest(String arg0) { super(arg0); } public static void main(String[] args) { junit.textui.TestRunner.run(HtmlTest.class); } public void testGenerate() { try{ int loops=1; for (int i=0;i"); table.newRow(); table.addHeading("Heading1"); table.addHeading("Heading2"); table.addHeading("Heading3"); table.newRow(); table.addCell("String1"); table.addCell(text2); table.addCell(text3); page.add(table); page.add(rule); Form form = new Form("/CGI/test-cgi"); page.add(form); form.add(new Input(Input.Text,"N1","Value")); form.add(new Input(Input.Password,"N2","Value")); form.add(new Input(Input.Checkbox,"N3","Value")); form.add(new Input(Input.Checkbox,"N4","Value")); form.add(new Input(Input.Radio,"N5","Value")); form.add(new Input(Input.Radio,"N5","Value")); form.add(new Input(Input.Submit,"N6")); form.add(new Input(Input.Reset,"N7")); form.add(new Input(Input.Hidden,"N8","Value")); form.add(new TextArea("N9","Value")); Select select = new Select("Select",false); form.add(select); select.add("Tom"); select.add("Dick"); select.add("Harry"); select.add("Thomas"); select.add("Richard"); select.add("Harold"); select = new Select("Select",true); select.setSize(3); form.add(select); select.add("Tom"); select.add("Dick"); select.add("Harry"); select.add("Thomas"); select.add("Richard"); select.add("Harold"); page.add(Break.rule); TableForm tf = new TableForm("ScriptName"); page.add(tf); tf.addText("Text","Plain Text Information. Which is not included in any data sent when the form is submitted."); tf.addTextField("F1","Text Field",0,null); tf.addTextField("F2","Text Field",10,"value"); tf.addTextArea("F3","Text Area",0,4,"Value of the text area.\nWhich can be over many lines."); tf.addInfoField("F4","Info Field","value"); tf.addHiddenField("F5","hidden value"); tf.addPassword("F6","Password",10); tf.addButtonArea(); tf.addButton("F11a","Button1a"); tf.addButton("F11b","Button1b"); tf.addButtonRow(); tf.addButton("F11c","Button1c"); tf.addButton("F11d","Button1d"); tf.addCheckbox("F7","Checkbox",false); tf.addCheckbox("F8","Checkbox",true); tf.buttonsAtBottom(); tf.addButton("F11","Button2"); tf.addReset("Reset"); tf.addTextField("F12","Extended",10,"value"); tf.extendRow(); tf.addCheckbox("F13",null,false); tf.addSelect("F9","Select",false,0).add("A").add("B").add("C").add("D"); tf.addSelect("F0","Select",true,3).add("A").add("B").add("C").add("D"); page.add(Break.rule); page.add(new Style().comment().add("dt { background: yellow; color: black }")); page.write(System.out); } } catch(IOException e){ e.printStackTrace();} } } jetty-6.1.26/modules/html/src/main/0000755000175000017500000000000011745736473015617 5ustar moonmoonjetty-6.1.26/modules/html/src/main/java/0000755000175000017500000000000011745736473016540 5ustar moonmoonjetty-6.1.26/modules/html/src/main/java/org/0000755000175000017500000000000011745736473017327 5ustar moonmoonjetty-6.1.26/modules/html/src/main/java/org/mortbay/0000755000175000017500000000000011745736473021004 5ustar moonmoonjetty-6.1.26/modules/html/src/main/java/org/mortbay/html/0000755000175000017500000000000011745736473021750 5ustar moonmoonjetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Heading.java0000644000175000017500000000302310472631505024132 0ustar moonmoon// ======================================================================== // $Id: Heading.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* -------------------------------------------------------------------- */ /** HTML Heading. */ public class Heading extends Block { private static final String[] headerTags = { "h1", "h2", "h3", "h4", "h5", "h6" }; /* ----------------------------------------------------------------- */ /* Construct a heading and add Element, String or Object * @param level The level of the heading * @param o The Element, String or Object of the heading. */ public Heading(int level,Object o) { super((level <= headerTags.length) ? headerTags[level-1] : "h"+level); add(o); } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Input.java0000644000175000017500000000652610472631505023705 0ustar moonmoon// ======================================================================== // $Id: Input.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* -------------------------------------------------------------------- */ /** HTML Form Input Tag. *

    * @see Tag * @see Form * @version $Id: Input.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ * @author Greg Wilkins */ public class Input extends Tag { /* ----------------------------------------------------------------- */ /** Input types */ public final static String Text="text"; public final static String Password="password"; public final static String Checkbox="checkbox"; public final static String Radio="radio"; public final static String Submit="submit"; public final static String Reset="reset"; public final static String Hidden="hidden"; public final static String File="file"; public final static String Image="image"; /* ----------------------------------------------------------------- */ public Input(String type,String name) { super("input"); attribute("type",type); attribute("name",name); } /* ----------------------------------------------------------------- */ public Input(String type,String name, String value) { this(type,name); attribute("value",value); } /* ----------------------------------------------------------------- */ public Input(Image image,String name, String value) { super("input"); attribute("type","image"); attribute("name",name); if (value!=null) attribute("value",value); attribute(image.attributes()); } /* ----------------------------------------------------------------- */ public Input(Image image,String name) { super("input"); attribute("type","image"); attribute("name",name); attribute(image.attributes()); } /* ----------------------------------------------------------------- */ public Input check() { attribute("checked"); return this; } /* ----------------------------------------------------------------- */ public Input setSize(int size) { size(size); return this; } /* ----------------------------------------------------------------- */ public Input setMaxSize(int size) { attribute("maxlength",size); return this; } /* ----------------------------------------------------------------- */ public Input fixed() { setMaxSize(size()); return this; } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Style.java0000644000175000017500000000526210472631505023702 0ustar moonmoon// ======================================================================== // $Id: Style.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* -------------------------------------------------------------------- */ /** HTML Style Block. */ public class Style extends Block { public static final String STYLE = "style", TYPE = "type", MEDIA = "media"; public final static String StyleSheet="stylesheet", AlternateStyleSheet="alternate stylesheet", text_css="text/css", screen = "screen"; /* ------------------------------------------------------------ */ /** Construct a Style element. * @param type Format of Style */ public Style(String style, String type) { super(STYLE); if (type!=null) attribute(TYPE,type); add(style); } /* ------------------------------------------------------------ */ /** Construct a Style element */ public Style(String style) { this(style, text_css); } /* ------------------------------------------------------------ */ /** Construct a Style element */ public Style() { super(STYLE); attribute(TYPE,text_css); } /* ------------------------------------------------------------ */ /** Set the media */ public Style media(String m) { attribute(MEDIA,m); return this; } /* ------------------------------------------------------------ */ /** Nest style content in comment */ public Style comment() { nest(new Comment()); return this; } /* ------------------------------------------------------------ */ /** Import another style sheet. * @param url The URL to import * @return This style */ public Style importStyle(String url) { add("@import url("+url+");\n"); return this; } }; jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Comment.java0000644000175000017500000000264410472631505024205 0ustar moonmoon// ======================================================================== // $Id: Comment.java,v 1.2 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.Writer; /* ------------------------------------------------------------ */ /** HTML Comment. * @version $Id: Comment.java,v 1.2 2004/05/09 20:31:28 gregwilkins Exp $ * @author Greg Wilkins (gregw) */ public class Comment extends Composite { /* ----------------------------------------------------------------- */ public void write(Writer out) throws IOException { out.write(""); } }; jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Composite.java0000644000175000017500000002001410472631505024534 0ustar moonmoon// ======================================================================== // $Id: Composite.java,v 1.6 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; /* -------------------------------------------------------------------- */ /** HTML Composite Element. *

    This class is can be used a either an abstract or concrete * holder of other HTML elements. * Used directly, it allow multiple HTML Elements to be added which * are produced sequentially. * Derived used of Composite may wrap each contain Element in * special purpose HTML tags (e.g. list). * *

    Notes
    * Elements are added to the Composite either as HTML Elements or as * Strings. Other objects added to the Composite are converted to Strings * @see Element * @version $Id: Composite.java,v 1.6 2004/05/09 20:31:28 gregwilkins Exp $ * @author Greg Wilkins */ public class Composite extends Element { /* ----------------------------------------------------------------- */ /** The vector of elements in this Composite. */ protected ArrayList elements= new ArrayList(8); /* ----------------------------------------------------------------- */ protected Composite nest=null; /* ----------------------------------------------------------------- */ /** Default constructor. */ public Composite() {} /* ----------------------------------------------------------------- */ /** Default constructor. */ public Composite(String attributes) { super(attributes); } /* ----------------------------------------------------------------- */ /** Add an Object to the Composite by converting it to a Element or. * String * @param o The Object to add. If it is a String or Element, it is * added directly, otherwise toString() is called. * @return This Composite (for chained commands) */ public Composite add(Object o) { if (nest!=null) nest.add(o); else { if (o!=null) { if (o instanceof Element) { if(o instanceof Page) throw new IllegalArgumentException("Can't insert Page in Composite"); elements.add(o); } else if (o instanceof String) elements.add(o); else elements.add(o.toString()); } } return this; } /* ----------------------------------------------------------------- */ /** Nest a Composite within a Composite. * The passed Composite is added to this Composite. Adds to * this composite are actually added to the nested Composite. * Calls to nest are passed the nested Composite * @return The Composite to unest on to return to the original * state. */ public Composite nest(Composite c) { if (nest!=null) return nest.nest(c); else { add(c); nest=c; } return this; } /* ----------------------------------------------------------------- */ /** Explicit set of the Nested component. * No add is performed. setNest() obeys any current nesting and * sets the nesting of the nested component. */ public Composite setNest(Composite c) { if (nest!=null) nest.setNest(c); else nest=c; return this; } /* ----------------------------------------------------------------- */ /** Recursively unnest the composites. */ public Composite unnest() { if (nest!=null) nest.unnest(); nest = null; return this; } /* ----------------------------------------------------------------- */ /** The number of Elements in this Composite. * @return The number of elements in this Composite */ public int size() { return elements.size(); } /* ----------------------------------------------------------------- */ /** Write the composite. * The default implementation writes the elements sequentially. May * be overridden for more specialized behaviour. * @param out Writer to write the element to. */ public void write(Writer out) throws IOException { for (int i=0; i =0)?"+":"")+size); } /* ----------------------------------------------------------------- */ public Font(int size,String attributes) { this(); size(size); this.attribute(attributes); } /* ----------------------------------------------------------------- */ public Font(String attributes) { super("font",attributes); } /* ----------------------------------------------------------------- */ public Font face(String face) { attribute("face",face); return this; } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/FrameSet.java0000644000175000017500000001173010472631505024305 0ustar moonmoon// ======================================================================== // $Id: FrameSet.java,v 1.4 2004/11/20 13:32:33 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.Writer; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; /* ---------------------------------------------------------------- */ /** FrameSet. *

    * Usage *

     *      FrameSet set = new FrameSet("FrameTest","*,*","*,*");
     *      set.frame(0,0).name("Frame1",req.getRequestPath()+"?Frame=1");
     *      set.frame(0,1).name("Frame2",req.getRequestPath()+"?Frame=2");
     *      set.frame(1,0).name("Frame3",req.getRequestPath()+"?Frame=3");
     *      set.frame(1,1).name("Frame4",req.getRequestPath()+"?Frame=4");
     *      set.write(new Writer(res.getOutputStream()));
     * 
    * @version $Id: FrameSet.java,v 1.4 2004/11/20 13:32:33 gregwilkins Exp $ * @author Greg Wilkins */ public class FrameSet extends Page { Frame[][] frames=null; String colSpec=null; String rowSpec=null; int cols; int rows; String border=""; Vector frameNames=null; Hashtable frameMap=null; /* ------------------------------------------------------------ */ /** FrameSet constructor. * @param colSpec Comma separated list of column widths specified * as pixels, percentage or '*' for variable */ public FrameSet(String title, String colSpec, String rowSpec) { super(title); this.colSpec=colSpec; this.rowSpec=rowSpec; cols=1; rows=1; int i=-1; while(colSpec != null && (i=colSpec.indexOf(",",i+1))>=0) cols++; i=-1; while(rowSpec != null && (i=rowSpec.indexOf(",",i+1))>=0) rows++; frames=new Frame[cols][rows]; for(int c=0;c=0) border+=" border=\""+width+"\""; if (color!=null) border+=" bordercolor=\""+color+"\""; return this; } /* ----------------------------------------------------------------- */ public Enumeration namedFrames() { if (frameNames==null) return new Vector().elements(); return frameNames.elements(); } /* ----------------------------------------------------------------- */ public Frame frame(String name) { if (frameMap==null) return null; return (Frame) frameMap.get(name); } /* ----------------------------------------------------------------- */ /** Name a frame. * By convention, frame names match Page section names */ public Frame nameFrame(String name,int col, int row) { if (frameMap==null) { frameMap=new Hashtable(10); frameNames=new Vector(10); } Frame frame = frames[col][row]; if (frame==null) frame = frames[col][row] = new Frame(); if (frameMap.get(name)==null) frameNames.addElement(name); frameMap.put(name,frame); frame.name(name); return frame; } /* ----------------------------------------------------------------- */ public void write(Writer out) throws IOException { writeHtmlHead(out); out.write(""); for(int r=0;r"); writeElements(out); out.write(""); out.write(""); out.write(""); } }; jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Tag.java0000644000175000017500000000315410472631505023313 0ustar moonmoon// ======================================================================== // $Id: Tag.java,v 1.2 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.Writer; /* -------------------------------------------------------------------- */ /** HTML Tag Element. * A Tag element is of the generic form <TAG attributes... > * @see org.mortbay.html.Element */ public class Tag extends Element { /* ---------------------------------------------------------------- */ protected String tag; /* ---------------------------------------------------------------- */ public Tag(String tag) { this.tag=tag; } /* ---------------------------------------------------------------- */ public void write(Writer out) throws IOException { out.write('<'+tag+attributes()+'>'); } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/TableForm.java0000644000175000017500000003246210472631505024457 0ustar moonmoon// ======================================================================== // $Id: TableForm.java,v 1.6 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.Writer; import java.util.Enumeration; // ======================================================================= /** A form laid out in a Table. *

    This class creates a form and lays out all the elements within a * table. Each element added has a label part and a element part. The label * is displayed in the form beside the element. All buttons are shown at the * bottom. */ public class TableForm extends Form { /* ----------------------------------------------------------- */ private Table table = null; private Table column = null; private int columns = 1; private Composite hidden = new Composite(); private Composite buttons = null; private Composite bottomButtons = null; private String fieldAttributes = null; private boolean extendRow = false; /* ----------------------------------------------------------- */ /** Create a new TableForm. * @param target The target url to send the form contents to */ public TableForm(String target) { super(target); newTable(); super.add(hidden); } /* ----------------------------------------------------------- */ /** Add an informational section. */ public void addText(String label, String value) { Composite c = new Composite(); c.add(value); addField(label,c); } /* ----------------------------------------------------------- */ /** Add a Text Entry Field. * @param tag The form name of the element * @param label The label for the element in the table. */ public Input addTextField(String tag, String label, int length, String value) { Input i = new Input(Input.Text,tag,value); i.setSize(length); addField(label,i); return i; } /* ----------------------------------------------------------- */ /** Add a Text Area. * @param tag The form name of the element * @param label The label for the element in the table. */ public TextArea addTextArea(String tag, String label, int width, int height, String value) { TextArea ta = new TextArea(tag,value); ta.setSize(width,height); addField(label,ta); return ta; } /* ----------------------------------------------------------- */ /** Add a File Entry Field. * @param tag The form name of the element * @param label The label for the element in the table. */ public Input addFileField(String tag, String label) { Input i = new Input(Input.File,tag); addField(label,i); return i; } /* ----------------------------------------------------------- */ /** Add an informational field which also passes the data as hidden. * @param tag The form name of the element * @param label The label for the element in the table. */ public void addInfoField(String tag, String label, String value) { addText(label,value); addHiddenField(tag,value); } /* ----------------------------------------------------------- */ /** Add a hidden field. * @param tag The form name of the element */ public void addHiddenField(String tag, String value) { Element e = new Input(Input.Hidden,tag,value); hidden.add(e); } /* ----------------------------------------------------------- */ /** Add a password field. * @param tag The form name of the element * @param label The label for the element in the table. */ public void addPassword(String tag, String label, int length) { Input i = new Input(Input.Password,tag); i.setSize(length); addField(label,i); } /* ----------------------------------------------------------- */ /** * @param tag The form name of the element * @param label The label for the element in the table. */ public void addCheckbox(String tag, String label, boolean checked) { Input cb = new Input(Input.Checkbox,tag); addField(label,cb); if (checked) cb.check(); } /* ----------------------------------------------------------- */ /** Add a Select field. * @param tag The form name of the element * @param label The label for the element in the table. */ public Select addSelect(String tag, String label, boolean multiple, int size) { Select s = new Select(tag,multiple); s.setSize(size); addField(label,s); return s; } /* ----------------------------------------------------------- */ /** Add a Select field initialised with fields. * @param tag The form name of the element * @param label The label for the element in the table. */ public Select addSelect(String tag, String label, boolean multiple, int size, Enumeration values) { Select s = addSelect(tag,label,multiple,size); s.setSize(size); while (values.hasMoreElements()) s.add(values.nextElement().toString()); return s; } /* ----------------------------------------------------------- */ /* add a new button area. * A button area is a line of a column in a table form where multiple * buttons can be placed. Subsequent calls to addButton will * add buttons to this area. */ public void addButtonArea(String label) { buttons=new Composite(); addField(label,buttons); } /* ----------------------------------------------------------- */ /* add a new button area. * A button area is a line of a column in a table form where multiple * buttons can be placed. Subsequent calls to addButton will * add buttons to this area. */ public void addButtonArea() { buttons=new Composite(); addField(null,buttons); } /* ----------------------------------------------------------- */ /* add a new button row. * A button row is a line of a column in a table form where multiple * buttons can be placed, that is aligned with the left hand side of the * TableForm Subsequent calls to addButton will * add buttons to this area. */ public void addButtonRow() { buttons=new Composite(); if (!extendRow) { column.newRow(); column.addCell(buttons).left().middle(); column.cell().attribute("colspan","2"); } extendRow=false; } /* ----------------------------------------------------------- */ /* add a new button area to bottom of multicolumn form. * A button area is a line of a table form where multiple * buttons can be placed. Subsequent calls to addButton will * add buttons to this area. * This is the default if no call is made to newButtonArea. */ public void buttonsAtBottom() { if (bottomButtons!=null) buttons=bottomButtons; else { buttons=new Composite(); bottomButtons=buttons; } } /* ----------------------------------------------------------- */ /** Add a Submit Button. * @param tag The form name of the element * @param label The label for the Button */ public Input addButton(String tag, String label) { if (buttons==null) buttonsAtBottom(); Input e = new Input(Input.Submit,tag,label); if (extendRow) addField(null,e); else buttons.add(e); return e; } /* ----------------------------------------------------------- */ /** Add a reset button. * @param label The label for the element in the table. */ public void addReset(String label) { if (buttons==null) buttonsAtBottom(); Element e = new Input(Input.Reset,"Reset",label); if (extendRow) addField(null,e); else buttons.add(e); } // ------------------------------------------------------------ /** Use the given attributes on the next addXXX */ public void useAttributes(String attr){ fieldAttributes = attr; } // ------------------------------------------------------------ /** Get the internal table */ public Table table(){ return column; } // ------------------------------------------------------------ /** Get the internal table */ public Table outerTable(){ return table; } /* ----------------------------------------------------------- */ /** Extend the usage of the current row in the form. The next * element added will be added to the same row as the form and * not have a label of it's own. * @return TableForm, the this pointer so that users can write:

         *                    tableForm.extendRow().addField(...)
    */ public TableForm extendRow() { extendRow=true; return this; } /* ----------------------------------------------------------- */ /** Add an arbitrary element to the table. * @param label The label for the element in the table. */ public void addField(String label,Element field) { if (label==null) label=" "; else label=""+label+":"; if (extendRow) { column.add(field); extendRow=false; } else { column.newRow(); column.addCell(label); column.cell().right(); if (fieldAttributes != null) { column.addCell(field,fieldAttributes); fieldAttributes = null; } else column.addCell(field); } } /* ----------------------------------------------------------- */ /** Create a new column in the form. */ public void addColumn() { column = new Table(0); table.addCell(column).top(); columns++; } /* ----------------------------------------------------------- */ /** Create a new column in the form. */ public void addColumn(int spacing) { table.addCell(" ","width="+spacing); column = new Table(0); table.addCell(column); table.cell().top(); columns++; } /* ------------------------------------------------------------ */ /** Add a new sections of columns. */ public void newColumns() { column = new Table(0); columns = 1; table.newRow(); table.addCell(column); table.cell().top(); } /* ------------------------------------------------------------ */ /** Set the column span of the current column. * This call is needed for forms that have varying numbers * of columns in different sections. NB. and column spacing * counts as a column. * @param span */ public void setColumnSpan(int span) { table.cell().attribute("colspan",""+span); } /* ----------------------------------------------------------- */ /** Start using a new Table. * Anything added to the Composite parent of * this object before this is called will be added between the two * tables. */ public void newTable() { table = new Table(0); column = new Table(0); columns = 1; super.add(table); table.newRow(); table.addCell(column).top(); } /* ----------------------------------------------------------- */ public void write(Writer out) throws IOException { if (bottomButtons!=null) { table.newRow(); table.addCell(bottomButtons).attribute("colspan",columns); } super.write(out); } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/List.java0000644000175000017500000000425110472631505023512 0ustar moonmoon// ======================================================================== // $Id: List.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* -------------------------------------------------------------------- */ /** HTML List Block. * Each Element added to the List (which is a Composite) is treated * as a new List Item. * @see org.mortbay.html.Block */ public class List extends Block { /* ----------------------------------------------------------------- */ public static final String Unordered="ul"; public static final String Ordered="ol"; public static final String Menu="menu"; public static final String Directory="dir"; /* ----------------------------------------------------------------- */ public List(String type) { super(type); } /* ----------------------------------------------------------------- */ /** * @param o The item * @return This List. */ public Composite add(Object o) { super.add("
  • "); super.add(o); super.add("
  • "); return this; } /* ----------------------------------------------------------------- */ /** * @return The new Item composite */ public Composite newItem() { super.add("
  • "); Composite composite=new Composite(); super.add(composite); super.add("
  • "); return composite; } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Page.java0000644000175000017500000003003510472631505023452 0ustar moonmoon// ======================================================================== // $Id: Page.java,v 1.5 2004/09/23 02:15:15 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.Writer; import java.util.Dictionary; import java.util.Hashtable; /* --------------------------------------------------------------------- */ /** HTML Page. * A HTML Page extends composite with the addition of the HTML Header * tags, fields and elements. * Furthermore, individual parts of the page may be written or the * progressive page be output with flush. *

    * Pages contain parameters and named sections. These are used by * derived Page classes that implement a Look and Feel. Page users * may add to name sections such as "Margin" or "Footer" and set * parameters such as "HelpUrl" without knowledge of how the look and feel * will arrange these. To assist with standard look and feel creation * Page defines a set of standard names for many common parameters * and sections. *

    * If named sections are used, the page constructor or completeSections * must add the named section to the page in the appropriate places. * If named sections are not added to the page, then they can only be * written with an explicit call to write(out,"section",end); * Changes in behaviour to section creation and adding, should be controlled * via page properties. *

    * @deprecated Unless somebody steps forward to update and maintain this package * @see Composite * @version $Id: Page.java,v 1.5 2004/09/23 02:15:15 gregwilkins Exp $ * @author Greg Wilkins */ public class Page extends Composite { /* ----------------------------------------------------------------- */ public static final String Request="Request", Response="Response", Header="Header", Title="Title", Section="Section", HeaderSize="HdrSize", // HeaderSize string suitable for FRAMESET Footer="Footer", FooterSize="FtrSize", // FooterSize string suitable for FRAMESET Content="Content", ContentSize="CntSize", Margin="Margin", MarginSize="MrgSize", LeftMargin="Left", LeftMarginSize="LMSize", RightMargin="Right", RightMarginSize="RMSize", Help="Help", Home="Home", Heading="Heading", Up="Up", Prev="Prev", Next="Next", Back="Back", Target="Target", BaseUrl="BaseUrl", FgColour="FgColour", BgColour="BgColour", HighlightColour="HlColour", PageType="PageType", NoTitle="No Title" ; /* ----------------------------------------------------------------- */ protected Hashtable properties = new Hashtable(10); /* ----------------------------------------------------------------- */ Hashtable sections = new Hashtable(10); private Composite head= new Composite(); private String base=""; private boolean writtenHtmlHead = false; private boolean writtenBodyTag = false; /* ----------------------------------------------------------------- */ public Page() { this(NoTitle); } /* ----------------------------------------------------------------- */ public Page(String title) { title(title); } /* ----------------------------------------------------------------- */ public Page(String title, String attributes) { title(title); attribute(attributes); } /* ----------------------------------------------------------------- */ /** Set page title. * @return This Page (for chained commands) */ public Page title(String title) { properties.put(Title,title); String heading = (String)properties.get(Heading); if (heading==null||heading.equals(NoTitle)) properties.put(Heading,title); return this; } /* ----------------------------------------------------------------- */ /** Add element or object to the page header. * @param o The Object to add. If it is a String or Element, it is * added directly, otherwise toString() is called. * @return This Page (for chained commands) */ public Page addHeader(Object o) { head.add("\n"); head.add(o); return this; } /* ----------------------------------------------------------------- */ /** Set page background image. * @return This Page (for chained commands) */ public final Page setBackGroundImage(String bg) { attribute("background",bg); return this; } /* ----------------------------------------------------------------- */ /** Set page background color. * @return This Page (for chained commands) */ public final Page setBackGroundColor(String color) { properties.put(BgColour,color); attribute("bgcolor",color); return this; } /* ----------------------------------------------------------------- */ /** Set the URL Base for the Page. * @param target Default link target, null if none. * @param href Default absolute href, null if none. * @return This Page (for chained commands) */ public final Page setBase(String target, String href) { base=""; return this; } /* ----------------------------------------------------------------- */ /** Write the entire page by calling:
    * writeHtmlHead(out)
    * writeBodyTag(out)
    * writeElements(out)
    * writeHtmlEnd(out) */ public void write(Writer out) throws IOException { writeHtmlHead(out); writeBodyTag(out); writeElements(out); writeHtmlEnd(out); } /* ------------------------------------------------------------ */ /** Write HTML page head tags. * Write tags <HTML><head> .... </head> */ public void writeHtmlHead(Writer out) throws IOException { if (!writtenHtmlHead) { writtenHtmlHead=true; completeSections(); out.write(""); String title=(String)properties.get(Title); if (title!=null && title.length()>0 && !title.equals(NoTitle)) out.write(""+title+""); head.write(out); out.write(base); out.write("\n\n"); } } /* ------------------------------------------------------------ */ /** Write HTML page body tag. * Write tags <BODY page attributes>. */ public void writeBodyTag(Writer out) throws IOException { if (!writtenBodyTag) { writtenBodyTag = true; out.write("\n"); } } /* ------------------------------------------------------------ */ /** Write end BODY and end HTML tags. */ public void writeHtmlEnd(Writer out) throws IOException { out.write("\n\n"); out.write("\n"); } /* ------------------------------------------------------------ */ /** Write any body elements of the page. */ public void writeElements(Writer out) throws IOException { super.write(out); } /* ------------------------------------------------------------ */ /** Write page section. * The page is written containing only the named section. * If a head and bodyTag have not been written, then they * are written before the section. If endHtml is true, the * end HTML tag is also written. * If the named section is Content and it cannot be found, * then the normal page contents are written. */ public void write(Writer out, String section, boolean endHtml) throws IOException { writeHtmlHead(out); writeBodyTag(out); Composite s = getSection(section); if (s==null) { if (section.equals(Content)) writeElements(out); } else s.write(out); if (endHtml) writeHtmlEnd(out); out.flush(); } /* ------------------------------------------------------------ */ /* Flush the current contents of the page. * writeHtmlEnd() is not called and should either be * explicitly called or called via an eventual call to write() */ public void flush(Writer out) throws IOException { writeHtmlHead(out); writeBodyTag(out); super.flush(out); } /* ------------------------------------------------------------ */ /* Reset the page status to not written. * This is useful if you want to send a page more than once. */ public void rewind() { writtenHtmlHead = false; writtenBodyTag = false; } /* ------------------------------------------------------------ */ /** Access the page properties. It is up to a derived Page class * to interpret these properties. */ public Dictionary properties() { return properties; } /* ------------------------------------------------------------ */ /** Return the preferred FrameSet to be used with a specialized Page. * The Frames will be named after the sections they are to * contain. * The default implementation returns null */ public FrameSet frameSet() { return null; } /* ------------------------------------------------------------ */ /** Set a composite as a named section. Other Page users may. * add to the section by calling addTo(). It is up to the section * creator to add the section to the page in it appropriate position. */ public void setSection(String section, Composite composite) { sections.put(section,composite); } /* ------------------------------------------------------------ */ /** Set a composite as a named section and add it to the. * contents of the page */ public void addSection(String section, Composite composite) { sections.put(section,composite); add(composite); } /* ------------------------------------------------------------ */ /** Get a composite as a named section. */ public Composite getSection(String section) { return (Composite)sections.get(section); } /* ------------------------------------------------------------ */ /** Add content to a named sections. If the named section cannot. * be found, the content is added to the page. */ public void addTo(String section, Object element) { Composite s = (Composite)sections.get(section); if (s==null) add(element); else s.add(element); } /* ------------------------------------------------------------ */ /** This call back is called just before writeHeaders() actually * writes the HTML page headers. It can be implemented by a derived * Page class to complete a named section after the rest of the Page * has been created and appropriate properties set. */ protected void completeSections() { } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/TextArea.java0000644000175000017500000000357110472631505024320 0ustar moonmoon// ======================================================================== // $Id: TextArea.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* -------------------------------------------------------------------- */ /** A Text Area within a form. *

    The text in the textarea is handled by the super class, Text * @see org.mortbay.html.Text */ public class TextArea extends Block { /* ----------------------------------------------------------------- */ /** @param name The name of the TextArea within the form */ public TextArea(String name) { super("textarea"); attribute("name",name); } /* ----------------------------------------------------------------- */ /** @param name The name of the TextArea within the form * @param s The string in the text area */ public TextArea(String name, String s) { this(name); add(s); } /* ----------------------------------------------------------------- */ public TextArea setSize(int cols,int lines) { attribute("rows",lines); attribute("cols",cols); return this; } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/StyleLink.java0000644000175000017500000000434110472631505024515 0ustar moonmoon// ======================================================================== // $Id: StyleLink.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* ------------------------------------------------------------ */ /** CSS Style LINK. * * @version $Id: StyleLink.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ * @author Greg Wilkins (gregw) */ public class StyleLink extends Tag { public final static String REL="rel", HREF="href", TYPE=Style.TYPE, MEDIA=Style.MEDIA; /* ------------------------------------------------------------ */ /** Constructor. * @param href The URL of the style sheet */ public StyleLink(String href) { super("link"); attribute(REL,Style.StyleSheet); attribute(HREF,href); attribute(TYPE,Style.text_css); } /* ------------------------------------------------------------ */ /** Full Constructor. * @param rel Style Relationship, default StyleSheet if null. * @param href The URL of the style sheet * @param type The type, default text/css if null * @param media The media, not specified if null */ public StyleLink(String rel, String href, String type, String media) { super("link"); attribute(REL,rel==null?Style.StyleSheet:rel); attribute(HREF,href); attribute(TYPE,type==null?Style.text_css:type); if (media!=null) attribute(MEDIA,media); } }; jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Select.java0000644000175000017500000001303710472631505024020 0ustar moonmoon// ======================================================================== // $Id: Select.java,v 1.7 2005/08/13 00:01:23 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.util.Enumeration; /* -------------------------------------------------------------------- */ /** HTML select Block. * @see org.mortbay.html.Block */ public class Select extends Block { /* ----------------------------------------------------------------- */ /** * @param name Name of the form element * @param multiple Whether multiple selections can be made */ public Select(String name,boolean multiple) { super("select"); attribute("name",name); if (multiple) attribute("multiple"); } /* ----------------------------------------------------------------- */ /** * @param name Name of the form element * @param multiple Whether multiple selections can be made */ public Select(String name,boolean multiple, String[] options) { this(name,multiple); for (int i=0; i"); super.add(o); } return this; } /* ----------------------------------------------------------------- */ /** Add option and specify if selected. */ public Select add(Object o, boolean selected) { if (selected) super.add("

    This function takes the result returned by a multi-select input * and produces an integer bit-set result of the selections made. It * assumes the values of the multi-select are all different powers of 2. */ public static int bitsetFormResult(String result) { int i; int from = 0; int res = 0; String sres = null; while ((i = result.indexOf(' ', from)) != -1){ sres = result.substring(from, i); res = res | Integer.parseInt(sres); from = i+1; } sres = result.substring(from); res = res | Integer.parseInt(sres); return res; } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Image.java0000644000175000017500000001072010472631505023617 0ustar moonmoon// ======================================================================== // $Id: Image.java,v 1.8 2005/08/13 00:01:23 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.mortbay.log.Log; import org.mortbay.util.IO; /* ---------------------------------------------------------------- */ /** HTML Image Tag. * @see org.mortbay.html.Block * @version $Id: Image.java,v 1.8 2005/08/13 00:01:23 gregwilkins Exp $ * @author Greg Wilkins */ public class Image extends Tag { /* ------------------------------------------------------------ */ public Image(String src) { super("img"); attribute("src",src); } /* ------------------------------------------------------------ */ /** Construct from GIF file. */ public Image(String dirname, String src) { super("img"); attribute("src",src); setSizeFromGif(dirname,src); } /* ------------------------------------------------------------ */ /** Construct from GIF file. */ public Image(File gif) { super("img"); attribute("src",gif.getName()); setSizeFromGif(gif); } /* ------------------------------------------------------------ */ public Image(String src,int width, int height, int border) { this(src); width(width); height(height); border(border); } /* ------------------------------------------------------------ */ public Image border(int b) { attribute("border",b); return this; } /* ------------------------------------------------------------ */ public Image alt(String alt) { attribute("alt",alt); return this; } /* ------------------------------------------------------------ */ /** Set the image size from the header of a GIF file. * @param dirname The directory name, expected to be in OS format * @param pathname The image path name relative to the directory. * Expected to be in WWW format (i.e. with slashes) * and will be converted to OS format. */ public Image setSizeFromGif(String dirname, String pathname) { String filename =dirname + pathname.replace('/',File.separatorChar); return setSizeFromGif(filename); } /* ------------------------------------------------------------ */ /** Set the image size from the header of a GIF file. */ public Image setSizeFromGif(String filename) { return setSizeFromGif(new File(filename)); } /* ------------------------------------------------------------ */ /** Set the image size from the header of a GIF file. */ public Image setSizeFromGif(File gif) { if (gif.canRead()) { FileInputStream in = null; try{ byte [] buf = new byte[10]; in = new FileInputStream(gif); if (in.read(buf,0,10)==10) { if(Log.isDebugEnabled())Log.debug("Image "+gif.getName()+ " is " + ((0x00ff&buf[7])*256+(0x00ff&buf[6])) + " x " + (((0x00ff&buf[9])*256+(0x00ff&buf[8])))); width((0x00ff&buf[7])*256+(0x00ff&buf[6])); height(((0x00ff&buf[9])*256+(0x00ff&buf[8]))); } } catch (IOException e){ Log.ignore(e); } finally { IO.close(in); } } return this; } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Include.java0000644000175000017500000001265610472631505024172 0ustar moonmoon// ======================================================================== // $Id: Include.java,v 1.6 2005/08/13 00:01:23 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.net.URL; import org.mortbay.util.IO; /* -------------------------------------------------------------------- */ /** Include File, InputStream or Reader Element. *

    This Element includes another file. * This class expects that the HTTP directory separator '/' will be used. * This will be converted to the local directory separator. * @see Element * @version $Id: Include.java,v 1.6 2005/08/13 00:01:23 gregwilkins Exp $ * @author Greg Wilkins */ public class Include extends Element { Reader reader=null; /* ------------------------------------------------------------ */ /** Constructor. * Include file * @param directory Directory name * @param fileName file name * @exception IOException File not found */ public Include(String directory, String fileName) throws IOException { if (directory==null) directory="."; if (File.separatorChar != '/') { directory = directory.replace('/',File.separatorChar); fileName = fileName .replace('/',File.separatorChar); } includeFile(new File(directory,fileName)); } /* ------------------------------------------------------------ */ /** Constructor. * Include file. * @param fileName Filename * @exception IOException File not found */ public Include(String fileName) throws IOException { if (File.separatorChar != '/') fileName = fileName .replace('/',File.separatorChar); includeFile(new File(fileName)); } /* ------------------------------------------------------------ */ /** Constructor. * Include file. * @param file file * @exception IOException File not found */ public Include(File file) throws IOException { includeFile(file); } /* ------------------------------------------------------------ */ /** Constructor. * Include InputStream. * Byte to character transformation is done assuming the default * local character set. What this means is that on EBCDIC systems * the included file is assumed to be in EBCDIC. * @param in stream * @exception IOException */ public Include(InputStream in) throws IOException { if (in!=null) reader=new InputStreamReader(in); } /* ------------------------------------------------------------ */ /** Constructor. * Include contents of a URL. * Byte to character transformation is done assuming the default * local character set. What this means is that on EBCDIC systems * the included file is assumed to be in EBCDIC. * @param url the URL to read from. * @exception IOException */ public Include(URL url) throws IOException { if (url!=null) reader=new InputStreamReader(url.openStream()); } /* ------------------------------------------------------------ */ /** Constructor. * Include Reader. * @param in reader * @exception IOException */ public Include(Reader in) throws IOException { reader=in; } /* ------------------------------------------------------------ */ private void includeFile(File file) throws IOException { if (!file.exists()) throw new FileNotFoundException(file.toString()); if (file.isDirectory()) { List list = new List(List.Unordered); String[] ls = file.list(); for (int i=0 ; i< ls.length ; i++) list.add(ls[i]); StringWriter sw = new StringWriter(); list.write(sw); reader = new StringReader(sw.toString()); } else { reader = new BufferedReader(new FileReader(file)); } } /* ---------------------------------------------------------------- */ public void write(Writer out) throws IOException { if (reader==null) return; try{ IO.copy(reader,out); } finally { reader.close(); reader=null; } } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Break.java0000644000175000017500000000405610472631505023626 0ustar moonmoon// ======================================================================== // $Id: Break.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* -------------------------------------------------------------------- */ /** Break Tag. */ public class Break extends Tag { /* ---------------------------------------------------------------- */ /** Line Break tag type */ public final static String Line="br"; /** Rule Break tag type */ public final static String Rule="hr"; /** Paragraph Break tag type */ public final static String Para="p"; /* ---------------------------------------------------------------- */ /** Default constructor (Line Break). */ public Break() { this(Line); } /* ---------------------------------------------------------------- */ /** Constructor. * @param type The Break type */ public Break(String type) { super(type); } /* ---------------------------------------------------------------- */ /** Static instance of line break */ public final static Break line=new Break(Line); /** Static instance of rule break */ public final static Break rule=new Break(Rule); /** Static instance of paragraph break */ public final static Break para=new Break(Para); } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Text.java0000644000175000017500000000361210472631505023523 0ustar moonmoon// ======================================================================== // $Id: Text.java,v 1.2 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.util.Vector; /* -------------------------------------------------------------------- */ /** A simple block of straight text. * @deprecated all Composites now take Strings direct. */ public class Text extends Composite { /* ----------------------------------------------------------------- */ public Text() {} /* ----------------------------------------------------------------- */ public Text(String s) { add(s); } /* ----------------------------------------------------------------- */ public Text(String[] s) { add(s); } /* ----------------------------------------------------------------- */ public Text add(String[] s) { for (int i=0;i Lets you set the class name from the program, and optionally, the * size and the codebase. * *

    This class uses any attributes set in Element. * *

    Usage

    *
     * org.mortbay.Page page = new org.mortbay.html.Page();
     * page.add(new org.mortbay.Applet("org.mortbay.Foo.App"));
     * 
    * * @see org.mortbay.html.Block * @version $Id: Applet.java,v 1.7 2004/07/19 13:12:58 hlavac Exp $ * @author Matthew Watson */ public class Applet extends Block { /* ------------------------------------------------------------ */ public String codeBase = null; /* ------------------------------------------------------------ */ private boolean debug =false; private Hashtable params = null; private Composite paramHolder = new Composite(); /* ------------------------------------------------------------ */ /** Create an Applet Element. * @param className The name of the class to give for the applet */ public Applet(String className) { super("applet"); add(paramHolder); attribute("code",className); } /* ------------------------------------------------------------ */ /** Set the dimensions of the Applet. */ public Applet setDimensions(int height, int width) { width(width); height(height); return this; } /* ------------------------------------------------------------ */ /** Set whether debugging is on in the Applet. *

    This controls whether the org.mortbay.util.Code debug messages * will be printed to the java console. *

    Defaults to whether debug is turned on in the generating app */ public Applet setDebug(boolean debug){ this.debug = debug; return this; } /* ------------------------------------------------------------ */ /** * Set an alternate display for non-java browsers. * @param alt The alternate element to display * @deprecated use add */ public Applet setAlternate(Element alt) { add(alt); return this; } /* ------------------------------------------------------------ */ /** Set an alternate display for non-java browsers. * @param alt The alternate element to display * @deprecated use add */ public Applet setAlternate(String alt) { add(alt); return this; } /* ------------------------------------------------------------ */ /** Set the codebase */ public Applet codeBase(String cb) { codeBase = cb; return this; } /* ------------------------------------------------------------ */ public Applet setParam(String name, String value) { if (params == null) params = new Hashtable(10); params.put(name, value); return this; } /* ------------------------------------------------------------ */ /** Write out the HTML */ public void write(Writer out) throws IOException { if (codeBase != null) attribute("codebase",codeBase); if (debug) paramHolder.add(""); if (params != null) for (Enumeration enm = params.keys(); enm.hasMoreElements();) { String key = enm.nextElement().toString(); paramHolder.add(""); } super.write(out); } }; jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Target.java0000644000175000017500000000315610472631505024030 0ustar moonmoon// ======================================================================== // $Id: Target.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* -------------------------------------------------------------------- */ /** HTML Link Target. * This is a HTML reference (not a CSS Link). * @see StyleLink */ public class Target extends Block { /* ----------------------------------------------------------------- */ /** Construct Link. * @param target The target name */ public Target(String target) { super("a"); attribute("name",target); } /* ----------------------------------------------------------------- */ /** Construct Link. * @param target The target name * @param link Link Element */ public Target(String target,Object link) { this(target); add(link); } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Table.java0000644000175000017500000003076410472631505023636 0ustar moonmoon// ======================================================================== // $Id: Table.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.util.Hashtable; /* --------------------------------------------------------------------- */ /** A HTML Table element. *

    The Table Element works by calling newRow and then adding cells or * headings. *

    Notes
    * Tables are implemented by nesting a cell Block within a row Block * within the table which is also a Block (see nest() on class Composite). * Once a row and cell have been created, calling add or attributes on * the table actually calls the cell. * * @see org.mortbay.html.Element */ public class Table extends Block { /* ----------------------------------------------------------------- */ private Block row = null; private Block cell = null; private static Hashtable threadNestingMap = null; private CompositeFactory cellNestFactory = null; private Block _defaultHead=null; private Block _defaultCell=null; private Block _defaultRow=null; /* ----------------------------------------------------------------- */ /** Construct Table. */ public Table() { super("table"); if (threadNestingMap!=null) cellNestFactory = (CompositeFactory) threadNestingMap.get(Thread.currentThread()); } /* ----------------------------------------------------------------- */ /** Construct Table. */ public Table(int border) { super("table"); attribute("border",border); if (threadNestingMap!=null) cellNestFactory = (CompositeFactory) threadNestingMap.get(Thread.currentThread()); } /* ----------------------------------------------------------------- */ /** Construct Table with attributes. */ public Table(int border, String attributes) { this(border); attribute(attributes); } /* ----------------------------------------------------------------- */ /** Create new table row. * Attributes set after this call and before a call to newCell or * newHeader are considered row attributes. */ public Table newRow() { unnest(); nest(row = new Block("tr")); if (_defaultRow!=null) { row.setAttributesFrom(_defaultRow); if (_defaultRow.size()>0) row.add(_defaultRow.contents()); } cell=null; return this; } /* ----------------------------------------------------------------- */ /** Create new table row with attributes. * Attributes set after this call and before a call to newCell or * newHeader are considered row attributes. */ public Table newRow(String attributes) { newRow(); row.attribute(attributes); return this; } /* ----------------------------------------------------------------- */ /* Create a new Cell in the current row. * Adds to the table after this call and before next call to newRow, * newCell or newHeader are added to the cell. */ private void newBlock(String m) { if (row==null) newRow(); else row.unnest(); row.nest(cell=new Block(m)); if (cellNestFactory!=null) cell.nest(cellNestFactory.newComposite()); } /* ----------------------------------------------------------------- */ /* Create a new Cell in the current row. * Adds to the table after this call and before next call to newRow, * newCell or newHeader are added to the cell. */ public Table newCell() { newBlock("td"); if (_defaultCell!=null) { cell.setAttributesFrom(_defaultCell); if (_defaultCell.size()>0) cell.add(_defaultCell.contents()); } return this; } /* ----------------------------------------------------------------- */ /* Create a new Cell in the current row. * Adds to the table after this call and before next call to newRow, * newCell or newHeader are added to the cell. * @return This table for call chaining */ public Table newCell(String attributes) { newCell(); cell.attribute(attributes); return this; } /* ----------------------------------------------------------------- */ /* Add a new Cell in the current row. * Adds to the table after this call and before next call to newRow, * newCell or newHeader are added to the cell. * @return This table for call chaining */ public Table addCell(Object o) { newCell(); cell.add(o); return this; } /* ----------------------------------------------------------------- */ /* Add a new Cell in the current row. * Adds to the table after this call and before next call to newRow, * newCell or newHeader are added to the cell. * @return This table for call chaining */ public Table addCell(Object o, String attributes) { addCell(o); cell.attribute(attributes); return this; } /* ----------------------------------------------------------------- */ /* Create a new Heading in the current row. * Adds to the table after this call and before next call to newRow, * newCell or newHeader are added to the cell. */ public Table newHeading() { newBlock("th"); if (_defaultHead!=null) { cell.setAttributesFrom(_defaultHead); if (_defaultHead.size()>0) cell.add(_defaultHead.contents()); } return this; } /* ----------------------------------------------------------------- */ /* Add a new heading Cell in the current row. * Adds to the table after this call and before next call to newRow, * newCell or newHeader are added to the cell. * @return This table for call chaining */ public Table addHeading(Object o) { newHeading(); cell.add(o); return this; } /* ----------------------------------------------------------------- */ /* Add a new heading Cell in the current row. * Adds to the table after this call and before next call to newRow, * newCell or newHeader are added to the cell. * @return This table for call chaining */ public Table addHeading(Object o,String attributes) { addHeading(o); cell.attribute(attributes); return this; } /* ------------------------------------------------------------ */ /** Set the table cell spacing. * @param s spacing in pixels * @return This table for call chaining */ public Table cellSpacing(int s) { attribute("cellspacing",s); return this; } /* ------------------------------------------------------------ */ /** Set the table cell padding. * @param padding the cell padding in pixels * @return This table for call chaining */ public Table cellPadding(int padding) { attribute("cellpadding",padding); return this; } /* ------------------------------------------------------------ */ /** Set horizontal and vertical spacing. * @param h horizontal spacing * @param v vertical spacing * @return This table for call chaining */ public Table spacing(int h, int v) { if (h>=0) attribute("hspace",h); if (v>=0) attribute("vspace",v); return this; } /* ----------------------------------------------------------------- */ /** Get the current row Block element. * Use this call for setting row attributes. * @return The Block instance which has been nested in the table as * the row */ public Block row() { return row; } /* ----------------------------------------------------------------- */ /** Get the current cell Block element. * Use this call for setting cell attributes. * @return The Block instance which has been nested in the row as * the cell */ public Block cell() { return cell; } /* ----------------------------------------------------------------- */ /** Add cell nesting factory. * Set the CompositeFactory for this thread. Each new cell in the * table added by this thread will have a new Composite from this * factory nested in the Cell. * @param factory The factory for this Thread. If null clear this * threads factory. * @deprecated Use setNestingFactory or setThreadNestingFactory */ public static void setCellNestingFactory(CompositeFactory factory) { if (threadNestingMap==null) threadNestingMap= new Hashtable(); if (factory == null) threadNestingMap.remove(Thread.currentThread()); else threadNestingMap.put(Thread.currentThread(),factory); } /* ----------------------------------------------------------------- */ /** Add cell nesting factory for thread. * Set the CompositeFactory for this thread. Each new cell in the * table added by this thread will have a new Composite from this * factory nested in the Cell. * @param factory The factory for this Thread. If null clear this * threads factory. */ public static void setThreadNestingFactory(CompositeFactory factory) { if (threadNestingMap==null) threadNestingMap= new Hashtable(); if (factory == null) threadNestingMap.remove(Thread.currentThread()); else threadNestingMap.put(Thread.currentThread(),factory); } /* ----------------------------------------------------------------- */ /** Add cell nesting factory for table. * Set the CompositeFactory for this thread. Each new cell in the * table added by this thread will have a new Composite from this * factory nested in the Cell. * @param factory The factory for this Thread. If null clear this * threads factory. */ public void setNestingFactory(CompositeFactory factory) { cellNestFactory = factory; } /* ------------------------------------------------------------ */ /** Access the default row template. * The Block returned is used as a template for all new rows added * to the table. Thus if attributes or content are added to the * default row, the these are added to each new row in the table. * @return The default row template */ public Block defaultRow() { if (_defaultRow==null) _defaultRow=new Block("tr"); return _defaultRow; } /* ------------------------------------------------------------ */ /** Access the default header cell template. * The Block returned is used as a template for all new header cells added * to the table. Thus if attributes or content are added to the * default cell, the these are added to each new cell in the table. * @return The default head cell template */ public Block defaultHead() { if (_defaultHead==null) _defaultHead=new Block("th"); return _defaultHead; } /* ------------------------------------------------------------ */ /** Access the default cell template. * The Block returned is used as a template for all new cells added * to the table. Thus if attributes or content are added to the * default cell, the these are added to each new cell in the table. * @return The default cell template */ public Block defaultCell() { if (_defaultCell==null) _defaultCell=new Block("td"); return _defaultCell; } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Element.java0000644000175000017500000003533110472631505024173 0ustar moonmoon// ======================================================================== // $Id: Element.java,v 1.10 2005/08/13 00:01:23 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.Writer; import java.util.Enumeration; import java.util.Hashtable; import org.mortbay.log.Log; /* -------------------------------------------------------------------- */ /** HTML Element. *

    This abstract class is the base for all HTML Elements. * The feature of an abstract HTML Element is that it can be added to * HTML Pages, HTML Composites and several other HTML Elements derivations. * Elements may also have attributes set, which are handled by the derived * Element. * @deprecated Unless somebody steps forward to update and maintain this package * @see Page * @see Composite * @version $Id: Element.java,v 1.10 2005/08/13 00:01:23 gregwilkins Exp $ * @author Greg Wilkins */ public abstract class Element { /* ----------------------------------------------------------------- */ public static final String noAttributes="", ALIGN="align", LEFT="left", RIGHT="right", CENTER="center", VALIGN="valign", TOP="top", BOTTOM="bottom", MIDDLE="middle", WIDTH="width", HEIGHT="height", SIZE="size", COLOR="color", BGCOLOR="bgcolor", STYLE="style", CLASS="class", ID="id"; /* ----------------------------------------------------------------- */ /** Dimensions >=0 if set*/ private int width=-1; private int height=-1; private int size=-1; /* ----------------------------------------------------------------- */ /** The space separated string of HTML element attributes. */ private String attributes=null; protected Hashtable attributeMap=null; /* ----------------------------------------------------------------- */ /** Default constructor. */ public Element(){} /* ----------------------------------------------------------------- */ /** Construct with attributes. * @param attributes The initial attributes of the element */ public Element(String attributes) { attribute(attributes); } /* ----------------------------------------------------------------- */ /** Write element to a Writer. * This abstract method is called by the Page or other containing * Element to write the HTML for this element. This must be implemented * by the derived Element classes. * @param out Writer to write the element to. */ public abstract void write(Writer out) throws IOException; /* ----------------------------------------------------------------- */ /** Write Element to an OutputStream. * Calls print(Writer) and checks errors * Elements that override this method should also override * write(Writer) to avoid infinite recursion. * @param out OutputStream to write the element to. */ public void write(OutputStream out) throws IOException { Writer writer = new OutputStreamWriter(out); write(writer); writer.flush(); } /* ----------------------------------------------------------------- */ /** Write Element to an OutputStream. * Calls print(Writer) and checks errors * Elements that override this method should also override * write(Writer) to avoid infinite recursion. * @param out OutputStream to write the element to. */ public void write(OutputStream out, String encoding) throws IOException { Writer writer = new OutputStreamWriter(out,encoding); write(writer); writer.flush(); } /* ----------------------------------------------------------------- */ public String attributes() { if (attributes==null && attributeMap==null) return noAttributes; StringBuffer buf = new StringBuffer(128); synchronized(buf) { if (attributeMap!=null) { Enumeration e = attributeMap.keys(); while (e.hasMoreElements()) { buf.append(' '); String a = (String)e.nextElement(); buf.append(a); buf.append('='); buf.append(attributeMap.get(a).toString()); } } if(attributes!=null && attributes.length()>0) { if (!attributes.startsWith(" ")) buf.append(' '); buf.append(attributes); } } return buf.toString(); } /* ----------------------------------------------------------------- */ /** Add element Attributes. * The attributes are added to the Element attributes (separated with * a space). The attributes are available to the derived class in the * protected member String attributes * @deprecated Use attribute(String). * @param attributes String of HTML attributes to add to the element. * @return This Element so calls can be chained. */ public Element attributes(String attributes) { if (attributes==null) { this.attributes=null; return this; } if (attributes==noAttributes) return this; if (this.attributes==null) this.attributes=attributes; else this.attributes += ' '+attributes; return this; } /* ------------------------------------------------------------ */ /** Set attributes from another Element. * @param e Element * @return This Element */ public Element setAttributesFrom(Element e) { attributes=e.attributes; attributeMap=(Hashtable)e.attributeMap.clone(); return this; } /* ----------------------------------------------------------------- */ /** Add element Attributes. * The attributes are added to the Element attributes (separated with * a space). The attributes are available to the derived class in the * protected member String attributes * @param attributes String of HTML attributes to add to the element. * A null attribute clears the current attributes. * @return This Element so calls can be chained. */ public Element attribute(String attributes) { if (attributes==null || this.attributes==null || this.attributes==noAttributes || this.attributes.length()==0) this.attributes=attributes; else this.attributes += ' '+attributes; return this; } /* ----------------------------------------------------------------- */ /** Add quoted element Attributes and value. * @param attribute String of HTML attribute tag * @param value String value of the attribute to be quoted * @return This Element so calls can be chained. */ public Element attribute(String attribute, Object value) { if (attributeMap==null) attributeMap=new Hashtable(10); if (value!=null) { if (value instanceof String && ((String)value).indexOf('"')!=-1) { String s=(String)value; int q=0; while((q=s.indexOf('"',q))>=0) { s=s.substring(0,q)+"""+s.substring(++q); q+=6; } value=s; } attributeMap.put(attribute,"\""+value+'"'); } return this; } /* ----------------------------------------------------------------- */ /** Add quoted element Attributes and value. * @param attribute String of HTML attribute tag * @param value String value of the attribute to be quoted * @return This Element so calls can be chained. */ public Element attribute(String attribute, long value) { if (attributeMap==null) attributeMap=new Hashtable(10); attributeMap.put(attribute,Long.toString(value)); return this; } /* ----------------------------------------------------------------- */ /** Convert Element to String. * Uses write() to convert the HTML Element to a string. * @return String of the HTML element */ public String toString() { try{ StringWriter out = new StringWriter(); write(out); out.flush(); return out.toString(); } catch(IOException e){ Log.ignore(e); } return null; } /* ----------------------------------------------------------------- */ /** left justify. * Convenience method equivalent to attribute("align","left"). Not * applicable to all Elements. */ public Element left() { return attribute(ALIGN,LEFT); } /* ----------------------------------------------------------------- */ /** right justify. * Convenience method equivalent to attribute("align","right"). Not * applicable to all Elements. */ public Element right() { return attribute(ALIGN,RIGHT); } /* ----------------------------------------------------------------- */ /** Center. * Convenience method equivalent to attribute("align","center"). Not * applicable to all Elements. */ public Element center() { return attribute(ALIGN,CENTER); } /* ----------------------------------------------------------------- */ /** Top align. * Convenience method equivalent to attribute("valign","top"). Not * applicable to all Elements. */ public Element top() { return attribute(VALIGN,TOP); } /* ----------------------------------------------------------------- */ /** Bottom align. * Convenience method equivalent to attribute("valign","bottom"). Not * applicable to all Elements. */ public Element bottom() { return attribute(VALIGN,BOTTOM); } /* ----------------------------------------------------------------- */ /** Middle align. * Convenience method equivalent to attribute("valign","middle"). Not * applicable to all Elements. */ public Element middle() { return attribute(VALIGN,MIDDLE); } /* ----------------------------------------------------------------- */ /** set width. * Convenience method equivalent to attribute("width",w). Not * applicable to all Elements. */ public Element width(int w) { width=w; return attribute(WIDTH,w); } /* ----------------------------------------------------------------- */ /** set width. * Convenience method equivalent to attribute("width",w). Not * applicable to all Elements. */ public Element width(String w) { width=-1; return attribute(WIDTH,w); } /* ----------------------------------------------------------------- */ public int width() { return width; } /* ----------------------------------------------------------------- */ /** set height. * Convenience method equivalent to attribute("height",h). Not * applicable to all Elements. */ public Element height(int h) { height=h; return attribute(HEIGHT,h); } /* ----------------------------------------------------------------- */ /** set height. * Convenience method equivalent to attribute("height",h). Not * applicable to all Elements. */ public Element height(String h) { height=-1; return attribute(HEIGHT,h); } /* ----------------------------------------------------------------- */ public int height() { return height; } /* ----------------------------------------------------------------- */ /** set size. * Convenience method equivalent to attribute("size",s). Not * applicable to all Elements. */ public Element size(int s) { size=s; return attribute(SIZE,s); } /* ----------------------------------------------------------------- */ /** set size. * Convenience method equivalent to attribute("size",s). Not * applicable to all Elements. */ public Element size(String s) { size=-1; return attribute(SIZE,s); } /* ----------------------------------------------------------------- */ public int size() { return size; } /* ----------------------------------------------------------------- */ /** set color. * Convenience method equivalent to attribute("color",color). Not * applicable to all Elements. */ public Element color(String color) { return attribute(COLOR,color); } /* ----------------------------------------------------------------- */ /** set BGCOLOR. * Convenience method equivalent to attribute("bgcolor",color). Not * applicable to all Elements. */ public Element bgColor(String color) { return attribute(BGCOLOR,color); } /* ----------------------------------------------------------------- */ /** set CSS CLASS. */ public Element cssClass(String c) { return attribute(CLASS,c); } /* ----------------------------------------------------------------- */ /** set CSS ID. * Convenience method equivalent to attribute("id",id). */ public Element cssID(String id) { return attribute(ID,id); } /* ----------------------------------------------------------------- */ /** set Style. * Convenience method equivalent to attribute("style",style). */ public Element style(String style) { return attribute(STYLE,style); } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Frame.java0000644000175000017500000000564310472631505023637 0ustar moonmoon// ======================================================================== // $Id: Frame.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.Writer; /** FrameSet. * @version $Id: Frame.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ * @author Greg Wilkins */ public class Frame { String src=null; String name=null; String scrolling="auto"; String resize=""; String border=""; /* ------------------------------------------------------------ */ /** Frame constructor. */ Frame(){} /* ------------------------------------------------------------ */ public Frame border(boolean threeD, int width, String color) { border=" frameborder=\""+(threeD?"yes":"no")+"\""; if (width>=0) border+=" border=\""+width+"\""; if (color!=null) border+=" BORDERCOLOR=\""+color+"\""; return this; } /* ------------------------------------------------------------ */ public Frame name(String name,String src) { this.name=name; this.src=src; return this; } /* ------------------------------------------------------------ */ public Frame src(String s) { src=s; return this; } /* ------------------------------------------------------------ */ public Frame name(String n) { name=n; return this; } /* ------------------------------------------------------------ */ public Frame scrolling(boolean s) { scrolling=s?"yes":"no"; return this; } /* ------------------------------------------------------------ */ public Frame resize(boolean r) { resize=r?"":" noresize"; return this; } /* ----------------------------------------------------------------- */ void write(Writer out) throws IOException { out.write(""); } }; jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/DefList.java0000644000175000017500000000417110472631505024132 0ustar moonmoon// ======================================================================== // $Id: DefList.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.Writer; import java.util.Vector; // ======================================================================= public class DefList extends Element { // ------------------------------------------------------------ public DefList() { terms = new Vector(); defs = new Vector(); } // ------------------------------------------------------------ public void add(Element term, Element def) { terms.addElement(term); defs.addElement(def); } // ------------------------------------------------------------ public void write(Writer out) throws IOException { out.write(""); if (terms.size() != defs.size()) throw new Error("mismatched Vector sizes"); for (int i=0; i "); ((Element)terms.elementAt(i)).write(out); out.write("

    "); ((Element)defs.elementAt(i)).write(out); out.write("
    "); } out.write(""); } // ------------------------------------------------------------ private Vector terms; private Vector defs; } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/CompositeFactory.java0000644000175000017500000000221010472631505026062 0ustar moonmoon// ======================================================================== // $Id: CompositeFactory.java,v 1.2 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* --------------------------------------------------------------------- */ /** Composite Factory. * Abstract interface for production of composites */ public interface CompositeFactory { public Composite newComposite(); } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Block.java0000644000175000017500000000653610472631505023641 0ustar moonmoon// ======================================================================== // $Id: Block.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; import java.io.IOException; import java.io.Writer; /* -------------------------------------------------------------------- */ /** HTML Block Composite. * Block of predefined or arbitrary type. * Block types are predefined for PRE, BLOCKQUOTE, CENTER, LISTING, * PLAINTEXT, XMP, DIV (Left and Right) and SPAN. * @see org.mortbay.html.Composite */ public class Block extends Composite { /* ----------------------------------------------------------------- */ /** Preformatted text */ public static final String Pre="pre"; /** Quoted Text */ public static final String Quote="blockquote"; /** Center the block */ public static final String Center="center"; /** Code listing style */ public static final String Listing="listing"; /** Plain text */ public static final String Plain="plaintext"; /** Old pre format - preserve line breaks */ public static final String Xmp="xmp"; /** Basic Division */ public static final String Div="div"; /** Left align */ public static final String Left="divl"; /** Right align */ public static final String Right="divr"; /** Bold */ public static final String Bold="b"; /** Italic */ public static final String Italic="i"; /** Span */ public static final String Span="span"; /* ----------------------------------------------------------------- */ private String tag; /* ----------------------------------------------------------------- */ /** Construct a block using the passed string as the tag. * @param tag The tag to use to open and close the block. */ public Block(String tag) { this.tag=tag; if (tag==Left) { tag=Div; left(); } if (tag==Right) { tag=Div; right(); } } /* ----------------------------------------------------------------- */ /** Construct a block using the passed string as the tag. * @param tag The tag to use to open and close the block. * @param attributes String of attributes for opening tag. */ public Block(String tag, String attributes) { super(attributes); this.tag=tag; } /* ----------------------------------------------------------------- */ public void write(Writer out) throws IOException { out.write('<'+tag+attributes()+'>'); super.write(out); out.write(""); } } jetty-6.1.26/modules/html/src/main/java/org/mortbay/html/Link.java0000644000175000017500000000357310472631505023502 0ustar moonmoon// ======================================================================== // $Id: Link.java,v 1.3 2004/05/09 20:31:28 gregwilkins Exp $ // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.html; /* -------------------------------------------------------------------- */ /** HTML Link Block. * This is a HTML reference (not a CSS Link). * @see StyleLink */ public class Link extends Block { /* ----------------------------------------------------------------- */ /** Construct Link. * @param href The target URL of the link */ public Link(String href) { super("a"); attribute("href",href); } /* ----------------------------------------------------------------- */ /** Construct Link. * @param href The target URL of the link * @param link Link Element */ public Link(String href,Object link) { this(href); add(link); } /* ----------------------------------------------------------------- */ /** Set the link target frame. */ public Link target(String t) { if (t!=null && t.length()>0) attribute("target",t); return this; } } jetty-6.1.26/modules/html/pom.xml0000644000175000017500000000424611466510412015406 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-html Jetty HTML src/test/java **/*Test.java org/mortbay/**/*.xml **/Abstract*.java maven-antrun-plugin clean clean run copyjar install run junit junit test org.mortbay.jetty jetty ${project.version} jetty-6.1.26/modules/jsp-2.0/0000755000175000017500000000000011745736473014231 5ustar moonmoonjetty-6.1.26/modules/jsp-2.0/pom.xml0000644000175000017500000001743411466510412015536 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 jsp-2.0 pom JSP 2.0 Jasper dependencies install maven-antrun-plugin clean clean run org.codehaus.mojo dependency-maven-plugin install copy org.slf4j slf4j-simple ${slf4j-version} org.slf4j slf4j-api ${slf4j-version} tomcat jasper-compiler-jdt ${jasper-version} org.slf4j jcl104-over-slf4j ${slf4j-version} commons-el commons-el ${commons-el-version} xerces xercesImpl ${xerces-version} tomcat jasper-compiler ${jasper-version} ant ant ${ant-version} tomcat jasper-runtime ${jasper-version} xerces xmlParserAPIs ${xerces-version} ${basedir}/../../lib/jsp-2.0 org.slf4j slf4j-api ${slf4j-version} runtime org.slf4j slf4j-simple runtime tomcat jasper-compiler-jdt ${jasper-version} org.slf4j jcl104-over-slf4j ${slf4j-version} runtime xerces xmlParserAPIs 2.6.2 commons-el commons-el ${commons-el-version} runtime log4j log4j commons-logging commons-logging logkit logkit xerces xercesImpl ${xerces-version} runtime org.mortbay.jetty servlet-api ${servlet-version} tomcat jasper-compiler ${jasper-version} servlet-api javax.servlet javax.servlet jsp-api org.mortbay.jetty jsp-api-2.0 ${project.version} ant ant ${ant-version} runtime tomcat jasper-runtime ${jasper-version} servlet-api javax.servlet xerces xmlParserAPIs ${xerces-version} runtime 2.6.2 5.5.15 1.0 jetty-6.1.26/modules/naming/0000755000175000017500000000000011745736473014411 5ustar moonmoonjetty-6.1.26/modules/naming/src/0000755000175000017500000000000011745736473015200 5ustar moonmoonjetty-6.1.26/modules/naming/src/test/0000755000175000017500000000000011745736473016157 5ustar moonmoonjetty-6.1.26/modules/naming/src/test/java/0000755000175000017500000000000011745736473017100 5ustar moonmoonjetty-6.1.26/modules/naming/src/test/java/org/0000755000175000017500000000000011745736473017667 5ustar moonmoonjetty-6.1.26/modules/naming/src/test/java/org/mortbay/0000755000175000017500000000000011745736473021344 5ustar moonmoonjetty-6.1.26/modules/naming/src/test/java/org/mortbay/naming/0000755000175000017500000000000011745736473022615 5ustar moonmoonjetty-6.1.26/modules/naming/src/test/java/org/mortbay/naming/factories/0000755000175000017500000000000011745736473024574 5ustar moonmoonjetty-6.1.26/modules/naming/src/test/java/org/mortbay/naming/factories/TestMailSessionReference.java0000644000175000017500000000544511065421731032333 0ustar moonmoon// ======================================================================== // $Id: TestMailSessionReference.java 3680 2008-09-21 10:37:13Z janb $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming.factories; import java.util.Properties; import javax.mail.Session; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.LinkRef; import javax.naming.Name; import javax.naming.NameParser; import org.mortbay.naming.NamingUtil; import junit.framework.TestCase; /** * TestMailSessionReference * * */ public class TestMailSessionReference extends TestCase { public void testMailSessionReference () throws Exception { InitialContext icontext = new InitialContext(); MailSessionReference sref = new MailSessionReference(); sref.setUser("janb"); sref.setPassword("OBF:1xmk1w261z0f1w1c1xmq"); Properties props = new Properties (); props.put("mail.smtp.host", "xxx"); props.put("mail.debug", "true"); sref.setProperties(props); NamingUtil.bind(icontext, "mail/Session", sref); Object x = icontext.lookup("mail/Session"); assertNotNull(x); assertTrue(x instanceof javax.mail.Session); javax.mail.Session session = (javax.mail.Session)x; Properties sessionProps = session.getProperties(); assertEquals(props, sessionProps); assertTrue (session.getDebug()); Context foo = icontext.createSubcontext("foo"); NameParser parser = icontext.getNameParser(""); Name objectNameInNamespace = parser.parse(icontext.getNameInNamespace()); objectNameInNamespace.addAll(parser.parse("mail/Session")); NamingUtil.bind(foo, "mail/Session", new LinkRef(objectNameInNamespace.toString())); Object o = foo.lookup("mail/Session"); assertNotNull(o); Session fooSession = (Session)o; assertEquals(props, fooSession.getProperties()); assertTrue(fooSession.getDebug()); icontext.destroySubcontext("mail"); icontext.destroySubcontext("foo"); } } jetty-6.1.26/modules/naming/src/test/java/org/mortbay/naming/java/0000755000175000017500000000000011745736473023536 5ustar moonmoonjetty-6.1.26/modules/naming/src/test/java/org/mortbay/naming/java/TestLocalJNDI.java0000644000175000017500000000346411065421731026726 0ustar moonmoonpackage org.mortbay.naming.java; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NameNotFoundException; import javax.naming.NameParser; import junit.framework.TestCase; import org.mortbay.naming.NamingUtil; public class TestLocalJNDI extends TestCase { public void setUp () throws Exception { } public void tearDown () throws Exception { InitialContext ic = new InitialContext(); ic.destroySubcontext("a"); } public void testLocal () throws Exception { InitialContext ic = new InitialContext(); NameParser parser = ic.getNameParser(""); ic.bind("foo", "xxx"); Object o = ic.lookup("foo"); assertNotNull(o); assertEquals("xxx", (String)o); ic.unbind("foo"); try { ic.lookup("foo"); fail("Foo exists"); } catch (NameNotFoundException e) { //expected } Name name = parser.parse("a"); name.addAll(parser.parse("b/c/d")); NamingUtil.bind(ic, name.toString(), "333"); assertNotNull(ic.lookup("a")); assertNotNull(ic.lookup("a/b")); assertNotNull(ic.lookup("a/b/c")); Context c = (Context)ic.lookup("a/b/c"); o = c.lookup("d"); assertNotNull(o); assertEquals("333", (String)o); assertEquals("333", ic.lookup(name)); ic.destroySubcontext("a"); name = parser.parse(""); name.add("x"); Name suffix = parser.parse("y/z"); name.addAll(suffix); NamingUtil.bind(ic, name.toString(), "555"); assertEquals("555", ic.lookup(name)); ic.destroySubcontext("x"); } } jetty-6.1.26/modules/naming/src/test/java/org/mortbay/naming/java/TestJNDI.java0000644000175000017500000002457611065421731025762 0ustar moonmoon// ======================================================================== // $Id: TestJNDI.java 3680 2008-09-21 10:37:13Z janb $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming.java; import java.net.URL; import java.net.URLClassLoader; import java.util.HashMap; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.LinkRef; import javax.naming.Name; import javax.naming.NameAlreadyBoundException; import javax.naming.NameClassPair; import javax.naming.NameNotFoundException; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.naming.spi.ObjectFactory; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.mortbay.log.Log; import org.mortbay.naming.NamingContext; public class TestJNDI extends TestCase { public static class MyObjectFactory implements ObjectFactory { public static String myString = "xxx"; public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception { return myString; } } public TestJNDI (String name) { super (name); } public static Test suite () { return new TestSuite (TestJNDI.class); } public void setUp () throws Exception { } public void tearDown () throws Exception { } public void testIt () throws Exception { try { //set up some classloaders Thread currentThread = Thread.currentThread(); ClassLoader currentLoader = currentThread.getContextClassLoader(); ClassLoader childLoader1 = new URLClassLoader(new URL[0], currentLoader); ClassLoader childLoader2 = new URLClassLoader(new URL[0], currentLoader); //set the current thread's classloader currentThread.setContextClassLoader(childLoader1); InitialContext initCtxA = new InitialContext(); initCtxA.bind ("blah", "123"); assertEquals ("123", initCtxA.lookup("blah")); InitialContext initCtx = new InitialContext(); Context sub0 = (Context)initCtx.lookup("java:"); if(Log.isDebugEnabled())Log.debug("------ Looked up java: --------------"); Name n = sub0.getNameParser("").parse("/red/green/"); if(Log.isDebugEnabled())Log.debug("get(0)="+n.get(0)); if(Log.isDebugEnabled())Log.debug("getPrefix(1)="+n.getPrefix(1)); n = n.getSuffix(1); if(Log.isDebugEnabled())Log.debug("getSuffix(1)="+n); if(Log.isDebugEnabled())Log.debug("get(0)="+n.get(0)); if(Log.isDebugEnabled())Log.debug("getPrefix(1)="+n.getPrefix(1)); n = n.getSuffix(1); if(Log.isDebugEnabled())Log.debug("getSuffix(1)="+n); if(Log.isDebugEnabled())Log.debug("get(0)="+n.get(0)); if(Log.isDebugEnabled())Log.debug("getPrefix(1)="+n.getPrefix(1)); n = n.getSuffix(1); if(Log.isDebugEnabled())Log.debug("getSuffix(1)="+n); n = sub0.getNameParser("").parse("pink/purple/"); if(Log.isDebugEnabled())Log.debug("get(0)="+n.get(0)); if(Log.isDebugEnabled())Log.debug("getPrefix(1)="+n.getPrefix(1)); n = n.getSuffix(1); if(Log.isDebugEnabled())Log.debug("getSuffix(1)="+n); if(Log.isDebugEnabled())Log.debug("get(0)="+n.get(0)); if(Log.isDebugEnabled())Log.debug("getPrefix(1)="+n.getPrefix(1)); NamingContext ncontext = (NamingContext)sub0; Name nn = ncontext.toCanonicalName(ncontext.getNameParser("").parse("/yellow/blue/")); Log.debug(nn.toString()); assertEquals (2, nn.size()); nn = ncontext.toCanonicalName(ncontext.getNameParser("").parse("/yellow/blue")); Log.debug(nn.toString()); assertEquals (2, nn.size()); nn = ncontext.toCanonicalName(ncontext.getNameParser("").parse("/")); if(Log.isDebugEnabled())Log.debug("/ parses as: "+nn+" with size="+nn.size()); Log.debug(nn.toString()); assertEquals (1, nn.size()); nn = ncontext.toCanonicalName(ncontext.getNameParser("").parse("")); Log.debug(nn.toString()); assertEquals (0, nn.size()); Context fee = ncontext.createSubcontext("fee"); fee.bind ("fi", "88"); assertEquals("88", initCtxA.lookup("java:/fee/fi")); assertEquals("88", initCtxA.lookup("java:/fee/fi/")); assertTrue (initCtxA.lookup("java:/fee/") instanceof javax.naming.Context); try { Context sub1 = sub0.createSubcontext ("comp"); fail("Comp should already be bound"); } catch (NameAlreadyBoundException e) { //expected exception } //check bindings at comp Context sub1 = (Context)initCtx.lookup("java:comp"); Context sub2 = sub1.createSubcontext ("env"); initCtx.bind ("java:comp/env/rubbish", "abc"); assertEquals ("abc", (String)initCtx.lookup("java:comp/env/rubbish")); //check binding LinkRefs LinkRef link = new LinkRef ("java:comp/env/rubbish"); initCtx.bind ("java:comp/env/poubelle", link); assertEquals ("abc", (String)initCtx.lookup("java:comp/env/poubelle")); //check binding References StringRefAddr addr = new StringRefAddr("blah", "myReferenceable"); Reference ref = new Reference (java.lang.String.class.getName(), addr, MyObjectFactory.class.getName(), (String)null); initCtx.bind ("java:comp/env/quatsch", ref); assertEquals (MyObjectFactory.myString, (String)initCtx.lookup("java:comp/env/quatsch")); //test binding something at java: Context sub3 = initCtx.createSubcontext("java:zero"); initCtx.bind ("java:zero/one", "ONE"); assertEquals ("ONE", initCtx.lookup("java:zero/one")); //change the current thread's classloader to check distinct naming currentThread.setContextClassLoader(childLoader2); Context otherSub1 = (Context)initCtx.lookup("java:comp"); assertTrue (!(sub1 == otherSub1)); try { initCtx.lookup("java:comp/env/rubbish"); } catch (NameNotFoundException e) { //expected } //put the thread's classloader back currentThread.setContextClassLoader(childLoader1); //test rebind with existing binding initCtx.rebind("java:comp/env/rubbish", "xyz"); assertEquals ("xyz", initCtx.lookup("java:comp/env/rubbish")); //test rebind with no existing binding initCtx.rebind ("java:comp/env/mullheim", "hij"); assertEquals ("hij", initCtx.lookup("java:comp/env/mullheim")); //test that the other bindings are already there assertEquals ("xyz", (String)initCtx.lookup("java:comp/env/poubelle")); //test java:/comp/env/stuff assertEquals ("xyz", (String)initCtx.lookup("java:/comp/env/poubelle/")); //test list Names NamingEnumeration nenum = initCtx.list ("java:comp/env"); HashMap results = new HashMap(); while (nenum.hasMore()) { NameClassPair ncp = (NameClassPair)nenum.next(); results.put (ncp.getName(), ncp.getClassName()); } assertEquals (4, results.size()); assertEquals ("java.lang.String", (String)results.get("rubbish")); assertEquals ("javax.naming.LinkRef", (String)results.get("poubelle")); assertEquals ("java.lang.String", (String)results.get("mullheim")); assertEquals ("javax.naming.Reference", (String)results.get("quatsch")); //test list Bindings NamingEnumeration benum = initCtx.list("java:comp/env"); assertEquals (4, results.size()); //test NameInNamespace assertEquals ("comp/env", sub2.getNameInNamespace()); //test close does nothing Context closeCtx = (Context)initCtx.lookup("java:comp/env"); closeCtx.close(); //test what happens when you close an initial context InitialContext closeInit = new InitialContext(); closeInit.close(); //check locking the context Context ectx = (Context)initCtx.lookup("java:comp"); ectx.bind("crud", "xxx"); ectx.addToEnvironment("org.mortbay.jndi.immutable", "TRUE"); assertEquals ("xxx", (String)initCtx.lookup("java:comp/crud")); try { ectx.bind("crud2", "xxx2"); } catch (NamingException ne) { //expected failure to modify immutable context } //test what happens when you close an initial context that was used initCtx.close(); } finally { InitialContext ic = new InitialContext(); Context comp = (Context)ic.lookup("java:comp"); comp.destroySubcontext("env"); } } } jetty-6.1.26/modules/naming/src/main/0000755000175000017500000000000011745736473016124 5ustar moonmoonjetty-6.1.26/modules/naming/src/main/java/0000755000175000017500000000000011745736473017045 5ustar moonmoonjetty-6.1.26/modules/naming/src/main/java/org/0000755000175000017500000000000011745736473017634 5ustar moonmoonjetty-6.1.26/modules/naming/src/main/java/org/mortbay/0000755000175000017500000000000011745736473021311 5ustar moonmoonjetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/0000755000175000017500000000000011745736473022562 5ustar moonmoonjetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/factories/0000755000175000017500000000000011745736473024541 5ustar moonmoonjetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/factories/MailSessionReference.java0000644000175000017500000001340110536323222031425 0ustar moonmoon// ======================================================================== // $Id: MailSessionReference.java 1386 2006-12-08 17:53:22Z janb $ // Copyright 1999-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming.factories; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; import javax.mail.Session; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Properties; import javax.naming.Context; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; import javax.naming.spi.ObjectFactory; import org.mortbay.jetty.security.Password; /** * MailSessionReference * * This is a subclass of javax.mail.Reference and an ObjectFactory for javax.mail.Session objects. * * The subclassing of Reference allows all of the setup for a javax.mail.Session * to be captured without necessitating first instantiating a Session object. The * reference is bound into JNDI and it is only when the reference is looked up that * this object factory will create an instance of javax.mail.Session using the * information captured in the Reference. * */ public class MailSessionReference extends Reference implements ObjectFactory { public static class PasswordAuthenticator extends Authenticator { PasswordAuthentication passwordAuthentication; private String user; private String password; public PasswordAuthenticator() { } public PasswordAuthenticator(String user, String password) { passwordAuthentication = new PasswordAuthentication (user, (password.startsWith(Password.__OBFUSCATE)?Password.deobfuscate(password):password)); } public PasswordAuthentication getPasswordAuthentication() { return passwordAuthentication; } public void setUser (String user) { this.user = user; } public String getUser () { return this.user; } public String getPassword () { return this.password; } public void setPassword(String password) { this.password = password; } }; /** * */ public MailSessionReference() { super ("javax.mail.Session", MailSessionReference.class.getName(), null); } /** * Create a javax.mail.Session instance based on the information passed in the Reference * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable) * @param ref the Reference * @param arg1 not used * @param arg2 not used * @param arg3 not used * @return * @throws Exception */ public Object getObjectInstance(Object ref, Name arg1, Context arg2, Hashtable arg3) throws Exception { if (ref == null) return null; Reference reference = (Reference)ref; Properties props = new Properties(); String user = null; String password = null; Enumeration refs = reference.getAll(); while (refs.hasMoreElements()) { RefAddr refAddr = (RefAddr)refs.nextElement(); String name = refAddr.getType(); String value = (String)refAddr.getContent(); if (name.equalsIgnoreCase("user")) user = value; else if (name.equalsIgnoreCase("pwd")) password = value; else props.put(name, value); } if (password == null) return Session.getInstance(props); else return Session.getInstance(props, new PasswordAuthenticator(user, password)); } public void setUser (String user) { StringRefAddr addr = (StringRefAddr)get("user"); if (addr != null) { throw new RuntimeException ("user already set on SessionReference, can't be changed"); } add(new StringRefAddr("user", user)); } public void setPassword (String password) { StringRefAddr addr = (StringRefAddr)get("pwd"); if (addr != null) throw new RuntimeException ("password already set on SessionReference, can't be changed"); add(new StringRefAddr ("pwd", password)); } public void setProperties (Properties properties) { Iterator entries = properties.entrySet().iterator(); while (entries.hasNext()) { Map.Entry e = (Map.Entry)entries.next(); StringRefAddr sref = (StringRefAddr)get((String)e.getKey()); if (sref != null) throw new RuntimeException ("property "+e.getKey()+" already set on Session reference, can't be changed"); add(new StringRefAddr((String)e.getKey(), (String)e.getValue())); } } } jetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/java/0000755000175000017500000000000011745736473023503 5ustar moonmoonjetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/java/javaNameParser.java0000644000175000017500000000337610376105106027234 0ustar moonmoon// ======================================================================== // $Id: javaNameParser.java 231 2006-02-19 15:09:58Z janb $ // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming.java; import java.util.Properties; import javax.naming.CompoundName; import javax.naming.Name; import javax.naming.NameParser; import javax.naming.NamingException; /** * javaNameParser * */ public class javaNameParser implements NameParser { static Properties syntax = new Properties(); static { syntax.put("jndi.syntax.direction", "left_to_right"); syntax.put("jndi.syntax.separator", "/"); syntax.put("jndi.syntax.ignorecase", "false"); } /** * Parse a name into its components. * @param name The non-null string name to parse. * @return A non-null parsed form of the name using the naming convention * of this parser. * @exception NamingException If a naming exception was encountered. */ public Name parse(String name) throws NamingException { return new CompoundName(name, syntax); } } jetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/java/javaURLContextFactory.java0000644000175000017500000000661410376105106030534 0ustar moonmoon// ======================================================================== // $Id: javaURLContextFactory.java 231 2006-02-19 15:09:58Z janb $ // Copyright 1999-2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming.java; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.spi.ObjectFactory; import org.mortbay.log.Log; /** javaURLContextFactory *

    This is the URL context factory for the java: URL. * *

    Notes

    *

    * *

    Usage

    *
     */
    /*
    * 
    * * @see * * @author Jan Bartel * @version 1.0 */ public class javaURLContextFactory implements ObjectFactory { /** * Either return a new context or the resolution of a url. * * @param url an Object value * @param name a Name value * @param ctx a Context value * @param env a Hashtable value * @return a new context or the resolved object for the url * @exception Exception if an error occurs */ public Object getObjectInstance(Object url, Name name, Context ctx, Hashtable env) throws Exception { // null object means return a root context for doing resolutions if (url == null) { if(Log.isDebugEnabled())Log.debug(">>> new root context requested "); return new javaRootURLContext(env); } // return the resolution of the url if (url instanceof String) { if(Log.isDebugEnabled())Log.debug(">>> resolution of url "+url+" requested"); Context rootctx = new javaRootURLContext (env); return rootctx.lookup ((String)url); } // return the resolution of at least one of the urls if (url instanceof String[]) { if(Log.isDebugEnabled())Log.debug(">>> resolution of array of urls requested"); String[] urls = (String[])url; Context rootctx = new javaRootURLContext (env); Object object = null; NamingException e = null; for (int i=0;(i< urls.length) && (object == null); i++) { try { object = rootctx.lookup (urls[i]); } catch (NamingException x) { e = x; } } if (object == null) throw e; else return object; } if(Log.isDebugEnabled())Log.debug(">>> No idea what to do, so return a new root context anyway"); return new javaRootURLContext (env); } }; jetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/java/javaRootURLContext.java0000644000175000017500000001766710477277702030100 0ustar moonmoon// ======================================================================== // $Id: javaRootURLContext.java 887 2006-09-05 13:46:42Z janb $ // Copyright 1999-2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming.java; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.NameParser; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import org.mortbay.log.Log; import org.mortbay.naming.ContextFactory; import org.mortbay.naming.NamingContext; /** javaRootURLContext *

    This is the root of the java: url namespace * *

    Notes

    *

    Thanks to Rickard Oberg for the idea of binding an ObjectFactory at "comp". * *

    Usage

    *
     */
    /*
    * 
    * * @see * * @author Jan Bartel * @version 1.0 */ public class javaRootURLContext implements Context { public static final String URL_PREFIX = "java:"; protected Hashtable _env; protected static NamingContext _nameRoot; protected static NameParser _javaNameParser; static { try { _javaNameParser = new javaNameParser(); _nameRoot = new NamingContext(); _nameRoot.setNameParser(_javaNameParser); StringRefAddr parserAddr = new StringRefAddr("parser", _javaNameParser.getClass().getName()); Reference ref = new Reference ("javax.naming.Context", parserAddr, ContextFactory.class.getName(), (String)null); //bind special object factory at comp _nameRoot.bind ("comp", ref); } catch (Exception e) { Log.warn(e); } } /*------------------------------------------------*/ /** * Creates a new javaRootURLContext instance. * * @param env a Hashtable value */ public javaRootURLContext(Hashtable env) { _env = env; } public Object lookup(Name name) throws NamingException { return getRoot().lookup(stripProtocol(name)); } public Object lookup(String name) throws NamingException { return getRoot().lookup(stripProtocol(name)); } public void bind(Name name, Object obj) throws NamingException { getRoot().bind(stripProtocol(name), obj); } public void bind(String name, Object obj) throws NamingException { getRoot().bind(stripProtocol(name), obj); } public void unbind (String name) throws NamingException { getRoot().unbind(stripProtocol(name)); } public void unbind (Name name) throws NamingException { getRoot().unbind(stripProtocol(name)); } public void rename (String oldStr, String newStr) throws NamingException { getRoot().rename (stripProtocol(oldStr), stripProtocol(newStr)); } public void rename (Name oldName, Name newName) throws NamingException { getRoot().rename (stripProtocol(oldName), stripProtocol(newName)); } public void rebind (Name name, Object obj) throws NamingException { getRoot().rebind(stripProtocol(name), obj); } public void rebind (String name, Object obj) throws NamingException { getRoot().rebind(stripProtocol(name), obj); } public Object lookupLink (Name name) throws NamingException { return getRoot().lookupLink(stripProtocol(name)); } public Object lookupLink (String name) throws NamingException { return getRoot().lookupLink(stripProtocol(name)); } public Context createSubcontext (Name name) throws NamingException { return getRoot().createSubcontext(stripProtocol(name)); } public Context createSubcontext (String name) throws NamingException { return getRoot().createSubcontext(stripProtocol(name)); } public void destroySubcontext (Name name) throws NamingException { getRoot().destroySubcontext(stripProtocol(name)); } public void destroySubcontext (String name) throws NamingException { getRoot().destroySubcontext(stripProtocol(name)); } public NamingEnumeration list(Name name) throws NamingException { return getRoot().list(stripProtocol(name)); } public NamingEnumeration list(String name) throws NamingException { return getRoot().list(stripProtocol(name)); } public NamingEnumeration listBindings(Name name) throws NamingException { return getRoot().listBindings(stripProtocol(name)); } public NamingEnumeration listBindings(String name) throws NamingException { return getRoot().listBindings(stripProtocol(name)); } public Name composeName (Name name, Name prefix) throws NamingException { return getRoot().composeName(name, prefix); } public String composeName (String name, String prefix) throws NamingException { return getRoot().composeName(name, prefix); } public void close () throws NamingException { } public String getNameInNamespace () throws NamingException { return URL_PREFIX; } public NameParser getNameParser (Name name) throws NamingException { return _javaNameParser; } public NameParser getNameParser (String name) throws NamingException { return _javaNameParser; } public Object addToEnvironment(String propName, Object propVal) throws NamingException { return _env.put (propName,propVal); } public Object removeFromEnvironment(String propName) throws NamingException { return _env.remove (propName); } public Hashtable getEnvironment () { return _env; } protected NamingContext getRoot () { return _nameRoot; } protected Name stripProtocol (Name name) throws NamingException { if ((name != null) && (name.size() > 0)) { String head = name.get(0); if(Log.isDebugEnabled())Log.debug("Head element of name is: "+head); if (head.startsWith(URL_PREFIX)) { head = head.substring (URL_PREFIX.length()); name.remove(0); if (head.length() > 0) name.add(0, head); if(Log.isDebugEnabled())Log.debug("name modified to "+name.toString()); } } return name; } protected String stripProtocol (String name) { String newName = name; if ((name != null) && (!name.equals(""))) { if (name.startsWith(URL_PREFIX)) newName = name.substring(URL_PREFIX.length()); } return newName; } } jetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/InitialContextFactory.java0000644000175000017500000000532610532630416027700 0ustar moonmoon// ======================================================================== // $Id: InitialContextFactory.java 1327 2006-11-27 18:40:14Z janb $ // Copyright 1999-2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming; import java.util.Hashtable; import java.util.Properties; import javax.naming.CompoundName; import javax.naming.Context; import javax.naming.Name; import javax.naming.NameParser; import javax.naming.NamingException; import org.mortbay.log.Log; import org.mortbay.naming.local.localContextRoot; /*------------------------------------------------*/ /** * InitialContextFactory.java * * Factory for the default InitialContext. * Created: Tue Jul 1 19:08:08 2003 * * @author Jan Bartel * @version 1.0 */ public class InitialContextFactory implements javax.naming.spi.InitialContextFactory { public static class DefaultParser implements NameParser { static Properties syntax = new Properties(); static { syntax.put("jndi.syntax.direction", "left_to_right"); syntax.put("jndi.syntax.separator", "/"); syntax.put("jndi.syntax.ignorecase", "false"); } public Name parse (String name) throws NamingException { return new CompoundName (name, syntax); } }; /*------------------------------------------------*/ /** * Get Context that has access to default Namespace. * This method won't be called if a name URL beginning * with java: is passed to an InitialContext. * * @see org.mortbay.naming.java.javaURLContextFactory * @param env a Hashtable value * @return a Context value */ public Context getInitialContext(Hashtable env) { Log.debug("InitialContextFactory.getInitialContext()"); Context ctx = new localContextRoot(env); if(Log.isDebugEnabled())Log.debug("Created initial context delegate for local namespace:"+ctx); return ctx; } } jetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/NamingUtil.java0000644000175000017500000001070111065421731025452 0ustar moonmoon// ======================================================================== // $Id: NamingUtil.java 3680 2008-09-21 10:37:13Z janb $ // Copyright 1999-2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming; import java.util.HashMap; import java.util.Map; import javax.naming.Binding; import javax.naming.Context; import javax.naming.Name; import javax.naming.NameNotFoundException; import javax.naming.NameParser; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import org.mortbay.log.Log; /** * Util.java * * * Created: Tue Jul 1 18:26:17 2003 * * @author Jan Bartel * @version 1.0 */ public class NamingUtil { /* ------------------------------------------------------------ */ /** * Bind an object to a context ensuring all subcontexts * are created if necessary * * @param ctx the context into which to bind * @param name the name relative to context to bind * @param obj the object to be bound * @exception NamingException if an error occurs */ public static Context bind (Context ctx, String nameStr, Object obj) throws NamingException { Name name = ctx.getNameParser("").parse(nameStr); //no name, nothing to do if (name.size() == 0) return null; Context subCtx = ctx; //last component of the name will be the name to bind for (int i=0; i < name.size() - 1; i++) { try { subCtx = (Context)subCtx.lookup (name.get(i)); if(Log.isDebugEnabled())Log.debug("Subcontext "+name.get(i)+" already exists"); } catch (NameNotFoundException e) { subCtx = subCtx.createSubcontext(name.get(i)); if(Log.isDebugEnabled())Log.debug("Subcontext "+name.get(i)+" created"); } } subCtx.rebind (name.get(name.size() - 1), obj); if(Log.isDebugEnabled())Log.debug("Bound object to "+name.get(name.size() - 1)); return subCtx; } public static void unbind (Context ctx) throws NamingException { //unbind everything in the context and all of its subdirectories NamingEnumeration ne = ctx.listBindings(ctx.getNameInNamespace()); while (ne.hasMoreElements()) { Binding b = (Binding)ne.nextElement(); if (b.getObject() instanceof Context) { unbind((Context)b.getObject()); } else ctx.unbind(b.getName()); } } /** * Do a deep listing of the bindings for a context. * @param ctx the context containing the name for which to list the bindings * @param name the name in the context to list * @return map: key is fully qualified name, value is the bound object * @throws NamingException */ public static Map flattenBindings (Context ctx, String name) throws NamingException { HashMap map = new HashMap(); //the context representation of name arg Context c = (Context)ctx.lookup (name); NameParser parser = c.getNameParser(""); NamingEnumeration enm = ctx.listBindings(name); while (enm.hasMore()) { Binding b = (Binding)enm.next(); if (b.getObject() instanceof Context) { map.putAll(flattenBindings (c, b.getName())); } else { Name compoundName = parser.parse (c.getNameInNamespace()); compoundName.add(b.getName()); map.put (compoundName.toString(), b.getObject()); } } return map; } } jetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/local/0000755000175000017500000000000011745736473023654 5ustar moonmoonjetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/local/localContextRoot.java0000644000175000017500000002345110532630416030006 0ustar moonmoon//======================================================================== //$Id: localContextRoot.java 1327 2006-11-27 18:40:14Z janb $ //Copyright 2000-2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.naming.local; import java.util.Hashtable; import java.util.Properties; import javax.naming.CompoundName; import javax.naming.Context; import javax.naming.Name; import javax.naming.NameParser; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import org.mortbay.naming.NamingContext; /** * * localContext * * @author janb * @version $Revision: 1327 $ $Date: 2006-11-27 19:40:14 +0100 (Mon, 27 Nov 2006) $ * */ public class localContextRoot implements Context { private static final NamingContext _root; private final Hashtable _env; // make a root for the static namespace local: static { _root = new NamingContext(); _root.setNameParser(new LocalNameParser()); } static class LocalNameParser implements NameParser { Properties syntax = new Properties(); LocalNameParser() { syntax.put("jndi.syntax.direction", "left_to_right"); syntax.put("jndi.syntax.separator", "/"); syntax.put("jndi.syntax.ignorecase", "false"); } public Name parse(String name) throws NamingException { return new CompoundName(name, syntax); } } public localContextRoot(Hashtable env) { _env = new Hashtable(env); } /** * * * @see javax.naming.Context#close() */ public void close() throws NamingException { } /** * * * @see javax.naming.Context#getNameInNamespace() */ public String getNameInNamespace() throws NamingException { return ""; } /** * * * @see javax.naming.Context#destroySubcontext(java.lang.String) */ public void destroySubcontext(String name) throws NamingException { synchronized (_root) { _root.destroySubcontext(getSuffix(name)); } } /** * * * @see javax.naming.Context#unbind(java.lang.String) */ public void unbind(String name) throws NamingException { synchronized (_root) { _root.unbind(getSuffix(name)); } } /** * * * @see javax.naming.Context#getEnvironment() */ public Hashtable getEnvironment() throws NamingException { return _env; } /** * * * @see javax.naming.Context#destroySubcontext(javax.naming.Name) */ public void destroySubcontext(Name name) throws NamingException { synchronized (_root) { _root.destroySubcontext(getSuffix(name)); } } /** * * * @see javax.naming.Context#unbind(javax.naming.Name) */ public void unbind(Name name) throws NamingException { synchronized (_root) { _root.unbind(getSuffix(name)); } } /** * * * @see javax.naming.Context#lookup(java.lang.String) */ public Object lookup(String name) throws NamingException { synchronized (_root) { return _root.lookup(getSuffix(name)); } } /** * * * @see javax.naming.Context#lookupLink(java.lang.String) */ public Object lookupLink(String name) throws NamingException { synchronized (_root) { return _root.lookupLink(getSuffix(name)); } } /** * * * @see javax.naming.Context#removeFromEnvironment(java.lang.String) */ public Object removeFromEnvironment(String propName) throws NamingException { return _env.remove(propName); } /** * * * @see javax.naming.Context#bind(java.lang.String, java.lang.Object) */ public void bind(String name, Object obj) throws NamingException { synchronized (_root) { _root.bind(getSuffix(name), obj); } } /** * * * @see javax.naming.Context#rebind(java.lang.String, java.lang.Object) */ public void rebind(String name, Object obj) throws NamingException { synchronized (_root) { _root.rebind(getSuffix(name), obj); } } /** * * * @see javax.naming.Context#lookup(javax.naming.Name) */ public Object lookup(Name name) throws NamingException { synchronized (_root) { return _root.lookup(getSuffix(name)); } } /** * * * @see javax.naming.Context#lookupLink(javax.naming.Name) */ public Object lookupLink(Name name) throws NamingException { synchronized (_root) { return _root.lookupLink(getSuffix(name)); } } /** * * * @see javax.naming.Context#bind(javax.naming.Name, java.lang.Object) */ public void bind(Name name, Object obj) throws NamingException { synchronized (_root) { _root.bind(getSuffix(name), obj); } } /** * * * @see javax.naming.Context#rebind(javax.naming.Name, java.lang.Object) */ public void rebind(Name name, Object obj) throws NamingException { synchronized (_root) { _root.rebind(getSuffix(name), obj); } } /** * * * @see javax.naming.Context#rename(java.lang.String, java.lang.String) */ public void rename(String oldName, String newName) throws NamingException { synchronized (_root) { _root.rename(getSuffix(oldName), getSuffix(newName)); } } /** * * * @see javax.naming.Context#createSubcontext(java.lang.String) */ public Context createSubcontext(String name) throws NamingException { synchronized (_root) { return _root.createSubcontext(getSuffix(name)); } } /** * * * @see javax.naming.Context#createSubcontext(javax.naming.Name) */ public Context createSubcontext(Name name) throws NamingException { synchronized (_root) { return _root.createSubcontext(getSuffix(name)); } } /** * * * @see javax.naming.Context#rename(javax.naming.Name, javax.naming.Name) */ public void rename(Name oldName, Name newName) throws NamingException { synchronized (_root) { _root.rename(getSuffix(oldName), getSuffix(newName)); } } /** * * * @see javax.naming.Context#getNameParser(java.lang.String) */ public NameParser getNameParser(String name) throws NamingException { return _root.getNameParser(name); } /** * * * @see javax.naming.Context#getNameParser(javax.naming.Name) */ public NameParser getNameParser(Name name) throws NamingException { return _root.getNameParser(name); } /** * * * @see javax.naming.Context#list(java.lang.String) */ public NamingEnumeration list(String name) throws NamingException { synchronized (_root) { return _root.list(getSuffix(name)); } } /** * * * @see javax.naming.Context#listBindings(java.lang.String) */ public NamingEnumeration listBindings(String name) throws NamingException { synchronized (_root) { return _root.listBindings(getSuffix(name)); } } /** * * * @see javax.naming.Context#list(javax.naming.Name) */ public NamingEnumeration list(Name name) throws NamingException { synchronized (_root) { return _root.list(getSuffix(name)); } } /** * * * @see javax.naming.Context#listBindings(javax.naming.Name) */ public NamingEnumeration listBindings(Name name) throws NamingException { synchronized (_root) { return _root.listBindings(getSuffix(name)); } } /** * * * @see javax.naming.Context#addToEnvironment(java.lang.String, * java.lang.Object) */ public Object addToEnvironment(String propName, Object propVal) throws NamingException { return _env.put(propName, propVal); } /** * * * @see javax.naming.Context#composeName(java.lang.String, java.lang.String) */ public String composeName(String name, String prefix) throws NamingException { return _root.composeName(name, prefix); } /** * * * @see javax.naming.Context#composeName(javax.naming.Name, * javax.naming.Name) */ public Name composeName(Name name, Name prefix) throws NamingException { return _root.composeName(name, prefix); } protected String getSuffix(String url) throws NamingException { return url; } protected Name getSuffix(Name name) throws NamingException { return name; } } jetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/ContextFactory.java0000644000175000017500000001521510532630416026364 0ustar moonmoon// ======================================================================== // $Id: ContextFactory.java 1327 2006-11-27 18:40:14Z janb $ // Copyright 1999-2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming; import java.util.Hashtable; import java.util.WeakHashMap; import javax.naming.Context; import javax.naming.Name; import javax.naming.NameParser; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.naming.spi.ObjectFactory; import org.mortbay.jetty.handler.ContextHandler; import org.mortbay.log.Log; /** * ContextFactory.java * * This is an object factory that produces a jndi naming * context based on a classloader. * * It is used for the java:comp context. * * This object factory is bound at java:comp. When a * lookup arrives for java:comp, this object factory * is invoked and will return a context specific to * the caller's environment (so producing the java:comp/env * specific to a webapp). * * The context selected is based on classloaders. First * we try looking in at the classloader that is associated * with the current webapp context (if there is one). If * not, we use the thread context classloader. * * Created: Fri Jun 27 09:26:40 2003 * * @author Jan Bartel * */ public class ContextFactory implements ObjectFactory { /** * Map of classloaders to contexts. */ private static WeakHashMap _contextMap; /** * Threadlocal for injecting a context to use * instead of looking up the map. */ private static ThreadLocal _threadContext; static { _contextMap = new WeakHashMap(); _threadContext = new ThreadLocal(); } /** * Find or create a context which pertains to a classloader. * * We use either the classloader for the current ContextHandler if * we are handling a request, OR we use the thread context classloader * if we are not processing a request. * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable) */ public Object getObjectInstance (Object obj, Name name, Context nameCtx, Hashtable env) throws Exception { //First, see if we have had a context injected into us to use. Context ctx = (Context)_threadContext.get(); if (ctx != null) { if(Log.isDebugEnabled()) Log.debug("Using the Context that is bound on the thread"); return ctx; } // Next, see if we are in a webapp context, if we are, use // the classloader of the webapp to find the right jndi comp context ClassLoader loader = null; if (ContextHandler.getCurrentContext() != null) { loader = ContextHandler.getCurrentContext().getContextHandler().getClassLoader(); } if (loader != null) { if (Log.isDebugEnabled()) Log.debug("Using classloader of current org.mortbay.jetty.handler.ContextHandler"); } else { //Not already in a webapp context, in that case, we try the //curren't thread's classloader instead loader = Thread.currentThread().getContextClassLoader(); if (Log.isDebugEnabled()) Log.debug("Using thread context classloader"); } //Get the context matching the classloader ctx = (Context)_contextMap.get(loader); //The map does not contain an entry for this classloader if (ctx == null) { //Check if a parent classloader has created the context ctx = getParentClassLoaderContext(loader); //Didn't find a context to match any of the ancestors //of the classloader, so make a context if (ctx == null) { Reference ref = (Reference)obj; StringRefAddr parserAddr = (StringRefAddr)ref.get("parser"); String parserClassName = (parserAddr==null?null:(String)parserAddr.getContent()); NameParser parser = (NameParser)(parserClassName==null?null:loader.loadClass(parserClassName).newInstance()); ctx = new NamingContext (env, name.get(0), nameCtx, parser); if(Log.isDebugEnabled())Log.debug("No entry for classloader: "+loader); _contextMap.put (loader, ctx); } } return ctx; } /** * Keep trying ancestors of the given classloader to find one to which * the context is bound. * @param loader * @return */ public Context getParentClassLoaderContext (ClassLoader loader) { Context ctx = null; ClassLoader cl = loader; for (cl = cl.getParent(); (cl != null) && (ctx == null); cl = cl.getParent()) { ctx = (Context)_contextMap.get(cl); } return ctx; } /** * Associate the given Context with the current thread. * resetComponentContext method should be called to reset the context. * @param ctx the context to associate to the current thread. * @return the previous context associated on the thread (can be null) */ public static Context setComponentContext(final Context ctx) { Context previous = (Context)_threadContext.get(); _threadContext.set(ctx); return previous; } /** * Set back the context with the given value. * Don't return the previous context, use setComponentContext() method for this. * @param ctx the context to associate to the current thread. */ public static void resetComponentContext(final Context ctx) { _threadContext.set(ctx); } } jetty-6.1.26/modules/naming/src/main/java/org/mortbay/naming/NamingContext.java0000644000175000017500000012044310477277702026203 0ustar moonmoon// ======================================================================== // $Id: NamingContext.java 887 2006-09-05 13:46:42Z janb $ // Copyright 1999-2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.naming; import java.util.Enumeration; import java.util.Hashtable; import java.util.NoSuchElementException; import javax.naming.Binding; import javax.naming.CompoundName; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.LinkRef; import javax.naming.Name; import javax.naming.NameAlreadyBoundException; import javax.naming.NameClassPair; import javax.naming.NameNotFoundException; import javax.naming.NameParser; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.NotContextException; import javax.naming.OperationNotSupportedException; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.spi.NamingManager; import org.mortbay.log.Log; /*------------------------------------------------*/ /** NamingContext *

    Implementation of Context interface. * *

    Notes

    *

    All Names are expected to be Compound, not Composite. * *

    Usage

    *
     */
    /*
    * 
    * * @see * * @author Jan Bartel * @version 1.0 */ public class NamingContext implements Context, Cloneable { public static final String LOCK_PROPERTY = "org.mortbay.jndi.lock"; public static final String UNLOCK_PROPERTY = "org.mortbay.jndi.unlock"; public static final Enumeration EMPTY_ENUM = new Enumeration () { public boolean hasMoreElements() { return false; } public Object nextElement () { throw new NoSuchElementException(); } }; protected Context _parent = null; protected String _name = null; protected Hashtable _env = null; protected Hashtable _bindings = new Hashtable(); protected NameParser _parser = null; /*------------------------------------------------*/ /** NameEnumeration *

    Implementation of NamingEnumeration interface. * *

    Notes

    *

    Used for returning results of Context.list(); * *

    Usage

    *
         */
        /*
         * 
    * * @see * */ public class NameEnumeration implements NamingEnumeration { Enumeration _delegate; public NameEnumeration (Enumeration e) { _delegate = e; } public void close() throws NamingException { } public boolean hasMore () throws NamingException { return _delegate.hasMoreElements(); } public Object next() throws NamingException { Binding b = (Binding)_delegate.nextElement(); return new NameClassPair (b.getName(), b.getClassName(), true); } public boolean hasMoreElements() { return _delegate.hasMoreElements(); } public Object nextElement() { Binding b = (Binding)_delegate.nextElement(); return new NameClassPair (b.getName(), b.getClassName(), true); } } /*------------------------------------------------*/ /** BindingEnumeration *

    Implementation of NamingEnumeration * *

    Notes

    *

    Used to return results of Context.listBindings(); * *

    Usage

    *
         */
        /*
         * 
    * * @see * */ public class BindingEnumeration implements NamingEnumeration { Enumeration _delegate; public BindingEnumeration (Enumeration e) { _delegate = e; } public void close() throws NamingException { } public boolean hasMore () throws NamingException { return _delegate.hasMoreElements(); } public Object next() throws NamingException { Binding b = (Binding)_delegate.nextElement(); return new Binding (b.getName(), b.getClassName(), b.getObject(), true); } public boolean hasMoreElements() { return _delegate.hasMoreElements(); } public Object nextElement() { Binding b = (Binding)_delegate.nextElement(); return new Binding (b.getName(), b.getClassName(), b.getObject(),true); } } /*------------------------------------------------*/ /** * Constructor * * @param env environment properties * @param name relative name of this context * @param parent immediate ancestor Context (can be null) * @param parser NameParser for this Context */ public NamingContext(Hashtable env, String name, Context parent, NameParser parser) { if (env == null) _env = new Hashtable(); else _env = new Hashtable(env); _name = name; _parent = parent; _parser = parser; } /*------------------------------------------------*/ /** * Creates a new NamingContext instance. * * @param env a Hashtable value */ public NamingContext (Hashtable env) { if (env == null) _env = new Hashtable(); else _env = new Hashtable(env); } /*------------------------------------------------*/ /** * Constructor * */ public NamingContext () { _env = new Hashtable(); } /*------------------------------------------------*/ /** * Clone this NamingContext * * @return copy of this NamingContext * @exception CloneNotSupportedException if an error occurs */ public Object clone () throws CloneNotSupportedException { NamingContext ctx = (NamingContext)super.clone(); ctx._env = (Hashtable)_env.clone(); ctx._bindings = (Hashtable)_bindings.clone(); return ctx; } /*------------------------------------------------*/ /** * Getter for _name * * @return name of this Context (relative, not absolute) */ public String getName () { return _name; } /*------------------------------------------------*/ /** * Getter for _parent * * @return parent Context */ public Context getParent() { return _parent; } /*------------------------------------------------*/ /** * Setter for _parser * * */ public void setNameParser (NameParser parser) { _parser = parser; } /*------------------------------------------------*/ /** * Bind a name to an object * * @param name Name of the object * @param obj object to bind * @exception NamingException if an error occurs */ public void bind(Name name, Object obj) throws NamingException { if (isLocked()) throw new NamingException ("This context is immutable"); Name cname = toCanonicalName(name); if (cname == null) throw new NamingException ("Name is null"); if (cname.size() == 0) throw new NamingException ("Name is empty"); //if no subcontexts, just bind it if (cname.size() == 1) { //get the object to be bound Object objToBind = NamingManager.getStateToBind(obj, name,this, null); // Check for Referenceable if (objToBind instanceof Referenceable) { objToBind = ((Referenceable)objToBind).getReference(); } //anything else we should be able to bind directly Binding binding = getBinding (cname); if (binding == null) addBinding (cname, objToBind); else throw new NameAlreadyBoundException (cname.toString()); } else { if(Log.isDebugEnabled())Log.debug("Checking for existing binding for name="+cname+" for first element of name="+cname.get(0)); //walk down the subcontext hierarchy //need to ignore trailing empty "" name components String firstComponent = cname.get(0); Object ctx = null; if (firstComponent.equals("")) ctx = this; else { Binding binding = getBinding (firstComponent); if (binding == null) throw new NameNotFoundException (firstComponent+ " is not bound"); ctx = binding.getObject(); if (ctx instanceof Reference) { //deference the object try { ctx = NamingManager.getObjectInstance(ctx, getNameParser("").parse(firstComponent), this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } } if (ctx instanceof Context) { ((Context)ctx).bind (cname.getSuffix(1), obj); } else throw new NotContextException ("Object bound at "+firstComponent +" is not a Context"); } } /*------------------------------------------------*/ /** * Bind a name (as a String) to an object * * @param name a String value * @param obj an Object value * @exception NamingException if an error occurs */ public void bind(String name, Object obj) throws NamingException { bind (_parser.parse(name), obj); } /*------------------------------------------------*/ /** * Create a context as a child of this one * * @param name a Name value * @return a Context value * @exception NamingException if an error occurs */ public Context createSubcontext (Name name) throws NamingException { if (isLocked()) { NamingException ne = new NamingException ("This context is immutable"); ne.setRemainingName(name); throw ne; } Name cname = toCanonicalName (name); if (cname == null) throw new NamingException ("Name is null"); if (cname.size() == 0) throw new NamingException ("Name is empty"); if (cname.size() == 1) { //not permitted to bind if something already bound at that name Binding binding = getBinding (cname); if (binding != null) throw new NameAlreadyBoundException (cname.toString()); Context ctx = new NamingContext ((Hashtable)_env.clone(), cname.get(0), this, _parser); addBinding (cname, ctx); return ctx; } //If the name has multiple subcontexts, walk the hierarchy by //fetching the first one. All intermediate subcontexts in the //name must already exist. String firstComponent = cname.get(0); Object ctx = null; if (firstComponent.equals("")) ctx = this; else { Binding binding = getBinding (firstComponent); if (binding == null) throw new NameNotFoundException (firstComponent + " is not bound"); ctx = binding.getObject(); if (ctx instanceof Reference) { //deference the object if(Log.isDebugEnabled())Log.debug("Object bound at "+firstComponent +" is a Reference"); try { ctx = NamingManager.getObjectInstance(ctx, getNameParser("").parse(firstComponent), this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } } if (ctx instanceof Context) { return ((Context)ctx).createSubcontext (cname.getSuffix(1)); } else throw new NotContextException (firstComponent +" is not a Context"); } /*------------------------------------------------*/ /** * Create a Context as a child of this one * * @param name a String value * @return a Context value * @exception NamingException if an error occurs */ public Context createSubcontext (String name) throws NamingException { return createSubcontext(_parser.parse(name)); } /*------------------------------------------------*/ /** * Not supported * * @param name name of subcontext to remove * @exception NamingException if an error occurs */ public void destroySubcontext (String name) throws NamingException { removeBinding(_parser.parse(name)); } /*------------------------------------------------*/ /** * Not supported * * @param name name of subcontext to remove * @exception NamingException if an error occurs */ public void destroySubcontext (Name name) throws NamingException { removeBinding(name); } /*------------------------------------------------*/ /** * Lookup a binding by name * * @param name name of bound object * @exception NamingException if an error occurs */ public Object lookup(Name name) throws NamingException { if(Log.isDebugEnabled())Log.debug("Looking up name=\""+name+"\""); Name cname = toCanonicalName(name); if ((cname == null) || (cname.size() == 0)) { Log.debug("Null or empty name, returning copy of this context"); NamingContext ctx = new NamingContext (_env, _name, _parent, _parser); ctx._bindings = _bindings; return ctx; } if (cname.size() == 1) { Binding binding = getBinding (cname); if (binding == null) { NameNotFoundException nnfe = new NameNotFoundException(); nnfe.setRemainingName(cname); throw nnfe; } Object o = binding.getObject(); //handle links by looking up the link if (o instanceof LinkRef) { //if link name starts with ./ it is relative to current context String linkName = ((LinkRef)o).getLinkName(); if (linkName.startsWith("./")) return this.lookup (linkName.substring(2)); else { //link name is absolute InitialContext ictx = new InitialContext(); return ictx.lookup (linkName); } } else if (o instanceof Reference) { //deference the object try { return NamingManager.getObjectInstance(o, cname, this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } else return o; } //it is a multipart name, recurse to the first subcontext String firstComponent = cname.get(0); Object ctx = null; if (firstComponent.equals("")) ctx = this; else { Binding binding = getBinding (firstComponent); if (binding == null) { NameNotFoundException nnfe = new NameNotFoundException(); nnfe.setRemainingName(cname); throw nnfe; } //as we have bound a reference to an object factory //for the component specific contexts //at "comp" we need to resolve the reference ctx = binding.getObject(); if (ctx instanceof Reference) { //deference the object try { ctx = NamingManager.getObjectInstance(ctx, getNameParser("").parse(firstComponent), this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } } if (!(ctx instanceof Context)) throw new NotContextException(); return ((Context)ctx).lookup (cname.getSuffix(1)); } /*------------------------------------------------*/ /** * Lookup binding of an object by name * * @param name name of bound object * @return object bound to name * @exception NamingException if an error occurs */ public Object lookup (String name) throws NamingException { return lookup (_parser.parse(name)); } /*------------------------------------------------*/ /** * Lookup link bound to name * * @param name name of link binding * @return LinkRef or plain object bound at name * @exception NamingException if an error occurs */ public Object lookupLink (Name name) throws NamingException { Name cname = toCanonicalName(name); if (cname == null) { NamingContext ctx = new NamingContext (_env, _name, _parent, _parser); ctx._bindings = _bindings; return ctx; } if (cname.size() == 0) throw new NamingException ("Name is empty"); if (cname.size() == 1) { Binding binding = getBinding (cname); if (binding == null) throw new NameNotFoundException(); Object o = binding.getObject(); //handle links by looking up the link if (o instanceof Reference) { //deference the object try { return NamingManager.getObjectInstance(o, cname.getPrefix(1), this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } else { //object is either a LinkRef which we don't dereference //or a plain object in which case spec says we return it return o; } } //it is a multipart name, recurse to the first subcontext String firstComponent = cname.get(0); Object ctx = null; if (firstComponent.equals("")) ctx = this; else { Binding binding = getBinding (firstComponent); if (binding == null) throw new NameNotFoundException (); ctx = binding.getObject(); if (ctx instanceof Reference) { //deference the object try { ctx = NamingManager.getObjectInstance(ctx, getNameParser("").parse(firstComponent), this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } } if (!(ctx instanceof Context)) throw new NotContextException(); return ((Context)ctx).lookup (cname.getSuffix(1)); } /*------------------------------------------------*/ /** * Lookup link bound to name * * @param name name of link binding * @return LinkRef or plain object bound at name * @exception NamingException if an error occurs */ public Object lookupLink (String name) throws NamingException { return lookupLink (_parser.parse(name)); } /*------------------------------------------------*/ /** * List all names bound at Context named by Name * * @param name a Name value * @return a NamingEnumeration value * @exception NamingException if an error occurs */ public NamingEnumeration list(Name name) throws NamingException { if(Log.isDebugEnabled())Log.debug("list() on Context="+getName()+" for name="+name); Name cname = toCanonicalName(name); if (cname == null) { return new NameEnumeration(EMPTY_ENUM); } if (cname.size() == 0) { return new NameEnumeration (_bindings.elements()); } //multipart name String firstComponent = cname.get(0); Object ctx = null; if (firstComponent.equals("")) ctx = this; else { Binding binding = getBinding (firstComponent); if (binding == null) throw new NameNotFoundException (); ctx = binding.getObject(); if (ctx instanceof Reference) { //deference the object if(Log.isDebugEnabled())Log.debug("Dereferencing Reference for "+name.get(0)); try { ctx = NamingManager.getObjectInstance(ctx, getNameParser("").parse(firstComponent), this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } } if (!(ctx instanceof Context)) throw new NotContextException(); return ((Context)ctx).list (cname.getSuffix(1)); } /*------------------------------------------------*/ /** * List all names bound at Context named by Name * * @param name a Name value * @return a NamingEnumeration value * @exception NamingException if an error occurs */ public NamingEnumeration list(String name) throws NamingException { return list(_parser.parse(name)); } /*------------------------------------------------*/ /** * List all Bindings present at Context named by Name * * @param name a Name value * @return a NamingEnumeration value * @exception NamingException if an error occurs */ public NamingEnumeration listBindings(Name name) throws NamingException { Name cname = toCanonicalName (name); if (cname == null) { return new BindingEnumeration(EMPTY_ENUM); } if (cname.size() == 0) { return new BindingEnumeration (_bindings.elements()); } //multipart name String firstComponent = cname.get(0); Object ctx = null; //if a name has a leading "/" it is parsed as "" so ignore it by staying //at this level in the tree if (firstComponent.equals("")) ctx = this; else { //it is a non-empty name component Binding binding = getBinding (firstComponent); if (binding == null) throw new NameNotFoundException (); ctx = binding.getObject(); if (ctx instanceof Reference) { //deference the object try { ctx = NamingManager.getObjectInstance(ctx, getNameParser("").parse(firstComponent), this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } } if (!(ctx instanceof Context)) throw new NotContextException(); return ((Context)ctx).listBindings (cname.getSuffix(1)); } /*------------------------------------------------*/ /** * List all Bindings at Name * * @param name a String value * @return a NamingEnumeration value * @exception NamingException if an error occurs */ public NamingEnumeration listBindings(String name) throws NamingException { return listBindings (_parser.parse(name)); } /*------------------------------------------------*/ /** * Overwrite or create a binding * * @param name a Name value * @param obj an Object value * @exception NamingException if an error occurs */ public void rebind(Name name, Object obj) throws NamingException { if (isLocked()) throw new NamingException ("This context is immutable"); Name cname = toCanonicalName(name); if (cname == null) throw new NamingException ("Name is null"); if (cname.size() == 0) throw new NamingException ("Name is empty"); //if no subcontexts, just bind it if (cname.size() == 1) { //check if it is a Referenceable Object objToBind = NamingManager.getStateToBind(obj, name, this, null); if (objToBind instanceof Referenceable) { objToBind = ((Referenceable)objToBind).getReference(); } addBinding (cname, objToBind); } else { //walk down the subcontext hierarchy if(Log.isDebugEnabled())Log.debug("Checking for existing binding for name="+cname+" for first element of name="+cname.get(0)); String firstComponent = cname.get(0); Object ctx = null; if (firstComponent.equals("")) ctx = this; else { Binding binding = getBinding (name.get(0)); if (binding == null) throw new NameNotFoundException (name.get(0)+ " is not bound"); ctx = binding.getObject(); if (ctx instanceof Reference) { //deference the object try { ctx = NamingManager.getObjectInstance(ctx, getNameParser("").parse(firstComponent), this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } } if (ctx instanceof Context) { ((Context)ctx).rebind (cname.getSuffix(1), obj); } else throw new NotContextException ("Object bound at "+firstComponent +" is not a Context"); } } /*------------------------------------------------*/ /** * Overwrite or create a binding from Name to Object * * @param name a String value * @param obj an Object value * @exception NamingException if an error occurs */ public void rebind (String name, Object obj) throws NamingException { rebind (_parser.parse(name), obj); } /*------------------------------------------------*/ /** * Not supported. * * @param name a String value * @exception NamingException if an error occurs */ public void unbind (String name) throws NamingException { unbind(_parser.parse(name)); } /*------------------------------------------------*/ /** * Not supported. * * @param name a String value * @exception NamingException if an error occurs */ public void unbind (Name name) throws NamingException { if (name.size() == 0) return; if (isLocked()) throw new NamingException ("This context is immutable"); Name cname = toCanonicalName(name); if (cname == null) throw new NamingException ("Name is null"); if (cname.size() == 0) throw new NamingException ("Name is empty"); //if no subcontexts, just unbind it if (cname.size() == 1) { removeBinding (cname); } else { //walk down the subcontext hierarchy if(Log.isDebugEnabled())Log.debug("Checking for existing binding for name="+cname+" for first element of name="+cname.get(0)); String firstComponent = cname.get(0); Object ctx = null; if (firstComponent.equals("")) ctx = this; else { Binding binding = getBinding (name.get(0)); if (binding == null) throw new NameNotFoundException (name.get(0)+ " is not bound"); ctx = binding.getObject(); if (ctx instanceof Reference) { //deference the object try { ctx = NamingManager.getObjectInstance(ctx, getNameParser("").parse(firstComponent), this, _env); } catch (NamingException e) { throw e; } catch (Exception e) { Log.warn("",e); throw new NamingException (e.getMessage()); } } } if (ctx instanceof Context) { ((Context)ctx).unbind (cname.getSuffix(1)); } else throw new NotContextException ("Object bound at "+firstComponent +" is not a Context"); } } /*------------------------------------------------*/ /** * Not supported * * @param oldName a Name value * @param newName a Name value * @exception NamingException if an error occurs */ public void rename(Name oldName, Name newName) throws NamingException { throw new OperationNotSupportedException(); } /*------------------------------------------------*/ /** * Not supported * * @param oldName a Name value * @param newName a Name value * @exception NamingException if an error occurs */ public void rename(String oldName, String newName) throws NamingException { throw new OperationNotSupportedException(); } /*------------------------------------------------*/ /** Join two names together. These are treated as * CompoundNames. * * @param name a Name value * @param prefix a Name value * @return a Name value * @exception NamingException if an error occurs */ public Name composeName(Name name, Name prefix) throws NamingException { if (name == null) throw new NamingException ("Name cannot be null"); if (prefix == null) throw new NamingException ("Prefix cannot be null"); Name compoundName = (CompoundName)prefix.clone(); compoundName.addAll (name); return compoundName; } /*------------------------------------------------*/ /** Join two names together. These are treated as * CompoundNames. * * @param name a Name value * @param prefix a Name value * @return a Name value * @exception NamingException if an error occurs */ public String composeName (String name, String prefix) throws NamingException { if (name == null) throw new NamingException ("Name cannot be null"); if (prefix == null) throw new NamingException ("Prefix cannot be null"); Name compoundName = _parser.parse(prefix); compoundName.add (name); return compoundName.toString(); } /*------------------------------------------------*/ /** * Do nothing * * @exception NamingException if an error occurs */ public void close () throws NamingException { } /*------------------------------------------------*/ /** * Return a NameParser for this Context. * * @param name a Name value * @return a NameParser value */ public NameParser getNameParser (Name name) { return _parser; } /*------------------------------------------------*/ /** * Return a NameParser for this Context. * * @param name a Name value * @return a NameParser value */ public NameParser getNameParser (String name) { return _parser; } /*------------------------------------------------*/ /** * Get the full name of this Context node * by visiting it's ancestors back to root. * * NOTE: if this Context has a URL namespace then * the URL prefix will be missing * * @return the full name of this Context * @exception NamingException if an error occurs */ public String getNameInNamespace () throws NamingException { Name name = _parser.parse(""); NamingContext c = this; while (c != null) { String str = c.getName(); if (str != null) name.add(0, str); c = (NamingContext)c.getParent(); } return name.toString(); } /*------------------------------------------------*/ /** * Add an environment setting to this Context * * @param propName name of the property to add * @param propVal value of the property to add * @return propVal or previous value of the property * @exception NamingException if an error occurs */ public Object addToEnvironment(String propName, Object propVal) throws NamingException { if (isLocked() && !(propName.equals(UNLOCK_PROPERTY))) throw new NamingException ("This context is immutable"); return _env.put (propName, propVal); } /*------------------------------------------------*/ /** * Remove a property from this Context's environment. * * @param propName name of property to remove * @return value of property or null if it didn't exist * @exception NamingException if an error occurs */ public Object removeFromEnvironment(String propName) throws NamingException { if (isLocked()) throw new NamingException ("This context is immutable"); return _env.remove (propName); } /*------------------------------------------------*/ /** * Get the environment of this Context. * * @return a copy of the environment of this Context. */ public Hashtable getEnvironment () { return (Hashtable)_env.clone(); } /*------------------------------------------------*/ /** * Add a name to object binding to this Context. * * @param name a Name value * @param obj an Object value */ protected void addBinding (Name name, Object obj) { String key = name.toString(); if(Log.isDebugEnabled())Log.debug("Adding binding with key="+key+" obj="+obj+" for context="+_name); _bindings.put (key, new Binding (key, obj)); } /*------------------------------------------------*/ /** * Get a name to object binding from this Context * * @param name a Name value * @return a Binding value */ protected Binding getBinding (Name name) { if(Log.isDebugEnabled())Log.debug("Looking up binding for "+name.toString()+" for context="+_name); return (Binding) _bindings.get(name.toString()); } /*------------------------------------------------*/ /** * Get a name to object binding from this Context * * @param name as a String * @return null or the Binding */ protected Binding getBinding (String name) { if(Log.isDebugEnabled())Log.debug("Looking up binding for "+name+" for context="+_name); return (Binding) _bindings.get(name); } protected void removeBinding (Name name) { String key = name.toString(); if (Log.isDebugEnabled()) Log.debug("Removing binding with key="+key); _bindings.remove(key); } /*------------------------------------------------*/ /** * Remove leading or trailing empty components from * name. Eg "/comp/env/" -> "comp/env" * * @param name the name to normalize * @return normalized name */ public Name toCanonicalName (Name name) { Name canonicalName = name; if (name != null) { if (canonicalName.size() > 1) { if (canonicalName.get(0).equals("")) canonicalName = canonicalName.getSuffix(1); if (canonicalName.get(canonicalName.size()-1).equals("")) canonicalName = canonicalName.getPrefix(canonicalName.size()-1); } } return canonicalName; } private boolean isLocked() { if ((_env.get(LOCK_PROPERTY) == null) && (_env.get(UNLOCK_PROPERTY) == null)) return false; Object lockKey = _env.get(LOCK_PROPERTY); Object unlockKey = _env.get(UNLOCK_PROPERTY); if ((lockKey != null) && (unlockKey != null) && (lockKey.equals(unlockKey))) return false; return true; } } jetty-6.1.26/modules/naming/src/main/resources/0000755000175000017500000000000011745736473020136 5ustar moonmoonjetty-6.1.26/modules/naming/src/main/resources/jndi.properties0000644000175000017500000000016510376105106023160 0ustar moonmoonjava.naming.factory.url.pkgs=org.mortbay.naming java.naming.factory.initial=org.mortbay.naming.InitialContextFactory jetty-6.1.26/modules/naming/pom.xml0000644000175000017500000001226611466510412015714 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-naming Jetty Naming JNDI spi impl for java namespace maven-antrun-plugin clean clean run install run org.apache.felix maven-bundle-plugin ${maven-bundle-plugin-version} true manifest J2SE-1.4 !org.mortbay.naming.*,* org.mortbay.naming http://jetty.mortbay.org org.apache.maven.plugins maven-jar-plugin ${project.build.outputDirectory}/META-INF/MANIFEST.MF org.codehaus.mojo dependency-maven-plugin copy-deps install copy javax.mail mail ${mail-version} ../../lib/naming junit junit test org.mortbay.jetty jetty ${project.version} provided javax.mail mail ${mail-version} javax.activation activation below-jdk1.6 !1.6 org.codehaus.mojo dependency-maven-plugin copy-deps-below1.6 install copy javax.activation activation ${activation-version} ../../lib/naming javax.activation activation ${activation-version} jetty-6.1.26/modules/jsp-2.1/0000755000175000017500000000000011745736473014232 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/0000755000175000017500000000000011745736473015021 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/0000755000175000017500000000000011745736473015745 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/java/0000755000175000017500000000000011745736473016666 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/java/com/0000755000175000017500000000000011745736473017444 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/java/com/sun/0000755000175000017500000000000011745736473020251 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/java/com/sun/org/0000755000175000017500000000000011745736473021040 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/java/com/sun/org/apache/0000755000175000017500000000000011745736473022261 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/java/com/sun/org/apache/commons/0000755000175000017500000000000011745736473023734 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/java/com/sun/org/apache/commons/logging/0000755000175000017500000000000011745736473025362 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/java/com/sun/org/apache/commons/logging/impl/0000755000175000017500000000000011745736473026323 5ustar moonmoonjetty-6.1.26/modules/jsp-2.1/src/main/java/com/sun/org/apache/commons/logging/impl/JettyLog.java0000644000175000017500000000527311120522103030700 0ustar moonmoon//======================================================================== //$Id: JettyLog.java 4185 2008-12-12 17:49:55Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package com.sun.org.apache.commons.logging.impl; import com.sun.org.apache.commons.logging.Log; /** * Log * * Bridges the com.sun.org.apache.commons.logging.Log to Jetty's log. * **/ public class JettyLog implements Log { private String _name; private org.mortbay.log.Logger _logger; /** * */ public JettyLog(String name) { _name = name; _logger = org.mortbay.log.Log.getLogger(name); } public void fatal (Object message) { _logger.warn(message.toString(), null, null); } public void fatal (Object message, Throwable t) { _logger.warn(message.toString(), t); } public void debug(Object message) { _logger.debug(message.toString(), null); } public void debug (Object message, Throwable t) { _logger.debug(message.toString(), t); } public void trace (Object message) { _logger.debug(message.toString(), null); } public void info(Object message) { _logger.info(message.toString(), null, null); } public void error(Object message) { _logger.warn(message.toString(), null); } public void error(Object message, Throwable cause) { _logger.warn(message.toString(), cause); } public void warn(Object message) { _logger.warn(message.toString(), null); } public boolean isDebugEnabled () { return _logger.isDebugEnabled(); } public boolean isWarnEnabled () { return _logger.isDebugEnabled(); } public boolean isInfoEnabled () { return true; } public boolean isErrorEnabled () { return true; } public boolean isTraceEnabled () { return _logger.isDebugEnabled(); } } jetty-6.1.26/modules/jsp-2.1/pom.xml0000644000175000017500000001531611466510412015534 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 jsp-2.1-jetty Glassfish Jasper JSP2.1 Jasper implementation from Glassfish CDDL 1.0 https://glassfish.dev.java.net/public/CDDLv1.0.html install src/main/resources target/generated-sources **/*.properties **/*.xml **/*.tld maven-compiler-plugin 1.5 1.5 -nowarn org.apache.maven.plugins maven-dependency-plugin install copy ant ant ${ant-version} org.eclipse.jdt core ${eclipse-compiler-version} org.mortbay.jetty jsp-api-2.1-glassfish ${jsp21-version} org.mortbay.jetty jsp-2.1-glassfish ${jsp21-version} ${basedir}/../../lib/jsp-2.1 org.codehaus.mojo build-helper-maven-plugin 1.1 add-source generate-sources add-source ${project.build.directory}/generated-sources maven-antrun-plugin clean clean run copyjar install run org.apache.felix maven-bundle-plugin true manifest J2SE-1.5 !com.sun.appserv.*,!com.sun.common.util.*,!com.sun.el.*,!com.sun.enterprise.web.*,!com.sun.org.apache.commons.*,!org.apache.jasper.*,* org.apache.maven.plugins maven-jar-plugin ${project.build.outputDirectory}/META-INF/MANIFEST.MF org.eclipse.jdt core ${eclipse-compiler-version} org.mortbay.jetty jetty-util ${project.version} provided org.mortbay.jetty jsp-api-2.1-glassfish ${jsp21-version} org.mortbay.jetty jsp-2.1-glassfish ${jsp21-version} org.mortbay.jetty servlet-api org.mortbay.jetty servlet-api ${servlet-version} provided ant ant 3.1.1 jetty-6.1.26/modules/management/0000755000175000017500000000000011745736474015255 5ustar moonmoonjetty-6.1.26/modules/management/src/0000755000175000017500000000000011745736473016043 5ustar moonmoonjetty-6.1.26/modules/management/src/test/0000755000175000017500000000000011745736473017022 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/0000755000175000017500000000000011745736473017743 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/org/0000755000175000017500000000000011745736473020532 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/org/mortbay/0000755000175000017500000000000011745736473022207 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736473023346 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/org/mortbay/jetty/servlet/0000755000175000017500000000000011745736473025032 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/org/mortbay/jetty/servlet/management/0000755000175000017500000000000011745736473027146 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/org/mortbay/management/0000755000175000017500000000000011745736473024323 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/org/mortbay/management/ObjectMBeanTest.java0000644000175000017500000000352210472631505030123 0ustar moonmoon//======================================================================== //Copyright 2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.management; import junit.framework.TestCase; import org.mortbay.jetty.Server; import com.acme.Derived; public class ObjectMBeanTest extends TestCase { public ObjectMBeanTest(String arg0) { super(arg0); } public static void main(String[] args) { junit.textui.TestRunner.run(ObjectMBeanTest.class); } protected void setUp() throws Exception { super.setUp(); } protected void tearDown() throws Exception { super.tearDown(); } public void testMbeanInfo() { Derived derived = new Derived(); ObjectMBean mbean = new ObjectMBean(derived); assertTrue(mbean.getMBeanInfo()!=null); // TODO do more than just run it } public void testMbeanFor() { Derived derived = new Derived(); assertTrue(ObjectMBean.mbeanFor(derived)!=null); // TODO do more than just run it Server server = new Server(); assertTrue(ObjectMBean.mbeanFor(server)!=null); // TODO do more than just run it } } jetty-6.1.26/modules/management/src/test/java/com/0000755000175000017500000000000011745736473020521 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/com/acme/0000755000175000017500000000000011745736473021426 5ustar moonmoonjetty-6.1.26/modules/management/src/test/java/com/acme/Signature.java0000644000175000017500000000161710472631505024221 0ustar moonmoon//======================================================================== //Copyright 2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package com.acme; public interface Signature { String getFullName(); void publish(); } jetty-6.1.26/modules/management/src/test/java/com/acme/Derived.java0000644000175000017500000000241510472631505023637 0ustar moonmoon//======================================================================== //Copyright 2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package com.acme; public class Derived extends Base implements Signature { String fname="Full Name"; public String getFullName() { return fname; } public void setFullName(String name) { fname=name; } public void publish() { System.err.println("publish"); } public void doodle(String doodle) { System.err.println("doodle "+doodle); } public void somethingElse() { } } jetty-6.1.26/modules/management/src/test/java/com/acme/Base.java0000644000175000017500000000471210472631505023131 0ustar moonmoon//======================================================================== //Copyright 2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package com.acme; import org.mortbay.component.AbstractLifeCycle; public class Base extends AbstractLifeCycle { String name; int value; String[] messages; /* ------------------------------------------------------------ */ /** * @return Returns the messages. */ public String[] getMessages() { return messages; } /* ------------------------------------------------------------ */ /** * @param messages The messages to set. */ public void setMessages(String[] messages) { this.messages = messages; } /* ------------------------------------------------------------ */ /** * @return Returns the name. */ public String getName() { return name; } /* ------------------------------------------------------------ */ /** * @param name The name to set. */ public void setName(String name) { this.name = name; } /* ------------------------------------------------------------ */ /** * @return Returns the value. */ public int getValue() { return value; } /* ------------------------------------------------------------ */ /** * @param value The value to set. */ public void setValue(int value) { this.value = value; } /* ------------------------------------------------------------ */ public void doSomething(int arg) { System.err.println("doSomething "+arg); } /* ------------------------------------------------------------ */ public String findSomething(int arg) { return ("found "+arg); } } jetty-6.1.26/modules/management/src/test/resources/0000755000175000017500000000000011745736473021034 5ustar moonmoonjetty-6.1.26/modules/management/src/test/resources/com/0000755000175000017500000000000011745736473021612 5ustar moonmoonjetty-6.1.26/modules/management/src/test/resources/com/acme/0000755000175000017500000000000011745736473022517 5ustar moonmoonjetty-6.1.26/modules/management/src/test/resources/com/acme/management/0000755000175000017500000000000011745736473024633 5ustar moonmoonjetty-6.1.26/modules/management/src/test/resources/com/acme/management/Derived-mbean.properties0000644000175000017500000000033210472631505031373 0ustar moonmoonDerived: Test the mbean stuff fullName : The full name of something publish() : publish something doodle(java.lang.String) : ACTION:Doodle something doodle(java.lang.String)[0] : argname: A description of the argument.jetty-6.1.26/modules/management/src/main/0000755000175000017500000000000011745736474016770 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/0000755000175000017500000000000011745736473017710 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/0000755000175000017500000000000011745736473020477 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/mortbay/0000755000175000017500000000000011745736474022155 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736474023314 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/servlet/0000755000175000017500000000000011745736473024777 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/servlet/management/0000755000175000017500000000000011745736473027113 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/servlet/management/HolderMBean.java0000644000175000017500000000275510610644435032071 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.servlet.management; import org.mortbay.jetty.servlet.Holder; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.management.ObjectMBean; public class HolderMBean extends ObjectMBean { public HolderMBean(Object managedObject) { super(managedObject); } /* ------------------------------------------------------------ */ public String getObjectNameBasis() { if (_managed!=null && _managed instanceof Holder) { Holder holder = (Holder)_managed; String name = holder.getName(); if (name!=null) return name; } return super.getObjectNameBasis(); } } jetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/management/0000755000175000017500000000000011745736473025427 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/management/ServerMBean.java0000644000175000017500000000277410764066333030444 0ustar moonmoon//======================================================================== //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.management; import java.util.Arrays; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.ContextHandler; import org.mortbay.management.ObjectMBean; /** * */ public class ServerMBean extends ObjectMBean { private final long startupTime; private final Server server; public ServerMBean(Object managedObject) { super(managedObject); startupTime = System.currentTimeMillis(); server = (Server)managedObject; } public Handler[] getContexts() { return server.getChildHandlersByClass(ContextHandler.class); } public long getStartupTime() { return startupTime; } } jetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/handler/0000755000175000017500000000000011745736474024731 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/handler/management/0000755000175000017500000000000011745736474027045 5ustar moonmoon././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootjetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/handler/management/ContextHandlerMBean.javajetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/handler/management/ContextHandlerMBe0000644000175000017500000000536311044235703032262 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.management; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import org.mortbay.jetty.handler.ContextHandler; import org.mortbay.management.ObjectMBean; import org.mortbay.util.Attributes; public class ContextHandlerMBean extends ObjectMBean { public ContextHandlerMBean(Object managedObject) { super(managedObject); } /* ------------------------------------------------------------ */ public String getObjectNameBasis() { if (_managed!=null && _managed instanceof ContextHandler) { ContextHandler context = (ContextHandler)_managed; String name = context.getDisplayName(); if (name!=null) return name; if (context.getBaseResource()!=null && context.getBaseResource().getName().length()>1) return context.getBaseResource().getName(); } return super.getObjectNameBasis(); } public Map getContextAttributes() { Map map = new HashMap(); Attributes attrs = ((ContextHandler)_managed).getAttributes(); Enumeration en = attrs.getAttributeNames(); while (en.hasMoreElements()) { String name = (String)en.nextElement(); Object value = attrs.getAttribute(name); map.put(name,value); } return map; } public void setContextAttribute(String name, Object value) { Attributes attrs = ((ContextHandler)_managed).getAttributes(); attrs.setAttribute(name,value); } public void setContextAttribute(String name, String value) { Attributes attrs = ((ContextHandler)_managed).getAttributes(); attrs.setAttribute(name,value); } public void removeContextAttribute(String name) { Attributes attrs = ((ContextHandler)_managed).getAttributes(); attrs.removeAttribute(name); } } jetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/webapp/0000755000175000017500000000000011745736474024572 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/webapp/management/0000755000175000017500000000000011745736474026706 5ustar moonmoon././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/webapp/management/WebAppContextMBean.javajetty-6.1.26/modules/management/src/main/java/org/mortbay/jetty/webapp/management/WebAppContextMBean0000644000175000017500000000314311044235703032235 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.webapp.management; import org.mortbay.jetty.handler.management.ContextHandlerMBean; import org.mortbay.jetty.webapp.WebAppContext; public class WebAppContextMBean extends ContextHandlerMBean { public WebAppContextMBean(Object managedObject) { super(managedObject); } /* ------------------------------------------------------------ */ public String getObjectNameBasis() { String basis = super.getObjectNameBasis(); if (basis!=null) return basis; if (_managed!=null && _managed instanceof WebAppContext) { WebAppContext context = (WebAppContext)_managed; String name = context.getWar(); if (name!=null) return name; } return null; } } jetty-6.1.26/modules/management/src/main/java/org/mortbay/management/0000755000175000017500000000000011745736474024271 5ustar moonmoonjetty-6.1.26/modules/management/src/main/java/org/mortbay/management/MBeanContainer.java0000644000175000017500000002364210611000767027744 0ustar moonmoon//======================================================================== //Copyright 2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.management; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.WeakHashMap; import javax.management.Attribute; import javax.management.MBeanServer; import javax.management.ObjectInstance; import javax.management.ObjectName; import javax.management.loading.PrivateMLet; import org.mortbay.component.Container; import org.mortbay.component.Container.Relationship; import org.mortbay.log.Log; import org.mortbay.log.Logger; import org.mortbay.util.MultiMap; import org.mortbay.util.TypeUtil; public class MBeanContainer implements Container.Listener { private final MBeanServer _server; private volatile int _managementPort; private final WeakHashMap _beans = new WeakHashMap(); private final HashMap _unique = new HashMap(); private String _domain = null; private MultiMap _relations = new MultiMap(); public synchronized ObjectName findMBean(Object object) { ObjectName bean = (ObjectName)_beans.get(object); return bean==null?null:bean; } public synchronized Object findBean(ObjectName oname) { for (Iterator iter = _beans.entrySet().iterator(); iter.hasNext();) { Map.Entry entry = (Map.Entry) iter.next(); ObjectName bean = (ObjectName)entry.getValue(); if (bean.equals(oname)) return entry.getKey(); } return null; } public MBeanContainer(MBeanServer server) { this._server = server; Logger log = Log.getLog(); if (log!=null) addBean(log); } public MBeanServer getMBeanServer() { return _server; } public void setDomain (String domain) { _domain =domain; } public String getDomain() { return _domain; } public void setManagementPort(int port) { this._managementPort = port; } public void start() { if (_managementPort > 0) { try { Log.warn("HttpAdaptor for mx4j is not secure"); PrivateMLet mlet = new PrivateMLet(new URL[0], Thread.currentThread().getContextClassLoader(), false); ObjectName mletName = ObjectName.getInstance("mx4j", "name", "HttpAdaptorLoader"); _server.registerMBean(mlet, mletName); ObjectName adaptorName = ObjectName.getInstance("mx4j", "name", "HttpAdaptor"); _server.createMBean("mx4j.tools.adaptor.http.HttpAdaptor", adaptorName, mletName); _server.setAttribute(adaptorName, new Attribute("Port", new Integer(_managementPort))); _server.setAttribute(adaptorName, new Attribute("Host", "localhost")); ObjectName processorName = ObjectName.getInstance("mx4j", "name", "XSLTProcessor"); _server.createMBean("mx4j.tools.adaptor.http.XSLTProcessor", processorName, mletName); _server.setAttribute(adaptorName, new Attribute("ProcessorName", processorName)); _server.invoke(adaptorName, "start", null, null); Runtime.getRuntime().addShutdownHook(new ShutdownHook(mletName, adaptorName, processorName)); } catch (Exception e) { Log.warn(e); } } } public synchronized void add(Relationship relationship) { ObjectName parent=(ObjectName)_beans.get(relationship.getParent()); if (parent==null) { addBean(relationship.getParent()); parent=(ObjectName)_beans.get(relationship.getParent()); } ObjectName child=(ObjectName)_beans.get(relationship.getChild()); if (child==null) { addBean(relationship.getChild()); child=(ObjectName)_beans.get(relationship.getChild()); } if (parent!=null && child!=null) _relations.add(parent,relationship); } public synchronized void remove(Relationship relationship) { ObjectName parent=(ObjectName)_beans.get(relationship.getParent()); ObjectName child=(ObjectName)_beans.get(relationship.getChild()); if (parent!=null && child!=null) _relations.removeValue(parent,relationship); } public synchronized void removeBean(Object obj) { ObjectName bean=(ObjectName)_beans.get(obj); if (bean!=null) { List r=_relations.getValues(bean); if (r!=null && r.size()>0) { Log.debug("Unregister {}", r); Iterator iter = new ArrayList(r).iterator(); while (iter.hasNext()) { Relationship rel = (Relationship)iter.next(); rel.getContainer().update(rel.getParent(),rel.getChild(),null,rel.getRelationship(),true); } } try { _server.unregisterMBean(bean); Log.debug("Unregistered {}", bean); } catch (javax.management.InstanceNotFoundException e) { Log.ignore(e); } catch (Exception e) { Log.warn(e); } } } public synchronized void addBean(Object obj) { try { if (obj == null || _beans.containsKey(obj)) return; Object mbean = ObjectMBean.mbeanFor(obj); if (mbean == null) return; ObjectName oname = null; if (mbean instanceof ObjectMBean) { ((ObjectMBean) mbean).setMBeanContainer(this); oname = ((ObjectMBean)mbean).getObjectName(); } //no override mbean object name, so make a generic one if (oname == null) { String type=obj.getClass().getName().toLowerCase(); int dot = type.lastIndexOf('.'); if (dot >= 0) type = type.substring(dot + 1); String name=null; if (mbean instanceof ObjectMBean) { name = ((ObjectMBean)mbean).getObjectNameBasis(); if (name!=null) { name=name.replace('\\','/'); if (name.endsWith("/")) name=name.substring(0,name.length()-1); int slash=name.lastIndexOf('/',name.length()-1); if (slash>0) name=name.substring(slash+1); dot=name.lastIndexOf('.'); if (dot>0) name=name.substring(0,dot); name=name.replace(':','_').replace('*','_').replace('?','_').replace('=','_').replace(',','_').replace(' ','_'); } } String basis=(name!=null&&name.length()>1)?("type="+type+",name="+name):("type="+type); Integer count = (Integer) _unique.get(basis); count = TypeUtil.newInteger(count == null ? 0 : (1 + count.intValue())); _unique.put(basis, count); //if no explicit domain, create one String domain = _domain; if (domain==null) domain = obj.getClass().getPackage().getName(); oname = ObjectName.getInstance(domain+":"+basis+",id="+count); } ObjectInstance oinstance = _server.registerMBean(mbean, oname); Log.debug("Registered {}" , oinstance.getObjectName()); _beans.put(obj, oinstance.getObjectName()); } catch (Exception e) { Log.warn("bean: "+obj,e); } } private class ShutdownHook extends Thread { private final ObjectName mletName; private final ObjectName adaptorName; private final ObjectName processorName; public ShutdownHook(ObjectName mletName, ObjectName adaptorName, ObjectName processorName) { this.mletName = mletName; this.adaptorName = adaptorName; this.processorName = processorName; } public void run() { halt(); unregister(processorName); unregister(adaptorName); unregister(mletName); } private void halt() { try { _server.invoke(adaptorName, "stop", null, null); } catch (Exception e) { Log.warn(e); } } private void unregister(ObjectName objectName) { try { _server.unregisterMBean(objectName); Log.debug("Unregistered " + objectName); } catch (Exception e) { Log.warn(e); } } } } jetty-6.1.26/modules/management/src/main/java/org/mortbay/management/ObjectMBean.java0000644000175000017500000006534010764066333027243 0ustar moonmoon//======================================================================== //Copyright 2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.management; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.Set; import javax.management.Attribute; import javax.management.AttributeList; import javax.management.AttributeNotFoundException; import javax.management.DynamicMBean; import javax.management.InvalidAttributeValueException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanConstructorInfo; import javax.management.MBeanException; import javax.management.MBeanInfo; import javax.management.MBeanNotificationInfo; import javax.management.MBeanOperationInfo; import javax.management.MBeanParameterInfo; import javax.management.ObjectName; import javax.management.ReflectionException; import javax.management.modelmbean.ModelMBean; import org.mortbay.log.Log; import org.mortbay.util.LazyList; import org.mortbay.util.Loader; import org.mortbay.util.TypeUtil; /* ------------------------------------------------------------ */ /** ObjectMBean. * A dynamic MBean that can wrap an arbitary Object instance. * the attributes and methods exposed by this bean are controlled by * the merge of property bundles discovered by names related to all * superclasses and all superinterfaces. * * Attributes and methods exported may be "Object" and must exist on the * wrapped object, or "MBean" and must exist on a subclass of OBjectMBean * or "MObject" which exists on the wrapped object, but whose values are * converted to MBean object names. * */ public class ObjectMBean implements DynamicMBean { private static Class[] OBJ_ARG = new Class[]{Object.class}; protected Object _managed; private MBeanInfo _info; private Map _getters=new HashMap(); private Map _setters=new HashMap(); private Map _methods=new HashMap(); private Set _convert=new HashSet(); private ClassLoader _loader; private MBeanContainer _mbeanContainer; private static String OBJECT_NAME_CLASS = ObjectName.class.getName(); private static String OBJECT_NAME_ARRAY_CLASS = ObjectName[].class.getName(); /* ------------------------------------------------------------ */ /** * Create MBean for Object. Attempts to create an MBean for the object by searching the package * and class name space. For example an object of the type * *
         * class com.acme.MyClass extends com.acme.util.BaseClass implements com.acme.Iface
         * 
    * * Then this method would look for the following classes: *
      *
    • com.acme.management.MyClassMBean *
    • com.acme.util.management.BaseClassMBean *
    • org.mortbay.management.ObjectMBean *
    * * @param o The object * @return A new instance of an MBean for the object or null. */ public static Object mbeanFor(Object o) { try { Class oClass = o.getClass(); Object mbean = null; while (mbean == null && oClass != null) { String pName = oClass.getPackage().getName(); String cName = oClass.getName().substring(pName.length() + 1); String mName = pName + ".management." + cName + "MBean"; try { Class mClass = (Object.class.equals(oClass))?oClass=ObjectMBean.class:Loader.loadClass(oClass,mName,true); if (Log.isDebugEnabled()) Log.debug("mbeanFor " + o + " mClass=" + mClass); try { Constructor constructor = mClass.getConstructor(OBJ_ARG); mbean=constructor.newInstance(new Object[]{o}); } catch(Exception e) { Log.ignore(e); if (ModelMBean.class.isAssignableFrom(mClass)) { mbean=mClass.newInstance(); ((ModelMBean)mbean).setManagedResource(o, "objectReference"); } } if (Log.isDebugEnabled()) Log.debug("mbeanFor " + o + " is " + mbean); return mbean; } catch (ClassNotFoundException e) { if (e.toString().endsWith("MBean")) Log.ignore(e); else Log.warn(e); } catch (Error e) { Log.warn(e); mbean = null; } catch (Exception e) { Log.warn(e); mbean = null; } oClass = oClass.getSuperclass(); } } catch (Exception e) { Log.ignore(e); } return null; } public ObjectMBean(Object managedObject) { _managed = managedObject; _loader = Thread.currentThread().getContextClassLoader(); } public Object getManagedObject() { return _managed; } public ObjectName getObjectName() { return null; } public String getObjectNameBasis() { return null; } protected void setMBeanContainer(MBeanContainer container) { this._mbeanContainer = container; } public MBeanContainer getMBeanContainer () { return this._mbeanContainer; } public MBeanInfo getMBeanInfo() { try { if (_info==null) { // Start with blank lazy lists attributes etc. String desc=null; Object attributes=null; Object constructors=null; Object operations=null; Object notifications=null; // Find list of classes that can influence the mbean Class o_class=_managed.getClass(); Object influences = findInfluences(null, _managed.getClass()); // Set to record defined items Set defined=new HashSet(); // For each influence for (int i=0;i0) { // define an operation if (!defined.contains(key) && key.indexOf('[')<0) { defined.add(key); operations=LazyList.add(operations,defineOperation(key, value, bundle)); } } else { // define an attribute if (!defined.contains(key)) { defined.add(key); attributes=LazyList.add(attributes,defineAttribute(key, value)); } } } } catch(MissingResourceException e) { Log.ignore(e); } } _info = new MBeanInfo(o_class.getName(), desc, (MBeanAttributeInfo[])LazyList.toArray(attributes, MBeanAttributeInfo.class), (MBeanConstructorInfo[])LazyList.toArray(constructors, MBeanConstructorInfo.class), (MBeanOperationInfo[])LazyList.toArray(operations, MBeanOperationInfo.class), (MBeanNotificationInfo[])LazyList.toArray(notifications, MBeanNotificationInfo.class)); } } catch(RuntimeException e) { Log.warn(e); throw e; } return _info; } /* ------------------------------------------------------------ */ public Object getAttribute(String name) throws AttributeNotFoundException, MBeanException, ReflectionException { Method getter = (Method) _getters.get(name); if (getter == null) throw new AttributeNotFoundException(name); try { Object o = _managed; if (getter.getDeclaringClass().isInstance(this)) o = this; // mbean method // get the attribute Object r=getter.invoke(o, (java.lang.Object[]) null); // convert to ObjectName if need be. if (r!=null && _convert.contains(name)) { if (r.getClass().isArray()) { ObjectName[] on = new ObjectName[Array.getLength(r)]; for (int i=0;i 0 ? "," : "") + signature[i]; methodKey += ")"; ClassLoader old_loader=Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(_loader); Method method = (Method) _methods.get(methodKey); if (method == null) throw new NoSuchMethodException(methodKey); Object o = _managed; if (method.getDeclaringClass().isInstance(this)) o = this; return method.invoke(o, params); } catch (NoSuchMethodException e) { Log.warn(Log.EXCEPTION, e); throw new ReflectionException(e); } catch (IllegalAccessException e) { Log.warn(Log.EXCEPTION, e); throw new MBeanException(e); } catch (InvocationTargetException e) { Log.warn(Log.EXCEPTION, e); throw new ReflectionException((Exception) e.getTargetException()); } finally { Thread.currentThread().setContextClassLoader(old_loader); } } private static Object findInfluences(Object influences, Class aClass) { if (aClass!=null) { // This class is an influence influences=LazyList.add(influences,aClass); // So are the super classes influences=findInfluences(influences,aClass.getSuperclass()); // So are the interfaces Class[] ifs = aClass.getInterfaces(); for (int i=0;ifs!=null && i *
  • "Object" The field/method is on the managed object. *
  • "MBean" The field/method is on the mbean proxy object *
  • "MObject" The field/method is on the managed object and value should be converted to MBean reference *
  • "MMBean" The field/method is on the mbean proxy object and value should be converted to MBean reference *
* the access is either "RW" or "RO". */ public MBeanAttributeInfo defineAttribute(String name, String metaData) { String description = ""; boolean writable = true; boolean onMBean = false; boolean convert = false; if (metaData!= null) { String[] tokens = metaData.split(":", 3); for (int t=0;t0?",":"(")+args[i]; } signature+=(i>0?")":"()"); // Build param infos for (i = 0; i < args.length; i++) { String param_desc = bundle.getString(signature + "[" + i + "]"); parts=param_desc.split(" *: *",2); if (Log.isDebugEnabled()) Log.debug(parts[0]+": "+parts[1]); pInfo[i] = new MBeanParameterInfo(parts[0].trim(), args[i], parts[1].trim()); } // build the operation info Method method = oClass.getMethod(method_name, types); Class returnClass = method.getReturnType(); _methods.put(signature, method); if (convert) _convert.add(signature); return new MBeanOperationInfo(method_name, description, pInfo, returnClass.isPrimitive() ? TypeUtil.toName(returnClass) : (returnClass.getName()), impact); } catch (Exception e) { Log.warn("Operation '"+signature+"'", e); throw new IllegalArgumentException(e.toString()); } } } jetty-6.1.26/modules/management/src/main/config/0000755000175000017500000000000011745736474020235 5ustar moonmoonjetty-6.1.26/modules/management/src/main/config/etc/0000755000175000017500000000000011745736474021010 5ustar moonmoonjetty-6.1.26/modules/management/src/main/config/etc/jetty-jmx.xml0000644000175000017500000000703111342026273023444 0ustar moonmoon jetty-6.1.26/modules/management/src/main/resources/0000755000175000017500000000000011745736474021002 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/0000755000175000017500000000000011745736474021571 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/0000755000175000017500000000000011745736474023246 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/0000755000175000017500000000000011745736474024405 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/deployer/0000755000175000017500000000000011745736474026230 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/deployer/management/0000755000175000017500000000000011745736474030344 5ustar moonmoon././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/deployer/management/ContextDeployer-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/deployer/management/ContextDepl0000644000175000017500000000143710604075526032510 0ustar moonmoonContextDeployer: Deployer for runtime deploy/undeploy of webapps contexts: MObject: The ContextHandlerCollection to which the deployer deploys scanInterval: Object: The interval in seconds between scans of the deploy directory configurationDir: Object:RO: The deploy directory setConfigurationDir(org.mortbay.resource.Resource):ACTION:Set the deploy directory setConfigurationDir(org.mortbay.resource.Resource)[0]:resource:The directory setConfigurationDir(java.lang.String):ACTION:Set the deploy directory setConfigurationDir(java.lang.String)[0]:dir:The directory setConfigurationDir(java.io.File):ACTION:Set the deploy directory setConfigurationDir(java.io.File)[0]:file:The directory configurationManager: MObject:Source of property values for property name resolution in deployed config file ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/deployer/management/WebAppDeployer-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/deployer/management/WebAppDeplo0000644000175000017500000000233110604075526032413 0ustar moonmoonWebAppDeployer: Deployer for startup deployment of webapps contexts: MObject: The ContextHandlerCollection to which the deployer deploys allowDuplicates: Object:R0: Whether or not duplicate deployments are allowed setAllowDuplicates(boolean):ACTION: Whether or not duplicate deployments are allowed setAllowDuplicates(boolean)[0]:allowDuplicates: True allows duplicate webapps to be deployed while false does not defaultsDescriptor: Object: The webdefault.xml descriptor to use for all webapps deployed by the deployer configurationClasses: Object: The set of configuration classes to apply to the deployment of each webapp webAppDir: Object: The directory where the webapps are to be found to deploy extract: Object:RO: Whether or not to extract war files on deployment setExtract(boolean):ACTION:Set whether or not to extract war files setExtract(boolean)[0]:extract: True will extract war files while false will not parentLoaderPriority: Object:RO: Whether to use j2se classloading order or servlet spec classloading order setParentLoaderPriority(boolean):ACTION: Set which classloading paradigm to use setParentLoaderPriority(boolean)[0]:parentPriorityClassLoading: True uses j2se classloading order while false uses servlet spec order jetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/0000755000175000017500000000000011745736474026071 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/0000755000175000017500000000000011745736474030205 5ustar moonmoon././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/Context-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/Context-mbea0000644000175000017500000000031010604075526032433 0ustar moonmoonContext: Servlet Context Handler securityHandler: MObject: The context's security handler servletHandler: MObject: The context's servlet handler sessionHandler: MObject: The context's session handler ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/Holder-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/Holder-mbean0000644000175000017500000000017210507217610032402 0ustar moonmoonHolder: Holder name: RO:Name displayName: RO:Display Name className: RO:Class Name initParameters: RO:Initial parameters ././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/ServletMapping-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/ServletMappi0000644000175000017500000000013010507217610032512 0ustar moonmoonServletMapping: Servlet Mapping servletName: RO:Servlet Name pathSpecs: RO:URL patterns ././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/FilterMapping-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/FilterMappin0000644000175000017500000000016310507217610032477 0ustar moonmoonFilterMapping: Filter Mapping filterName: RO:Filter Name pathSpecs: RO:URL patterns servletNames: RO:Servlet Names ././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/AbstractSessionManager-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/AbstractSess0000644000175000017500000000157010540543231032507 0ustar moonmoonAbstractSessionManager: Abstract Session Manager httpOnly: True if cookies use the http only flag idManager: MObject:RO:The ID Manager instance maxCookieAge: if greater than zero, the time in seconds a session cookie will last for maxInactiveInterval: default maximim time in seconds a session may be idle maxSessions: The maximum number of simultaneous sessions minSessions: The minimum number of simultaneous sessions refreshCookieAge: The time in seconds after which a session cookie is re-set secureCookies: If true, the secure cookie flag is set on session cookies sessionCookie: The set session cookie sessionDomain: The domain of the session cookie or null for the default sessionPath: The path of the session cookie or null for the default sessions: The instantaneous number of sessions sessionURLPrefix: The prefix to use for URL session tracking resetStats(): Reset statistics ././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/ServletHandler-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/ServletHandl0000644000175000017500000000027210507217610032501 0ustar moonmoonServletHandler: Servlet Handler servlets: MObject:RO:Servlets servletMappings: MObject:RO:Mappings of servlets filters: MObject:RO:Filters filterMappings: MObject:RO:Mappings of filters ././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/ServletHolder-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/servlet/management/ServletHolde0000644000175000017500000000017410547501553032515 0ustar moonmoonServletHolder: Servlet Holder initOrder: Initialization order runAs: Role to run servlet as forcedPath: Forced servlet path jetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/nio/0000755000175000017500000000000011745736474025172 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/nio/management/0000755000175000017500000000000011745736474027306 5ustar moonmoon././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/nio/management/SelectChannelConnector-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/nio/management/SelectChannelCon0000644000175000017500000000045510575763644032404 0ustar moonmoonSelectChannelConnector: HTTP connector using NIO ByteChannels and Selectors lowResourcesConnections: The number of connections, which if exceeded represents low resources lowResourcesMaxIdleTime: The period in ms that a connection may be idle when the connector has low resources, before it is closed.jetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/0000755000175000017500000000000011745736474026521 5ustar moonmoon././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/Server-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/Server-mbean.propert0000644000175000017500000000055710604075526032456 0ustar moonmoonServer: Jetty HTTP Servlet server connectors: MObject:HTTP Connectors for this server version: RO: The version of this server sendServerVersion: If true include the server version in HTTP headers threadPool: MObject:The server Thread Pool contexts: MMBean:RO:The contexts of this server startupTime: MBean:RO:The startup time, in milliseconds, since January 1st 1970 ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/Connector-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/Connector-mbean.prop0000644000175000017500000000461010472631505032417 0ustar moonmoonConnector: HTTP Connector. server: MObject:RO:The server for this connector headerBufferSize: The size of the header buffer requestBufferSize: The size of a request content buffer responseBufferSize: The size of a response content buffer integralPort: Port to use for integral redirections integralScheme: Scheme to use for integral redirections confidentialPort: Port to use for confidential redirections confidentialScheme: Scheme to use for confidential redirections host: Host name to accept connections on port: TCP/IP port to accept connections on maxIdleTime: Maximum time in ms that a connection can be idle before being closed statsOn: True if statistics collection is turned on. statsOnMs: Time in milliseconds stats have been collected for. statsReset(): Reset statistics. connections: Number of connections accepted by the server since statsReset() called. Undefined if setStatsOn(false). connectionsOpen: Number of connections currently open that were opened since statsReset() called. Undefined if setStatsOn(false). connectionsOpenMin: Minimim number of connections opened simultaneously since statsReset() called. Undefined if setStatsOn(false). connectionsOpenMax: Maximum number of connections opened simultaneously since statsReset() called. Undefined if setStatsOn(false). connectionsDurationAve: Average duration in milliseconds of open connections since statsReset() called. Undefined if setStatsOn(false). connectionsDurationMin: Minimum duration in milliseconds of an open connection since statsReset() called. Undefined if setStatsOn(false). connectionsDurationMax: Maximum duration in milliseconds of an open connection since statsReset() called. Undefined if setStatsOn(false). connectionsDurationTotal: Total duration in milliseconds of all open connection since statsReset() called. Undefined if setStatsOn(false). connectionsRequestsAve: Average number of requests per connection since statsReset() called. Undefined if setStatsOn(false). connectionsRequestsMin: Minimum number of requests per connection since statsReset() called. Undefined if setStatsOn(false). connectionsRequestsMax: Maximum number of requests per connection since statsReset() called. Undefined if setStatsOn(false). requests: Number of requests since statsReset() called. Undefined if setStatsOn(false). open(): Open the listening port close(): Close the listening port (but allow existing connections to continue for graceful shutdown)././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/Handler-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/Handler-mbean.proper0000644000175000017500000000017710527372070032375 0ustar moonmoonHandler: Jetty Handler. server: MObject:RO:The Jetty server for this handler destroy(): destroy associated resources (eg MBean)././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/AbstractConnector-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/AbstractConnector-mb0000644000175000017500000000254411173372264032447 0ustar moonmoonAbstractConnector: Abstract implementation of the Connector interface. acceptors: The number of acceptor threads. acceptQueueSize: The size of the accept queue. acceptorPriorityOffset: Priority offset of the acceptor threads. The priority is adjusted by this amount to either favor the acceptance of new threads and newly active connections or to favor the handling of already dispatched connections. forwardedForHeader: The header name for forwarded for (default x-forwarded-for). forwardedHostHeader: The header name for forwarded hosts (default x-forwarded-host) forwardedServerHeader: The header name for forwarded server (default x-forwarded-server) forwarded: Whether reverse proxy handling is on. True if this connector is checking the forwarded for/host/server headers. host: Host name of the server. hostHeader: Forced value for the host header. Only used if forwarded is true. soLingerTime: Enable or disable SO_LINGER with the specified linger time in seconds. reuseAddress: Whether the server socket will be opened in SO_REUSEADDR mode. name: Name of the connector. resolveNames: Whether or not to use DNS when handling forwards. confidentialPort: Port to use for confidential redirections. confidentialScheme: Scheme to use for confidential redirections. integralPort: Port to use for integral redirections. integralScheme: Scheme to use for integral redirections. ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/NCSARequestLog-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/management/NCSARequestLog-mbean0000644000175000017500000000040010472631505032236 0ustar moonmoonNCSARequestLog : NCSA standard format request log filename : Filename of log retainDays : Number of days that the log files are kept append : Existing log files are appended to the new one extended : Use the extended NCSA format LogTimeZone : The timezone jetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/0000755000175000017500000000000011745736474026022 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/0000755000175000017500000000000011745736474030136 5ustar moonmoon././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/HandlerCollection-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/HandlerColle0000644000175000017500000000012310604075526032374 0ustar moonmoonHandlerCollection: Handler of multiple Handlers handlers: MObject:Wrapped handlers ././@LongLink0000000000000000000000000000020300000000000011560 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/AbstractStatisticsHandler-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/AbstractStat0000644000175000017500000000221411216010110032414 0ustar moonmoonAbstractStatisticsHandler: Request Statistics statsReset(): Reset statistics. requests: Number of requests since statsReset() called. requestsActive: Number of requests currently active since statsReset() called. requestsActiveMax: Maximum number of active requests since statsReset() called. responses1xx: Number of responses with 1xx status since statsReset() called. responses2xx: Number of responses with 2xx status since statsReset() called. responses3xx: Number of responses with 3xx status since statsReset() called. responses4xx: Number of responses with 4xx status since statsReset() called. responses5xx: Number of responses with 5xx status since statsReset() called. statsOnMs: Time in milliseconds since the statistics were started with statsReset(). requestTimeMin: The minimum time (in milliseconds) of request handling since statsReset() called. requestTimeMax: The maximum time (in milliseconds) of request handling since statsReset() called. requestTimeTotal: The total time (in milliseconds) of all requests handling since statsReset() called. requestTimeAverage: The average time (in milliseconds) of request handling since statsReset() called. ././@LongLink0000000000000000000000000000020200000000000011557 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/ContextHandlerCollection-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/ContextHandl0000644000175000017500000000016110557645024032440 0ustar moonmoonContextHandlerCollection: Context Handler Collection mapContexts(): Update the mapping of context path to context././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/HandlerWrapper-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/HandlerWrapp0000644000175000017500000000012210604075526032426 0ustar moonmoonHandlerWrapper: Handler wrapping another Handler handler: MObject:Wrapped handler ././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/HandlerContainer-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/HandlerConta0000644000175000017500000000013710472631505032405 0ustar moonmoonHandlerContainer: Handler of multiple Handlers childHandlers: MObject:RO:All contained handlers././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/ContextHandler-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/handler/management/ContextHandl0000644000175000017500000000230610764066333032443 0ustar moonmoonContextHandler: URI Context contextPath: URI prefix of context welcomeFiles: Partial URIs of directory welcome files displayName: RO: Display name of the Context virtualHosts: Virtual hosts accepted by the context connectorNames: Names and ports of accepted connectors contextAttributes: RO:MBean: Map of context attributes setContextAttribute(java.lang.String,java.lang.Object): MBean:ACTION: Set context attribute setContextAttribute(java.lang.String,java.lang.Object)[0]: name: The attribute name setContextAttribute(java.lang.String,java.lang.Object)[1]: value: The attribute value setContextAttribute(java.lang.String,java.lang.String): MBean:ACTION: Set context attribute setContextAttribute(java.lang.String,java.lang.String)[0]: name: The attribute name setContextAttribute(java.lang.String,java.lang.String)[1]: value: The attribute value removeContextAttribute(java.lang.String): MBean:ACTION: remove context attribute removeContextAttribute(java.lang.String)[0]: name: The attribute name resourceBase: Document root for the context initParams: Initial Parameter map for the context shutdown: False if this context is accepting new requests. True for graceful shutdown, which allows existing requests to completejetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/webapp/0000755000175000017500000000000011745736474025663 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/webapp/management/0000755000175000017500000000000011745736474027777 5ustar moonmoon././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/webapp/management/WebAppContext-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/jetty/webapp/management/WebAppContext0000644000175000017500000000144510547501553032434 0ustar moonmoonWebAppContext: Web Application ContextHandler configurationClasses: Array of names of configuration classes defaultsDescriptor: Default web.xml descriptor applied before standard web.xml overrideDescriptor: Override web.xml descriptor applied after standard web.xml serverClasses: Classes and packages hidden by the context classloader systemClasses: Classes and packages given priority by context classloader war: WAR file location distributable: Is the web application distributable extractWAR: Is the war file extraced on deploy copyWebDir: Is the web application directory copied on deploy parentLoaderPriority: Is the parent classloader given priority descriptor: The standard web.xml descriptor extraClasspath: Extra classpath for the context classloader tempDirectory: Temporary directory locationjetty-6.1.26/modules/management/src/main/resources/org/mortbay/log/0000755000175000017500000000000011745736474024027 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/log/management/0000755000175000017500000000000011745736474026143 5ustar moonmoon././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/log/management/Slf4jLog-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/log/management/Slf4jLog-mbean.propert0000644000175000017500000000003310644363726032251 0ustar moonmoonSlf4jLog: SL4J log adapter ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/log/management/StdErrLog-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/log/management/StdErrLog-mbean.proper0000644000175000017500000000005210644363726032307 0ustar moonmoonStdErrLog: Log adapter that logs to stderr././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/log/management/Logger-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/log/management/Logger-mbean.propertie0000644000175000017500000000011010472631505032346 0ustar moonmoonLogger: Jetty Logging implementaton debugEnabled: True if debug enabled jetty-6.1.26/modules/management/src/main/resources/org/mortbay/component/0000755000175000017500000000000011745736474025250 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/component/management/0000755000175000017500000000000011745736474027364 5ustar moonmoon././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/component/management/LifeCycle-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/component/management/LifeCycle-mbean.0000644000175000017500000000041710507217610032263 0ustar moonmoonLifeCycle: Startable object start(): Starts the instance stop(): Stops the instance running: Instance is started or starting started: Instance is started starting: Instance is starting stopping: Instance is stopping stopped: Instance is stopped failed: Instance is failedjetty-6.1.26/modules/management/src/main/resources/org/mortbay/thread/0000755000175000017500000000000011745736474024515 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/thread/management/0000755000175000017500000000000011745736474026631 5ustar moonmoon././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/thread/management/QueuedThreadPool-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/thread/management/QueuedThreadPool-mb0000644000175000017500000000132211235766152032346 0ustar moonmoonQueuedThreadPool: A thread pool with no max bound by default minThreads: Minimum number of threads in the pool maxThreads: Maximum number threads in the pool name: Name of the thread pool daemon: Is pool thread using daemon thread threadsPriority: The priority of threads in the pool maxIdleTimeMs: Maximum time a thread may be idle in ms queueSize: The pool threads size spawnOrShrinkAt: The number of queued jobs (or idle threads) needed before the thread pool is grown (or shrunk) dump(): Dump thread state stopThread(java.lang.String): Stop a pool thread stopThread(java.lang.String)[0]: name:Thread Name interruptThread(java.lang.String): Interrupt a pool thread interruptThread(java.lang.String)[0]: name:Thread Name././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/thread/management/ThreadPool-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/thread/management/ThreadPool-mbean.pr0000644000175000017500000000026210766121134032274 0ustar moonmoonThreadPool: Pool of threads threads: RO:Number of Threads in pool idleThreads: RO:Number of idle Threads in pool lowOnThreads: RO:Indicates the pool is low on available threads. ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/thread/management/BoundedThreadPool-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/thread/management/BoundedThreadPool-m0000644000175000017500000000046510472631505032336 0ustar moonmoonBoundedThreadPool: A thread pool with fixed bounds minThreads: Minimum number of threads in the pool maxThreads: Maximum number threads in the pool name: Name of the thread pool daemon: Are pool threads daemon threads threadsPriority: Priority of threads maxIdleTimeMs: Maximum time a thread may be idle in msjetty-6.1.26/modules/management/src/main/resources/org/mortbay/cometd/0000755000175000017500000000000011745736474024521 5ustar moonmoonjetty-6.1.26/modules/management/src/main/resources/org/mortbay/cometd/management/0000755000175000017500000000000011745736474026635 5ustar moonmoon././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootjetty-6.1.26/modules/management/src/main/resources/org/mortbay/cometd/management/AbstractBayeux-mbean.propertiesjetty-6.1.26/modules/management/src/main/resources/org/mortbay/cometd/management/AbstractBayeux-mbea0000644000175000017500000000127111042000253032345 0ustar moonmoonAbstractBayeux: Implementation of the Bayeux protocol for cometd channelCount: Number of channels clientCount: Number of users interval: The time in ms a client should delay between reconnects logLevel: The log level. 0=none, 1=info, 2=debug maxInterval: The maximum time in ms to wait between polls before timing out a client. multiFrameInterval: The time in ms a client should delay between reconnects when multiple connections from the same browser are detected. timeout: The time in ms a client should wait for a reply before timing out directDeliver: Whether a published message should be delivered directly to subscribers, or a new message should be created that holds only supported fields jetty-6.1.26/modules/management/pom.xml0000644000175000017500000001355211466510412016556 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-management Jetty Management Jetty JMX maven-compiler-plugin 1.5 1.5 org.apache.maven.plugins maven-enforcer-plugin enforce-java enforce 2.0.6 [1.5,) maven-antrun-plugin clean clean run copy install run org.codehaus.mojo dependency-maven-plugin install copy ${project.groupId} ${project.artifactId} ${project.version} ${project.artifactId}-${project.version}.jar mx4j mx4j ${mx4j-version} ${basedir}/../../lib/management/mx4j mx4j mx4j-tools ${mx4j-version} ${basedir}/../../lib/management/mx4j ${basedir}/../../lib/management org.apache.felix maven-bundle-plugin ${maven-bundle-plugin-version} true manifest org.mortbay.jetty.management http://jetty.mortbay.org J2SE-1.4 !org.mortbay.component.management.*,!org.mortbay.jetty.deployer.management.*,!org.mortbay.jetty.nio.management.*,!org.mortbay.log.management.*,!org.mortbay.management.*,!org.mortbay.thread.management.*,!org.mortbay.jetty.handler.management.*,!org.mortbay.jetty.management.*,!org.mortbay.jetty.servlet.management.*,!org.mortbay.jetty.webapp.management.*,* org.apache.maven.plugins maven-jar-plugin ${project.build.outputDirectory}/META-INF/MANIFEST.MF junit junit test org.mortbay.jetty jetty ${project.version} 3.0.1 jetty-6.1.26/modules/annotations/0000755000175000017500000000000011745736474015476 5ustar moonmoonjetty-6.1.26/modules/annotations/src/0000755000175000017500000000000011745736474016265 5ustar moonmoonjetty-6.1.26/modules/annotations/src/test/0000755000175000017500000000000011745736474017244 5ustar moonmoonjetty-6.1.26/modules/annotations/src/test/java/0000755000175000017500000000000011745736474020165 5ustar moonmoonjetty-6.1.26/modules/annotations/src/test/java/org/0000755000175000017500000000000011745736474020754 5ustar moonmoonjetty-6.1.26/modules/annotations/src/test/java/org/mortbay/0000755000175000017500000000000011745736474022431 5ustar moonmoonjetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736474023570 5ustar moonmoonjetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/0000755000175000017500000000000011745736474026125 5ustar moonmoonjetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/Sample.java0000644000175000017500000000222610554134152030171 0ustar moonmoon//======================================================================== //$Id: Sample.java 1540 2007-01-19 12:24:10Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.annotations; import java.lang.annotation.*; import java.lang.annotation.ElementType.*; import java.lang.annotation.RetentionPolicy.*; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) public @interface Sample { int value(); } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootjetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/TestAnnotationInheritance.javajetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/TestAnnotationInheritan0000644000175000017500000001526411065421731032652 0ustar moonmoon//======================================================================== //$Id: TestAnnotationInheritance.java 3680 2008-09-21 10:37:13Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.annotations; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Iterator; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import org.mortbay.jetty.Server; import org.mortbay.jetty.annotations.resources.ResourceA; import org.mortbay.jetty.annotations.resources.ResourceB; import org.mortbay.jetty.plus.annotation.InjectionCollection; import org.mortbay.jetty.plus.annotation.LifeCycleCallbackCollection; import org.mortbay.jetty.plus.annotation.RunAsCollection; import org.mortbay.jetty.plus.naming.NamingEntry; import org.mortbay.jetty.webapp.WebAppContext; import junit.framework.TestCase; /** * TestAnnotationInheritance * * */ public class TestAnnotationInheritance extends TestCase { public void testInheritance () throws Exception { AnnotationParser processor = new AnnotationParser(); AnnotationCollection collection = processor.processClass(ClassB.class); List classes = collection.getClasses(); assertEquals(2, classes.size()); //check methods List methods = collection.getMethods(); assertTrue(methods!=null); assertFalse(methods.isEmpty()); assertEquals(methods.size(), 4); Method m = ClassB.class.getDeclaredMethod("a", new Class[] {}); assertTrue(methods.indexOf(m) >= 0); Sample s = (Sample)m.getAnnotation(Sample.class); assertEquals(51, s.value()); m = ClassA.class.getDeclaredMethod("a", new Class[] {}); assertTrue(methods.indexOf(m) < 0); //check overridden public scope superclass method not in there m = ClassA.class.getDeclaredMethod("b", new Class[] {}); assertTrue(methods.indexOf(m) >= 0); m = ClassB.class.getDeclaredMethod("c", new Class[] {}); assertTrue(methods.indexOf(m) >= 0); m = ClassA.class.getDeclaredMethod("c", new Class[] {}); assertTrue(methods.indexOf(m) < 0); //check overridden superclass package scope method not in there m = ClassA.class.getDeclaredMethod("d", new Class[] {}); assertTrue(methods.indexOf(m) >= 0); //check fields List fields = collection.getFields(); assertFalse(fields.isEmpty()); assertEquals(1, fields.size()); Field f = ClassA.class.getDeclaredField("m"); assertTrue(fields.indexOf(f) >= 0); } public void testResourceAnnotations () throws Exception { Server server = new Server(); WebAppContext wac = new WebAppContext(); wac.setServer(server); InitialContext ic = new InitialContext(); Context comp = (Context)ic.lookup("java:comp"); Context env = comp.createSubcontext("env"); org.mortbay.jetty.plus.naming.EnvEntry resourceA = new org.mortbay.jetty.plus.naming.EnvEntry(server, "resA", new Integer(1000), false); org.mortbay.jetty.plus.naming.EnvEntry resourceB = new org.mortbay.jetty.plus.naming.EnvEntry(server, "resB", new Integer(2000), false); AnnotationParser processor = new AnnotationParser(); processor.processClass(ResourceA.class); InjectionCollection injections = new InjectionCollection(); LifeCycleCallbackCollection callbacks = new LifeCycleCallbackCollection(); RunAsCollection runAses = new RunAsCollection(); AnnotationCollection collection = processor.processClass(ResourceB.class); assertEquals(1, collection.getClasses().size()); assertEquals(3, collection.getMethods().size()); assertEquals(6, collection.getFields().size()); //process with all the specific annotations turned into injections, callbacks etc processor.parseAnnotations(wac, ResourceB.class, runAses, injections, callbacks); //processing classA should give us these jndi name bindings: // java:comp/env/myf // java:comp/env/org.mortbay.jetty.annotations.resources.ResourceA/g // java:comp/env/mye // java:comp/env/org.mortbay.jetty.annotations.resources.ResourceA/h // java:comp/env/resA // java:comp/env/org.mortbay.jetty.annotations.resources.ResourceB/f // java:comp/env/org.mortbay.jetty.annotations.resources.ResourceA/n // assertEquals(resourceB.getObjectToBind(), env.lookup("myf")); assertEquals(resourceA.getObjectToBind(), env.lookup("mye")); assertEquals(resourceA.getObjectToBind(), env.lookup("resA")); assertEquals(resourceA.getObjectToBind(), env.lookup("org.mortbay.jetty.annotations.resources.ResourceA/g")); assertEquals(resourceA.getObjectToBind(), env.lookup("org.mortbay.jetty.annotations.resources.ResourceA/h")); assertEquals(resourceB.getObjectToBind(), env.lookup("org.mortbay.jetty.annotations.resources.ResourceB/f")); assertEquals(resourceB.getObjectToBind(), env.lookup("org.mortbay.jetty.annotations.resources.ResourceA/n")); //we should have these Injections assertNotNull(injections); List fieldInjections = injections.getFieldInjections(ResourceB.class); assertNotNull(fieldInjections); Iterator itor = fieldInjections.iterator(); System.err.println("Field injections:"); while (itor.hasNext()) { System.err.println(itor.next()); } assertEquals(5, fieldInjections.size()); List methodInjections = injections.getMethodInjections(ResourceB.class); itor = methodInjections.iterator(); System.err.println("Method injections:"); while (itor.hasNext()) System.err.println(itor.next()); assertNotNull(methodInjections); assertEquals(3, methodInjections.size()); } } jetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/ClassA.java0000644000175000017500000000367510554134152030127 0ustar moonmoon//======================================================================== //$Id: ClassA.java 1540 2007-01-19 12:24:10Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.annotations; /** * ClassA * * */ @Sample(1) public class ClassA { private Integer e; private Integer f; private Integer g; private Integer h; private Integer j; private Integer k; @Sample(7) private Integer m; @Sample(2) public void a () { System.err.println("ClassA.public"); } @Sample(3) protected void b() { System.err.println("ClassA.protected"); } @Sample(4) void c() { System.err.println("ClassA.package"); } @Sample(5) private void d() { System.err.println("ClassA.private"); } @Sample(6) protected void l() { System.err.println("ClassA.protected method l"); } public Integer getE() { return this.e; } public Integer getF() { return this.f; } public Integer getG() { return this.g; } public Integer getJ() { return this.j; } public void x() { System.err.println("ClassA.x"); } } jetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/ClassB.java0000644000175000017500000000266410554134152030125 0ustar moonmoon//======================================================================== //$Id: ClassB.java 1540 2007-01-19 12:24:10Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.annotations; /** * ClassB * * */ @Sample(50) public class ClassB extends ClassA { //test override of public scope method @Sample(51) public void a() { System.err.println("ClassB.public"); } //test override of package scope method @Sample(52) void c() { System.err.println("ClassB.package"); } public void l() { System.err.println("Overridden method l has no annotation"); } //test no annotation public void z() { System.err.println("ClassB.z"); } } jetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/resources/0000755000175000017500000000000011745736474030137 5ustar moonmoon././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootjetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/resources/ResourceA.javajetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/resources/ResourceA.jav0000644000175000017500000000452610554134152032516 0ustar moonmoon//======================================================================== //$Id: ResourceA.java 1540 2007-01-19 12:24:10Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.annotations.resources; import javax.annotation.Resource; /** * ResourceA * * */ public class ResourceA { private Integer e; private Integer h; private Integer k; @Resource(name="myf", mappedName="resB") //test giving both a name and mapped name from the environment private Integer f;//test a non inherited field that needs injection @Resource(mappedName="resA") //test the default naming scheme but using a mapped name from the environment private Integer g; @Resource(name="resA") //test using the given name as the name from the environment private Integer j; @Resource(mappedName="resB") //test using the default name on an inherited field protected Integer n; //TODO - if it's inherited, is it supposed to use the classname of the class it is inherited by? @Resource(name="mye", mappedName="resA", type=Integer.class) public void setE(Integer e) { this.e=e; } public Integer getE() { return this.e; } public Integer getF() { return this.f; } public Integer getG() { return this.g; } public Integer getJ() { return this.j; } @Resource(mappedName="resA") public void setH(Integer h) { this.h=h; } @Resource(name="resA") public void setK(Integer k) { this.k=k; } public void x() { System.err.println("ResourceA.x"); } }././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootjetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/resources/ResourceB.javajetty-6.1.26/modules/annotations/src/test/java/org/mortbay/jetty/annotations/resources/ResourceB.jav0000644000175000017500000000266710554134152032523 0ustar moonmoon//======================================================================== //$Id: ResourceB.java 1540 2007-01-19 12:24:10Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.annotations.resources; import javax.annotation.Resource; import javax.annotation.Resources; /** * ResourceB * * */ @Resources({ @Resource(name="fluff", mappedName="resA"), @Resource(name="stuff", mappedName="resB") }) public class ResourceB extends ResourceA { @Resource(mappedName="resB") private Integer f;//test no inheritance of private fields @Resource private Integer p = new Integer(8); //test no injection because no value //test no annotation public void z() { System.err.println("ResourceB.z"); } } jetty-6.1.26/modules/annotations/src/main/0000755000175000017500000000000011745736474017211 5ustar moonmoonjetty-6.1.26/modules/annotations/src/main/java/0000755000175000017500000000000011745736474020132 5ustar moonmoonjetty-6.1.26/modules/annotations/src/main/java/org/0000755000175000017500000000000011745736474020721 5ustar moonmoonjetty-6.1.26/modules/annotations/src/main/java/org/mortbay/0000755000175000017500000000000011745736474022376 5ustar moonmoonjetty-6.1.26/modules/annotations/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736474023535 5ustar moonmoonjetty-6.1.26/modules/annotations/src/main/java/org/mortbay/jetty/annotations/0000755000175000017500000000000011745736474026072 5ustar moonmoon././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootjetty-6.1.26/modules/annotations/src/main/java/org/mortbay/jetty/annotations/AnnotationCollection.javajetty-6.1.26/modules/annotations/src/main/java/org/mortbay/jetty/annotations/AnnotationCollection.ja0000644000175000017500000006313711065421731032524 0ustar moonmoon//======================================================================== //$Id: AnnotationCollection.java 3680 2008-09-21 10:37:13Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.annotations; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resources; import javax.annotation.security.RunAs; import javax.naming.InitialContext; import javax.naming.NameNotFoundException; import javax.naming.NamingException; import javax.servlet.Servlet; import javax.transaction.UserTransaction; import org.mortbay.jetty.plus.annotation.Injection; import org.mortbay.jetty.plus.annotation.InjectionCollection; import org.mortbay.jetty.plus.annotation.LifeCycleCallbackCollection; import org.mortbay.jetty.plus.annotation.PostConstructCallback; import org.mortbay.jetty.plus.annotation.PreDestroyCallback; import org.mortbay.jetty.plus.annotation.RunAsCollection; import org.mortbay.jetty.plus.naming.EnvEntry; import org.mortbay.jetty.plus.naming.Transaction; import org.mortbay.jetty.servlet.Holder; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.log.Log; import org.mortbay.util.IntrospectionUtil; import org.mortbay.util.Loader; /** * AnnotationCollection * * An AnnotationCollection represents all of the annotated classes, methods and fields in the * inheritance hierarchy for a class. NOTE that methods and fields in this collection are NOT * just the ones that are inherited by the class, but represent ALL annotations that must be * processed for a single instance of a given class. * * The class to which this collection pertains is obtained by calling * getTargetClass(). * * Using the list of annotated classes, methods and fields, the collection will generate * the appropriate JNDI entries and the appropriate Injection and LifeCycleCallback objects * to be later applied to instances of the getTargetClass(). */ public class AnnotationCollection { private WebAppContext _webApp; //the webapp private Class _targetClass; //the most derived class to which this collection pertains private List _methods = new ArrayList(); //list of methods relating to the _targetClass which have annotations private List _fields = new ArrayList(); //list of fields relating to the _targetClass which have annotations private List _classes = new ArrayList();//list of classes in the inheritance hierarchy that have annotations private static Class[] __envEntryTypes = new Class[] {String.class, Character.class, Integer.class, Boolean.class, Double.class, Byte.class, Short.class, Long.class, Float.class}; public void setWebAppContext(WebAppContext webApp) { _webApp=webApp; } public WebAppContext getWebAppContext() { return _webApp; } /** * Get the class which is the subject of these annotations * @return the clazz */ public Class getTargetClass() { return _targetClass; } /** * Set the class to which this collection pertains * @param clazz the clazz to set */ public void setTargetClass(Class clazz) { _targetClass=clazz; } public void addClass (Class clazz) { if (clazz.getDeclaredAnnotations().length==0) return; _classes.add(clazz); } public void addMethod (Method method) { if (method.getDeclaredAnnotations().length==0) return; _methods.add(method); } public void addField(Field field) { if (field.getDeclaredAnnotations().length==0) return; _fields.add(field); } public List getClasses() { return _classes; } public List getMethods () { return _methods; } public List getFields() { return _fields; } public void processRunAsAnnotations (RunAsCollection runAsCollection) { for (int i=0; i<_classes.size();i++) { Class clazz = (Class)_classes.get(i); //if this implements javax.servlet.Servlet check for run-as if (Servlet.class.isAssignableFrom(clazz)) { RunAs runAs = (RunAs)clazz.getAnnotation(RunAs.class); if (runAs != null) { String role = runAs.value(); if (role != null) { org.mortbay.jetty.plus.annotation.RunAs ra = new org.mortbay.jetty.plus.annotation.RunAs(); ra.setTargetClass(clazz); ra.setRoleName(role); runAsCollection.add(ra); } } } } } /** * Process @Resource annotations at the class, method and field level. * @return */ public InjectionCollection processResourceAnnotations(InjectionCollection injections) { processClassResourceAnnotations(); processMethodResourceAnnotations(injections); processFieldResourceAnnotations(injections); return injections; } /** * Process @PostConstruct and @PreDestroy annotations. * @return */ public LifeCycleCallbackCollection processLifeCycleCallbackAnnotations(LifeCycleCallbackCollection callbacks) { processPostConstructAnnotations(callbacks); processPreDestroyAnnotations(callbacks); return callbacks; } /** * Process @Resources annotation on classes */ public void processResourcesAnnotations () { for (int i=0; i<_classes.size();i++) { Class clazz = (Class)_classes.get(i); Resources resources = (Resources)clazz.getAnnotation(Resources.class); if (resources != null) { Resource[] resArray = resources.value(); if (resArray==null||resArray.length==0) continue; for (int j=0;j

".getBytes()); if ("/ex0".equals(pi)) throw new ServletException("test ex0", new Throwable()); else if ("/ex1".equals(pi)) throw new IOException("test ex1"); else if ("/ex2".equals(pi)) throw new UnavailableException("test ex2"); else if (pi.startsWith("/ex3/")) throw new UnavailableException("test ex3",Integer.parseInt(pi.substring(5))); throw new RuntimeException("test"); } if ("true".equals(request.getParameter("close"))) response.setHeader("Connection","close"); String buffered= request.getParameter("buffered"); PrintWriter pout=null; try { pout =response.getWriter(); } catch(IllegalStateException e) { pout=new PrintWriter(new OutputStreamWriter(response.getOutputStream(),charset)); } if (buffered!=null) pout = new PrintWriter(new BufferedWriter(pout,Integer.parseInt(buffered))); try { pout.write("\n\n"); pout.write("

Dump Servlet

\n"); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); Enumeration locales= request.getLocales(); while (locales.hasMoreElements()) { pout.write("\n"); pout.write(""); pout.write(""); } pout.write("\n"); pout.write(""); Enumeration h= request.getHeaderNames(); String name; while (h.hasMoreElements()) { name= (String)h.nextElement(); Enumeration h2= request.getHeaders(name); while (h2.hasMoreElements()) { String hv= (String)h2.nextElement(); pout.write("\n"); pout.write(""); pout.write(""); } } pout.write("\n"); pout.write(""); h= request.getParameterNames(); while (h.hasMoreElements()) { name= (String)h.nextElement(); pout.write("\n"); pout.write(""); pout.write(""); String[] values= request.getParameterValues(name); if (values == null) { pout.write("\n"); pout.write(""); pout.write(""); } else if (values.length > 1) { for (int i= 0; i < values.length; i++) { pout.write("\n"); pout.write(""); pout.write(""); } } } pout.write("\n"); pout.write(""); Cookie[] cookies = request.getCookies(); for (int i=0; cookies!=null && i\n"); pout.write(""); pout.write(""); } String content_type=request.getContentType(); if (content_type!=null && !content_type.startsWith("application/x-www-form-urlencoded") && !content_type.startsWith("multipart/form-data")) { pout.write("\n"); pout.write(""); pout.write("\n"); pout.write(""); } pout.write("\n"); pout.write(""); Enumeration a= request.getAttributeNames(); while (a.hasMoreElements()) { name= (String)a.nextElement(); pout.write("\n"); pout.write(""); pout.write(""); } pout.write("\n"); pout.write(""); a= getInitParameterNames(); while (a.hasMoreElements()) { name= (String)a.nextElement(); pout.write("\n"); pout.write(""); pout.write(""); } pout.write("\n"); pout.write(""); a= getServletContext().getInitParameterNames(); while (a.hasMoreElements()) { name= (String)a.nextElement(); pout.write("\n"); pout.write(""); pout.write(""); } pout.write("\n"); pout.write(""); a= getServletContext().getAttributeNames(); while (a.hasMoreElements()) { name= (String)a.nextElement(); pout.write("\n"); pout.write(""); pout.write(""); } String res= request.getParameter("resource"); if (res != null && res.length() > 0) { pout.write("\n"); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); pout.write(""); pout.write("\n"); pout.write(""); try{pout.write("");} catch(Exception e) {pout.write("");} } pout.write("
getMethod: " + notag(request.getMethod())+"
getContentLength: "+Integer.toString(request.getContentLength())+"
getContentType: "+notag(request.getContentType())+"
getRequestURI: "+notag(request.getRequestURI())+"
getRequestURL: "+notag(request.getRequestURL().toString())+"
getContextPath: "+request.getContextPath()+"
getServletPath: "+notag(request.getServletPath())+"
getPathInfo: "+notag(request.getPathInfo())+"
getPathTranslated: "+notag(request.getPathTranslated())+"
getQueryString: "+notag(request.getQueryString())+"
getProtocol: "+request.getProtocol()+"
getScheme: "+request.getScheme()+"
getServerName: "+notag(request.getServerName())+"
getServerPort: "+Integer.toString(request.getServerPort())+"
getLocalName: "+request.getLocalName()+"
getLocalAddr: "+request.getLocalAddr()+"
getLocalPort: "+Integer.toString(request.getLocalPort())+"
getRemoteUser: "+request.getRemoteUser()+"
getRemoteAddr: "+request.getRemoteAddr()+"
getRemoteHost: "+request.getRemoteHost()+"
getRemotePort: "+request.getRemotePort()+"
getRequestedSessionId: "+request.getRequestedSessionId()+"
isSecure(): "+request.isSecure()+"
isUserInRole(admin): "+request.isUserInRole("admin")+"
getLocale: "+request.getLocale()+"
getLocales: "+locales.nextElement()+"

Other HTTP Headers:
"+notag(name)+": "+notag(hv)+"

Request Parameters:
"+notag(name)+": "+notag(request.getParameter(name))+"
"+notag(name)+" Values: "+"NULL!"+"
"+notag(name)+"["+i+"]: "+notag(values[i])+"

Cookies:
"+notag(cookie.getName())+": "+notag(cookie.getValue())+"

Content:
");
                char[] content= new char[4096];
                int len;
                try{
                    Reader in=request.getReader();
                    
                    while((len=in.read(content))>=0)
                        pout.write(notag(new String(content,0,len)));
                }
                catch(IOException e)
                {
                    pout.write(e.toString());
                }
                
                pout.write("

Request Attributes:
"+name+": "+"
" + toString(request.getAttribute(name)) + "
"+"

Servlet InitParameters:
"+name+": "+ toString(getInitParameter(name)) +"

Context InitParameters:
"+name+": "+ toString(getServletContext().getInitParameter(name)) + "

Context Attributes:
"+name+": "+"
" + toString(getServletContext().getAttribute(name)) + "
"+"

Get Resource: \""+res+"\"
this.getClass().getResource(...): "+this.getClass().getResource(res)+"
this.getClass().getClassLoader().getResource(...): "+this.getClass().getClassLoader().getResource(res)+"
Thread.currentThread().getContextClassLoader().getResource(...): "+Thread.currentThread().getContextClassLoader().getResource(res)+"
getServletContext().getResource(...): "+getServletContext().getResource(res)+""+"" +e+"
\n"); /* ------------------------------------------------------------ */ pout.write("

Request Wrappers

\n"); ServletRequest rw=request; int w=0; while (rw !=null) { pout.write((w++)+": "+rw.getClass().getName()+"
"); if (rw instanceof HttpServletRequestWrapper) rw=((HttpServletRequestWrapper)rw).getRequest(); else if (rw instanceof ServletRequestWrapper) rw=((ServletRequestWrapper)rw).getRequest(); else rw=null; } pout.write("
"); pout.write("

International Characters (UTF-8)

"); pout.write("LATIN LETTER SMALL CAPITAL AE
\n"); pout.write("Directly uni encoded(\\u1d01): \u1d01
"); pout.write("HTML reference (&AElig;): Æ
"); pout.write("Decimal (&#7425;): ᴁ
"); pout.write("Javascript unicode (\\u1d01) :
"); pout.write("
"); pout.write("

Form to generate GET content

"); pout.write(""); pout.write("TextField:
\n"); pout.write(""); pout.write(""); pout.write("
"); pout.write("

Form to generate POST content

"); pout.write("
"); pout.write("TextField:
\n"); pout.write("Select:
"); pout.write("
"); pout.write("
"); pout.write("
"); pout.write("

Form to generate UPLOAD content

"); pout.write("
"); pout.write("TextField:
\n"); pout.write("File 1:
\n"); pout.write("File 2:
\n"); pout.write("
"); pout.write("
"); pout.write("

Form to set Cookie

"); pout.write("
"); pout.write("cookie:
\n"); pout.write("value:
\n"); pout.write(""); pout.write("
\n"); pout.write("

Form to get Resource

"); pout.write("
"); pout.write("resource:
\n"); pout.write(""); pout.write("
\n"); } catch (Exception e) { getServletContext().log("dump", e); } if (request.getParameter("stream")!=null) { pout.flush(); Continuation continuation = ContinuationSupport.getContinuation(request, null); continuation.suspend(Long.parseLong(request.getParameter("stream"))); } String lines= request.getParameter("lines"); if (lines!=null) { char[] line = "A line of characters. Blah blah blah blah. blooble blooble
\n".toCharArray(); for (int l=Integer.parseInt(lines);l-->0;) { pout.write(""+l+" "); pout.write(line); } } pout.write("\n\n"); pout.close(); if (pi != null) { if ("/ex4".equals(pi)) throw new ServletException("test ex4", new Throwable()); if ("/ex5".equals(pi)) throw new IOException("test ex5"); if ("/ex6".equals(pi)) throw new UnavailableException("test ex6"); } } /* ------------------------------------------------------------ */ public String getServletInfo() { return "Dump Servlet"; } /* ------------------------------------------------------------ */ public synchronized void destroy() { } /* ------------------------------------------------------------ */ private String getURI(HttpServletRequest request) { String uri= (String)request.getAttribute("javax.servlet.forward.request_uri"); if (uri == null) uri= request.getRequestURI(); return uri; } /* ------------------------------------------------------------ */ private static String toString(Object o) { if (o == null) return null; try { if (o.getClass().isArray()) { StringBuffer sb = new StringBuffer(); if (!o.getClass().getComponentType().isPrimitive()) { Object[] array= (Object[])o; for (int i= 0; i < array.length; i++) { if (i > 0) sb.append("\n"); sb.append(array.getClass().getComponentType().getName()); sb.append("["); sb.append(i); sb.append("]="); sb.append(toString(array[i])); } return sb.toString(); } else { int length = Array.getLength(o); for (int i=0;i 0) sb.append("\n"); sb.append(o.getClass().getComponentType().getName()); sb.append("["); sb.append(i); sb.append("]="); sb.append(toString(Array.get(o, i))); } return sb.toString(); } } else return o.toString(); } catch (Exception e) { return e.toString(); } } private String notag(String s) { if (s==null) return "null"; s=StringUtil.replace(s,"&","&"); s=StringUtil.replace(s,"<","<"); s=StringUtil.replace(s,">",">"); return s; } } jetty-6.1.26/examples/test-webapp/src/main/java/com/acme/TestFilter.java0000644000175000017500000001111711421722110024557 0ustar moonmoon//======================================================================== //$Id: TestFilter.java,v 1.5 2005/11/01 11:42:53 gregwilkins Exp $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package com.acme; import java.io.IOException; import java.util.HashSet; import java.util.Set; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletRequestWrapper; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.mortbay.log.Log; /* ------------------------------------------------------------ */ /** TestFilter. * * This filter checks for a none local request, and if the init parameter * "remote" is not set to true, then all non local requests are forwarded * to /remote.html * */ public class TestFilter implements Filter { private boolean _remote; private ServletContext _context; private final Set _allowed = new HashSet(); /* ------------------------------------------------------------ */ /* * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ public void init(FilterConfig filterConfig) throws ServletException { _context= filterConfig.getServletContext(); _remote=Boolean.parseBoolean(filterConfig.getInitParameter("remote")); _allowed.add("/favicon.ico"); _allowed.add("/jetty_banner.gif"); Log.debug("TestFilter#remote="+_remote); } /* ------------------------------------------------------------ */ /* * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String from = request.getRemoteHost(); String to = request.getServerName(); String path=((HttpServletRequest)request).getServletPath(); if (!_remote && !_allowed.contains(path) && ( !from.equals("localhost") && !from.startsWith("127.") && from.indexOf(":1")<0 || !to.equals("localhost")&&!to.startsWith("127.0.0.") && to.indexOf(":1")<0)) { System.err.println("REMOTE "+from+" "+to+" "+path); if ("/".equals(path)) _context.getRequestDispatcher("/remote.html").forward(request,response); else ((HttpServletResponse)response).sendRedirect("/remote.html"); return; } Integer old_value=null; ServletRequest r = request; while (r instanceof ServletRequestWrapper) r=((ServletRequestWrapper)r).getRequest(); try { old_value=(Integer)request.getAttribute("testFilter"); Integer value=(old_value==null)?new Integer(1):new Integer(old_value.intValue()+1); request.setAttribute("testFilter", value); String qString = ((HttpServletRequest)request).getQueryString(); if (qString != null && qString.indexOf("wrap")>=0) { request=new HttpServletRequestWrapper((HttpServletRequest)request); } _context.setAttribute("request"+r.hashCode(),value); chain.doFilter(request, response); } finally { request.setAttribute("testFilter", old_value); _context.setAttribute("request"+r.hashCode(),old_value); } } /* ------------------------------------------------------------ */ /* * @see javax.servlet.Filter#destroy() */ public void destroy() { } } jetty-6.1.26/examples/test-webapp/src/main/java/com/acme/TestListener.java0000644000175000017500000001037411146310030025121 0ustar moonmoon//======================================================================== //$Id: TestListener.java,v 1.1 2005/10/26 10:12:55 gregwilkins Exp $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package com.acme; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletRequest; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class TestListener implements HttpSessionListener, HttpSessionAttributeListener, HttpSessionActivationListener, ServletContextListener, ServletContextAttributeListener, ServletRequestListener, ServletRequestAttributeListener { public void attributeAdded(HttpSessionBindingEvent se) { // System.err.println("attributedAdded "+se); } public void attributeRemoved(HttpSessionBindingEvent se) { // System.err.println("attributeRemoved "+se); } public void attributeReplaced(HttpSessionBindingEvent se) { // System.err.println("attributeReplaced "+se); } public void sessionWillPassivate(HttpSessionEvent se) { // System.err.println("sessionWillPassivate "+se); } public void sessionDidActivate(HttpSessionEvent se) { // System.err.println("sessionDidActivate "+se); } public void contextInitialized(ServletContextEvent sce) { // System.err.println("contextInitialized "+sce); } public void contextDestroyed(ServletContextEvent sce) { // System.err.println("contextDestroyed "+sce); } public void attributeAdded(ServletContextAttributeEvent scab) { // System.err.println("attributeAdded "+scab); } public void attributeRemoved(ServletContextAttributeEvent scab) { // System.err.println("attributeRemoved "+scab); } public void attributeReplaced(ServletContextAttributeEvent scab) { // System.err.println("attributeReplaced "+scab); } public void requestDestroyed(ServletRequestEvent sre) { ((HttpServletRequest)sre.getServletRequest()).getSession(false); sre.getServletRequest().setAttribute("requestInitialized",null); // System.err.println("requestDestroyed "+sre); } public void requestInitialized(ServletRequestEvent sre) { sre.getServletRequest().setAttribute("requestInitialized","'"+sre.getServletContext().getContextPath()+"'"); // System.err.println("requestInitialized "+sre); } public void attributeAdded(ServletRequestAttributeEvent srae) { // System.err.println("attributeAdded "+srae); } public void attributeRemoved(ServletRequestAttributeEvent srae) { // System.err.println("attributeRemoved "+srae); } public void attributeReplaced(ServletRequestAttributeEvent srae) { // System.err.println("attributeReplaced "+srae); } public void sessionCreated(HttpSessionEvent se) { // System.err.println("sessionCreated "+se); } public void sessionDestroyed(HttpSessionEvent se) { // System.err.println("sessionDestroyed "+se); } } jetty-6.1.26/examples/test-webapp/src/main/java/com/acme/DateTag.java0000644000175000017500000000424711044235703024021 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package com.acme; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; import javax.servlet.jsp.tagext.Tag; public class DateTag extends BodyTagSupport { Tag parent; BodyContent body; String tz="GMT"; public void setParent(Tag parent) {this.parent=parent;} public Tag getParent() {return parent;} public void setBodyContent(BodyContent content) {body=content;} public void setPageContext(PageContext pageContext) {} public void setTz(String value) {tz=value;} public int doStartTag() throws JspException {return EVAL_BODY_TAG;} public int doEndTag() throws JspException {return EVAL_PAGE;} public void doInitBody() throws JspException {} public int doAfterBody() throws JspException { try { SimpleDateFormat format = new SimpleDateFormat(body.getString()); format.setTimeZone(TimeZone.getTimeZone(tz)); body.getEnclosingWriter().write(format.format(new Date())); return SKIP_BODY; } catch (Exception ex) { ex.printStackTrace(); throw new JspTagException(ex.toString()); } } public void release() { body=null; } } jetty-6.1.26/examples/test-webapp/src/main/java/com/acme/SessionDump.java0000644000175000017500000001512010604160010024736 0ustar moonmoon// ======================================================================== // Copyright 1996-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package com.acme; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /* ------------------------------------------------------------ */ /** Test Servlet Sessions. * * @author Greg Wilkins (gregw) */ public class SessionDump extends HttpServlet { int redirectCount=0; /* ------------------------------------------------------------ */ String pageType; /* ------------------------------------------------------------ */ public void init(ServletConfig config) throws ServletException { super.init(config); } /* ------------------------------------------------------------ */ protected void handleForm(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(false); String action = request.getParameter("Action"); String name = request.getParameter("Name"); String value = request.getParameter("Value"); if (action!=null) { if(action.equals("New Session")) { session = request.getSession(true); session.setAttribute("test","value"); } else if (session!=null) { if (action.equals("Invalidate")) session.invalidate(); else if (action.equals("Set") && name!=null && name.length()>0) session.setAttribute(name,value); else if (action.equals("Remove")) session.removeAttribute(name); } } } /* ------------------------------------------------------------ */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { handleForm(request,response); String nextUrl = getURI(request)+"?R="+redirectCount++; String encodedUrl=response.encodeRedirectURL(nextUrl); response.sendRedirect(encodedUrl); } /* ------------------------------------------------------------ */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { handleForm(request,response); response.setContentType("text/html"); HttpSession session = request.getSession(getURI(request).indexOf("new")>0); try { if (session!=null) session.isNew(); } catch(IllegalStateException e) { session=null; } PrintWriter out = response.getWriter(); out.println("

Session Dump Servlet:

"); out.println("
"); if (session==null) { out.println("

No Session

"); out.println(""); } else { try { out.println("ID: "+session.getId()+"
"); out.println("New: "+session.isNew()+"
"); out.println("Created: "+new Date(session.getCreationTime())+"
"); out.println("Last: "+new Date(session.getLastAccessedTime())+"
"); out.println("Max Inactive: "+session.getMaxInactiveInterval()+"
"); out.println("Context: "+session.getServletContext()+"
"); Enumeration keys=session.getAttributeNames(); while(keys.hasMoreElements()) { String name=(String)keys.nextElement(); String value=""+session.getAttribute(name); out.println(""+name+": "+value+"
"); } out.println("Name:
"); out.println("Value:
"); out.println(""); out.println(""); out.println("
"); out.println("

"); if (request.isRequestedSessionIdFromCookie()) out.println("

Turn off cookies in your browser to try url encoding
"); if (request.isRequestedSessionIdFromURL()) out.println("

Turn on cookies in your browser to try cookie encoding
"); out.println("Encoded Link
"); } catch (IllegalStateException e) { e.printStackTrace(); } } } /* ------------------------------------------------------------ */ public String getServletInfo() { return "Session Dump Servlet"; } /* ------------------------------------------------------------ */ private String getURI(HttpServletRequest request) { String uri=(String)request.getAttribute("javax.servlet.forward.request_uri"); if (uri==null) uri=request.getRequestURI(); return uri; } } jetty-6.1.26/examples/test-webapp/src/main/java/com/acme/Date2Tag.java0000644000175000017500000000347511044235703024105 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package com.acme; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.StringTokenizer; import javax.servlet.jsp.JspContext; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; public class Date2Tag extends SimpleTagSupport { String format; public void setFormat(String value) { this.format = value; } public void doTag() throws JspException, IOException { String formatted = new SimpleDateFormat("long".equals(format)?"EEE 'the' d:MMM:yyyy":"d:MM:yy") .format(new Date()); StringTokenizer tok = new StringTokenizer(formatted,":"); JspContext context = getJspContext(); context.setAttribute("day", tok.nextToken() ); context.setAttribute("month", tok.nextToken() ); context.setAttribute("year", tok.nextToken() ); JspFragment fragment = getJspBody(); fragment.invoke(null); } } jetty-6.1.26/examples/test-webapp/src/main/java/com/acme/HelloWorld.java0000644000175000017500000000452510577364504024576 0ustar moonmoon// ======================================================================== // Copyright 1996-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package com.acme; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.SingleThreadModel; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* ------------------------------------------------------------ */ /** Dump Servlet Request. * */ public class HelloWorld extends HttpServlet implements SingleThreadModel { /* ------------------------------------------------------------ */ public void init(ServletConfig config) throws ServletException { super.init(config); } /* ------------------------------------------------------------ */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /* ------------------------------------------------------------ */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); ServletOutputStream out = response.getOutputStream(); out.println(""); out.println("

Hello World

"); out.println(""); out.flush(); try { Thread.sleep(200); } catch (InterruptedException e) { getServletContext().log("exception",e); } } } jetty-6.1.26/examples/test-webapp/src/main/java/com/acme/CometServlet.java0000644000175000017500000000634111044235703025121 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package com.acme; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.util.ajax.Continuation; import org.mortbay.util.ajax.ContinuationSupport; /** CometServlet * This servlet implements the Comet API from tc6.x with the exception of the read method. * * @author gregw * */ public class CometServlet extends HttpServlet { public void begin(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { request.setAttribute("org.apache.tomcat.comet",Boolean.TRUE); } public void end(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { synchronized(request) { request.removeAttribute("org.apache.tomcat.comet"); Continuation continuation=ContinuationSupport.getContinuation(request,request); if (continuation.isPending()) continuation.resume(); } } public void error(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { end(request,response); } public boolean read(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { throw new UnsupportedOperationException(); } protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { synchronized(request) { // TODO: wrap response so we can reset timeout on writes. Continuation continuation=ContinuationSupport.getContinuation(request,request); if (!continuation.isPending()) begin(request,response); Integer timeout=(Integer)request.getAttribute("org.apache.tomcat.comet.timeout"); boolean resumed=continuation.suspend(timeout==null?60000:timeout.intValue()); if (!resumed) error(request,response); } } public void setTimeout(HttpServletRequest request, HttpServletResponse response, int timeout) throws IOException, ServletException, UnsupportedOperationException { request.setAttribute("org.apache.tomcat.comet.timeout",new Integer(timeout)); } } jetty-6.1.26/examples/test-webapp/src/main/configuration/0000755000175000017500000000000011745736500022112 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/configuration/test.d/0000755000175000017500000000000011745736500023313 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/configuration/test.d/override-web.xml0000644000175000017500000000241510642577377026443 0ustar moonmoon context-override-example a context value Dump servlet-override-example a servlet value Dump *.more Session com.acme.SessionDump 5 jetty-6.1.26/examples/test-webapp/src/main/configuration/test.xml0000644000175000017500000000600311041771225023602 0ustar moonmoon / /webapps/test false false /etc/webdefault.xml /contexts/test.d/override-web.xml Test Realm /etc/realm.properties true jetty-6.1.26/examples/test-webapp/src/main/webapp/0000755000175000017500000000000011745736500020521 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/webapp/chat/0000755000175000017500000000000011745736500021440 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/webapp/chat/chat.html0000644000175000017500000001027110670715535023247 0ustar moonmoon Jetty chat

Jetty AJAX Chat

Three really important things about this chat room demo:
  • It has really HORRID Styling. Please feel free to donate a pretty css :-)
  • It is written using js techniques provided by Behaviour and
  • It uses Jetty6 Continuations. No threads are used when waiting for async events (see below).
Username: 

How this works

This chat room is put together with html, javascript and a filter as follows:
  • The chat.html file provides the basic layout for the page, including this text and a bunch of div elements that define the layout of the chat room. This html will render well without any javascript etc.

  • The chat.html file includes the default.js file, which simply includes javascript library of Behaviour.

  • The chat.html file includes the chat.js script which is the client side smarts of the chat room:

    • Using Behaviour, the DOM model of chat.html is enhanced with onclick and onkeypress functions to trigger the dynamic interations.

    • Using XHR, a long polling loop is started for events.

    • Using XHR, any chat entered is sent to the server.

  • On the sever side, the ChatFilter is instantiated to filter requests to chat.html:

    • The ChatFilter extends AjaxFilter, which identifies requests that are AJAX requests and gives assistance with formatting the AJAX responses. All other requests are passed normally.

    • The ChatFilter provides methods for join, leave, chat and getEvents. Most of these are fairly straight forward and just manipulatet state and send the appopriate AJAX response.

    • The smarts are in the getEvents method. This method is a poll from the client for any events on the server for the given member. If there were no events and the server simply replied with an empty response, this poll would become a busy poll and consume CPU on both client and server.

      To avoid this, normal AJAX servers will simply wait for a short period (eg. 30 seconds). If an event occurs in this time, the response is sent immediately. If the period times out, then an empty response is sent. Either way the client will then poll again for more events.

      But for servlets, this waiting for events, is done in the request handler, when a thread has been allocated. Thus it makes it very difficult to scale an AJAX server to thousands of users as you will need thousands of threads - mostly idle waiting for events.

      Thus Jetty 6 introduces Continuations, which allows the handling of a servlet request to be suspended until either a timeout occurs or an asynchronous event calls resume on the continuation. This allows threadless waiting and thus permits an AJAX server to scale without consuming vaste numbers of threads.

  • jetty-6.1.26/examples/test-webapp/src/main/webapp/chat/chat.css0000644000175000017500000000126010472631505023063 0ustar moonmoon div { border: 0px solid black; } div#chatroom { width: 41em; background-color: #e0e0e0; border: 1px solid black; } div#chat { float: left; width: 30em; height: 20ex; overflow: auto; background-color: #f0f0f0; padding: 4px; border-right: 1px solid black; } div#members { float: left; clear: right; width: 10em; border: 0px solid black; } div#input { clear: both; padding: 4px; border-top: 1px solid black; } input#phrase { width:28em; background-color: #e0f0f0; } input#username { width:14em; background-color: #e0f0f0; } div.hidden { display: none; } span.from { font-weight: bold; } span.alert { font-style: italic; } jetty-6.1.26/examples/test-webapp/src/main/webapp/chat/chat.js0000644000175000017500000000763110656205363022722 0ustar moonmoon function $() { return document.getElementById(arguments[0]); } function $F() { return document.getElementById(arguments[0]).value; } var room = { _last: "", _username: null, join: function(name) { if (name == null || name.length==0 ) { alert('Please enter a username!'); } else { this._username=name; $('join').className='hidden'; $('joined').className=''; $('phrase').focus(); Behaviour.apply(); ajax.sendMessage('join', room._username); } }, leave: function() { // switch the input form $('join').className=''; $('joined').className='hidden'; $('username').focus(); Behaviour.apply(); ajax.sendMessage('leave',room._username); room._username=null; }, chat: function(text) { if (text != null && text.length>0 ) { ajax.sendMessage('chat',text); } }, _chat: function(message) { var divChat=document.getElementById("chat"); var from=message.getAttribute('from'); var special=message.getAttribute('alert'); var text=message.childNodes[0].data; if ( special!='true' && from == room._last ) from="..."; else { room._last=from; from+=":"; } var parentElement = divChat; if (special=='true') { var span = document.createElement("span"); span.className="alert"; divChat.appendChild(span); parentElement=span; } var spanFrom = document.createElement("span"); spanFrom.className="from"; spanFrom.innerHTML=from+" "; var spanText = document.createElement("span"); spanText.className="text"; spanText.innerHTML=text; var lineBreak = document.createElement("br"); parentElement.appendChild(spanFrom); parentElement.appendChild(spanText); divChat.appendChild(lineBreak); divChat.scrollTop = divChat.scrollHeight - divChat.clientHeight; }, _members: function(message) { try { var divMembers = document.getElementById("members"); divMembers.innerHTML=""; var spanMember = document.createElement("span"); var ul = document.createElement("ul"); spanMember.appendChild(ul); var x = message.getElementsByTagName("li"); for (var i=0;i

    FORM Authentication demo

    Username:
    Password:
    jetty-6.1.26/examples/test-webapp/src/main/webapp/dat.txt0000644000175000017500000073444010472631505022041 0ustar moonmoon0000 2222222222222222222222222222222222222222222222222222222 0001 2222222222222222222222222222222222222222222222222222222 0002 2222222222222222222222222222222222222222222222222222222 0003 2222222222222222222222222222222222222222222222222222222 0004 2222222222222222222222222222222222222222222222222222222 0005 2222222222222222222222222222222222222222222222222222222 0006 2222222222222222222222222222222222222222222222222222222 0007 2222222222222222222222222222222222222222222222222222222 0008 2222222222222222222222222222222222222222222222222222222 0009 2222222222222222222222222222222222222222222222222222222 0010 2222222222222222222222222222222222222222222222222222222 0011 2222222222222222222222222222222222222222222222222222222 0012 2222222222222222222222222222222222222222222222222222222 0013 2222222222222222222222222222222222222222222222222222222 0014 2222222222222222222222222222222222222222222222222222222 0015 2222222222222222222222222222222222222222222222222222222 0016 2222222222222222222222222222222222222222222222222222222 0017 2222222222222222222222222222222222222222222222222222222 0018 2222222222222222222222222222222222222222222222222222222 0019 2222222222222222222222222222222222222222222222222222222 0020 2222222222222222222222222222222222222222222222222222222 0021 2222222222222222222222222222222222222222222222222222222 0022 2222222222222222222222222222222222222222222222222222222 0023 2222222222222222222222222222222222222222222222222222222 0024 2222222222222222222222222222222222222222222222222222222 0025 2222222222222222222222222222222222222222222222222222222 0026 2222222222222222222222222222222222222222222222222222222 0027 2222222222222222222222222222222222222222222222222222222 0028 2222222222222222222222222222222222222222222222222222222 0029 2222222222222222222222222222222222222222222222222222222 0030 2222222222222222222222222222222222222222222222222222222 0031 2222222222222222222222222222222222222222222222222222222 0032 2222222222222222222222222222222222222222222222222222222 0033 2222222222222222222222222222222222222222222222222222222 0034 2222222222222222222222222222222222222222222222222222222 0035 2222222222222222222222222222222222222222222222222222222 0036 2222222222222222222222222222222222222222222222222222222 0037 2222222222222222222222222222222222222222222222222222222 0038 2222222222222222222222222222222222222222222222222222222 0039 2222222222222222222222222222222222222222222222222222222 0040 2222222222222222222222222222222222222222222222222222222 0041 2222222222222222222222222222222222222222222222222222222 0042 2222222222222222222222222222222222222222222222222222222 0043 2222222222222222222222222222222222222222222222222222222 0044 2222222222222222222222222222222222222222222222222222222 0045 2222222222222222222222222222222222222222222222222222222 0046 2222222222222222222222222222222222222222222222222222222 0047 2222222222222222222222222222222222222222222222222222222 0048 2222222222222222222222222222222222222222222222222222222 0049 2222222222222222222222222222222222222222222222222222222 0050 2222222222222222222222222222222222222222222222222222222 0051 2222222222222222222222222222222222222222222222222222222 0052 2222222222222222222222222222222222222222222222222222222 0053 2222222222222222222222222222222222222222222222222222222 0054 2222222222222222222222222222222222222222222222222222222 0055 2222222222222222222222222222222222222222222222222222222 0056 2222222222222222222222222222222222222222222222222222222 0057 2222222222222222222222222222222222222222222222222222222 0058 2222222222222222222222222222222222222222222222222222222 0059 2222222222222222222222222222222222222222222222222222222 0060 2222222222222222222222222222222222222222222222222222222 0061 2222222222222222222222222222222222222222222222222222222 0062 2222222222222222222222222222222222222222222222222222222 0063 2222222222222222222222222222222222222222222222222222222 0064 2222222222222222222222222222222222222222222222222222222 0065 2222222222222222222222222222222222222222222222222222222 0066 2222222222222222222222222222222222222222222222222222222 0067 2222222222222222222222222222222222222222222222222222222 0068 2222222222222222222222222222222222222222222222222222222 0069 2222222222222222222222222222222222222222222222222222222 0070 2222222222222222222222222222222222222222222222222222222 0071 2222222222222222222222222222222222222222222222222222222 0072 2222222222222222222222222222222222222222222222222222222 0073 2222222222222222222222222222222222222222222222222222222 0074 2222222222222222222222222222222222222222222222222222222 0075 2222222222222222222222222222222222222222222222222222222 0076 2222222222222222222222222222222222222222222222222222222 0077 2222222222222222222222222222222222222222222222222222222 0078 2222222222222222222222222222222222222222222222222222222 0079 2222222222222222222222222222222222222222222222222222222 0080 2222222222222222222222222222222222222222222222222222222 0081 2222222222222222222222222222222222222222222222222222222 0082 2222222222222222222222222222222222222222222222222222222 0083 2222222222222222222222222222222222222222222222222222222 0084 2222222222222222222222222222222222222222222222222222222 0085 2222222222222222222222222222222222222222222222222222222 0086 2222222222222222222222222222222222222222222222222222222 0087 2222222222222222222222222222222222222222222222222222222 0088 2222222222222222222222222222222222222222222222222222222 0089 2222222222222222222222222222222222222222222222222222222 0090 2222222222222222222222222222222222222222222222222222222 0091 2222222222222222222222222222222222222222222222222222222 0092 2222222222222222222222222222222222222222222222222222222 0093 2222222222222222222222222222222222222222222222222222222 0094 2222222222222222222222222222222222222222222222222222222 0095 2222222222222222222222222222222222222222222222222222222 0096 2222222222222222222222222222222222222222222222222222222 0097 2222222222222222222222222222222222222222222222222222222 0098 2222222222222222222222222222222222222222222222222222222 0099 2222222222222222222222222222222222222222222222222222222 0100 2222222222222222222222222222222222222222222222222222222 0101 2222222222222222222222222222222222222222222222222222222 0102 2222222222222222222222222222222222222222222222222222222 0103 2222222222222222222222222222222222222222222222222222222 0104 2222222222222222222222222222222222222222222222222222222 0105 2222222222222222222222222222222222222222222222222222222 0106 2222222222222222222222222222222222222222222222222222222 0107 2222222222222222222222222222222222222222222222222222222 0108 2222222222222222222222222222222222222222222222222222222 0109 2222222222222222222222222222222222222222222222222222222 0110 2222222222222222222222222222222222222222222222222222222 0111 2222222222222222222222222222222222222222222222222222222 0112 2222222222222222222222222222222222222222222222222222222 0113 2222222222222222222222222222222222222222222222222222222 0114 2222222222222222222222222222222222222222222222222222222 0115 2222222222222222222222222222222222222222222222222222222 0116 2222222222222222222222222222222222222222222222222222222 0117 2222222222222222222222222222222222222222222222222222222 0118 2222222222222222222222222222222222222222222222222222222 0119 2222222222222222222222222222222222222222222222222222222 0120 2222222222222222222222222222222222222222222222222222222 0121 2222222222222222222222222222222222222222222222222222222 0122 2222222222222222222222222222222222222222222222222222222 0123 2222222222222222222222222222222222222222222222222222222 0124 2222222222222222222222222222222222222222222222222222222 0125 2222222222222222222222222222222222222222222222222222222 0126 2222222222222222222222222222222222222222222222222222222 0127 2222222222222222222222222222222222222222222222222222222 0128 2222222222222222222222222222222222222222222222222222222 0129 2222222222222222222222222222222222222222222222222222222 0130 2222222222222222222222222222222222222222222222222222222 0131 2222222222222222222222222222222222222222222222222222222 0132 2222222222222222222222222222222222222222222222222222222 0133 2222222222222222222222222222222222222222222222222222222 0134 2222222222222222222222222222222222222222222222222222222 0135 2222222222222222222222222222222222222222222222222222222 0136 2222222222222222222222222222222222222222222222222222222 0137 2222222222222222222222222222222222222222222222222222222 0138 2222222222222222222222222222222222222222222222222222222 0139 2222222222222222222222222222222222222222222222222222222 0140 2222222222222222222222222222222222222222222222222222222 0141 2222222222222222222222222222222222222222222222222222222 0142 2222222222222222222222222222222222222222222222222222222 0143 2222222222222222222222222222222222222222222222222222222 0144 2222222222222222222222222222222222222222222222222222222 0145 2222222222222222222222222222222222222222222222222222222 0146 2222222222222222222222222222222222222222222222222222222 0147 2222222222222222222222222222222222222222222222222222222 0148 2222222222222222222222222222222222222222222222222222222 0149 2222222222222222222222222222222222222222222222222222222 0150 2222222222222222222222222222222222222222222222222222222 0151 2222222222222222222222222222222222222222222222222222222 0152 2222222222222222222222222222222222222222222222222222222 0153 2222222222222222222222222222222222222222222222222222222 0154 2222222222222222222222222222222222222222222222222222222 0155 2222222222222222222222222222222222222222222222222222222 0156 2222222222222222222222222222222222222222222222222222222 0157 2222222222222222222222222222222222222222222222222222222 0158 2222222222222222222222222222222222222222222222222222222 0159 2222222222222222222222222222222222222222222222222222222 0160 2222222222222222222222222222222222222222222222222222222 0161 2222222222222222222222222222222222222222222222222222222 0162 2222222222222222222222222222222222222222222222222222222 0163 2222222222222222222222222222222222222222222222222222222 0164 2222222222222222222222222222222222222222222222222222222 0165 2222222222222222222222222222222222222222222222222222222 0166 2222222222222222222222222222222222222222222222222222222 0167 2222222222222222222222222222222222222222222222222222222 0168 2222222222222222222222222222222222222222222222222222222 0169 2222222222222222222222222222222222222222222222222222222 0170 2222222222222222222222222222222222222222222222222222222 0171 2222222222222222222222222222222222222222222222222222222 0172 2222222222222222222222222222222222222222222222222222222 0173 2222222222222222222222222222222222222222222222222222222 0174 2222222222222222222222222222222222222222222222222222222 0175 2222222222222222222222222222222222222222222222222222222 0176 2222222222222222222222222222222222222222222222222222222 0177 2222222222222222222222222222222222222222222222222222222 0178 2222222222222222222222222222222222222222222222222222222 0179 2222222222222222222222222222222222222222222222222222222 0180 2222222222222222222222222222222222222222222222222222222 0181 2222222222222222222222222222222222222222222222222222222 0182 2222222222222222222222222222222222222222222222222222222 0183 2222222222222222222222222222222222222222222222222222222 0184 2222222222222222222222222222222222222222222222222222222 0185 2222222222222222222222222222222222222222222222222222222 0186 2222222222222222222222222222222222222222222222222222222 0187 2222222222222222222222222222222222222222222222222222222 0188 2222222222222222222222222222222222222222222222222222222 0189 2222222222222222222222222222222222222222222222222222222 0190 2222222222222222222222222222222222222222222222222222222 0191 2222222222222222222222222222222222222222222222222222222 0192 2222222222222222222222222222222222222222222222222222222 0193 2222222222222222222222222222222222222222222222222222222 0194 2222222222222222222222222222222222222222222222222222222 0195 2222222222222222222222222222222222222222222222222222222 0196 2222222222222222222222222222222222222222222222222222222 0197 2222222222222222222222222222222222222222222222222222222 0198 2222222222222222222222222222222222222222222222222222222 0199 2222222222222222222222222222222222222222222222222222222 0200 2222222222222222222222222222222222222222222222222222222 0201 2222222222222222222222222222222222222222222222222222222 0202 2222222222222222222222222222222222222222222222222222222 0203 2222222222222222222222222222222222222222222222222222222 0204 2222222222222222222222222222222222222222222222222222222 0205 2222222222222222222222222222222222222222222222222222222 0206 2222222222222222222222222222222222222222222222222222222 0207 2222222222222222222222222222222222222222222222222222222 0208 2222222222222222222222222222222222222222222222222222222 0209 2222222222222222222222222222222222222222222222222222222 0210 2222222222222222222222222222222222222222222222222222222 0211 2222222222222222222222222222222222222222222222222222222 0212 2222222222222222222222222222222222222222222222222222222 0213 2222222222222222222222222222222222222222222222222222222 0214 2222222222222222222222222222222222222222222222222222222 0215 2222222222222222222222222222222222222222222222222222222 0216 2222222222222222222222222222222222222222222222222222222 0217 2222222222222222222222222222222222222222222222222222222 0218 2222222222222222222222222222222222222222222222222222222 0219 2222222222222222222222222222222222222222222222222222222 0220 2222222222222222222222222222222222222222222222222222222 0221 2222222222222222222222222222222222222222222222222222222 0222 2222222222222222222222222222222222222222222222222222222 0223 2222222222222222222222222222222222222222222222222222222 0224 2222222222222222222222222222222222222222222222222222222 0225 2222222222222222222222222222222222222222222222222222222 0226 2222222222222222222222222222222222222222222222222222222 0227 2222222222222222222222222222222222222222222222222222222 0228 2222222222222222222222222222222222222222222222222222222 0229 2222222222222222222222222222222222222222222222222222222 0230 2222222222222222222222222222222222222222222222222222222 0231 2222222222222222222222222222222222222222222222222222222 0232 2222222222222222222222222222222222222222222222222222222 0233 2222222222222222222222222222222222222222222222222222222 0234 2222222222222222222222222222222222222222222222222222222 0235 2222222222222222222222222222222222222222222222222222222 0236 2222222222222222222222222222222222222222222222222222222 0237 2222222222222222222222222222222222222222222222222222222 0238 2222222222222222222222222222222222222222222222222222222 0239 2222222222222222222222222222222222222222222222222222222 0240 2222222222222222222222222222222222222222222222222222222 0241 2222222222222222222222222222222222222222222222222222222 0242 2222222222222222222222222222222222222222222222222222222 0243 2222222222222222222222222222222222222222222222222222222 0244 2222222222222222222222222222222222222222222222222222222 0245 2222222222222222222222222222222222222222222222222222222 0246 2222222222222222222222222222222222222222222222222222222 0247 2222222222222222222222222222222222222222222222222222222 0248 2222222222222222222222222222222222222222222222222222222 0249 2222222222222222222222222222222222222222222222222222222 0250 2222222222222222222222222222222222222222222222222222222 0251 2222222222222222222222222222222222222222222222222222222 0252 2222222222222222222222222222222222222222222222222222222 0253 2222222222222222222222222222222222222222222222222222222 0254 2222222222222222222222222222222222222222222222222222222 0255 2222222222222222222222222222222222222222222222222222222 0256 2222222222222222222222222222222222222222222222222222222 0257 2222222222222222222222222222222222222222222222222222222 0258 2222222222222222222222222222222222222222222222222222222 0259 2222222222222222222222222222222222222222222222222222222 0260 2222222222222222222222222222222222222222222222222222222 0261 2222222222222222222222222222222222222222222222222222222 0262 2222222222222222222222222222222222222222222222222222222 0263 2222222222222222222222222222222222222222222222222222222 0264 2222222222222222222222222222222222222222222222222222222 0265 2222222222222222222222222222222222222222222222222222222 0266 2222222222222222222222222222222222222222222222222222222 0267 2222222222222222222222222222222222222222222222222222222 0268 2222222222222222222222222222222222222222222222222222222 0269 2222222222222222222222222222222222222222222222222222222 0270 2222222222222222222222222222222222222222222222222222222 0271 2222222222222222222222222222222222222222222222222222222 0272 2222222222222222222222222222222222222222222222222222222 0273 2222222222222222222222222222222222222222222222222222222 0274 2222222222222222222222222222222222222222222222222222222 0275 2222222222222222222222222222222222222222222222222222222 0276 2222222222222222222222222222222222222222222222222222222 0277 2222222222222222222222222222222222222222222222222222222 0278 2222222222222222222222222222222222222222222222222222222 0279 2222222222222222222222222222222222222222222222222222222 0280 2222222222222222222222222222222222222222222222222222222 0281 2222222222222222222222222222222222222222222222222222222 0282 2222222222222222222222222222222222222222222222222222222 0283 2222222222222222222222222222222222222222222222222222222 0284 2222222222222222222222222222222222222222222222222222222 0285 2222222222222222222222222222222222222222222222222222222 0286 2222222222222222222222222222222222222222222222222222222 0287 2222222222222222222222222222222222222222222222222222222 0288 2222222222222222222222222222222222222222222222222222222 0289 2222222222222222222222222222222222222222222222222222222 0290 2222222222222222222222222222222222222222222222222222222 0291 2222222222222222222222222222222222222222222222222222222 0292 2222222222222222222222222222222222222222222222222222222 0293 2222222222222222222222222222222222222222222222222222222 0294 2222222222222222222222222222222222222222222222222222222 0295 2222222222222222222222222222222222222222222222222222222 0296 2222222222222222222222222222222222222222222222222222222 0297 2222222222222222222222222222222222222222222222222222222 0298 2222222222222222222222222222222222222222222222222222222 0299 2222222222222222222222222222222222222222222222222222222 0300 2222222222222222222222222222222222222222222222222222222 0301 2222222222222222222222222222222222222222222222222222222 0302 2222222222222222222222222222222222222222222222222222222 0303 2222222222222222222222222222222222222222222222222222222 0304 2222222222222222222222222222222222222222222222222222222 0305 2222222222222222222222222222222222222222222222222222222 0306 2222222222222222222222222222222222222222222222222222222 0307 2222222222222222222222222222222222222222222222222222222 0308 2222222222222222222222222222222222222222222222222222222 0309 2222222222222222222222222222222222222222222222222222222 0310 2222222222222222222222222222222222222222222222222222222 0311 2222222222222222222222222222222222222222222222222222222 0312 2222222222222222222222222222222222222222222222222222222 0313 2222222222222222222222222222222222222222222222222222222 0314 2222222222222222222222222222222222222222222222222222222 0315 2222222222222222222222222222222222222222222222222222222 0316 2222222222222222222222222222222222222222222222222222222 0317 2222222222222222222222222222222222222222222222222222222 0318 2222222222222222222222222222222222222222222222222222222 0319 2222222222222222222222222222222222222222222222222222222 0320 2222222222222222222222222222222222222222222222222222222 0321 2222222222222222222222222222222222222222222222222222222 0322 2222222222222222222222222222222222222222222222222222222 0323 2222222222222222222222222222222222222222222222222222222 0324 2222222222222222222222222222222222222222222222222222222 0325 2222222222222222222222222222222222222222222222222222222 0326 2222222222222222222222222222222222222222222222222222222 0327 2222222222222222222222222222222222222222222222222222222 0328 2222222222222222222222222222222222222222222222222222222 0329 2222222222222222222222222222222222222222222222222222222 0330 2222222222222222222222222222222222222222222222222222222 0331 2222222222222222222222222222222222222222222222222222222 0332 2222222222222222222222222222222222222222222222222222222 0333 2222222222222222222222222222222222222222222222222222222 0334 2222222222222222222222222222222222222222222222222222222 0335 2222222222222222222222222222222222222222222222222222222 0336 2222222222222222222222222222222222222222222222222222222 0337 2222222222222222222222222222222222222222222222222222222 0338 2222222222222222222222222222222222222222222222222222222 0339 2222222222222222222222222222222222222222222222222222222 0340 2222222222222222222222222222222222222222222222222222222 0341 2222222222222222222222222222222222222222222222222222222 0342 2222222222222222222222222222222222222222222222222222222 0343 2222222222222222222222222222222222222222222222222222222 0344 2222222222222222222222222222222222222222222222222222222 0345 2222222222222222222222222222222222222222222222222222222 0346 2222222222222222222222222222222222222222222222222222222 0347 2222222222222222222222222222222222222222222222222222222 0348 2222222222222222222222222222222222222222222222222222222 0349 2222222222222222222222222222222222222222222222222222222 0350 2222222222222222222222222222222222222222222222222222222 0351 2222222222222222222222222222222222222222222222222222222 0352 2222222222222222222222222222222222222222222222222222222 0353 2222222222222222222222222222222222222222222222222222222 0354 2222222222222222222222222222222222222222222222222222222 0355 2222222222222222222222222222222222222222222222222222222 0356 2222222222222222222222222222222222222222222222222222222 0357 2222222222222222222222222222222222222222222222222222222 0358 2222222222222222222222222222222222222222222222222222222 0359 2222222222222222222222222222222222222222222222222222222 0360 2222222222222222222222222222222222222222222222222222222 0361 2222222222222222222222222222222222222222222222222222222 0362 2222222222222222222222222222222222222222222222222222222 0363 2222222222222222222222222222222222222222222222222222222 0364 2222222222222222222222222222222222222222222222222222222 0365 2222222222222222222222222222222222222222222222222222222 0366 2222222222222222222222222222222222222222222222222222222 0367 2222222222222222222222222222222222222222222222222222222 0368 2222222222222222222222222222222222222222222222222222222 0369 2222222222222222222222222222222222222222222222222222222 0370 2222222222222222222222222222222222222222222222222222222 0371 2222222222222222222222222222222222222222222222222222222 0372 2222222222222222222222222222222222222222222222222222222 0373 2222222222222222222222222222222222222222222222222222222 0374 2222222222222222222222222222222222222222222222222222222 0375 2222222222222222222222222222222222222222222222222222222 0376 2222222222222222222222222222222222222222222222222222222 0377 2222222222222222222222222222222222222222222222222222222 0378 2222222222222222222222222222222222222222222222222222222 0379 2222222222222222222222222222222222222222222222222222222 0380 2222222222222222222222222222222222222222222222222222222 0381 2222222222222222222222222222222222222222222222222222222 0382 2222222222222222222222222222222222222222222222222222222 0383 2222222222222222222222222222222222222222222222222222222 0384 2222222222222222222222222222222222222222222222222222222 0385 2222222222222222222222222222222222222222222222222222222 0386 2222222222222222222222222222222222222222222222222222222 0387 2222222222222222222222222222222222222222222222222222222 0388 2222222222222222222222222222222222222222222222222222222 0389 2222222222222222222222222222222222222222222222222222222 0390 2222222222222222222222222222222222222222222222222222222 0391 2222222222222222222222222222222222222222222222222222222 0392 2222222222222222222222222222222222222222222222222222222 0393 2222222222222222222222222222222222222222222222222222222 0394 2222222222222222222222222222222222222222222222222222222 0395 2222222222222222222222222222222222222222222222222222222 0396 2222222222222222222222222222222222222222222222222222222 0397 2222222222222222222222222222222222222222222222222222222 0398 2222222222222222222222222222222222222222222222222222222 0399 2222222222222222222222222222222222222222222222222222222 0400 2222222222222222222222222222222222222222222222222222222 0401 2222222222222222222222222222222222222222222222222222222 0402 2222222222222222222222222222222222222222222222222222222 0403 2222222222222222222222222222222222222222222222222222222 0404 2222222222222222222222222222222222222222222222222222222 0405 2222222222222222222222222222222222222222222222222222222 0406 2222222222222222222222222222222222222222222222222222222 0407 2222222222222222222222222222222222222222222222222222222 0408 2222222222222222222222222222222222222222222222222222222 0409 2222222222222222222222222222222222222222222222222222222 0410 2222222222222222222222222222222222222222222222222222222 0411 2222222222222222222222222222222222222222222222222222222 0412 2222222222222222222222222222222222222222222222222222222 0413 2222222222222222222222222222222222222222222222222222222 0414 2222222222222222222222222222222222222222222222222222222 0415 2222222222222222222222222222222222222222222222222222222 0416 2222222222222222222222222222222222222222222222222222222 0417 2222222222222222222222222222222222222222222222222222222 0418 2222222222222222222222222222222222222222222222222222222 0419 2222222222222222222222222222222222222222222222222222222 0420 2222222222222222222222222222222222222222222222222222222 0421 2222222222222222222222222222222222222222222222222222222 0422 2222222222222222222222222222222222222222222222222222222 0423 2222222222222222222222222222222222222222222222222222222 0424 2222222222222222222222222222222222222222222222222222222 0425 2222222222222222222222222222222222222222222222222222222 0426 2222222222222222222222222222222222222222222222222222222 0427 2222222222222222222222222222222222222222222222222222222 0428 2222222222222222222222222222222222222222222222222222222 0429 2222222222222222222222222222222222222222222222222222222 0430 2222222222222222222222222222222222222222222222222222222 0431 2222222222222222222222222222222222222222222222222222222 0432 2222222222222222222222222222222222222222222222222222222 0433 2222222222222222222222222222222222222222222222222222222 0434 2222222222222222222222222222222222222222222222222222222 0435 2222222222222222222222222222222222222222222222222222222 0436 2222222222222222222222222222222222222222222222222222222 0437 2222222222222222222222222222222222222222222222222222222 0438 2222222222222222222222222222222222222222222222222222222 0439 2222222222222222222222222222222222222222222222222222222 0440 2222222222222222222222222222222222222222222222222222222 0441 2222222222222222222222222222222222222222222222222222222 0442 2222222222222222222222222222222222222222222222222222222 0443 2222222222222222222222222222222222222222222222222222222 0444 2222222222222222222222222222222222222222222222222222222 0445 2222222222222222222222222222222222222222222222222222222 0446 2222222222222222222222222222222222222222222222222222222 0447 2222222222222222222222222222222222222222222222222222222 0448 2222222222222222222222222222222222222222222222222222222 0449 2222222222222222222222222222222222222222222222222222222 0450 2222222222222222222222222222222222222222222222222222222 0451 2222222222222222222222222222222222222222222222222222222 0452 2222222222222222222222222222222222222222222222222222222 0453 2222222222222222222222222222222222222222222222222222222 0454 2222222222222222222222222222222222222222222222222222222 0455 2222222222222222222222222222222222222222222222222222222 0456 2222222222222222222222222222222222222222222222222222222 0457 2222222222222222222222222222222222222222222222222222222 0458 2222222222222222222222222222222222222222222222222222222 0459 2222222222222222222222222222222222222222222222222222222 0460 2222222222222222222222222222222222222222222222222222222 0461 2222222222222222222222222222222222222222222222222222222 0462 2222222222222222222222222222222222222222222222222222222 0463 2222222222222222222222222222222222222222222222222222222 0464 2222222222222222222222222222222222222222222222222222222 0465 2222222222222222222222222222222222222222222222222222222 0466 2222222222222222222222222222222222222222222222222222222 0467 2222222222222222222222222222222222222222222222222222222 0468 2222222222222222222222222222222222222222222222222222222 0469 2222222222222222222222222222222222222222222222222222222 0470 2222222222222222222222222222222222222222222222222222222 0471 2222222222222222222222222222222222222222222222222222222 0472 2222222222222222222222222222222222222222222222222222222 0473 2222222222222222222222222222222222222222222222222222222 0474 2222222222222222222222222222222222222222222222222222222 0475 2222222222222222222222222222222222222222222222222222222 0476 2222222222222222222222222222222222222222222222222222222 0477 2222222222222222222222222222222222222222222222222222222 0478 2222222222222222222222222222222222222222222222222222222 0479 2222222222222222222222222222222222222222222222222222222 0480 2222222222222222222222222222222222222222222222222222222 0481 2222222222222222222222222222222222222222222222222222222 0482 2222222222222222222222222222222222222222222222222222222 0483 2222222222222222222222222222222222222222222222222222222 0484 2222222222222222222222222222222222222222222222222222222 0485 2222222222222222222222222222222222222222222222222222222 0486 2222222222222222222222222222222222222222222222222222222 0487 2222222222222222222222222222222222222222222222222222222 0488 2222222222222222222222222222222222222222222222222222222 0489 2222222222222222222222222222222222222222222222222222222 0490 2222222222222222222222222222222222222222222222222222222 0491 2222222222222222222222222222222222222222222222222222222 0492 2222222222222222222222222222222222222222222222222222222 0493 2222222222222222222222222222222222222222222222222222222 0494 2222222222222222222222222222222222222222222222222222222 0495 2222222222222222222222222222222222222222222222222222222 0496 2222222222222222222222222222222222222222222222222222222 0497 2222222222222222222222222222222222222222222222222222222 0498 2222222222222222222222222222222222222222222222222222222 0499 2222222222222222222222222222222222222222222222222222222 0500 2222222222222222222222222222222222222222222222222222222 0501 2222222222222222222222222222222222222222222222222222222 0502 2222222222222222222222222222222222222222222222222222222 0503 2222222222222222222222222222222222222222222222222222222 0504 2222222222222222222222222222222222222222222222222222222 0505 2222222222222222222222222222222222222222222222222222222 0506 2222222222222222222222222222222222222222222222222222222 0507 2222222222222222222222222222222222222222222222222222222 0508 2222222222222222222222222222222222222222222222222222222 0509 2222222222222222222222222222222222222222222222222222222 0510 2222222222222222222222222222222222222222222222222222222 0511 2222222222222222222222222222222222222222222222222222222 0512 2222222222222222222222222222222222222222222222222222222 0513 2222222222222222222222222222222222222222222222222222222 0514 2222222222222222222222222222222222222222222222222222222 0515 2222222222222222222222222222222222222222222222222222222 0516 2222222222222222222222222222222222222222222222222222222 0517 2222222222222222222222222222222222222222222222222222222 0518 2222222222222222222222222222222222222222222222222222222 0519 2222222222222222222222222222222222222222222222222222222 0520 2222222222222222222222222222222222222222222222222222222 0521 2222222222222222222222222222222222222222222222222222222 0522 2222222222222222222222222222222222222222222222222222222 0523 2222222222222222222222222222222222222222222222222222222 0524 2222222222222222222222222222222222222222222222222222222 0525 2222222222222222222222222222222222222222222222222222222 0526 2222222222222222222222222222222222222222222222222222222 0527 2222222222222222222222222222222222222222222222222222222 0528 2222222222222222222222222222222222222222222222222222222 0529 2222222222222222222222222222222222222222222222222222222 0530 2222222222222222222222222222222222222222222222222222222 0531 2222222222222222222222222222222222222222222222222222222 0532 2222222222222222222222222222222222222222222222222222222 0533 2222222222222222222222222222222222222222222222222222222 0534 2222222222222222222222222222222222222222222222222222222 0535 2222222222222222222222222222222222222222222222222222222 0536 2222222222222222222222222222222222222222222222222222222 0537 2222222222222222222222222222222222222222222222222222222 0538 2222222222222222222222222222222222222222222222222222222 0539 2222222222222222222222222222222222222222222222222222222 0540 2222222222222222222222222222222222222222222222222222222 0541 2222222222222222222222222222222222222222222222222222222 0542 2222222222222222222222222222222222222222222222222222222 0543 2222222222222222222222222222222222222222222222222222222 0544 2222222222222222222222222222222222222222222222222222222 0545 2222222222222222222222222222222222222222222222222222222 0546 2222222222222222222222222222222222222222222222222222222 0547 2222222222222222222222222222222222222222222222222222222 0548 2222222222222222222222222222222222222222222222222222222 0549 2222222222222222222222222222222222222222222222222222222 0550 2222222222222222222222222222222222222222222222222222222 0551 2222222222222222222222222222222222222222222222222222222 0552 2222222222222222222222222222222222222222222222222222222 0553 2222222222222222222222222222222222222222222222222222222 0554 2222222222222222222222222222222222222222222222222222222 0555 2222222222222222222222222222222222222222222222222222222 0556 2222222222222222222222222222222222222222222222222222222 0557 2222222222222222222222222222222222222222222222222222222 0558 2222222222222222222222222222222222222222222222222222222 0559 2222222222222222222222222222222222222222222222222222222 0560 2222222222222222222222222222222222222222222222222222222 0561 2222222222222222222222222222222222222222222222222222222 0562 2222222222222222222222222222222222222222222222222222222 0563 2222222222222222222222222222222222222222222222222222222 0564 2222222222222222222222222222222222222222222222222222222 0565 2222222222222222222222222222222222222222222222222222222 0566 2222222222222222222222222222222222222222222222222222222 0567 2222222222222222222222222222222222222222222222222222222 0568 2222222222222222222222222222222222222222222222222222222 0569 2222222222222222222222222222222222222222222222222222222 0570 2222222222222222222222222222222222222222222222222222222 0571 2222222222222222222222222222222222222222222222222222222 0572 2222222222222222222222222222222222222222222222222222222 0573 2222222222222222222222222222222222222222222222222222222 0574 2222222222222222222222222222222222222222222222222222222 0575 2222222222222222222222222222222222222222222222222222222 0576 2222222222222222222222222222222222222222222222222222222 0577 2222222222222222222222222222222222222222222222222222222 0578 2222222222222222222222222222222222222222222222222222222 0579 2222222222222222222222222222222222222222222222222222222 0580 2222222222222222222222222222222222222222222222222222222 0581 2222222222222222222222222222222222222222222222222222222 0582 2222222222222222222222222222222222222222222222222222222 0583 2222222222222222222222222222222222222222222222222222222 0584 2222222222222222222222222222222222222222222222222222222 0585 2222222222222222222222222222222222222222222222222222222 0586 2222222222222222222222222222222222222222222222222222222 0587 2222222222222222222222222222222222222222222222222222222 0588 2222222222222222222222222222222222222222222222222222222 0589 2222222222222222222222222222222222222222222222222222222 0590 2222222222222222222222222222222222222222222222222222222 0591 2222222222222222222222222222222222222222222222222222222 0592 2222222222222222222222222222222222222222222222222222222 0593 2222222222222222222222222222222222222222222222222222222 0594 2222222222222222222222222222222222222222222222222222222 0595 2222222222222222222222222222222222222222222222222222222 0596 2222222222222222222222222222222222222222222222222222222 0597 2222222222222222222222222222222222222222222222222222222 0598 2222222222222222222222222222222222222222222222222222222 0599 2222222222222222222222222222222222222222222222222222222 0600 2222222222222222222222222222222222222222222222222222222 0601 2222222222222222222222222222222222222222222222222222222 0602 2222222222222222222222222222222222222222222222222222222 0603 2222222222222222222222222222222222222222222222222222222 0604 2222222222222222222222222222222222222222222222222222222 0605 2222222222222222222222222222222222222222222222222222222 0606 2222222222222222222222222222222222222222222222222222222 0607 2222222222222222222222222222222222222222222222222222222 0608 2222222222222222222222222222222222222222222222222222222 0609 2222222222222222222222222222222222222222222222222222222 0610 2222222222222222222222222222222222222222222222222222222 0611 2222222222222222222222222222222222222222222222222222222 0612 2222222222222222222222222222222222222222222222222222222 0613 2222222222222222222222222222222222222222222222222222222 0614 2222222222222222222222222222222222222222222222222222222 0615 2222222222222222222222222222222222222222222222222222222 0616 2222222222222222222222222222222222222222222222222222222 0617 2222222222222222222222222222222222222222222222222222222 0618 2222222222222222222222222222222222222222222222222222222 0619 2222222222222222222222222222222222222222222222222222222 0620 2222222222222222222222222222222222222222222222222222222 0621 2222222222222222222222222222222222222222222222222222222 0622 2222222222222222222222222222222222222222222222222222222 0623 2222222222222222222222222222222222222222222222222222222 0624 2222222222222222222222222222222222222222222222222222222 0625 2222222222222222222222222222222222222222222222222222222 0626 2222222222222222222222222222222222222222222222222222222 0627 2222222222222222222222222222222222222222222222222222222 0628 2222222222222222222222222222222222222222222222222222222 0629 2222222222222222222222222222222222222222222222222222222 0630 2222222222222222222222222222222222222222222222222222222 0631 2222222222222222222222222222222222222222222222222222222 0632 2222222222222222222222222222222222222222222222222222222 0633 2222222222222222222222222222222222222222222222222222222 0634 2222222222222222222222222222222222222222222222222222222 0635 2222222222222222222222222222222222222222222222222222222 0636 2222222222222222222222222222222222222222222222222222222 0637 2222222222222222222222222222222222222222222222222222222 0638 2222222222222222222222222222222222222222222222222222222 0639 2222222222222222222222222222222222222222222222222222222 0640 2222222222222222222222222222222222222222222222222222222 0641 2222222222222222222222222222222222222222222222222222222 0642 2222222222222222222222222222222222222222222222222222222 0643 2222222222222222222222222222222222222222222222222222222 0644 2222222222222222222222222222222222222222222222222222222 0645 2222222222222222222222222222222222222222222222222222222 0646 2222222222222222222222222222222222222222222222222222222 0647 2222222222222222222222222222222222222222222222222222222 0648 2222222222222222222222222222222222222222222222222222222 0649 2222222222222222222222222222222222222222222222222222222 0650 2222222222222222222222222222222222222222222222222222222 0651 2222222222222222222222222222222222222222222222222222222 0652 2222222222222222222222222222222222222222222222222222222 0653 2222222222222222222222222222222222222222222222222222222 0654 2222222222222222222222222222222222222222222222222222222 0655 2222222222222222222222222222222222222222222222222222222 0656 2222222222222222222222222222222222222222222222222222222 0657 2222222222222222222222222222222222222222222222222222222 0658 2222222222222222222222222222222222222222222222222222222 0659 2222222222222222222222222222222222222222222222222222222 0660 2222222222222222222222222222222222222222222222222222222 0661 2222222222222222222222222222222222222222222222222222222 0662 2222222222222222222222222222222222222222222222222222222 0663 2222222222222222222222222222222222222222222222222222222 0664 2222222222222222222222222222222222222222222222222222222 0665 2222222222222222222222222222222222222222222222222222222 0666 2222222222222222222222222222222222222222222222222222222 0667 2222222222222222222222222222222222222222222222222222222 0668 2222222222222222222222222222222222222222222222222222222 0669 2222222222222222222222222222222222222222222222222222222 0670 2222222222222222222222222222222222222222222222222222222 0671 2222222222222222222222222222222222222222222222222222222 0672 2222222222222222222222222222222222222222222222222222222 0673 2222222222222222222222222222222222222222222222222222222 0674 2222222222222222222222222222222222222222222222222222222 0675 2222222222222222222222222222222222222222222222222222222 0676 2222222222222222222222222222222222222222222222222222222 0677 2222222222222222222222222222222222222222222222222222222 0678 2222222222222222222222222222222222222222222222222222222 0679 2222222222222222222222222222222222222222222222222222222 0680 2222222222222222222222222222222222222222222222222222222 0681 2222222222222222222222222222222222222222222222222222222 0682 2222222222222222222222222222222222222222222222222222222 0683 2222222222222222222222222222222222222222222222222222222 0684 2222222222222222222222222222222222222222222222222222222 0685 2222222222222222222222222222222222222222222222222222222 0686 2222222222222222222222222222222222222222222222222222222 0687 2222222222222222222222222222222222222222222222222222222 0688 2222222222222222222222222222222222222222222222222222222 0689 2222222222222222222222222222222222222222222222222222222 0690 2222222222222222222222222222222222222222222222222222222 0691 2222222222222222222222222222222222222222222222222222222 0692 2222222222222222222222222222222222222222222222222222222 0693 2222222222222222222222222222222222222222222222222222222 0694 2222222222222222222222222222222222222222222222222222222 0695 2222222222222222222222222222222222222222222222222222222 0696 2222222222222222222222222222222222222222222222222222222 0697 2222222222222222222222222222222222222222222222222222222 0698 2222222222222222222222222222222222222222222222222222222 0699 2222222222222222222222222222222222222222222222222222222 0700 2222222222222222222222222222222222222222222222222222222 0701 2222222222222222222222222222222222222222222222222222222 0702 2222222222222222222222222222222222222222222222222222222 0703 2222222222222222222222222222222222222222222222222222222 0704 2222222222222222222222222222222222222222222222222222222 0705 2222222222222222222222222222222222222222222222222222222 0706 2222222222222222222222222222222222222222222222222222222 0707 2222222222222222222222222222222222222222222222222222222 0708 2222222222222222222222222222222222222222222222222222222 0709 2222222222222222222222222222222222222222222222222222222 0710 2222222222222222222222222222222222222222222222222222222 0711 2222222222222222222222222222222222222222222222222222222 0712 2222222222222222222222222222222222222222222222222222222 0713 2222222222222222222222222222222222222222222222222222222 0714 2222222222222222222222222222222222222222222222222222222 0715 2222222222222222222222222222222222222222222222222222222 0716 2222222222222222222222222222222222222222222222222222222 0717 2222222222222222222222222222222222222222222222222222222 0718 2222222222222222222222222222222222222222222222222222222 0719 2222222222222222222222222222222222222222222222222222222 0720 2222222222222222222222222222222222222222222222222222222 0721 2222222222222222222222222222222222222222222222222222222 0722 2222222222222222222222222222222222222222222222222222222 0723 2222222222222222222222222222222222222222222222222222222 0724 2222222222222222222222222222222222222222222222222222222 0725 2222222222222222222222222222222222222222222222222222222 0726 2222222222222222222222222222222222222222222222222222222 0727 2222222222222222222222222222222222222222222222222222222 0728 2222222222222222222222222222222222222222222222222222222 0729 2222222222222222222222222222222222222222222222222222222 0730 2222222222222222222222222222222222222222222222222222222 0731 2222222222222222222222222222222222222222222222222222222 0732 2222222222222222222222222222222222222222222222222222222 0733 2222222222222222222222222222222222222222222222222222222 0734 2222222222222222222222222222222222222222222222222222222 0735 2222222222222222222222222222222222222222222222222222222 0736 2222222222222222222222222222222222222222222222222222222 0737 2222222222222222222222222222222222222222222222222222222 0738 2222222222222222222222222222222222222222222222222222222 0739 2222222222222222222222222222222222222222222222222222222 0740 2222222222222222222222222222222222222222222222222222222 0741 2222222222222222222222222222222222222222222222222222222 0742 2222222222222222222222222222222222222222222222222222222 0743 2222222222222222222222222222222222222222222222222222222 0744 2222222222222222222222222222222222222222222222222222222 0745 2222222222222222222222222222222222222222222222222222222 0746 2222222222222222222222222222222222222222222222222222222 0747 2222222222222222222222222222222222222222222222222222222 0748 2222222222222222222222222222222222222222222222222222222 0749 2222222222222222222222222222222222222222222222222222222 0750 2222222222222222222222222222222222222222222222222222222 0751 2222222222222222222222222222222222222222222222222222222 0752 2222222222222222222222222222222222222222222222222222222 0753 2222222222222222222222222222222222222222222222222222222 0754 2222222222222222222222222222222222222222222222222222222 0755 2222222222222222222222222222222222222222222222222222222 0756 2222222222222222222222222222222222222222222222222222222 0757 2222222222222222222222222222222222222222222222222222222 0758 2222222222222222222222222222222222222222222222222222222 0759 2222222222222222222222222222222222222222222222222222222 0760 2222222222222222222222222222222222222222222222222222222 0761 2222222222222222222222222222222222222222222222222222222 0762 2222222222222222222222222222222222222222222222222222222 0763 2222222222222222222222222222222222222222222222222222222 0764 2222222222222222222222222222222222222222222222222222222 0765 2222222222222222222222222222222222222222222222222222222 0766 2222222222222222222222222222222222222222222222222222222 0767 2222222222222222222222222222222222222222222222222222222 0768 2222222222222222222222222222222222222222222222222222222 0769 2222222222222222222222222222222222222222222222222222222 0770 2222222222222222222222222222222222222222222222222222222 0771 2222222222222222222222222222222222222222222222222222222 0772 2222222222222222222222222222222222222222222222222222222 0773 2222222222222222222222222222222222222222222222222222222 0774 2222222222222222222222222222222222222222222222222222222 0775 2222222222222222222222222222222222222222222222222222222 0776 2222222222222222222222222222222222222222222222222222222 0777 2222222222222222222222222222222222222222222222222222222 0778 2222222222222222222222222222222222222222222222222222222 0779 2222222222222222222222222222222222222222222222222222222 0780 2222222222222222222222222222222222222222222222222222222 0781 2222222222222222222222222222222222222222222222222222222 0782 2222222222222222222222222222222222222222222222222222222 0783 2222222222222222222222222222222222222222222222222222222 0784 2222222222222222222222222222222222222222222222222222222 0785 2222222222222222222222222222222222222222222222222222222 0786 2222222222222222222222222222222222222222222222222222222 0787 2222222222222222222222222222222222222222222222222222222 0788 2222222222222222222222222222222222222222222222222222222 0789 2222222222222222222222222222222222222222222222222222222 0790 2222222222222222222222222222222222222222222222222222222 0791 2222222222222222222222222222222222222222222222222222222 0792 2222222222222222222222222222222222222222222222222222222 0793 2222222222222222222222222222222222222222222222222222222 0794 2222222222222222222222222222222222222222222222222222222 0795 2222222222222222222222222222222222222222222222222222222 0796 2222222222222222222222222222222222222222222222222222222 0797 2222222222222222222222222222222222222222222222222222222 0798 2222222222222222222222222222222222222222222222222222222 0799 2222222222222222222222222222222222222222222222222222222 0800 2222222222222222222222222222222222222222222222222222222 0801 2222222222222222222222222222222222222222222222222222222 0802 2222222222222222222222222222222222222222222222222222222 0803 2222222222222222222222222222222222222222222222222222222 0804 2222222222222222222222222222222222222222222222222222222 0805 2222222222222222222222222222222222222222222222222222222 0806 2222222222222222222222222222222222222222222222222222222 0807 2222222222222222222222222222222222222222222222222222222 0808 2222222222222222222222222222222222222222222222222222222 0809 2222222222222222222222222222222222222222222222222222222 0810 2222222222222222222222222222222222222222222222222222222 0811 2222222222222222222222222222222222222222222222222222222 0812 2222222222222222222222222222222222222222222222222222222 0813 2222222222222222222222222222222222222222222222222222222 0814 2222222222222222222222222222222222222222222222222222222 0815 2222222222222222222222222222222222222222222222222222222 0816 2222222222222222222222222222222222222222222222222222222 0817 2222222222222222222222222222222222222222222222222222222 0818 2222222222222222222222222222222222222222222222222222222 0819 2222222222222222222222222222222222222222222222222222222 0820 2222222222222222222222222222222222222222222222222222222 0821 2222222222222222222222222222222222222222222222222222222 0822 2222222222222222222222222222222222222222222222222222222 0823 2222222222222222222222222222222222222222222222222222222 0824 2222222222222222222222222222222222222222222222222222222 0825 2222222222222222222222222222222222222222222222222222222 0826 2222222222222222222222222222222222222222222222222222222 0827 2222222222222222222222222222222222222222222222222222222 0828 2222222222222222222222222222222222222222222222222222222 0829 2222222222222222222222222222222222222222222222222222222 0830 2222222222222222222222222222222222222222222222222222222 0831 2222222222222222222222222222222222222222222222222222222 0832 2222222222222222222222222222222222222222222222222222222 0833 2222222222222222222222222222222222222222222222222222222 0834 2222222222222222222222222222222222222222222222222222222 0835 2222222222222222222222222222222222222222222222222222222 0836 2222222222222222222222222222222222222222222222222222222 0837 2222222222222222222222222222222222222222222222222222222 0838 2222222222222222222222222222222222222222222222222222222 0839 2222222222222222222222222222222222222222222222222222222 0840 2222222222222222222222222222222222222222222222222222222 0841 2222222222222222222222222222222222222222222222222222222 0842 2222222222222222222222222222222222222222222222222222222 0843 2222222222222222222222222222222222222222222222222222222 0844 2222222222222222222222222222222222222222222222222222222 0845 2222222222222222222222222222222222222222222222222222222 0846 2222222222222222222222222222222222222222222222222222222 0847 2222222222222222222222222222222222222222222222222222222 0848 2222222222222222222222222222222222222222222222222222222 0849 2222222222222222222222222222222222222222222222222222222 0850 2222222222222222222222222222222222222222222222222222222 0851 2222222222222222222222222222222222222222222222222222222 0852 2222222222222222222222222222222222222222222222222222222 0853 2222222222222222222222222222222222222222222222222222222 0854 2222222222222222222222222222222222222222222222222222222 0855 2222222222222222222222222222222222222222222222222222222 0856 2222222222222222222222222222222222222222222222222222222 0857 2222222222222222222222222222222222222222222222222222222 0858 2222222222222222222222222222222222222222222222222222222 0859 2222222222222222222222222222222222222222222222222222222 0860 2222222222222222222222222222222222222222222222222222222 0861 2222222222222222222222222222222222222222222222222222222 0862 2222222222222222222222222222222222222222222222222222222 0863 2222222222222222222222222222222222222222222222222222222 0864 2222222222222222222222222222222222222222222222222222222 0865 2222222222222222222222222222222222222222222222222222222 0866 2222222222222222222222222222222222222222222222222222222 0867 2222222222222222222222222222222222222222222222222222222 0868 2222222222222222222222222222222222222222222222222222222 0869 2222222222222222222222222222222222222222222222222222222 0870 2222222222222222222222222222222222222222222222222222222 0871 2222222222222222222222222222222222222222222222222222222 0872 2222222222222222222222222222222222222222222222222222222 0873 2222222222222222222222222222222222222222222222222222222 0874 2222222222222222222222222222222222222222222222222222222 0875 2222222222222222222222222222222222222222222222222222222 0876 2222222222222222222222222222222222222222222222222222222 0877 2222222222222222222222222222222222222222222222222222222 0878 2222222222222222222222222222222222222222222222222222222 0879 2222222222222222222222222222222222222222222222222222222 0880 2222222222222222222222222222222222222222222222222222222 0881 2222222222222222222222222222222222222222222222222222222 0882 2222222222222222222222222222222222222222222222222222222 0883 2222222222222222222222222222222222222222222222222222222 0884 2222222222222222222222222222222222222222222222222222222 0885 2222222222222222222222222222222222222222222222222222222 0886 2222222222222222222222222222222222222222222222222222222 0887 2222222222222222222222222222222222222222222222222222222 0888 2222222222222222222222222222222222222222222222222222222 0889 2222222222222222222222222222222222222222222222222222222 0890 2222222222222222222222222222222222222222222222222222222 0891 2222222222222222222222222222222222222222222222222222222 0892 2222222222222222222222222222222222222222222222222222222 0893 2222222222222222222222222222222222222222222222222222222 0894 2222222222222222222222222222222222222222222222222222222 0895 2222222222222222222222222222222222222222222222222222222 0896 2222222222222222222222222222222222222222222222222222222 0897 2222222222222222222222222222222222222222222222222222222 0898 2222222222222222222222222222222222222222222222222222222 0899 2222222222222222222222222222222222222222222222222222222 0900 2222222222222222222222222222222222222222222222222222222 0901 2222222222222222222222222222222222222222222222222222222 0902 2222222222222222222222222222222222222222222222222222222 0903 2222222222222222222222222222222222222222222222222222222 0904 2222222222222222222222222222222222222222222222222222222 0905 2222222222222222222222222222222222222222222222222222222 0906 2222222222222222222222222222222222222222222222222222222 0907 2222222222222222222222222222222222222222222222222222222 0908 2222222222222222222222222222222222222222222222222222222 0909 2222222222222222222222222222222222222222222222222222222 0910 2222222222222222222222222222222222222222222222222222222 0911 2222222222222222222222222222222222222222222222222222222 0912 2222222222222222222222222222222222222222222222222222222 0913 2222222222222222222222222222222222222222222222222222222 0914 2222222222222222222222222222222222222222222222222222222 0915 2222222222222222222222222222222222222222222222222222222 0916 2222222222222222222222222222222222222222222222222222222 0917 2222222222222222222222222222222222222222222222222222222 0918 2222222222222222222222222222222222222222222222222222222 0919 2222222222222222222222222222222222222222222222222222222 0920 2222222222222222222222222222222222222222222222222222222 0921 2222222222222222222222222222222222222222222222222222222 0922 2222222222222222222222222222222222222222222222222222222 0923 2222222222222222222222222222222222222222222222222222222 0924 2222222222222222222222222222222222222222222222222222222 0925 2222222222222222222222222222222222222222222222222222222 0926 2222222222222222222222222222222222222222222222222222222 0927 2222222222222222222222222222222222222222222222222222222 0928 2222222222222222222222222222222222222222222222222222222 0929 2222222222222222222222222222222222222222222222222222222 0930 2222222222222222222222222222222222222222222222222222222 0931 2222222222222222222222222222222222222222222222222222222 0932 2222222222222222222222222222222222222222222222222222222 0933 2222222222222222222222222222222222222222222222222222222 0934 2222222222222222222222222222222222222222222222222222222 0935 2222222222222222222222222222222222222222222222222222222 0936 2222222222222222222222222222222222222222222222222222222 0937 2222222222222222222222222222222222222222222222222222222 0938 2222222222222222222222222222222222222222222222222222222 0939 2222222222222222222222222222222222222222222222222222222 0940 2222222222222222222222222222222222222222222222222222222 0941 2222222222222222222222222222222222222222222222222222222 0942 2222222222222222222222222222222222222222222222222222222 0943 2222222222222222222222222222222222222222222222222222222 0944 2222222222222222222222222222222222222222222222222222222 0945 2222222222222222222222222222222222222222222222222222222 0946 2222222222222222222222222222222222222222222222222222222 0947 2222222222222222222222222222222222222222222222222222222 0948 2222222222222222222222222222222222222222222222222222222 0949 2222222222222222222222222222222222222222222222222222222 0950 2222222222222222222222222222222222222222222222222222222 0951 2222222222222222222222222222222222222222222222222222222 0952 2222222222222222222222222222222222222222222222222222222 0953 2222222222222222222222222222222222222222222222222222222 0954 2222222222222222222222222222222222222222222222222222222 0955 2222222222222222222222222222222222222222222222222222222 0956 2222222222222222222222222222222222222222222222222222222 0957 2222222222222222222222222222222222222222222222222222222 0958 2222222222222222222222222222222222222222222222222222222 0959 2222222222222222222222222222222222222222222222222222222 0960 2222222222222222222222222222222222222222222222222222222 0961 2222222222222222222222222222222222222222222222222222222 0962 2222222222222222222222222222222222222222222222222222222 0963 2222222222222222222222222222222222222222222222222222222 0964 2222222222222222222222222222222222222222222222222222222 0965 2222222222222222222222222222222222222222222222222222222 0966 2222222222222222222222222222222222222222222222222222222 0967 2222222222222222222222222222222222222222222222222222222 0968 2222222222222222222222222222222222222222222222222222222 0969 2222222222222222222222222222222222222222222222222222222 0970 2222222222222222222222222222222222222222222222222222222 0971 2222222222222222222222222222222222222222222222222222222 0972 2222222222222222222222222222222222222222222222222222222 0973 2222222222222222222222222222222222222222222222222222222 0974 2222222222222222222222222222222222222222222222222222222 0975 2222222222222222222222222222222222222222222222222222222 0976 2222222222222222222222222222222222222222222222222222222 0977 2222222222222222222222222222222222222222222222222222222 0978 2222222222222222222222222222222222222222222222222222222 0979 2222222222222222222222222222222222222222222222222222222 0980 2222222222222222222222222222222222222222222222222222222 0981 2222222222222222222222222222222222222222222222222222222 0982 2222222222222222222222222222222222222222222222222222222 0983 2222222222222222222222222222222222222222222222222222222 0984 2222222222222222222222222222222222222222222222222222222 0985 2222222222222222222222222222222222222222222222222222222 0986 2222222222222222222222222222222222222222222222222222222 0987 2222222222222222222222222222222222222222222222222222222 0988 2222222222222222222222222222222222222222222222222222222 0989 2222222222222222222222222222222222222222222222222222222 0990 2222222222222222222222222222222222222222222222222222222 0991 2222222222222222222222222222222222222222222222222222222 0992 2222222222222222222222222222222222222222222222222222222 0993 2222222222222222222222222222222222222222222222222222222 0994 2222222222222222222222222222222222222222222222222222222 0995 2222222222222222222222222222222222222222222222222222222 0996 2222222222222222222222222222222222222222222222222222222 0997 2222222222222222222222222222222222222222222222222222222 0998 2222222222222222222222222222222222222222222222222222222 0999 2222222222222222222222222222222222222222222222222222222 1000 2222222222222222222222222222222222222222222222222222222 1001 2222222222222222222222222222222222222222222222222222222 1002 2222222222222222222222222222222222222222222222222222222 1003 2222222222222222222222222222222222222222222222222222222 1004 2222222222222222222222222222222222222222222222222222222 1005 2222222222222222222222222222222222222222222222222222222 1006 2222222222222222222222222222222222222222222222222222222 1007 2222222222222222222222222222222222222222222222222222222 1008 2222222222222222222222222222222222222222222222222222222 1009 2222222222222222222222222222222222222222222222222222222 1010 2222222222222222222222222222222222222222222222222222222 1011 2222222222222222222222222222222222222222222222222222222 1012 2222222222222222222222222222222222222222222222222222222 1013 2222222222222222222222222222222222222222222222222222222 1014 2222222222222222222222222222222222222222222222222222222 1015 2222222222222222222222222222222222222222222222222222222 1016 2222222222222222222222222222222222222222222222222222222 1017 2222222222222222222222222222222222222222222222222222222 1018 2222222222222222222222222222222222222222222222222222222 1019 2222222222222222222222222222222222222222222222222222222 1020 2222222222222222222222222222222222222222222222222222222 1021 2222222222222222222222222222222222222222222222222222222 1022 2222222222222222222222222222222222222222222222222222222 1023 2222222222222222222222222222222222222222222222222222222 1024 2222222222222222222222222222222222222222222222222222222 1025 2222222222222222222222222222222222222222222222222222222 1026 2222222222222222222222222222222222222222222222222222222 1027 2222222222222222222222222222222222222222222222222222222 1028 2222222222222222222222222222222222222222222222222222222 1029 2222222222222222222222222222222222222222222222222222222 1030 2222222222222222222222222222222222222222222222222222222 1031 2222222222222222222222222222222222222222222222222222222 1032 2222222222222222222222222222222222222222222222222222222 1033 2222222222222222222222222222222222222222222222222222222 1034 2222222222222222222222222222222222222222222222222222222 1035 2222222222222222222222222222222222222222222222222222222 1036 2222222222222222222222222222222222222222222222222222222 1037 2222222222222222222222222222222222222222222222222222222 1038 2222222222222222222222222222222222222222222222222222222 1039 2222222222222222222222222222222222222222222222222222222 1040 2222222222222222222222222222222222222222222222222222222 1041 2222222222222222222222222222222222222222222222222222222 1042 2222222222222222222222222222222222222222222222222222222 1043 2222222222222222222222222222222222222222222222222222222 1044 2222222222222222222222222222222222222222222222222222222 1045 2222222222222222222222222222222222222222222222222222222 1046 2222222222222222222222222222222222222222222222222222222 1047 2222222222222222222222222222222222222222222222222222222 1048 2222222222222222222222222222222222222222222222222222222 1049 2222222222222222222222222222222222222222222222222222222 1050 2222222222222222222222222222222222222222222222222222222 1051 2222222222222222222222222222222222222222222222222222222 1052 2222222222222222222222222222222222222222222222222222222 1053 2222222222222222222222222222222222222222222222222222222 1054 2222222222222222222222222222222222222222222222222222222 1055 2222222222222222222222222222222222222222222222222222222 1056 2222222222222222222222222222222222222222222222222222222 1057 2222222222222222222222222222222222222222222222222222222 1058 2222222222222222222222222222222222222222222222222222222 1059 2222222222222222222222222222222222222222222222222222222 1060 2222222222222222222222222222222222222222222222222222222 1061 2222222222222222222222222222222222222222222222222222222 1062 2222222222222222222222222222222222222222222222222222222 1063 2222222222222222222222222222222222222222222222222222222 1064 2222222222222222222222222222222222222222222222222222222 1065 2222222222222222222222222222222222222222222222222222222 1066 2222222222222222222222222222222222222222222222222222222 1067 2222222222222222222222222222222222222222222222222222222 1068 2222222222222222222222222222222222222222222222222222222 1069 2222222222222222222222222222222222222222222222222222222 1070 2222222222222222222222222222222222222222222222222222222 1071 2222222222222222222222222222222222222222222222222222222 1072 2222222222222222222222222222222222222222222222222222222 1073 2222222222222222222222222222222222222222222222222222222 1074 2222222222222222222222222222222222222222222222222222222 1075 2222222222222222222222222222222222222222222222222222222 1076 2222222222222222222222222222222222222222222222222222222 1077 2222222222222222222222222222222222222222222222222222222 1078 2222222222222222222222222222222222222222222222222222222 1079 2222222222222222222222222222222222222222222222222222222 1080 2222222222222222222222222222222222222222222222222222222 1081 2222222222222222222222222222222222222222222222222222222 1082 2222222222222222222222222222222222222222222222222222222 1083 2222222222222222222222222222222222222222222222222222222 1084 2222222222222222222222222222222222222222222222222222222 1085 2222222222222222222222222222222222222222222222222222222 1086 2222222222222222222222222222222222222222222222222222222 1087 2222222222222222222222222222222222222222222222222222222 1088 2222222222222222222222222222222222222222222222222222222 1089 2222222222222222222222222222222222222222222222222222222 1090 2222222222222222222222222222222222222222222222222222222 1091 2222222222222222222222222222222222222222222222222222222 1092 2222222222222222222222222222222222222222222222222222222 1093 2222222222222222222222222222222222222222222222222222222 1094 2222222222222222222222222222222222222222222222222222222 1095 2222222222222222222222222222222222222222222222222222222 1096 2222222222222222222222222222222222222222222222222222222 1097 2222222222222222222222222222222222222222222222222222222 1098 2222222222222222222222222222222222222222222222222222222 1099 2222222222222222222222222222222222222222222222222222222 1100 2222222222222222222222222222222222222222222222222222222 1101 2222222222222222222222222222222222222222222222222222222 1102 2222222222222222222222222222222222222222222222222222222 1103 2222222222222222222222222222222222222222222222222222222 1104 2222222222222222222222222222222222222222222222222222222 1105 2222222222222222222222222222222222222222222222222222222 1106 2222222222222222222222222222222222222222222222222222222 1107 2222222222222222222222222222222222222222222222222222222 1108 2222222222222222222222222222222222222222222222222222222 1109 2222222222222222222222222222222222222222222222222222222 1110 2222222222222222222222222222222222222222222222222222222 1111 2222222222222222222222222222222222222222222222222222222 1112 2222222222222222222222222222222222222222222222222222222 1113 2222222222222222222222222222222222222222222222222222222 1114 2222222222222222222222222222222222222222222222222222222 1115 2222222222222222222222222222222222222222222222222222222 1116 2222222222222222222222222222222222222222222222222222222 1117 2222222222222222222222222222222222222222222222222222222 1118 2222222222222222222222222222222222222222222222222222222 1119 2222222222222222222222222222222222222222222222222222222 1120 2222222222222222222222222222222222222222222222222222222 1121 2222222222222222222222222222222222222222222222222222222 1122 2222222222222222222222222222222222222222222222222222222 1123 2222222222222222222222222222222222222222222222222222222 1124 2222222222222222222222222222222222222222222222222222222 1125 2222222222222222222222222222222222222222222222222222222 1126 2222222222222222222222222222222222222222222222222222222 1127 2222222222222222222222222222222222222222222222222222222 1128 2222222222222222222222222222222222222222222222222222222 1129 2222222222222222222222222222222222222222222222222222222 1130 2222222222222222222222222222222222222222222222222222222 1131 2222222222222222222222222222222222222222222222222222222 1132 2222222222222222222222222222222222222222222222222222222 1133 2222222222222222222222222222222222222222222222222222222 1134 2222222222222222222222222222222222222222222222222222222 1135 2222222222222222222222222222222222222222222222222222222 1136 2222222222222222222222222222222222222222222222222222222 1137 2222222222222222222222222222222222222222222222222222222 1138 2222222222222222222222222222222222222222222222222222222 1139 2222222222222222222222222222222222222222222222222222222 1140 2222222222222222222222222222222222222222222222222222222 1141 2222222222222222222222222222222222222222222222222222222 1142 2222222222222222222222222222222222222222222222222222222 1143 2222222222222222222222222222222222222222222222222222222 1144 2222222222222222222222222222222222222222222222222222222 1145 2222222222222222222222222222222222222222222222222222222 1146 2222222222222222222222222222222222222222222222222222222 1147 2222222222222222222222222222222222222222222222222222222 1148 2222222222222222222222222222222222222222222222222222222 1149 2222222222222222222222222222222222222222222222222222222 1150 2222222222222222222222222222222222222222222222222222222 1151 2222222222222222222222222222222222222222222222222222222 1152 2222222222222222222222222222222222222222222222222222222 1153 2222222222222222222222222222222222222222222222222222222 1154 2222222222222222222222222222222222222222222222222222222 1155 2222222222222222222222222222222222222222222222222222222 1156 2222222222222222222222222222222222222222222222222222222 1157 2222222222222222222222222222222222222222222222222222222 1158 2222222222222222222222222222222222222222222222222222222 1159 2222222222222222222222222222222222222222222222222222222 1160 2222222222222222222222222222222222222222222222222222222 1161 2222222222222222222222222222222222222222222222222222222 1162 2222222222222222222222222222222222222222222222222222222 1163 2222222222222222222222222222222222222222222222222222222 1164 2222222222222222222222222222222222222222222222222222222 1165 2222222222222222222222222222222222222222222222222222222 1166 2222222222222222222222222222222222222222222222222222222 1167 2222222222222222222222222222222222222222222222222222222 1168 2222222222222222222222222222222222222222222222222222222 1169 2222222222222222222222222222222222222222222222222222222 1170 2222222222222222222222222222222222222222222222222222222 1171 2222222222222222222222222222222222222222222222222222222 1172 2222222222222222222222222222222222222222222222222222222 1173 2222222222222222222222222222222222222222222222222222222 1174 2222222222222222222222222222222222222222222222222222222 1175 2222222222222222222222222222222222222222222222222222222 1176 2222222222222222222222222222222222222222222222222222222 1177 2222222222222222222222222222222222222222222222222222222 1178 2222222222222222222222222222222222222222222222222222222 1179 2222222222222222222222222222222222222222222222222222222 1180 2222222222222222222222222222222222222222222222222222222 1181 2222222222222222222222222222222222222222222222222222222 1182 2222222222222222222222222222222222222222222222222222222 1183 2222222222222222222222222222222222222222222222222222222 1184 2222222222222222222222222222222222222222222222222222222 1185 2222222222222222222222222222222222222222222222222222222 1186 2222222222222222222222222222222222222222222222222222222 1187 2222222222222222222222222222222222222222222222222222222 1188 2222222222222222222222222222222222222222222222222222222 1189 2222222222222222222222222222222222222222222222222222222 1190 2222222222222222222222222222222222222222222222222222222 1191 2222222222222222222222222222222222222222222222222222222 1192 2222222222222222222222222222222222222222222222222222222 1193 2222222222222222222222222222222222222222222222222222222 1194 2222222222222222222222222222222222222222222222222222222 1195 2222222222222222222222222222222222222222222222222222222 1196 2222222222222222222222222222222222222222222222222222222 1197 2222222222222222222222222222222222222222222222222222222 1198 2222222222222222222222222222222222222222222222222222222 1199 2222222222222222222222222222222222222222222222222222222 1200 2222222222222222222222222222222222222222222222222222222 1201 2222222222222222222222222222222222222222222222222222222 1202 2222222222222222222222222222222222222222222222222222222 1203 2222222222222222222222222222222222222222222222222222222 1204 2222222222222222222222222222222222222222222222222222222 1205 2222222222222222222222222222222222222222222222222222222 1206 2222222222222222222222222222222222222222222222222222222 1207 2222222222222222222222222222222222222222222222222222222 1208 2222222222222222222222222222222222222222222222222222222 1209 2222222222222222222222222222222222222222222222222222222 1210 2222222222222222222222222222222222222222222222222222222 1211 2222222222222222222222222222222222222222222222222222222 1212 2222222222222222222222222222222222222222222222222222222 1213 2222222222222222222222222222222222222222222222222222222 1214 2222222222222222222222222222222222222222222222222222222 1215 2222222222222222222222222222222222222222222222222222222 1216 2222222222222222222222222222222222222222222222222222222 1217 2222222222222222222222222222222222222222222222222222222 1218 2222222222222222222222222222222222222222222222222222222 1219 2222222222222222222222222222222222222222222222222222222 1220 2222222222222222222222222222222222222222222222222222222 1221 2222222222222222222222222222222222222222222222222222222 1222 2222222222222222222222222222222222222222222222222222222 1223 2222222222222222222222222222222222222222222222222222222 1224 2222222222222222222222222222222222222222222222222222222 1225 2222222222222222222222222222222222222222222222222222222 1226 2222222222222222222222222222222222222222222222222222222 1227 2222222222222222222222222222222222222222222222222222222 1228 2222222222222222222222222222222222222222222222222222222 1229 2222222222222222222222222222222222222222222222222222222 1230 2222222222222222222222222222222222222222222222222222222 1231 2222222222222222222222222222222222222222222222222222222 1232 2222222222222222222222222222222222222222222222222222222 1233 2222222222222222222222222222222222222222222222222222222 1234 2222222222222222222222222222222222222222222222222222222 1235 2222222222222222222222222222222222222222222222222222222 1236 2222222222222222222222222222222222222222222222222222222 1237 2222222222222222222222222222222222222222222222222222222 1238 2222222222222222222222222222222222222222222222222222222 1239 2222222222222222222222222222222222222222222222222222222 1240 2222222222222222222222222222222222222222222222222222222 1241 2222222222222222222222222222222222222222222222222222222 1242 2222222222222222222222222222222222222222222222222222222 1243 2222222222222222222222222222222222222222222222222222222 1244 2222222222222222222222222222222222222222222222222222222 1245 2222222222222222222222222222222222222222222222222222222 1246 2222222222222222222222222222222222222222222222222222222 1247 2222222222222222222222222222222222222222222222222222222 1248 2222222222222222222222222222222222222222222222222222222 1249 2222222222222222222222222222222222222222222222222222222 1250 2222222222222222222222222222222222222222222222222222222 1251 2222222222222222222222222222222222222222222222222222222 1252 2222222222222222222222222222222222222222222222222222222 1253 2222222222222222222222222222222222222222222222222222222 1254 2222222222222222222222222222222222222222222222222222222 1255 2222222222222222222222222222222222222222222222222222222 1256 2222222222222222222222222222222222222222222222222222222 1257 2222222222222222222222222222222222222222222222222222222 1258 2222222222222222222222222222222222222222222222222222222 1259 2222222222222222222222222222222222222222222222222222222 1260 2222222222222222222222222222222222222222222222222222222 1261 2222222222222222222222222222222222222222222222222222222 1262 2222222222222222222222222222222222222222222222222222222 1263 2222222222222222222222222222222222222222222222222222222 1264 2222222222222222222222222222222222222222222222222222222 1265 2222222222222222222222222222222222222222222222222222222 1266 2222222222222222222222222222222222222222222222222222222 1267 2222222222222222222222222222222222222222222222222222222 1268 2222222222222222222222222222222222222222222222222222222 1269 2222222222222222222222222222222222222222222222222222222 1270 2222222222222222222222222222222222222222222222222222222 1271 2222222222222222222222222222222222222222222222222222222 1272 2222222222222222222222222222222222222222222222222222222 1273 2222222222222222222222222222222222222222222222222222222 1274 2222222222222222222222222222222222222222222222222222222 1275 2222222222222222222222222222222222222222222222222222222 1276 2222222222222222222222222222222222222222222222222222222 1277 2222222222222222222222222222222222222222222222222222222 1278 2222222222222222222222222222222222222222222222222222222 1279 2222222222222222222222222222222222222222222222222222222 1280 2222222222222222222222222222222222222222222222222222222 1281 2222222222222222222222222222222222222222222222222222222 1282 2222222222222222222222222222222222222222222222222222222 1283 2222222222222222222222222222222222222222222222222222222 1284 2222222222222222222222222222222222222222222222222222222 1285 2222222222222222222222222222222222222222222222222222222 1286 2222222222222222222222222222222222222222222222222222222 1287 2222222222222222222222222222222222222222222222222222222 1288 2222222222222222222222222222222222222222222222222222222 1289 2222222222222222222222222222222222222222222222222222222 1290 2222222222222222222222222222222222222222222222222222222 1291 2222222222222222222222222222222222222222222222222222222 1292 2222222222222222222222222222222222222222222222222222222 1293 2222222222222222222222222222222222222222222222222222222 1294 2222222222222222222222222222222222222222222222222222222 1295 2222222222222222222222222222222222222222222222222222222 1296 2222222222222222222222222222222222222222222222222222222 1297 2222222222222222222222222222222222222222222222222222222 1298 2222222222222222222222222222222222222222222222222222222 1299 2222222222222222222222222222222222222222222222222222222 1300 2222222222222222222222222222222222222222222222222222222 1301 2222222222222222222222222222222222222222222222222222222 1302 2222222222222222222222222222222222222222222222222222222 1303 2222222222222222222222222222222222222222222222222222222 1304 2222222222222222222222222222222222222222222222222222222 1305 2222222222222222222222222222222222222222222222222222222 1306 2222222222222222222222222222222222222222222222222222222 1307 2222222222222222222222222222222222222222222222222222222 1308 2222222222222222222222222222222222222222222222222222222 1309 2222222222222222222222222222222222222222222222222222222 1310 2222222222222222222222222222222222222222222222222222222 1311 2222222222222222222222222222222222222222222222222222222 1312 2222222222222222222222222222222222222222222222222222222 1313 2222222222222222222222222222222222222222222222222222222 1314 2222222222222222222222222222222222222222222222222222222 1315 2222222222222222222222222222222222222222222222222222222 1316 2222222222222222222222222222222222222222222222222222222 1317 2222222222222222222222222222222222222222222222222222222 1318 2222222222222222222222222222222222222222222222222222222 1319 2222222222222222222222222222222222222222222222222222222 1320 2222222222222222222222222222222222222222222222222222222 1321 2222222222222222222222222222222222222222222222222222222 1322 2222222222222222222222222222222222222222222222222222222 1323 2222222222222222222222222222222222222222222222222222222 1324 2222222222222222222222222222222222222222222222222222222 1325 2222222222222222222222222222222222222222222222222222222 1326 2222222222222222222222222222222222222222222222222222222 1327 2222222222222222222222222222222222222222222222222222222 1328 2222222222222222222222222222222222222222222222222222222 1329 2222222222222222222222222222222222222222222222222222222 1330 2222222222222222222222222222222222222222222222222222222 1331 2222222222222222222222222222222222222222222222222222222 1332 2222222222222222222222222222222222222222222222222222222 1333 2222222222222222222222222222222222222222222222222222222 1334 2222222222222222222222222222222222222222222222222222222 1335 2222222222222222222222222222222222222222222222222222222 1336 2222222222222222222222222222222222222222222222222222222 1337 2222222222222222222222222222222222222222222222222222222 1338 2222222222222222222222222222222222222222222222222222222 1339 2222222222222222222222222222222222222222222222222222222 1340 2222222222222222222222222222222222222222222222222222222 1341 2222222222222222222222222222222222222222222222222222222 1342 2222222222222222222222222222222222222222222222222222222 1343 2222222222222222222222222222222222222222222222222222222 1344 2222222222222222222222222222222222222222222222222222222 1345 2222222222222222222222222222222222222222222222222222222 1346 2222222222222222222222222222222222222222222222222222222 1347 2222222222222222222222222222222222222222222222222222222 1348 2222222222222222222222222222222222222222222222222222222 1349 2222222222222222222222222222222222222222222222222222222 1350 2222222222222222222222222222222222222222222222222222222 1351 2222222222222222222222222222222222222222222222222222222 1352 2222222222222222222222222222222222222222222222222222222 1353 2222222222222222222222222222222222222222222222222222222 1354 2222222222222222222222222222222222222222222222222222222 1355 2222222222222222222222222222222222222222222222222222222 1356 2222222222222222222222222222222222222222222222222222222 1357 2222222222222222222222222222222222222222222222222222222 1358 2222222222222222222222222222222222222222222222222222222 1359 2222222222222222222222222222222222222222222222222222222 1360 2222222222222222222222222222222222222222222222222222222 1361 2222222222222222222222222222222222222222222222222222222 1362 2222222222222222222222222222222222222222222222222222222 1363 2222222222222222222222222222222222222222222222222222222 1364 2222222222222222222222222222222222222222222222222222222 1365 2222222222222222222222222222222222222222222222222222222 1366 2222222222222222222222222222222222222222222222222222222 1367 2222222222222222222222222222222222222222222222222222222 1368 2222222222222222222222222222222222222222222222222222222 1369 2222222222222222222222222222222222222222222222222222222 1370 2222222222222222222222222222222222222222222222222222222 1371 2222222222222222222222222222222222222222222222222222222 1372 2222222222222222222222222222222222222222222222222222222 1373 2222222222222222222222222222222222222222222222222222222 1374 2222222222222222222222222222222222222222222222222222222 1375 2222222222222222222222222222222222222222222222222222222 1376 2222222222222222222222222222222222222222222222222222222 1377 2222222222222222222222222222222222222222222222222222222 1378 2222222222222222222222222222222222222222222222222222222 1379 2222222222222222222222222222222222222222222222222222222 1380 2222222222222222222222222222222222222222222222222222222 1381 2222222222222222222222222222222222222222222222222222222 1382 2222222222222222222222222222222222222222222222222222222 1383 2222222222222222222222222222222222222222222222222222222 1384 2222222222222222222222222222222222222222222222222222222 1385 2222222222222222222222222222222222222222222222222222222 1386 2222222222222222222222222222222222222222222222222222222 1387 2222222222222222222222222222222222222222222222222222222 1388 2222222222222222222222222222222222222222222222222222222 1389 2222222222222222222222222222222222222222222222222222222 1390 2222222222222222222222222222222222222222222222222222222 1391 2222222222222222222222222222222222222222222222222222222 1392 2222222222222222222222222222222222222222222222222222222 1393 2222222222222222222222222222222222222222222222222222222 1394 2222222222222222222222222222222222222222222222222222222 1395 2222222222222222222222222222222222222222222222222222222 1396 2222222222222222222222222222222222222222222222222222222 1397 2222222222222222222222222222222222222222222222222222222 1398 2222222222222222222222222222222222222222222222222222222 1399 2222222222222222222222222222222222222222222222222222222 1400 2222222222222222222222222222222222222222222222222222222 1401 2222222222222222222222222222222222222222222222222222222 1402 2222222222222222222222222222222222222222222222222222222 1403 2222222222222222222222222222222222222222222222222222222 1404 2222222222222222222222222222222222222222222222222222222 1405 2222222222222222222222222222222222222222222222222222222 1406 2222222222222222222222222222222222222222222222222222222 1407 2222222222222222222222222222222222222222222222222222222 1408 2222222222222222222222222222222222222222222222222222222 1409 2222222222222222222222222222222222222222222222222222222 1410 2222222222222222222222222222222222222222222222222222222 1411 2222222222222222222222222222222222222222222222222222222 1412 2222222222222222222222222222222222222222222222222222222 1413 2222222222222222222222222222222222222222222222222222222 1414 2222222222222222222222222222222222222222222222222222222 1415 2222222222222222222222222222222222222222222222222222222 1416 2222222222222222222222222222222222222222222222222222222 1417 2222222222222222222222222222222222222222222222222222222 1418 2222222222222222222222222222222222222222222222222222222 1419 2222222222222222222222222222222222222222222222222222222 1420 2222222222222222222222222222222222222222222222222222222 1421 2222222222222222222222222222222222222222222222222222222 1422 2222222222222222222222222222222222222222222222222222222 1423 2222222222222222222222222222222222222222222222222222222 1424 2222222222222222222222222222222222222222222222222222222 1425 2222222222222222222222222222222222222222222222222222222 1426 2222222222222222222222222222222222222222222222222222222 1427 2222222222222222222222222222222222222222222222222222222 1428 2222222222222222222222222222222222222222222222222222222 1429 2222222222222222222222222222222222222222222222222222222 1430 2222222222222222222222222222222222222222222222222222222 1431 2222222222222222222222222222222222222222222222222222222 1432 2222222222222222222222222222222222222222222222222222222 1433 2222222222222222222222222222222222222222222222222222222 1434 2222222222222222222222222222222222222222222222222222222 1435 2222222222222222222222222222222222222222222222222222222 1436 2222222222222222222222222222222222222222222222222222222 1437 2222222222222222222222222222222222222222222222222222222 1438 2222222222222222222222222222222222222222222222222222222 1439 2222222222222222222222222222222222222222222222222222222 1440 2222222222222222222222222222222222222222222222222222222 1441 2222222222222222222222222222222222222222222222222222222 1442 2222222222222222222222222222222222222222222222222222222 1443 2222222222222222222222222222222222222222222222222222222 1444 2222222222222222222222222222222222222222222222222222222 1445 2222222222222222222222222222222222222222222222222222222 1446 2222222222222222222222222222222222222222222222222222222 1447 2222222222222222222222222222222222222222222222222222222 1448 2222222222222222222222222222222222222222222222222222222 1449 2222222222222222222222222222222222222222222222222222222 1450 2222222222222222222222222222222222222222222222222222222 1451 2222222222222222222222222222222222222222222222222222222 1452 2222222222222222222222222222222222222222222222222222222 1453 2222222222222222222222222222222222222222222222222222222 1454 2222222222222222222222222222222222222222222222222222222 1455 2222222222222222222222222222222222222222222222222222222 1456 2222222222222222222222222222222222222222222222222222222 1457 2222222222222222222222222222222222222222222222222222222 1458 2222222222222222222222222222222222222222222222222222222 1459 2222222222222222222222222222222222222222222222222222222 1460 2222222222222222222222222222222222222222222222222222222 1461 2222222222222222222222222222222222222222222222222222222 1462 2222222222222222222222222222222222222222222222222222222 1463 2222222222222222222222222222222222222222222222222222222 1464 2222222222222222222222222222222222222222222222222222222 1465 2222222222222222222222222222222222222222222222222222222 1466 2222222222222222222222222222222222222222222222222222222 1467 2222222222222222222222222222222222222222222222222222222 1468 2222222222222222222222222222222222222222222222222222222 1469 2222222222222222222222222222222222222222222222222222222 1470 2222222222222222222222222222222222222222222222222222222 1471 2222222222222222222222222222222222222222222222222222222 1472 2222222222222222222222222222222222222222222222222222222 1473 2222222222222222222222222222222222222222222222222222222 1474 2222222222222222222222222222222222222222222222222222222 1475 2222222222222222222222222222222222222222222222222222222 1476 2222222222222222222222222222222222222222222222222222222 1477 2222222222222222222222222222222222222222222222222222222 1478 2222222222222222222222222222222222222222222222222222222 1479 2222222222222222222222222222222222222222222222222222222 1480 2222222222222222222222222222222222222222222222222222222 1481 2222222222222222222222222222222222222222222222222222222 1482 2222222222222222222222222222222222222222222222222222222 1483 2222222222222222222222222222222222222222222222222222222 1484 2222222222222222222222222222222222222222222222222222222 1485 2222222222222222222222222222222222222222222222222222222 1486 2222222222222222222222222222222222222222222222222222222 1487 2222222222222222222222222222222222222222222222222222222 1488 2222222222222222222222222222222222222222222222222222222 1489 2222222222222222222222222222222222222222222222222222222 1490 2222222222222222222222222222222222222222222222222222222 1491 2222222222222222222222222222222222222222222222222222222 1492 2222222222222222222222222222222222222222222222222222222 1493 2222222222222222222222222222222222222222222222222222222 1494 2222222222222222222222222222222222222222222222222222222 1495 2222222222222222222222222222222222222222222222222222222 1496 2222222222222222222222222222222222222222222222222222222 1497 2222222222222222222222222222222222222222222222222222222 1498 2222222222222222222222222222222222222222222222222222222 1499 2222222222222222222222222222222222222222222222222222222 1500 2222222222222222222222222222222222222222222222222222222 1501 2222222222222222222222222222222222222222222222222222222 1502 2222222222222222222222222222222222222222222222222222222 1503 2222222222222222222222222222222222222222222222222222222 1504 2222222222222222222222222222222222222222222222222222222 1505 2222222222222222222222222222222222222222222222222222222 1506 2222222222222222222222222222222222222222222222222222222 1507 2222222222222222222222222222222222222222222222222222222 1508 2222222222222222222222222222222222222222222222222222222 1509 2222222222222222222222222222222222222222222222222222222 1510 2222222222222222222222222222222222222222222222222222222 1511 2222222222222222222222222222222222222222222222222222222 1512 2222222222222222222222222222222222222222222222222222222 1513 2222222222222222222222222222222222222222222222222222222 1514 2222222222222222222222222222222222222222222222222222222 1515 2222222222222222222222222222222222222222222222222222222 1516 2222222222222222222222222222222222222222222222222222222 1517 2222222222222222222222222222222222222222222222222222222 1518 2222222222222222222222222222222222222222222222222222222 1519 2222222222222222222222222222222222222222222222222222222 1520 2222222222222222222222222222222222222222222222222222222 1521 2222222222222222222222222222222222222222222222222222222 1522 2222222222222222222222222222222222222222222222222222222 1523 2222222222222222222222222222222222222222222222222222222 1524 2222222222222222222222222222222222222222222222222222222 1525 2222222222222222222222222222222222222222222222222222222 1526 2222222222222222222222222222222222222222222222222222222 1527 2222222222222222222222222222222222222222222222222222222 1528 2222222222222222222222222222222222222222222222222222222 1529 2222222222222222222222222222222222222222222222222222222 1530 2222222222222222222222222222222222222222222222222222222 1531 2222222222222222222222222222222222222222222222222222222 1532 2222222222222222222222222222222222222222222222222222222 1533 2222222222222222222222222222222222222222222222222222222 1534 2222222222222222222222222222222222222222222222222222222 1535 2222222222222222222222222222222222222222222222222222222 1536 2222222222222222222222222222222222222222222222222222222 1537 2222222222222222222222222222222222222222222222222222222 1538 2222222222222222222222222222222222222222222222222222222 1539 2222222222222222222222222222222222222222222222222222222 1540 2222222222222222222222222222222222222222222222222222222 1541 2222222222222222222222222222222222222222222222222222222 1542 2222222222222222222222222222222222222222222222222222222 1543 2222222222222222222222222222222222222222222222222222222 1544 2222222222222222222222222222222222222222222222222222222 1545 2222222222222222222222222222222222222222222222222222222 1546 2222222222222222222222222222222222222222222222222222222 1547 2222222222222222222222222222222222222222222222222222222 1548 2222222222222222222222222222222222222222222222222222222 1549 2222222222222222222222222222222222222222222222222222222 1550 2222222222222222222222222222222222222222222222222222222 1551 2222222222222222222222222222222222222222222222222222222 1552 2222222222222222222222222222222222222222222222222222222 1553 2222222222222222222222222222222222222222222222222222222 1554 2222222222222222222222222222222222222222222222222222222 1555 2222222222222222222222222222222222222222222222222222222 1556 2222222222222222222222222222222222222222222222222222222 1557 2222222222222222222222222222222222222222222222222222222 1558 2222222222222222222222222222222222222222222222222222222 1559 2222222222222222222222222222222222222222222222222222222 1560 2222222222222222222222222222222222222222222222222222222 1561 2222222222222222222222222222222222222222222222222222222 1562 2222222222222222222222222222222222222222222222222222222 1563 2222222222222222222222222222222222222222222222222222222 1564 2222222222222222222222222222222222222222222222222222222 1565 2222222222222222222222222222222222222222222222222222222 1566 2222222222222222222222222222222222222222222222222222222 1567 2222222222222222222222222222222222222222222222222222222 1568 2222222222222222222222222222222222222222222222222222222 1569 2222222222222222222222222222222222222222222222222222222 1570 2222222222222222222222222222222222222222222222222222222 1571 2222222222222222222222222222222222222222222222222222222 1572 2222222222222222222222222222222222222222222222222222222 1573 2222222222222222222222222222222222222222222222222222222 1574 2222222222222222222222222222222222222222222222222222222 1575 2222222222222222222222222222222222222222222222222222222 1576 2222222222222222222222222222222222222222222222222222222 1577 2222222222222222222222222222222222222222222222222222222 1578 2222222222222222222222222222222222222222222222222222222 1579 2222222222222222222222222222222222222222222222222222222 1580 2222222222222222222222222222222222222222222222222222222 1581 2222222222222222222222222222222222222222222222222222222 1582 2222222222222222222222222222222222222222222222222222222 1583 2222222222222222222222222222222222222222222222222222222 1584 2222222222222222222222222222222222222222222222222222222 1585 2222222222222222222222222222222222222222222222222222222 1586 2222222222222222222222222222222222222222222222222222222 1587 2222222222222222222222222222222222222222222222222222222 1588 2222222222222222222222222222222222222222222222222222222 1589 2222222222222222222222222222222222222222222222222222222 1590 2222222222222222222222222222222222222222222222222222222 1591 2222222222222222222222222222222222222222222222222222222 1592 2222222222222222222222222222222222222222222222222222222 1593 2222222222222222222222222222222222222222222222222222222 1594 2222222222222222222222222222222222222222222222222222222 1595 2222222222222222222222222222222222222222222222222222222 1596 2222222222222222222222222222222222222222222222222222222 1597 2222222222222222222222222222222222222222222222222222222 1598 2222222222222222222222222222222222222222222222222222222 1599 2222222222222222222222222222222222222222222222222222222 1600 2222222222222222222222222222222222222222222222222222222 1601 2222222222222222222222222222222222222222222222222222222 1602 2222222222222222222222222222222222222222222222222222222 1603 2222222222222222222222222222222222222222222222222222222 1604 2222222222222222222222222222222222222222222222222222222 1605 2222222222222222222222222222222222222222222222222222222 1606 2222222222222222222222222222222222222222222222222222222 1607 2222222222222222222222222222222222222222222222222222222 1608 2222222222222222222222222222222222222222222222222222222 1609 2222222222222222222222222222222222222222222222222222222 1610 2222222222222222222222222222222222222222222222222222222 1611 2222222222222222222222222222222222222222222222222222222 1612 2222222222222222222222222222222222222222222222222222222 1613 2222222222222222222222222222222222222222222222222222222 1614 2222222222222222222222222222222222222222222222222222222 1615 2222222222222222222222222222222222222222222222222222222 1616 2222222222222222222222222222222222222222222222222222222 1617 2222222222222222222222222222222222222222222222222222222 1618 2222222222222222222222222222222222222222222222222222222 1619 2222222222222222222222222222222222222222222222222222222 1620 2222222222222222222222222222222222222222222222222222222 1621 2222222222222222222222222222222222222222222222222222222 1622 2222222222222222222222222222222222222222222222222222222 1623 2222222222222222222222222222222222222222222222222222222 1624 2222222222222222222222222222222222222222222222222222222 1625 2222222222222222222222222222222222222222222222222222222 1626 2222222222222222222222222222222222222222222222222222222 1627 2222222222222222222222222222222222222222222222222222222 1628 2222222222222222222222222222222222222222222222222222222 1629 2222222222222222222222222222222222222222222222222222222 1630 2222222222222222222222222222222222222222222222222222222 1631 2222222222222222222222222222222222222222222222222222222 1632 2222222222222222222222222222222222222222222222222222222 1633 2222222222222222222222222222222222222222222222222222222 1634 2222222222222222222222222222222222222222222222222222222 1635 2222222222222222222222222222222222222222222222222222222 1636 2222222222222222222222222222222222222222222222222222222 1637 2222222222222222222222222222222222222222222222222222222 1638 2222222222222222222222222222222222222222222222222222222 1639 2222222222222222222222222222222222222222222222222222222 1640 2222222222222222222222222222222222222222222222222222222 1641 2222222222222222222222222222222222222222222222222222222 1642 2222222222222222222222222222222222222222222222222222222 1643 2222222222222222222222222222222222222222222222222222222 1644 2222222222222222222222222222222222222222222222222222222 1645 2222222222222222222222222222222222222222222222222222222 1646 2222222222222222222222222222222222222222222222222222222 1647 2222222222222222222222222222222222222222222222222222222 1648 2222222222222222222222222222222222222222222222222222222 1649 2222222222222222222222222222222222222222222222222222222 1650 2222222222222222222222222222222222222222222222222222222 1651 2222222222222222222222222222222222222222222222222222222 1652 2222222222222222222222222222222222222222222222222222222 1653 2222222222222222222222222222222222222222222222222222222 1654 2222222222222222222222222222222222222222222222222222222 1655 2222222222222222222222222222222222222222222222222222222 1656 2222222222222222222222222222222222222222222222222222222 1657 2222222222222222222222222222222222222222222222222222222 1658 2222222222222222222222222222222222222222222222222222222 1659 2222222222222222222222222222222222222222222222222222222 1660 2222222222222222222222222222222222222222222222222222222 1661 2222222222222222222222222222222222222222222222222222222 1662 2222222222222222222222222222222222222222222222222222222 1663 2222222222222222222222222222222222222222222222222222222 1664 2222222222222222222222222222222222222222222222222222222 1665 2222222222222222222222222222222222222222222222222222222 1666 2222222222222222222222222222222222222222222222222222222 1667 2222222222222222222222222222222222222222222222222222222 1668 2222222222222222222222222222222222222222222222222222222 1669 2222222222222222222222222222222222222222222222222222222 1670 2222222222222222222222222222222222222222222222222222222 1671 2222222222222222222222222222222222222222222222222222222 1672 2222222222222222222222222222222222222222222222222222222 1673 2222222222222222222222222222222222222222222222222222222 1674 2222222222222222222222222222222222222222222222222222222 1675 2222222222222222222222222222222222222222222222222222222 1676 2222222222222222222222222222222222222222222222222222222 1677 2222222222222222222222222222222222222222222222222222222 1678 2222222222222222222222222222222222222222222222222222222 1679 2222222222222222222222222222222222222222222222222222222 1680 2222222222222222222222222222222222222222222222222222222 1681 2222222222222222222222222222222222222222222222222222222 1682 2222222222222222222222222222222222222222222222222222222 1683 2222222222222222222222222222222222222222222222222222222 1684 2222222222222222222222222222222222222222222222222222222 1685 2222222222222222222222222222222222222222222222222222222 1686 2222222222222222222222222222222222222222222222222222222 1687 2222222222222222222222222222222222222222222222222222222 1688 2222222222222222222222222222222222222222222222222222222 1689 2222222222222222222222222222222222222222222222222222222 1690 2222222222222222222222222222222222222222222222222222222 1691 2222222222222222222222222222222222222222222222222222222 1692 2222222222222222222222222222222222222222222222222222222 1693 2222222222222222222222222222222222222222222222222222222 1694 2222222222222222222222222222222222222222222222222222222 1695 2222222222222222222222222222222222222222222222222222222 1696 2222222222222222222222222222222222222222222222222222222 1697 2222222222222222222222222222222222222222222222222222222 1698 2222222222222222222222222222222222222222222222222222222 1699 2222222222222222222222222222222222222222222222222222222 1700 2222222222222222222222222222222222222222222222222222222 1701 2222222222222222222222222222222222222222222222222222222 1702 2222222222222222222222222222222222222222222222222222222 1703 2222222222222222222222222222222222222222222222222222222 1704 2222222222222222222222222222222222222222222222222222222 1705 2222222222222222222222222222222222222222222222222222222 1706 2222222222222222222222222222222222222222222222222222222 1707 2222222222222222222222222222222222222222222222222222222 1708 2222222222222222222222222222222222222222222222222222222 1709 2222222222222222222222222222222222222222222222222222222 1710 2222222222222222222222222222222222222222222222222222222 1711 2222222222222222222222222222222222222222222222222222222 1712 2222222222222222222222222222222222222222222222222222222 1713 2222222222222222222222222222222222222222222222222222222 1714 2222222222222222222222222222222222222222222222222222222 1715 2222222222222222222222222222222222222222222222222222222 1716 2222222222222222222222222222222222222222222222222222222 1717 2222222222222222222222222222222222222222222222222222222 1718 2222222222222222222222222222222222222222222222222222222 1719 2222222222222222222222222222222222222222222222222222222 1720 2222222222222222222222222222222222222222222222222222222 1721 2222222222222222222222222222222222222222222222222222222 1722 2222222222222222222222222222222222222222222222222222222 1723 2222222222222222222222222222222222222222222222222222222 1724 2222222222222222222222222222222222222222222222222222222 1725 2222222222222222222222222222222222222222222222222222222 1726 2222222222222222222222222222222222222222222222222222222 1727 2222222222222222222222222222222222222222222222222222222 1728 2222222222222222222222222222222222222222222222222222222 1729 2222222222222222222222222222222222222222222222222222222 1730 2222222222222222222222222222222222222222222222222222222 1731 2222222222222222222222222222222222222222222222222222222 1732 2222222222222222222222222222222222222222222222222222222 1733 2222222222222222222222222222222222222222222222222222222 1734 2222222222222222222222222222222222222222222222222222222 1735 2222222222222222222222222222222222222222222222222222222 1736 2222222222222222222222222222222222222222222222222222222 1737 2222222222222222222222222222222222222222222222222222222 1738 2222222222222222222222222222222222222222222222222222222 1739 2222222222222222222222222222222222222222222222222222222 1740 2222222222222222222222222222222222222222222222222222222 1741 2222222222222222222222222222222222222222222222222222222 1742 2222222222222222222222222222222222222222222222222222222 1743 2222222222222222222222222222222222222222222222222222222 1744 2222222222222222222222222222222222222222222222222222222 1745 2222222222222222222222222222222222222222222222222222222 1746 2222222222222222222222222222222222222222222222222222222 1747 2222222222222222222222222222222222222222222222222222222 1748 2222222222222222222222222222222222222222222222222222222 1749 2222222222222222222222222222222222222222222222222222222 1750 2222222222222222222222222222222222222222222222222222222 1751 2222222222222222222222222222222222222222222222222222222 1752 2222222222222222222222222222222222222222222222222222222 1753 2222222222222222222222222222222222222222222222222222222 1754 2222222222222222222222222222222222222222222222222222222 1755 2222222222222222222222222222222222222222222222222222222 1756 2222222222222222222222222222222222222222222222222222222 1757 2222222222222222222222222222222222222222222222222222222 1758 2222222222222222222222222222222222222222222222222222222 1759 2222222222222222222222222222222222222222222222222222222 1760 2222222222222222222222222222222222222222222222222222222 1761 2222222222222222222222222222222222222222222222222222222 1762 2222222222222222222222222222222222222222222222222222222 1763 2222222222222222222222222222222222222222222222222222222 1764 2222222222222222222222222222222222222222222222222222222 1765 2222222222222222222222222222222222222222222222222222222 1766 2222222222222222222222222222222222222222222222222222222 1767 2222222222222222222222222222222222222222222222222222222 1768 2222222222222222222222222222222222222222222222222222222 1769 2222222222222222222222222222222222222222222222222222222 1770 2222222222222222222222222222222222222222222222222222222 1771 2222222222222222222222222222222222222222222222222222222 1772 2222222222222222222222222222222222222222222222222222222 1773 2222222222222222222222222222222222222222222222222222222 1774 2222222222222222222222222222222222222222222222222222222 1775 2222222222222222222222222222222222222222222222222222222 1776 2222222222222222222222222222222222222222222222222222222 1777 2222222222222222222222222222222222222222222222222222222 1778 2222222222222222222222222222222222222222222222222222222 1779 2222222222222222222222222222222222222222222222222222222 1780 2222222222222222222222222222222222222222222222222222222 1781 2222222222222222222222222222222222222222222222222222222 1782 2222222222222222222222222222222222222222222222222222222 1783 2222222222222222222222222222222222222222222222222222222 1784 2222222222222222222222222222222222222222222222222222222 1785 2222222222222222222222222222222222222222222222222222222 1786 2222222222222222222222222222222222222222222222222222222 1787 2222222222222222222222222222222222222222222222222222222 1788 2222222222222222222222222222222222222222222222222222222 1789 2222222222222222222222222222222222222222222222222222222 1790 2222222222222222222222222222222222222222222222222222222 1791 2222222222222222222222222222222222222222222222222222222 1792 2222222222222222222222222222222222222222222222222222222 1793 2222222222222222222222222222222222222222222222222222222 1794 2222222222222222222222222222222222222222222222222222222 1795 2222222222222222222222222222222222222222222222222222222 1796 2222222222222222222222222222222222222222222222222222222 1797 2222222222222222222222222222222222222222222222222222222 1798 2222222222222222222222222222222222222222222222222222222 1799 2222222222222222222222222222222222222222222222222222222 1800 2222222222222222222222222222222222222222222222222222222 1801 2222222222222222222222222222222222222222222222222222222 1802 2222222222222222222222222222222222222222222222222222222 1803 2222222222222222222222222222222222222222222222222222222 1804 2222222222222222222222222222222222222222222222222222222 1805 2222222222222222222222222222222222222222222222222222222 1806 2222222222222222222222222222222222222222222222222222222 1807 2222222222222222222222222222222222222222222222222222222 1808 2222222222222222222222222222222222222222222222222222222 1809 2222222222222222222222222222222222222222222222222222222 1810 2222222222222222222222222222222222222222222222222222222 1811 2222222222222222222222222222222222222222222222222222222 1812 2222222222222222222222222222222222222222222222222222222 1813 2222222222222222222222222222222222222222222222222222222 1814 2222222222222222222222222222222222222222222222222222222 1815 2222222222222222222222222222222222222222222222222222222 1816 2222222222222222222222222222222222222222222222222222222 1817 2222222222222222222222222222222222222222222222222222222 1818 2222222222222222222222222222222222222222222222222222222 1819 2222222222222222222222222222222222222222222222222222222 1820 2222222222222222222222222222222222222222222222222222222 1821 2222222222222222222222222222222222222222222222222222222 1822 2222222222222222222222222222222222222222222222222222222 1823 2222222222222222222222222222222222222222222222222222222 1824 2222222222222222222222222222222222222222222222222222222 1825 2222222222222222222222222222222222222222222222222222222 1826 2222222222222222222222222222222222222222222222222222222 1827 2222222222222222222222222222222222222222222222222222222 1828 2222222222222222222222222222222222222222222222222222222 1829 2222222222222222222222222222222222222222222222222222222 1830 2222222222222222222222222222222222222222222222222222222 1831 2222222222222222222222222222222222222222222222222222222 1832 2222222222222222222222222222222222222222222222222222222 1833 2222222222222222222222222222222222222222222222222222222 1834 2222222222222222222222222222222222222222222222222222222 1835 2222222222222222222222222222222222222222222222222222222 1836 2222222222222222222222222222222222222222222222222222222 1837 2222222222222222222222222222222222222222222222222222222 1838 2222222222222222222222222222222222222222222222222222222 1839 2222222222222222222222222222222222222222222222222222222 1840 2222222222222222222222222222222222222222222222222222222 1841 2222222222222222222222222222222222222222222222222222222 1842 2222222222222222222222222222222222222222222222222222222 1843 2222222222222222222222222222222222222222222222222222222 1844 2222222222222222222222222222222222222222222222222222222 1845 2222222222222222222222222222222222222222222222222222222 1846 2222222222222222222222222222222222222222222222222222222 1847 2222222222222222222222222222222222222222222222222222222 1848 2222222222222222222222222222222222222222222222222222222 1849 2222222222222222222222222222222222222222222222222222222 1850 2222222222222222222222222222222222222222222222222222222 1851 2222222222222222222222222222222222222222222222222222222 1852 2222222222222222222222222222222222222222222222222222222 1853 2222222222222222222222222222222222222222222222222222222 1854 2222222222222222222222222222222222222222222222222222222 1855 2222222222222222222222222222222222222222222222222222222 1856 2222222222222222222222222222222222222222222222222222222 1857 2222222222222222222222222222222222222222222222222222222 1858 2222222222222222222222222222222222222222222222222222222 1859 2222222222222222222222222222222222222222222222222222222 1860 2222222222222222222222222222222222222222222222222222222 1861 2222222222222222222222222222222222222222222222222222222 1862 2222222222222222222222222222222222222222222222222222222 1863 2222222222222222222222222222222222222222222222222222222 1864 2222222222222222222222222222222222222222222222222222222 1865 2222222222222222222222222222222222222222222222222222222 1866 2222222222222222222222222222222222222222222222222222222 1867 2222222222222222222222222222222222222222222222222222222 1868 2222222222222222222222222222222222222222222222222222222 1869 2222222222222222222222222222222222222222222222222222222 1870 2222222222222222222222222222222222222222222222222222222 1871 2222222222222222222222222222222222222222222222222222222 1872 2222222222222222222222222222222222222222222222222222222 1873 2222222222222222222222222222222222222222222222222222222 1874 2222222222222222222222222222222222222222222222222222222 1875 2222222222222222222222222222222222222222222222222222222 1876 2222222222222222222222222222222222222222222222222222222 1877 2222222222222222222222222222222222222222222222222222222 1878 2222222222222222222222222222222222222222222222222222222 1879 2222222222222222222222222222222222222222222222222222222 1880 2222222222222222222222222222222222222222222222222222222 1881 2222222222222222222222222222222222222222222222222222222 1882 2222222222222222222222222222222222222222222222222222222 1883 2222222222222222222222222222222222222222222222222222222 1884 2222222222222222222222222222222222222222222222222222222 1885 2222222222222222222222222222222222222222222222222222222 1886 2222222222222222222222222222222222222222222222222222222 1887 2222222222222222222222222222222222222222222222222222222 1888 2222222222222222222222222222222222222222222222222222222 1889 2222222222222222222222222222222222222222222222222222222 1890 2222222222222222222222222222222222222222222222222222222 1891 2222222222222222222222222222222222222222222222222222222 1892 2222222222222222222222222222222222222222222222222222222 1893 2222222222222222222222222222222222222222222222222222222 1894 2222222222222222222222222222222222222222222222222222222 1895 2222222222222222222222222222222222222222222222222222222 1896 2222222222222222222222222222222222222222222222222222222 1897 2222222222222222222222222222222222222222222222222222222 1898 2222222222222222222222222222222222222222222222222222222 1899 2222222222222222222222222222222222222222222222222222222 1900 2222222222222222222222222222222222222222222222222222222 1901 2222222222222222222222222222222222222222222222222222222 1902 2222222222222222222222222222222222222222222222222222222 1903 2222222222222222222222222222222222222222222222222222222 1904 2222222222222222222222222222222222222222222222222222222 1905 2222222222222222222222222222222222222222222222222222222 1906 2222222222222222222222222222222222222222222222222222222 1907 2222222222222222222222222222222222222222222222222222222 1908 2222222222222222222222222222222222222222222222222222222 1909 2222222222222222222222222222222222222222222222222222222 1910 2222222222222222222222222222222222222222222222222222222 1911 2222222222222222222222222222222222222222222222222222222 1912 2222222222222222222222222222222222222222222222222222222 1913 2222222222222222222222222222222222222222222222222222222 1914 2222222222222222222222222222222222222222222222222222222 1915 2222222222222222222222222222222222222222222222222222222 1916 2222222222222222222222222222222222222222222222222222222 1917 2222222222222222222222222222222222222222222222222222222 1918 2222222222222222222222222222222222222222222222222222222 1919 2222222222222222222222222222222222222222222222222222222 1920 2222222222222222222222222222222222222222222222222222222 1921 2222222222222222222222222222222222222222222222222222222 1922 2222222222222222222222222222222222222222222222222222222 1923 2222222222222222222222222222222222222222222222222222222 1924 2222222222222222222222222222222222222222222222222222222 1925 2222222222222222222222222222222222222222222222222222222 1926 2222222222222222222222222222222222222222222222222222222 1927 2222222222222222222222222222222222222222222222222222222 1928 2222222222222222222222222222222222222222222222222222222 1929 2222222222222222222222222222222222222222222222222222222 1930 2222222222222222222222222222222222222222222222222222222 1931 2222222222222222222222222222222222222222222222222222222 1932 2222222222222222222222222222222222222222222222222222222 1933 2222222222222222222222222222222222222222222222222222222 1934 2222222222222222222222222222222222222222222222222222222 1935 2222222222222222222222222222222222222222222222222222222 1936 2222222222222222222222222222222222222222222222222222222 1937 2222222222222222222222222222222222222222222222222222222 1938 2222222222222222222222222222222222222222222222222222222 1939 2222222222222222222222222222222222222222222222222222222 1940 2222222222222222222222222222222222222222222222222222222 1941 2222222222222222222222222222222222222222222222222222222 1942 2222222222222222222222222222222222222222222222222222222 1943 2222222222222222222222222222222222222222222222222222222 1944 2222222222222222222222222222222222222222222222222222222 1945 2222222222222222222222222222222222222222222222222222222 1946 2222222222222222222222222222222222222222222222222222222 1947 2222222222222222222222222222222222222222222222222222222 1948 2222222222222222222222222222222222222222222222222222222 1949 2222222222222222222222222222222222222222222222222222222 1950 2222222222222222222222222222222222222222222222222222222 1951 2222222222222222222222222222222222222222222222222222222 1952 2222222222222222222222222222222222222222222222222222222 1953 2222222222222222222222222222222222222222222222222222222 1954 2222222222222222222222222222222222222222222222222222222 1955 2222222222222222222222222222222222222222222222222222222 1956 2222222222222222222222222222222222222222222222222222222 1957 2222222222222222222222222222222222222222222222222222222 1958 2222222222222222222222222222222222222222222222222222222 1959 2222222222222222222222222222222222222222222222222222222 1960 2222222222222222222222222222222222222222222222222222222 1961 2222222222222222222222222222222222222222222222222222222 1962 2222222222222222222222222222222222222222222222222222222 1963 2222222222222222222222222222222222222222222222222222222 1964 2222222222222222222222222222222222222222222222222222222 1965 2222222222222222222222222222222222222222222222222222222 1966 2222222222222222222222222222222222222222222222222222222 1967 2222222222222222222222222222222222222222222222222222222 1968 2222222222222222222222222222222222222222222222222222222 1969 2222222222222222222222222222222222222222222222222222222 1970 2222222222222222222222222222222222222222222222222222222 1971 2222222222222222222222222222222222222222222222222222222 1972 2222222222222222222222222222222222222222222222222222222 1973 2222222222222222222222222222222222222222222222222222222 1974 2222222222222222222222222222222222222222222222222222222 1975 2222222222222222222222222222222222222222222222222222222 1976 2222222222222222222222222222222222222222222222222222222 1977 2222222222222222222222222222222222222222222222222222222 1978 2222222222222222222222222222222222222222222222222222222 1979 2222222222222222222222222222222222222222222222222222222 1980 2222222222222222222222222222222222222222222222222222222 1981 2222222222222222222222222222222222222222222222222222222 1982 2222222222222222222222222222222222222222222222222222222 1983 2222222222222222222222222222222222222222222222222222222 1984 2222222222222222222222222222222222222222222222222222222 1985 2222222222222222222222222222222222222222222222222222222 1986 2222222222222222222222222222222222222222222222222222222 1987 2222222222222222222222222222222222222222222222222222222 1988 2222222222222222222222222222222222222222222222222222222 1989 2222222222222222222222222222222222222222222222222222222 1990 2222222222222222222222222222222222222222222222222222222 1991 2222222222222222222222222222222222222222222222222222222 1992 2222222222222222222222222222222222222222222222222222222 1993 2222222222222222222222222222222222222222222222222222222 1994 2222222222222222222222222222222222222222222222222222222 1995 2222222222222222222222222222222222222222222222222222222 1996 2222222222222222222222222222222222222222222222222222222 1997 2222222222222222222222222222222222222222222222222222222 1998 2222222222222222222222222222222222222222222222222222222 1999 2222222222222222222222222222222222222222222222222222222 2000 2222222222222222222222222222222222222222222222222222222 2001 2222222222222222222222222222222222222222222222222222222 2002 2222222222222222222222222222222222222222222222222222222 2003 2222222222222222222222222222222222222222222222222222222 2004 2222222222222222222222222222222222222222222222222222222 2005 2222222222222222222222222222222222222222222222222222222 2006 2222222222222222222222222222222222222222222222222222222 2007 2222222222222222222222222222222222222222222222222222222 2008 2222222222222222222222222222222222222222222222222222222 2009 2222222222222222222222222222222222222222222222222222222 2010 2222222222222222222222222222222222222222222222222222222 2011 2222222222222222222222222222222222222222222222222222222 2012 2222222222222222222222222222222222222222222222222222222 2013 2222222222222222222222222222222222222222222222222222222 2014 2222222222222222222222222222222222222222222222222222222 2015 2222222222222222222222222222222222222222222222222222222 2016 2222222222222222222222222222222222222222222222222222222 2017 2222222222222222222222222222222222222222222222222222222 2018 2222222222222222222222222222222222222222222222222222222 2019 2222222222222222222222222222222222222222222222222222222 2020 2222222222222222222222222222222222222222222222222222222 2021 2222222222222222222222222222222222222222222222222222222 2022 2222222222222222222222222222222222222222222222222222222 2023 2222222222222222222222222222222222222222222222222222222 2024 2222222222222222222222222222222222222222222222222222222 2025 2222222222222222222222222222222222222222222222222222222 2026 2222222222222222222222222222222222222222222222222222222 2027 2222222222222222222222222222222222222222222222222222222 2028 2222222222222222222222222222222222222222222222222222222 2029 2222222222222222222222222222222222222222222222222222222 2030 2222222222222222222222222222222222222222222222222222222 2031 2222222222222222222222222222222222222222222222222222222 2032 2222222222222222222222222222222222222222222222222222222 2033 2222222222222222222222222222222222222222222222222222222 2034 2222222222222222222222222222222222222222222222222222222 2035 2222222222222222222222222222222222222222222222222222222 2036 2222222222222222222222222222222222222222222222222222222 2037 2222222222222222222222222222222222222222222222222222222 2038 2222222222222222222222222222222222222222222222222222222 2039 2222222222222222222222222222222222222222222222222222222 2040 2222222222222222222222222222222222222222222222222222222 2041 2222222222222222222222222222222222222222222222222222222 2042 2222222222222222222222222222222222222222222222222222222 2043 2222222222222222222222222222222222222222222222222222222 2044 2222222222222222222222222222222222222222222222222222222 2045 2222222222222222222222222222222222222222222222222222222 2046 2222222222222222222222222222222222222222222222222222222 2047 2222222222222222222222222222222222222222222222222222222 2048 2222222222222222222222222222222222222222222222222222222 2049 2222222222222222222222222222222222222222222222222222222 2050 2222222222222222222222222222222222222222222222222222222 2051 2222222222222222222222222222222222222222222222222222222 2052 2222222222222222222222222222222222222222222222222222222 2053 2222222222222222222222222222222222222222222222222222222 2054 2222222222222222222222222222222222222222222222222222222 2055 2222222222222222222222222222222222222222222222222222222 2056 2222222222222222222222222222222222222222222222222222222 2057 2222222222222222222222222222222222222222222222222222222 2058 2222222222222222222222222222222222222222222222222222222 2059 2222222222222222222222222222222222222222222222222222222 2060 2222222222222222222222222222222222222222222222222222222 2061 2222222222222222222222222222222222222222222222222222222 2062 2222222222222222222222222222222222222222222222222222222 2063 2222222222222222222222222222222222222222222222222222222 2064 2222222222222222222222222222222222222222222222222222222 2065 2222222222222222222222222222222222222222222222222222222 2066 2222222222222222222222222222222222222222222222222222222 2067 2222222222222222222222222222222222222222222222222222222 2068 2222222222222222222222222222222222222222222222222222222 2069 2222222222222222222222222222222222222222222222222222222 2070 2222222222222222222222222222222222222222222222222222222 2071 2222222222222222222222222222222222222222222222222222222 2072 2222222222222222222222222222222222222222222222222222222 2073 2222222222222222222222222222222222222222222222222222222 2074 2222222222222222222222222222222222222222222222222222222 2075 2222222222222222222222222222222222222222222222222222222 2076 2222222222222222222222222222222222222222222222222222222 2077 2222222222222222222222222222222222222222222222222222222 2078 2222222222222222222222222222222222222222222222222222222 2079 2222222222222222222222222222222222222222222222222222222 2080 2222222222222222222222222222222222222222222222222222222 2081 2222222222222222222222222222222222222222222222222222222 2082 2222222222222222222222222222222222222222222222222222222 2083 2222222222222222222222222222222222222222222222222222222 2084 2222222222222222222222222222222222222222222222222222222 2085 2222222222222222222222222222222222222222222222222222222 2086 2222222222222222222222222222222222222222222222222222222 2087 2222222222222222222222222222222222222222222222222222222 2088 2222222222222222222222222222222222222222222222222222222 2089 2222222222222222222222222222222222222222222222222222222 2090 2222222222222222222222222222222222222222222222222222222 2091 2222222222222222222222222222222222222222222222222222222 2092 2222222222222222222222222222222222222222222222222222222 2093 2222222222222222222222222222222222222222222222222222222 2094 2222222222222222222222222222222222222222222222222222222 2095 2222222222222222222222222222222222222222222222222222222 2096 2222222222222222222222222222222222222222222222222222222 2097 2222222222222222222222222222222222222222222222222222222 2098 2222222222222222222222222222222222222222222222222222222 2099 2222222222222222222222222222222222222222222222222222222 2100 2222222222222222222222222222222222222222222222222222222 2101 2222222222222222222222222222222222222222222222222222222 2102 2222222222222222222222222222222222222222222222222222222 2103 2222222222222222222222222222222222222222222222222222222 2104 2222222222222222222222222222222222222222222222222222222 2105 2222222222222222222222222222222222222222222222222222222 2106 2222222222222222222222222222222222222222222222222222222 2107 2222222222222222222222222222222222222222222222222222222 2108 2222222222222222222222222222222222222222222222222222222 2109 2222222222222222222222222222222222222222222222222222222 2110 2222222222222222222222222222222222222222222222222222222 2111 2222222222222222222222222222222222222222222222222222222 2112 2222222222222222222222222222222222222222222222222222222 2113 2222222222222222222222222222222222222222222222222222222 2114 2222222222222222222222222222222222222222222222222222222 2115 2222222222222222222222222222222222222222222222222222222 2116 2222222222222222222222222222222222222222222222222222222 2117 2222222222222222222222222222222222222222222222222222222 2118 2222222222222222222222222222222222222222222222222222222 2119 2222222222222222222222222222222222222222222222222222222 2120 2222222222222222222222222222222222222222222222222222222 2121 2222222222222222222222222222222222222222222222222222222 2122 2222222222222222222222222222222222222222222222222222222 2123 2222222222222222222222222222222222222222222222222222222 2124 2222222222222222222222222222222222222222222222222222222 2125 2222222222222222222222222222222222222222222222222222222 2126 2222222222222222222222222222222222222222222222222222222 2127 2222222222222222222222222222222222222222222222222222222 2128 2222222222222222222222222222222222222222222222222222222 2129 2222222222222222222222222222222222222222222222222222222 2130 2222222222222222222222222222222222222222222222222222222 2131 2222222222222222222222222222222222222222222222222222222 2132 2222222222222222222222222222222222222222222222222222222 2133 2222222222222222222222222222222222222222222222222222222 2134 2222222222222222222222222222222222222222222222222222222 2135 2222222222222222222222222222222222222222222222222222222 2136 2222222222222222222222222222222222222222222222222222222 2137 2222222222222222222222222222222222222222222222222222222 2138 2222222222222222222222222222222222222222222222222222222 2139 2222222222222222222222222222222222222222222222222222222 2140 2222222222222222222222222222222222222222222222222222222 2141 2222222222222222222222222222222222222222222222222222222 2142 2222222222222222222222222222222222222222222222222222222 2143 2222222222222222222222222222222222222222222222222222222 2144 2222222222222222222222222222222222222222222222222222222 2145 2222222222222222222222222222222222222222222222222222222 2146 2222222222222222222222222222222222222222222222222222222 2147 2222222222222222222222222222222222222222222222222222222 2148 2222222222222222222222222222222222222222222222222222222 2149 2222222222222222222222222222222222222222222222222222222 2150 2222222222222222222222222222222222222222222222222222222 2151 2222222222222222222222222222222222222222222222222222222 2152 2222222222222222222222222222222222222222222222222222222 2153 2222222222222222222222222222222222222222222222222222222 2154 2222222222222222222222222222222222222222222222222222222 2155 2222222222222222222222222222222222222222222222222222222 2156 2222222222222222222222222222222222222222222222222222222 2157 2222222222222222222222222222222222222222222222222222222 2158 2222222222222222222222222222222222222222222222222222222 2159 2222222222222222222222222222222222222222222222222222222 2160 2222222222222222222222222222222222222222222222222222222 2161 2222222222222222222222222222222222222222222222222222222 2162 2222222222222222222222222222222222222222222222222222222 2163 2222222222222222222222222222222222222222222222222222222 2164 2222222222222222222222222222222222222222222222222222222 2165 2222222222222222222222222222222222222222222222222222222 2166 2222222222222222222222222222222222222222222222222222222 2167 2222222222222222222222222222222222222222222222222222222 2168 2222222222222222222222222222222222222222222222222222222 2169 2222222222222222222222222222222222222222222222222222222 2170 2222222222222222222222222222222222222222222222222222222 2171 2222222222222222222222222222222222222222222222222222222 2172 2222222222222222222222222222222222222222222222222222222 2173 2222222222222222222222222222222222222222222222222222222 2174 2222222222222222222222222222222222222222222222222222222 2175 2222222222222222222222222222222222222222222222222222222 2176 2222222222222222222222222222222222222222222222222222222 2177 2222222222222222222222222222222222222222222222222222222 2178 2222222222222222222222222222222222222222222222222222222 2179 2222222222222222222222222222222222222222222222222222222 2180 2222222222222222222222222222222222222222222222222222222 2181 2222222222222222222222222222222222222222222222222222222 2182 2222222222222222222222222222222222222222222222222222222 2183 2222222222222222222222222222222222222222222222222222222 2184 2222222222222222222222222222222222222222222222222222222 2185 2222222222222222222222222222222222222222222222222222222 2186 2222222222222222222222222222222222222222222222222222222 2187 2222222222222222222222222222222222222222222222222222222 2188 2222222222222222222222222222222222222222222222222222222 2189 2222222222222222222222222222222222222222222222222222222 2190 2222222222222222222222222222222222222222222222222222222 2191 2222222222222222222222222222222222222222222222222222222 2192 2222222222222222222222222222222222222222222222222222222 2193 2222222222222222222222222222222222222222222222222222222 2194 2222222222222222222222222222222222222222222222222222222 2195 2222222222222222222222222222222222222222222222222222222 2196 2222222222222222222222222222222222222222222222222222222 2197 2222222222222222222222222222222222222222222222222222222 2198 2222222222222222222222222222222222222222222222222222222 2199 2222222222222222222222222222222222222222222222222222222 2200 2222222222222222222222222222222222222222222222222222222 2201 2222222222222222222222222222222222222222222222222222222 2202 2222222222222222222222222222222222222222222222222222222 2203 2222222222222222222222222222222222222222222222222222222 2204 2222222222222222222222222222222222222222222222222222222 2205 2222222222222222222222222222222222222222222222222222222 2206 2222222222222222222222222222222222222222222222222222222 2207 2222222222222222222222222222222222222222222222222222222 2208 2222222222222222222222222222222222222222222222222222222 2209 2222222222222222222222222222222222222222222222222222222 2210 2222222222222222222222222222222222222222222222222222222 2211 2222222222222222222222222222222222222222222222222222222 2212 2222222222222222222222222222222222222222222222222222222 2213 2222222222222222222222222222222222222222222222222222222 2214 2222222222222222222222222222222222222222222222222222222 2215 2222222222222222222222222222222222222222222222222222222 2216 2222222222222222222222222222222222222222222222222222222 2217 2222222222222222222222222222222222222222222222222222222 2218 2222222222222222222222222222222222222222222222222222222 2219 2222222222222222222222222222222222222222222222222222222 2220 2222222222222222222222222222222222222222222222222222222 2221 2222222222222222222222222222222222222222222222222222222 2222 2222222222222222222222222222222222222222222222222222222 2223 2222222222222222222222222222222222222222222222222222222 2224 2222222222222222222222222222222222222222222222222222222 2225 2222222222222222222222222222222222222222222222222222222 2226 2222222222222222222222222222222222222222222222222222222 2227 2222222222222222222222222222222222222222222222222222222 2228 2222222222222222222222222222222222222222222222222222222 2229 2222222222222222222222222222222222222222222222222222222 2230 2222222222222222222222222222222222222222222222222222222 2231 2222222222222222222222222222222222222222222222222222222 2232 2222222222222222222222222222222222222222222222222222222 2233 2222222222222222222222222222222222222222222222222222222 2234 2222222222222222222222222222222222222222222222222222222 2235 2222222222222222222222222222222222222222222222222222222 2236 2222222222222222222222222222222222222222222222222222222 2237 2222222222222222222222222222222222222222222222222222222 2238 2222222222222222222222222222222222222222222222222222222 2239 2222222222222222222222222222222222222222222222222222222 2240 2222222222222222222222222222222222222222222222222222222 2241 2222222222222222222222222222222222222222222222222222222 2242 2222222222222222222222222222222222222222222222222222222 2243 2222222222222222222222222222222222222222222222222222222 2244 2222222222222222222222222222222222222222222222222222222 2245 2222222222222222222222222222222222222222222222222222222 2246 2222222222222222222222222222222222222222222222222222222 2247 2222222222222222222222222222222222222222222222222222222 2248 2222222222222222222222222222222222222222222222222222222 2249 2222222222222222222222222222222222222222222222222222222 2250 2222222222222222222222222222222222222222222222222222222 2251 2222222222222222222222222222222222222222222222222222222 2252 2222222222222222222222222222222222222222222222222222222 2253 2222222222222222222222222222222222222222222222222222222 2254 2222222222222222222222222222222222222222222222222222222 2255 2222222222222222222222222222222222222222222222222222222 2256 2222222222222222222222222222222222222222222222222222222 2257 2222222222222222222222222222222222222222222222222222222 2258 2222222222222222222222222222222222222222222222222222222 2259 2222222222222222222222222222222222222222222222222222222 2260 2222222222222222222222222222222222222222222222222222222 2261 2222222222222222222222222222222222222222222222222222222 2262 2222222222222222222222222222222222222222222222222222222 2263 2222222222222222222222222222222222222222222222222222222 2264 2222222222222222222222222222222222222222222222222222222 2265 2222222222222222222222222222222222222222222222222222222 2266 2222222222222222222222222222222222222222222222222222222 2267 2222222222222222222222222222222222222222222222222222222 2268 2222222222222222222222222222222222222222222222222222222 2269 2222222222222222222222222222222222222222222222222222222 2270 2222222222222222222222222222222222222222222222222222222 2271 2222222222222222222222222222222222222222222222222222222 2272 2222222222222222222222222222222222222222222222222222222 2273 2222222222222222222222222222222222222222222222222222222 2274 2222222222222222222222222222222222222222222222222222222 2275 2222222222222222222222222222222222222222222222222222222 2276 2222222222222222222222222222222222222222222222222222222 2277 2222222222222222222222222222222222222222222222222222222 2278 2222222222222222222222222222222222222222222222222222222 2279 2222222222222222222222222222222222222222222222222222222 2280 2222222222222222222222222222222222222222222222222222222 2281 2222222222222222222222222222222222222222222222222222222 2282 2222222222222222222222222222222222222222222222222222222 2283 2222222222222222222222222222222222222222222222222222222 2284 2222222222222222222222222222222222222222222222222222222 2285 2222222222222222222222222222222222222222222222222222222 2286 2222222222222222222222222222222222222222222222222222222 2287 2222222222222222222222222222222222222222222222222222222 2288 2222222222222222222222222222222222222222222222222222222 2289 2222222222222222222222222222222222222222222222222222222 2290 2222222222222222222222222222222222222222222222222222222 2291 2222222222222222222222222222222222222222222222222222222 2292 2222222222222222222222222222222222222222222222222222222 2293 2222222222222222222222222222222222222222222222222222222 2294 2222222222222222222222222222222222222222222222222222222 2295 2222222222222222222222222222222222222222222222222222222 2296 2222222222222222222222222222222222222222222222222222222 2297 2222222222222222222222222222222222222222222222222222222 2298 2222222222222222222222222222222222222222222222222222222 2299 2222222222222222222222222222222222222222222222222222222 2300 2222222222222222222222222222222222222222222222222222222 2301 2222222222222222222222222222222222222222222222222222222 2302 2222222222222222222222222222222222222222222222222222222 2303 2222222222222222222222222222222222222222222222222222222 2304 2222222222222222222222222222222222222222222222222222222 2305 2222222222222222222222222222222222222222222222222222222 2306 2222222222222222222222222222222222222222222222222222222 2307 2222222222222222222222222222222222222222222222222222222 2308 2222222222222222222222222222222222222222222222222222222 2309 2222222222222222222222222222222222222222222222222222222 2310 2222222222222222222222222222222222222222222222222222222 2311 2222222222222222222222222222222222222222222222222222222 2312 2222222222222222222222222222222222222222222222222222222 2313 2222222222222222222222222222222222222222222222222222222 2314 2222222222222222222222222222222222222222222222222222222 2315 2222222222222222222222222222222222222222222222222222222 2316 2222222222222222222222222222222222222222222222222222222 2317 2222222222222222222222222222222222222222222222222222222 2318 2222222222222222222222222222222222222222222222222222222 2319 2222222222222222222222222222222222222222222222222222222 2320 2222222222222222222222222222222222222222222222222222222 2321 2222222222222222222222222222222222222222222222222222222 2322 2222222222222222222222222222222222222222222222222222222 2323 2222222222222222222222222222222222222222222222222222222 2324 2222222222222222222222222222222222222222222222222222222 2325 2222222222222222222222222222222222222222222222222222222 2326 2222222222222222222222222222222222222222222222222222222 2327 2222222222222222222222222222222222222222222222222222222 2328 2222222222222222222222222222222222222222222222222222222 2329 2222222222222222222222222222222222222222222222222222222 2330 2222222222222222222222222222222222222222222222222222222 2331 2222222222222222222222222222222222222222222222222222222 2332 2222222222222222222222222222222222222222222222222222222 2333 2222222222222222222222222222222222222222222222222222222 2334 2222222222222222222222222222222222222222222222222222222 2335 2222222222222222222222222222222222222222222222222222222 2336 2222222222222222222222222222222222222222222222222222222 2337 2222222222222222222222222222222222222222222222222222222 2338 2222222222222222222222222222222222222222222222222222222 2339 2222222222222222222222222222222222222222222222222222222 2340 2222222222222222222222222222222222222222222222222222222 2341 2222222222222222222222222222222222222222222222222222222 2342 2222222222222222222222222222222222222222222222222222222 2343 2222222222222222222222222222222222222222222222222222222 2344 2222222222222222222222222222222222222222222222222222222 2345 2222222222222222222222222222222222222222222222222222222 2346 2222222222222222222222222222222222222222222222222222222 2347 2222222222222222222222222222222222222222222222222222222 2348 2222222222222222222222222222222222222222222222222222222 2349 2222222222222222222222222222222222222222222222222222222 2350 2222222222222222222222222222222222222222222222222222222 2351 2222222222222222222222222222222222222222222222222222222 2352 2222222222222222222222222222222222222222222222222222222 2353 2222222222222222222222222222222222222222222222222222222 2354 2222222222222222222222222222222222222222222222222222222 2355 2222222222222222222222222222222222222222222222222222222 2356 2222222222222222222222222222222222222222222222222222222 2357 2222222222222222222222222222222222222222222222222222222 2358 2222222222222222222222222222222222222222222222222222222 2359 2222222222222222222222222222222222222222222222222222222 2360 2222222222222222222222222222222222222222222222222222222 2361 2222222222222222222222222222222222222222222222222222222 2362 2222222222222222222222222222222222222222222222222222222 2363 2222222222222222222222222222222222222222222222222222222 2364 2222222222222222222222222222222222222222222222222222222 2365 2222222222222222222222222222222222222222222222222222222 2366 2222222222222222222222222222222222222222222222222222222 2367 2222222222222222222222222222222222222222222222222222222 2368 2222222222222222222222222222222222222222222222222222222 2369 2222222222222222222222222222222222222222222222222222222 2370 2222222222222222222222222222222222222222222222222222222 2371 2222222222222222222222222222222222222222222222222222222 2372 2222222222222222222222222222222222222222222222222222222 2373 2222222222222222222222222222222222222222222222222222222 2374 2222222222222222222222222222222222222222222222222222222 2375 2222222222222222222222222222222222222222222222222222222 2376 2222222222222222222222222222222222222222222222222222222 2377 2222222222222222222222222222222222222222222222222222222 2378 2222222222222222222222222222222222222222222222222222222 2379 2222222222222222222222222222222222222222222222222222222 2380 2222222222222222222222222222222222222222222222222222222 2381 2222222222222222222222222222222222222222222222222222222 2382 2222222222222222222222222222222222222222222222222222222 2383 2222222222222222222222222222222222222222222222222222222 2384 2222222222222222222222222222222222222222222222222222222 2385 2222222222222222222222222222222222222222222222222222222 2386 2222222222222222222222222222222222222222222222222222222 2387 2222222222222222222222222222222222222222222222222222222 2388 2222222222222222222222222222222222222222222222222222222 2389 2222222222222222222222222222222222222222222222222222222 2390 2222222222222222222222222222222222222222222222222222222 2391 2222222222222222222222222222222222222222222222222222222 2392 2222222222222222222222222222222222222222222222222222222 2393 2222222222222222222222222222222222222222222222222222222 2394 2222222222222222222222222222222222222222222222222222222 2395 2222222222222222222222222222222222222222222222222222222 2396 2222222222222222222222222222222222222222222222222222222 2397 2222222222222222222222222222222222222222222222222222222 2398 2222222222222222222222222222222222222222222222222222222 2399 2222222222222222222222222222222222222222222222222222222 2400 2222222222222222222222222222222222222222222222222222222 2401 2222222222222222222222222222222222222222222222222222222 2402 2222222222222222222222222222222222222222222222222222222 2403 2222222222222222222222222222222222222222222222222222222 2404 2222222222222222222222222222222222222222222222222222222 2405 2222222222222222222222222222222222222222222222222222222 2406 2222222222222222222222222222222222222222222222222222222 2407 2222222222222222222222222222222222222222222222222222222 2408 2222222222222222222222222222222222222222222222222222222 2409 2222222222222222222222222222222222222222222222222222222 2410 2222222222222222222222222222222222222222222222222222222 2411 2222222222222222222222222222222222222222222222222222222 2412 2222222222222222222222222222222222222222222222222222222 2413 2222222222222222222222222222222222222222222222222222222 2414 2222222222222222222222222222222222222222222222222222222 2415 2222222222222222222222222222222222222222222222222222222 2416 2222222222222222222222222222222222222222222222222222222 2417 2222222222222222222222222222222222222222222222222222222 2418 2222222222222222222222222222222222222222222222222222222 2419 2222222222222222222222222222222222222222222222222222222 2420 2222222222222222222222222222222222222222222222222222222 2421 2222222222222222222222222222222222222222222222222222222 2422 2222222222222222222222222222222222222222222222222222222 2423 2222222222222222222222222222222222222222222222222222222 2424 2222222222222222222222222222222222222222222222222222222 2425 2222222222222222222222222222222222222222222222222222222 2426 2222222222222222222222222222222222222222222222222222222 2427 2222222222222222222222222222222222222222222222222222222 2428 2222222222222222222222222222222222222222222222222222222 2429 2222222222222222222222222222222222222222222222222222222 2430 2222222222222222222222222222222222222222222222222222222 2431 2222222222222222222222222222222222222222222222222222222 2432 2222222222222222222222222222222222222222222222222222222 2433 2222222222222222222222222222222222222222222222222222222 2434 2222222222222222222222222222222222222222222222222222222 2435 2222222222222222222222222222222222222222222222222222222 2436 2222222222222222222222222222222222222222222222222222222 2437 2222222222222222222222222222222222222222222222222222222 2438 2222222222222222222222222222222222222222222222222222222 2439 2222222222222222222222222222222222222222222222222222222 2440 2222222222222222222222222222222222222222222222222222222 2441 2222222222222222222222222222222222222222222222222222222 2442 2222222222222222222222222222222222222222222222222222222 2443 2222222222222222222222222222222222222222222222222222222 2444 2222222222222222222222222222222222222222222222222222222 2445 2222222222222222222222222222222222222222222222222222222 2446 2222222222222222222222222222222222222222222222222222222 2447 2222222222222222222222222222222222222222222222222222222 2448 2222222222222222222222222222222222222222222222222222222 2449 2222222222222222222222222222222222222222222222222222222 2450 2222222222222222222222222222222222222222222222222222222 2451 2222222222222222222222222222222222222222222222222222222 2452 2222222222222222222222222222222222222222222222222222222 2453 2222222222222222222222222222222222222222222222222222222 2454 2222222222222222222222222222222222222222222222222222222 2455 2222222222222222222222222222222222222222222222222222222 2456 2222222222222222222222222222222222222222222222222222222 2457 2222222222222222222222222222222222222222222222222222222 2458 2222222222222222222222222222222222222222222222222222222 2459 2222222222222222222222222222222222222222222222222222222 2460 2222222222222222222222222222222222222222222222222222222 2461 2222222222222222222222222222222222222222222222222222222 2462 2222222222222222222222222222222222222222222222222222222 2463 2222222222222222222222222222222222222222222222222222222 2464 2222222222222222222222222222222222222222222222222222222 2465 2222222222222222222222222222222222222222222222222222222 2466 2222222222222222222222222222222222222222222222222222222 2467 2222222222222222222222222222222222222222222222222222222 2468 2222222222222222222222222222222222222222222222222222222 2469 2222222222222222222222222222222222222222222222222222222 2470 2222222222222222222222222222222222222222222222222222222 2471 2222222222222222222222222222222222222222222222222222222 2472 2222222222222222222222222222222222222222222222222222222 2473 2222222222222222222222222222222222222222222222222222222 2474 2222222222222222222222222222222222222222222222222222222 2475 2222222222222222222222222222222222222222222222222222222 2476 2222222222222222222222222222222222222222222222222222222 2477 2222222222222222222222222222222222222222222222222222222 2478 2222222222222222222222222222222222222222222222222222222 2479 2222222222222222222222222222222222222222222222222222222 2480 2222222222222222222222222222222222222222222222222222222 2481 2222222222222222222222222222222222222222222222222222222 2482 2222222222222222222222222222222222222222222222222222222 2483 2222222222222222222222222222222222222222222222222222222 2484 2222222222222222222222222222222222222222222222222222222 2485 2222222222222222222222222222222222222222222222222222222 2486 2222222222222222222222222222222222222222222222222222222 2487 2222222222222222222222222222222222222222222222222222222 2488 2222222222222222222222222222222222222222222222222222222 2489 2222222222222222222222222222222222222222222222222222222 2490 2222222222222222222222222222222222222222222222222222222 2491 2222222222222222222222222222222222222222222222222222222 2492 2222222222222222222222222222222222222222222222222222222 2493 2222222222222222222222222222222222222222222222222222222 2494 2222222222222222222222222222222222222222222222222222222 2495 2222222222222222222222222222222222222222222222222222222 2496 2222222222222222222222222222222222222222222222222222222 2497 2222222222222222222222222222222222222222222222222222222 2498 2222222222222222222222222222222222222222222222222222222 2499 2222222222222222222222222222222222222222222222222222222 2500 2222222222222222222222222222222222222222222222222222222 2501 2222222222222222222222222222222222222222222222222222222 2502 2222222222222222222222222222222222222222222222222222222 2503 2222222222222222222222222222222222222222222222222222222 2504 2222222222222222222222222222222222222222222222222222222 2505 2222222222222222222222222222222222222222222222222222222 2506 2222222222222222222222222222222222222222222222222222222 2507 2222222222222222222222222222222222222222222222222222222 2508 2222222222222222222222222222222222222222222222222222222 2509 2222222222222222222222222222222222222222222222222222222 2510 2222222222222222222222222222222222222222222222222222222 2511 2222222222222222222222222222222222222222222222222222222 2512 2222222222222222222222222222222222222222222222222222222 2513 2222222222222222222222222222222222222222222222222222222 2514 2222222222222222222222222222222222222222222222222222222 2515 2222222222222222222222222222222222222222222222222222222 2516 2222222222222222222222222222222222222222222222222222222 2517 2222222222222222222222222222222222222222222222222222222 2518 2222222222222222222222222222222222222222222222222222222 2519 2222222222222222222222222222222222222222222222222222222 2520 2222222222222222222222222222222222222222222222222222222 2521 2222222222222222222222222222222222222222222222222222222 2522 2222222222222222222222222222222222222222222222222222222 2523 2222222222222222222222222222222222222222222222222222222 2524 2222222222222222222222222222222222222222222222222222222 2525 2222222222222222222222222222222222222222222222222222222 2526 2222222222222222222222222222222222222222222222222222222 2527 2222222222222222222222222222222222222222222222222222222 2528 2222222222222222222222222222222222222222222222222222222 2529 2222222222222222222222222222222222222222222222222222222 2530 2222222222222222222222222222222222222222222222222222222 2531 2222222222222222222222222222222222222222222222222222222 2532 2222222222222222222222222222222222222222222222222222222 2533 2222222222222222222222222222222222222222222222222222222 2534 2222222222222222222222222222222222222222222222222222222 2535 2222222222222222222222222222222222222222222222222222222 2536 2222222222222222222222222222222222222222222222222222222 2537 2222222222222222222222222222222222222222222222222222222 2538 2222222222222222222222222222222222222222222222222222222 2539 2222222222222222222222222222222222222222222222222222222 2540 2222222222222222222222222222222222222222222222222222222 2541 2222222222222222222222222222222222222222222222222222222 2542 2222222222222222222222222222222222222222222222222222222 2543 2222222222222222222222222222222222222222222222222222222 2544 2222222222222222222222222222222222222222222222222222222 2545 2222222222222222222222222222222222222222222222222222222 2546 2222222222222222222222222222222222222222222222222222222 2547 2222222222222222222222222222222222222222222222222222222 2548 2222222222222222222222222222222222222222222222222222222 2549 2222222222222222222222222222222222222222222222222222222 2550 2222222222222222222222222222222222222222222222222222222 2551 2222222222222222222222222222222222222222222222222222222 2552 2222222222222222222222222222222222222222222222222222222 2553 2222222222222222222222222222222222222222222222222222222 2554 2222222222222222222222222222222222222222222222222222222 2555 2222222222222222222222222222222222222222222222222222222 2556 2222222222222222222222222222222222222222222222222222222 2557 2222222222222222222222222222222222222222222222222222222 2558 2222222222222222222222222222222222222222222222222222222 2559 2222222222222222222222222222222222222222222222222222222 2560 2222222222222222222222222222222222222222222222222222222 2561 2222222222222222222222222222222222222222222222222222222 2562 2222222222222222222222222222222222222222222222222222222 2563 2222222222222222222222222222222222222222222222222222222 2564 2222222222222222222222222222222222222222222222222222222 2565 2222222222222222222222222222222222222222222222222222222 2566 2222222222222222222222222222222222222222222222222222222 2567 2222222222222222222222222222222222222222222222222222222 2568 2222222222222222222222222222222222222222222222222222222 2569 2222222222222222222222222222222222222222222222222222222 2570 2222222222222222222222222222222222222222222222222222222 2571 2222222222222222222222222222222222222222222222222222222 2572 2222222222222222222222222222222222222222222222222222222 2573 2222222222222222222222222222222222222222222222222222222 2574 2222222222222222222222222222222222222222222222222222222 2575 2222222222222222222222222222222222222222222222222222222 2576 2222222222222222222222222222222222222222222222222222222 2577 2222222222222222222222222222222222222222222222222222222 2578 2222222222222222222222222222222222222222222222222222222 2579 2222222222222222222222222222222222222222222222222222222 2580 2222222222222222222222222222222222222222222222222222222 2581 2222222222222222222222222222222222222222222222222222222 2582 2222222222222222222222222222222222222222222222222222222 2583 2222222222222222222222222222222222222222222222222222222 2584 2222222222222222222222222222222222222222222222222222222 2585 2222222222222222222222222222222222222222222222222222222 2586 2222222222222222222222222222222222222222222222222222222 2587 2222222222222222222222222222222222222222222222222222222 2588 2222222222222222222222222222222222222222222222222222222 2589 2222222222222222222222222222222222222222222222222222222 2590 2222222222222222222222222222222222222222222222222222222 2591 2222222222222222222222222222222222222222222222222222222 2592 2222222222222222222222222222222222222222222222222222222 2593 2222222222222222222222222222222222222222222222222222222 2594 2222222222222222222222222222222222222222222222222222222 2595 2222222222222222222222222222222222222222222222222222222 2596 2222222222222222222222222222222222222222222222222222222 2597 2222222222222222222222222222222222222222222222222222222 2598 2222222222222222222222222222222222222222222222222222222 2599 2222222222222222222222222222222222222222222222222222222 2600 2222222222222222222222222222222222222222222222222222222 2601 2222222222222222222222222222222222222222222222222222222 2602 2222222222222222222222222222222222222222222222222222222 2603 2222222222222222222222222222222222222222222222222222222 2604 2222222222222222222222222222222222222222222222222222222 2605 2222222222222222222222222222222222222222222222222222222 2606 2222222222222222222222222222222222222222222222222222222 2607 2222222222222222222222222222222222222222222222222222222 2608 2222222222222222222222222222222222222222222222222222222 2609 2222222222222222222222222222222222222222222222222222222 2610 2222222222222222222222222222222222222222222222222222222 2611 2222222222222222222222222222222222222222222222222222222 2612 2222222222222222222222222222222222222222222222222222222 2613 2222222222222222222222222222222222222222222222222222222 2614 2222222222222222222222222222222222222222222222222222222 2615 2222222222222222222222222222222222222222222222222222222 2616 2222222222222222222222222222222222222222222222222222222 2617 2222222222222222222222222222222222222222222222222222222 2618 2222222222222222222222222222222222222222222222222222222 2619 2222222222222222222222222222222222222222222222222222222 2620 2222222222222222222222222222222222222222222222222222222 2621 2222222222222222222222222222222222222222222222222222222 2622 2222222222222222222222222222222222222222222222222222222 2623 2222222222222222222222222222222222222222222222222222222 2624 2222222222222222222222222222222222222222222222222222222 2625 2222222222222222222222222222222222222222222222222222222 2626 2222222222222222222222222222222222222222222222222222222 2627 2222222222222222222222222222222222222222222222222222222 2628 2222222222222222222222222222222222222222222222222222222 2629 2222222222222222222222222222222222222222222222222222222 2630 2222222222222222222222222222222222222222222222222222222 2631 2222222222222222222222222222222222222222222222222222222 2632 2222222222222222222222222222222222222222222222222222222 2633 2222222222222222222222222222222222222222222222222222222 2634 2222222222222222222222222222222222222222222222222222222 2635 2222222222222222222222222222222222222222222222222222222 2636 2222222222222222222222222222222222222222222222222222222 2637 2222222222222222222222222222222222222222222222222222222 2638 2222222222222222222222222222222222222222222222222222222 2639 2222222222222222222222222222222222222222222222222222222 2640 2222222222222222222222222222222222222222222222222222222 2641 2222222222222222222222222222222222222222222222222222222 2642 2222222222222222222222222222222222222222222222222222222 2643 2222222222222222222222222222222222222222222222222222222 2644 2222222222222222222222222222222222222222222222222222222 2645 2222222222222222222222222222222222222222222222222222222 2646 2222222222222222222222222222222222222222222222222222222 2647 2222222222222222222222222222222222222222222222222222222 2648 2222222222222222222222222222222222222222222222222222222 2649 2222222222222222222222222222222222222222222222222222222 2650 2222222222222222222222222222222222222222222222222222222 2651 2222222222222222222222222222222222222222222222222222222 2652 2222222222222222222222222222222222222222222222222222222 2653 2222222222222222222222222222222222222222222222222222222 2654 2222222222222222222222222222222222222222222222222222222 2655 2222222222222222222222222222222222222222222222222222222 2656 2222222222222222222222222222222222222222222222222222222 2657 2222222222222222222222222222222222222222222222222222222 2658 2222222222222222222222222222222222222222222222222222222 2659 2222222222222222222222222222222222222222222222222222222 2660 2222222222222222222222222222222222222222222222222222222 2661 2222222222222222222222222222222222222222222222222222222 2662 2222222222222222222222222222222222222222222222222222222 2663 2222222222222222222222222222222222222222222222222222222 2664 2222222222222222222222222222222222222222222222222222222 2665 2222222222222222222222222222222222222222222222222222222 2666 2222222222222222222222222222222222222222222222222222222 2667 2222222222222222222222222222222222222222222222222222222 2668 2222222222222222222222222222222222222222222222222222222 2669 2222222222222222222222222222222222222222222222222222222 2670 2222222222222222222222222222222222222222222222222222222 2671 2222222222222222222222222222222222222222222222222222222 2672 2222222222222222222222222222222222222222222222222222222 2673 2222222222222222222222222222222222222222222222222222222 2674 2222222222222222222222222222222222222222222222222222222 2675 2222222222222222222222222222222222222222222222222222222 2676 2222222222222222222222222222222222222222222222222222222 2677 2222222222222222222222222222222222222222222222222222222 2678 2222222222222222222222222222222222222222222222222222222 2679 2222222222222222222222222222222222222222222222222222222 2680 2222222222222222222222222222222222222222222222222222222 2681 2222222222222222222222222222222222222222222222222222222 2682 2222222222222222222222222222222222222222222222222222222 2683 2222222222222222222222222222222222222222222222222222222 2684 2222222222222222222222222222222222222222222222222222222 2685 2222222222222222222222222222222222222222222222222222222 2686 2222222222222222222222222222222222222222222222222222222 2687 2222222222222222222222222222222222222222222222222222222 2688 2222222222222222222222222222222222222222222222222222222 2689 2222222222222222222222222222222222222222222222222222222 2690 2222222222222222222222222222222222222222222222222222222 2691 2222222222222222222222222222222222222222222222222222222 2692 2222222222222222222222222222222222222222222222222222222 2693 2222222222222222222222222222222222222222222222222222222 2694 2222222222222222222222222222222222222222222222222222222 2695 2222222222222222222222222222222222222222222222222222222 2696 2222222222222222222222222222222222222222222222222222222 2697 2222222222222222222222222222222222222222222222222222222 2698 2222222222222222222222222222222222222222222222222222222 2699 2222222222222222222222222222222222222222222222222222222 2700 2222222222222222222222222222222222222222222222222222222 2701 2222222222222222222222222222222222222222222222222222222 2702 2222222222222222222222222222222222222222222222222222222 2703 2222222222222222222222222222222222222222222222222222222 2704 2222222222222222222222222222222222222222222222222222222 2705 2222222222222222222222222222222222222222222222222222222 2706 2222222222222222222222222222222222222222222222222222222 2707 2222222222222222222222222222222222222222222222222222222 2708 2222222222222222222222222222222222222222222222222222222 2709 2222222222222222222222222222222222222222222222222222222 2710 2222222222222222222222222222222222222222222222222222222 2711 2222222222222222222222222222222222222222222222222222222 2712 2222222222222222222222222222222222222222222222222222222 2713 2222222222222222222222222222222222222222222222222222222 2714 2222222222222222222222222222222222222222222222222222222 2715 2222222222222222222222222222222222222222222222222222222 2716 2222222222222222222222222222222222222222222222222222222 2717 2222222222222222222222222222222222222222222222222222222 2718 2222222222222222222222222222222222222222222222222222222 2719 2222222222222222222222222222222222222222222222222222222 2720 2222222222222222222222222222222222222222222222222222222 2721 2222222222222222222222222222222222222222222222222222222 2722 2222222222222222222222222222222222222222222222222222222 2723 2222222222222222222222222222222222222222222222222222222 2724 2222222222222222222222222222222222222222222222222222222 2725 2222222222222222222222222222222222222222222222222222222 2726 2222222222222222222222222222222222222222222222222222222 2727 2222222222222222222222222222222222222222222222222222222 2728 2222222222222222222222222222222222222222222222222222222 2729 2222222222222222222222222222222222222222222222222222222 2730 2222222222222222222222222222222222222222222222222222222 2731 2222222222222222222222222222222222222222222222222222222 2732 2222222222222222222222222222222222222222222222222222222 2733 2222222222222222222222222222222222222222222222222222222 2734 2222222222222222222222222222222222222222222222222222222 2735 2222222222222222222222222222222222222222222222222222222 2736 2222222222222222222222222222222222222222222222222222222 2737 2222222222222222222222222222222222222222222222222222222 2738 2222222222222222222222222222222222222222222222222222222 2739 2222222222222222222222222222222222222222222222222222222 2740 2222222222222222222222222222222222222222222222222222222 2741 2222222222222222222222222222222222222222222222222222222 2742 2222222222222222222222222222222222222222222222222222222 2743 2222222222222222222222222222222222222222222222222222222 2744 2222222222222222222222222222222222222222222222222222222 2745 2222222222222222222222222222222222222222222222222222222 2746 2222222222222222222222222222222222222222222222222222222 2747 2222222222222222222222222222222222222222222222222222222 2748 2222222222222222222222222222222222222222222222222222222 2749 2222222222222222222222222222222222222222222222222222222 2750 2222222222222222222222222222222222222222222222222222222 2751 2222222222222222222222222222222222222222222222222222222 2752 2222222222222222222222222222222222222222222222222222222 2753 2222222222222222222222222222222222222222222222222222222 2754 2222222222222222222222222222222222222222222222222222222 2755 2222222222222222222222222222222222222222222222222222222 2756 2222222222222222222222222222222222222222222222222222222 2757 2222222222222222222222222222222222222222222222222222222 2758 2222222222222222222222222222222222222222222222222222222 2759 2222222222222222222222222222222222222222222222222222222 2760 2222222222222222222222222222222222222222222222222222222 2761 2222222222222222222222222222222222222222222222222222222 2762 2222222222222222222222222222222222222222222222222222222 2763 2222222222222222222222222222222222222222222222222222222 2764 2222222222222222222222222222222222222222222222222222222 2765 2222222222222222222222222222222222222222222222222222222 2766 2222222222222222222222222222222222222222222222222222222 2767 2222222222222222222222222222222222222222222222222222222 2768 2222222222222222222222222222222222222222222222222222222 2769 2222222222222222222222222222222222222222222222222222222 2770 2222222222222222222222222222222222222222222222222222222 2771 2222222222222222222222222222222222222222222222222222222 2772 2222222222222222222222222222222222222222222222222222222 2773 2222222222222222222222222222222222222222222222222222222 2774 2222222222222222222222222222222222222222222222222222222 2775 2222222222222222222222222222222222222222222222222222222 2776 2222222222222222222222222222222222222222222222222222222 2777 2222222222222222222222222222222222222222222222222222222 2778 2222222222222222222222222222222222222222222222222222222 2779 2222222222222222222222222222222222222222222222222222222 2780 2222222222222222222222222222222222222222222222222222222 2781 2222222222222222222222222222222222222222222222222222222 2782 2222222222222222222222222222222222222222222222222222222 2783 2222222222222222222222222222222222222222222222222222222 2784 2222222222222222222222222222222222222222222222222222222 2785 2222222222222222222222222222222222222222222222222222222 2786 2222222222222222222222222222222222222222222222222222222 2787 2222222222222222222222222222222222222222222222222222222 2788 2222222222222222222222222222222222222222222222222222222 2789 2222222222222222222222222222222222222222222222222222222 2790 2222222222222222222222222222222222222222222222222222222 2791 2222222222222222222222222222222222222222222222222222222 2792 2222222222222222222222222222222222222222222222222222222 2793 2222222222222222222222222222222222222222222222222222222 2794 2222222222222222222222222222222222222222222222222222222 2795 2222222222222222222222222222222222222222222222222222222 2796 2222222222222222222222222222222222222222222222222222222 2797 2222222222222222222222222222222222222222222222222222222 2798 2222222222222222222222222222222222222222222222222222222 2799 2222222222222222222222222222222222222222222222222222222 2800 2222222222222222222222222222222222222222222222222222222 2801 2222222222222222222222222222222222222222222222222222222 2802 2222222222222222222222222222222222222222222222222222222 2803 2222222222222222222222222222222222222222222222222222222 2804 2222222222222222222222222222222222222222222222222222222 2805 2222222222222222222222222222222222222222222222222222222 2806 2222222222222222222222222222222222222222222222222222222 2807 2222222222222222222222222222222222222222222222222222222 2808 2222222222222222222222222222222222222222222222222222222 2809 2222222222222222222222222222222222222222222222222222222 2810 2222222222222222222222222222222222222222222222222222222 2811 2222222222222222222222222222222222222222222222222222222 2812 2222222222222222222222222222222222222222222222222222222 2813 2222222222222222222222222222222222222222222222222222222 2814 2222222222222222222222222222222222222222222222222222222 2815 2222222222222222222222222222222222222222222222222222222 2816 2222222222222222222222222222222222222222222222222222222 2817 2222222222222222222222222222222222222222222222222222222 2818 2222222222222222222222222222222222222222222222222222222 2819 2222222222222222222222222222222222222222222222222222222 2820 2222222222222222222222222222222222222222222222222222222 2821 2222222222222222222222222222222222222222222222222222222 2822 2222222222222222222222222222222222222222222222222222222 2823 2222222222222222222222222222222222222222222222222222222 2824 2222222222222222222222222222222222222222222222222222222 2825 2222222222222222222222222222222222222222222222222222222 2826 2222222222222222222222222222222222222222222222222222222 2827 2222222222222222222222222222222222222222222222222222222 2828 2222222222222222222222222222222222222222222222222222222 2829 2222222222222222222222222222222222222222222222222222222 2830 2222222222222222222222222222222222222222222222222222222 2831 2222222222222222222222222222222222222222222222222222222 2832 2222222222222222222222222222222222222222222222222222222 2833 2222222222222222222222222222222222222222222222222222222 2834 2222222222222222222222222222222222222222222222222222222 2835 2222222222222222222222222222222222222222222222222222222 2836 2222222222222222222222222222222222222222222222222222222 2837 2222222222222222222222222222222222222222222222222222222 2838 2222222222222222222222222222222222222222222222222222222 2839 2222222222222222222222222222222222222222222222222222222 2840 2222222222222222222222222222222222222222222222222222222 2841 2222222222222222222222222222222222222222222222222222222 2842 2222222222222222222222222222222222222222222222222222222 2843 2222222222222222222222222222222222222222222222222222222 2844 2222222222222222222222222222222222222222222222222222222 2845 2222222222222222222222222222222222222222222222222222222 2846 2222222222222222222222222222222222222222222222222222222 2847 2222222222222222222222222222222222222222222222222222222 2848 2222222222222222222222222222222222222222222222222222222 2849 2222222222222222222222222222222222222222222222222222222 2850 2222222222222222222222222222222222222222222222222222222 2851 2222222222222222222222222222222222222222222222222222222 2852 2222222222222222222222222222222222222222222222222222222 2853 2222222222222222222222222222222222222222222222222222222 2854 2222222222222222222222222222222222222222222222222222222 2855 2222222222222222222222222222222222222222222222222222222 2856 2222222222222222222222222222222222222222222222222222222 2857 2222222222222222222222222222222222222222222222222222222 2858 2222222222222222222222222222222222222222222222222222222 2859 2222222222222222222222222222222222222222222222222222222 2860 2222222222222222222222222222222222222222222222222222222 2861 2222222222222222222222222222222222222222222222222222222 2862 2222222222222222222222222222222222222222222222222222222 2863 2222222222222222222222222222222222222222222222222222222 2864 2222222222222222222222222222222222222222222222222222222 2865 2222222222222222222222222222222222222222222222222222222 2866 2222222222222222222222222222222222222222222222222222222 2867 2222222222222222222222222222222222222222222222222222222 2868 2222222222222222222222222222222222222222222222222222222 2869 2222222222222222222222222222222222222222222222222222222 2870 2222222222222222222222222222222222222222222222222222222 2871 2222222222222222222222222222222222222222222222222222222 2872 2222222222222222222222222222222222222222222222222222222 2873 2222222222222222222222222222222222222222222222222222222 2874 2222222222222222222222222222222222222222222222222222222 2875 2222222222222222222222222222222222222222222222222222222 2876 2222222222222222222222222222222222222222222222222222222 2877 2222222222222222222222222222222222222222222222222222222 2878 2222222222222222222222222222222222222222222222222222222 2879 2222222222222222222222222222222222222222222222222222222 2880 2222222222222222222222222222222222222222222222222222222 2881 2222222222222222222222222222222222222222222222222222222 2882 2222222222222222222222222222222222222222222222222222222 2883 2222222222222222222222222222222222222222222222222222222 2884 2222222222222222222222222222222222222222222222222222222 2885 2222222222222222222222222222222222222222222222222222222 2886 2222222222222222222222222222222222222222222222222222222 2887 2222222222222222222222222222222222222222222222222222222 2888 2222222222222222222222222222222222222222222222222222222 2889 2222222222222222222222222222222222222222222222222222222 2890 2222222222222222222222222222222222222222222222222222222 2891 2222222222222222222222222222222222222222222222222222222 2892 2222222222222222222222222222222222222222222222222222222 2893 2222222222222222222222222222222222222222222222222222222 2894 2222222222222222222222222222222222222222222222222222222 2895 2222222222222222222222222222222222222222222222222222222 2896 2222222222222222222222222222222222222222222222222222222 2897 2222222222222222222222222222222222222222222222222222222 2898 2222222222222222222222222222222222222222222222222222222 2899 2222222222222222222222222222222222222222222222222222222 2900 2222222222222222222222222222222222222222222222222222222 2901 2222222222222222222222222222222222222222222222222222222 2902 2222222222222222222222222222222222222222222222222222222 2903 2222222222222222222222222222222222222222222222222222222 2904 2222222222222222222222222222222222222222222222222222222 2905 2222222222222222222222222222222222222222222222222222222 2906 2222222222222222222222222222222222222222222222222222222 2907 2222222222222222222222222222222222222222222222222222222 2908 2222222222222222222222222222222222222222222222222222222 2909 2222222222222222222222222222222222222222222222222222222 2910 2222222222222222222222222222222222222222222222222222222 2911 2222222222222222222222222222222222222222222222222222222 2912 2222222222222222222222222222222222222222222222222222222 2913 2222222222222222222222222222222222222222222222222222222 2914 2222222222222222222222222222222222222222222222222222222 2915 2222222222222222222222222222222222222222222222222222222 2916 2222222222222222222222222222222222222222222222222222222 2917 2222222222222222222222222222222222222222222222222222222 2918 2222222222222222222222222222222222222222222222222222222 2919 2222222222222222222222222222222222222222222222222222222 2920 2222222222222222222222222222222222222222222222222222222 2921 2222222222222222222222222222222222222222222222222222222 2922 2222222222222222222222222222222222222222222222222222222 2923 2222222222222222222222222222222222222222222222222222222 2924 2222222222222222222222222222222222222222222222222222222 2925 2222222222222222222222222222222222222222222222222222222 2926 2222222222222222222222222222222222222222222222222222222 2927 2222222222222222222222222222222222222222222222222222222 2928 2222222222222222222222222222222222222222222222222222222 2929 2222222222222222222222222222222222222222222222222222222 2930 2222222222222222222222222222222222222222222222222222222 2931 2222222222222222222222222222222222222222222222222222222 2932 2222222222222222222222222222222222222222222222222222222 2933 2222222222222222222222222222222222222222222222222222222 2934 2222222222222222222222222222222222222222222222222222222 2935 2222222222222222222222222222222222222222222222222222222 2936 2222222222222222222222222222222222222222222222222222222 2937 2222222222222222222222222222222222222222222222222222222 2938 2222222222222222222222222222222222222222222222222222222 2939 2222222222222222222222222222222222222222222222222222222 2940 2222222222222222222222222222222222222222222222222222222 2941 2222222222222222222222222222222222222222222222222222222 2942 2222222222222222222222222222222222222222222222222222222 2943 2222222222222222222222222222222222222222222222222222222 2944 2222222222222222222222222222222222222222222222222222222 2945 2222222222222222222222222222222222222222222222222222222 2946 2222222222222222222222222222222222222222222222222222222 2947 2222222222222222222222222222222222222222222222222222222 2948 2222222222222222222222222222222222222222222222222222222 2949 2222222222222222222222222222222222222222222222222222222 2950 2222222222222222222222222222222222222222222222222222222 2951 2222222222222222222222222222222222222222222222222222222 2952 2222222222222222222222222222222222222222222222222222222 2953 2222222222222222222222222222222222222222222222222222222 2954 2222222222222222222222222222222222222222222222222222222 2955 2222222222222222222222222222222222222222222222222222222 2956 2222222222222222222222222222222222222222222222222222222 2957 2222222222222222222222222222222222222222222222222222222 2958 2222222222222222222222222222222222222222222222222222222 2959 2222222222222222222222222222222222222222222222222222222 2960 2222222222222222222222222222222222222222222222222222222 2961 2222222222222222222222222222222222222222222222222222222 2962 2222222222222222222222222222222222222222222222222222222 2963 2222222222222222222222222222222222222222222222222222222 2964 2222222222222222222222222222222222222222222222222222222 2965 2222222222222222222222222222222222222222222222222222222 2966 2222222222222222222222222222222222222222222222222222222 2967 2222222222222222222222222222222222222222222222222222222 2968 2222222222222222222222222222222222222222222222222222222 2969 2222222222222222222222222222222222222222222222222222222 2970 2222222222222222222222222222222222222222222222222222222 2971 2222222222222222222222222222222222222222222222222222222 2972 2222222222222222222222222222222222222222222222222222222 2973 2222222222222222222222222222222222222222222222222222222 2974 2222222222222222222222222222222222222222222222222222222 2975 2222222222222222222222222222222222222222222222222222222 2976 2222222222222222222222222222222222222222222222222222222 2977 2222222222222222222222222222222222222222222222222222222 2978 2222222222222222222222222222222222222222222222222222222 2979 2222222222222222222222222222222222222222222222222222222 2980 2222222222222222222222222222222222222222222222222222222 2981 2222222222222222222222222222222222222222222222222222222 2982 2222222222222222222222222222222222222222222222222222222 2983 2222222222222222222222222222222222222222222222222222222 2984 2222222222222222222222222222222222222222222222222222222 2985 2222222222222222222222222222222222222222222222222222222 2986 2222222222222222222222222222222222222222222222222222222 2987 2222222222222222222222222222222222222222222222222222222 2988 2222222222222222222222222222222222222222222222222222222 2989 2222222222222222222222222222222222222222222222222222222 2990 2222222222222222222222222222222222222222222222222222222 2991 2222222222222222222222222222222222222222222222222222222 2992 2222222222222222222222222222222222222222222222222222222 2993 2222222222222222222222222222222222222222222222222222222 2994 2222222222222222222222222222222222222222222222222222222 2995 2222222222222222222222222222222222222222222222222222222 2996 2222222222222222222222222222222222222222222222222222222 2997 2222222222222222222222222222222222222222222222222222222 2998 2222222222222222222222222222222222222222222222222222222 2999 2222222222222222222222222222222222222222222222222222222 3000 2222222222222222222222222222222222222222222222222222222 3001 2222222222222222222222222222222222222222222222222222222 3002 2222222222222222222222222222222222222222222222222222222 3003 2222222222222222222222222222222222222222222222222222222 3004 2222222222222222222222222222222222222222222222222222222 3005 2222222222222222222222222222222222222222222222222222222 3006 2222222222222222222222222222222222222222222222222222222 3007 2222222222222222222222222222222222222222222222222222222 3008 2222222222222222222222222222222222222222222222222222222 3009 2222222222222222222222222222222222222222222222222222222 3010 2222222222222222222222222222222222222222222222222222222 3011 2222222222222222222222222222222222222222222222222222222 3012 2222222222222222222222222222222222222222222222222222222 3013 2222222222222222222222222222222222222222222222222222222 3014 2222222222222222222222222222222222222222222222222222222 3015 2222222222222222222222222222222222222222222222222222222 3016 2222222222222222222222222222222222222222222222222222222 3017 2222222222222222222222222222222222222222222222222222222 3018 2222222222222222222222222222222222222222222222222222222 3019 2222222222222222222222222222222222222222222222222222222 3020 2222222222222222222222222222222222222222222222222222222 3021 2222222222222222222222222222222222222222222222222222222 3022 2222222222222222222222222222222222222222222222222222222 3023 2222222222222222222222222222222222222222222222222222222 3024 2222222222222222222222222222222222222222222222222222222 3025 2222222222222222222222222222222222222222222222222222222 3026 2222222222222222222222222222222222222222222222222222222 3027 2222222222222222222222222222222222222222222222222222222 3028 2222222222222222222222222222222222222222222222222222222 3029 2222222222222222222222222222222222222222222222222222222 3030 2222222222222222222222222222222222222222222222222222222 3031 2222222222222222222222222222222222222222222222222222222 3032 2222222222222222222222222222222222222222222222222222222 3033 2222222222222222222222222222222222222222222222222222222 3034 2222222222222222222222222222222222222222222222222222222 3035 2222222222222222222222222222222222222222222222222222222 3036 2222222222222222222222222222222222222222222222222222222 3037 2222222222222222222222222222222222222222222222222222222 3038 2222222222222222222222222222222222222222222222222222222 3039 2222222222222222222222222222222222222222222222222222222 3040 2222222222222222222222222222222222222222222222222222222 3041 2222222222222222222222222222222222222222222222222222222 3042 2222222222222222222222222222222222222222222222222222222 3043 2222222222222222222222222222222222222222222222222222222 3044 2222222222222222222222222222222222222222222222222222222 3045 2222222222222222222222222222222222222222222222222222222 3046 2222222222222222222222222222222222222222222222222222222 3047 2222222222222222222222222222222222222222222222222222222 3048 2222222222222222222222222222222222222222222222222222222 3049 2222222222222222222222222222222222222222222222222222222 3050 2222222222222222222222222222222222222222222222222222222 3051 2222222222222222222222222222222222222222222222222222222 3052 2222222222222222222222222222222222222222222222222222222 3053 2222222222222222222222222222222222222222222222222222222 3054 2222222222222222222222222222222222222222222222222222222 3055 2222222222222222222222222222222222222222222222222222222 3056 2222222222222222222222222222222222222222222222222222222 3057 2222222222222222222222222222222222222222222222222222222 3058 2222222222222222222222222222222222222222222222222222222 3059 2222222222222222222222222222222222222222222222222222222 3060 2222222222222222222222222222222222222222222222222222222 3061 2222222222222222222222222222222222222222222222222222222 3062 2222222222222222222222222222222222222222222222222222222 3063 2222222222222222222222222222222222222222222222222222222 3064 2222222222222222222222222222222222222222222222222222222 3065 2222222222222222222222222222222222222222222222222222222 3066 2222222222222222222222222222222222222222222222222222222 3067 2222222222222222222222222222222222222222222222222222222 3068 2222222222222222222222222222222222222222222222222222222 3069 2222222222222222222222222222222222222222222222222222222 3070 2222222222222222222222222222222222222222222222222222222 3071 2222222222222222222222222222222222222222222222222222222 3072 2222222222222222222222222222222222222222222222222222222 3073 2222222222222222222222222222222222222222222222222222222 3074 2222222222222222222222222222222222222222222222222222222 3075 2222222222222222222222222222222222222222222222222222222 3076 2222222222222222222222222222222222222222222222222222222 3077 2222222222222222222222222222222222222222222222222222222 3078 2222222222222222222222222222222222222222222222222222222 3079 2222222222222222222222222222222222222222222222222222222 3080 2222222222222222222222222222222222222222222222222222222 3081 2222222222222222222222222222222222222222222222222222222 3082 2222222222222222222222222222222222222222222222222222222 3083 2222222222222222222222222222222222222222222222222222222 3084 2222222222222222222222222222222222222222222222222222222 3085 2222222222222222222222222222222222222222222222222222222 3086 2222222222222222222222222222222222222222222222222222222 3087 2222222222222222222222222222222222222222222222222222222 3088 2222222222222222222222222222222222222222222222222222222 3089 2222222222222222222222222222222222222222222222222222222 3090 2222222222222222222222222222222222222222222222222222222 3091 2222222222222222222222222222222222222222222222222222222 3092 2222222222222222222222222222222222222222222222222222222 3093 2222222222222222222222222222222222222222222222222222222 3094 2222222222222222222222222222222222222222222222222222222 3095 2222222222222222222222222222222222222222222222222222222 3096 2222222222222222222222222222222222222222222222222222222 3097 2222222222222222222222222222222222222222222222222222222 3098 2222222222222222222222222222222222222222222222222222222 3099 2222222222222222222222222222222222222222222222222222222 3100 2222222222222222222222222222222222222222222222222222222 3101 2222222222222222222222222222222222222222222222222222222 3102 2222222222222222222222222222222222222222222222222222222 3103 2222222222222222222222222222222222222222222222222222222 3104 2222222222222222222222222222222222222222222222222222222 3105 2222222222222222222222222222222222222222222222222222222 3106 2222222222222222222222222222222222222222222222222222222 3107 2222222222222222222222222222222222222222222222222222222 3108 2222222222222222222222222222222222222222222222222222222 3109 2222222222222222222222222222222222222222222222222222222 3110 2222222222222222222222222222222222222222222222222222222 3111 2222222222222222222222222222222222222222222222222222222 3112 2222222222222222222222222222222222222222222222222222222 3113 2222222222222222222222222222222222222222222222222222222 3114 2222222222222222222222222222222222222222222222222222222 3115 2222222222222222222222222222222222222222222222222222222 3116 2222222222222222222222222222222222222222222222222222222 3117 2222222222222222222222222222222222222222222222222222222 3118 2222222222222222222222222222222222222222222222222222222 3119 2222222222222222222222222222222222222222222222222222222 3120 2222222222222222222222222222222222222222222222222222222 3121 2222222222222222222222222222222222222222222222222222222 3122 2222222222222222222222222222222222222222222222222222222 3123 2222222222222222222222222222222222222222222222222222222 3124 2222222222222222222222222222222222222222222222222222222 3125 2222222222222222222222222222222222222222222222222222222 3126 2222222222222222222222222222222222222222222222222222222 3127 2222222222222222222222222222222222222222222222222222222 3128 2222222222222222222222222222222222222222222222222222222 3129 2222222222222222222222222222222222222222222222222222222 3130 2222222222222222222222222222222222222222222222222222222 3131 2222222222222222222222222222222222222222222222222222222 3132 2222222222222222222222222222222222222222222222222222222 3133 2222222222222222222222222222222222222222222222222222222 3134 2222222222222222222222222222222222222222222222222222222 3135 2222222222222222222222222222222222222222222222222222222 3136 2222222222222222222222222222222222222222222222222222222 3137 2222222222222222222222222222222222222222222222222222222 3138 2222222222222222222222222222222222222222222222222222222 3139 2222222222222222222222222222222222222222222222222222222 3140 2222222222222222222222222222222222222222222222222222222 3141 2222222222222222222222222222222222222222222222222222222 3142 2222222222222222222222222222222222222222222222222222222 3143 2222222222222222222222222222222222222222222222222222222 3144 2222222222222222222222222222222222222222222222222222222 3145 2222222222222222222222222222222222222222222222222222222 3146 2222222222222222222222222222222222222222222222222222222 3147 2222222222222222222222222222222222222222222222222222222 3148 2222222222222222222222222222222222222222222222222222222 3149 2222222222222222222222222222222222222222222222222222222 3150 2222222222222222222222222222222222222222222222222222222 3151 2222222222222222222222222222222222222222222222222222222 3152 2222222222222222222222222222222222222222222222222222222 3153 2222222222222222222222222222222222222222222222222222222 3154 2222222222222222222222222222222222222222222222222222222 3155 2222222222222222222222222222222222222222222222222222222 3156 2222222222222222222222222222222222222222222222222222222 3157 2222222222222222222222222222222222222222222222222222222 3158 2222222222222222222222222222222222222222222222222222222 3159 2222222222222222222222222222222222222222222222222222222 3160 2222222222222222222222222222222222222222222222222222222 3161 2222222222222222222222222222222222222222222222222222222 3162 2222222222222222222222222222222222222222222222222222222 3163 2222222222222222222222222222222222222222222222222222222 3164 2222222222222222222222222222222222222222222222222222222 3165 2222222222222222222222222222222222222222222222222222222 3166 2222222222222222222222222222222222222222222222222222222 3167 2222222222222222222222222222222222222222222222222222222 3168 2222222222222222222222222222222222222222222222222222222 3169 2222222222222222222222222222222222222222222222222222222 3170 2222222222222222222222222222222222222222222222222222222 3171 2222222222222222222222222222222222222222222222222222222 3172 2222222222222222222222222222222222222222222222222222222 3173 2222222222222222222222222222222222222222222222222222222 3174 2222222222222222222222222222222222222222222222222222222 3175 2222222222222222222222222222222222222222222222222222222 3176 2222222222222222222222222222222222222222222222222222222 3177 2222222222222222222222222222222222222222222222222222222 3178 2222222222222222222222222222222222222222222222222222222 3179 2222222222222222222222222222222222222222222222222222222 3180 2222222222222222222222222222222222222222222222222222222 3181 2222222222222222222222222222222222222222222222222222222 3182 2222222222222222222222222222222222222222222222222222222 3183 2222222222222222222222222222222222222222222222222222222 3184 2222222222222222222222222222222222222222222222222222222 3185 2222222222222222222222222222222222222222222222222222222 3186 2222222222222222222222222222222222222222222222222222222 3187 2222222222222222222222222222222222222222222222222222222 3188 2222222222222222222222222222222222222222222222222222222 3189 2222222222222222222222222222222222222222222222222222222 3190 2222222222222222222222222222222222222222222222222222222 3191 2222222222222222222222222222222222222222222222222222222 3192 2222222222222222222222222222222222222222222222222222222 3193 2222222222222222222222222222222222222222222222222222222 3194 2222222222222222222222222222222222222222222222222222222 3195 2222222222222222222222222222222222222222222222222222222 3196 2222222222222222222222222222222222222222222222222222222 3197 2222222222222222222222222222222222222222222222222222222 3198 2222222222222222222222222222222222222222222222222222222 3199 2222222222222222222222222222222222222222222222222222222 3200 2222222222222222222222222222222222222222222222222222222 3201 2222222222222222222222222222222222222222222222222222222 3202 2222222222222222222222222222222222222222222222222222222 3203 2222222222222222222222222222222222222222222222222222222 3204 2222222222222222222222222222222222222222222222222222222 3205 2222222222222222222222222222222222222222222222222222222 3206 2222222222222222222222222222222222222222222222222222222 3207 2222222222222222222222222222222222222222222222222222222 3208 2222222222222222222222222222222222222222222222222222222 3209 2222222222222222222222222222222222222222222222222222222 3210 2222222222222222222222222222222222222222222222222222222 3211 2222222222222222222222222222222222222222222222222222222 3212 2222222222222222222222222222222222222222222222222222222 3213 2222222222222222222222222222222222222222222222222222222 3214 2222222222222222222222222222222222222222222222222222222 3215 2222222222222222222222222222222222222222222222222222222 3216 2222222222222222222222222222222222222222222222222222222 3217 2222222222222222222222222222222222222222222222222222222 3218 2222222222222222222222222222222222222222222222222222222 3219 2222222222222222222222222222222222222222222222222222222 3220 2222222222222222222222222222222222222222222222222222222 3221 2222222222222222222222222222222222222222222222222222222 3222 2222222222222222222222222222222222222222222222222222222 3223 2222222222222222222222222222222222222222222222222222222 3224 2222222222222222222222222222222222222222222222222222222 3225 2222222222222222222222222222222222222222222222222222222 3226 2222222222222222222222222222222222222222222222222222222 3227 2222222222222222222222222222222222222222222222222222222 3228 2222222222222222222222222222222222222222222222222222222 3229 2222222222222222222222222222222222222222222222222222222 3230 2222222222222222222222222222222222222222222222222222222 3231 2222222222222222222222222222222222222222222222222222222 3232 2222222222222222222222222222222222222222222222222222222 3233 2222222222222222222222222222222222222222222222222222222 3234 2222222222222222222222222222222222222222222222222222222 3235 2222222222222222222222222222222222222222222222222222222 3236 2222222222222222222222222222222222222222222222222222222 3237 2222222222222222222222222222222222222222222222222222222 3238 2222222222222222222222222222222222222222222222222222222 3239 2222222222222222222222222222222222222222222222222222222 3240 2222222222222222222222222222222222222222222222222222222 3241 2222222222222222222222222222222222222222222222222222222 3242 2222222222222222222222222222222222222222222222222222222 3243 2222222222222222222222222222222222222222222222222222222 3244 2222222222222222222222222222222222222222222222222222222 3245 2222222222222222222222222222222222222222222222222222222 3246 2222222222222222222222222222222222222222222222222222222 3247 2222222222222222222222222222222222222222222222222222222 3248 2222222222222222222222222222222222222222222222222222222 3249 2222222222222222222222222222222222222222222222222222222 3250 2222222222222222222222222222222222222222222222222222222 3251 2222222222222222222222222222222222222222222222222222222 3252 2222222222222222222222222222222222222222222222222222222 3253 2222222222222222222222222222222222222222222222222222222 3254 2222222222222222222222222222222222222222222222222222222 3255 2222222222222222222222222222222222222222222222222222222 3256 2222222222222222222222222222222222222222222222222222222 3257 2222222222222222222222222222222222222222222222222222222 3258 2222222222222222222222222222222222222222222222222222222 3259 2222222222222222222222222222222222222222222222222222222 3260 2222222222222222222222222222222222222222222222222222222 3261 2222222222222222222222222222222222222222222222222222222 3262 2222222222222222222222222222222222222222222222222222222 3263 2222222222222222222222222222222222222222222222222222222 3264 2222222222222222222222222222222222222222222222222222222 3265 2222222222222222222222222222222222222222222222222222222 3266 2222222222222222222222222222222222222222222222222222222 3267 2222222222222222222222222222222222222222222222222222222 3268 2222222222222222222222222222222222222222222222222222222 3269 2222222222222222222222222222222222222222222222222222222 3270 2222222222222222222222222222222222222222222222222222222 3271 2222222222222222222222222222222222222222222222222222222 3272 2222222222222222222222222222222222222222222222222222222 3273 2222222222222222222222222222222222222222222222222222222 3274 2222222222222222222222222222222222222222222222222222222 3275 2222222222222222222222222222222222222222222222222222222 3276 2222222222222222222222222222222222222222222222222222222 3277 2222222222222222222222222222222222222222222222222222222 3278 2222222222222222222222222222222222222222222222222222222 3279 2222222222222222222222222222222222222222222222222222222 3280 2222222222222222222222222222222222222222222222222222222 3281 2222222222222222222222222222222222222222222222222222222 3282 2222222222222222222222222222222222222222222222222222222 3283 2222222222222222222222222222222222222222222222222222222 3284 2222222222222222222222222222222222222222222222222222222 3285 2222222222222222222222222222222222222222222222222222222 3286 2222222222222222222222222222222222222222222222222222222 3287 2222222222222222222222222222222222222222222222222222222 3288 2222222222222222222222222222222222222222222222222222222 3289 2222222222222222222222222222222222222222222222222222222 3290 2222222222222222222222222222222222222222222222222222222 3291 2222222222222222222222222222222222222222222222222222222 3292 2222222222222222222222222222222222222222222222222222222 3293 2222222222222222222222222222222222222222222222222222222 3294 2222222222222222222222222222222222222222222222222222222 3295 2222222222222222222222222222222222222222222222222222222 3296 2222222222222222222222222222222222222222222222222222222 3297 2222222222222222222222222222222222222222222222222222222 3298 2222222222222222222222222222222222222222222222222222222 3299 2222222222222222222222222222222222222222222222222222222 3300 2222222222222222222222222222222222222222222222222222222 3301 2222222222222222222222222222222222222222222222222222222 3302 2222222222222222222222222222222222222222222222222222222 3303 2222222222222222222222222222222222222222222222222222222 3304 2222222222222222222222222222222222222222222222222222222 3305 2222222222222222222222222222222222222222222222222222222 3306 2222222222222222222222222222222222222222222222222222222 3307 2222222222222222222222222222222222222222222222222222222 3308 2222222222222222222222222222222222222222222222222222222 3309 2222222222222222222222222222222222222222222222222222222 3310 2222222222222222222222222222222222222222222222222222222 3311 2222222222222222222222222222222222222222222222222222222 3312 2222222222222222222222222222222222222222222222222222222 3313 2222222222222222222222222222222222222222222222222222222 3314 2222222222222222222222222222222222222222222222222222222 3315 2222222222222222222222222222222222222222222222222222222 3316 2222222222222222222222222222222222222222222222222222222 3317 2222222222222222222222222222222222222222222222222222222 3318 2222222222222222222222222222222222222222222222222222222 3319 2222222222222222222222222222222222222222222222222222222 3320 2222222222222222222222222222222222222222222222222222222 3321 2222222222222222222222222222222222222222222222222222222 3322 2222222222222222222222222222222222222222222222222222222 3323 2222222222222222222222222222222222222222222222222222222 3324 2222222222222222222222222222222222222222222222222222222 3325 2222222222222222222222222222222222222222222222222222222 3326 2222222222222222222222222222222222222222222222222222222 3327 2222222222222222222222222222222222222222222222222222222 3328 2222222222222222222222222222222222222222222222222222222 3329 2222222222222222222222222222222222222222222222222222222 3330 2222222222222222222222222222222222222222222222222222222 3331 2222222222222222222222222222222222222222222222222222222 3332 2222222222222222222222222222222222222222222222222222222 3333 2222222222222222222222222222222222222222222222222222222 3334 2222222222222222222222222222222222222222222222222222222 3335 2222222222222222222222222222222222222222222222222222222 3336 2222222222222222222222222222222222222222222222222222222 3337 2222222222222222222222222222222222222222222222222222222 3338 2222222222222222222222222222222222222222222222222222222 3339 2222222222222222222222222222222222222222222222222222222 3340 2222222222222222222222222222222222222222222222222222222 3341 2222222222222222222222222222222222222222222222222222222 3342 2222222222222222222222222222222222222222222222222222222 3343 2222222222222222222222222222222222222222222222222222222 3344 2222222222222222222222222222222222222222222222222222222 3345 2222222222222222222222222222222222222222222222222222222 3346 2222222222222222222222222222222222222222222222222222222 3347 2222222222222222222222222222222222222222222222222222222 3348 2222222222222222222222222222222222222222222222222222222 3349 2222222222222222222222222222222222222222222222222222222 3350 2222222222222222222222222222222222222222222222222222222 3351 2222222222222222222222222222222222222222222222222222222 3352 2222222222222222222222222222222222222222222222222222222 3353 2222222222222222222222222222222222222222222222222222222 3354 2222222222222222222222222222222222222222222222222222222 3355 2222222222222222222222222222222222222222222222222222222 3356 2222222222222222222222222222222222222222222222222222222 3357 2222222222222222222222222222222222222222222222222222222 3358 2222222222222222222222222222222222222222222222222222222 3359 2222222222222222222222222222222222222222222222222222222 3360 2222222222222222222222222222222222222222222222222222222 3361 2222222222222222222222222222222222222222222222222222222 3362 2222222222222222222222222222222222222222222222222222222 3363 2222222222222222222222222222222222222222222222222222222 3364 2222222222222222222222222222222222222222222222222222222 3365 2222222222222222222222222222222222222222222222222222222 3366 2222222222222222222222222222222222222222222222222222222 3367 2222222222222222222222222222222222222222222222222222222 3368 2222222222222222222222222222222222222222222222222222222 3369 2222222222222222222222222222222222222222222222222222222 3370 2222222222222222222222222222222222222222222222222222222 3371 2222222222222222222222222222222222222222222222222222222 3372 2222222222222222222222222222222222222222222222222222222 3373 2222222222222222222222222222222222222222222222222222222 3374 2222222222222222222222222222222222222222222222222222222 3375 2222222222222222222222222222222222222222222222222222222 3376 2222222222222222222222222222222222222222222222222222222 3377 2222222222222222222222222222222222222222222222222222222 3378 2222222222222222222222222222222222222222222222222222222 3379 2222222222222222222222222222222222222222222222222222222 3380 2222222222222222222222222222222222222222222222222222222 3381 2222222222222222222222222222222222222222222222222222222 3382 2222222222222222222222222222222222222222222222222222222 3383 2222222222222222222222222222222222222222222222222222222 3384 2222222222222222222222222222222222222222222222222222222 3385 2222222222222222222222222222222222222222222222222222222 3386 2222222222222222222222222222222222222222222222222222222 3387 2222222222222222222222222222222222222222222222222222222 3388 2222222222222222222222222222222222222222222222222222222 3389 2222222222222222222222222222222222222222222222222222222 3390 2222222222222222222222222222222222222222222222222222222 3391 2222222222222222222222222222222222222222222222222222222 3392 2222222222222222222222222222222222222222222222222222222 3393 2222222222222222222222222222222222222222222222222222222 3394 2222222222222222222222222222222222222222222222222222222 3395 2222222222222222222222222222222222222222222222222222222 3396 2222222222222222222222222222222222222222222222222222222 3397 2222222222222222222222222222222222222222222222222222222 3398 2222222222222222222222222222222222222222222222222222222 3399 2222222222222222222222222222222222222222222222222222222 3400 2222222222222222222222222222222222222222222222222222222 3401 2222222222222222222222222222222222222222222222222222222 3402 2222222222222222222222222222222222222222222222222222222 3403 2222222222222222222222222222222222222222222222222222222 3404 2222222222222222222222222222222222222222222222222222222 3405 2222222222222222222222222222222222222222222222222222222 3406 2222222222222222222222222222222222222222222222222222222 3407 2222222222222222222222222222222222222222222222222222222 3408 2222222222222222222222222222222222222222222222222222222 3409 2222222222222222222222222222222222222222222222222222222 3410 2222222222222222222222222222222222222222222222222222222 3411 2222222222222222222222222222222222222222222222222222222 3412 2222222222222222222222222222222222222222222222222222222 3413 2222222222222222222222222222222222222222222222222222222 3414 2222222222222222222222222222222222222222222222222222222 3415 2222222222222222222222222222222222222222222222222222222 3416 2222222222222222222222222222222222222222222222222222222 3417 2222222222222222222222222222222222222222222222222222222 3418 2222222222222222222222222222222222222222222222222222222 3419 2222222222222222222222222222222222222222222222222222222 3420 2222222222222222222222222222222222222222222222222222222 3421 2222222222222222222222222222222222222222222222222222222 3422 2222222222222222222222222222222222222222222222222222222 3423 2222222222222222222222222222222222222222222222222222222 3424 2222222222222222222222222222222222222222222222222222222 3425 2222222222222222222222222222222222222222222222222222222 3426 2222222222222222222222222222222222222222222222222222222 3427 2222222222222222222222222222222222222222222222222222222 3428 2222222222222222222222222222222222222222222222222222222 3429 2222222222222222222222222222222222222222222222222222222 3430 2222222222222222222222222222222222222222222222222222222 3431 2222222222222222222222222222222222222222222222222222222 3432 2222222222222222222222222222222222222222222222222222222 3433 2222222222222222222222222222222222222222222222222222222 3434 2222222222222222222222222222222222222222222222222222222 3435 2222222222222222222222222222222222222222222222222222222 3436 2222222222222222222222222222222222222222222222222222222 3437 2222222222222222222222222222222222222222222222222222222 3438 2222222222222222222222222222222222222222222222222222222 3439 2222222222222222222222222222222222222222222222222222222 3440 2222222222222222222222222222222222222222222222222222222 3441 2222222222222222222222222222222222222222222222222222222 3442 2222222222222222222222222222222222222222222222222222222 3443 2222222222222222222222222222222222222222222222222222222 3444 2222222222222222222222222222222222222222222222222222222 3445 2222222222222222222222222222222222222222222222222222222 3446 2222222222222222222222222222222222222222222222222222222 3447 2222222222222222222222222222222222222222222222222222222 3448 2222222222222222222222222222222222222222222222222222222 3449 2222222222222222222222222222222222222222222222222222222 3450 2222222222222222222222222222222222222222222222222222222 3451 2222222222222222222222222222222222222222222222222222222 3452 2222222222222222222222222222222222222222222222222222222 3453 2222222222222222222222222222222222222222222222222222222 3454 2222222222222222222222222222222222222222222222222222222 3455 2222222222222222222222222222222222222222222222222222222 3456 2222222222222222222222222222222222222222222222222222222 3457 2222222222222222222222222222222222222222222222222222222 3458 2222222222222222222222222222222222222222222222222222222 3459 2222222222222222222222222222222222222222222222222222222 3460 2222222222222222222222222222222222222222222222222222222 3461 2222222222222222222222222222222222222222222222222222222 3462 2222222222222222222222222222222222222222222222222222222 3463 2222222222222222222222222222222222222222222222222222222 3464 2222222222222222222222222222222222222222222222222222222 3465 2222222222222222222222222222222222222222222222222222222 3466 2222222222222222222222222222222222222222222222222222222 3467 2222222222222222222222222222222222222222222222222222222 3468 2222222222222222222222222222222222222222222222222222222 3469 2222222222222222222222222222222222222222222222222222222 3470 2222222222222222222222222222222222222222222222222222222 3471 2222222222222222222222222222222222222222222222222222222 3472 2222222222222222222222222222222222222222222222222222222 3473 2222222222222222222222222222222222222222222222222222222 3474 2222222222222222222222222222222222222222222222222222222 3475 2222222222222222222222222222222222222222222222222222222 3476 2222222222222222222222222222222222222222222222222222222 3477 2222222222222222222222222222222222222222222222222222222 3478 2222222222222222222222222222222222222222222222222222222 3479 2222222222222222222222222222222222222222222222222222222 3480 2222222222222222222222222222222222222222222222222222222 3481 2222222222222222222222222222222222222222222222222222222 3482 2222222222222222222222222222222222222222222222222222222 3483 2222222222222222222222222222222222222222222222222222222 3484 2222222222222222222222222222222222222222222222222222222 3485 2222222222222222222222222222222222222222222222222222222 3486 2222222222222222222222222222222222222222222222222222222 3487 2222222222222222222222222222222222222222222222222222222 3488 2222222222222222222222222222222222222222222222222222222 3489 2222222222222222222222222222222222222222222222222222222 3490 2222222222222222222222222222222222222222222222222222222 3491 2222222222222222222222222222222222222222222222222222222 3492 2222222222222222222222222222222222222222222222222222222 3493 2222222222222222222222222222222222222222222222222222222 3494 2222222222222222222222222222222222222222222222222222222 3495 2222222222222222222222222222222222222222222222222222222 3496 2222222222222222222222222222222222222222222222222222222 3497 2222222222222222222222222222222222222222222222222222222 3498 2222222222222222222222222222222222222222222222222222222 3499 2222222222222222222222222222222222222222222222222222222 3500 2222222222222222222222222222222222222222222222222222222 3501 2222222222222222222222222222222222222222222222222222222 3502 2222222222222222222222222222222222222222222222222222222 3503 2222222222222222222222222222222222222222222222222222222 3504 2222222222222222222222222222222222222222222222222222222 3505 2222222222222222222222222222222222222222222222222222222 3506 2222222222222222222222222222222222222222222222222222222 3507 2222222222222222222222222222222222222222222222222222222 3508 2222222222222222222222222222222222222222222222222222222 3509 2222222222222222222222222222222222222222222222222222222 3510 2222222222222222222222222222222222222222222222222222222 3511 2222222222222222222222222222222222222222222222222222222 3512 2222222222222222222222222222222222222222222222222222222 3513 2222222222222222222222222222222222222222222222222222222 3514 2222222222222222222222222222222222222222222222222222222 3515 2222222222222222222222222222222222222222222222222222222 3516 2222222222222222222222222222222222222222222222222222222 3517 2222222222222222222222222222222222222222222222222222222 3518 2222222222222222222222222222222222222222222222222222222 3519 2222222222222222222222222222222222222222222222222222222 3520 2222222222222222222222222222222222222222222222222222222 3521 2222222222222222222222222222222222222222222222222222222 3522 2222222222222222222222222222222222222222222222222222222 3523 2222222222222222222222222222222222222222222222222222222 3524 2222222222222222222222222222222222222222222222222222222 3525 2222222222222222222222222222222222222222222222222222222 3526 2222222222222222222222222222222222222222222222222222222 3527 2222222222222222222222222222222222222222222222222222222 3528 2222222222222222222222222222222222222222222222222222222 3529 2222222222222222222222222222222222222222222222222222222 3530 2222222222222222222222222222222222222222222222222222222 3531 2222222222222222222222222222222222222222222222222222222 3532 2222222222222222222222222222222222222222222222222222222 3533 2222222222222222222222222222222222222222222222222222222 3534 2222222222222222222222222222222222222222222222222222222 3535 2222222222222222222222222222222222222222222222222222222 3536 2222222222222222222222222222222222222222222222222222222 3537 2222222222222222222222222222222222222222222222222222222 3538 2222222222222222222222222222222222222222222222222222222 3539 2222222222222222222222222222222222222222222222222222222 3540 2222222222222222222222222222222222222222222222222222222 3541 2222222222222222222222222222222222222222222222222222222 3542 2222222222222222222222222222222222222222222222222222222 3543 2222222222222222222222222222222222222222222222222222222 3544 2222222222222222222222222222222222222222222222222222222 3545 2222222222222222222222222222222222222222222222222222222 3546 2222222222222222222222222222222222222222222222222222222 3547 2222222222222222222222222222222222222222222222222222222 3548 2222222222222222222222222222222222222222222222222222222 3549 2222222222222222222222222222222222222222222222222222222 3550 2222222222222222222222222222222222222222222222222222222 3551 2222222222222222222222222222222222222222222222222222222 3552 2222222222222222222222222222222222222222222222222222222 3553 2222222222222222222222222222222222222222222222222222222 3554 2222222222222222222222222222222222222222222222222222222 3555 2222222222222222222222222222222222222222222222222222222 3556 2222222222222222222222222222222222222222222222222222222 3557 2222222222222222222222222222222222222222222222222222222 3558 2222222222222222222222222222222222222222222222222222222 3559 2222222222222222222222222222222222222222222222222222222 3560 2222222222222222222222222222222222222222222222222222222 3561 2222222222222222222222222222222222222222222222222222222 3562 2222222222222222222222222222222222222222222222222222222 3563 2222222222222222222222222222222222222222222222222222222 3564 2222222222222222222222222222222222222222222222222222222 3565 2222222222222222222222222222222222222222222222222222222 3566 2222222222222222222222222222222222222222222222222222222 3567 2222222222222222222222222222222222222222222222222222222 3568 2222222222222222222222222222222222222222222222222222222 3569 2222222222222222222222222222222222222222222222222222222 3570 2222222222222222222222222222222222222222222222222222222 3571 2222222222222222222222222222222222222222222222222222222 3572 2222222222222222222222222222222222222222222222222222222 3573 2222222222222222222222222222222222222222222222222222222 3574 2222222222222222222222222222222222222222222222222222222 3575 2222222222222222222222222222222222222222222222222222222 3576 2222222222222222222222222222222222222222222222222222222 3577 2222222222222222222222222222222222222222222222222222222 3578 2222222222222222222222222222222222222222222222222222222 3579 2222222222222222222222222222222222222222222222222222222 3580 2222222222222222222222222222222222222222222222222222222 3581 2222222222222222222222222222222222222222222222222222222 3582 2222222222222222222222222222222222222222222222222222222 3583 2222222222222222222222222222222222222222222222222222222 3584 2222222222222222222222222222222222222222222222222222222 3585 2222222222222222222222222222222222222222222222222222222 3586 2222222222222222222222222222222222222222222222222222222 3587 2222222222222222222222222222222222222222222222222222222 3588 2222222222222222222222222222222222222222222222222222222 3589 2222222222222222222222222222222222222222222222222222222 3590 2222222222222222222222222222222222222222222222222222222 3591 2222222222222222222222222222222222222222222222222222222 3592 2222222222222222222222222222222222222222222222222222222 3593 2222222222222222222222222222222222222222222222222222222 3594 2222222222222222222222222222222222222222222222222222222 3595 2222222222222222222222222222222222222222222222222222222 3596 2222222222222222222222222222222222222222222222222222222 3597 2222222222222222222222222222222222222222222222222222222 3598 2222222222222222222222222222222222222222222222222222222 3599 2222222222222222222222222222222222222222222222222222222 3600 2222222222222222222222222222222222222222222222222222222 3601 2222222222222222222222222222222222222222222222222222222 3602 2222222222222222222222222222222222222222222222222222222 3603 2222222222222222222222222222222222222222222222222222222 3604 2222222222222222222222222222222222222222222222222222222 3605 2222222222222222222222222222222222222222222222222222222 3606 2222222222222222222222222222222222222222222222222222222 3607 2222222222222222222222222222222222222222222222222222222 3608 2222222222222222222222222222222222222222222222222222222 3609 2222222222222222222222222222222222222222222222222222222 3610 2222222222222222222222222222222222222222222222222222222 3611 2222222222222222222222222222222222222222222222222222222 3612 2222222222222222222222222222222222222222222222222222222 3613 2222222222222222222222222222222222222222222222222222222 3614 2222222222222222222222222222222222222222222222222222222 3615 2222222222222222222222222222222222222222222222222222222 3616 2222222222222222222222222222222222222222222222222222222 3617 2222222222222222222222222222222222222222222222222222222 3618 2222222222222222222222222222222222222222222222222222222 3619 2222222222222222222222222222222222222222222222222222222 3620 2222222222222222222222222222222222222222222222222222222 3621 2222222222222222222222222222222222222222222222222222222 3622 2222222222222222222222222222222222222222222222222222222 3623 2222222222222222222222222222222222222222222222222222222 3624 2222222222222222222222222222222222222222222222222222222 3625 2222222222222222222222222222222222222222222222222222222 3626 2222222222222222222222222222222222222222222222222222222 3627 2222222222222222222222222222222222222222222222222222222 3628 2222222222222222222222222222222222222222222222222222222 3629 2222222222222222222222222222222222222222222222222222222 3630 2222222222222222222222222222222222222222222222222222222 3631 2222222222222222222222222222222222222222222222222222222 3632 2222222222222222222222222222222222222222222222222222222 3633 2222222222222222222222222222222222222222222222222222222 3634 2222222222222222222222222222222222222222222222222222222 3635 2222222222222222222222222222222222222222222222222222222 3636 2222222222222222222222222222222222222222222222222222222 3637 2222222222222222222222222222222222222222222222222222222 3638 2222222222222222222222222222222222222222222222222222222 3639 2222222222222222222222222222222222222222222222222222222 3640 2222222222222222222222222222222222222222222222222222222 3641 2222222222222222222222222222222222222222222222222222222 3642 2222222222222222222222222222222222222222222222222222222 3643 2222222222222222222222222222222222222222222222222222222 3644 2222222222222222222222222222222222222222222222222222222 3645 2222222222222222222222222222222222222222222222222222222 3646 2222222222222222222222222222222222222222222222222222222 3647 2222222222222222222222222222222222222222222222222222222 3648 2222222222222222222222222222222222222222222222222222222 3649 2222222222222222222222222222222222222222222222222222222 3650 2222222222222222222222222222222222222222222222222222222 3651 2222222222222222222222222222222222222222222222222222222 3652 2222222222222222222222222222222222222222222222222222222 3653 2222222222222222222222222222222222222222222222222222222 3654 2222222222222222222222222222222222222222222222222222222 3655 2222222222222222222222222222222222222222222222222222222 3656 2222222222222222222222222222222222222222222222222222222 3657 2222222222222222222222222222222222222222222222222222222 3658 2222222222222222222222222222222222222222222222222222222 3659 2222222222222222222222222222222222222222222222222222222 3660 2222222222222222222222222222222222222222222222222222222 3661 2222222222222222222222222222222222222222222222222222222 3662 2222222222222222222222222222222222222222222222222222222 3663 2222222222222222222222222222222222222222222222222222222 3664 2222222222222222222222222222222222222222222222222222222 3665 2222222222222222222222222222222222222222222222222222222 3666 2222222222222222222222222222222222222222222222222222222 3667 2222222222222222222222222222222222222222222222222222222 3668 2222222222222222222222222222222222222222222222222222222 3669 2222222222222222222222222222222222222222222222222222222 3670 2222222222222222222222222222222222222222222222222222222 3671 2222222222222222222222222222222222222222222222222222222 3672 2222222222222222222222222222222222222222222222222222222 3673 2222222222222222222222222222222222222222222222222222222 3674 2222222222222222222222222222222222222222222222222222222 3675 2222222222222222222222222222222222222222222222222222222 3676 2222222222222222222222222222222222222222222222222222222 3677 2222222222222222222222222222222222222222222222222222222 3678 2222222222222222222222222222222222222222222222222222222 3679 2222222222222222222222222222222222222222222222222222222 3680 2222222222222222222222222222222222222222222222222222222 3681 2222222222222222222222222222222222222222222222222222222 3682 2222222222222222222222222222222222222222222222222222222 3683 2222222222222222222222222222222222222222222222222222222 3684 2222222222222222222222222222222222222222222222222222222 3685 2222222222222222222222222222222222222222222222222222222 3686 2222222222222222222222222222222222222222222222222222222 3687 2222222222222222222222222222222222222222222222222222222 3688 2222222222222222222222222222222222222222222222222222222 3689 2222222222222222222222222222222222222222222222222222222 3690 2222222222222222222222222222222222222222222222222222222 3691 2222222222222222222222222222222222222222222222222222222 3692 2222222222222222222222222222222222222222222222222222222 3693 2222222222222222222222222222222222222222222222222222222 3694 2222222222222222222222222222222222222222222222222222222 3695 2222222222222222222222222222222222222222222222222222222 3696 2222222222222222222222222222222222222222222222222222222 3697 2222222222222222222222222222222222222222222222222222222 3698 2222222222222222222222222222222222222222222222222222222 3699 2222222222222222222222222222222222222222222222222222222 3700 2222222222222222222222222222222222222222222222222222222 3701 2222222222222222222222222222222222222222222222222222222 3702 2222222222222222222222222222222222222222222222222222222 3703 2222222222222222222222222222222222222222222222222222222 3704 2222222222222222222222222222222222222222222222222222222 3705 2222222222222222222222222222222222222222222222222222222 3706 2222222222222222222222222222222222222222222222222222222 3707 2222222222222222222222222222222222222222222222222222222 3708 2222222222222222222222222222222222222222222222222222222 3709 2222222222222222222222222222222222222222222222222222222 3710 2222222222222222222222222222222222222222222222222222222 3711 2222222222222222222222222222222222222222222222222222222 3712 2222222222222222222222222222222222222222222222222222222 3713 2222222222222222222222222222222222222222222222222222222 3714 2222222222222222222222222222222222222222222222222222222 3715 2222222222222222222222222222222222222222222222222222222 3716 2222222222222222222222222222222222222222222222222222222 3717 2222222222222222222222222222222222222222222222222222222 3718 2222222222222222222222222222222222222222222222222222222 3719 2222222222222222222222222222222222222222222222222222222 3720 2222222222222222222222222222222222222222222222222222222 3721 2222222222222222222222222222222222222222222222222222222 3722 2222222222222222222222222222222222222222222222222222222 3723 2222222222222222222222222222222222222222222222222222222 3724 2222222222222222222222222222222222222222222222222222222 3725 2222222222222222222222222222222222222222222222222222222 3726 2222222222222222222222222222222222222222222222222222222 3727 2222222222222222222222222222222222222222222222222222222 3728 2222222222222222222222222222222222222222222222222222222 3729 2222222222222222222222222222222222222222222222222222222 3730 2222222222222222222222222222222222222222222222222222222 3731 2222222222222222222222222222222222222222222222222222222 3732 2222222222222222222222222222222222222222222222222222222 3733 2222222222222222222222222222222222222222222222222222222 3734 2222222222222222222222222222222222222222222222222222222 3735 2222222222222222222222222222222222222222222222222222222 3736 2222222222222222222222222222222222222222222222222222222 3737 2222222222222222222222222222222222222222222222222222222 3738 2222222222222222222222222222222222222222222222222222222 3739 2222222222222222222222222222222222222222222222222222222 3740 2222222222222222222222222222222222222222222222222222222 3741 2222222222222222222222222222222222222222222222222222222 3742 2222222222222222222222222222222222222222222222222222222 3743 2222222222222222222222222222222222222222222222222222222 3744 2222222222222222222222222222222222222222222222222222222 3745 2222222222222222222222222222222222222222222222222222222 3746 2222222222222222222222222222222222222222222222222222222 3747 2222222222222222222222222222222222222222222222222222222 3748 2222222222222222222222222222222222222222222222222222222 3749 2222222222222222222222222222222222222222222222222222222 3750 2222222222222222222222222222222222222222222222222222222 3751 2222222222222222222222222222222222222222222222222222222 3752 2222222222222222222222222222222222222222222222222222222 3753 2222222222222222222222222222222222222222222222222222222 3754 2222222222222222222222222222222222222222222222222222222 3755 2222222222222222222222222222222222222222222222222222222 3756 2222222222222222222222222222222222222222222222222222222 3757 2222222222222222222222222222222222222222222222222222222 3758 2222222222222222222222222222222222222222222222222222222 3759 2222222222222222222222222222222222222222222222222222222 3760 2222222222222222222222222222222222222222222222222222222 3761 2222222222222222222222222222222222222222222222222222222 3762 2222222222222222222222222222222222222222222222222222222 3763 2222222222222222222222222222222222222222222222222222222 3764 2222222222222222222222222222222222222222222222222222222 3765 2222222222222222222222222222222222222222222222222222222 3766 2222222222222222222222222222222222222222222222222222222 3767 2222222222222222222222222222222222222222222222222222222 3768 2222222222222222222222222222222222222222222222222222222 3769 2222222222222222222222222222222222222222222222222222222 3770 2222222222222222222222222222222222222222222222222222222 3771 2222222222222222222222222222222222222222222222222222222 3772 2222222222222222222222222222222222222222222222222222222 3773 2222222222222222222222222222222222222222222222222222222 3774 2222222222222222222222222222222222222222222222222222222 3775 2222222222222222222222222222222222222222222222222222222 3776 2222222222222222222222222222222222222222222222222222222 3777 2222222222222222222222222222222222222222222222222222222 3778 2222222222222222222222222222222222222222222222222222222 3779 2222222222222222222222222222222222222222222222222222222 3780 2222222222222222222222222222222222222222222222222222222 3781 2222222222222222222222222222222222222222222222222222222 3782 2222222222222222222222222222222222222222222222222222222 3783 2222222222222222222222222222222222222222222222222222222 3784 2222222222222222222222222222222222222222222222222222222 3785 2222222222222222222222222222222222222222222222222222222 3786 2222222222222222222222222222222222222222222222222222222 3787 2222222222222222222222222222222222222222222222222222222 3788 2222222222222222222222222222222222222222222222222222222 3789 2222222222222222222222222222222222222222222222222222222 3790 2222222222222222222222222222222222222222222222222222222 3791 2222222222222222222222222222222222222222222222222222222 3792 2222222222222222222222222222222222222222222222222222222 3793 2222222222222222222222222222222222222222222222222222222 3794 2222222222222222222222222222222222222222222222222222222 3795 2222222222222222222222222222222222222222222222222222222 3796 2222222222222222222222222222222222222222222222222222222 3797 2222222222222222222222222222222222222222222222222222222 3798 2222222222222222222222222222222222222222222222222222222 3799 2222222222222222222222222222222222222222222222222222222 3800 2222222222222222222222222222222222222222222222222222222 3801 2222222222222222222222222222222222222222222222222222222 3802 2222222222222222222222222222222222222222222222222222222 3803 2222222222222222222222222222222222222222222222222222222 3804 2222222222222222222222222222222222222222222222222222222 3805 2222222222222222222222222222222222222222222222222222222 3806 2222222222222222222222222222222222222222222222222222222 3807 2222222222222222222222222222222222222222222222222222222 3808 2222222222222222222222222222222222222222222222222222222 3809 2222222222222222222222222222222222222222222222222222222 3810 2222222222222222222222222222222222222222222222222222222 3811 2222222222222222222222222222222222222222222222222222222 3812 2222222222222222222222222222222222222222222222222222222 3813 2222222222222222222222222222222222222222222222222222222 3814 2222222222222222222222222222222222222222222222222222222 3815 2222222222222222222222222222222222222222222222222222222 3816 2222222222222222222222222222222222222222222222222222222 3817 2222222222222222222222222222222222222222222222222222222 3818 2222222222222222222222222222222222222222222222222222222 3819 2222222222222222222222222222222222222222222222222222222 3820 2222222222222222222222222222222222222222222222222222222 3821 2222222222222222222222222222222222222222222222222222222 3822 2222222222222222222222222222222222222222222222222222222 3823 2222222222222222222222222222222222222222222222222222222 3824 2222222222222222222222222222222222222222222222222222222 3825 2222222222222222222222222222222222222222222222222222222 3826 2222222222222222222222222222222222222222222222222222222 3827 2222222222222222222222222222222222222222222222222222222 3828 2222222222222222222222222222222222222222222222222222222 3829 2222222222222222222222222222222222222222222222222222222 3830 2222222222222222222222222222222222222222222222222222222 3831 2222222222222222222222222222222222222222222222222222222 3832 2222222222222222222222222222222222222222222222222222222 3833 2222222222222222222222222222222222222222222222222222222 3834 2222222222222222222222222222222222222222222222222222222 3835 2222222222222222222222222222222222222222222222222222222 3836 2222222222222222222222222222222222222222222222222222222 3837 2222222222222222222222222222222222222222222222222222222 3838 2222222222222222222222222222222222222222222222222222222 3839 2222222222222222222222222222222222222222222222222222222 3840 2222222222222222222222222222222222222222222222222222222 3841 2222222222222222222222222222222222222222222222222222222 3842 2222222222222222222222222222222222222222222222222222222 3843 2222222222222222222222222222222222222222222222222222222 3844 2222222222222222222222222222222222222222222222222222222 3845 2222222222222222222222222222222222222222222222222222222 3846 2222222222222222222222222222222222222222222222222222222 3847 2222222222222222222222222222222222222222222222222222222 3848 2222222222222222222222222222222222222222222222222222222 3849 2222222222222222222222222222222222222222222222222222222 3850 2222222222222222222222222222222222222222222222222222222 3851 2222222222222222222222222222222222222222222222222222222 3852 2222222222222222222222222222222222222222222222222222222 3853 2222222222222222222222222222222222222222222222222222222 3854 2222222222222222222222222222222222222222222222222222222 3855 2222222222222222222222222222222222222222222222222222222 3856 2222222222222222222222222222222222222222222222222222222 3857 2222222222222222222222222222222222222222222222222222222 3858 2222222222222222222222222222222222222222222222222222222 3859 2222222222222222222222222222222222222222222222222222222 3860 2222222222222222222222222222222222222222222222222222222 3861 2222222222222222222222222222222222222222222222222222222 3862 2222222222222222222222222222222222222222222222222222222 3863 2222222222222222222222222222222222222222222222222222222 3864 2222222222222222222222222222222222222222222222222222222 3865 2222222222222222222222222222222222222222222222222222222 3866 2222222222222222222222222222222222222222222222222222222 3867 2222222222222222222222222222222222222222222222222222222 3868 2222222222222222222222222222222222222222222222222222222 3869 2222222222222222222222222222222222222222222222222222222 3870 2222222222222222222222222222222222222222222222222222222 3871 2222222222222222222222222222222222222222222222222222222 3872 2222222222222222222222222222222222222222222222222222222 3873 2222222222222222222222222222222222222222222222222222222 3874 2222222222222222222222222222222222222222222222222222222 3875 2222222222222222222222222222222222222222222222222222222 3876 2222222222222222222222222222222222222222222222222222222 3877 2222222222222222222222222222222222222222222222222222222 3878 2222222222222222222222222222222222222222222222222222222 3879 2222222222222222222222222222222222222222222222222222222 3880 2222222222222222222222222222222222222222222222222222222 3881 2222222222222222222222222222222222222222222222222222222 3882 2222222222222222222222222222222222222222222222222222222 3883 2222222222222222222222222222222222222222222222222222222 3884 2222222222222222222222222222222222222222222222222222222 3885 2222222222222222222222222222222222222222222222222222222 3886 2222222222222222222222222222222222222222222222222222222 3887 2222222222222222222222222222222222222222222222222222222 3888 2222222222222222222222222222222222222222222222222222222 3889 2222222222222222222222222222222222222222222222222222222 3890 2222222222222222222222222222222222222222222222222222222 3891 2222222222222222222222222222222222222222222222222222222 3892 2222222222222222222222222222222222222222222222222222222 3893 2222222222222222222222222222222222222222222222222222222 3894 2222222222222222222222222222222222222222222222222222222 3895 2222222222222222222222222222222222222222222222222222222 3896 2222222222222222222222222222222222222222222222222222222 3897 2222222222222222222222222222222222222222222222222222222 3898 2222222222222222222222222222222222222222222222222222222 3899 2222222222222222222222222222222222222222222222222222222 3900 2222222222222222222222222222222222222222222222222222222 3901 2222222222222222222222222222222222222222222222222222222 3902 2222222222222222222222222222222222222222222222222222222 3903 2222222222222222222222222222222222222222222222222222222 3904 2222222222222222222222222222222222222222222222222222222 3905 2222222222222222222222222222222222222222222222222222222 3906 2222222222222222222222222222222222222222222222222222222 3907 2222222222222222222222222222222222222222222222222222222 3908 2222222222222222222222222222222222222222222222222222222 3909 2222222222222222222222222222222222222222222222222222222 3910 2222222222222222222222222222222222222222222222222222222 3911 2222222222222222222222222222222222222222222222222222222 3912 2222222222222222222222222222222222222222222222222222222 3913 2222222222222222222222222222222222222222222222222222222 3914 2222222222222222222222222222222222222222222222222222222 3915 2222222222222222222222222222222222222222222222222222222 3916 2222222222222222222222222222222222222222222222222222222 3917 2222222222222222222222222222222222222222222222222222222 3918 2222222222222222222222222222222222222222222222222222222 3919 2222222222222222222222222222222222222222222222222222222 3920 2222222222222222222222222222222222222222222222222222222 3921 2222222222222222222222222222222222222222222222222222222 3922 2222222222222222222222222222222222222222222222222222222 3923 2222222222222222222222222222222222222222222222222222222 3924 2222222222222222222222222222222222222222222222222222222 3925 2222222222222222222222222222222222222222222222222222222 3926 2222222222222222222222222222222222222222222222222222222 3927 2222222222222222222222222222222222222222222222222222222 3928 2222222222222222222222222222222222222222222222222222222 3929 2222222222222222222222222222222222222222222222222222222 3930 2222222222222222222222222222222222222222222222222222222 3931 2222222222222222222222222222222222222222222222222222222 3932 2222222222222222222222222222222222222222222222222222222 3933 2222222222222222222222222222222222222222222222222222222 3934 2222222222222222222222222222222222222222222222222222222 3935 2222222222222222222222222222222222222222222222222222222 3936 2222222222222222222222222222222222222222222222222222222 3937 2222222222222222222222222222222222222222222222222222222 3938 2222222222222222222222222222222222222222222222222222222 3939 2222222222222222222222222222222222222222222222222222222 3940 2222222222222222222222222222222222222222222222222222222 3941 2222222222222222222222222222222222222222222222222222222 3942 2222222222222222222222222222222222222222222222222222222 3943 2222222222222222222222222222222222222222222222222222222 3944 2222222222222222222222222222222222222222222222222222222 3945 2222222222222222222222222222222222222222222222222222222 3946 2222222222222222222222222222222222222222222222222222222 3947 2222222222222222222222222222222222222222222222222222222 3948 2222222222222222222222222222222222222222222222222222222 3949 2222222222222222222222222222222222222222222222222222222 3950 2222222222222222222222222222222222222222222222222222222 3951 2222222222222222222222222222222222222222222222222222222 3952 2222222222222222222222222222222222222222222222222222222 3953 2222222222222222222222222222222222222222222222222222222 3954 2222222222222222222222222222222222222222222222222222222 3955 2222222222222222222222222222222222222222222222222222222 3956 2222222222222222222222222222222222222222222222222222222 3957 2222222222222222222222222222222222222222222222222222222 3958 2222222222222222222222222222222222222222222222222222222 3959 2222222222222222222222222222222222222222222222222222222 3960 2222222222222222222222222222222222222222222222222222222 3961 2222222222222222222222222222222222222222222222222222222 3962 2222222222222222222222222222222222222222222222222222222 3963 2222222222222222222222222222222222222222222222222222222 3964 2222222222222222222222222222222222222222222222222222222 3965 2222222222222222222222222222222222222222222222222222222 3966 2222222222222222222222222222222222222222222222222222222 3967 2222222222222222222222222222222222222222222222222222222 3968 2222222222222222222222222222222222222222222222222222222 3969 2222222222222222222222222222222222222222222222222222222 3970 2222222222222222222222222222222222222222222222222222222 3971 2222222222222222222222222222222222222222222222222222222 3972 2222222222222222222222222222222222222222222222222222222 3973 2222222222222222222222222222222222222222222222222222222 3974 2222222222222222222222222222222222222222222222222222222 3975 2222222222222222222222222222222222222222222222222222222 3976 2222222222222222222222222222222222222222222222222222222 3977 2222222222222222222222222222222222222222222222222222222 3978 2222222222222222222222222222222222222222222222222222222 3979 2222222222222222222222222222222222222222222222222222222 3980 2222222222222222222222222222222222222222222222222222222 3981 2222222222222222222222222222222222222222222222222222222 3982 2222222222222222222222222222222222222222222222222222222 3983 2222222222222222222222222222222222222222222222222222222 3984 2222222222222222222222222222222222222222222222222222222 3985 2222222222222222222222222222222222222222222222222222222 3986 2222222222222222222222222222222222222222222222222222222 3987 2222222222222222222222222222222222222222222222222222222 3988 2222222222222222222222222222222222222222222222222222222 3989 2222222222222222222222222222222222222222222222222222222 3990 2222222222222222222222222222222222222222222222222222222 3991 2222222222222222222222222222222222222222222222222222222 3992 2222222222222222222222222222222222222222222222222222222 3993 2222222222222222222222222222222222222222222222222222222 3994 2222222222222222222222222222222222222222222222222222222 3995 2222222222222222222222222222222222222222222222222222222 3996 2222222222222222222222222222222222222222222222222222222 3997 2222222222222222222222222222222222222222222222222222222 3998 2222222222222222222222222222222222222222222222222222222 3999 2222222222222222222222222222222222222222222222222222222 jetty-6.1.26/examples/test-webapp/src/main/webapp/WEB-INF/0000755000175000017500000000000011745736500021550 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/webapp/WEB-INF/acme-taglib.tld0000644000175000017500000000136310577720032024420 0ustar moonmoon 1.0 1.2 acme http://www.acme.com/taglib taglib example com.acme.TagListener date com.acme.DateTag TAGDEPENDENT Display Date tz false jetty-6.1.26/examples/test-webapp/src/main/webapp/WEB-INF/acme-taglib2.tld0000644000175000017500000000224610406016460024475 0ustar moonmoon Acme JSP2 tags 1.0 acme2 http://www.acme.com/taglib2 Simple Date formatting date2 com.acme.Date2Tag scriptless Day of the Month day Month of the Year month Year year format true true jetty-6.1.26/examples/test-webapp/src/main/webapp/WEB-INF/jetty-web.xml0000644000175000017500000000123310610004161024160 0ustar moonmoon executing jetty-web.xml jetty-6.1.26/examples/test-webapp/src/main/webapp/WEB-INF/web.xml0000644000175000017500000002034611360715246023051 0ustar moonmoon Test WebApp com.acme.TestListener TestFilter com.acme.TestFilter remote false TestFilter /* MultiPart org.mortbay.servlet.MultiPartFilter deleteFiles true MultiPart /dump/* GzipFilter org.mortbay.servlet.jetty.IncludableGzipFilter bufferSize 8192 minGzipSize 1024 userAgent (?:Mozilla[^\(]*\(compatible;\s*+([^;]*);.*)|(?:.*?([^\s]+/[^\s]+).*) cacheSize 1024 excludedAgents MSIE 6.0 uncheckedPrintWriter true GzipFilter /* Throttle org.mortbay.servlet.ThrottlingFilter Throttle /dump/throttle/* Hello com.acme.HelloWorld 1 Hello /hello/* Dump com.acme.Dump 1 admin Dump /dump/* *.dump Session com.acme.SessionDump 1 Session /session/* Cookie com.acme.CookieDump 1 Cookie /cookie/* Dispatch com.acme.DispatchServlet 1 Dispatch /dispatch/* JspSnoop /snoop.jsp 1 JspSnoop /jspsnoop/* CGI org.mortbay.servlet.CGI 1 CGI /cgi-bin/* GoogleProxy org.mortbay.proxy.AsyncProxyServlet$Transparent 1 ProxyTohttp://www.google.com Prefix/google GoogleProxy /google/* 404 /jspsnoop/ERROR/404 java.io.IOException /jspsnoop/IOException Any User /dump/auth/* *.htm * relax /dump/auth/relax/* /auth/relax.txt GET HEAD Admin Role /dump/auth/admin/* content-administrator Forbidden /dump/auth/noaccess/* /auth/* SSL /dump/auth/ssl/* CONFIDENTIAL FORM Test Realm /logon.html?param=test /logonError.html?param=test http://www.acme.com/taglib /WEB-INF/acme-taglib.tld http://www.acme.com/taglib2 /WEB-INF/acme-taglib2.tld 5 jetty-6.1.26/examples/test-webapp/src/main/webapp/WEB-INF/tags/0000755000175000017500000000000011745736500022506 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/webapp/WEB-INF/tags/panel.tag0000644000175000017500000000056210406016460024272 0ustar moonmoon<%-- - Copyright (c) 2002 The Apache Software Foundation. All rights - reserved. --%> <%@ attribute name="color" %> <%@ attribute name="bgcolor" %> <%@ attribute name="title" %>
    ${title}
    jetty-6.1.26/examples/test-webapp/src/main/webapp/data.txt0000644000175000017500000224732010472631505022200 0ustar moonmoon0000 3333333333333333333333333333333333333333333333333333333 0001 3333333333333333333333333333333333333333333333333333333 0002 3333333333333333333333333333333333333333333333333333333 0003 3333333333333333333333333333333333333333333333333333333 0004 3333333333333333333333333333333333333333333333333333333 0005 3333333333333333333333333333333333333333333333333333333 0006 3333333333333333333333333333333333333333333333333333333 0007 3333333333333333333333333333333333333333333333333333333 0008 3333333333333333333333333333333333333333333333333333333 0009 3333333333333333333333333333333333333333333333333333333 0010 3333333333333333333333333333333333333333333333333333333 0011 3333333333333333333333333333333333333333333333333333333 0012 3333333333333333333333333333333333333333333333333333333 0013 3333333333333333333333333333333333333333333333333333333 0014 3333333333333333333333333333333333333333333333333333333 0015 3333333333333333333333333333333333333333333333333333333 0016 3333333333333333333333333333333333333333333333333333333 0017 3333333333333333333333333333333333333333333333333333333 0018 3333333333333333333333333333333333333333333333333333333 0019 3333333333333333333333333333333333333333333333333333333 0020 3333333333333333333333333333333333333333333333333333333 0021 3333333333333333333333333333333333333333333333333333333 0022 3333333333333333333333333333333333333333333333333333333 0023 3333333333333333333333333333333333333333333333333333333 0024 3333333333333333333333333333333333333333333333333333333 0025 3333333333333333333333333333333333333333333333333333333 0026 3333333333333333333333333333333333333333333333333333333 0027 3333333333333333333333333333333333333333333333333333333 0028 3333333333333333333333333333333333333333333333333333333 0029 3333333333333333333333333333333333333333333333333333333 0030 3333333333333333333333333333333333333333333333333333333 0031 3333333333333333333333333333333333333333333333333333333 0032 3333333333333333333333333333333333333333333333333333333 0033 3333333333333333333333333333333333333333333333333333333 0034 3333333333333333333333333333333333333333333333333333333 0035 3333333333333333333333333333333333333333333333333333333 0036 3333333333333333333333333333333333333333333333333333333 0037 3333333333333333333333333333333333333333333333333333333 0038 3333333333333333333333333333333333333333333333333333333 0039 3333333333333333333333333333333333333333333333333333333 0040 3333333333333333333333333333333333333333333333333333333 0041 3333333333333333333333333333333333333333333333333333333 0042 3333333333333333333333333333333333333333333333333333333 0043 3333333333333333333333333333333333333333333333333333333 0044 3333333333333333333333333333333333333333333333333333333 0045 3333333333333333333333333333333333333333333333333333333 0046 3333333333333333333333333333333333333333333333333333333 0047 3333333333333333333333333333333333333333333333333333333 0048 3333333333333333333333333333333333333333333333333333333 0049 3333333333333333333333333333333333333333333333333333333 0050 3333333333333333333333333333333333333333333333333333333 0051 3333333333333333333333333333333333333333333333333333333 0052 3333333333333333333333333333333333333333333333333333333 0053 3333333333333333333333333333333333333333333333333333333 0054 3333333333333333333333333333333333333333333333333333333 0055 3333333333333333333333333333333333333333333333333333333 0056 3333333333333333333333333333333333333333333333333333333 0057 3333333333333333333333333333333333333333333333333333333 0058 3333333333333333333333333333333333333333333333333333333 0059 3333333333333333333333333333333333333333333333333333333 0060 3333333333333333333333333333333333333333333333333333333 0061 3333333333333333333333333333333333333333333333333333333 0062 3333333333333333333333333333333333333333333333333333333 0063 3333333333333333333333333333333333333333333333333333333 0064 3333333333333333333333333333333333333333333333333333333 0065 3333333333333333333333333333333333333333333333333333333 0066 3333333333333333333333333333333333333333333333333333333 0067 3333333333333333333333333333333333333333333333333333333 0068 3333333333333333333333333333333333333333333333333333333 0069 3333333333333333333333333333333333333333333333333333333 0070 3333333333333333333333333333333333333333333333333333333 0071 3333333333333333333333333333333333333333333333333333333 0072 3333333333333333333333333333333333333333333333333333333 0073 3333333333333333333333333333333333333333333333333333333 0074 3333333333333333333333333333333333333333333333333333333 0075 3333333333333333333333333333333333333333333333333333333 0076 3333333333333333333333333333333333333333333333333333333 0077 3333333333333333333333333333333333333333333333333333333 0078 3333333333333333333333333333333333333333333333333333333 0079 3333333333333333333333333333333333333333333333333333333 0080 3333333333333333333333333333333333333333333333333333333 0081 3333333333333333333333333333333333333333333333333333333 0082 3333333333333333333333333333333333333333333333333333333 0083 3333333333333333333333333333333333333333333333333333333 0084 3333333333333333333333333333333333333333333333333333333 0085 3333333333333333333333333333333333333333333333333333333 0086 3333333333333333333333333333333333333333333333333333333 0087 3333333333333333333333333333333333333333333333333333333 0088 3333333333333333333333333333333333333333333333333333333 0089 3333333333333333333333333333333333333333333333333333333 0090 3333333333333333333333333333333333333333333333333333333 0091 3333333333333333333333333333333333333333333333333333333 0092 3333333333333333333333333333333333333333333333333333333 0093 3333333333333333333333333333333333333333333333333333333 0094 3333333333333333333333333333333333333333333333333333333 0095 3333333333333333333333333333333333333333333333333333333 0096 3333333333333333333333333333333333333333333333333333333 0097 3333333333333333333333333333333333333333333333333333333 0098 3333333333333333333333333333333333333333333333333333333 0099 3333333333333333333333333333333333333333333333333333333 0100 3333333333333333333333333333333333333333333333333333333 0101 3333333333333333333333333333333333333333333333333333333 0102 3333333333333333333333333333333333333333333333333333333 0103 3333333333333333333333333333333333333333333333333333333 0104 3333333333333333333333333333333333333333333333333333333 0105 3333333333333333333333333333333333333333333333333333333 0106 3333333333333333333333333333333333333333333333333333333 0107 3333333333333333333333333333333333333333333333333333333 0108 3333333333333333333333333333333333333333333333333333333 0109 3333333333333333333333333333333333333333333333333333333 0110 3333333333333333333333333333333333333333333333333333333 0111 3333333333333333333333333333333333333333333333333333333 0112 3333333333333333333333333333333333333333333333333333333 0113 3333333333333333333333333333333333333333333333333333333 0114 3333333333333333333333333333333333333333333333333333333 0115 3333333333333333333333333333333333333333333333333333333 0116 3333333333333333333333333333333333333333333333333333333 0117 3333333333333333333333333333333333333333333333333333333 0118 3333333333333333333333333333333333333333333333333333333 0119 3333333333333333333333333333333333333333333333333333333 0120 3333333333333333333333333333333333333333333333333333333 0121 3333333333333333333333333333333333333333333333333333333 0122 3333333333333333333333333333333333333333333333333333333 0123 3333333333333333333333333333333333333333333333333333333 0124 3333333333333333333333333333333333333333333333333333333 0125 3333333333333333333333333333333333333333333333333333333 0126 3333333333333333333333333333333333333333333333333333333 0127 3333333333333333333333333333333333333333333333333333333 0128 3333333333333333333333333333333333333333333333333333333 0129 3333333333333333333333333333333333333333333333333333333 0130 3333333333333333333333333333333333333333333333333333333 0131 3333333333333333333333333333333333333333333333333333333 0132 3333333333333333333333333333333333333333333333333333333 0133 3333333333333333333333333333333333333333333333333333333 0134 3333333333333333333333333333333333333333333333333333333 0135 3333333333333333333333333333333333333333333333333333333 0136 3333333333333333333333333333333333333333333333333333333 0137 3333333333333333333333333333333333333333333333333333333 0138 3333333333333333333333333333333333333333333333333333333 0139 3333333333333333333333333333333333333333333333333333333 0140 3333333333333333333333333333333333333333333333333333333 0141 3333333333333333333333333333333333333333333333333333333 0142 3333333333333333333333333333333333333333333333333333333 0143 3333333333333333333333333333333333333333333333333333333 0144 3333333333333333333333333333333333333333333333333333333 0145 3333333333333333333333333333333333333333333333333333333 0146 3333333333333333333333333333333333333333333333333333333 0147 3333333333333333333333333333333333333333333333333333333 0148 3333333333333333333333333333333333333333333333333333333 0149 3333333333333333333333333333333333333333333333333333333 0150 3333333333333333333333333333333333333333333333333333333 0151 3333333333333333333333333333333333333333333333333333333 0152 3333333333333333333333333333333333333333333333333333333 0153 3333333333333333333333333333333333333333333333333333333 0154 3333333333333333333333333333333333333333333333333333333 0155 3333333333333333333333333333333333333333333333333333333 0156 3333333333333333333333333333333333333333333333333333333 0157 3333333333333333333333333333333333333333333333333333333 0158 3333333333333333333333333333333333333333333333333333333 0159 3333333333333333333333333333333333333333333333333333333 0160 3333333333333333333333333333333333333333333333333333333 0161 3333333333333333333333333333333333333333333333333333333 0162 3333333333333333333333333333333333333333333333333333333 0163 3333333333333333333333333333333333333333333333333333333 0164 3333333333333333333333333333333333333333333333333333333 0165 3333333333333333333333333333333333333333333333333333333 0166 3333333333333333333333333333333333333333333333333333333 0167 3333333333333333333333333333333333333333333333333333333 0168 3333333333333333333333333333333333333333333333333333333 0169 3333333333333333333333333333333333333333333333333333333 0170 3333333333333333333333333333333333333333333333333333333 0171 3333333333333333333333333333333333333333333333333333333 0172 3333333333333333333333333333333333333333333333333333333 0173 3333333333333333333333333333333333333333333333333333333 0174 3333333333333333333333333333333333333333333333333333333 0175 3333333333333333333333333333333333333333333333333333333 0176 3333333333333333333333333333333333333333333333333333333 0177 3333333333333333333333333333333333333333333333333333333 0178 3333333333333333333333333333333333333333333333333333333 0179 3333333333333333333333333333333333333333333333333333333 0180 3333333333333333333333333333333333333333333333333333333 0181 3333333333333333333333333333333333333333333333333333333 0182 3333333333333333333333333333333333333333333333333333333 0183 3333333333333333333333333333333333333333333333333333333 0184 3333333333333333333333333333333333333333333333333333333 0185 3333333333333333333333333333333333333333333333333333333 0186 3333333333333333333333333333333333333333333333333333333 0187 3333333333333333333333333333333333333333333333333333333 0188 3333333333333333333333333333333333333333333333333333333 0189 3333333333333333333333333333333333333333333333333333333 0190 3333333333333333333333333333333333333333333333333333333 0191 3333333333333333333333333333333333333333333333333333333 0192 3333333333333333333333333333333333333333333333333333333 0193 3333333333333333333333333333333333333333333333333333333 0194 3333333333333333333333333333333333333333333333333333333 0195 3333333333333333333333333333333333333333333333333333333 0196 3333333333333333333333333333333333333333333333333333333 0197 3333333333333333333333333333333333333333333333333333333 0198 3333333333333333333333333333333333333333333333333333333 0199 3333333333333333333333333333333333333333333333333333333 0200 3333333333333333333333333333333333333333333333333333333 0201 3333333333333333333333333333333333333333333333333333333 0202 3333333333333333333333333333333333333333333333333333333 0203 3333333333333333333333333333333333333333333333333333333 0204 3333333333333333333333333333333333333333333333333333333 0205 3333333333333333333333333333333333333333333333333333333 0206 3333333333333333333333333333333333333333333333333333333 0207 3333333333333333333333333333333333333333333333333333333 0208 3333333333333333333333333333333333333333333333333333333 0209 3333333333333333333333333333333333333333333333333333333 0210 3333333333333333333333333333333333333333333333333333333 0211 3333333333333333333333333333333333333333333333333333333 0212 3333333333333333333333333333333333333333333333333333333 0213 3333333333333333333333333333333333333333333333333333333 0214 3333333333333333333333333333333333333333333333333333333 0215 3333333333333333333333333333333333333333333333333333333 0216 3333333333333333333333333333333333333333333333333333333 0217 3333333333333333333333333333333333333333333333333333333 0218 3333333333333333333333333333333333333333333333333333333 0219 3333333333333333333333333333333333333333333333333333333 0220 3333333333333333333333333333333333333333333333333333333 0221 3333333333333333333333333333333333333333333333333333333 0222 3333333333333333333333333333333333333333333333333333333 0223 3333333333333333333333333333333333333333333333333333333 0224 3333333333333333333333333333333333333333333333333333333 0225 3333333333333333333333333333333333333333333333333333333 0226 3333333333333333333333333333333333333333333333333333333 0227 3333333333333333333333333333333333333333333333333333333 0228 3333333333333333333333333333333333333333333333333333333 0229 3333333333333333333333333333333333333333333333333333333 0230 3333333333333333333333333333333333333333333333333333333 0231 3333333333333333333333333333333333333333333333333333333 0232 3333333333333333333333333333333333333333333333333333333 0233 3333333333333333333333333333333333333333333333333333333 0234 3333333333333333333333333333333333333333333333333333333 0235 3333333333333333333333333333333333333333333333333333333 0236 3333333333333333333333333333333333333333333333333333333 0237 3333333333333333333333333333333333333333333333333333333 0238 3333333333333333333333333333333333333333333333333333333 0239 3333333333333333333333333333333333333333333333333333333 0240 3333333333333333333333333333333333333333333333333333333 0241 3333333333333333333333333333333333333333333333333333333 0242 3333333333333333333333333333333333333333333333333333333 0243 3333333333333333333333333333333333333333333333333333333 0244 3333333333333333333333333333333333333333333333333333333 0245 3333333333333333333333333333333333333333333333333333333 0246 3333333333333333333333333333333333333333333333333333333 0247 3333333333333333333333333333333333333333333333333333333 0248 3333333333333333333333333333333333333333333333333333333 0249 3333333333333333333333333333333333333333333333333333333 0250 3333333333333333333333333333333333333333333333333333333 0251 3333333333333333333333333333333333333333333333333333333 0252 3333333333333333333333333333333333333333333333333333333 0253 3333333333333333333333333333333333333333333333333333333 0254 3333333333333333333333333333333333333333333333333333333 0255 3333333333333333333333333333333333333333333333333333333 0256 3333333333333333333333333333333333333333333333333333333 0257 3333333333333333333333333333333333333333333333333333333 0258 3333333333333333333333333333333333333333333333333333333 0259 3333333333333333333333333333333333333333333333333333333 0260 3333333333333333333333333333333333333333333333333333333 0261 3333333333333333333333333333333333333333333333333333333 0262 3333333333333333333333333333333333333333333333333333333 0263 3333333333333333333333333333333333333333333333333333333 0264 3333333333333333333333333333333333333333333333333333333 0265 3333333333333333333333333333333333333333333333333333333 0266 3333333333333333333333333333333333333333333333333333333 0267 3333333333333333333333333333333333333333333333333333333 0268 3333333333333333333333333333333333333333333333333333333 0269 3333333333333333333333333333333333333333333333333333333 0270 3333333333333333333333333333333333333333333333333333333 0271 3333333333333333333333333333333333333333333333333333333 0272 3333333333333333333333333333333333333333333333333333333 0273 3333333333333333333333333333333333333333333333333333333 0274 3333333333333333333333333333333333333333333333333333333 0275 3333333333333333333333333333333333333333333333333333333 0276 3333333333333333333333333333333333333333333333333333333 0277 3333333333333333333333333333333333333333333333333333333 0278 3333333333333333333333333333333333333333333333333333333 0279 3333333333333333333333333333333333333333333333333333333 0280 3333333333333333333333333333333333333333333333333333333 0281 3333333333333333333333333333333333333333333333333333333 0282 3333333333333333333333333333333333333333333333333333333 0283 3333333333333333333333333333333333333333333333333333333 0284 3333333333333333333333333333333333333333333333333333333 0285 3333333333333333333333333333333333333333333333333333333 0286 3333333333333333333333333333333333333333333333333333333 0287 3333333333333333333333333333333333333333333333333333333 0288 3333333333333333333333333333333333333333333333333333333 0289 3333333333333333333333333333333333333333333333333333333 0290 3333333333333333333333333333333333333333333333333333333 0291 3333333333333333333333333333333333333333333333333333333 0292 3333333333333333333333333333333333333333333333333333333 0293 3333333333333333333333333333333333333333333333333333333 0294 3333333333333333333333333333333333333333333333333333333 0295 3333333333333333333333333333333333333333333333333333333 0296 3333333333333333333333333333333333333333333333333333333 0297 3333333333333333333333333333333333333333333333333333333 0298 3333333333333333333333333333333333333333333333333333333 0299 3333333333333333333333333333333333333333333333333333333 0300 3333333333333333333333333333333333333333333333333333333 0301 3333333333333333333333333333333333333333333333333333333 0302 3333333333333333333333333333333333333333333333333333333 0303 3333333333333333333333333333333333333333333333333333333 0304 3333333333333333333333333333333333333333333333333333333 0305 3333333333333333333333333333333333333333333333333333333 0306 3333333333333333333333333333333333333333333333333333333 0307 3333333333333333333333333333333333333333333333333333333 0308 3333333333333333333333333333333333333333333333333333333 0309 3333333333333333333333333333333333333333333333333333333 0310 3333333333333333333333333333333333333333333333333333333 0311 3333333333333333333333333333333333333333333333333333333 0312 3333333333333333333333333333333333333333333333333333333 0313 3333333333333333333333333333333333333333333333333333333 0314 3333333333333333333333333333333333333333333333333333333 0315 3333333333333333333333333333333333333333333333333333333 0316 3333333333333333333333333333333333333333333333333333333 0317 3333333333333333333333333333333333333333333333333333333 0318 3333333333333333333333333333333333333333333333333333333 0319 3333333333333333333333333333333333333333333333333333333 0320 3333333333333333333333333333333333333333333333333333333 0321 3333333333333333333333333333333333333333333333333333333 0322 3333333333333333333333333333333333333333333333333333333 0323 3333333333333333333333333333333333333333333333333333333 0324 3333333333333333333333333333333333333333333333333333333 0325 3333333333333333333333333333333333333333333333333333333 0326 3333333333333333333333333333333333333333333333333333333 0327 3333333333333333333333333333333333333333333333333333333 0328 3333333333333333333333333333333333333333333333333333333 0329 3333333333333333333333333333333333333333333333333333333 0330 3333333333333333333333333333333333333333333333333333333 0331 3333333333333333333333333333333333333333333333333333333 0332 3333333333333333333333333333333333333333333333333333333 0333 3333333333333333333333333333333333333333333333333333333 0334 3333333333333333333333333333333333333333333333333333333 0335 3333333333333333333333333333333333333333333333333333333 0336 3333333333333333333333333333333333333333333333333333333 0337 3333333333333333333333333333333333333333333333333333333 0338 3333333333333333333333333333333333333333333333333333333 0339 3333333333333333333333333333333333333333333333333333333 0340 3333333333333333333333333333333333333333333333333333333 0341 3333333333333333333333333333333333333333333333333333333 0342 3333333333333333333333333333333333333333333333333333333 0343 3333333333333333333333333333333333333333333333333333333 0344 3333333333333333333333333333333333333333333333333333333 0345 3333333333333333333333333333333333333333333333333333333 0346 3333333333333333333333333333333333333333333333333333333 0347 3333333333333333333333333333333333333333333333333333333 0348 3333333333333333333333333333333333333333333333333333333 0349 3333333333333333333333333333333333333333333333333333333 0350 3333333333333333333333333333333333333333333333333333333 0351 3333333333333333333333333333333333333333333333333333333 0352 3333333333333333333333333333333333333333333333333333333 0353 3333333333333333333333333333333333333333333333333333333 0354 3333333333333333333333333333333333333333333333333333333 0355 3333333333333333333333333333333333333333333333333333333 0356 3333333333333333333333333333333333333333333333333333333 0357 3333333333333333333333333333333333333333333333333333333 0358 3333333333333333333333333333333333333333333333333333333 0359 3333333333333333333333333333333333333333333333333333333 0360 3333333333333333333333333333333333333333333333333333333 0361 3333333333333333333333333333333333333333333333333333333 0362 3333333333333333333333333333333333333333333333333333333 0363 3333333333333333333333333333333333333333333333333333333 0364 3333333333333333333333333333333333333333333333333333333 0365 3333333333333333333333333333333333333333333333333333333 0366 3333333333333333333333333333333333333333333333333333333 0367 3333333333333333333333333333333333333333333333333333333 0368 3333333333333333333333333333333333333333333333333333333 0369 3333333333333333333333333333333333333333333333333333333 0370 3333333333333333333333333333333333333333333333333333333 0371 3333333333333333333333333333333333333333333333333333333 0372 3333333333333333333333333333333333333333333333333333333 0373 3333333333333333333333333333333333333333333333333333333 0374 3333333333333333333333333333333333333333333333333333333 0375 3333333333333333333333333333333333333333333333333333333 0376 3333333333333333333333333333333333333333333333333333333 0377 3333333333333333333333333333333333333333333333333333333 0378 3333333333333333333333333333333333333333333333333333333 0379 3333333333333333333333333333333333333333333333333333333 0380 3333333333333333333333333333333333333333333333333333333 0381 3333333333333333333333333333333333333333333333333333333 0382 3333333333333333333333333333333333333333333333333333333 0383 3333333333333333333333333333333333333333333333333333333 0384 3333333333333333333333333333333333333333333333333333333 0385 3333333333333333333333333333333333333333333333333333333 0386 3333333333333333333333333333333333333333333333333333333 0387 3333333333333333333333333333333333333333333333333333333 0388 3333333333333333333333333333333333333333333333333333333 0389 3333333333333333333333333333333333333333333333333333333 0390 3333333333333333333333333333333333333333333333333333333 0391 3333333333333333333333333333333333333333333333333333333 0392 3333333333333333333333333333333333333333333333333333333 0393 3333333333333333333333333333333333333333333333333333333 0394 3333333333333333333333333333333333333333333333333333333 0395 3333333333333333333333333333333333333333333333333333333 0396 3333333333333333333333333333333333333333333333333333333 0397 3333333333333333333333333333333333333333333333333333333 0398 3333333333333333333333333333333333333333333333333333333 0399 3333333333333333333333333333333333333333333333333333333 0400 3333333333333333333333333333333333333333333333333333333 0401 3333333333333333333333333333333333333333333333333333333 0402 3333333333333333333333333333333333333333333333333333333 0403 3333333333333333333333333333333333333333333333333333333 0404 3333333333333333333333333333333333333333333333333333333 0405 3333333333333333333333333333333333333333333333333333333 0406 3333333333333333333333333333333333333333333333333333333 0407 3333333333333333333333333333333333333333333333333333333 0408 3333333333333333333333333333333333333333333333333333333 0409 3333333333333333333333333333333333333333333333333333333 0410 3333333333333333333333333333333333333333333333333333333 0411 3333333333333333333333333333333333333333333333333333333 0412 3333333333333333333333333333333333333333333333333333333 0413 3333333333333333333333333333333333333333333333333333333 0414 3333333333333333333333333333333333333333333333333333333 0415 3333333333333333333333333333333333333333333333333333333 0416 3333333333333333333333333333333333333333333333333333333 0417 3333333333333333333333333333333333333333333333333333333 0418 3333333333333333333333333333333333333333333333333333333 0419 3333333333333333333333333333333333333333333333333333333 0420 3333333333333333333333333333333333333333333333333333333 0421 3333333333333333333333333333333333333333333333333333333 0422 3333333333333333333333333333333333333333333333333333333 0423 3333333333333333333333333333333333333333333333333333333 0424 3333333333333333333333333333333333333333333333333333333 0425 3333333333333333333333333333333333333333333333333333333 0426 3333333333333333333333333333333333333333333333333333333 0427 3333333333333333333333333333333333333333333333333333333 0428 3333333333333333333333333333333333333333333333333333333 0429 3333333333333333333333333333333333333333333333333333333 0430 3333333333333333333333333333333333333333333333333333333 0431 3333333333333333333333333333333333333333333333333333333 0432 3333333333333333333333333333333333333333333333333333333 0433 3333333333333333333333333333333333333333333333333333333 0434 3333333333333333333333333333333333333333333333333333333 0435 3333333333333333333333333333333333333333333333333333333 0436 3333333333333333333333333333333333333333333333333333333 0437 3333333333333333333333333333333333333333333333333333333 0438 3333333333333333333333333333333333333333333333333333333 0439 3333333333333333333333333333333333333333333333333333333 0440 3333333333333333333333333333333333333333333333333333333 0441 3333333333333333333333333333333333333333333333333333333 0442 3333333333333333333333333333333333333333333333333333333 0443 3333333333333333333333333333333333333333333333333333333 0444 3333333333333333333333333333333333333333333333333333333 0445 3333333333333333333333333333333333333333333333333333333 0446 3333333333333333333333333333333333333333333333333333333 0447 3333333333333333333333333333333333333333333333333333333 0448 3333333333333333333333333333333333333333333333333333333 0449 3333333333333333333333333333333333333333333333333333333 0450 3333333333333333333333333333333333333333333333333333333 0451 3333333333333333333333333333333333333333333333333333333 0452 3333333333333333333333333333333333333333333333333333333 0453 3333333333333333333333333333333333333333333333333333333 0454 3333333333333333333333333333333333333333333333333333333 0455 3333333333333333333333333333333333333333333333333333333 0456 3333333333333333333333333333333333333333333333333333333 0457 3333333333333333333333333333333333333333333333333333333 0458 3333333333333333333333333333333333333333333333333333333 0459 3333333333333333333333333333333333333333333333333333333 0460 3333333333333333333333333333333333333333333333333333333 0461 3333333333333333333333333333333333333333333333333333333 0462 3333333333333333333333333333333333333333333333333333333 0463 3333333333333333333333333333333333333333333333333333333 0464 3333333333333333333333333333333333333333333333333333333 0465 3333333333333333333333333333333333333333333333333333333 0466 3333333333333333333333333333333333333333333333333333333 0467 3333333333333333333333333333333333333333333333333333333 0468 3333333333333333333333333333333333333333333333333333333 0469 3333333333333333333333333333333333333333333333333333333 0470 3333333333333333333333333333333333333333333333333333333 0471 3333333333333333333333333333333333333333333333333333333 0472 3333333333333333333333333333333333333333333333333333333 0473 3333333333333333333333333333333333333333333333333333333 0474 3333333333333333333333333333333333333333333333333333333 0475 3333333333333333333333333333333333333333333333333333333 0476 3333333333333333333333333333333333333333333333333333333 0477 3333333333333333333333333333333333333333333333333333333 0478 3333333333333333333333333333333333333333333333333333333 0479 3333333333333333333333333333333333333333333333333333333 0480 3333333333333333333333333333333333333333333333333333333 0481 3333333333333333333333333333333333333333333333333333333 0482 3333333333333333333333333333333333333333333333333333333 0483 3333333333333333333333333333333333333333333333333333333 0484 3333333333333333333333333333333333333333333333333333333 0485 3333333333333333333333333333333333333333333333333333333 0486 3333333333333333333333333333333333333333333333333333333 0487 3333333333333333333333333333333333333333333333333333333 0488 3333333333333333333333333333333333333333333333333333333 0489 3333333333333333333333333333333333333333333333333333333 0490 3333333333333333333333333333333333333333333333333333333 0491 3333333333333333333333333333333333333333333333333333333 0492 3333333333333333333333333333333333333333333333333333333 0493 3333333333333333333333333333333333333333333333333333333 0494 3333333333333333333333333333333333333333333333333333333 0495 3333333333333333333333333333333333333333333333333333333 0496 3333333333333333333333333333333333333333333333333333333 0497 3333333333333333333333333333333333333333333333333333333 0498 3333333333333333333333333333333333333333333333333333333 0499 3333333333333333333333333333333333333333333333333333333 0500 3333333333333333333333333333333333333333333333333333333 0501 3333333333333333333333333333333333333333333333333333333 0502 3333333333333333333333333333333333333333333333333333333 0503 3333333333333333333333333333333333333333333333333333333 0504 3333333333333333333333333333333333333333333333333333333 0505 3333333333333333333333333333333333333333333333333333333 0506 3333333333333333333333333333333333333333333333333333333 0507 3333333333333333333333333333333333333333333333333333333 0508 3333333333333333333333333333333333333333333333333333333 0509 3333333333333333333333333333333333333333333333333333333 0510 3333333333333333333333333333333333333333333333333333333 0511 3333333333333333333333333333333333333333333333333333333 0512 3333333333333333333333333333333333333333333333333333333 0513 3333333333333333333333333333333333333333333333333333333 0514 3333333333333333333333333333333333333333333333333333333 0515 3333333333333333333333333333333333333333333333333333333 0516 3333333333333333333333333333333333333333333333333333333 0517 3333333333333333333333333333333333333333333333333333333 0518 3333333333333333333333333333333333333333333333333333333 0519 3333333333333333333333333333333333333333333333333333333 0520 3333333333333333333333333333333333333333333333333333333 0521 3333333333333333333333333333333333333333333333333333333 0522 3333333333333333333333333333333333333333333333333333333 0523 3333333333333333333333333333333333333333333333333333333 0524 3333333333333333333333333333333333333333333333333333333 0525 3333333333333333333333333333333333333333333333333333333 0526 3333333333333333333333333333333333333333333333333333333 0527 3333333333333333333333333333333333333333333333333333333 0528 3333333333333333333333333333333333333333333333333333333 0529 3333333333333333333333333333333333333333333333333333333 0530 3333333333333333333333333333333333333333333333333333333 0531 3333333333333333333333333333333333333333333333333333333 0532 3333333333333333333333333333333333333333333333333333333 0533 3333333333333333333333333333333333333333333333333333333 0534 3333333333333333333333333333333333333333333333333333333 0535 3333333333333333333333333333333333333333333333333333333 0536 3333333333333333333333333333333333333333333333333333333 0537 3333333333333333333333333333333333333333333333333333333 0538 3333333333333333333333333333333333333333333333333333333 0539 3333333333333333333333333333333333333333333333333333333 0540 3333333333333333333333333333333333333333333333333333333 0541 3333333333333333333333333333333333333333333333333333333 0542 3333333333333333333333333333333333333333333333333333333 0543 3333333333333333333333333333333333333333333333333333333 0544 3333333333333333333333333333333333333333333333333333333 0545 3333333333333333333333333333333333333333333333333333333 0546 3333333333333333333333333333333333333333333333333333333 0547 3333333333333333333333333333333333333333333333333333333 0548 3333333333333333333333333333333333333333333333333333333 0549 3333333333333333333333333333333333333333333333333333333 0550 3333333333333333333333333333333333333333333333333333333 0551 3333333333333333333333333333333333333333333333333333333 0552 3333333333333333333333333333333333333333333333333333333 0553 3333333333333333333333333333333333333333333333333333333 0554 3333333333333333333333333333333333333333333333333333333 0555 3333333333333333333333333333333333333333333333333333333 0556 3333333333333333333333333333333333333333333333333333333 0557 3333333333333333333333333333333333333333333333333333333 0558 3333333333333333333333333333333333333333333333333333333 0559 3333333333333333333333333333333333333333333333333333333 0560 3333333333333333333333333333333333333333333333333333333 0561 3333333333333333333333333333333333333333333333333333333 0562 3333333333333333333333333333333333333333333333333333333 0563 3333333333333333333333333333333333333333333333333333333 0564 3333333333333333333333333333333333333333333333333333333 0565 3333333333333333333333333333333333333333333333333333333 0566 3333333333333333333333333333333333333333333333333333333 0567 3333333333333333333333333333333333333333333333333333333 0568 3333333333333333333333333333333333333333333333333333333 0569 3333333333333333333333333333333333333333333333333333333 0570 3333333333333333333333333333333333333333333333333333333 0571 3333333333333333333333333333333333333333333333333333333 0572 3333333333333333333333333333333333333333333333333333333 0573 3333333333333333333333333333333333333333333333333333333 0574 3333333333333333333333333333333333333333333333333333333 0575 3333333333333333333333333333333333333333333333333333333 0576 3333333333333333333333333333333333333333333333333333333 0577 3333333333333333333333333333333333333333333333333333333 0578 3333333333333333333333333333333333333333333333333333333 0579 3333333333333333333333333333333333333333333333333333333 0580 3333333333333333333333333333333333333333333333333333333 0581 3333333333333333333333333333333333333333333333333333333 0582 3333333333333333333333333333333333333333333333333333333 0583 3333333333333333333333333333333333333333333333333333333 0584 3333333333333333333333333333333333333333333333333333333 0585 3333333333333333333333333333333333333333333333333333333 0586 3333333333333333333333333333333333333333333333333333333 0587 3333333333333333333333333333333333333333333333333333333 0588 3333333333333333333333333333333333333333333333333333333 0589 3333333333333333333333333333333333333333333333333333333 0590 3333333333333333333333333333333333333333333333333333333 0591 3333333333333333333333333333333333333333333333333333333 0592 3333333333333333333333333333333333333333333333333333333 0593 3333333333333333333333333333333333333333333333333333333 0594 3333333333333333333333333333333333333333333333333333333 0595 3333333333333333333333333333333333333333333333333333333 0596 3333333333333333333333333333333333333333333333333333333 0597 3333333333333333333333333333333333333333333333333333333 0598 3333333333333333333333333333333333333333333333333333333 0599 3333333333333333333333333333333333333333333333333333333 0600 3333333333333333333333333333333333333333333333333333333 0601 3333333333333333333333333333333333333333333333333333333 0602 3333333333333333333333333333333333333333333333333333333 0603 3333333333333333333333333333333333333333333333333333333 0604 3333333333333333333333333333333333333333333333333333333 0605 3333333333333333333333333333333333333333333333333333333 0606 3333333333333333333333333333333333333333333333333333333 0607 3333333333333333333333333333333333333333333333333333333 0608 3333333333333333333333333333333333333333333333333333333 0609 3333333333333333333333333333333333333333333333333333333 0610 3333333333333333333333333333333333333333333333333333333 0611 3333333333333333333333333333333333333333333333333333333 0612 3333333333333333333333333333333333333333333333333333333 0613 3333333333333333333333333333333333333333333333333333333 0614 3333333333333333333333333333333333333333333333333333333 0615 3333333333333333333333333333333333333333333333333333333 0616 3333333333333333333333333333333333333333333333333333333 0617 3333333333333333333333333333333333333333333333333333333 0618 3333333333333333333333333333333333333333333333333333333 0619 3333333333333333333333333333333333333333333333333333333 0620 3333333333333333333333333333333333333333333333333333333 0621 3333333333333333333333333333333333333333333333333333333 0622 3333333333333333333333333333333333333333333333333333333 0623 3333333333333333333333333333333333333333333333333333333 0624 3333333333333333333333333333333333333333333333333333333 0625 3333333333333333333333333333333333333333333333333333333 0626 3333333333333333333333333333333333333333333333333333333 0627 3333333333333333333333333333333333333333333333333333333 0628 3333333333333333333333333333333333333333333333333333333 0629 3333333333333333333333333333333333333333333333333333333 0630 3333333333333333333333333333333333333333333333333333333 0631 3333333333333333333333333333333333333333333333333333333 0632 3333333333333333333333333333333333333333333333333333333 0633 3333333333333333333333333333333333333333333333333333333 0634 3333333333333333333333333333333333333333333333333333333 0635 3333333333333333333333333333333333333333333333333333333 0636 3333333333333333333333333333333333333333333333333333333 0637 3333333333333333333333333333333333333333333333333333333 0638 3333333333333333333333333333333333333333333333333333333 0639 3333333333333333333333333333333333333333333333333333333 0640 3333333333333333333333333333333333333333333333333333333 0641 3333333333333333333333333333333333333333333333333333333 0642 3333333333333333333333333333333333333333333333333333333 0643 3333333333333333333333333333333333333333333333333333333 0644 3333333333333333333333333333333333333333333333333333333 0645 3333333333333333333333333333333333333333333333333333333 0646 3333333333333333333333333333333333333333333333333333333 0647 3333333333333333333333333333333333333333333333333333333 0648 3333333333333333333333333333333333333333333333333333333 0649 3333333333333333333333333333333333333333333333333333333 0650 3333333333333333333333333333333333333333333333333333333 0651 3333333333333333333333333333333333333333333333333333333 0652 3333333333333333333333333333333333333333333333333333333 0653 3333333333333333333333333333333333333333333333333333333 0654 3333333333333333333333333333333333333333333333333333333 0655 3333333333333333333333333333333333333333333333333333333 0656 3333333333333333333333333333333333333333333333333333333 0657 3333333333333333333333333333333333333333333333333333333 0658 3333333333333333333333333333333333333333333333333333333 0659 3333333333333333333333333333333333333333333333333333333 0660 3333333333333333333333333333333333333333333333333333333 0661 3333333333333333333333333333333333333333333333333333333 0662 3333333333333333333333333333333333333333333333333333333 0663 3333333333333333333333333333333333333333333333333333333 0664 3333333333333333333333333333333333333333333333333333333 0665 3333333333333333333333333333333333333333333333333333333 0666 3333333333333333333333333333333333333333333333333333333 0667 3333333333333333333333333333333333333333333333333333333 0668 3333333333333333333333333333333333333333333333333333333 0669 3333333333333333333333333333333333333333333333333333333 0670 3333333333333333333333333333333333333333333333333333333 0671 3333333333333333333333333333333333333333333333333333333 0672 3333333333333333333333333333333333333333333333333333333 0673 3333333333333333333333333333333333333333333333333333333 0674 3333333333333333333333333333333333333333333333333333333 0675 3333333333333333333333333333333333333333333333333333333 0676 3333333333333333333333333333333333333333333333333333333 0677 3333333333333333333333333333333333333333333333333333333 0678 3333333333333333333333333333333333333333333333333333333 0679 3333333333333333333333333333333333333333333333333333333 0680 3333333333333333333333333333333333333333333333333333333 0681 3333333333333333333333333333333333333333333333333333333 0682 3333333333333333333333333333333333333333333333333333333 0683 3333333333333333333333333333333333333333333333333333333 0684 3333333333333333333333333333333333333333333333333333333 0685 3333333333333333333333333333333333333333333333333333333 0686 3333333333333333333333333333333333333333333333333333333 0687 3333333333333333333333333333333333333333333333333333333 0688 3333333333333333333333333333333333333333333333333333333 0689 3333333333333333333333333333333333333333333333333333333 0690 3333333333333333333333333333333333333333333333333333333 0691 3333333333333333333333333333333333333333333333333333333 0692 3333333333333333333333333333333333333333333333333333333 0693 3333333333333333333333333333333333333333333333333333333 0694 3333333333333333333333333333333333333333333333333333333 0695 3333333333333333333333333333333333333333333333333333333 0696 3333333333333333333333333333333333333333333333333333333 0697 3333333333333333333333333333333333333333333333333333333 0698 3333333333333333333333333333333333333333333333333333333 0699 3333333333333333333333333333333333333333333333333333333 0700 3333333333333333333333333333333333333333333333333333333 0701 3333333333333333333333333333333333333333333333333333333 0702 3333333333333333333333333333333333333333333333333333333 0703 3333333333333333333333333333333333333333333333333333333 0704 3333333333333333333333333333333333333333333333333333333 0705 3333333333333333333333333333333333333333333333333333333 0706 3333333333333333333333333333333333333333333333333333333 0707 3333333333333333333333333333333333333333333333333333333 0708 3333333333333333333333333333333333333333333333333333333 0709 3333333333333333333333333333333333333333333333333333333 0710 3333333333333333333333333333333333333333333333333333333 0711 3333333333333333333333333333333333333333333333333333333 0712 3333333333333333333333333333333333333333333333333333333 0713 3333333333333333333333333333333333333333333333333333333 0714 3333333333333333333333333333333333333333333333333333333 0715 3333333333333333333333333333333333333333333333333333333 0716 3333333333333333333333333333333333333333333333333333333 0717 3333333333333333333333333333333333333333333333333333333 0718 3333333333333333333333333333333333333333333333333333333 0719 3333333333333333333333333333333333333333333333333333333 0720 3333333333333333333333333333333333333333333333333333333 0721 3333333333333333333333333333333333333333333333333333333 0722 3333333333333333333333333333333333333333333333333333333 0723 3333333333333333333333333333333333333333333333333333333 0724 3333333333333333333333333333333333333333333333333333333 0725 3333333333333333333333333333333333333333333333333333333 0726 3333333333333333333333333333333333333333333333333333333 0727 3333333333333333333333333333333333333333333333333333333 0728 3333333333333333333333333333333333333333333333333333333 0729 3333333333333333333333333333333333333333333333333333333 0730 3333333333333333333333333333333333333333333333333333333 0731 3333333333333333333333333333333333333333333333333333333 0732 3333333333333333333333333333333333333333333333333333333 0733 3333333333333333333333333333333333333333333333333333333 0734 3333333333333333333333333333333333333333333333333333333 0735 3333333333333333333333333333333333333333333333333333333 0736 3333333333333333333333333333333333333333333333333333333 0737 3333333333333333333333333333333333333333333333333333333 0738 3333333333333333333333333333333333333333333333333333333 0739 3333333333333333333333333333333333333333333333333333333 0740 3333333333333333333333333333333333333333333333333333333 0741 3333333333333333333333333333333333333333333333333333333 0742 3333333333333333333333333333333333333333333333333333333 0743 3333333333333333333333333333333333333333333333333333333 0744 3333333333333333333333333333333333333333333333333333333 0745 3333333333333333333333333333333333333333333333333333333 0746 3333333333333333333333333333333333333333333333333333333 0747 3333333333333333333333333333333333333333333333333333333 0748 3333333333333333333333333333333333333333333333333333333 0749 3333333333333333333333333333333333333333333333333333333 0750 3333333333333333333333333333333333333333333333333333333 0751 3333333333333333333333333333333333333333333333333333333 0752 3333333333333333333333333333333333333333333333333333333 0753 3333333333333333333333333333333333333333333333333333333 0754 3333333333333333333333333333333333333333333333333333333 0755 3333333333333333333333333333333333333333333333333333333 0756 3333333333333333333333333333333333333333333333333333333 0757 3333333333333333333333333333333333333333333333333333333 0758 3333333333333333333333333333333333333333333333333333333 0759 3333333333333333333333333333333333333333333333333333333 0760 3333333333333333333333333333333333333333333333333333333 0761 3333333333333333333333333333333333333333333333333333333 0762 3333333333333333333333333333333333333333333333333333333 0763 3333333333333333333333333333333333333333333333333333333 0764 3333333333333333333333333333333333333333333333333333333 0765 3333333333333333333333333333333333333333333333333333333 0766 3333333333333333333333333333333333333333333333333333333 0767 3333333333333333333333333333333333333333333333333333333 0768 3333333333333333333333333333333333333333333333333333333 0769 3333333333333333333333333333333333333333333333333333333 0770 3333333333333333333333333333333333333333333333333333333 0771 3333333333333333333333333333333333333333333333333333333 0772 3333333333333333333333333333333333333333333333333333333 0773 3333333333333333333333333333333333333333333333333333333 0774 3333333333333333333333333333333333333333333333333333333 0775 3333333333333333333333333333333333333333333333333333333 0776 3333333333333333333333333333333333333333333333333333333 0777 3333333333333333333333333333333333333333333333333333333 0778 3333333333333333333333333333333333333333333333333333333 0779 3333333333333333333333333333333333333333333333333333333 0780 3333333333333333333333333333333333333333333333333333333 0781 3333333333333333333333333333333333333333333333333333333 0782 3333333333333333333333333333333333333333333333333333333 0783 3333333333333333333333333333333333333333333333333333333 0784 3333333333333333333333333333333333333333333333333333333 0785 3333333333333333333333333333333333333333333333333333333 0786 3333333333333333333333333333333333333333333333333333333 0787 3333333333333333333333333333333333333333333333333333333 0788 3333333333333333333333333333333333333333333333333333333 0789 3333333333333333333333333333333333333333333333333333333 0790 3333333333333333333333333333333333333333333333333333333 0791 3333333333333333333333333333333333333333333333333333333 0792 3333333333333333333333333333333333333333333333333333333 0793 3333333333333333333333333333333333333333333333333333333 0794 3333333333333333333333333333333333333333333333333333333 0795 3333333333333333333333333333333333333333333333333333333 0796 3333333333333333333333333333333333333333333333333333333 0797 3333333333333333333333333333333333333333333333333333333 0798 3333333333333333333333333333333333333333333333333333333 0799 3333333333333333333333333333333333333333333333333333333 0800 3333333333333333333333333333333333333333333333333333333 0801 3333333333333333333333333333333333333333333333333333333 0802 3333333333333333333333333333333333333333333333333333333 0803 3333333333333333333333333333333333333333333333333333333 0804 3333333333333333333333333333333333333333333333333333333 0805 3333333333333333333333333333333333333333333333333333333 0806 3333333333333333333333333333333333333333333333333333333 0807 3333333333333333333333333333333333333333333333333333333 0808 3333333333333333333333333333333333333333333333333333333 0809 3333333333333333333333333333333333333333333333333333333 0810 3333333333333333333333333333333333333333333333333333333 0811 3333333333333333333333333333333333333333333333333333333 0812 3333333333333333333333333333333333333333333333333333333 0813 3333333333333333333333333333333333333333333333333333333 0814 3333333333333333333333333333333333333333333333333333333 0815 3333333333333333333333333333333333333333333333333333333 0816 3333333333333333333333333333333333333333333333333333333 0817 3333333333333333333333333333333333333333333333333333333 0818 3333333333333333333333333333333333333333333333333333333 0819 3333333333333333333333333333333333333333333333333333333 0820 3333333333333333333333333333333333333333333333333333333 0821 3333333333333333333333333333333333333333333333333333333 0822 3333333333333333333333333333333333333333333333333333333 0823 3333333333333333333333333333333333333333333333333333333 0824 3333333333333333333333333333333333333333333333333333333 0825 3333333333333333333333333333333333333333333333333333333 0826 3333333333333333333333333333333333333333333333333333333 0827 3333333333333333333333333333333333333333333333333333333 0828 3333333333333333333333333333333333333333333333333333333 0829 3333333333333333333333333333333333333333333333333333333 0830 3333333333333333333333333333333333333333333333333333333 0831 3333333333333333333333333333333333333333333333333333333 0832 3333333333333333333333333333333333333333333333333333333 0833 3333333333333333333333333333333333333333333333333333333 0834 3333333333333333333333333333333333333333333333333333333 0835 3333333333333333333333333333333333333333333333333333333 0836 3333333333333333333333333333333333333333333333333333333 0837 3333333333333333333333333333333333333333333333333333333 0838 3333333333333333333333333333333333333333333333333333333 0839 3333333333333333333333333333333333333333333333333333333 0840 3333333333333333333333333333333333333333333333333333333 0841 3333333333333333333333333333333333333333333333333333333 0842 3333333333333333333333333333333333333333333333333333333 0843 3333333333333333333333333333333333333333333333333333333 0844 3333333333333333333333333333333333333333333333333333333 0845 3333333333333333333333333333333333333333333333333333333 0846 3333333333333333333333333333333333333333333333333333333 0847 3333333333333333333333333333333333333333333333333333333 0848 3333333333333333333333333333333333333333333333333333333 0849 3333333333333333333333333333333333333333333333333333333 0850 3333333333333333333333333333333333333333333333333333333 0851 3333333333333333333333333333333333333333333333333333333 0852 3333333333333333333333333333333333333333333333333333333 0853 3333333333333333333333333333333333333333333333333333333 0854 3333333333333333333333333333333333333333333333333333333 0855 3333333333333333333333333333333333333333333333333333333 0856 3333333333333333333333333333333333333333333333333333333 0857 3333333333333333333333333333333333333333333333333333333 0858 3333333333333333333333333333333333333333333333333333333 0859 3333333333333333333333333333333333333333333333333333333 0860 3333333333333333333333333333333333333333333333333333333 0861 3333333333333333333333333333333333333333333333333333333 0862 3333333333333333333333333333333333333333333333333333333 0863 3333333333333333333333333333333333333333333333333333333 0864 3333333333333333333333333333333333333333333333333333333 0865 3333333333333333333333333333333333333333333333333333333 0866 3333333333333333333333333333333333333333333333333333333 0867 3333333333333333333333333333333333333333333333333333333 0868 3333333333333333333333333333333333333333333333333333333 0869 3333333333333333333333333333333333333333333333333333333 0870 3333333333333333333333333333333333333333333333333333333 0871 3333333333333333333333333333333333333333333333333333333 0872 3333333333333333333333333333333333333333333333333333333 0873 3333333333333333333333333333333333333333333333333333333 0874 3333333333333333333333333333333333333333333333333333333 0875 3333333333333333333333333333333333333333333333333333333 0876 3333333333333333333333333333333333333333333333333333333 0877 3333333333333333333333333333333333333333333333333333333 0878 3333333333333333333333333333333333333333333333333333333 0879 3333333333333333333333333333333333333333333333333333333 0880 3333333333333333333333333333333333333333333333333333333 0881 3333333333333333333333333333333333333333333333333333333 0882 3333333333333333333333333333333333333333333333333333333 0883 3333333333333333333333333333333333333333333333333333333 0884 3333333333333333333333333333333333333333333333333333333 0885 3333333333333333333333333333333333333333333333333333333 0886 3333333333333333333333333333333333333333333333333333333 0887 3333333333333333333333333333333333333333333333333333333 0888 3333333333333333333333333333333333333333333333333333333 0889 3333333333333333333333333333333333333333333333333333333 0890 3333333333333333333333333333333333333333333333333333333 0891 3333333333333333333333333333333333333333333333333333333 0892 3333333333333333333333333333333333333333333333333333333 0893 3333333333333333333333333333333333333333333333333333333 0894 3333333333333333333333333333333333333333333333333333333 0895 3333333333333333333333333333333333333333333333333333333 0896 3333333333333333333333333333333333333333333333333333333 0897 3333333333333333333333333333333333333333333333333333333 0898 3333333333333333333333333333333333333333333333333333333 0899 3333333333333333333333333333333333333333333333333333333 0900 3333333333333333333333333333333333333333333333333333333 0901 3333333333333333333333333333333333333333333333333333333 0902 3333333333333333333333333333333333333333333333333333333 0903 3333333333333333333333333333333333333333333333333333333 0904 3333333333333333333333333333333333333333333333333333333 0905 3333333333333333333333333333333333333333333333333333333 0906 3333333333333333333333333333333333333333333333333333333 0907 3333333333333333333333333333333333333333333333333333333 0908 3333333333333333333333333333333333333333333333333333333 0909 3333333333333333333333333333333333333333333333333333333 0910 3333333333333333333333333333333333333333333333333333333 0911 3333333333333333333333333333333333333333333333333333333 0912 3333333333333333333333333333333333333333333333333333333 0913 3333333333333333333333333333333333333333333333333333333 0914 3333333333333333333333333333333333333333333333333333333 0915 3333333333333333333333333333333333333333333333333333333 0916 3333333333333333333333333333333333333333333333333333333 0917 3333333333333333333333333333333333333333333333333333333 0918 3333333333333333333333333333333333333333333333333333333 0919 3333333333333333333333333333333333333333333333333333333 0920 3333333333333333333333333333333333333333333333333333333 0921 3333333333333333333333333333333333333333333333333333333 0922 3333333333333333333333333333333333333333333333333333333 0923 3333333333333333333333333333333333333333333333333333333 0924 3333333333333333333333333333333333333333333333333333333 0925 3333333333333333333333333333333333333333333333333333333 0926 3333333333333333333333333333333333333333333333333333333 0927 3333333333333333333333333333333333333333333333333333333 0928 3333333333333333333333333333333333333333333333333333333 0929 3333333333333333333333333333333333333333333333333333333 0930 3333333333333333333333333333333333333333333333333333333 0931 3333333333333333333333333333333333333333333333333333333 0932 3333333333333333333333333333333333333333333333333333333 0933 3333333333333333333333333333333333333333333333333333333 0934 3333333333333333333333333333333333333333333333333333333 0935 3333333333333333333333333333333333333333333333333333333 0936 3333333333333333333333333333333333333333333333333333333 0937 3333333333333333333333333333333333333333333333333333333 0938 3333333333333333333333333333333333333333333333333333333 0939 3333333333333333333333333333333333333333333333333333333 0940 3333333333333333333333333333333333333333333333333333333 0941 3333333333333333333333333333333333333333333333333333333 0942 3333333333333333333333333333333333333333333333333333333 0943 3333333333333333333333333333333333333333333333333333333 0944 3333333333333333333333333333333333333333333333333333333 0945 3333333333333333333333333333333333333333333333333333333 0946 3333333333333333333333333333333333333333333333333333333 0947 3333333333333333333333333333333333333333333333333333333 0948 3333333333333333333333333333333333333333333333333333333 0949 3333333333333333333333333333333333333333333333333333333 0950 3333333333333333333333333333333333333333333333333333333 0951 3333333333333333333333333333333333333333333333333333333 0952 3333333333333333333333333333333333333333333333333333333 0953 3333333333333333333333333333333333333333333333333333333 0954 3333333333333333333333333333333333333333333333333333333 0955 3333333333333333333333333333333333333333333333333333333 0956 3333333333333333333333333333333333333333333333333333333 0957 3333333333333333333333333333333333333333333333333333333 0958 3333333333333333333333333333333333333333333333333333333 0959 3333333333333333333333333333333333333333333333333333333 0960 3333333333333333333333333333333333333333333333333333333 0961 3333333333333333333333333333333333333333333333333333333 0962 3333333333333333333333333333333333333333333333333333333 0963 3333333333333333333333333333333333333333333333333333333 0964 3333333333333333333333333333333333333333333333333333333 0965 3333333333333333333333333333333333333333333333333333333 0966 3333333333333333333333333333333333333333333333333333333 0967 3333333333333333333333333333333333333333333333333333333 0968 3333333333333333333333333333333333333333333333333333333 0969 3333333333333333333333333333333333333333333333333333333 0970 3333333333333333333333333333333333333333333333333333333 0971 3333333333333333333333333333333333333333333333333333333 0972 3333333333333333333333333333333333333333333333333333333 0973 3333333333333333333333333333333333333333333333333333333 0974 3333333333333333333333333333333333333333333333333333333 0975 3333333333333333333333333333333333333333333333333333333 0976 3333333333333333333333333333333333333333333333333333333 0977 3333333333333333333333333333333333333333333333333333333 0978 3333333333333333333333333333333333333333333333333333333 0979 3333333333333333333333333333333333333333333333333333333 0980 3333333333333333333333333333333333333333333333333333333 0981 3333333333333333333333333333333333333333333333333333333 0982 3333333333333333333333333333333333333333333333333333333 0983 3333333333333333333333333333333333333333333333333333333 0984 3333333333333333333333333333333333333333333333333333333 0985 3333333333333333333333333333333333333333333333333333333 0986 3333333333333333333333333333333333333333333333333333333 0987 3333333333333333333333333333333333333333333333333333333 0988 3333333333333333333333333333333333333333333333333333333 0989 3333333333333333333333333333333333333333333333333333333 0990 3333333333333333333333333333333333333333333333333333333 0991 3333333333333333333333333333333333333333333333333333333 0992 3333333333333333333333333333333333333333333333333333333 0993 3333333333333333333333333333333333333333333333333333333 0994 3333333333333333333333333333333333333333333333333333333 0995 3333333333333333333333333333333333333333333333333333333 0996 3333333333333333333333333333333333333333333333333333333 0997 3333333333333333333333333333333333333333333333333333333 0998 3333333333333333333333333333333333333333333333333333333 0999 3333333333333333333333333333333333333333333333333333333 1000 3333333333333333333333333333333333333333333333333333333 1001 3333333333333333333333333333333333333333333333333333333 1002 3333333333333333333333333333333333333333333333333333333 1003 3333333333333333333333333333333333333333333333333333333 1004 3333333333333333333333333333333333333333333333333333333 1005 3333333333333333333333333333333333333333333333333333333 1006 3333333333333333333333333333333333333333333333333333333 1007 3333333333333333333333333333333333333333333333333333333 1008 3333333333333333333333333333333333333333333333333333333 1009 3333333333333333333333333333333333333333333333333333333 1010 3333333333333333333333333333333333333333333333333333333 1011 3333333333333333333333333333333333333333333333333333333 1012 3333333333333333333333333333333333333333333333333333333 1013 3333333333333333333333333333333333333333333333333333333 1014 3333333333333333333333333333333333333333333333333333333 1015 3333333333333333333333333333333333333333333333333333333 1016 3333333333333333333333333333333333333333333333333333333 1017 3333333333333333333333333333333333333333333333333333333 1018 3333333333333333333333333333333333333333333333333333333 1019 3333333333333333333333333333333333333333333333333333333 1020 3333333333333333333333333333333333333333333333333333333 1021 3333333333333333333333333333333333333333333333333333333 1022 3333333333333333333333333333333333333333333333333333333 1023 3333333333333333333333333333333333333333333333333333333 1024 3333333333333333333333333333333333333333333333333333333 1025 3333333333333333333333333333333333333333333333333333333 1026 3333333333333333333333333333333333333333333333333333333 1027 3333333333333333333333333333333333333333333333333333333 1028 3333333333333333333333333333333333333333333333333333333 1029 3333333333333333333333333333333333333333333333333333333 1030 3333333333333333333333333333333333333333333333333333333 1031 3333333333333333333333333333333333333333333333333333333 1032 3333333333333333333333333333333333333333333333333333333 1033 3333333333333333333333333333333333333333333333333333333 1034 3333333333333333333333333333333333333333333333333333333 1035 3333333333333333333333333333333333333333333333333333333 1036 3333333333333333333333333333333333333333333333333333333 1037 3333333333333333333333333333333333333333333333333333333 1038 3333333333333333333333333333333333333333333333333333333 1039 3333333333333333333333333333333333333333333333333333333 1040 3333333333333333333333333333333333333333333333333333333 1041 3333333333333333333333333333333333333333333333333333333 1042 3333333333333333333333333333333333333333333333333333333 1043 3333333333333333333333333333333333333333333333333333333 1044 3333333333333333333333333333333333333333333333333333333 1045 3333333333333333333333333333333333333333333333333333333 1046 3333333333333333333333333333333333333333333333333333333 1047 3333333333333333333333333333333333333333333333333333333 1048 3333333333333333333333333333333333333333333333333333333 1049 3333333333333333333333333333333333333333333333333333333 1050 3333333333333333333333333333333333333333333333333333333 1051 3333333333333333333333333333333333333333333333333333333 1052 3333333333333333333333333333333333333333333333333333333 1053 3333333333333333333333333333333333333333333333333333333 1054 3333333333333333333333333333333333333333333333333333333 1055 3333333333333333333333333333333333333333333333333333333 1056 3333333333333333333333333333333333333333333333333333333 1057 3333333333333333333333333333333333333333333333333333333 1058 3333333333333333333333333333333333333333333333333333333 1059 3333333333333333333333333333333333333333333333333333333 1060 3333333333333333333333333333333333333333333333333333333 1061 3333333333333333333333333333333333333333333333333333333 1062 3333333333333333333333333333333333333333333333333333333 1063 3333333333333333333333333333333333333333333333333333333 1064 3333333333333333333333333333333333333333333333333333333 1065 3333333333333333333333333333333333333333333333333333333 1066 3333333333333333333333333333333333333333333333333333333 1067 3333333333333333333333333333333333333333333333333333333 1068 3333333333333333333333333333333333333333333333333333333 1069 3333333333333333333333333333333333333333333333333333333 1070 3333333333333333333333333333333333333333333333333333333 1071 3333333333333333333333333333333333333333333333333333333 1072 3333333333333333333333333333333333333333333333333333333 1073 3333333333333333333333333333333333333333333333333333333 1074 3333333333333333333333333333333333333333333333333333333 1075 3333333333333333333333333333333333333333333333333333333 1076 3333333333333333333333333333333333333333333333333333333 1077 3333333333333333333333333333333333333333333333333333333 1078 3333333333333333333333333333333333333333333333333333333 1079 3333333333333333333333333333333333333333333333333333333 1080 3333333333333333333333333333333333333333333333333333333 1081 3333333333333333333333333333333333333333333333333333333 1082 3333333333333333333333333333333333333333333333333333333 1083 3333333333333333333333333333333333333333333333333333333 1084 3333333333333333333333333333333333333333333333333333333 1085 3333333333333333333333333333333333333333333333333333333 1086 3333333333333333333333333333333333333333333333333333333 1087 3333333333333333333333333333333333333333333333333333333 1088 3333333333333333333333333333333333333333333333333333333 1089 3333333333333333333333333333333333333333333333333333333 1090 3333333333333333333333333333333333333333333333333333333 1091 3333333333333333333333333333333333333333333333333333333 1092 3333333333333333333333333333333333333333333333333333333 1093 3333333333333333333333333333333333333333333333333333333 1094 3333333333333333333333333333333333333333333333333333333 1095 3333333333333333333333333333333333333333333333333333333 1096 3333333333333333333333333333333333333333333333333333333 1097 3333333333333333333333333333333333333333333333333333333 1098 3333333333333333333333333333333333333333333333333333333 1099 3333333333333333333333333333333333333333333333333333333 1100 3333333333333333333333333333333333333333333333333333333 1101 3333333333333333333333333333333333333333333333333333333 1102 3333333333333333333333333333333333333333333333333333333 1103 3333333333333333333333333333333333333333333333333333333 1104 3333333333333333333333333333333333333333333333333333333 1105 3333333333333333333333333333333333333333333333333333333 1106 3333333333333333333333333333333333333333333333333333333 1107 3333333333333333333333333333333333333333333333333333333 1108 3333333333333333333333333333333333333333333333333333333 1109 3333333333333333333333333333333333333333333333333333333 1110 3333333333333333333333333333333333333333333333333333333 1111 3333333333333333333333333333333333333333333333333333333 1112 3333333333333333333333333333333333333333333333333333333 1113 3333333333333333333333333333333333333333333333333333333 1114 3333333333333333333333333333333333333333333333333333333 1115 3333333333333333333333333333333333333333333333333333333 1116 3333333333333333333333333333333333333333333333333333333 1117 3333333333333333333333333333333333333333333333333333333 1118 3333333333333333333333333333333333333333333333333333333 1119 3333333333333333333333333333333333333333333333333333333 1120 3333333333333333333333333333333333333333333333333333333 1121 3333333333333333333333333333333333333333333333333333333 1122 3333333333333333333333333333333333333333333333333333333 1123 3333333333333333333333333333333333333333333333333333333 1124 3333333333333333333333333333333333333333333333333333333 1125 3333333333333333333333333333333333333333333333333333333 1126 3333333333333333333333333333333333333333333333333333333 1127 3333333333333333333333333333333333333333333333333333333 1128 3333333333333333333333333333333333333333333333333333333 1129 3333333333333333333333333333333333333333333333333333333 1130 3333333333333333333333333333333333333333333333333333333 1131 3333333333333333333333333333333333333333333333333333333 1132 3333333333333333333333333333333333333333333333333333333 1133 3333333333333333333333333333333333333333333333333333333 1134 3333333333333333333333333333333333333333333333333333333 1135 3333333333333333333333333333333333333333333333333333333 1136 3333333333333333333333333333333333333333333333333333333 1137 3333333333333333333333333333333333333333333333333333333 1138 3333333333333333333333333333333333333333333333333333333 1139 3333333333333333333333333333333333333333333333333333333 1140 3333333333333333333333333333333333333333333333333333333 1141 3333333333333333333333333333333333333333333333333333333 1142 3333333333333333333333333333333333333333333333333333333 1143 3333333333333333333333333333333333333333333333333333333 1144 3333333333333333333333333333333333333333333333333333333 1145 3333333333333333333333333333333333333333333333333333333 1146 3333333333333333333333333333333333333333333333333333333 1147 3333333333333333333333333333333333333333333333333333333 1148 3333333333333333333333333333333333333333333333333333333 1149 3333333333333333333333333333333333333333333333333333333 1150 3333333333333333333333333333333333333333333333333333333 1151 3333333333333333333333333333333333333333333333333333333 1152 3333333333333333333333333333333333333333333333333333333 1153 3333333333333333333333333333333333333333333333333333333 1154 3333333333333333333333333333333333333333333333333333333 1155 3333333333333333333333333333333333333333333333333333333 1156 3333333333333333333333333333333333333333333333333333333 1157 3333333333333333333333333333333333333333333333333333333 1158 3333333333333333333333333333333333333333333333333333333 1159 3333333333333333333333333333333333333333333333333333333 1160 3333333333333333333333333333333333333333333333333333333 1161 3333333333333333333333333333333333333333333333333333333 1162 3333333333333333333333333333333333333333333333333333333 1163 3333333333333333333333333333333333333333333333333333333 1164 3333333333333333333333333333333333333333333333333333333 1165 3333333333333333333333333333333333333333333333333333333 1166 3333333333333333333333333333333333333333333333333333333 1167 3333333333333333333333333333333333333333333333333333333 1168 3333333333333333333333333333333333333333333333333333333 1169 3333333333333333333333333333333333333333333333333333333 1170 3333333333333333333333333333333333333333333333333333333 1171 3333333333333333333333333333333333333333333333333333333 1172 3333333333333333333333333333333333333333333333333333333 1173 3333333333333333333333333333333333333333333333333333333 1174 3333333333333333333333333333333333333333333333333333333 1175 3333333333333333333333333333333333333333333333333333333 1176 3333333333333333333333333333333333333333333333333333333 1177 3333333333333333333333333333333333333333333333333333333 1178 3333333333333333333333333333333333333333333333333333333 1179 3333333333333333333333333333333333333333333333333333333 1180 3333333333333333333333333333333333333333333333333333333 1181 3333333333333333333333333333333333333333333333333333333 1182 3333333333333333333333333333333333333333333333333333333 1183 3333333333333333333333333333333333333333333333333333333 1184 3333333333333333333333333333333333333333333333333333333 1185 3333333333333333333333333333333333333333333333333333333 1186 3333333333333333333333333333333333333333333333333333333 1187 3333333333333333333333333333333333333333333333333333333 1188 3333333333333333333333333333333333333333333333333333333 1189 3333333333333333333333333333333333333333333333333333333 1190 3333333333333333333333333333333333333333333333333333333 1191 3333333333333333333333333333333333333333333333333333333 1192 3333333333333333333333333333333333333333333333333333333 1193 3333333333333333333333333333333333333333333333333333333 1194 3333333333333333333333333333333333333333333333333333333 1195 3333333333333333333333333333333333333333333333333333333 1196 3333333333333333333333333333333333333333333333333333333 1197 3333333333333333333333333333333333333333333333333333333 1198 3333333333333333333333333333333333333333333333333333333 1199 3333333333333333333333333333333333333333333333333333333 1200 3333333333333333333333333333333333333333333333333333333 1201 3333333333333333333333333333333333333333333333333333333 1202 3333333333333333333333333333333333333333333333333333333 1203 3333333333333333333333333333333333333333333333333333333 1204 3333333333333333333333333333333333333333333333333333333 1205 3333333333333333333333333333333333333333333333333333333 1206 3333333333333333333333333333333333333333333333333333333 1207 3333333333333333333333333333333333333333333333333333333 1208 3333333333333333333333333333333333333333333333333333333 1209 3333333333333333333333333333333333333333333333333333333 1210 3333333333333333333333333333333333333333333333333333333 1211 3333333333333333333333333333333333333333333333333333333 1212 3333333333333333333333333333333333333333333333333333333 1213 3333333333333333333333333333333333333333333333333333333 1214 3333333333333333333333333333333333333333333333333333333 1215 3333333333333333333333333333333333333333333333333333333 1216 3333333333333333333333333333333333333333333333333333333 1217 3333333333333333333333333333333333333333333333333333333 1218 3333333333333333333333333333333333333333333333333333333 1219 3333333333333333333333333333333333333333333333333333333 1220 3333333333333333333333333333333333333333333333333333333 1221 3333333333333333333333333333333333333333333333333333333 1222 3333333333333333333333333333333333333333333333333333333 1223 3333333333333333333333333333333333333333333333333333333 1224 3333333333333333333333333333333333333333333333333333333 1225 3333333333333333333333333333333333333333333333333333333 1226 3333333333333333333333333333333333333333333333333333333 1227 3333333333333333333333333333333333333333333333333333333 1228 3333333333333333333333333333333333333333333333333333333 1229 3333333333333333333333333333333333333333333333333333333 1230 3333333333333333333333333333333333333333333333333333333 1231 3333333333333333333333333333333333333333333333333333333 1232 3333333333333333333333333333333333333333333333333333333 1233 3333333333333333333333333333333333333333333333333333333 1234 3333333333333333333333333333333333333333333333333333333 1235 3333333333333333333333333333333333333333333333333333333 1236 3333333333333333333333333333333333333333333333333333333 1237 3333333333333333333333333333333333333333333333333333333 1238 3333333333333333333333333333333333333333333333333333333 1239 3333333333333333333333333333333333333333333333333333333 1240 3333333333333333333333333333333333333333333333333333333 1241 3333333333333333333333333333333333333333333333333333333 1242 3333333333333333333333333333333333333333333333333333333 1243 3333333333333333333333333333333333333333333333333333333 1244 3333333333333333333333333333333333333333333333333333333 1245 3333333333333333333333333333333333333333333333333333333 1246 3333333333333333333333333333333333333333333333333333333 1247 3333333333333333333333333333333333333333333333333333333 1248 3333333333333333333333333333333333333333333333333333333 1249 3333333333333333333333333333333333333333333333333333333 1250 3333333333333333333333333333333333333333333333333333333 1251 3333333333333333333333333333333333333333333333333333333 1252 3333333333333333333333333333333333333333333333333333333 1253 3333333333333333333333333333333333333333333333333333333 1254 3333333333333333333333333333333333333333333333333333333 1255 3333333333333333333333333333333333333333333333333333333 1256 3333333333333333333333333333333333333333333333333333333 1257 3333333333333333333333333333333333333333333333333333333 1258 3333333333333333333333333333333333333333333333333333333 1259 3333333333333333333333333333333333333333333333333333333 1260 3333333333333333333333333333333333333333333333333333333 1261 3333333333333333333333333333333333333333333333333333333 1262 3333333333333333333333333333333333333333333333333333333 1263 3333333333333333333333333333333333333333333333333333333 1264 3333333333333333333333333333333333333333333333333333333 1265 3333333333333333333333333333333333333333333333333333333 1266 3333333333333333333333333333333333333333333333333333333 1267 3333333333333333333333333333333333333333333333333333333 1268 3333333333333333333333333333333333333333333333333333333 1269 3333333333333333333333333333333333333333333333333333333 1270 3333333333333333333333333333333333333333333333333333333 1271 3333333333333333333333333333333333333333333333333333333 1272 3333333333333333333333333333333333333333333333333333333 1273 3333333333333333333333333333333333333333333333333333333 1274 3333333333333333333333333333333333333333333333333333333 1275 3333333333333333333333333333333333333333333333333333333 1276 3333333333333333333333333333333333333333333333333333333 1277 3333333333333333333333333333333333333333333333333333333 1278 3333333333333333333333333333333333333333333333333333333 1279 3333333333333333333333333333333333333333333333333333333 1280 3333333333333333333333333333333333333333333333333333333 1281 3333333333333333333333333333333333333333333333333333333 1282 3333333333333333333333333333333333333333333333333333333 1283 3333333333333333333333333333333333333333333333333333333 1284 3333333333333333333333333333333333333333333333333333333 1285 3333333333333333333333333333333333333333333333333333333 1286 3333333333333333333333333333333333333333333333333333333 1287 3333333333333333333333333333333333333333333333333333333 1288 3333333333333333333333333333333333333333333333333333333 1289 3333333333333333333333333333333333333333333333333333333 1290 3333333333333333333333333333333333333333333333333333333 1291 3333333333333333333333333333333333333333333333333333333 1292 3333333333333333333333333333333333333333333333333333333 1293 3333333333333333333333333333333333333333333333333333333 1294 3333333333333333333333333333333333333333333333333333333 1295 3333333333333333333333333333333333333333333333333333333 1296 3333333333333333333333333333333333333333333333333333333 1297 3333333333333333333333333333333333333333333333333333333 1298 3333333333333333333333333333333333333333333333333333333 1299 3333333333333333333333333333333333333333333333333333333 1300 3333333333333333333333333333333333333333333333333333333 1301 3333333333333333333333333333333333333333333333333333333 1302 3333333333333333333333333333333333333333333333333333333 1303 3333333333333333333333333333333333333333333333333333333 1304 3333333333333333333333333333333333333333333333333333333 1305 3333333333333333333333333333333333333333333333333333333 1306 3333333333333333333333333333333333333333333333333333333 1307 3333333333333333333333333333333333333333333333333333333 1308 3333333333333333333333333333333333333333333333333333333 1309 3333333333333333333333333333333333333333333333333333333 1310 3333333333333333333333333333333333333333333333333333333 1311 3333333333333333333333333333333333333333333333333333333 1312 3333333333333333333333333333333333333333333333333333333 1313 3333333333333333333333333333333333333333333333333333333 1314 3333333333333333333333333333333333333333333333333333333 1315 3333333333333333333333333333333333333333333333333333333 1316 3333333333333333333333333333333333333333333333333333333 1317 3333333333333333333333333333333333333333333333333333333 1318 3333333333333333333333333333333333333333333333333333333 1319 3333333333333333333333333333333333333333333333333333333 1320 3333333333333333333333333333333333333333333333333333333 1321 3333333333333333333333333333333333333333333333333333333 1322 3333333333333333333333333333333333333333333333333333333 1323 3333333333333333333333333333333333333333333333333333333 1324 3333333333333333333333333333333333333333333333333333333 1325 3333333333333333333333333333333333333333333333333333333 1326 3333333333333333333333333333333333333333333333333333333 1327 3333333333333333333333333333333333333333333333333333333 1328 3333333333333333333333333333333333333333333333333333333 1329 3333333333333333333333333333333333333333333333333333333 1330 3333333333333333333333333333333333333333333333333333333 1331 3333333333333333333333333333333333333333333333333333333 1332 3333333333333333333333333333333333333333333333333333333 1333 3333333333333333333333333333333333333333333333333333333 1334 3333333333333333333333333333333333333333333333333333333 1335 3333333333333333333333333333333333333333333333333333333 1336 3333333333333333333333333333333333333333333333333333333 1337 3333333333333333333333333333333333333333333333333333333 1338 3333333333333333333333333333333333333333333333333333333 1339 3333333333333333333333333333333333333333333333333333333 1340 3333333333333333333333333333333333333333333333333333333 1341 3333333333333333333333333333333333333333333333333333333 1342 3333333333333333333333333333333333333333333333333333333 1343 3333333333333333333333333333333333333333333333333333333 1344 3333333333333333333333333333333333333333333333333333333 1345 3333333333333333333333333333333333333333333333333333333 1346 3333333333333333333333333333333333333333333333333333333 1347 3333333333333333333333333333333333333333333333333333333 1348 3333333333333333333333333333333333333333333333333333333 1349 3333333333333333333333333333333333333333333333333333333 1350 3333333333333333333333333333333333333333333333333333333 1351 3333333333333333333333333333333333333333333333333333333 1352 3333333333333333333333333333333333333333333333333333333 1353 3333333333333333333333333333333333333333333333333333333 1354 3333333333333333333333333333333333333333333333333333333 1355 3333333333333333333333333333333333333333333333333333333 1356 3333333333333333333333333333333333333333333333333333333 1357 3333333333333333333333333333333333333333333333333333333 1358 3333333333333333333333333333333333333333333333333333333 1359 3333333333333333333333333333333333333333333333333333333 1360 3333333333333333333333333333333333333333333333333333333 1361 3333333333333333333333333333333333333333333333333333333 1362 3333333333333333333333333333333333333333333333333333333 1363 3333333333333333333333333333333333333333333333333333333 1364 3333333333333333333333333333333333333333333333333333333 1365 3333333333333333333333333333333333333333333333333333333 1366 3333333333333333333333333333333333333333333333333333333 1367 3333333333333333333333333333333333333333333333333333333 1368 3333333333333333333333333333333333333333333333333333333 1369 3333333333333333333333333333333333333333333333333333333 1370 3333333333333333333333333333333333333333333333333333333 1371 3333333333333333333333333333333333333333333333333333333 1372 3333333333333333333333333333333333333333333333333333333 1373 3333333333333333333333333333333333333333333333333333333 1374 3333333333333333333333333333333333333333333333333333333 1375 3333333333333333333333333333333333333333333333333333333 1376 3333333333333333333333333333333333333333333333333333333 1377 3333333333333333333333333333333333333333333333333333333 1378 3333333333333333333333333333333333333333333333333333333 1379 3333333333333333333333333333333333333333333333333333333 1380 3333333333333333333333333333333333333333333333333333333 1381 3333333333333333333333333333333333333333333333333333333 1382 3333333333333333333333333333333333333333333333333333333 1383 3333333333333333333333333333333333333333333333333333333 1384 3333333333333333333333333333333333333333333333333333333 1385 3333333333333333333333333333333333333333333333333333333 1386 3333333333333333333333333333333333333333333333333333333 1387 3333333333333333333333333333333333333333333333333333333 1388 3333333333333333333333333333333333333333333333333333333 1389 3333333333333333333333333333333333333333333333333333333 1390 3333333333333333333333333333333333333333333333333333333 1391 3333333333333333333333333333333333333333333333333333333 1392 3333333333333333333333333333333333333333333333333333333 1393 3333333333333333333333333333333333333333333333333333333 1394 3333333333333333333333333333333333333333333333333333333 1395 3333333333333333333333333333333333333333333333333333333 1396 3333333333333333333333333333333333333333333333333333333 1397 3333333333333333333333333333333333333333333333333333333 1398 3333333333333333333333333333333333333333333333333333333 1399 3333333333333333333333333333333333333333333333333333333 1400 3333333333333333333333333333333333333333333333333333333 1401 3333333333333333333333333333333333333333333333333333333 1402 3333333333333333333333333333333333333333333333333333333 1403 3333333333333333333333333333333333333333333333333333333 1404 3333333333333333333333333333333333333333333333333333333 1405 3333333333333333333333333333333333333333333333333333333 1406 3333333333333333333333333333333333333333333333333333333 1407 3333333333333333333333333333333333333333333333333333333 1408 3333333333333333333333333333333333333333333333333333333 1409 3333333333333333333333333333333333333333333333333333333 1410 3333333333333333333333333333333333333333333333333333333 1411 3333333333333333333333333333333333333333333333333333333 1412 3333333333333333333333333333333333333333333333333333333 1413 3333333333333333333333333333333333333333333333333333333 1414 3333333333333333333333333333333333333333333333333333333 1415 3333333333333333333333333333333333333333333333333333333 1416 3333333333333333333333333333333333333333333333333333333 1417 3333333333333333333333333333333333333333333333333333333 1418 3333333333333333333333333333333333333333333333333333333 1419 3333333333333333333333333333333333333333333333333333333 1420 3333333333333333333333333333333333333333333333333333333 1421 3333333333333333333333333333333333333333333333333333333 1422 3333333333333333333333333333333333333333333333333333333 1423 3333333333333333333333333333333333333333333333333333333 1424 3333333333333333333333333333333333333333333333333333333 1425 3333333333333333333333333333333333333333333333333333333 1426 3333333333333333333333333333333333333333333333333333333 1427 3333333333333333333333333333333333333333333333333333333 1428 3333333333333333333333333333333333333333333333333333333 1429 3333333333333333333333333333333333333333333333333333333 1430 3333333333333333333333333333333333333333333333333333333 1431 3333333333333333333333333333333333333333333333333333333 1432 3333333333333333333333333333333333333333333333333333333 1433 3333333333333333333333333333333333333333333333333333333 1434 3333333333333333333333333333333333333333333333333333333 1435 3333333333333333333333333333333333333333333333333333333 1436 3333333333333333333333333333333333333333333333333333333 1437 3333333333333333333333333333333333333333333333333333333 1438 3333333333333333333333333333333333333333333333333333333 1439 3333333333333333333333333333333333333333333333333333333 1440 3333333333333333333333333333333333333333333333333333333 1441 3333333333333333333333333333333333333333333333333333333 1442 3333333333333333333333333333333333333333333333333333333 1443 3333333333333333333333333333333333333333333333333333333 1444 3333333333333333333333333333333333333333333333333333333 1445 3333333333333333333333333333333333333333333333333333333 1446 3333333333333333333333333333333333333333333333333333333 1447 3333333333333333333333333333333333333333333333333333333 1448 3333333333333333333333333333333333333333333333333333333 1449 3333333333333333333333333333333333333333333333333333333 1450 3333333333333333333333333333333333333333333333333333333 1451 3333333333333333333333333333333333333333333333333333333 1452 3333333333333333333333333333333333333333333333333333333 1453 3333333333333333333333333333333333333333333333333333333 1454 3333333333333333333333333333333333333333333333333333333 1455 3333333333333333333333333333333333333333333333333333333 1456 3333333333333333333333333333333333333333333333333333333 1457 3333333333333333333333333333333333333333333333333333333 1458 3333333333333333333333333333333333333333333333333333333 1459 3333333333333333333333333333333333333333333333333333333 1460 3333333333333333333333333333333333333333333333333333333 1461 3333333333333333333333333333333333333333333333333333333 1462 3333333333333333333333333333333333333333333333333333333 1463 3333333333333333333333333333333333333333333333333333333 1464 3333333333333333333333333333333333333333333333333333333 1465 3333333333333333333333333333333333333333333333333333333 1466 3333333333333333333333333333333333333333333333333333333 1467 3333333333333333333333333333333333333333333333333333333 1468 3333333333333333333333333333333333333333333333333333333 1469 3333333333333333333333333333333333333333333333333333333 1470 3333333333333333333333333333333333333333333333333333333 1471 3333333333333333333333333333333333333333333333333333333 1472 3333333333333333333333333333333333333333333333333333333 1473 3333333333333333333333333333333333333333333333333333333 1474 3333333333333333333333333333333333333333333333333333333 1475 3333333333333333333333333333333333333333333333333333333 1476 3333333333333333333333333333333333333333333333333333333 1477 3333333333333333333333333333333333333333333333333333333 1478 3333333333333333333333333333333333333333333333333333333 1479 3333333333333333333333333333333333333333333333333333333 1480 3333333333333333333333333333333333333333333333333333333 1481 3333333333333333333333333333333333333333333333333333333 1482 3333333333333333333333333333333333333333333333333333333 1483 3333333333333333333333333333333333333333333333333333333 1484 3333333333333333333333333333333333333333333333333333333 1485 3333333333333333333333333333333333333333333333333333333 1486 3333333333333333333333333333333333333333333333333333333 1487 3333333333333333333333333333333333333333333333333333333 1488 3333333333333333333333333333333333333333333333333333333 1489 3333333333333333333333333333333333333333333333333333333 1490 3333333333333333333333333333333333333333333333333333333 1491 3333333333333333333333333333333333333333333333333333333 1492 3333333333333333333333333333333333333333333333333333333 1493 3333333333333333333333333333333333333333333333333333333 1494 3333333333333333333333333333333333333333333333333333333 1495 3333333333333333333333333333333333333333333333333333333 1496 3333333333333333333333333333333333333333333333333333333 1497 3333333333333333333333333333333333333333333333333333333 1498 3333333333333333333333333333333333333333333333333333333 1499 3333333333333333333333333333333333333333333333333333333 1500 3333333333333333333333333333333333333333333333333333333 1501 3333333333333333333333333333333333333333333333333333333 1502 3333333333333333333333333333333333333333333333333333333 1503 3333333333333333333333333333333333333333333333333333333 1504 3333333333333333333333333333333333333333333333333333333 1505 3333333333333333333333333333333333333333333333333333333 1506 3333333333333333333333333333333333333333333333333333333 1507 3333333333333333333333333333333333333333333333333333333 1508 3333333333333333333333333333333333333333333333333333333 1509 3333333333333333333333333333333333333333333333333333333 1510 3333333333333333333333333333333333333333333333333333333 1511 3333333333333333333333333333333333333333333333333333333 1512 3333333333333333333333333333333333333333333333333333333 1513 3333333333333333333333333333333333333333333333333333333 1514 3333333333333333333333333333333333333333333333333333333 1515 3333333333333333333333333333333333333333333333333333333 1516 3333333333333333333333333333333333333333333333333333333 1517 3333333333333333333333333333333333333333333333333333333 1518 3333333333333333333333333333333333333333333333333333333 1519 3333333333333333333333333333333333333333333333333333333 1520 3333333333333333333333333333333333333333333333333333333 1521 3333333333333333333333333333333333333333333333333333333 1522 3333333333333333333333333333333333333333333333333333333 1523 3333333333333333333333333333333333333333333333333333333 1524 3333333333333333333333333333333333333333333333333333333 1525 3333333333333333333333333333333333333333333333333333333 1526 3333333333333333333333333333333333333333333333333333333 1527 3333333333333333333333333333333333333333333333333333333 1528 3333333333333333333333333333333333333333333333333333333 1529 3333333333333333333333333333333333333333333333333333333 1530 3333333333333333333333333333333333333333333333333333333 1531 3333333333333333333333333333333333333333333333333333333 1532 3333333333333333333333333333333333333333333333333333333 1533 3333333333333333333333333333333333333333333333333333333 1534 3333333333333333333333333333333333333333333333333333333 1535 3333333333333333333333333333333333333333333333333333333 1536 3333333333333333333333333333333333333333333333333333333 1537 3333333333333333333333333333333333333333333333333333333 1538 3333333333333333333333333333333333333333333333333333333 1539 3333333333333333333333333333333333333333333333333333333 1540 3333333333333333333333333333333333333333333333333333333 1541 3333333333333333333333333333333333333333333333333333333 1542 3333333333333333333333333333333333333333333333333333333 1543 3333333333333333333333333333333333333333333333333333333 1544 3333333333333333333333333333333333333333333333333333333 1545 3333333333333333333333333333333333333333333333333333333 1546 3333333333333333333333333333333333333333333333333333333 1547 3333333333333333333333333333333333333333333333333333333 1548 3333333333333333333333333333333333333333333333333333333 1549 3333333333333333333333333333333333333333333333333333333 1550 3333333333333333333333333333333333333333333333333333333 1551 3333333333333333333333333333333333333333333333333333333 1552 3333333333333333333333333333333333333333333333333333333 1553 3333333333333333333333333333333333333333333333333333333 1554 3333333333333333333333333333333333333333333333333333333 1555 3333333333333333333333333333333333333333333333333333333 1556 3333333333333333333333333333333333333333333333333333333 1557 3333333333333333333333333333333333333333333333333333333 1558 3333333333333333333333333333333333333333333333333333333 1559 3333333333333333333333333333333333333333333333333333333 1560 3333333333333333333333333333333333333333333333333333333 1561 3333333333333333333333333333333333333333333333333333333 1562 3333333333333333333333333333333333333333333333333333333 1563 3333333333333333333333333333333333333333333333333333333 1564 3333333333333333333333333333333333333333333333333333333 1565 3333333333333333333333333333333333333333333333333333333 1566 3333333333333333333333333333333333333333333333333333333 1567 3333333333333333333333333333333333333333333333333333333 1568 3333333333333333333333333333333333333333333333333333333 1569 3333333333333333333333333333333333333333333333333333333 1570 3333333333333333333333333333333333333333333333333333333 1571 3333333333333333333333333333333333333333333333333333333 1572 3333333333333333333333333333333333333333333333333333333 1573 3333333333333333333333333333333333333333333333333333333 1574 3333333333333333333333333333333333333333333333333333333 1575 3333333333333333333333333333333333333333333333333333333 1576 3333333333333333333333333333333333333333333333333333333 1577 3333333333333333333333333333333333333333333333333333333 1578 3333333333333333333333333333333333333333333333333333333 1579 3333333333333333333333333333333333333333333333333333333 1580 3333333333333333333333333333333333333333333333333333333 1581 3333333333333333333333333333333333333333333333333333333 1582 3333333333333333333333333333333333333333333333333333333 1583 3333333333333333333333333333333333333333333333333333333 1584 3333333333333333333333333333333333333333333333333333333 1585 3333333333333333333333333333333333333333333333333333333 1586 3333333333333333333333333333333333333333333333333333333 1587 3333333333333333333333333333333333333333333333333333333 1588 3333333333333333333333333333333333333333333333333333333 1589 3333333333333333333333333333333333333333333333333333333 1590 3333333333333333333333333333333333333333333333333333333 1591 3333333333333333333333333333333333333333333333333333333 1592 3333333333333333333333333333333333333333333333333333333 1593 3333333333333333333333333333333333333333333333333333333 1594 3333333333333333333333333333333333333333333333333333333 1595 3333333333333333333333333333333333333333333333333333333 1596 3333333333333333333333333333333333333333333333333333333 1597 3333333333333333333333333333333333333333333333333333333 1598 3333333333333333333333333333333333333333333333333333333 1599 3333333333333333333333333333333333333333333333333333333 1600 3333333333333333333333333333333333333333333333333333333 1601 3333333333333333333333333333333333333333333333333333333 1602 3333333333333333333333333333333333333333333333333333333 1603 3333333333333333333333333333333333333333333333333333333 1604 3333333333333333333333333333333333333333333333333333333 1605 3333333333333333333333333333333333333333333333333333333 1606 3333333333333333333333333333333333333333333333333333333 1607 3333333333333333333333333333333333333333333333333333333 1608 3333333333333333333333333333333333333333333333333333333 1609 3333333333333333333333333333333333333333333333333333333 1610 3333333333333333333333333333333333333333333333333333333 1611 3333333333333333333333333333333333333333333333333333333 1612 3333333333333333333333333333333333333333333333333333333 1613 3333333333333333333333333333333333333333333333333333333 1614 3333333333333333333333333333333333333333333333333333333 1615 3333333333333333333333333333333333333333333333333333333 1616 3333333333333333333333333333333333333333333333333333333 1617 3333333333333333333333333333333333333333333333333333333 1618 3333333333333333333333333333333333333333333333333333333 1619 3333333333333333333333333333333333333333333333333333333 1620 3333333333333333333333333333333333333333333333333333333 1621 3333333333333333333333333333333333333333333333333333333 1622 3333333333333333333333333333333333333333333333333333333 1623 3333333333333333333333333333333333333333333333333333333 1624 3333333333333333333333333333333333333333333333333333333 1625 3333333333333333333333333333333333333333333333333333333 1626 3333333333333333333333333333333333333333333333333333333 1627 3333333333333333333333333333333333333333333333333333333 1628 3333333333333333333333333333333333333333333333333333333 1629 3333333333333333333333333333333333333333333333333333333 1630 3333333333333333333333333333333333333333333333333333333 1631 3333333333333333333333333333333333333333333333333333333 1632 3333333333333333333333333333333333333333333333333333333 1633 3333333333333333333333333333333333333333333333333333333 1634 3333333333333333333333333333333333333333333333333333333 1635 3333333333333333333333333333333333333333333333333333333 1636 3333333333333333333333333333333333333333333333333333333 1637 3333333333333333333333333333333333333333333333333333333 1638 3333333333333333333333333333333333333333333333333333333 1639 3333333333333333333333333333333333333333333333333333333 1640 3333333333333333333333333333333333333333333333333333333 1641 3333333333333333333333333333333333333333333333333333333 1642 3333333333333333333333333333333333333333333333333333333 1643 3333333333333333333333333333333333333333333333333333333 1644 3333333333333333333333333333333333333333333333333333333 1645 3333333333333333333333333333333333333333333333333333333 1646 3333333333333333333333333333333333333333333333333333333 1647 3333333333333333333333333333333333333333333333333333333 1648 3333333333333333333333333333333333333333333333333333333 1649 3333333333333333333333333333333333333333333333333333333 1650 3333333333333333333333333333333333333333333333333333333 1651 3333333333333333333333333333333333333333333333333333333 1652 3333333333333333333333333333333333333333333333333333333 1653 3333333333333333333333333333333333333333333333333333333 1654 3333333333333333333333333333333333333333333333333333333 1655 3333333333333333333333333333333333333333333333333333333 1656 3333333333333333333333333333333333333333333333333333333 1657 3333333333333333333333333333333333333333333333333333333 1658 3333333333333333333333333333333333333333333333333333333 1659 3333333333333333333333333333333333333333333333333333333 1660 3333333333333333333333333333333333333333333333333333333 1661 3333333333333333333333333333333333333333333333333333333 1662 3333333333333333333333333333333333333333333333333333333 1663 3333333333333333333333333333333333333333333333333333333 1664 3333333333333333333333333333333333333333333333333333333 1665 3333333333333333333333333333333333333333333333333333333 1666 3333333333333333333333333333333333333333333333333333333 1667 3333333333333333333333333333333333333333333333333333333 1668 3333333333333333333333333333333333333333333333333333333 1669 3333333333333333333333333333333333333333333333333333333 1670 3333333333333333333333333333333333333333333333333333333 1671 3333333333333333333333333333333333333333333333333333333 1672 3333333333333333333333333333333333333333333333333333333 1673 3333333333333333333333333333333333333333333333333333333 1674 3333333333333333333333333333333333333333333333333333333 1675 3333333333333333333333333333333333333333333333333333333 1676 3333333333333333333333333333333333333333333333333333333 1677 3333333333333333333333333333333333333333333333333333333 1678 3333333333333333333333333333333333333333333333333333333 1679 3333333333333333333333333333333333333333333333333333333 1680 3333333333333333333333333333333333333333333333333333333 1681 3333333333333333333333333333333333333333333333333333333 1682 3333333333333333333333333333333333333333333333333333333 1683 3333333333333333333333333333333333333333333333333333333 1684 3333333333333333333333333333333333333333333333333333333 1685 3333333333333333333333333333333333333333333333333333333 1686 3333333333333333333333333333333333333333333333333333333 1687 3333333333333333333333333333333333333333333333333333333 1688 3333333333333333333333333333333333333333333333333333333 1689 3333333333333333333333333333333333333333333333333333333 1690 3333333333333333333333333333333333333333333333333333333 1691 3333333333333333333333333333333333333333333333333333333 1692 3333333333333333333333333333333333333333333333333333333 1693 3333333333333333333333333333333333333333333333333333333 1694 3333333333333333333333333333333333333333333333333333333 1695 3333333333333333333333333333333333333333333333333333333 1696 3333333333333333333333333333333333333333333333333333333 1697 3333333333333333333333333333333333333333333333333333333 1698 3333333333333333333333333333333333333333333333333333333 1699 3333333333333333333333333333333333333333333333333333333 1700 3333333333333333333333333333333333333333333333333333333 1701 3333333333333333333333333333333333333333333333333333333 1702 3333333333333333333333333333333333333333333333333333333 1703 3333333333333333333333333333333333333333333333333333333 1704 3333333333333333333333333333333333333333333333333333333 1705 3333333333333333333333333333333333333333333333333333333 1706 3333333333333333333333333333333333333333333333333333333 1707 3333333333333333333333333333333333333333333333333333333 1708 3333333333333333333333333333333333333333333333333333333 1709 3333333333333333333333333333333333333333333333333333333 1710 3333333333333333333333333333333333333333333333333333333 1711 3333333333333333333333333333333333333333333333333333333 1712 3333333333333333333333333333333333333333333333333333333 1713 3333333333333333333333333333333333333333333333333333333 1714 3333333333333333333333333333333333333333333333333333333 1715 3333333333333333333333333333333333333333333333333333333 1716 3333333333333333333333333333333333333333333333333333333 1717 3333333333333333333333333333333333333333333333333333333 1718 3333333333333333333333333333333333333333333333333333333 1719 3333333333333333333333333333333333333333333333333333333 1720 3333333333333333333333333333333333333333333333333333333 1721 3333333333333333333333333333333333333333333333333333333 1722 3333333333333333333333333333333333333333333333333333333 1723 3333333333333333333333333333333333333333333333333333333 1724 3333333333333333333333333333333333333333333333333333333 1725 3333333333333333333333333333333333333333333333333333333 1726 3333333333333333333333333333333333333333333333333333333 1727 3333333333333333333333333333333333333333333333333333333 1728 3333333333333333333333333333333333333333333333333333333 1729 3333333333333333333333333333333333333333333333333333333 1730 3333333333333333333333333333333333333333333333333333333 1731 3333333333333333333333333333333333333333333333333333333 1732 3333333333333333333333333333333333333333333333333333333 1733 3333333333333333333333333333333333333333333333333333333 1734 3333333333333333333333333333333333333333333333333333333 1735 3333333333333333333333333333333333333333333333333333333 1736 3333333333333333333333333333333333333333333333333333333 1737 3333333333333333333333333333333333333333333333333333333 1738 3333333333333333333333333333333333333333333333333333333 1739 3333333333333333333333333333333333333333333333333333333 1740 3333333333333333333333333333333333333333333333333333333 1741 3333333333333333333333333333333333333333333333333333333 1742 3333333333333333333333333333333333333333333333333333333 1743 3333333333333333333333333333333333333333333333333333333 1744 3333333333333333333333333333333333333333333333333333333 1745 3333333333333333333333333333333333333333333333333333333 1746 3333333333333333333333333333333333333333333333333333333 1747 3333333333333333333333333333333333333333333333333333333 1748 3333333333333333333333333333333333333333333333333333333 1749 3333333333333333333333333333333333333333333333333333333 1750 3333333333333333333333333333333333333333333333333333333 1751 3333333333333333333333333333333333333333333333333333333 1752 3333333333333333333333333333333333333333333333333333333 1753 3333333333333333333333333333333333333333333333333333333 1754 3333333333333333333333333333333333333333333333333333333 1755 3333333333333333333333333333333333333333333333333333333 1756 3333333333333333333333333333333333333333333333333333333 1757 3333333333333333333333333333333333333333333333333333333 1758 3333333333333333333333333333333333333333333333333333333 1759 3333333333333333333333333333333333333333333333333333333 1760 3333333333333333333333333333333333333333333333333333333 1761 3333333333333333333333333333333333333333333333333333333 1762 3333333333333333333333333333333333333333333333333333333 1763 3333333333333333333333333333333333333333333333333333333 1764 3333333333333333333333333333333333333333333333333333333 1765 3333333333333333333333333333333333333333333333333333333 1766 3333333333333333333333333333333333333333333333333333333 1767 3333333333333333333333333333333333333333333333333333333 1768 3333333333333333333333333333333333333333333333333333333 1769 3333333333333333333333333333333333333333333333333333333 1770 3333333333333333333333333333333333333333333333333333333 1771 3333333333333333333333333333333333333333333333333333333 1772 3333333333333333333333333333333333333333333333333333333 1773 3333333333333333333333333333333333333333333333333333333 1774 3333333333333333333333333333333333333333333333333333333 1775 3333333333333333333333333333333333333333333333333333333 1776 3333333333333333333333333333333333333333333333333333333 1777 3333333333333333333333333333333333333333333333333333333 1778 3333333333333333333333333333333333333333333333333333333 1779 3333333333333333333333333333333333333333333333333333333 1780 3333333333333333333333333333333333333333333333333333333 1781 3333333333333333333333333333333333333333333333333333333 1782 3333333333333333333333333333333333333333333333333333333 1783 3333333333333333333333333333333333333333333333333333333 1784 3333333333333333333333333333333333333333333333333333333 1785 3333333333333333333333333333333333333333333333333333333 1786 3333333333333333333333333333333333333333333333333333333 1787 3333333333333333333333333333333333333333333333333333333 1788 3333333333333333333333333333333333333333333333333333333 1789 3333333333333333333333333333333333333333333333333333333 1790 3333333333333333333333333333333333333333333333333333333 1791 3333333333333333333333333333333333333333333333333333333 1792 3333333333333333333333333333333333333333333333333333333 1793 3333333333333333333333333333333333333333333333333333333 1794 3333333333333333333333333333333333333333333333333333333 1795 3333333333333333333333333333333333333333333333333333333 1796 3333333333333333333333333333333333333333333333333333333 1797 3333333333333333333333333333333333333333333333333333333 1798 3333333333333333333333333333333333333333333333333333333 1799 3333333333333333333333333333333333333333333333333333333 1800 3333333333333333333333333333333333333333333333333333333 1801 3333333333333333333333333333333333333333333333333333333 1802 3333333333333333333333333333333333333333333333333333333 1803 3333333333333333333333333333333333333333333333333333333 1804 3333333333333333333333333333333333333333333333333333333 1805 3333333333333333333333333333333333333333333333333333333 1806 3333333333333333333333333333333333333333333333333333333 1807 3333333333333333333333333333333333333333333333333333333 1808 3333333333333333333333333333333333333333333333333333333 1809 3333333333333333333333333333333333333333333333333333333 1810 3333333333333333333333333333333333333333333333333333333 1811 3333333333333333333333333333333333333333333333333333333 1812 3333333333333333333333333333333333333333333333333333333 1813 3333333333333333333333333333333333333333333333333333333 1814 3333333333333333333333333333333333333333333333333333333 1815 3333333333333333333333333333333333333333333333333333333 1816 3333333333333333333333333333333333333333333333333333333 1817 3333333333333333333333333333333333333333333333333333333 1818 3333333333333333333333333333333333333333333333333333333 1819 3333333333333333333333333333333333333333333333333333333 1820 3333333333333333333333333333333333333333333333333333333 1821 3333333333333333333333333333333333333333333333333333333 1822 3333333333333333333333333333333333333333333333333333333 1823 3333333333333333333333333333333333333333333333333333333 1824 3333333333333333333333333333333333333333333333333333333 1825 3333333333333333333333333333333333333333333333333333333 1826 3333333333333333333333333333333333333333333333333333333 1827 3333333333333333333333333333333333333333333333333333333 1828 3333333333333333333333333333333333333333333333333333333 1829 3333333333333333333333333333333333333333333333333333333 1830 3333333333333333333333333333333333333333333333333333333 1831 3333333333333333333333333333333333333333333333333333333 1832 3333333333333333333333333333333333333333333333333333333 1833 3333333333333333333333333333333333333333333333333333333 1834 3333333333333333333333333333333333333333333333333333333 1835 3333333333333333333333333333333333333333333333333333333 1836 3333333333333333333333333333333333333333333333333333333 1837 3333333333333333333333333333333333333333333333333333333 1838 3333333333333333333333333333333333333333333333333333333 1839 3333333333333333333333333333333333333333333333333333333 1840 3333333333333333333333333333333333333333333333333333333 1841 3333333333333333333333333333333333333333333333333333333 1842 3333333333333333333333333333333333333333333333333333333 1843 3333333333333333333333333333333333333333333333333333333 1844 3333333333333333333333333333333333333333333333333333333 1845 3333333333333333333333333333333333333333333333333333333 1846 3333333333333333333333333333333333333333333333333333333 1847 3333333333333333333333333333333333333333333333333333333 1848 3333333333333333333333333333333333333333333333333333333 1849 3333333333333333333333333333333333333333333333333333333 1850 3333333333333333333333333333333333333333333333333333333 1851 3333333333333333333333333333333333333333333333333333333 1852 3333333333333333333333333333333333333333333333333333333 1853 3333333333333333333333333333333333333333333333333333333 1854 3333333333333333333333333333333333333333333333333333333 1855 3333333333333333333333333333333333333333333333333333333 1856 3333333333333333333333333333333333333333333333333333333 1857 3333333333333333333333333333333333333333333333333333333 1858 3333333333333333333333333333333333333333333333333333333 1859 3333333333333333333333333333333333333333333333333333333 1860 3333333333333333333333333333333333333333333333333333333 1861 3333333333333333333333333333333333333333333333333333333 1862 3333333333333333333333333333333333333333333333333333333 1863 3333333333333333333333333333333333333333333333333333333 1864 3333333333333333333333333333333333333333333333333333333 1865 3333333333333333333333333333333333333333333333333333333 1866 3333333333333333333333333333333333333333333333333333333 1867 3333333333333333333333333333333333333333333333333333333 1868 3333333333333333333333333333333333333333333333333333333 1869 3333333333333333333333333333333333333333333333333333333 1870 3333333333333333333333333333333333333333333333333333333 1871 3333333333333333333333333333333333333333333333333333333 1872 3333333333333333333333333333333333333333333333333333333 1873 3333333333333333333333333333333333333333333333333333333 1874 3333333333333333333333333333333333333333333333333333333 1875 3333333333333333333333333333333333333333333333333333333 1876 3333333333333333333333333333333333333333333333333333333 1877 3333333333333333333333333333333333333333333333333333333 1878 3333333333333333333333333333333333333333333333333333333 1879 3333333333333333333333333333333333333333333333333333333 1880 3333333333333333333333333333333333333333333333333333333 1881 3333333333333333333333333333333333333333333333333333333 1882 3333333333333333333333333333333333333333333333333333333 1883 3333333333333333333333333333333333333333333333333333333 1884 3333333333333333333333333333333333333333333333333333333 1885 3333333333333333333333333333333333333333333333333333333 1886 3333333333333333333333333333333333333333333333333333333 1887 3333333333333333333333333333333333333333333333333333333 1888 3333333333333333333333333333333333333333333333333333333 1889 3333333333333333333333333333333333333333333333333333333 1890 3333333333333333333333333333333333333333333333333333333 1891 3333333333333333333333333333333333333333333333333333333 1892 3333333333333333333333333333333333333333333333333333333 1893 3333333333333333333333333333333333333333333333333333333 1894 3333333333333333333333333333333333333333333333333333333 1895 3333333333333333333333333333333333333333333333333333333 1896 3333333333333333333333333333333333333333333333333333333 1897 3333333333333333333333333333333333333333333333333333333 1898 3333333333333333333333333333333333333333333333333333333 1899 3333333333333333333333333333333333333333333333333333333 1900 3333333333333333333333333333333333333333333333333333333 1901 3333333333333333333333333333333333333333333333333333333 1902 3333333333333333333333333333333333333333333333333333333 1903 3333333333333333333333333333333333333333333333333333333 1904 3333333333333333333333333333333333333333333333333333333 1905 3333333333333333333333333333333333333333333333333333333 1906 3333333333333333333333333333333333333333333333333333333 1907 3333333333333333333333333333333333333333333333333333333 1908 3333333333333333333333333333333333333333333333333333333 1909 3333333333333333333333333333333333333333333333333333333 1910 3333333333333333333333333333333333333333333333333333333 1911 3333333333333333333333333333333333333333333333333333333 1912 3333333333333333333333333333333333333333333333333333333 1913 3333333333333333333333333333333333333333333333333333333 1914 3333333333333333333333333333333333333333333333333333333 1915 3333333333333333333333333333333333333333333333333333333 1916 3333333333333333333333333333333333333333333333333333333 1917 3333333333333333333333333333333333333333333333333333333 1918 3333333333333333333333333333333333333333333333333333333 1919 3333333333333333333333333333333333333333333333333333333 1920 3333333333333333333333333333333333333333333333333333333 1921 3333333333333333333333333333333333333333333333333333333 1922 3333333333333333333333333333333333333333333333333333333 1923 3333333333333333333333333333333333333333333333333333333 1924 3333333333333333333333333333333333333333333333333333333 1925 3333333333333333333333333333333333333333333333333333333 1926 3333333333333333333333333333333333333333333333333333333 1927 3333333333333333333333333333333333333333333333333333333 1928 3333333333333333333333333333333333333333333333333333333 1929 3333333333333333333333333333333333333333333333333333333 1930 3333333333333333333333333333333333333333333333333333333 1931 3333333333333333333333333333333333333333333333333333333 1932 3333333333333333333333333333333333333333333333333333333 1933 3333333333333333333333333333333333333333333333333333333 1934 3333333333333333333333333333333333333333333333333333333 1935 3333333333333333333333333333333333333333333333333333333 1936 3333333333333333333333333333333333333333333333333333333 1937 3333333333333333333333333333333333333333333333333333333 1938 3333333333333333333333333333333333333333333333333333333 1939 3333333333333333333333333333333333333333333333333333333 1940 3333333333333333333333333333333333333333333333333333333 1941 3333333333333333333333333333333333333333333333333333333 1942 3333333333333333333333333333333333333333333333333333333 1943 3333333333333333333333333333333333333333333333333333333 1944 3333333333333333333333333333333333333333333333333333333 1945 3333333333333333333333333333333333333333333333333333333 1946 3333333333333333333333333333333333333333333333333333333 1947 3333333333333333333333333333333333333333333333333333333 1948 3333333333333333333333333333333333333333333333333333333 1949 3333333333333333333333333333333333333333333333333333333 1950 3333333333333333333333333333333333333333333333333333333 1951 3333333333333333333333333333333333333333333333333333333 1952 3333333333333333333333333333333333333333333333333333333 1953 3333333333333333333333333333333333333333333333333333333 1954 3333333333333333333333333333333333333333333333333333333 1955 3333333333333333333333333333333333333333333333333333333 1956 3333333333333333333333333333333333333333333333333333333 1957 3333333333333333333333333333333333333333333333333333333 1958 3333333333333333333333333333333333333333333333333333333 1959 3333333333333333333333333333333333333333333333333333333 1960 3333333333333333333333333333333333333333333333333333333 1961 3333333333333333333333333333333333333333333333333333333 1962 3333333333333333333333333333333333333333333333333333333 1963 3333333333333333333333333333333333333333333333333333333 1964 3333333333333333333333333333333333333333333333333333333 1965 3333333333333333333333333333333333333333333333333333333 1966 3333333333333333333333333333333333333333333333333333333 1967 3333333333333333333333333333333333333333333333333333333 1968 3333333333333333333333333333333333333333333333333333333 1969 3333333333333333333333333333333333333333333333333333333 1970 3333333333333333333333333333333333333333333333333333333 1971 3333333333333333333333333333333333333333333333333333333 1972 3333333333333333333333333333333333333333333333333333333 1973 3333333333333333333333333333333333333333333333333333333 1974 3333333333333333333333333333333333333333333333333333333 1975 3333333333333333333333333333333333333333333333333333333 1976 3333333333333333333333333333333333333333333333333333333 1977 3333333333333333333333333333333333333333333333333333333 1978 3333333333333333333333333333333333333333333333333333333 1979 3333333333333333333333333333333333333333333333333333333 1980 3333333333333333333333333333333333333333333333333333333 1981 3333333333333333333333333333333333333333333333333333333 1982 3333333333333333333333333333333333333333333333333333333 1983 3333333333333333333333333333333333333333333333333333333 1984 3333333333333333333333333333333333333333333333333333333 1985 3333333333333333333333333333333333333333333333333333333 1986 3333333333333333333333333333333333333333333333333333333 1987 3333333333333333333333333333333333333333333333333333333 1988 3333333333333333333333333333333333333333333333333333333 1989 3333333333333333333333333333333333333333333333333333333 1990 3333333333333333333333333333333333333333333333333333333 1991 3333333333333333333333333333333333333333333333333333333 1992 3333333333333333333333333333333333333333333333333333333 1993 3333333333333333333333333333333333333333333333333333333 1994 3333333333333333333333333333333333333333333333333333333 1995 3333333333333333333333333333333333333333333333333333333 1996 3333333333333333333333333333333333333333333333333333333 1997 3333333333333333333333333333333333333333333333333333333 1998 3333333333333333333333333333333333333333333333333333333 1999 3333333333333333333333333333333333333333333333333333333 2000 3333333333333333333333333333333333333333333333333333333 2001 3333333333333333333333333333333333333333333333333333333 2002 3333333333333333333333333333333333333333333333333333333 2003 3333333333333333333333333333333333333333333333333333333 2004 3333333333333333333333333333333333333333333333333333333 2005 3333333333333333333333333333333333333333333333333333333 2006 3333333333333333333333333333333333333333333333333333333 2007 3333333333333333333333333333333333333333333333333333333 2008 3333333333333333333333333333333333333333333333333333333 2009 3333333333333333333333333333333333333333333333333333333 2010 3333333333333333333333333333333333333333333333333333333 2011 3333333333333333333333333333333333333333333333333333333 2012 3333333333333333333333333333333333333333333333333333333 2013 3333333333333333333333333333333333333333333333333333333 2014 3333333333333333333333333333333333333333333333333333333 2015 3333333333333333333333333333333333333333333333333333333 2016 3333333333333333333333333333333333333333333333333333333 2017 3333333333333333333333333333333333333333333333333333333 2018 3333333333333333333333333333333333333333333333333333333 2019 3333333333333333333333333333333333333333333333333333333 2020 3333333333333333333333333333333333333333333333333333333 2021 3333333333333333333333333333333333333333333333333333333 2022 3333333333333333333333333333333333333333333333333333333 2023 3333333333333333333333333333333333333333333333333333333 2024 3333333333333333333333333333333333333333333333333333333 2025 3333333333333333333333333333333333333333333333333333333 2026 3333333333333333333333333333333333333333333333333333333 2027 3333333333333333333333333333333333333333333333333333333 2028 3333333333333333333333333333333333333333333333333333333 2029 3333333333333333333333333333333333333333333333333333333 2030 3333333333333333333333333333333333333333333333333333333 2031 3333333333333333333333333333333333333333333333333333333 2032 3333333333333333333333333333333333333333333333333333333 2033 3333333333333333333333333333333333333333333333333333333 2034 3333333333333333333333333333333333333333333333333333333 2035 3333333333333333333333333333333333333333333333333333333 2036 3333333333333333333333333333333333333333333333333333333 2037 3333333333333333333333333333333333333333333333333333333 2038 3333333333333333333333333333333333333333333333333333333 2039 3333333333333333333333333333333333333333333333333333333 2040 3333333333333333333333333333333333333333333333333333333 2041 3333333333333333333333333333333333333333333333333333333 2042 3333333333333333333333333333333333333333333333333333333 2043 3333333333333333333333333333333333333333333333333333333 2044 3333333333333333333333333333333333333333333333333333333 2045 3333333333333333333333333333333333333333333333333333333 2046 3333333333333333333333333333333333333333333333333333333 2047 3333333333333333333333333333333333333333333333333333333 2048 3333333333333333333333333333333333333333333333333333333 2049 3333333333333333333333333333333333333333333333333333333 2050 3333333333333333333333333333333333333333333333333333333 2051 3333333333333333333333333333333333333333333333333333333 2052 3333333333333333333333333333333333333333333333333333333 2053 3333333333333333333333333333333333333333333333333333333 2054 3333333333333333333333333333333333333333333333333333333 2055 3333333333333333333333333333333333333333333333333333333 2056 3333333333333333333333333333333333333333333333333333333 2057 3333333333333333333333333333333333333333333333333333333 2058 3333333333333333333333333333333333333333333333333333333 2059 3333333333333333333333333333333333333333333333333333333 2060 3333333333333333333333333333333333333333333333333333333 2061 3333333333333333333333333333333333333333333333333333333 2062 3333333333333333333333333333333333333333333333333333333 2063 3333333333333333333333333333333333333333333333333333333 2064 3333333333333333333333333333333333333333333333333333333 2065 3333333333333333333333333333333333333333333333333333333 2066 3333333333333333333333333333333333333333333333333333333 2067 3333333333333333333333333333333333333333333333333333333 2068 3333333333333333333333333333333333333333333333333333333 2069 3333333333333333333333333333333333333333333333333333333 2070 3333333333333333333333333333333333333333333333333333333 2071 3333333333333333333333333333333333333333333333333333333 2072 3333333333333333333333333333333333333333333333333333333 2073 3333333333333333333333333333333333333333333333333333333 2074 3333333333333333333333333333333333333333333333333333333 2075 3333333333333333333333333333333333333333333333333333333 2076 3333333333333333333333333333333333333333333333333333333 2077 3333333333333333333333333333333333333333333333333333333 2078 3333333333333333333333333333333333333333333333333333333 2079 3333333333333333333333333333333333333333333333333333333 2080 3333333333333333333333333333333333333333333333333333333 2081 3333333333333333333333333333333333333333333333333333333 2082 3333333333333333333333333333333333333333333333333333333 2083 3333333333333333333333333333333333333333333333333333333 2084 3333333333333333333333333333333333333333333333333333333 2085 3333333333333333333333333333333333333333333333333333333 2086 3333333333333333333333333333333333333333333333333333333 2087 3333333333333333333333333333333333333333333333333333333 2088 3333333333333333333333333333333333333333333333333333333 2089 3333333333333333333333333333333333333333333333333333333 2090 3333333333333333333333333333333333333333333333333333333 2091 3333333333333333333333333333333333333333333333333333333 2092 3333333333333333333333333333333333333333333333333333333 2093 3333333333333333333333333333333333333333333333333333333 2094 3333333333333333333333333333333333333333333333333333333 2095 3333333333333333333333333333333333333333333333333333333 2096 3333333333333333333333333333333333333333333333333333333 2097 3333333333333333333333333333333333333333333333333333333 2098 3333333333333333333333333333333333333333333333333333333 2099 3333333333333333333333333333333333333333333333333333333 2100 3333333333333333333333333333333333333333333333333333333 2101 3333333333333333333333333333333333333333333333333333333 2102 3333333333333333333333333333333333333333333333333333333 2103 3333333333333333333333333333333333333333333333333333333 2104 3333333333333333333333333333333333333333333333333333333 2105 3333333333333333333333333333333333333333333333333333333 2106 3333333333333333333333333333333333333333333333333333333 2107 3333333333333333333333333333333333333333333333333333333 2108 3333333333333333333333333333333333333333333333333333333 2109 3333333333333333333333333333333333333333333333333333333 2110 3333333333333333333333333333333333333333333333333333333 2111 3333333333333333333333333333333333333333333333333333333 2112 3333333333333333333333333333333333333333333333333333333 2113 3333333333333333333333333333333333333333333333333333333 2114 3333333333333333333333333333333333333333333333333333333 2115 3333333333333333333333333333333333333333333333333333333 2116 3333333333333333333333333333333333333333333333333333333 2117 3333333333333333333333333333333333333333333333333333333 2118 3333333333333333333333333333333333333333333333333333333 2119 3333333333333333333333333333333333333333333333333333333 2120 3333333333333333333333333333333333333333333333333333333 2121 3333333333333333333333333333333333333333333333333333333 2122 3333333333333333333333333333333333333333333333333333333 2123 3333333333333333333333333333333333333333333333333333333 2124 3333333333333333333333333333333333333333333333333333333 2125 3333333333333333333333333333333333333333333333333333333 2126 3333333333333333333333333333333333333333333333333333333 2127 3333333333333333333333333333333333333333333333333333333 2128 3333333333333333333333333333333333333333333333333333333 2129 3333333333333333333333333333333333333333333333333333333 2130 3333333333333333333333333333333333333333333333333333333 2131 3333333333333333333333333333333333333333333333333333333 2132 3333333333333333333333333333333333333333333333333333333 2133 3333333333333333333333333333333333333333333333333333333 2134 3333333333333333333333333333333333333333333333333333333 2135 3333333333333333333333333333333333333333333333333333333 2136 3333333333333333333333333333333333333333333333333333333 2137 3333333333333333333333333333333333333333333333333333333 2138 3333333333333333333333333333333333333333333333333333333 2139 3333333333333333333333333333333333333333333333333333333 2140 3333333333333333333333333333333333333333333333333333333 2141 3333333333333333333333333333333333333333333333333333333 2142 3333333333333333333333333333333333333333333333333333333 2143 3333333333333333333333333333333333333333333333333333333 2144 3333333333333333333333333333333333333333333333333333333 2145 3333333333333333333333333333333333333333333333333333333 2146 3333333333333333333333333333333333333333333333333333333 2147 3333333333333333333333333333333333333333333333333333333 2148 3333333333333333333333333333333333333333333333333333333 2149 3333333333333333333333333333333333333333333333333333333 2150 3333333333333333333333333333333333333333333333333333333 2151 3333333333333333333333333333333333333333333333333333333 2152 3333333333333333333333333333333333333333333333333333333 2153 3333333333333333333333333333333333333333333333333333333 2154 3333333333333333333333333333333333333333333333333333333 2155 3333333333333333333333333333333333333333333333333333333 2156 3333333333333333333333333333333333333333333333333333333 2157 3333333333333333333333333333333333333333333333333333333 2158 3333333333333333333333333333333333333333333333333333333 2159 3333333333333333333333333333333333333333333333333333333 2160 3333333333333333333333333333333333333333333333333333333 2161 3333333333333333333333333333333333333333333333333333333 2162 3333333333333333333333333333333333333333333333333333333 2163 3333333333333333333333333333333333333333333333333333333 2164 3333333333333333333333333333333333333333333333333333333 2165 3333333333333333333333333333333333333333333333333333333 2166 3333333333333333333333333333333333333333333333333333333 2167 3333333333333333333333333333333333333333333333333333333 2168 3333333333333333333333333333333333333333333333333333333 2169 3333333333333333333333333333333333333333333333333333333 2170 3333333333333333333333333333333333333333333333333333333 2171 3333333333333333333333333333333333333333333333333333333 2172 3333333333333333333333333333333333333333333333333333333 2173 3333333333333333333333333333333333333333333333333333333 2174 3333333333333333333333333333333333333333333333333333333 2175 3333333333333333333333333333333333333333333333333333333 2176 3333333333333333333333333333333333333333333333333333333 2177 3333333333333333333333333333333333333333333333333333333 2178 3333333333333333333333333333333333333333333333333333333 2179 3333333333333333333333333333333333333333333333333333333 2180 3333333333333333333333333333333333333333333333333333333 2181 3333333333333333333333333333333333333333333333333333333 2182 3333333333333333333333333333333333333333333333333333333 2183 3333333333333333333333333333333333333333333333333333333 2184 3333333333333333333333333333333333333333333333333333333 2185 3333333333333333333333333333333333333333333333333333333 2186 3333333333333333333333333333333333333333333333333333333 2187 3333333333333333333333333333333333333333333333333333333 2188 3333333333333333333333333333333333333333333333333333333 2189 3333333333333333333333333333333333333333333333333333333 2190 3333333333333333333333333333333333333333333333333333333 2191 3333333333333333333333333333333333333333333333333333333 2192 3333333333333333333333333333333333333333333333333333333 2193 3333333333333333333333333333333333333333333333333333333 2194 3333333333333333333333333333333333333333333333333333333 2195 3333333333333333333333333333333333333333333333333333333 2196 3333333333333333333333333333333333333333333333333333333 2197 3333333333333333333333333333333333333333333333333333333 2198 3333333333333333333333333333333333333333333333333333333 2199 3333333333333333333333333333333333333333333333333333333 2200 3333333333333333333333333333333333333333333333333333333 2201 3333333333333333333333333333333333333333333333333333333 2202 3333333333333333333333333333333333333333333333333333333 2203 3333333333333333333333333333333333333333333333333333333 2204 3333333333333333333333333333333333333333333333333333333 2205 3333333333333333333333333333333333333333333333333333333 2206 3333333333333333333333333333333333333333333333333333333 2207 3333333333333333333333333333333333333333333333333333333 2208 3333333333333333333333333333333333333333333333333333333 2209 3333333333333333333333333333333333333333333333333333333 2210 3333333333333333333333333333333333333333333333333333333 2211 3333333333333333333333333333333333333333333333333333333 2212 3333333333333333333333333333333333333333333333333333333 2213 3333333333333333333333333333333333333333333333333333333 2214 3333333333333333333333333333333333333333333333333333333 2215 3333333333333333333333333333333333333333333333333333333 2216 3333333333333333333333333333333333333333333333333333333 2217 3333333333333333333333333333333333333333333333333333333 2218 3333333333333333333333333333333333333333333333333333333 2219 3333333333333333333333333333333333333333333333333333333 2220 3333333333333333333333333333333333333333333333333333333 2221 3333333333333333333333333333333333333333333333333333333 2222 3333333333333333333333333333333333333333333333333333333 2223 3333333333333333333333333333333333333333333333333333333 2224 3333333333333333333333333333333333333333333333333333333 2225 3333333333333333333333333333333333333333333333333333333 2226 3333333333333333333333333333333333333333333333333333333 2227 3333333333333333333333333333333333333333333333333333333 2228 3333333333333333333333333333333333333333333333333333333 2229 3333333333333333333333333333333333333333333333333333333 2230 3333333333333333333333333333333333333333333333333333333 2231 3333333333333333333333333333333333333333333333333333333 2232 3333333333333333333333333333333333333333333333333333333 2233 3333333333333333333333333333333333333333333333333333333 2234 3333333333333333333333333333333333333333333333333333333 2235 3333333333333333333333333333333333333333333333333333333 2236 3333333333333333333333333333333333333333333333333333333 2237 3333333333333333333333333333333333333333333333333333333 2238 3333333333333333333333333333333333333333333333333333333 2239 3333333333333333333333333333333333333333333333333333333 2240 3333333333333333333333333333333333333333333333333333333 2241 3333333333333333333333333333333333333333333333333333333 2242 3333333333333333333333333333333333333333333333333333333 2243 3333333333333333333333333333333333333333333333333333333 2244 3333333333333333333333333333333333333333333333333333333 2245 3333333333333333333333333333333333333333333333333333333 2246 3333333333333333333333333333333333333333333333333333333 2247 3333333333333333333333333333333333333333333333333333333 2248 3333333333333333333333333333333333333333333333333333333 2249 3333333333333333333333333333333333333333333333333333333 2250 3333333333333333333333333333333333333333333333333333333 2251 3333333333333333333333333333333333333333333333333333333 2252 3333333333333333333333333333333333333333333333333333333 2253 3333333333333333333333333333333333333333333333333333333 2254 3333333333333333333333333333333333333333333333333333333 2255 3333333333333333333333333333333333333333333333333333333 2256 3333333333333333333333333333333333333333333333333333333 2257 3333333333333333333333333333333333333333333333333333333 2258 3333333333333333333333333333333333333333333333333333333 2259 3333333333333333333333333333333333333333333333333333333 2260 3333333333333333333333333333333333333333333333333333333 2261 3333333333333333333333333333333333333333333333333333333 2262 3333333333333333333333333333333333333333333333333333333 2263 3333333333333333333333333333333333333333333333333333333 2264 3333333333333333333333333333333333333333333333333333333 2265 3333333333333333333333333333333333333333333333333333333 2266 3333333333333333333333333333333333333333333333333333333 2267 3333333333333333333333333333333333333333333333333333333 2268 3333333333333333333333333333333333333333333333333333333 2269 3333333333333333333333333333333333333333333333333333333 2270 3333333333333333333333333333333333333333333333333333333 2271 3333333333333333333333333333333333333333333333333333333 2272 3333333333333333333333333333333333333333333333333333333 2273 3333333333333333333333333333333333333333333333333333333 2274 3333333333333333333333333333333333333333333333333333333 2275 3333333333333333333333333333333333333333333333333333333 2276 3333333333333333333333333333333333333333333333333333333 2277 3333333333333333333333333333333333333333333333333333333 2278 3333333333333333333333333333333333333333333333333333333 2279 3333333333333333333333333333333333333333333333333333333 2280 3333333333333333333333333333333333333333333333333333333 2281 3333333333333333333333333333333333333333333333333333333 2282 3333333333333333333333333333333333333333333333333333333 2283 3333333333333333333333333333333333333333333333333333333 2284 3333333333333333333333333333333333333333333333333333333 2285 3333333333333333333333333333333333333333333333333333333 2286 3333333333333333333333333333333333333333333333333333333 2287 3333333333333333333333333333333333333333333333333333333 2288 3333333333333333333333333333333333333333333333333333333 2289 3333333333333333333333333333333333333333333333333333333 2290 3333333333333333333333333333333333333333333333333333333 2291 3333333333333333333333333333333333333333333333333333333 2292 3333333333333333333333333333333333333333333333333333333 2293 3333333333333333333333333333333333333333333333333333333 2294 3333333333333333333333333333333333333333333333333333333 2295 3333333333333333333333333333333333333333333333333333333 2296 3333333333333333333333333333333333333333333333333333333 2297 3333333333333333333333333333333333333333333333333333333 2298 3333333333333333333333333333333333333333333333333333333 2299 3333333333333333333333333333333333333333333333333333333 2300 3333333333333333333333333333333333333333333333333333333 2301 3333333333333333333333333333333333333333333333333333333 2302 3333333333333333333333333333333333333333333333333333333 2303 3333333333333333333333333333333333333333333333333333333 2304 3333333333333333333333333333333333333333333333333333333 2305 3333333333333333333333333333333333333333333333333333333 2306 3333333333333333333333333333333333333333333333333333333 2307 3333333333333333333333333333333333333333333333333333333 2308 3333333333333333333333333333333333333333333333333333333 2309 3333333333333333333333333333333333333333333333333333333 2310 3333333333333333333333333333333333333333333333333333333 2311 3333333333333333333333333333333333333333333333333333333 2312 3333333333333333333333333333333333333333333333333333333 2313 3333333333333333333333333333333333333333333333333333333 2314 3333333333333333333333333333333333333333333333333333333 2315 3333333333333333333333333333333333333333333333333333333 2316 3333333333333333333333333333333333333333333333333333333 2317 3333333333333333333333333333333333333333333333333333333 2318 3333333333333333333333333333333333333333333333333333333 2319 3333333333333333333333333333333333333333333333333333333 2320 3333333333333333333333333333333333333333333333333333333 2321 3333333333333333333333333333333333333333333333333333333 2322 3333333333333333333333333333333333333333333333333333333 2323 3333333333333333333333333333333333333333333333333333333 2324 3333333333333333333333333333333333333333333333333333333 2325 3333333333333333333333333333333333333333333333333333333 2326 3333333333333333333333333333333333333333333333333333333 2327 3333333333333333333333333333333333333333333333333333333 2328 3333333333333333333333333333333333333333333333333333333 2329 3333333333333333333333333333333333333333333333333333333 2330 3333333333333333333333333333333333333333333333333333333 2331 3333333333333333333333333333333333333333333333333333333 2332 3333333333333333333333333333333333333333333333333333333 2333 3333333333333333333333333333333333333333333333333333333 2334 3333333333333333333333333333333333333333333333333333333 2335 3333333333333333333333333333333333333333333333333333333 2336 3333333333333333333333333333333333333333333333333333333 2337 3333333333333333333333333333333333333333333333333333333 2338 3333333333333333333333333333333333333333333333333333333 2339 3333333333333333333333333333333333333333333333333333333 2340 3333333333333333333333333333333333333333333333333333333 2341 3333333333333333333333333333333333333333333333333333333 2342 3333333333333333333333333333333333333333333333333333333 2343 3333333333333333333333333333333333333333333333333333333 2344 3333333333333333333333333333333333333333333333333333333 2345 3333333333333333333333333333333333333333333333333333333 2346 3333333333333333333333333333333333333333333333333333333 2347 3333333333333333333333333333333333333333333333333333333 2348 3333333333333333333333333333333333333333333333333333333 2349 3333333333333333333333333333333333333333333333333333333 2350 3333333333333333333333333333333333333333333333333333333 2351 3333333333333333333333333333333333333333333333333333333 2352 3333333333333333333333333333333333333333333333333333333 2353 3333333333333333333333333333333333333333333333333333333 2354 3333333333333333333333333333333333333333333333333333333 2355 3333333333333333333333333333333333333333333333333333333 2356 3333333333333333333333333333333333333333333333333333333 2357 3333333333333333333333333333333333333333333333333333333 2358 3333333333333333333333333333333333333333333333333333333 2359 3333333333333333333333333333333333333333333333333333333 2360 3333333333333333333333333333333333333333333333333333333 2361 3333333333333333333333333333333333333333333333333333333 2362 3333333333333333333333333333333333333333333333333333333 2363 3333333333333333333333333333333333333333333333333333333 2364 3333333333333333333333333333333333333333333333333333333 2365 3333333333333333333333333333333333333333333333333333333 2366 3333333333333333333333333333333333333333333333333333333 2367 3333333333333333333333333333333333333333333333333333333 2368 3333333333333333333333333333333333333333333333333333333 2369 3333333333333333333333333333333333333333333333333333333 2370 3333333333333333333333333333333333333333333333333333333 2371 3333333333333333333333333333333333333333333333333333333 2372 3333333333333333333333333333333333333333333333333333333 2373 3333333333333333333333333333333333333333333333333333333 2374 3333333333333333333333333333333333333333333333333333333 2375 3333333333333333333333333333333333333333333333333333333 2376 3333333333333333333333333333333333333333333333333333333 2377 3333333333333333333333333333333333333333333333333333333 2378 3333333333333333333333333333333333333333333333333333333 2379 3333333333333333333333333333333333333333333333333333333 2380 3333333333333333333333333333333333333333333333333333333 2381 3333333333333333333333333333333333333333333333333333333 2382 3333333333333333333333333333333333333333333333333333333 2383 3333333333333333333333333333333333333333333333333333333 2384 3333333333333333333333333333333333333333333333333333333 2385 3333333333333333333333333333333333333333333333333333333 2386 3333333333333333333333333333333333333333333333333333333 2387 3333333333333333333333333333333333333333333333333333333 2388 3333333333333333333333333333333333333333333333333333333 2389 3333333333333333333333333333333333333333333333333333333 2390 3333333333333333333333333333333333333333333333333333333 2391 3333333333333333333333333333333333333333333333333333333 2392 3333333333333333333333333333333333333333333333333333333 2393 3333333333333333333333333333333333333333333333333333333 2394 3333333333333333333333333333333333333333333333333333333 2395 3333333333333333333333333333333333333333333333333333333 2396 3333333333333333333333333333333333333333333333333333333 2397 3333333333333333333333333333333333333333333333333333333 2398 3333333333333333333333333333333333333333333333333333333 2399 3333333333333333333333333333333333333333333333333333333 2400 3333333333333333333333333333333333333333333333333333333 2401 3333333333333333333333333333333333333333333333333333333 2402 3333333333333333333333333333333333333333333333333333333 2403 3333333333333333333333333333333333333333333333333333333 2404 3333333333333333333333333333333333333333333333333333333 2405 3333333333333333333333333333333333333333333333333333333 2406 3333333333333333333333333333333333333333333333333333333 2407 3333333333333333333333333333333333333333333333333333333 2408 3333333333333333333333333333333333333333333333333333333 2409 3333333333333333333333333333333333333333333333333333333 2410 3333333333333333333333333333333333333333333333333333333 2411 3333333333333333333333333333333333333333333333333333333 2412 3333333333333333333333333333333333333333333333333333333 2413 3333333333333333333333333333333333333333333333333333333 2414 3333333333333333333333333333333333333333333333333333333 2415 3333333333333333333333333333333333333333333333333333333 2416 3333333333333333333333333333333333333333333333333333333 2417 3333333333333333333333333333333333333333333333333333333 2418 3333333333333333333333333333333333333333333333333333333 2419 3333333333333333333333333333333333333333333333333333333 2420 3333333333333333333333333333333333333333333333333333333 2421 3333333333333333333333333333333333333333333333333333333 2422 3333333333333333333333333333333333333333333333333333333 2423 3333333333333333333333333333333333333333333333333333333 2424 3333333333333333333333333333333333333333333333333333333 2425 3333333333333333333333333333333333333333333333333333333 2426 3333333333333333333333333333333333333333333333333333333 2427 3333333333333333333333333333333333333333333333333333333 2428 3333333333333333333333333333333333333333333333333333333 2429 3333333333333333333333333333333333333333333333333333333 2430 3333333333333333333333333333333333333333333333333333333 2431 3333333333333333333333333333333333333333333333333333333 2432 3333333333333333333333333333333333333333333333333333333 2433 3333333333333333333333333333333333333333333333333333333 2434 3333333333333333333333333333333333333333333333333333333 2435 3333333333333333333333333333333333333333333333333333333 2436 3333333333333333333333333333333333333333333333333333333 2437 3333333333333333333333333333333333333333333333333333333 2438 3333333333333333333333333333333333333333333333333333333 2439 3333333333333333333333333333333333333333333333333333333 2440 3333333333333333333333333333333333333333333333333333333 2441 3333333333333333333333333333333333333333333333333333333 2442 3333333333333333333333333333333333333333333333333333333 2443 3333333333333333333333333333333333333333333333333333333 2444 3333333333333333333333333333333333333333333333333333333 2445 3333333333333333333333333333333333333333333333333333333 2446 3333333333333333333333333333333333333333333333333333333 2447 3333333333333333333333333333333333333333333333333333333 2448 3333333333333333333333333333333333333333333333333333333 2449 3333333333333333333333333333333333333333333333333333333 2450 3333333333333333333333333333333333333333333333333333333 2451 3333333333333333333333333333333333333333333333333333333 2452 3333333333333333333333333333333333333333333333333333333 2453 3333333333333333333333333333333333333333333333333333333 2454 3333333333333333333333333333333333333333333333333333333 2455 3333333333333333333333333333333333333333333333333333333 2456 3333333333333333333333333333333333333333333333333333333 2457 3333333333333333333333333333333333333333333333333333333 2458 3333333333333333333333333333333333333333333333333333333 2459 3333333333333333333333333333333333333333333333333333333 2460 3333333333333333333333333333333333333333333333333333333 2461 3333333333333333333333333333333333333333333333333333333 2462 3333333333333333333333333333333333333333333333333333333 2463 3333333333333333333333333333333333333333333333333333333 2464 3333333333333333333333333333333333333333333333333333333 2465 3333333333333333333333333333333333333333333333333333333 2466 3333333333333333333333333333333333333333333333333333333 2467 3333333333333333333333333333333333333333333333333333333 2468 3333333333333333333333333333333333333333333333333333333 2469 3333333333333333333333333333333333333333333333333333333 2470 3333333333333333333333333333333333333333333333333333333 2471 3333333333333333333333333333333333333333333333333333333 2472 3333333333333333333333333333333333333333333333333333333 2473 3333333333333333333333333333333333333333333333333333333 2474 3333333333333333333333333333333333333333333333333333333 2475 3333333333333333333333333333333333333333333333333333333 2476 3333333333333333333333333333333333333333333333333333333 2477 3333333333333333333333333333333333333333333333333333333 2478 3333333333333333333333333333333333333333333333333333333 2479 3333333333333333333333333333333333333333333333333333333 2480 3333333333333333333333333333333333333333333333333333333 2481 3333333333333333333333333333333333333333333333333333333 2482 3333333333333333333333333333333333333333333333333333333 2483 3333333333333333333333333333333333333333333333333333333 2484 3333333333333333333333333333333333333333333333333333333 2485 3333333333333333333333333333333333333333333333333333333 2486 3333333333333333333333333333333333333333333333333333333 2487 3333333333333333333333333333333333333333333333333333333 2488 3333333333333333333333333333333333333333333333333333333 2489 3333333333333333333333333333333333333333333333333333333 2490 3333333333333333333333333333333333333333333333333333333 2491 3333333333333333333333333333333333333333333333333333333 2492 3333333333333333333333333333333333333333333333333333333 2493 3333333333333333333333333333333333333333333333333333333 2494 3333333333333333333333333333333333333333333333333333333 2495 3333333333333333333333333333333333333333333333333333333 2496 3333333333333333333333333333333333333333333333333333333 2497 3333333333333333333333333333333333333333333333333333333 2498 3333333333333333333333333333333333333333333333333333333 2499 3333333333333333333333333333333333333333333333333333333 2500 3333333333333333333333333333333333333333333333333333333 2501 3333333333333333333333333333333333333333333333333333333 2502 3333333333333333333333333333333333333333333333333333333 2503 3333333333333333333333333333333333333333333333333333333 2504 3333333333333333333333333333333333333333333333333333333 2505 3333333333333333333333333333333333333333333333333333333 2506 3333333333333333333333333333333333333333333333333333333 2507 3333333333333333333333333333333333333333333333333333333 2508 3333333333333333333333333333333333333333333333333333333 2509 3333333333333333333333333333333333333333333333333333333 2510 3333333333333333333333333333333333333333333333333333333 2511 3333333333333333333333333333333333333333333333333333333 2512 3333333333333333333333333333333333333333333333333333333 2513 3333333333333333333333333333333333333333333333333333333 2514 3333333333333333333333333333333333333333333333333333333 2515 3333333333333333333333333333333333333333333333333333333 2516 3333333333333333333333333333333333333333333333333333333 2517 3333333333333333333333333333333333333333333333333333333 2518 3333333333333333333333333333333333333333333333333333333 2519 3333333333333333333333333333333333333333333333333333333 2520 3333333333333333333333333333333333333333333333333333333 2521 3333333333333333333333333333333333333333333333333333333 2522 3333333333333333333333333333333333333333333333333333333 2523 3333333333333333333333333333333333333333333333333333333 2524 3333333333333333333333333333333333333333333333333333333 2525 3333333333333333333333333333333333333333333333333333333 2526 3333333333333333333333333333333333333333333333333333333 2527 3333333333333333333333333333333333333333333333333333333 2528 3333333333333333333333333333333333333333333333333333333 2529 3333333333333333333333333333333333333333333333333333333 2530 3333333333333333333333333333333333333333333333333333333 2531 3333333333333333333333333333333333333333333333333333333 2532 3333333333333333333333333333333333333333333333333333333 2533 3333333333333333333333333333333333333333333333333333333 2534 3333333333333333333333333333333333333333333333333333333 2535 3333333333333333333333333333333333333333333333333333333 2536 3333333333333333333333333333333333333333333333333333333 2537 3333333333333333333333333333333333333333333333333333333 2538 3333333333333333333333333333333333333333333333333333333 2539 3333333333333333333333333333333333333333333333333333333 2540 3333333333333333333333333333333333333333333333333333333 2541 3333333333333333333333333333333333333333333333333333333 2542 3333333333333333333333333333333333333333333333333333333 2543 3333333333333333333333333333333333333333333333333333333 2544 3333333333333333333333333333333333333333333333333333333 2545 3333333333333333333333333333333333333333333333333333333 2546 3333333333333333333333333333333333333333333333333333333 2547 3333333333333333333333333333333333333333333333333333333 2548 3333333333333333333333333333333333333333333333333333333 2549 3333333333333333333333333333333333333333333333333333333 2550 3333333333333333333333333333333333333333333333333333333 2551 3333333333333333333333333333333333333333333333333333333 2552 3333333333333333333333333333333333333333333333333333333 2553 3333333333333333333333333333333333333333333333333333333 2554 3333333333333333333333333333333333333333333333333333333 2555 3333333333333333333333333333333333333333333333333333333 2556 3333333333333333333333333333333333333333333333333333333 2557 3333333333333333333333333333333333333333333333333333333 2558 3333333333333333333333333333333333333333333333333333333 2559 3333333333333333333333333333333333333333333333333333333 2560 3333333333333333333333333333333333333333333333333333333 2561 3333333333333333333333333333333333333333333333333333333 2562 3333333333333333333333333333333333333333333333333333333 2563 3333333333333333333333333333333333333333333333333333333 2564 3333333333333333333333333333333333333333333333333333333 2565 3333333333333333333333333333333333333333333333333333333 2566 3333333333333333333333333333333333333333333333333333333 2567 3333333333333333333333333333333333333333333333333333333 2568 3333333333333333333333333333333333333333333333333333333 2569 3333333333333333333333333333333333333333333333333333333 2570 3333333333333333333333333333333333333333333333333333333 2571 3333333333333333333333333333333333333333333333333333333 2572 3333333333333333333333333333333333333333333333333333333 2573 3333333333333333333333333333333333333333333333333333333 2574 3333333333333333333333333333333333333333333333333333333 2575 3333333333333333333333333333333333333333333333333333333 2576 3333333333333333333333333333333333333333333333333333333 2577 3333333333333333333333333333333333333333333333333333333 2578 3333333333333333333333333333333333333333333333333333333 2579 3333333333333333333333333333333333333333333333333333333 2580 3333333333333333333333333333333333333333333333333333333 2581 3333333333333333333333333333333333333333333333333333333 2582 3333333333333333333333333333333333333333333333333333333 2583 3333333333333333333333333333333333333333333333333333333 2584 3333333333333333333333333333333333333333333333333333333 2585 3333333333333333333333333333333333333333333333333333333 2586 3333333333333333333333333333333333333333333333333333333 2587 3333333333333333333333333333333333333333333333333333333 2588 3333333333333333333333333333333333333333333333333333333 2589 3333333333333333333333333333333333333333333333333333333 2590 3333333333333333333333333333333333333333333333333333333 2591 3333333333333333333333333333333333333333333333333333333 2592 3333333333333333333333333333333333333333333333333333333 2593 3333333333333333333333333333333333333333333333333333333 2594 3333333333333333333333333333333333333333333333333333333 2595 3333333333333333333333333333333333333333333333333333333 2596 3333333333333333333333333333333333333333333333333333333 2597 3333333333333333333333333333333333333333333333333333333 2598 3333333333333333333333333333333333333333333333333333333 2599 3333333333333333333333333333333333333333333333333333333 2600 3333333333333333333333333333333333333333333333333333333 2601 3333333333333333333333333333333333333333333333333333333 2602 3333333333333333333333333333333333333333333333333333333 2603 3333333333333333333333333333333333333333333333333333333 2604 3333333333333333333333333333333333333333333333333333333 2605 3333333333333333333333333333333333333333333333333333333 2606 3333333333333333333333333333333333333333333333333333333 2607 3333333333333333333333333333333333333333333333333333333 2608 3333333333333333333333333333333333333333333333333333333 2609 3333333333333333333333333333333333333333333333333333333 2610 3333333333333333333333333333333333333333333333333333333 2611 3333333333333333333333333333333333333333333333333333333 2612 3333333333333333333333333333333333333333333333333333333 2613 3333333333333333333333333333333333333333333333333333333 2614 3333333333333333333333333333333333333333333333333333333 2615 3333333333333333333333333333333333333333333333333333333 2616 3333333333333333333333333333333333333333333333333333333 2617 3333333333333333333333333333333333333333333333333333333 2618 3333333333333333333333333333333333333333333333333333333 2619 3333333333333333333333333333333333333333333333333333333 2620 3333333333333333333333333333333333333333333333333333333 2621 3333333333333333333333333333333333333333333333333333333 2622 3333333333333333333333333333333333333333333333333333333 2623 3333333333333333333333333333333333333333333333333333333 2624 3333333333333333333333333333333333333333333333333333333 2625 3333333333333333333333333333333333333333333333333333333 2626 3333333333333333333333333333333333333333333333333333333 2627 3333333333333333333333333333333333333333333333333333333 2628 3333333333333333333333333333333333333333333333333333333 2629 3333333333333333333333333333333333333333333333333333333 2630 3333333333333333333333333333333333333333333333333333333 2631 3333333333333333333333333333333333333333333333333333333 2632 3333333333333333333333333333333333333333333333333333333 2633 3333333333333333333333333333333333333333333333333333333 2634 3333333333333333333333333333333333333333333333333333333 2635 3333333333333333333333333333333333333333333333333333333 2636 3333333333333333333333333333333333333333333333333333333 2637 3333333333333333333333333333333333333333333333333333333 2638 3333333333333333333333333333333333333333333333333333333 2639 3333333333333333333333333333333333333333333333333333333 2640 3333333333333333333333333333333333333333333333333333333 2641 3333333333333333333333333333333333333333333333333333333 2642 3333333333333333333333333333333333333333333333333333333 2643 3333333333333333333333333333333333333333333333333333333 2644 3333333333333333333333333333333333333333333333333333333 2645 3333333333333333333333333333333333333333333333333333333 2646 3333333333333333333333333333333333333333333333333333333 2647 3333333333333333333333333333333333333333333333333333333 2648 3333333333333333333333333333333333333333333333333333333 2649 3333333333333333333333333333333333333333333333333333333 2650 3333333333333333333333333333333333333333333333333333333 2651 3333333333333333333333333333333333333333333333333333333 2652 3333333333333333333333333333333333333333333333333333333 2653 3333333333333333333333333333333333333333333333333333333 2654 3333333333333333333333333333333333333333333333333333333 2655 3333333333333333333333333333333333333333333333333333333 2656 3333333333333333333333333333333333333333333333333333333 2657 3333333333333333333333333333333333333333333333333333333 2658 3333333333333333333333333333333333333333333333333333333 2659 3333333333333333333333333333333333333333333333333333333 2660 3333333333333333333333333333333333333333333333333333333 2661 3333333333333333333333333333333333333333333333333333333 2662 3333333333333333333333333333333333333333333333333333333 2663 3333333333333333333333333333333333333333333333333333333 2664 3333333333333333333333333333333333333333333333333333333 2665 3333333333333333333333333333333333333333333333333333333 2666 3333333333333333333333333333333333333333333333333333333 2667 3333333333333333333333333333333333333333333333333333333 2668 3333333333333333333333333333333333333333333333333333333 2669 3333333333333333333333333333333333333333333333333333333 2670 3333333333333333333333333333333333333333333333333333333 2671 3333333333333333333333333333333333333333333333333333333 2672 3333333333333333333333333333333333333333333333333333333 2673 3333333333333333333333333333333333333333333333333333333 2674 3333333333333333333333333333333333333333333333333333333 2675 3333333333333333333333333333333333333333333333333333333 2676 3333333333333333333333333333333333333333333333333333333 2677 3333333333333333333333333333333333333333333333333333333 2678 3333333333333333333333333333333333333333333333333333333 2679 3333333333333333333333333333333333333333333333333333333 2680 3333333333333333333333333333333333333333333333333333333 2681 3333333333333333333333333333333333333333333333333333333 2682 3333333333333333333333333333333333333333333333333333333 2683 3333333333333333333333333333333333333333333333333333333 2684 3333333333333333333333333333333333333333333333333333333 2685 3333333333333333333333333333333333333333333333333333333 2686 3333333333333333333333333333333333333333333333333333333 2687 3333333333333333333333333333333333333333333333333333333 2688 3333333333333333333333333333333333333333333333333333333 2689 3333333333333333333333333333333333333333333333333333333 2690 3333333333333333333333333333333333333333333333333333333 2691 3333333333333333333333333333333333333333333333333333333 2692 3333333333333333333333333333333333333333333333333333333 2693 3333333333333333333333333333333333333333333333333333333 2694 3333333333333333333333333333333333333333333333333333333 2695 3333333333333333333333333333333333333333333333333333333 2696 3333333333333333333333333333333333333333333333333333333 2697 3333333333333333333333333333333333333333333333333333333 2698 3333333333333333333333333333333333333333333333333333333 2699 3333333333333333333333333333333333333333333333333333333 2700 3333333333333333333333333333333333333333333333333333333 2701 3333333333333333333333333333333333333333333333333333333 2702 3333333333333333333333333333333333333333333333333333333 2703 3333333333333333333333333333333333333333333333333333333 2704 3333333333333333333333333333333333333333333333333333333 2705 3333333333333333333333333333333333333333333333333333333 2706 3333333333333333333333333333333333333333333333333333333 2707 3333333333333333333333333333333333333333333333333333333 2708 3333333333333333333333333333333333333333333333333333333 2709 3333333333333333333333333333333333333333333333333333333 2710 3333333333333333333333333333333333333333333333333333333 2711 3333333333333333333333333333333333333333333333333333333 2712 3333333333333333333333333333333333333333333333333333333 2713 3333333333333333333333333333333333333333333333333333333 2714 3333333333333333333333333333333333333333333333333333333 2715 3333333333333333333333333333333333333333333333333333333 2716 3333333333333333333333333333333333333333333333333333333 2717 3333333333333333333333333333333333333333333333333333333 2718 3333333333333333333333333333333333333333333333333333333 2719 3333333333333333333333333333333333333333333333333333333 2720 3333333333333333333333333333333333333333333333333333333 2721 3333333333333333333333333333333333333333333333333333333 2722 3333333333333333333333333333333333333333333333333333333 2723 3333333333333333333333333333333333333333333333333333333 2724 3333333333333333333333333333333333333333333333333333333 2725 3333333333333333333333333333333333333333333333333333333 2726 3333333333333333333333333333333333333333333333333333333 2727 3333333333333333333333333333333333333333333333333333333 2728 3333333333333333333333333333333333333333333333333333333 2729 3333333333333333333333333333333333333333333333333333333 2730 3333333333333333333333333333333333333333333333333333333 2731 3333333333333333333333333333333333333333333333333333333 2732 3333333333333333333333333333333333333333333333333333333 2733 3333333333333333333333333333333333333333333333333333333 2734 3333333333333333333333333333333333333333333333333333333 2735 3333333333333333333333333333333333333333333333333333333 2736 3333333333333333333333333333333333333333333333333333333 2737 3333333333333333333333333333333333333333333333333333333 2738 3333333333333333333333333333333333333333333333333333333 2739 3333333333333333333333333333333333333333333333333333333 2740 3333333333333333333333333333333333333333333333333333333 2741 3333333333333333333333333333333333333333333333333333333 2742 3333333333333333333333333333333333333333333333333333333 2743 3333333333333333333333333333333333333333333333333333333 2744 3333333333333333333333333333333333333333333333333333333 2745 3333333333333333333333333333333333333333333333333333333 2746 3333333333333333333333333333333333333333333333333333333 2747 3333333333333333333333333333333333333333333333333333333 2748 3333333333333333333333333333333333333333333333333333333 2749 3333333333333333333333333333333333333333333333333333333 2750 3333333333333333333333333333333333333333333333333333333 2751 3333333333333333333333333333333333333333333333333333333 2752 3333333333333333333333333333333333333333333333333333333 2753 3333333333333333333333333333333333333333333333333333333 2754 3333333333333333333333333333333333333333333333333333333 2755 3333333333333333333333333333333333333333333333333333333 2756 3333333333333333333333333333333333333333333333333333333 2757 3333333333333333333333333333333333333333333333333333333 2758 3333333333333333333333333333333333333333333333333333333 2759 3333333333333333333333333333333333333333333333333333333 2760 3333333333333333333333333333333333333333333333333333333 2761 3333333333333333333333333333333333333333333333333333333 2762 3333333333333333333333333333333333333333333333333333333 2763 3333333333333333333333333333333333333333333333333333333 2764 3333333333333333333333333333333333333333333333333333333 2765 3333333333333333333333333333333333333333333333333333333 2766 3333333333333333333333333333333333333333333333333333333 2767 3333333333333333333333333333333333333333333333333333333 2768 3333333333333333333333333333333333333333333333333333333 2769 3333333333333333333333333333333333333333333333333333333 2770 3333333333333333333333333333333333333333333333333333333 2771 3333333333333333333333333333333333333333333333333333333 2772 3333333333333333333333333333333333333333333333333333333 2773 3333333333333333333333333333333333333333333333333333333 2774 3333333333333333333333333333333333333333333333333333333 2775 3333333333333333333333333333333333333333333333333333333 2776 3333333333333333333333333333333333333333333333333333333 2777 3333333333333333333333333333333333333333333333333333333 2778 3333333333333333333333333333333333333333333333333333333 2779 3333333333333333333333333333333333333333333333333333333 2780 3333333333333333333333333333333333333333333333333333333 2781 3333333333333333333333333333333333333333333333333333333 2782 3333333333333333333333333333333333333333333333333333333 2783 3333333333333333333333333333333333333333333333333333333 2784 3333333333333333333333333333333333333333333333333333333 2785 3333333333333333333333333333333333333333333333333333333 2786 3333333333333333333333333333333333333333333333333333333 2787 3333333333333333333333333333333333333333333333333333333 2788 3333333333333333333333333333333333333333333333333333333 2789 3333333333333333333333333333333333333333333333333333333 2790 3333333333333333333333333333333333333333333333333333333 2791 3333333333333333333333333333333333333333333333333333333 2792 3333333333333333333333333333333333333333333333333333333 2793 3333333333333333333333333333333333333333333333333333333 2794 3333333333333333333333333333333333333333333333333333333 2795 3333333333333333333333333333333333333333333333333333333 2796 3333333333333333333333333333333333333333333333333333333 2797 3333333333333333333333333333333333333333333333333333333 2798 3333333333333333333333333333333333333333333333333333333 2799 3333333333333333333333333333333333333333333333333333333 2800 3333333333333333333333333333333333333333333333333333333 2801 3333333333333333333333333333333333333333333333333333333 2802 3333333333333333333333333333333333333333333333333333333 2803 3333333333333333333333333333333333333333333333333333333 2804 3333333333333333333333333333333333333333333333333333333 2805 3333333333333333333333333333333333333333333333333333333 2806 3333333333333333333333333333333333333333333333333333333 2807 3333333333333333333333333333333333333333333333333333333 2808 3333333333333333333333333333333333333333333333333333333 2809 3333333333333333333333333333333333333333333333333333333 2810 3333333333333333333333333333333333333333333333333333333 2811 3333333333333333333333333333333333333333333333333333333 2812 3333333333333333333333333333333333333333333333333333333 2813 3333333333333333333333333333333333333333333333333333333 2814 3333333333333333333333333333333333333333333333333333333 2815 3333333333333333333333333333333333333333333333333333333 2816 3333333333333333333333333333333333333333333333333333333 2817 3333333333333333333333333333333333333333333333333333333 2818 3333333333333333333333333333333333333333333333333333333 2819 3333333333333333333333333333333333333333333333333333333 2820 3333333333333333333333333333333333333333333333333333333 2821 3333333333333333333333333333333333333333333333333333333 2822 3333333333333333333333333333333333333333333333333333333 2823 3333333333333333333333333333333333333333333333333333333 2824 3333333333333333333333333333333333333333333333333333333 2825 3333333333333333333333333333333333333333333333333333333 2826 3333333333333333333333333333333333333333333333333333333 2827 3333333333333333333333333333333333333333333333333333333 2828 3333333333333333333333333333333333333333333333333333333 2829 3333333333333333333333333333333333333333333333333333333 2830 3333333333333333333333333333333333333333333333333333333 2831 3333333333333333333333333333333333333333333333333333333 2832 3333333333333333333333333333333333333333333333333333333 2833 3333333333333333333333333333333333333333333333333333333 2834 3333333333333333333333333333333333333333333333333333333 2835 3333333333333333333333333333333333333333333333333333333 2836 3333333333333333333333333333333333333333333333333333333 2837 3333333333333333333333333333333333333333333333333333333 2838 3333333333333333333333333333333333333333333333333333333 2839 3333333333333333333333333333333333333333333333333333333 2840 3333333333333333333333333333333333333333333333333333333 2841 3333333333333333333333333333333333333333333333333333333 2842 3333333333333333333333333333333333333333333333333333333 2843 3333333333333333333333333333333333333333333333333333333 2844 3333333333333333333333333333333333333333333333333333333 2845 3333333333333333333333333333333333333333333333333333333 2846 3333333333333333333333333333333333333333333333333333333 2847 3333333333333333333333333333333333333333333333333333333 2848 3333333333333333333333333333333333333333333333333333333 2849 3333333333333333333333333333333333333333333333333333333 2850 3333333333333333333333333333333333333333333333333333333 2851 3333333333333333333333333333333333333333333333333333333 2852 3333333333333333333333333333333333333333333333333333333 2853 3333333333333333333333333333333333333333333333333333333 2854 3333333333333333333333333333333333333333333333333333333 2855 3333333333333333333333333333333333333333333333333333333 2856 3333333333333333333333333333333333333333333333333333333 2857 3333333333333333333333333333333333333333333333333333333 2858 3333333333333333333333333333333333333333333333333333333 2859 3333333333333333333333333333333333333333333333333333333 2860 3333333333333333333333333333333333333333333333333333333 2861 3333333333333333333333333333333333333333333333333333333 2862 3333333333333333333333333333333333333333333333333333333 2863 3333333333333333333333333333333333333333333333333333333 2864 3333333333333333333333333333333333333333333333333333333 2865 3333333333333333333333333333333333333333333333333333333 2866 3333333333333333333333333333333333333333333333333333333 2867 3333333333333333333333333333333333333333333333333333333 2868 3333333333333333333333333333333333333333333333333333333 2869 3333333333333333333333333333333333333333333333333333333 2870 3333333333333333333333333333333333333333333333333333333 2871 3333333333333333333333333333333333333333333333333333333 2872 3333333333333333333333333333333333333333333333333333333 2873 3333333333333333333333333333333333333333333333333333333 2874 3333333333333333333333333333333333333333333333333333333 2875 3333333333333333333333333333333333333333333333333333333 2876 3333333333333333333333333333333333333333333333333333333 2877 3333333333333333333333333333333333333333333333333333333 2878 3333333333333333333333333333333333333333333333333333333 2879 3333333333333333333333333333333333333333333333333333333 2880 3333333333333333333333333333333333333333333333333333333 2881 3333333333333333333333333333333333333333333333333333333 2882 3333333333333333333333333333333333333333333333333333333 2883 3333333333333333333333333333333333333333333333333333333 2884 3333333333333333333333333333333333333333333333333333333 2885 3333333333333333333333333333333333333333333333333333333 2886 3333333333333333333333333333333333333333333333333333333 2887 3333333333333333333333333333333333333333333333333333333 2888 3333333333333333333333333333333333333333333333333333333 2889 3333333333333333333333333333333333333333333333333333333 2890 3333333333333333333333333333333333333333333333333333333 2891 3333333333333333333333333333333333333333333333333333333 2892 3333333333333333333333333333333333333333333333333333333 2893 3333333333333333333333333333333333333333333333333333333 2894 3333333333333333333333333333333333333333333333333333333 2895 3333333333333333333333333333333333333333333333333333333 2896 3333333333333333333333333333333333333333333333333333333 2897 3333333333333333333333333333333333333333333333333333333 2898 3333333333333333333333333333333333333333333333333333333 2899 3333333333333333333333333333333333333333333333333333333 2900 3333333333333333333333333333333333333333333333333333333 2901 3333333333333333333333333333333333333333333333333333333 2902 3333333333333333333333333333333333333333333333333333333 2903 3333333333333333333333333333333333333333333333333333333 2904 3333333333333333333333333333333333333333333333333333333 2905 3333333333333333333333333333333333333333333333333333333 2906 3333333333333333333333333333333333333333333333333333333 2907 3333333333333333333333333333333333333333333333333333333 2908 3333333333333333333333333333333333333333333333333333333 2909 3333333333333333333333333333333333333333333333333333333 2910 3333333333333333333333333333333333333333333333333333333 2911 3333333333333333333333333333333333333333333333333333333 2912 3333333333333333333333333333333333333333333333333333333 2913 3333333333333333333333333333333333333333333333333333333 2914 3333333333333333333333333333333333333333333333333333333 2915 3333333333333333333333333333333333333333333333333333333 2916 3333333333333333333333333333333333333333333333333333333 2917 3333333333333333333333333333333333333333333333333333333 2918 3333333333333333333333333333333333333333333333333333333 2919 3333333333333333333333333333333333333333333333333333333 2920 3333333333333333333333333333333333333333333333333333333 2921 3333333333333333333333333333333333333333333333333333333 2922 3333333333333333333333333333333333333333333333333333333 2923 3333333333333333333333333333333333333333333333333333333 2924 3333333333333333333333333333333333333333333333333333333 2925 3333333333333333333333333333333333333333333333333333333 2926 3333333333333333333333333333333333333333333333333333333 2927 3333333333333333333333333333333333333333333333333333333 2928 3333333333333333333333333333333333333333333333333333333 2929 3333333333333333333333333333333333333333333333333333333 2930 3333333333333333333333333333333333333333333333333333333 2931 3333333333333333333333333333333333333333333333333333333 2932 3333333333333333333333333333333333333333333333333333333 2933 3333333333333333333333333333333333333333333333333333333 2934 3333333333333333333333333333333333333333333333333333333 2935 3333333333333333333333333333333333333333333333333333333 2936 3333333333333333333333333333333333333333333333333333333 2937 3333333333333333333333333333333333333333333333333333333 2938 3333333333333333333333333333333333333333333333333333333 2939 3333333333333333333333333333333333333333333333333333333 2940 3333333333333333333333333333333333333333333333333333333 2941 3333333333333333333333333333333333333333333333333333333 2942 3333333333333333333333333333333333333333333333333333333 2943 3333333333333333333333333333333333333333333333333333333 2944 3333333333333333333333333333333333333333333333333333333 2945 3333333333333333333333333333333333333333333333333333333 2946 3333333333333333333333333333333333333333333333333333333 2947 3333333333333333333333333333333333333333333333333333333 2948 3333333333333333333333333333333333333333333333333333333 2949 3333333333333333333333333333333333333333333333333333333 2950 3333333333333333333333333333333333333333333333333333333 2951 3333333333333333333333333333333333333333333333333333333 2952 3333333333333333333333333333333333333333333333333333333 2953 3333333333333333333333333333333333333333333333333333333 2954 3333333333333333333333333333333333333333333333333333333 2955 3333333333333333333333333333333333333333333333333333333 2956 3333333333333333333333333333333333333333333333333333333 2957 3333333333333333333333333333333333333333333333333333333 2958 3333333333333333333333333333333333333333333333333333333 2959 3333333333333333333333333333333333333333333333333333333 2960 3333333333333333333333333333333333333333333333333333333 2961 3333333333333333333333333333333333333333333333333333333 2962 3333333333333333333333333333333333333333333333333333333 2963 3333333333333333333333333333333333333333333333333333333 2964 3333333333333333333333333333333333333333333333333333333 2965 3333333333333333333333333333333333333333333333333333333 2966 3333333333333333333333333333333333333333333333333333333 2967 3333333333333333333333333333333333333333333333333333333 2968 3333333333333333333333333333333333333333333333333333333 2969 3333333333333333333333333333333333333333333333333333333 2970 3333333333333333333333333333333333333333333333333333333 2971 3333333333333333333333333333333333333333333333333333333 2972 3333333333333333333333333333333333333333333333333333333 2973 3333333333333333333333333333333333333333333333333333333 2974 3333333333333333333333333333333333333333333333333333333 2975 3333333333333333333333333333333333333333333333333333333 2976 3333333333333333333333333333333333333333333333333333333 2977 3333333333333333333333333333333333333333333333333333333 2978 3333333333333333333333333333333333333333333333333333333 2979 3333333333333333333333333333333333333333333333333333333 2980 3333333333333333333333333333333333333333333333333333333 2981 3333333333333333333333333333333333333333333333333333333 2982 3333333333333333333333333333333333333333333333333333333 2983 3333333333333333333333333333333333333333333333333333333 2984 3333333333333333333333333333333333333333333333333333333 2985 3333333333333333333333333333333333333333333333333333333 2986 3333333333333333333333333333333333333333333333333333333 2987 3333333333333333333333333333333333333333333333333333333 2988 3333333333333333333333333333333333333333333333333333333 2989 3333333333333333333333333333333333333333333333333333333 2990 3333333333333333333333333333333333333333333333333333333 2991 3333333333333333333333333333333333333333333333333333333 2992 3333333333333333333333333333333333333333333333333333333 2993 3333333333333333333333333333333333333333333333333333333 2994 3333333333333333333333333333333333333333333333333333333 2995 3333333333333333333333333333333333333333333333333333333 2996 3333333333333333333333333333333333333333333333333333333 2997 3333333333333333333333333333333333333333333333333333333 2998 3333333333333333333333333333333333333333333333333333333 2999 3333333333333333333333333333333333333333333333333333333 3000 3333333333333333333333333333333333333333333333333333333 3001 3333333333333333333333333333333333333333333333333333333 3002 3333333333333333333333333333333333333333333333333333333 3003 3333333333333333333333333333333333333333333333333333333 3004 3333333333333333333333333333333333333333333333333333333 3005 3333333333333333333333333333333333333333333333333333333 3006 3333333333333333333333333333333333333333333333333333333 3007 3333333333333333333333333333333333333333333333333333333 3008 3333333333333333333333333333333333333333333333333333333 3009 3333333333333333333333333333333333333333333333333333333 3010 3333333333333333333333333333333333333333333333333333333 3011 3333333333333333333333333333333333333333333333333333333 3012 3333333333333333333333333333333333333333333333333333333 3013 3333333333333333333333333333333333333333333333333333333 3014 3333333333333333333333333333333333333333333333333333333 3015 3333333333333333333333333333333333333333333333333333333 3016 3333333333333333333333333333333333333333333333333333333 3017 3333333333333333333333333333333333333333333333333333333 3018 3333333333333333333333333333333333333333333333333333333 3019 3333333333333333333333333333333333333333333333333333333 3020 3333333333333333333333333333333333333333333333333333333 3021 3333333333333333333333333333333333333333333333333333333 3022 3333333333333333333333333333333333333333333333333333333 3023 3333333333333333333333333333333333333333333333333333333 3024 3333333333333333333333333333333333333333333333333333333 3025 3333333333333333333333333333333333333333333333333333333 3026 3333333333333333333333333333333333333333333333333333333 3027 3333333333333333333333333333333333333333333333333333333 3028 3333333333333333333333333333333333333333333333333333333 3029 3333333333333333333333333333333333333333333333333333333 3030 3333333333333333333333333333333333333333333333333333333 3031 3333333333333333333333333333333333333333333333333333333 3032 3333333333333333333333333333333333333333333333333333333 3033 3333333333333333333333333333333333333333333333333333333 3034 3333333333333333333333333333333333333333333333333333333 3035 3333333333333333333333333333333333333333333333333333333 3036 3333333333333333333333333333333333333333333333333333333 3037 3333333333333333333333333333333333333333333333333333333 3038 3333333333333333333333333333333333333333333333333333333 3039 3333333333333333333333333333333333333333333333333333333 3040 3333333333333333333333333333333333333333333333333333333 3041 3333333333333333333333333333333333333333333333333333333 3042 3333333333333333333333333333333333333333333333333333333 3043 3333333333333333333333333333333333333333333333333333333 3044 3333333333333333333333333333333333333333333333333333333 3045 3333333333333333333333333333333333333333333333333333333 3046 3333333333333333333333333333333333333333333333333333333 3047 3333333333333333333333333333333333333333333333333333333 3048 3333333333333333333333333333333333333333333333333333333 3049 3333333333333333333333333333333333333333333333333333333 3050 3333333333333333333333333333333333333333333333333333333 3051 3333333333333333333333333333333333333333333333333333333 3052 3333333333333333333333333333333333333333333333333333333 3053 3333333333333333333333333333333333333333333333333333333 3054 3333333333333333333333333333333333333333333333333333333 3055 3333333333333333333333333333333333333333333333333333333 3056 3333333333333333333333333333333333333333333333333333333 3057 3333333333333333333333333333333333333333333333333333333 3058 3333333333333333333333333333333333333333333333333333333 3059 3333333333333333333333333333333333333333333333333333333 3060 3333333333333333333333333333333333333333333333333333333 3061 3333333333333333333333333333333333333333333333333333333 3062 3333333333333333333333333333333333333333333333333333333 3063 3333333333333333333333333333333333333333333333333333333 3064 3333333333333333333333333333333333333333333333333333333 3065 3333333333333333333333333333333333333333333333333333333 3066 3333333333333333333333333333333333333333333333333333333 3067 3333333333333333333333333333333333333333333333333333333 3068 3333333333333333333333333333333333333333333333333333333 3069 3333333333333333333333333333333333333333333333333333333 3070 3333333333333333333333333333333333333333333333333333333 3071 3333333333333333333333333333333333333333333333333333333 3072 3333333333333333333333333333333333333333333333333333333 3073 3333333333333333333333333333333333333333333333333333333 3074 3333333333333333333333333333333333333333333333333333333 3075 3333333333333333333333333333333333333333333333333333333 3076 3333333333333333333333333333333333333333333333333333333 3077 3333333333333333333333333333333333333333333333333333333 3078 3333333333333333333333333333333333333333333333333333333 3079 3333333333333333333333333333333333333333333333333333333 3080 3333333333333333333333333333333333333333333333333333333 3081 3333333333333333333333333333333333333333333333333333333 3082 3333333333333333333333333333333333333333333333333333333 3083 3333333333333333333333333333333333333333333333333333333 3084 3333333333333333333333333333333333333333333333333333333 3085 3333333333333333333333333333333333333333333333333333333 3086 3333333333333333333333333333333333333333333333333333333 3087 3333333333333333333333333333333333333333333333333333333 3088 3333333333333333333333333333333333333333333333333333333 3089 3333333333333333333333333333333333333333333333333333333 3090 3333333333333333333333333333333333333333333333333333333 3091 3333333333333333333333333333333333333333333333333333333 3092 3333333333333333333333333333333333333333333333333333333 3093 3333333333333333333333333333333333333333333333333333333 3094 3333333333333333333333333333333333333333333333333333333 3095 3333333333333333333333333333333333333333333333333333333 3096 3333333333333333333333333333333333333333333333333333333 3097 3333333333333333333333333333333333333333333333333333333 3098 3333333333333333333333333333333333333333333333333333333 3099 3333333333333333333333333333333333333333333333333333333 3100 3333333333333333333333333333333333333333333333333333333 3101 3333333333333333333333333333333333333333333333333333333 3102 3333333333333333333333333333333333333333333333333333333 3103 3333333333333333333333333333333333333333333333333333333 3104 3333333333333333333333333333333333333333333333333333333 3105 3333333333333333333333333333333333333333333333333333333 3106 3333333333333333333333333333333333333333333333333333333 3107 3333333333333333333333333333333333333333333333333333333 3108 3333333333333333333333333333333333333333333333333333333 3109 3333333333333333333333333333333333333333333333333333333 3110 3333333333333333333333333333333333333333333333333333333 3111 3333333333333333333333333333333333333333333333333333333 3112 3333333333333333333333333333333333333333333333333333333 3113 3333333333333333333333333333333333333333333333333333333 3114 3333333333333333333333333333333333333333333333333333333 3115 3333333333333333333333333333333333333333333333333333333 3116 3333333333333333333333333333333333333333333333333333333 3117 3333333333333333333333333333333333333333333333333333333 3118 3333333333333333333333333333333333333333333333333333333 3119 3333333333333333333333333333333333333333333333333333333 3120 3333333333333333333333333333333333333333333333333333333 3121 3333333333333333333333333333333333333333333333333333333 3122 3333333333333333333333333333333333333333333333333333333 3123 3333333333333333333333333333333333333333333333333333333 3124 3333333333333333333333333333333333333333333333333333333 3125 3333333333333333333333333333333333333333333333333333333 3126 3333333333333333333333333333333333333333333333333333333 3127 3333333333333333333333333333333333333333333333333333333 3128 3333333333333333333333333333333333333333333333333333333 3129 3333333333333333333333333333333333333333333333333333333 3130 3333333333333333333333333333333333333333333333333333333 3131 3333333333333333333333333333333333333333333333333333333 3132 3333333333333333333333333333333333333333333333333333333 3133 3333333333333333333333333333333333333333333333333333333 3134 3333333333333333333333333333333333333333333333333333333 3135 3333333333333333333333333333333333333333333333333333333 3136 3333333333333333333333333333333333333333333333333333333 3137 3333333333333333333333333333333333333333333333333333333 3138 3333333333333333333333333333333333333333333333333333333 3139 3333333333333333333333333333333333333333333333333333333 3140 3333333333333333333333333333333333333333333333333333333 3141 3333333333333333333333333333333333333333333333333333333 3142 3333333333333333333333333333333333333333333333333333333 3143 3333333333333333333333333333333333333333333333333333333 3144 3333333333333333333333333333333333333333333333333333333 3145 3333333333333333333333333333333333333333333333333333333 3146 3333333333333333333333333333333333333333333333333333333 3147 3333333333333333333333333333333333333333333333333333333 3148 3333333333333333333333333333333333333333333333333333333 3149 3333333333333333333333333333333333333333333333333333333 3150 3333333333333333333333333333333333333333333333333333333 3151 3333333333333333333333333333333333333333333333333333333 3152 3333333333333333333333333333333333333333333333333333333 3153 3333333333333333333333333333333333333333333333333333333 3154 3333333333333333333333333333333333333333333333333333333 3155 3333333333333333333333333333333333333333333333333333333 3156 3333333333333333333333333333333333333333333333333333333 3157 3333333333333333333333333333333333333333333333333333333 3158 3333333333333333333333333333333333333333333333333333333 3159 3333333333333333333333333333333333333333333333333333333 3160 3333333333333333333333333333333333333333333333333333333 3161 3333333333333333333333333333333333333333333333333333333 3162 3333333333333333333333333333333333333333333333333333333 3163 3333333333333333333333333333333333333333333333333333333 3164 3333333333333333333333333333333333333333333333333333333 3165 3333333333333333333333333333333333333333333333333333333 3166 3333333333333333333333333333333333333333333333333333333 3167 3333333333333333333333333333333333333333333333333333333 3168 3333333333333333333333333333333333333333333333333333333 3169 3333333333333333333333333333333333333333333333333333333 3170 3333333333333333333333333333333333333333333333333333333 3171 3333333333333333333333333333333333333333333333333333333 3172 3333333333333333333333333333333333333333333333333333333 3173 3333333333333333333333333333333333333333333333333333333 3174 3333333333333333333333333333333333333333333333333333333 3175 3333333333333333333333333333333333333333333333333333333 3176 3333333333333333333333333333333333333333333333333333333 3177 3333333333333333333333333333333333333333333333333333333 3178 3333333333333333333333333333333333333333333333333333333 3179 3333333333333333333333333333333333333333333333333333333 3180 3333333333333333333333333333333333333333333333333333333 3181 3333333333333333333333333333333333333333333333333333333 3182 3333333333333333333333333333333333333333333333333333333 3183 3333333333333333333333333333333333333333333333333333333 3184 3333333333333333333333333333333333333333333333333333333 3185 3333333333333333333333333333333333333333333333333333333 3186 3333333333333333333333333333333333333333333333333333333 3187 3333333333333333333333333333333333333333333333333333333 3188 3333333333333333333333333333333333333333333333333333333 3189 3333333333333333333333333333333333333333333333333333333 3190 3333333333333333333333333333333333333333333333333333333 3191 3333333333333333333333333333333333333333333333333333333 3192 3333333333333333333333333333333333333333333333333333333 3193 3333333333333333333333333333333333333333333333333333333 3194 3333333333333333333333333333333333333333333333333333333 3195 3333333333333333333333333333333333333333333333333333333 3196 3333333333333333333333333333333333333333333333333333333 3197 3333333333333333333333333333333333333333333333333333333 3198 3333333333333333333333333333333333333333333333333333333 3199 3333333333333333333333333333333333333333333333333333333 3200 3333333333333333333333333333333333333333333333333333333 3201 3333333333333333333333333333333333333333333333333333333 3202 3333333333333333333333333333333333333333333333333333333 3203 3333333333333333333333333333333333333333333333333333333 3204 3333333333333333333333333333333333333333333333333333333 3205 3333333333333333333333333333333333333333333333333333333 3206 3333333333333333333333333333333333333333333333333333333 3207 3333333333333333333333333333333333333333333333333333333 3208 3333333333333333333333333333333333333333333333333333333 3209 3333333333333333333333333333333333333333333333333333333 3210 3333333333333333333333333333333333333333333333333333333 3211 3333333333333333333333333333333333333333333333333333333 3212 3333333333333333333333333333333333333333333333333333333 3213 3333333333333333333333333333333333333333333333333333333 3214 3333333333333333333333333333333333333333333333333333333 3215 3333333333333333333333333333333333333333333333333333333 3216 3333333333333333333333333333333333333333333333333333333 3217 3333333333333333333333333333333333333333333333333333333 3218 3333333333333333333333333333333333333333333333333333333 3219 3333333333333333333333333333333333333333333333333333333 3220 3333333333333333333333333333333333333333333333333333333 3221 3333333333333333333333333333333333333333333333333333333 3222 3333333333333333333333333333333333333333333333333333333 3223 3333333333333333333333333333333333333333333333333333333 3224 3333333333333333333333333333333333333333333333333333333 3225 3333333333333333333333333333333333333333333333333333333 3226 3333333333333333333333333333333333333333333333333333333 3227 3333333333333333333333333333333333333333333333333333333 3228 3333333333333333333333333333333333333333333333333333333 3229 3333333333333333333333333333333333333333333333333333333 3230 3333333333333333333333333333333333333333333333333333333 3231 3333333333333333333333333333333333333333333333333333333 3232 3333333333333333333333333333333333333333333333333333333 3233 3333333333333333333333333333333333333333333333333333333 3234 3333333333333333333333333333333333333333333333333333333 3235 3333333333333333333333333333333333333333333333333333333 3236 3333333333333333333333333333333333333333333333333333333 3237 3333333333333333333333333333333333333333333333333333333 3238 3333333333333333333333333333333333333333333333333333333 3239 3333333333333333333333333333333333333333333333333333333 3240 3333333333333333333333333333333333333333333333333333333 3241 3333333333333333333333333333333333333333333333333333333 3242 3333333333333333333333333333333333333333333333333333333 3243 3333333333333333333333333333333333333333333333333333333 3244 3333333333333333333333333333333333333333333333333333333 3245 3333333333333333333333333333333333333333333333333333333 3246 3333333333333333333333333333333333333333333333333333333 3247 3333333333333333333333333333333333333333333333333333333 3248 3333333333333333333333333333333333333333333333333333333 3249 3333333333333333333333333333333333333333333333333333333 3250 3333333333333333333333333333333333333333333333333333333 3251 3333333333333333333333333333333333333333333333333333333 3252 3333333333333333333333333333333333333333333333333333333 3253 3333333333333333333333333333333333333333333333333333333 3254 3333333333333333333333333333333333333333333333333333333 3255 3333333333333333333333333333333333333333333333333333333 3256 3333333333333333333333333333333333333333333333333333333 3257 3333333333333333333333333333333333333333333333333333333 3258 3333333333333333333333333333333333333333333333333333333 3259 3333333333333333333333333333333333333333333333333333333 3260 3333333333333333333333333333333333333333333333333333333 3261 3333333333333333333333333333333333333333333333333333333 3262 3333333333333333333333333333333333333333333333333333333 3263 3333333333333333333333333333333333333333333333333333333 3264 3333333333333333333333333333333333333333333333333333333 3265 3333333333333333333333333333333333333333333333333333333 3266 3333333333333333333333333333333333333333333333333333333 3267 3333333333333333333333333333333333333333333333333333333 3268 3333333333333333333333333333333333333333333333333333333 3269 3333333333333333333333333333333333333333333333333333333 3270 3333333333333333333333333333333333333333333333333333333 3271 3333333333333333333333333333333333333333333333333333333 3272 3333333333333333333333333333333333333333333333333333333 3273 3333333333333333333333333333333333333333333333333333333 3274 3333333333333333333333333333333333333333333333333333333 3275 3333333333333333333333333333333333333333333333333333333 3276 3333333333333333333333333333333333333333333333333333333 3277 3333333333333333333333333333333333333333333333333333333 3278 3333333333333333333333333333333333333333333333333333333 3279 3333333333333333333333333333333333333333333333333333333 3280 3333333333333333333333333333333333333333333333333333333 3281 3333333333333333333333333333333333333333333333333333333 3282 3333333333333333333333333333333333333333333333333333333 3283 3333333333333333333333333333333333333333333333333333333 3284 3333333333333333333333333333333333333333333333333333333 3285 3333333333333333333333333333333333333333333333333333333 3286 3333333333333333333333333333333333333333333333333333333 3287 3333333333333333333333333333333333333333333333333333333 3288 3333333333333333333333333333333333333333333333333333333 3289 3333333333333333333333333333333333333333333333333333333 3290 3333333333333333333333333333333333333333333333333333333 3291 3333333333333333333333333333333333333333333333333333333 3292 3333333333333333333333333333333333333333333333333333333 3293 3333333333333333333333333333333333333333333333333333333 3294 3333333333333333333333333333333333333333333333333333333 3295 3333333333333333333333333333333333333333333333333333333 3296 3333333333333333333333333333333333333333333333333333333 3297 3333333333333333333333333333333333333333333333333333333 3298 3333333333333333333333333333333333333333333333333333333 3299 3333333333333333333333333333333333333333333333333333333 3300 3333333333333333333333333333333333333333333333333333333 3301 3333333333333333333333333333333333333333333333333333333 3302 3333333333333333333333333333333333333333333333333333333 3303 3333333333333333333333333333333333333333333333333333333 3304 3333333333333333333333333333333333333333333333333333333 3305 3333333333333333333333333333333333333333333333333333333 3306 3333333333333333333333333333333333333333333333333333333 3307 3333333333333333333333333333333333333333333333333333333 3308 3333333333333333333333333333333333333333333333333333333 3309 3333333333333333333333333333333333333333333333333333333 3310 3333333333333333333333333333333333333333333333333333333 3311 3333333333333333333333333333333333333333333333333333333 3312 3333333333333333333333333333333333333333333333333333333 3313 3333333333333333333333333333333333333333333333333333333 3314 3333333333333333333333333333333333333333333333333333333 3315 3333333333333333333333333333333333333333333333333333333 3316 3333333333333333333333333333333333333333333333333333333 3317 3333333333333333333333333333333333333333333333333333333 3318 3333333333333333333333333333333333333333333333333333333 3319 3333333333333333333333333333333333333333333333333333333 3320 3333333333333333333333333333333333333333333333333333333 3321 3333333333333333333333333333333333333333333333333333333 3322 3333333333333333333333333333333333333333333333333333333 3323 3333333333333333333333333333333333333333333333333333333 3324 3333333333333333333333333333333333333333333333333333333 3325 3333333333333333333333333333333333333333333333333333333 3326 3333333333333333333333333333333333333333333333333333333 3327 3333333333333333333333333333333333333333333333333333333 3328 3333333333333333333333333333333333333333333333333333333 3329 3333333333333333333333333333333333333333333333333333333 3330 3333333333333333333333333333333333333333333333333333333 3331 3333333333333333333333333333333333333333333333333333333 3332 3333333333333333333333333333333333333333333333333333333 3333 3333333333333333333333333333333333333333333333333333333 3334 3333333333333333333333333333333333333333333333333333333 3335 3333333333333333333333333333333333333333333333333333333 3336 3333333333333333333333333333333333333333333333333333333 3337 3333333333333333333333333333333333333333333333333333333 3338 3333333333333333333333333333333333333333333333333333333 3339 3333333333333333333333333333333333333333333333333333333 3340 3333333333333333333333333333333333333333333333333333333 3341 3333333333333333333333333333333333333333333333333333333 3342 3333333333333333333333333333333333333333333333333333333 3343 3333333333333333333333333333333333333333333333333333333 3344 3333333333333333333333333333333333333333333333333333333 3345 3333333333333333333333333333333333333333333333333333333 3346 3333333333333333333333333333333333333333333333333333333 3347 3333333333333333333333333333333333333333333333333333333 3348 3333333333333333333333333333333333333333333333333333333 3349 3333333333333333333333333333333333333333333333333333333 3350 3333333333333333333333333333333333333333333333333333333 3351 3333333333333333333333333333333333333333333333333333333 3352 3333333333333333333333333333333333333333333333333333333 3353 3333333333333333333333333333333333333333333333333333333 3354 3333333333333333333333333333333333333333333333333333333 3355 3333333333333333333333333333333333333333333333333333333 3356 3333333333333333333333333333333333333333333333333333333 3357 3333333333333333333333333333333333333333333333333333333 3358 3333333333333333333333333333333333333333333333333333333 3359 3333333333333333333333333333333333333333333333333333333 3360 3333333333333333333333333333333333333333333333333333333 3361 3333333333333333333333333333333333333333333333333333333 3362 3333333333333333333333333333333333333333333333333333333 3363 3333333333333333333333333333333333333333333333333333333 3364 3333333333333333333333333333333333333333333333333333333 3365 3333333333333333333333333333333333333333333333333333333 3366 3333333333333333333333333333333333333333333333333333333 3367 3333333333333333333333333333333333333333333333333333333 3368 3333333333333333333333333333333333333333333333333333333 3369 3333333333333333333333333333333333333333333333333333333 3370 3333333333333333333333333333333333333333333333333333333 3371 3333333333333333333333333333333333333333333333333333333 3372 3333333333333333333333333333333333333333333333333333333 3373 3333333333333333333333333333333333333333333333333333333 3374 3333333333333333333333333333333333333333333333333333333 3375 3333333333333333333333333333333333333333333333333333333 3376 3333333333333333333333333333333333333333333333333333333 3377 3333333333333333333333333333333333333333333333333333333 3378 3333333333333333333333333333333333333333333333333333333 3379 3333333333333333333333333333333333333333333333333333333 3380 3333333333333333333333333333333333333333333333333333333 3381 3333333333333333333333333333333333333333333333333333333 3382 3333333333333333333333333333333333333333333333333333333 3383 3333333333333333333333333333333333333333333333333333333 3384 3333333333333333333333333333333333333333333333333333333 3385 3333333333333333333333333333333333333333333333333333333 3386 3333333333333333333333333333333333333333333333333333333 3387 3333333333333333333333333333333333333333333333333333333 3388 3333333333333333333333333333333333333333333333333333333 3389 3333333333333333333333333333333333333333333333333333333 3390 3333333333333333333333333333333333333333333333333333333 3391 3333333333333333333333333333333333333333333333333333333 3392 3333333333333333333333333333333333333333333333333333333 3393 3333333333333333333333333333333333333333333333333333333 3394 3333333333333333333333333333333333333333333333333333333 3395 3333333333333333333333333333333333333333333333333333333 3396 3333333333333333333333333333333333333333333333333333333 3397 3333333333333333333333333333333333333333333333333333333 3398 3333333333333333333333333333333333333333333333333333333 3399 3333333333333333333333333333333333333333333333333333333 3400 3333333333333333333333333333333333333333333333333333333 3401 3333333333333333333333333333333333333333333333333333333 3402 3333333333333333333333333333333333333333333333333333333 3403 3333333333333333333333333333333333333333333333333333333 3404 3333333333333333333333333333333333333333333333333333333 3405 3333333333333333333333333333333333333333333333333333333 3406 3333333333333333333333333333333333333333333333333333333 3407 3333333333333333333333333333333333333333333333333333333 3408 3333333333333333333333333333333333333333333333333333333 3409 3333333333333333333333333333333333333333333333333333333 3410 3333333333333333333333333333333333333333333333333333333 3411 3333333333333333333333333333333333333333333333333333333 3412 3333333333333333333333333333333333333333333333333333333 3413 3333333333333333333333333333333333333333333333333333333 3414 3333333333333333333333333333333333333333333333333333333 3415 3333333333333333333333333333333333333333333333333333333 3416 3333333333333333333333333333333333333333333333333333333 3417 3333333333333333333333333333333333333333333333333333333 3418 3333333333333333333333333333333333333333333333333333333 3419 3333333333333333333333333333333333333333333333333333333 3420 3333333333333333333333333333333333333333333333333333333 3421 3333333333333333333333333333333333333333333333333333333 3422 3333333333333333333333333333333333333333333333333333333 3423 3333333333333333333333333333333333333333333333333333333 3424 3333333333333333333333333333333333333333333333333333333 3425 3333333333333333333333333333333333333333333333333333333 3426 3333333333333333333333333333333333333333333333333333333 3427 3333333333333333333333333333333333333333333333333333333 3428 3333333333333333333333333333333333333333333333333333333 3429 3333333333333333333333333333333333333333333333333333333 3430 3333333333333333333333333333333333333333333333333333333 3431 3333333333333333333333333333333333333333333333333333333 3432 3333333333333333333333333333333333333333333333333333333 3433 3333333333333333333333333333333333333333333333333333333 3434 3333333333333333333333333333333333333333333333333333333 3435 3333333333333333333333333333333333333333333333333333333 3436 3333333333333333333333333333333333333333333333333333333 3437 3333333333333333333333333333333333333333333333333333333 3438 3333333333333333333333333333333333333333333333333333333 3439 3333333333333333333333333333333333333333333333333333333 3440 3333333333333333333333333333333333333333333333333333333 3441 3333333333333333333333333333333333333333333333333333333 3442 3333333333333333333333333333333333333333333333333333333 3443 3333333333333333333333333333333333333333333333333333333 3444 3333333333333333333333333333333333333333333333333333333 3445 3333333333333333333333333333333333333333333333333333333 3446 3333333333333333333333333333333333333333333333333333333 3447 3333333333333333333333333333333333333333333333333333333 3448 3333333333333333333333333333333333333333333333333333333 3449 3333333333333333333333333333333333333333333333333333333 3450 3333333333333333333333333333333333333333333333333333333 3451 3333333333333333333333333333333333333333333333333333333 3452 3333333333333333333333333333333333333333333333333333333 3453 3333333333333333333333333333333333333333333333333333333 3454 3333333333333333333333333333333333333333333333333333333 3455 3333333333333333333333333333333333333333333333333333333 3456 3333333333333333333333333333333333333333333333333333333 3457 3333333333333333333333333333333333333333333333333333333 3458 3333333333333333333333333333333333333333333333333333333 3459 3333333333333333333333333333333333333333333333333333333 3460 3333333333333333333333333333333333333333333333333333333 3461 3333333333333333333333333333333333333333333333333333333 3462 3333333333333333333333333333333333333333333333333333333 3463 3333333333333333333333333333333333333333333333333333333 3464 3333333333333333333333333333333333333333333333333333333 3465 3333333333333333333333333333333333333333333333333333333 3466 3333333333333333333333333333333333333333333333333333333 3467 3333333333333333333333333333333333333333333333333333333 3468 3333333333333333333333333333333333333333333333333333333 3469 3333333333333333333333333333333333333333333333333333333 3470 3333333333333333333333333333333333333333333333333333333 3471 3333333333333333333333333333333333333333333333333333333 3472 3333333333333333333333333333333333333333333333333333333 3473 3333333333333333333333333333333333333333333333333333333 3474 3333333333333333333333333333333333333333333333333333333 3475 3333333333333333333333333333333333333333333333333333333 3476 3333333333333333333333333333333333333333333333333333333 3477 3333333333333333333333333333333333333333333333333333333 3478 3333333333333333333333333333333333333333333333333333333 3479 3333333333333333333333333333333333333333333333333333333 3480 3333333333333333333333333333333333333333333333333333333 3481 3333333333333333333333333333333333333333333333333333333 3482 3333333333333333333333333333333333333333333333333333333 3483 3333333333333333333333333333333333333333333333333333333 3484 3333333333333333333333333333333333333333333333333333333 3485 3333333333333333333333333333333333333333333333333333333 3486 3333333333333333333333333333333333333333333333333333333 3487 3333333333333333333333333333333333333333333333333333333 3488 3333333333333333333333333333333333333333333333333333333 3489 3333333333333333333333333333333333333333333333333333333 3490 3333333333333333333333333333333333333333333333333333333 3491 3333333333333333333333333333333333333333333333333333333 3492 3333333333333333333333333333333333333333333333333333333 3493 3333333333333333333333333333333333333333333333333333333 3494 3333333333333333333333333333333333333333333333333333333 3495 3333333333333333333333333333333333333333333333333333333 3496 3333333333333333333333333333333333333333333333333333333 3497 3333333333333333333333333333333333333333333333333333333 3498 3333333333333333333333333333333333333333333333333333333 3499 3333333333333333333333333333333333333333333333333333333 3500 3333333333333333333333333333333333333333333333333333333 3501 3333333333333333333333333333333333333333333333333333333 3502 3333333333333333333333333333333333333333333333333333333 3503 3333333333333333333333333333333333333333333333333333333 3504 3333333333333333333333333333333333333333333333333333333 3505 3333333333333333333333333333333333333333333333333333333 3506 3333333333333333333333333333333333333333333333333333333 3507 3333333333333333333333333333333333333333333333333333333 3508 3333333333333333333333333333333333333333333333333333333 3509 3333333333333333333333333333333333333333333333333333333 3510 3333333333333333333333333333333333333333333333333333333 3511 3333333333333333333333333333333333333333333333333333333 3512 3333333333333333333333333333333333333333333333333333333 3513 3333333333333333333333333333333333333333333333333333333 3514 3333333333333333333333333333333333333333333333333333333 3515 3333333333333333333333333333333333333333333333333333333 3516 3333333333333333333333333333333333333333333333333333333 3517 3333333333333333333333333333333333333333333333333333333 3518 3333333333333333333333333333333333333333333333333333333 3519 3333333333333333333333333333333333333333333333333333333 3520 3333333333333333333333333333333333333333333333333333333 3521 3333333333333333333333333333333333333333333333333333333 3522 3333333333333333333333333333333333333333333333333333333 3523 3333333333333333333333333333333333333333333333333333333 3524 3333333333333333333333333333333333333333333333333333333 3525 3333333333333333333333333333333333333333333333333333333 3526 3333333333333333333333333333333333333333333333333333333 3527 3333333333333333333333333333333333333333333333333333333 3528 3333333333333333333333333333333333333333333333333333333 3529 3333333333333333333333333333333333333333333333333333333 3530 3333333333333333333333333333333333333333333333333333333 3531 3333333333333333333333333333333333333333333333333333333 3532 3333333333333333333333333333333333333333333333333333333 3533 3333333333333333333333333333333333333333333333333333333 3534 3333333333333333333333333333333333333333333333333333333 3535 3333333333333333333333333333333333333333333333333333333 3536 3333333333333333333333333333333333333333333333333333333 3537 3333333333333333333333333333333333333333333333333333333 3538 3333333333333333333333333333333333333333333333333333333 3539 3333333333333333333333333333333333333333333333333333333 3540 3333333333333333333333333333333333333333333333333333333 3541 3333333333333333333333333333333333333333333333333333333 3542 3333333333333333333333333333333333333333333333333333333 3543 3333333333333333333333333333333333333333333333333333333 3544 3333333333333333333333333333333333333333333333333333333 3545 3333333333333333333333333333333333333333333333333333333 3546 3333333333333333333333333333333333333333333333333333333 3547 3333333333333333333333333333333333333333333333333333333 3548 3333333333333333333333333333333333333333333333333333333 3549 3333333333333333333333333333333333333333333333333333333 3550 3333333333333333333333333333333333333333333333333333333 3551 3333333333333333333333333333333333333333333333333333333 3552 3333333333333333333333333333333333333333333333333333333 3553 3333333333333333333333333333333333333333333333333333333 3554 3333333333333333333333333333333333333333333333333333333 3555 3333333333333333333333333333333333333333333333333333333 3556 3333333333333333333333333333333333333333333333333333333 3557 3333333333333333333333333333333333333333333333333333333 3558 3333333333333333333333333333333333333333333333333333333 3559 3333333333333333333333333333333333333333333333333333333 3560 3333333333333333333333333333333333333333333333333333333 3561 3333333333333333333333333333333333333333333333333333333 3562 3333333333333333333333333333333333333333333333333333333 3563 3333333333333333333333333333333333333333333333333333333 3564 3333333333333333333333333333333333333333333333333333333 3565 3333333333333333333333333333333333333333333333333333333 3566 3333333333333333333333333333333333333333333333333333333 3567 3333333333333333333333333333333333333333333333333333333 3568 3333333333333333333333333333333333333333333333333333333 3569 3333333333333333333333333333333333333333333333333333333 3570 3333333333333333333333333333333333333333333333333333333 3571 3333333333333333333333333333333333333333333333333333333 3572 3333333333333333333333333333333333333333333333333333333 3573 3333333333333333333333333333333333333333333333333333333 3574 3333333333333333333333333333333333333333333333333333333 3575 3333333333333333333333333333333333333333333333333333333 3576 3333333333333333333333333333333333333333333333333333333 3577 3333333333333333333333333333333333333333333333333333333 3578 3333333333333333333333333333333333333333333333333333333 3579 3333333333333333333333333333333333333333333333333333333 3580 3333333333333333333333333333333333333333333333333333333 3581 3333333333333333333333333333333333333333333333333333333 3582 3333333333333333333333333333333333333333333333333333333 3583 3333333333333333333333333333333333333333333333333333333 3584 3333333333333333333333333333333333333333333333333333333 3585 3333333333333333333333333333333333333333333333333333333 3586 3333333333333333333333333333333333333333333333333333333 3587 3333333333333333333333333333333333333333333333333333333 3588 3333333333333333333333333333333333333333333333333333333 3589 3333333333333333333333333333333333333333333333333333333 3590 3333333333333333333333333333333333333333333333333333333 3591 3333333333333333333333333333333333333333333333333333333 3592 3333333333333333333333333333333333333333333333333333333 3593 3333333333333333333333333333333333333333333333333333333 3594 3333333333333333333333333333333333333333333333333333333 3595 3333333333333333333333333333333333333333333333333333333 3596 3333333333333333333333333333333333333333333333333333333 3597 3333333333333333333333333333333333333333333333333333333 3598 3333333333333333333333333333333333333333333333333333333 3599 3333333333333333333333333333333333333333333333333333333 3600 3333333333333333333333333333333333333333333333333333333 3601 3333333333333333333333333333333333333333333333333333333 3602 3333333333333333333333333333333333333333333333333333333 3603 3333333333333333333333333333333333333333333333333333333 3604 3333333333333333333333333333333333333333333333333333333 3605 3333333333333333333333333333333333333333333333333333333 3606 3333333333333333333333333333333333333333333333333333333 3607 3333333333333333333333333333333333333333333333333333333 3608 3333333333333333333333333333333333333333333333333333333 3609 3333333333333333333333333333333333333333333333333333333 3610 3333333333333333333333333333333333333333333333333333333 3611 3333333333333333333333333333333333333333333333333333333 3612 3333333333333333333333333333333333333333333333333333333 3613 3333333333333333333333333333333333333333333333333333333 3614 3333333333333333333333333333333333333333333333333333333 3615 3333333333333333333333333333333333333333333333333333333 3616 3333333333333333333333333333333333333333333333333333333 3617 3333333333333333333333333333333333333333333333333333333 3618 3333333333333333333333333333333333333333333333333333333 3619 3333333333333333333333333333333333333333333333333333333 3620 3333333333333333333333333333333333333333333333333333333 3621 3333333333333333333333333333333333333333333333333333333 3622 3333333333333333333333333333333333333333333333333333333 3623 3333333333333333333333333333333333333333333333333333333 3624 3333333333333333333333333333333333333333333333333333333 3625 3333333333333333333333333333333333333333333333333333333 3626 3333333333333333333333333333333333333333333333333333333 3627 3333333333333333333333333333333333333333333333333333333 3628 3333333333333333333333333333333333333333333333333333333 3629 3333333333333333333333333333333333333333333333333333333 3630 3333333333333333333333333333333333333333333333333333333 3631 3333333333333333333333333333333333333333333333333333333 3632 3333333333333333333333333333333333333333333333333333333 3633 3333333333333333333333333333333333333333333333333333333 3634 3333333333333333333333333333333333333333333333333333333 3635 3333333333333333333333333333333333333333333333333333333 3636 3333333333333333333333333333333333333333333333333333333 3637 3333333333333333333333333333333333333333333333333333333 3638 3333333333333333333333333333333333333333333333333333333 3639 3333333333333333333333333333333333333333333333333333333 3640 3333333333333333333333333333333333333333333333333333333 3641 3333333333333333333333333333333333333333333333333333333 3642 3333333333333333333333333333333333333333333333333333333 3643 3333333333333333333333333333333333333333333333333333333 3644 3333333333333333333333333333333333333333333333333333333 3645 3333333333333333333333333333333333333333333333333333333 3646 3333333333333333333333333333333333333333333333333333333 3647 3333333333333333333333333333333333333333333333333333333 3648 3333333333333333333333333333333333333333333333333333333 3649 3333333333333333333333333333333333333333333333333333333 3650 3333333333333333333333333333333333333333333333333333333 3651 3333333333333333333333333333333333333333333333333333333 3652 3333333333333333333333333333333333333333333333333333333 3653 3333333333333333333333333333333333333333333333333333333 3654 3333333333333333333333333333333333333333333333333333333 3655 3333333333333333333333333333333333333333333333333333333 3656 3333333333333333333333333333333333333333333333333333333 3657 3333333333333333333333333333333333333333333333333333333 3658 3333333333333333333333333333333333333333333333333333333 3659 3333333333333333333333333333333333333333333333333333333 3660 3333333333333333333333333333333333333333333333333333333 3661 3333333333333333333333333333333333333333333333333333333 3662 3333333333333333333333333333333333333333333333333333333 3663 3333333333333333333333333333333333333333333333333333333 3664 3333333333333333333333333333333333333333333333333333333 3665 3333333333333333333333333333333333333333333333333333333 3666 3333333333333333333333333333333333333333333333333333333 3667 3333333333333333333333333333333333333333333333333333333 3668 3333333333333333333333333333333333333333333333333333333 3669 3333333333333333333333333333333333333333333333333333333 3670 3333333333333333333333333333333333333333333333333333333 3671 3333333333333333333333333333333333333333333333333333333 3672 3333333333333333333333333333333333333333333333333333333 3673 3333333333333333333333333333333333333333333333333333333 3674 3333333333333333333333333333333333333333333333333333333 3675 3333333333333333333333333333333333333333333333333333333 3676 3333333333333333333333333333333333333333333333333333333 3677 3333333333333333333333333333333333333333333333333333333 3678 3333333333333333333333333333333333333333333333333333333 3679 3333333333333333333333333333333333333333333333333333333 3680 3333333333333333333333333333333333333333333333333333333 3681 3333333333333333333333333333333333333333333333333333333 3682 3333333333333333333333333333333333333333333333333333333 3683 3333333333333333333333333333333333333333333333333333333 3684 3333333333333333333333333333333333333333333333333333333 3685 3333333333333333333333333333333333333333333333333333333 3686 3333333333333333333333333333333333333333333333333333333 3687 3333333333333333333333333333333333333333333333333333333 3688 3333333333333333333333333333333333333333333333333333333 3689 3333333333333333333333333333333333333333333333333333333 3690 3333333333333333333333333333333333333333333333333333333 3691 3333333333333333333333333333333333333333333333333333333 3692 3333333333333333333333333333333333333333333333333333333 3693 3333333333333333333333333333333333333333333333333333333 3694 3333333333333333333333333333333333333333333333333333333 3695 3333333333333333333333333333333333333333333333333333333 3696 3333333333333333333333333333333333333333333333333333333 3697 3333333333333333333333333333333333333333333333333333333 3698 3333333333333333333333333333333333333333333333333333333 3699 3333333333333333333333333333333333333333333333333333333 3700 3333333333333333333333333333333333333333333333333333333 3701 3333333333333333333333333333333333333333333333333333333 3702 3333333333333333333333333333333333333333333333333333333 3703 3333333333333333333333333333333333333333333333333333333 3704 3333333333333333333333333333333333333333333333333333333 3705 3333333333333333333333333333333333333333333333333333333 3706 3333333333333333333333333333333333333333333333333333333 3707 3333333333333333333333333333333333333333333333333333333 3708 3333333333333333333333333333333333333333333333333333333 3709 3333333333333333333333333333333333333333333333333333333 3710 3333333333333333333333333333333333333333333333333333333 3711 3333333333333333333333333333333333333333333333333333333 3712 3333333333333333333333333333333333333333333333333333333 3713 3333333333333333333333333333333333333333333333333333333 3714 3333333333333333333333333333333333333333333333333333333 3715 3333333333333333333333333333333333333333333333333333333 3716 3333333333333333333333333333333333333333333333333333333 3717 3333333333333333333333333333333333333333333333333333333 3718 3333333333333333333333333333333333333333333333333333333 3719 3333333333333333333333333333333333333333333333333333333 3720 3333333333333333333333333333333333333333333333333333333 3721 3333333333333333333333333333333333333333333333333333333 3722 3333333333333333333333333333333333333333333333333333333 3723 3333333333333333333333333333333333333333333333333333333 3724 3333333333333333333333333333333333333333333333333333333 3725 3333333333333333333333333333333333333333333333333333333 3726 3333333333333333333333333333333333333333333333333333333 3727 3333333333333333333333333333333333333333333333333333333 3728 3333333333333333333333333333333333333333333333333333333 3729 3333333333333333333333333333333333333333333333333333333 3730 3333333333333333333333333333333333333333333333333333333 3731 3333333333333333333333333333333333333333333333333333333 3732 3333333333333333333333333333333333333333333333333333333 3733 3333333333333333333333333333333333333333333333333333333 3734 3333333333333333333333333333333333333333333333333333333 3735 3333333333333333333333333333333333333333333333333333333 3736 3333333333333333333333333333333333333333333333333333333 3737 3333333333333333333333333333333333333333333333333333333 3738 3333333333333333333333333333333333333333333333333333333 3739 3333333333333333333333333333333333333333333333333333333 3740 3333333333333333333333333333333333333333333333333333333 3741 3333333333333333333333333333333333333333333333333333333 3742 3333333333333333333333333333333333333333333333333333333 3743 3333333333333333333333333333333333333333333333333333333 3744 3333333333333333333333333333333333333333333333333333333 3745 3333333333333333333333333333333333333333333333333333333 3746 3333333333333333333333333333333333333333333333333333333 3747 3333333333333333333333333333333333333333333333333333333 3748 3333333333333333333333333333333333333333333333333333333 3749 3333333333333333333333333333333333333333333333333333333 3750 3333333333333333333333333333333333333333333333333333333 3751 3333333333333333333333333333333333333333333333333333333 3752 3333333333333333333333333333333333333333333333333333333 3753 3333333333333333333333333333333333333333333333333333333 3754 3333333333333333333333333333333333333333333333333333333 3755 3333333333333333333333333333333333333333333333333333333 3756 3333333333333333333333333333333333333333333333333333333 3757 3333333333333333333333333333333333333333333333333333333 3758 3333333333333333333333333333333333333333333333333333333 3759 3333333333333333333333333333333333333333333333333333333 3760 3333333333333333333333333333333333333333333333333333333 3761 3333333333333333333333333333333333333333333333333333333 3762 3333333333333333333333333333333333333333333333333333333 3763 3333333333333333333333333333333333333333333333333333333 3764 3333333333333333333333333333333333333333333333333333333 3765 3333333333333333333333333333333333333333333333333333333 3766 3333333333333333333333333333333333333333333333333333333 3767 3333333333333333333333333333333333333333333333333333333 3768 3333333333333333333333333333333333333333333333333333333 3769 3333333333333333333333333333333333333333333333333333333 3770 3333333333333333333333333333333333333333333333333333333 3771 3333333333333333333333333333333333333333333333333333333 3772 3333333333333333333333333333333333333333333333333333333 3773 3333333333333333333333333333333333333333333333333333333 3774 3333333333333333333333333333333333333333333333333333333 3775 3333333333333333333333333333333333333333333333333333333 3776 3333333333333333333333333333333333333333333333333333333 3777 3333333333333333333333333333333333333333333333333333333 3778 3333333333333333333333333333333333333333333333333333333 3779 3333333333333333333333333333333333333333333333333333333 3780 3333333333333333333333333333333333333333333333333333333 3781 3333333333333333333333333333333333333333333333333333333 3782 3333333333333333333333333333333333333333333333333333333 3783 3333333333333333333333333333333333333333333333333333333 3784 3333333333333333333333333333333333333333333333333333333 3785 3333333333333333333333333333333333333333333333333333333 3786 3333333333333333333333333333333333333333333333333333333 3787 3333333333333333333333333333333333333333333333333333333 3788 3333333333333333333333333333333333333333333333333333333 3789 3333333333333333333333333333333333333333333333333333333 3790 3333333333333333333333333333333333333333333333333333333 3791 3333333333333333333333333333333333333333333333333333333 3792 3333333333333333333333333333333333333333333333333333333 3793 3333333333333333333333333333333333333333333333333333333 3794 3333333333333333333333333333333333333333333333333333333 3795 3333333333333333333333333333333333333333333333333333333 3796 3333333333333333333333333333333333333333333333333333333 3797 3333333333333333333333333333333333333333333333333333333 3798 3333333333333333333333333333333333333333333333333333333 3799 3333333333333333333333333333333333333333333333333333333 3800 3333333333333333333333333333333333333333333333333333333 3801 3333333333333333333333333333333333333333333333333333333 3802 3333333333333333333333333333333333333333333333333333333 3803 3333333333333333333333333333333333333333333333333333333 3804 3333333333333333333333333333333333333333333333333333333 3805 3333333333333333333333333333333333333333333333333333333 3806 3333333333333333333333333333333333333333333333333333333 3807 3333333333333333333333333333333333333333333333333333333 3808 3333333333333333333333333333333333333333333333333333333 3809 3333333333333333333333333333333333333333333333333333333 3810 3333333333333333333333333333333333333333333333333333333 3811 3333333333333333333333333333333333333333333333333333333 3812 3333333333333333333333333333333333333333333333333333333 3813 3333333333333333333333333333333333333333333333333333333 3814 3333333333333333333333333333333333333333333333333333333 3815 3333333333333333333333333333333333333333333333333333333 3816 3333333333333333333333333333333333333333333333333333333 3817 3333333333333333333333333333333333333333333333333333333 3818 3333333333333333333333333333333333333333333333333333333 3819 3333333333333333333333333333333333333333333333333333333 3820 3333333333333333333333333333333333333333333333333333333 3821 3333333333333333333333333333333333333333333333333333333 3822 3333333333333333333333333333333333333333333333333333333 3823 3333333333333333333333333333333333333333333333333333333 3824 3333333333333333333333333333333333333333333333333333333 3825 3333333333333333333333333333333333333333333333333333333 3826 3333333333333333333333333333333333333333333333333333333 3827 3333333333333333333333333333333333333333333333333333333 3828 3333333333333333333333333333333333333333333333333333333 3829 3333333333333333333333333333333333333333333333333333333 3830 3333333333333333333333333333333333333333333333333333333 3831 3333333333333333333333333333333333333333333333333333333 3832 3333333333333333333333333333333333333333333333333333333 3833 3333333333333333333333333333333333333333333333333333333 3834 3333333333333333333333333333333333333333333333333333333 3835 3333333333333333333333333333333333333333333333333333333 3836 3333333333333333333333333333333333333333333333333333333 3837 3333333333333333333333333333333333333333333333333333333 3838 3333333333333333333333333333333333333333333333333333333 3839 3333333333333333333333333333333333333333333333333333333 3840 3333333333333333333333333333333333333333333333333333333 3841 3333333333333333333333333333333333333333333333333333333 3842 3333333333333333333333333333333333333333333333333333333 3843 3333333333333333333333333333333333333333333333333333333 3844 3333333333333333333333333333333333333333333333333333333 3845 3333333333333333333333333333333333333333333333333333333 3846 3333333333333333333333333333333333333333333333333333333 3847 3333333333333333333333333333333333333333333333333333333 3848 3333333333333333333333333333333333333333333333333333333 3849 3333333333333333333333333333333333333333333333333333333 3850 3333333333333333333333333333333333333333333333333333333 3851 3333333333333333333333333333333333333333333333333333333 3852 3333333333333333333333333333333333333333333333333333333 3853 3333333333333333333333333333333333333333333333333333333 3854 3333333333333333333333333333333333333333333333333333333 3855 3333333333333333333333333333333333333333333333333333333 3856 3333333333333333333333333333333333333333333333333333333 3857 3333333333333333333333333333333333333333333333333333333 3858 3333333333333333333333333333333333333333333333333333333 3859 3333333333333333333333333333333333333333333333333333333 3860 3333333333333333333333333333333333333333333333333333333 3861 3333333333333333333333333333333333333333333333333333333 3862 3333333333333333333333333333333333333333333333333333333 3863 3333333333333333333333333333333333333333333333333333333 3864 3333333333333333333333333333333333333333333333333333333 3865 3333333333333333333333333333333333333333333333333333333 3866 3333333333333333333333333333333333333333333333333333333 3867 3333333333333333333333333333333333333333333333333333333 3868 3333333333333333333333333333333333333333333333333333333 3869 3333333333333333333333333333333333333333333333333333333 3870 3333333333333333333333333333333333333333333333333333333 3871 3333333333333333333333333333333333333333333333333333333 3872 3333333333333333333333333333333333333333333333333333333 3873 3333333333333333333333333333333333333333333333333333333 3874 3333333333333333333333333333333333333333333333333333333 3875 3333333333333333333333333333333333333333333333333333333 3876 3333333333333333333333333333333333333333333333333333333 3877 3333333333333333333333333333333333333333333333333333333 3878 3333333333333333333333333333333333333333333333333333333 3879 3333333333333333333333333333333333333333333333333333333 3880 3333333333333333333333333333333333333333333333333333333 3881 3333333333333333333333333333333333333333333333333333333 3882 3333333333333333333333333333333333333333333333333333333 3883 3333333333333333333333333333333333333333333333333333333 3884 3333333333333333333333333333333333333333333333333333333 3885 3333333333333333333333333333333333333333333333333333333 3886 3333333333333333333333333333333333333333333333333333333 3887 3333333333333333333333333333333333333333333333333333333 3888 3333333333333333333333333333333333333333333333333333333 3889 3333333333333333333333333333333333333333333333333333333 3890 3333333333333333333333333333333333333333333333333333333 3891 3333333333333333333333333333333333333333333333333333333 3892 3333333333333333333333333333333333333333333333333333333 3893 3333333333333333333333333333333333333333333333333333333 3894 3333333333333333333333333333333333333333333333333333333 3895 3333333333333333333333333333333333333333333333333333333 3896 3333333333333333333333333333333333333333333333333333333 3897 3333333333333333333333333333333333333333333333333333333 3898 3333333333333333333333333333333333333333333333333333333 3899 3333333333333333333333333333333333333333333333333333333 3900 3333333333333333333333333333333333333333333333333333333 3901 3333333333333333333333333333333333333333333333333333333 3902 3333333333333333333333333333333333333333333333333333333 3903 3333333333333333333333333333333333333333333333333333333 3904 3333333333333333333333333333333333333333333333333333333 3905 3333333333333333333333333333333333333333333333333333333 3906 3333333333333333333333333333333333333333333333333333333 3907 3333333333333333333333333333333333333333333333333333333 3908 3333333333333333333333333333333333333333333333333333333 3909 3333333333333333333333333333333333333333333333333333333 3910 3333333333333333333333333333333333333333333333333333333 3911 3333333333333333333333333333333333333333333333333333333 3912 3333333333333333333333333333333333333333333333333333333 3913 3333333333333333333333333333333333333333333333333333333 3914 3333333333333333333333333333333333333333333333333333333 3915 3333333333333333333333333333333333333333333333333333333 3916 3333333333333333333333333333333333333333333333333333333 3917 3333333333333333333333333333333333333333333333333333333 3918 3333333333333333333333333333333333333333333333333333333 3919 3333333333333333333333333333333333333333333333333333333 3920 3333333333333333333333333333333333333333333333333333333 3921 3333333333333333333333333333333333333333333333333333333 3922 3333333333333333333333333333333333333333333333333333333 3923 3333333333333333333333333333333333333333333333333333333 3924 3333333333333333333333333333333333333333333333333333333 3925 3333333333333333333333333333333333333333333333333333333 3926 3333333333333333333333333333333333333333333333333333333 3927 3333333333333333333333333333333333333333333333333333333 3928 3333333333333333333333333333333333333333333333333333333 3929 3333333333333333333333333333333333333333333333333333333 3930 3333333333333333333333333333333333333333333333333333333 3931 3333333333333333333333333333333333333333333333333333333 3932 3333333333333333333333333333333333333333333333333333333 3933 3333333333333333333333333333333333333333333333333333333 3934 3333333333333333333333333333333333333333333333333333333 3935 3333333333333333333333333333333333333333333333333333333 3936 3333333333333333333333333333333333333333333333333333333 3937 3333333333333333333333333333333333333333333333333333333 3938 3333333333333333333333333333333333333333333333333333333 3939 3333333333333333333333333333333333333333333333333333333 3940 3333333333333333333333333333333333333333333333333333333 3941 3333333333333333333333333333333333333333333333333333333 3942 3333333333333333333333333333333333333333333333333333333 3943 3333333333333333333333333333333333333333333333333333333 3944 3333333333333333333333333333333333333333333333333333333 3945 3333333333333333333333333333333333333333333333333333333 3946 3333333333333333333333333333333333333333333333333333333 3947 3333333333333333333333333333333333333333333333333333333 3948 3333333333333333333333333333333333333333333333333333333 3949 3333333333333333333333333333333333333333333333333333333 3950 3333333333333333333333333333333333333333333333333333333 3951 3333333333333333333333333333333333333333333333333333333 3952 3333333333333333333333333333333333333333333333333333333 3953 3333333333333333333333333333333333333333333333333333333 3954 3333333333333333333333333333333333333333333333333333333 3955 3333333333333333333333333333333333333333333333333333333 3956 3333333333333333333333333333333333333333333333333333333 3957 3333333333333333333333333333333333333333333333333333333 3958 3333333333333333333333333333333333333333333333333333333 3959 3333333333333333333333333333333333333333333333333333333 3960 3333333333333333333333333333333333333333333333333333333 3961 3333333333333333333333333333333333333333333333333333333 3962 3333333333333333333333333333333333333333333333333333333 3963 3333333333333333333333333333333333333333333333333333333 3964 3333333333333333333333333333333333333333333333333333333 3965 3333333333333333333333333333333333333333333333333333333 3966 3333333333333333333333333333333333333333333333333333333 3967 3333333333333333333333333333333333333333333333333333333 3968 3333333333333333333333333333333333333333333333333333333 3969 3333333333333333333333333333333333333333333333333333333 3970 3333333333333333333333333333333333333333333333333333333 3971 3333333333333333333333333333333333333333333333333333333 3972 3333333333333333333333333333333333333333333333333333333 3973 3333333333333333333333333333333333333333333333333333333 3974 3333333333333333333333333333333333333333333333333333333 3975 3333333333333333333333333333333333333333333333333333333 3976 3333333333333333333333333333333333333333333333333333333 3977 3333333333333333333333333333333333333333333333333333333 3978 3333333333333333333333333333333333333333333333333333333 3979 3333333333333333333333333333333333333333333333333333333 3980 3333333333333333333333333333333333333333333333333333333 3981 3333333333333333333333333333333333333333333333333333333 3982 3333333333333333333333333333333333333333333333333333333 3983 3333333333333333333333333333333333333333333333333333333 3984 3333333333333333333333333333333333333333333333333333333 3985 3333333333333333333333333333333333333333333333333333333 3986 3333333333333333333333333333333333333333333333333333333 3987 3333333333333333333333333333333333333333333333333333333 3988 3333333333333333333333333333333333333333333333333333333 3989 3333333333333333333333333333333333333333333333333333333 3990 3333333333333333333333333333333333333333333333333333333 3991 3333333333333333333333333333333333333333333333333333333 3992 3333333333333333333333333333333333333333333333333333333 3993 3333333333333333333333333333333333333333333333333333333 3994 3333333333333333333333333333333333333333333333333333333 3995 3333333333333333333333333333333333333333333333333333333 3996 3333333333333333333333333333333333333333333333333333333 3997 3333333333333333333333333333333333333333333333333333333 3998 3333333333333333333333333333333333333333333333333333333 3999 3333333333333333333333333333333333333333333333333333333 4000 3333333333333333333333333333333333333333333333333333333 4001 3333333333333333333333333333333333333333333333333333333 4002 3333333333333333333333333333333333333333333333333333333 4003 3333333333333333333333333333333333333333333333333333333 4004 3333333333333333333333333333333333333333333333333333333 4005 3333333333333333333333333333333333333333333333333333333 4006 3333333333333333333333333333333333333333333333333333333 4007 3333333333333333333333333333333333333333333333333333333 4008 3333333333333333333333333333333333333333333333333333333 4009 3333333333333333333333333333333333333333333333333333333 4010 3333333333333333333333333333333333333333333333333333333 4011 3333333333333333333333333333333333333333333333333333333 4012 3333333333333333333333333333333333333333333333333333333 4013 3333333333333333333333333333333333333333333333333333333 4014 3333333333333333333333333333333333333333333333333333333 4015 3333333333333333333333333333333333333333333333333333333 4016 3333333333333333333333333333333333333333333333333333333 4017 3333333333333333333333333333333333333333333333333333333 4018 3333333333333333333333333333333333333333333333333333333 4019 3333333333333333333333333333333333333333333333333333333 4020 3333333333333333333333333333333333333333333333333333333 4021 3333333333333333333333333333333333333333333333333333333 4022 3333333333333333333333333333333333333333333333333333333 4023 3333333333333333333333333333333333333333333333333333333 4024 3333333333333333333333333333333333333333333333333333333 4025 3333333333333333333333333333333333333333333333333333333 4026 3333333333333333333333333333333333333333333333333333333 4027 3333333333333333333333333333333333333333333333333333333 4028 3333333333333333333333333333333333333333333333333333333 4029 3333333333333333333333333333333333333333333333333333333 4030 3333333333333333333333333333333333333333333333333333333 4031 3333333333333333333333333333333333333333333333333333333 4032 3333333333333333333333333333333333333333333333333333333 4033 3333333333333333333333333333333333333333333333333333333 4034 3333333333333333333333333333333333333333333333333333333 4035 3333333333333333333333333333333333333333333333333333333 4036 3333333333333333333333333333333333333333333333333333333 4037 3333333333333333333333333333333333333333333333333333333 4038 3333333333333333333333333333333333333333333333333333333 4039 3333333333333333333333333333333333333333333333333333333 4040 3333333333333333333333333333333333333333333333333333333 4041 3333333333333333333333333333333333333333333333333333333 4042 3333333333333333333333333333333333333333333333333333333 4043 3333333333333333333333333333333333333333333333333333333 4044 3333333333333333333333333333333333333333333333333333333 4045 3333333333333333333333333333333333333333333333333333333 4046 3333333333333333333333333333333333333333333333333333333 4047 3333333333333333333333333333333333333333333333333333333 4048 3333333333333333333333333333333333333333333333333333333 4049 3333333333333333333333333333333333333333333333333333333 4050 3333333333333333333333333333333333333333333333333333333 4051 3333333333333333333333333333333333333333333333333333333 4052 3333333333333333333333333333333333333333333333333333333 4053 3333333333333333333333333333333333333333333333333333333 4054 3333333333333333333333333333333333333333333333333333333 4055 3333333333333333333333333333333333333333333333333333333 4056 3333333333333333333333333333333333333333333333333333333 4057 3333333333333333333333333333333333333333333333333333333 4058 3333333333333333333333333333333333333333333333333333333 4059 3333333333333333333333333333333333333333333333333333333 4060 3333333333333333333333333333333333333333333333333333333 4061 3333333333333333333333333333333333333333333333333333333 4062 3333333333333333333333333333333333333333333333333333333 4063 3333333333333333333333333333333333333333333333333333333 4064 3333333333333333333333333333333333333333333333333333333 4065 3333333333333333333333333333333333333333333333333333333 4066 3333333333333333333333333333333333333333333333333333333 4067 3333333333333333333333333333333333333333333333333333333 4068 3333333333333333333333333333333333333333333333333333333 4069 3333333333333333333333333333333333333333333333333333333 4070 3333333333333333333333333333333333333333333333333333333 4071 3333333333333333333333333333333333333333333333333333333 4072 3333333333333333333333333333333333333333333333333333333 4073 3333333333333333333333333333333333333333333333333333333 4074 3333333333333333333333333333333333333333333333333333333 4075 3333333333333333333333333333333333333333333333333333333 4076 3333333333333333333333333333333333333333333333333333333 4077 3333333333333333333333333333333333333333333333333333333 4078 3333333333333333333333333333333333333333333333333333333 4079 3333333333333333333333333333333333333333333333333333333 4080 3333333333333333333333333333333333333333333333333333333 4081 3333333333333333333333333333333333333333333333333333333 4082 3333333333333333333333333333333333333333333333333333333 4083 3333333333333333333333333333333333333333333333333333333 4084 3333333333333333333333333333333333333333333333333333333 4085 3333333333333333333333333333333333333333333333333333333 4086 3333333333333333333333333333333333333333333333333333333 4087 3333333333333333333333333333333333333333333333333333333 4088 3333333333333333333333333333333333333333333333333333333 4089 3333333333333333333333333333333333333333333333333333333 4090 3333333333333333333333333333333333333333333333333333333 4091 3333333333333333333333333333333333333333333333333333333 4092 3333333333333333333333333333333333333333333333333333333 4093 3333333333333333333333333333333333333333333333333333333 4094 3333333333333333333333333333333333333333333333333333333 4095 3333333333333333333333333333333333333333333333333333333 4096 3333333333333333333333333333333333333333333333333333333 4097 3333333333333333333333333333333333333333333333333333333 4098 3333333333333333333333333333333333333333333333333333333 4099 3333333333333333333333333333333333333333333333333333333 4100 3333333333333333333333333333333333333333333333333333333 4101 3333333333333333333333333333333333333333333333333333333 4102 3333333333333333333333333333333333333333333333333333333 4103 3333333333333333333333333333333333333333333333333333333 4104 3333333333333333333333333333333333333333333333333333333 4105 3333333333333333333333333333333333333333333333333333333 4106 3333333333333333333333333333333333333333333333333333333 4107 3333333333333333333333333333333333333333333333333333333 4108 3333333333333333333333333333333333333333333333333333333 4109 3333333333333333333333333333333333333333333333333333333 4110 3333333333333333333333333333333333333333333333333333333 4111 3333333333333333333333333333333333333333333333333333333 4112 3333333333333333333333333333333333333333333333333333333 4113 3333333333333333333333333333333333333333333333333333333 4114 3333333333333333333333333333333333333333333333333333333 4115 3333333333333333333333333333333333333333333333333333333 4116 3333333333333333333333333333333333333333333333333333333 4117 3333333333333333333333333333333333333333333333333333333 4118 3333333333333333333333333333333333333333333333333333333 4119 3333333333333333333333333333333333333333333333333333333 4120 3333333333333333333333333333333333333333333333333333333 4121 3333333333333333333333333333333333333333333333333333333 4122 3333333333333333333333333333333333333333333333333333333 4123 3333333333333333333333333333333333333333333333333333333 4124 3333333333333333333333333333333333333333333333333333333 4125 3333333333333333333333333333333333333333333333333333333 4126 3333333333333333333333333333333333333333333333333333333 4127 3333333333333333333333333333333333333333333333333333333 4128 3333333333333333333333333333333333333333333333333333333 4129 3333333333333333333333333333333333333333333333333333333 4130 3333333333333333333333333333333333333333333333333333333 4131 3333333333333333333333333333333333333333333333333333333 4132 3333333333333333333333333333333333333333333333333333333 4133 3333333333333333333333333333333333333333333333333333333 4134 3333333333333333333333333333333333333333333333333333333 4135 3333333333333333333333333333333333333333333333333333333 4136 3333333333333333333333333333333333333333333333333333333 4137 3333333333333333333333333333333333333333333333333333333 4138 3333333333333333333333333333333333333333333333333333333 4139 3333333333333333333333333333333333333333333333333333333 4140 3333333333333333333333333333333333333333333333333333333 4141 3333333333333333333333333333333333333333333333333333333 4142 3333333333333333333333333333333333333333333333333333333 4143 3333333333333333333333333333333333333333333333333333333 4144 3333333333333333333333333333333333333333333333333333333 4145 3333333333333333333333333333333333333333333333333333333 4146 3333333333333333333333333333333333333333333333333333333 4147 3333333333333333333333333333333333333333333333333333333 4148 3333333333333333333333333333333333333333333333333333333 4149 3333333333333333333333333333333333333333333333333333333 4150 3333333333333333333333333333333333333333333333333333333 4151 3333333333333333333333333333333333333333333333333333333 4152 3333333333333333333333333333333333333333333333333333333 4153 3333333333333333333333333333333333333333333333333333333 4154 3333333333333333333333333333333333333333333333333333333 4155 3333333333333333333333333333333333333333333333333333333 4156 3333333333333333333333333333333333333333333333333333333 4157 3333333333333333333333333333333333333333333333333333333 4158 3333333333333333333333333333333333333333333333333333333 4159 3333333333333333333333333333333333333333333333333333333 4160 3333333333333333333333333333333333333333333333333333333 4161 3333333333333333333333333333333333333333333333333333333 4162 3333333333333333333333333333333333333333333333333333333 4163 3333333333333333333333333333333333333333333333333333333 4164 3333333333333333333333333333333333333333333333333333333 4165 3333333333333333333333333333333333333333333333333333333 4166 3333333333333333333333333333333333333333333333333333333 4167 3333333333333333333333333333333333333333333333333333333 4168 3333333333333333333333333333333333333333333333333333333 4169 3333333333333333333333333333333333333333333333333333333 4170 3333333333333333333333333333333333333333333333333333333 4171 3333333333333333333333333333333333333333333333333333333 4172 3333333333333333333333333333333333333333333333333333333 4173 3333333333333333333333333333333333333333333333333333333 4174 3333333333333333333333333333333333333333333333333333333 4175 3333333333333333333333333333333333333333333333333333333 4176 3333333333333333333333333333333333333333333333333333333 4177 3333333333333333333333333333333333333333333333333333333 4178 3333333333333333333333333333333333333333333333333333333 4179 3333333333333333333333333333333333333333333333333333333 4180 3333333333333333333333333333333333333333333333333333333 4181 3333333333333333333333333333333333333333333333333333333 4182 3333333333333333333333333333333333333333333333333333333 4183 3333333333333333333333333333333333333333333333333333333 4184 3333333333333333333333333333333333333333333333333333333 4185 3333333333333333333333333333333333333333333333333333333 4186 3333333333333333333333333333333333333333333333333333333 4187 3333333333333333333333333333333333333333333333333333333 4188 3333333333333333333333333333333333333333333333333333333 4189 3333333333333333333333333333333333333333333333333333333 4190 3333333333333333333333333333333333333333333333333333333 4191 3333333333333333333333333333333333333333333333333333333 4192 3333333333333333333333333333333333333333333333333333333 4193 3333333333333333333333333333333333333333333333333333333 4194 3333333333333333333333333333333333333333333333333333333 4195 3333333333333333333333333333333333333333333333333333333 4196 3333333333333333333333333333333333333333333333333333333 4197 3333333333333333333333333333333333333333333333333333333 4198 3333333333333333333333333333333333333333333333333333333 4199 3333333333333333333333333333333333333333333333333333333 4200 3333333333333333333333333333333333333333333333333333333 4201 3333333333333333333333333333333333333333333333333333333 4202 3333333333333333333333333333333333333333333333333333333 4203 3333333333333333333333333333333333333333333333333333333 4204 3333333333333333333333333333333333333333333333333333333 4205 3333333333333333333333333333333333333333333333333333333 4206 3333333333333333333333333333333333333333333333333333333 4207 3333333333333333333333333333333333333333333333333333333 4208 3333333333333333333333333333333333333333333333333333333 4209 3333333333333333333333333333333333333333333333333333333 4210 3333333333333333333333333333333333333333333333333333333 4211 3333333333333333333333333333333333333333333333333333333 4212 3333333333333333333333333333333333333333333333333333333 4213 3333333333333333333333333333333333333333333333333333333 4214 3333333333333333333333333333333333333333333333333333333 4215 3333333333333333333333333333333333333333333333333333333 4216 3333333333333333333333333333333333333333333333333333333 4217 3333333333333333333333333333333333333333333333333333333 4218 3333333333333333333333333333333333333333333333333333333 4219 3333333333333333333333333333333333333333333333333333333 4220 3333333333333333333333333333333333333333333333333333333 4221 3333333333333333333333333333333333333333333333333333333 4222 3333333333333333333333333333333333333333333333333333333 4223 3333333333333333333333333333333333333333333333333333333 4224 3333333333333333333333333333333333333333333333333333333 4225 3333333333333333333333333333333333333333333333333333333 4226 3333333333333333333333333333333333333333333333333333333 4227 3333333333333333333333333333333333333333333333333333333 4228 3333333333333333333333333333333333333333333333333333333 4229 3333333333333333333333333333333333333333333333333333333 4230 3333333333333333333333333333333333333333333333333333333 4231 3333333333333333333333333333333333333333333333333333333 4232 3333333333333333333333333333333333333333333333333333333 4233 3333333333333333333333333333333333333333333333333333333 4234 3333333333333333333333333333333333333333333333333333333 4235 3333333333333333333333333333333333333333333333333333333 4236 3333333333333333333333333333333333333333333333333333333 4237 3333333333333333333333333333333333333333333333333333333 4238 3333333333333333333333333333333333333333333333333333333 4239 3333333333333333333333333333333333333333333333333333333 4240 3333333333333333333333333333333333333333333333333333333 4241 3333333333333333333333333333333333333333333333333333333 4242 3333333333333333333333333333333333333333333333333333333 4243 3333333333333333333333333333333333333333333333333333333 4244 3333333333333333333333333333333333333333333333333333333 4245 3333333333333333333333333333333333333333333333333333333 4246 3333333333333333333333333333333333333333333333333333333 4247 3333333333333333333333333333333333333333333333333333333 4248 3333333333333333333333333333333333333333333333333333333 4249 3333333333333333333333333333333333333333333333333333333 4250 3333333333333333333333333333333333333333333333333333333 4251 3333333333333333333333333333333333333333333333333333333 4252 3333333333333333333333333333333333333333333333333333333 4253 3333333333333333333333333333333333333333333333333333333 4254 3333333333333333333333333333333333333333333333333333333 4255 3333333333333333333333333333333333333333333333333333333 4256 3333333333333333333333333333333333333333333333333333333 4257 3333333333333333333333333333333333333333333333333333333 4258 3333333333333333333333333333333333333333333333333333333 4259 3333333333333333333333333333333333333333333333333333333 4260 3333333333333333333333333333333333333333333333333333333 4261 3333333333333333333333333333333333333333333333333333333 4262 3333333333333333333333333333333333333333333333333333333 4263 3333333333333333333333333333333333333333333333333333333 4264 3333333333333333333333333333333333333333333333333333333 4265 3333333333333333333333333333333333333333333333333333333 4266 3333333333333333333333333333333333333333333333333333333 4267 3333333333333333333333333333333333333333333333333333333 4268 3333333333333333333333333333333333333333333333333333333 4269 3333333333333333333333333333333333333333333333333333333 4270 3333333333333333333333333333333333333333333333333333333 4271 3333333333333333333333333333333333333333333333333333333 4272 3333333333333333333333333333333333333333333333333333333 4273 3333333333333333333333333333333333333333333333333333333 4274 3333333333333333333333333333333333333333333333333333333 4275 3333333333333333333333333333333333333333333333333333333 4276 3333333333333333333333333333333333333333333333333333333 4277 3333333333333333333333333333333333333333333333333333333 4278 3333333333333333333333333333333333333333333333333333333 4279 3333333333333333333333333333333333333333333333333333333 4280 3333333333333333333333333333333333333333333333333333333 4281 3333333333333333333333333333333333333333333333333333333 4282 3333333333333333333333333333333333333333333333333333333 4283 3333333333333333333333333333333333333333333333333333333 4284 3333333333333333333333333333333333333333333333333333333 4285 3333333333333333333333333333333333333333333333333333333 4286 3333333333333333333333333333333333333333333333333333333 4287 3333333333333333333333333333333333333333333333333333333 4288 3333333333333333333333333333333333333333333333333333333 4289 3333333333333333333333333333333333333333333333333333333 4290 3333333333333333333333333333333333333333333333333333333 4291 3333333333333333333333333333333333333333333333333333333 4292 3333333333333333333333333333333333333333333333333333333 4293 3333333333333333333333333333333333333333333333333333333 4294 3333333333333333333333333333333333333333333333333333333 4295 3333333333333333333333333333333333333333333333333333333 4296 3333333333333333333333333333333333333333333333333333333 4297 3333333333333333333333333333333333333333333333333333333 4298 3333333333333333333333333333333333333333333333333333333 4299 3333333333333333333333333333333333333333333333333333333 4300 3333333333333333333333333333333333333333333333333333333 4301 3333333333333333333333333333333333333333333333333333333 4302 3333333333333333333333333333333333333333333333333333333 4303 3333333333333333333333333333333333333333333333333333333 4304 3333333333333333333333333333333333333333333333333333333 4305 3333333333333333333333333333333333333333333333333333333 4306 3333333333333333333333333333333333333333333333333333333 4307 3333333333333333333333333333333333333333333333333333333 4308 3333333333333333333333333333333333333333333333333333333 4309 3333333333333333333333333333333333333333333333333333333 4310 3333333333333333333333333333333333333333333333333333333 4311 3333333333333333333333333333333333333333333333333333333 4312 3333333333333333333333333333333333333333333333333333333 4313 3333333333333333333333333333333333333333333333333333333 4314 3333333333333333333333333333333333333333333333333333333 4315 3333333333333333333333333333333333333333333333333333333 4316 3333333333333333333333333333333333333333333333333333333 4317 3333333333333333333333333333333333333333333333333333333 4318 3333333333333333333333333333333333333333333333333333333 4319 3333333333333333333333333333333333333333333333333333333 4320 3333333333333333333333333333333333333333333333333333333 4321 3333333333333333333333333333333333333333333333333333333 4322 3333333333333333333333333333333333333333333333333333333 4323 3333333333333333333333333333333333333333333333333333333 4324 3333333333333333333333333333333333333333333333333333333 4325 3333333333333333333333333333333333333333333333333333333 4326 3333333333333333333333333333333333333333333333333333333 4327 3333333333333333333333333333333333333333333333333333333 4328 3333333333333333333333333333333333333333333333333333333 4329 3333333333333333333333333333333333333333333333333333333 4330 3333333333333333333333333333333333333333333333333333333 4331 3333333333333333333333333333333333333333333333333333333 4332 3333333333333333333333333333333333333333333333333333333 4333 3333333333333333333333333333333333333333333333333333333 4334 3333333333333333333333333333333333333333333333333333333 4335 3333333333333333333333333333333333333333333333333333333 4336 3333333333333333333333333333333333333333333333333333333 4337 3333333333333333333333333333333333333333333333333333333 4338 3333333333333333333333333333333333333333333333333333333 4339 3333333333333333333333333333333333333333333333333333333 4340 3333333333333333333333333333333333333333333333333333333 4341 3333333333333333333333333333333333333333333333333333333 4342 3333333333333333333333333333333333333333333333333333333 4343 3333333333333333333333333333333333333333333333333333333 4344 3333333333333333333333333333333333333333333333333333333 4345 3333333333333333333333333333333333333333333333333333333 4346 3333333333333333333333333333333333333333333333333333333 4347 3333333333333333333333333333333333333333333333333333333 4348 3333333333333333333333333333333333333333333333333333333 4349 3333333333333333333333333333333333333333333333333333333 4350 3333333333333333333333333333333333333333333333333333333 4351 3333333333333333333333333333333333333333333333333333333 4352 3333333333333333333333333333333333333333333333333333333 4353 3333333333333333333333333333333333333333333333333333333 4354 3333333333333333333333333333333333333333333333333333333 4355 3333333333333333333333333333333333333333333333333333333 4356 3333333333333333333333333333333333333333333333333333333 4357 3333333333333333333333333333333333333333333333333333333 4358 3333333333333333333333333333333333333333333333333333333 4359 3333333333333333333333333333333333333333333333333333333 4360 3333333333333333333333333333333333333333333333333333333 4361 3333333333333333333333333333333333333333333333333333333 4362 3333333333333333333333333333333333333333333333333333333 4363 3333333333333333333333333333333333333333333333333333333 4364 3333333333333333333333333333333333333333333333333333333 4365 3333333333333333333333333333333333333333333333333333333 4366 3333333333333333333333333333333333333333333333333333333 4367 3333333333333333333333333333333333333333333333333333333 4368 3333333333333333333333333333333333333333333333333333333 4369 3333333333333333333333333333333333333333333333333333333 4370 3333333333333333333333333333333333333333333333333333333 4371 3333333333333333333333333333333333333333333333333333333 4372 3333333333333333333333333333333333333333333333333333333 4373 3333333333333333333333333333333333333333333333333333333 4374 3333333333333333333333333333333333333333333333333333333 4375 3333333333333333333333333333333333333333333333333333333 4376 3333333333333333333333333333333333333333333333333333333 4377 3333333333333333333333333333333333333333333333333333333 4378 3333333333333333333333333333333333333333333333333333333 4379 3333333333333333333333333333333333333333333333333333333 4380 3333333333333333333333333333333333333333333333333333333 4381 3333333333333333333333333333333333333333333333333333333 4382 3333333333333333333333333333333333333333333333333333333 4383 3333333333333333333333333333333333333333333333333333333 4384 3333333333333333333333333333333333333333333333333333333 4385 3333333333333333333333333333333333333333333333333333333 4386 3333333333333333333333333333333333333333333333333333333 4387 3333333333333333333333333333333333333333333333333333333 4388 3333333333333333333333333333333333333333333333333333333 4389 3333333333333333333333333333333333333333333333333333333 4390 3333333333333333333333333333333333333333333333333333333 4391 3333333333333333333333333333333333333333333333333333333 4392 3333333333333333333333333333333333333333333333333333333 4393 3333333333333333333333333333333333333333333333333333333 4394 3333333333333333333333333333333333333333333333333333333 4395 3333333333333333333333333333333333333333333333333333333 4396 3333333333333333333333333333333333333333333333333333333 4397 3333333333333333333333333333333333333333333333333333333 4398 3333333333333333333333333333333333333333333333333333333 4399 3333333333333333333333333333333333333333333333333333333 4400 3333333333333333333333333333333333333333333333333333333 4401 3333333333333333333333333333333333333333333333333333333 4402 3333333333333333333333333333333333333333333333333333333 4403 3333333333333333333333333333333333333333333333333333333 4404 3333333333333333333333333333333333333333333333333333333 4405 3333333333333333333333333333333333333333333333333333333 4406 3333333333333333333333333333333333333333333333333333333 4407 3333333333333333333333333333333333333333333333333333333 4408 3333333333333333333333333333333333333333333333333333333 4409 3333333333333333333333333333333333333333333333333333333 4410 3333333333333333333333333333333333333333333333333333333 4411 3333333333333333333333333333333333333333333333333333333 4412 3333333333333333333333333333333333333333333333333333333 4413 3333333333333333333333333333333333333333333333333333333 4414 3333333333333333333333333333333333333333333333333333333 4415 3333333333333333333333333333333333333333333333333333333 4416 3333333333333333333333333333333333333333333333333333333 4417 3333333333333333333333333333333333333333333333333333333 4418 3333333333333333333333333333333333333333333333333333333 4419 3333333333333333333333333333333333333333333333333333333 4420 3333333333333333333333333333333333333333333333333333333 4421 3333333333333333333333333333333333333333333333333333333 4422 3333333333333333333333333333333333333333333333333333333 4423 3333333333333333333333333333333333333333333333333333333 4424 3333333333333333333333333333333333333333333333333333333 4425 3333333333333333333333333333333333333333333333333333333 4426 3333333333333333333333333333333333333333333333333333333 4427 3333333333333333333333333333333333333333333333333333333 4428 3333333333333333333333333333333333333333333333333333333 4429 3333333333333333333333333333333333333333333333333333333 4430 3333333333333333333333333333333333333333333333333333333 4431 3333333333333333333333333333333333333333333333333333333 4432 3333333333333333333333333333333333333333333333333333333 4433 3333333333333333333333333333333333333333333333333333333 4434 3333333333333333333333333333333333333333333333333333333 4435 3333333333333333333333333333333333333333333333333333333 4436 3333333333333333333333333333333333333333333333333333333 4437 3333333333333333333333333333333333333333333333333333333 4438 3333333333333333333333333333333333333333333333333333333 4439 3333333333333333333333333333333333333333333333333333333 4440 3333333333333333333333333333333333333333333333333333333 4441 3333333333333333333333333333333333333333333333333333333 4442 3333333333333333333333333333333333333333333333333333333 4443 3333333333333333333333333333333333333333333333333333333 4444 3333333333333333333333333333333333333333333333333333333 4445 3333333333333333333333333333333333333333333333333333333 4446 3333333333333333333333333333333333333333333333333333333 4447 3333333333333333333333333333333333333333333333333333333 4448 3333333333333333333333333333333333333333333333333333333 4449 3333333333333333333333333333333333333333333333333333333 4450 3333333333333333333333333333333333333333333333333333333 4451 3333333333333333333333333333333333333333333333333333333 4452 3333333333333333333333333333333333333333333333333333333 4453 3333333333333333333333333333333333333333333333333333333 4454 3333333333333333333333333333333333333333333333333333333 4455 3333333333333333333333333333333333333333333333333333333 4456 3333333333333333333333333333333333333333333333333333333 4457 3333333333333333333333333333333333333333333333333333333 4458 3333333333333333333333333333333333333333333333333333333 4459 3333333333333333333333333333333333333333333333333333333 4460 3333333333333333333333333333333333333333333333333333333 4461 3333333333333333333333333333333333333333333333333333333 4462 3333333333333333333333333333333333333333333333333333333 4463 3333333333333333333333333333333333333333333333333333333 4464 3333333333333333333333333333333333333333333333333333333 4465 3333333333333333333333333333333333333333333333333333333 4466 3333333333333333333333333333333333333333333333333333333 4467 3333333333333333333333333333333333333333333333333333333 4468 3333333333333333333333333333333333333333333333333333333 4469 3333333333333333333333333333333333333333333333333333333 4470 3333333333333333333333333333333333333333333333333333333 4471 3333333333333333333333333333333333333333333333333333333 4472 3333333333333333333333333333333333333333333333333333333 4473 3333333333333333333333333333333333333333333333333333333 4474 3333333333333333333333333333333333333333333333333333333 4475 3333333333333333333333333333333333333333333333333333333 4476 3333333333333333333333333333333333333333333333333333333 4477 3333333333333333333333333333333333333333333333333333333 4478 3333333333333333333333333333333333333333333333333333333 4479 3333333333333333333333333333333333333333333333333333333 4480 3333333333333333333333333333333333333333333333333333333 4481 3333333333333333333333333333333333333333333333333333333 4482 3333333333333333333333333333333333333333333333333333333 4483 3333333333333333333333333333333333333333333333333333333 4484 3333333333333333333333333333333333333333333333333333333 4485 3333333333333333333333333333333333333333333333333333333 4486 3333333333333333333333333333333333333333333333333333333 4487 3333333333333333333333333333333333333333333333333333333 4488 3333333333333333333333333333333333333333333333333333333 4489 3333333333333333333333333333333333333333333333333333333 4490 3333333333333333333333333333333333333333333333333333333 4491 3333333333333333333333333333333333333333333333333333333 4492 3333333333333333333333333333333333333333333333333333333 4493 3333333333333333333333333333333333333333333333333333333 4494 3333333333333333333333333333333333333333333333333333333 4495 3333333333333333333333333333333333333333333333333333333 4496 3333333333333333333333333333333333333333333333333333333 4497 3333333333333333333333333333333333333333333333333333333 4498 3333333333333333333333333333333333333333333333333333333 4499 3333333333333333333333333333333333333333333333333333333 4500 3333333333333333333333333333333333333333333333333333333 4501 3333333333333333333333333333333333333333333333333333333 4502 3333333333333333333333333333333333333333333333333333333 4503 3333333333333333333333333333333333333333333333333333333 4504 3333333333333333333333333333333333333333333333333333333 4505 3333333333333333333333333333333333333333333333333333333 4506 3333333333333333333333333333333333333333333333333333333 4507 3333333333333333333333333333333333333333333333333333333 4508 3333333333333333333333333333333333333333333333333333333 4509 3333333333333333333333333333333333333333333333333333333 4510 3333333333333333333333333333333333333333333333333333333 4511 3333333333333333333333333333333333333333333333333333333 4512 3333333333333333333333333333333333333333333333333333333 4513 3333333333333333333333333333333333333333333333333333333 4514 3333333333333333333333333333333333333333333333333333333 4515 3333333333333333333333333333333333333333333333333333333 4516 3333333333333333333333333333333333333333333333333333333 4517 3333333333333333333333333333333333333333333333333333333 4518 3333333333333333333333333333333333333333333333333333333 4519 3333333333333333333333333333333333333333333333333333333 4520 3333333333333333333333333333333333333333333333333333333 4521 3333333333333333333333333333333333333333333333333333333 4522 3333333333333333333333333333333333333333333333333333333 4523 3333333333333333333333333333333333333333333333333333333 4524 3333333333333333333333333333333333333333333333333333333 4525 3333333333333333333333333333333333333333333333333333333 4526 3333333333333333333333333333333333333333333333333333333 4527 3333333333333333333333333333333333333333333333333333333 4528 3333333333333333333333333333333333333333333333333333333 4529 3333333333333333333333333333333333333333333333333333333 4530 3333333333333333333333333333333333333333333333333333333 4531 3333333333333333333333333333333333333333333333333333333 4532 3333333333333333333333333333333333333333333333333333333 4533 3333333333333333333333333333333333333333333333333333333 4534 3333333333333333333333333333333333333333333333333333333 4535 3333333333333333333333333333333333333333333333333333333 4536 3333333333333333333333333333333333333333333333333333333 4537 3333333333333333333333333333333333333333333333333333333 4538 3333333333333333333333333333333333333333333333333333333 4539 3333333333333333333333333333333333333333333333333333333 4540 3333333333333333333333333333333333333333333333333333333 4541 3333333333333333333333333333333333333333333333333333333 4542 3333333333333333333333333333333333333333333333333333333 4543 3333333333333333333333333333333333333333333333333333333 4544 3333333333333333333333333333333333333333333333333333333 4545 3333333333333333333333333333333333333333333333333333333 4546 3333333333333333333333333333333333333333333333333333333 4547 3333333333333333333333333333333333333333333333333333333 4548 3333333333333333333333333333333333333333333333333333333 4549 3333333333333333333333333333333333333333333333333333333 4550 3333333333333333333333333333333333333333333333333333333 4551 3333333333333333333333333333333333333333333333333333333 4552 3333333333333333333333333333333333333333333333333333333 4553 3333333333333333333333333333333333333333333333333333333 4554 3333333333333333333333333333333333333333333333333333333 4555 3333333333333333333333333333333333333333333333333333333 4556 3333333333333333333333333333333333333333333333333333333 4557 3333333333333333333333333333333333333333333333333333333 4558 3333333333333333333333333333333333333333333333333333333 4559 3333333333333333333333333333333333333333333333333333333 4560 3333333333333333333333333333333333333333333333333333333 4561 3333333333333333333333333333333333333333333333333333333 4562 3333333333333333333333333333333333333333333333333333333 4563 3333333333333333333333333333333333333333333333333333333 4564 3333333333333333333333333333333333333333333333333333333 4565 3333333333333333333333333333333333333333333333333333333 4566 3333333333333333333333333333333333333333333333333333333 4567 3333333333333333333333333333333333333333333333333333333 4568 3333333333333333333333333333333333333333333333333333333 4569 3333333333333333333333333333333333333333333333333333333 4570 3333333333333333333333333333333333333333333333333333333 4571 3333333333333333333333333333333333333333333333333333333 4572 3333333333333333333333333333333333333333333333333333333 4573 3333333333333333333333333333333333333333333333333333333 4574 3333333333333333333333333333333333333333333333333333333 4575 3333333333333333333333333333333333333333333333333333333 4576 3333333333333333333333333333333333333333333333333333333 4577 3333333333333333333333333333333333333333333333333333333 4578 3333333333333333333333333333333333333333333333333333333 4579 3333333333333333333333333333333333333333333333333333333 4580 3333333333333333333333333333333333333333333333333333333 4581 3333333333333333333333333333333333333333333333333333333 4582 3333333333333333333333333333333333333333333333333333333 4583 3333333333333333333333333333333333333333333333333333333 4584 3333333333333333333333333333333333333333333333333333333 4585 3333333333333333333333333333333333333333333333333333333 4586 3333333333333333333333333333333333333333333333333333333 4587 3333333333333333333333333333333333333333333333333333333 4588 3333333333333333333333333333333333333333333333333333333 4589 3333333333333333333333333333333333333333333333333333333 4590 3333333333333333333333333333333333333333333333333333333 4591 3333333333333333333333333333333333333333333333333333333 4592 3333333333333333333333333333333333333333333333333333333 4593 3333333333333333333333333333333333333333333333333333333 4594 3333333333333333333333333333333333333333333333333333333 4595 3333333333333333333333333333333333333333333333333333333 4596 3333333333333333333333333333333333333333333333333333333 4597 3333333333333333333333333333333333333333333333333333333 4598 3333333333333333333333333333333333333333333333333333333 4599 3333333333333333333333333333333333333333333333333333333 4600 3333333333333333333333333333333333333333333333333333333 4601 3333333333333333333333333333333333333333333333333333333 4602 3333333333333333333333333333333333333333333333333333333 4603 3333333333333333333333333333333333333333333333333333333 4604 3333333333333333333333333333333333333333333333333333333 4605 3333333333333333333333333333333333333333333333333333333 4606 3333333333333333333333333333333333333333333333333333333 4607 3333333333333333333333333333333333333333333333333333333 4608 3333333333333333333333333333333333333333333333333333333 4609 3333333333333333333333333333333333333333333333333333333 4610 3333333333333333333333333333333333333333333333333333333 4611 3333333333333333333333333333333333333333333333333333333 4612 3333333333333333333333333333333333333333333333333333333 4613 3333333333333333333333333333333333333333333333333333333 4614 3333333333333333333333333333333333333333333333333333333 4615 3333333333333333333333333333333333333333333333333333333 4616 3333333333333333333333333333333333333333333333333333333 4617 3333333333333333333333333333333333333333333333333333333 4618 3333333333333333333333333333333333333333333333333333333 4619 3333333333333333333333333333333333333333333333333333333 4620 3333333333333333333333333333333333333333333333333333333 4621 3333333333333333333333333333333333333333333333333333333 4622 3333333333333333333333333333333333333333333333333333333 4623 3333333333333333333333333333333333333333333333333333333 4624 3333333333333333333333333333333333333333333333333333333 4625 3333333333333333333333333333333333333333333333333333333 4626 3333333333333333333333333333333333333333333333333333333 4627 3333333333333333333333333333333333333333333333333333333 4628 3333333333333333333333333333333333333333333333333333333 4629 3333333333333333333333333333333333333333333333333333333 4630 3333333333333333333333333333333333333333333333333333333 4631 3333333333333333333333333333333333333333333333333333333 4632 3333333333333333333333333333333333333333333333333333333 4633 3333333333333333333333333333333333333333333333333333333 4634 3333333333333333333333333333333333333333333333333333333 4635 3333333333333333333333333333333333333333333333333333333 4636 3333333333333333333333333333333333333333333333333333333 4637 3333333333333333333333333333333333333333333333333333333 4638 3333333333333333333333333333333333333333333333333333333 4639 3333333333333333333333333333333333333333333333333333333 4640 3333333333333333333333333333333333333333333333333333333 4641 3333333333333333333333333333333333333333333333333333333 4642 3333333333333333333333333333333333333333333333333333333 4643 3333333333333333333333333333333333333333333333333333333 4644 3333333333333333333333333333333333333333333333333333333 4645 3333333333333333333333333333333333333333333333333333333 4646 3333333333333333333333333333333333333333333333333333333 4647 3333333333333333333333333333333333333333333333333333333 4648 3333333333333333333333333333333333333333333333333333333 4649 3333333333333333333333333333333333333333333333333333333 4650 3333333333333333333333333333333333333333333333333333333 4651 3333333333333333333333333333333333333333333333333333333 4652 3333333333333333333333333333333333333333333333333333333 4653 3333333333333333333333333333333333333333333333333333333 4654 3333333333333333333333333333333333333333333333333333333 4655 3333333333333333333333333333333333333333333333333333333 4656 3333333333333333333333333333333333333333333333333333333 4657 3333333333333333333333333333333333333333333333333333333 4658 3333333333333333333333333333333333333333333333333333333 4659 3333333333333333333333333333333333333333333333333333333 4660 3333333333333333333333333333333333333333333333333333333 4661 3333333333333333333333333333333333333333333333333333333 4662 3333333333333333333333333333333333333333333333333333333 4663 3333333333333333333333333333333333333333333333333333333 4664 3333333333333333333333333333333333333333333333333333333 4665 3333333333333333333333333333333333333333333333333333333 4666 3333333333333333333333333333333333333333333333333333333 4667 3333333333333333333333333333333333333333333333333333333 4668 3333333333333333333333333333333333333333333333333333333 4669 3333333333333333333333333333333333333333333333333333333 4670 3333333333333333333333333333333333333333333333333333333 4671 3333333333333333333333333333333333333333333333333333333 4672 3333333333333333333333333333333333333333333333333333333 4673 3333333333333333333333333333333333333333333333333333333 4674 3333333333333333333333333333333333333333333333333333333 4675 3333333333333333333333333333333333333333333333333333333 4676 3333333333333333333333333333333333333333333333333333333 4677 3333333333333333333333333333333333333333333333333333333 4678 3333333333333333333333333333333333333333333333333333333 4679 3333333333333333333333333333333333333333333333333333333 4680 3333333333333333333333333333333333333333333333333333333 4681 3333333333333333333333333333333333333333333333333333333 4682 3333333333333333333333333333333333333333333333333333333 4683 3333333333333333333333333333333333333333333333333333333 4684 3333333333333333333333333333333333333333333333333333333 4685 3333333333333333333333333333333333333333333333333333333 4686 3333333333333333333333333333333333333333333333333333333 4687 3333333333333333333333333333333333333333333333333333333 4688 3333333333333333333333333333333333333333333333333333333 4689 3333333333333333333333333333333333333333333333333333333 4690 3333333333333333333333333333333333333333333333333333333 4691 3333333333333333333333333333333333333333333333333333333 4692 3333333333333333333333333333333333333333333333333333333 4693 3333333333333333333333333333333333333333333333333333333 4694 3333333333333333333333333333333333333333333333333333333 4695 3333333333333333333333333333333333333333333333333333333 4696 3333333333333333333333333333333333333333333333333333333 4697 3333333333333333333333333333333333333333333333333333333 4698 3333333333333333333333333333333333333333333333333333333 4699 3333333333333333333333333333333333333333333333333333333 4700 3333333333333333333333333333333333333333333333333333333 4701 3333333333333333333333333333333333333333333333333333333 4702 3333333333333333333333333333333333333333333333333333333 4703 3333333333333333333333333333333333333333333333333333333 4704 3333333333333333333333333333333333333333333333333333333 4705 3333333333333333333333333333333333333333333333333333333 4706 3333333333333333333333333333333333333333333333333333333 4707 3333333333333333333333333333333333333333333333333333333 4708 3333333333333333333333333333333333333333333333333333333 4709 3333333333333333333333333333333333333333333333333333333 4710 3333333333333333333333333333333333333333333333333333333 4711 3333333333333333333333333333333333333333333333333333333 4712 3333333333333333333333333333333333333333333333333333333 4713 3333333333333333333333333333333333333333333333333333333 4714 3333333333333333333333333333333333333333333333333333333 4715 3333333333333333333333333333333333333333333333333333333 4716 3333333333333333333333333333333333333333333333333333333 4717 3333333333333333333333333333333333333333333333333333333 4718 3333333333333333333333333333333333333333333333333333333 4719 3333333333333333333333333333333333333333333333333333333 4720 3333333333333333333333333333333333333333333333333333333 4721 3333333333333333333333333333333333333333333333333333333 4722 3333333333333333333333333333333333333333333333333333333 4723 3333333333333333333333333333333333333333333333333333333 4724 3333333333333333333333333333333333333333333333333333333 4725 3333333333333333333333333333333333333333333333333333333 4726 3333333333333333333333333333333333333333333333333333333 4727 3333333333333333333333333333333333333333333333333333333 4728 3333333333333333333333333333333333333333333333333333333 4729 3333333333333333333333333333333333333333333333333333333 4730 3333333333333333333333333333333333333333333333333333333 4731 3333333333333333333333333333333333333333333333333333333 4732 3333333333333333333333333333333333333333333333333333333 4733 3333333333333333333333333333333333333333333333333333333 4734 3333333333333333333333333333333333333333333333333333333 4735 3333333333333333333333333333333333333333333333333333333 4736 3333333333333333333333333333333333333333333333333333333 4737 3333333333333333333333333333333333333333333333333333333 4738 3333333333333333333333333333333333333333333333333333333 4739 3333333333333333333333333333333333333333333333333333333 4740 3333333333333333333333333333333333333333333333333333333 4741 3333333333333333333333333333333333333333333333333333333 4742 3333333333333333333333333333333333333333333333333333333 4743 3333333333333333333333333333333333333333333333333333333 4744 3333333333333333333333333333333333333333333333333333333 4745 3333333333333333333333333333333333333333333333333333333 4746 3333333333333333333333333333333333333333333333333333333 4747 3333333333333333333333333333333333333333333333333333333 4748 3333333333333333333333333333333333333333333333333333333 4749 3333333333333333333333333333333333333333333333333333333 4750 3333333333333333333333333333333333333333333333333333333 4751 3333333333333333333333333333333333333333333333333333333 4752 3333333333333333333333333333333333333333333333333333333 4753 3333333333333333333333333333333333333333333333333333333 4754 3333333333333333333333333333333333333333333333333333333 4755 3333333333333333333333333333333333333333333333333333333 4756 3333333333333333333333333333333333333333333333333333333 4757 3333333333333333333333333333333333333333333333333333333 4758 3333333333333333333333333333333333333333333333333333333 4759 3333333333333333333333333333333333333333333333333333333 4760 3333333333333333333333333333333333333333333333333333333 4761 3333333333333333333333333333333333333333333333333333333 4762 3333333333333333333333333333333333333333333333333333333 4763 3333333333333333333333333333333333333333333333333333333 4764 3333333333333333333333333333333333333333333333333333333 4765 3333333333333333333333333333333333333333333333333333333 4766 3333333333333333333333333333333333333333333333333333333 4767 3333333333333333333333333333333333333333333333333333333 4768 3333333333333333333333333333333333333333333333333333333 4769 3333333333333333333333333333333333333333333333333333333 4770 3333333333333333333333333333333333333333333333333333333 4771 3333333333333333333333333333333333333333333333333333333 4772 3333333333333333333333333333333333333333333333333333333 4773 3333333333333333333333333333333333333333333333333333333 4774 3333333333333333333333333333333333333333333333333333333 4775 3333333333333333333333333333333333333333333333333333333 4776 3333333333333333333333333333333333333333333333333333333 4777 3333333333333333333333333333333333333333333333333333333 4778 3333333333333333333333333333333333333333333333333333333 4779 3333333333333333333333333333333333333333333333333333333 4780 3333333333333333333333333333333333333333333333333333333 4781 3333333333333333333333333333333333333333333333333333333 4782 3333333333333333333333333333333333333333333333333333333 4783 3333333333333333333333333333333333333333333333333333333 4784 3333333333333333333333333333333333333333333333333333333 4785 3333333333333333333333333333333333333333333333333333333 4786 3333333333333333333333333333333333333333333333333333333 4787 3333333333333333333333333333333333333333333333333333333 4788 3333333333333333333333333333333333333333333333333333333 4789 3333333333333333333333333333333333333333333333333333333 4790 3333333333333333333333333333333333333333333333333333333 4791 3333333333333333333333333333333333333333333333333333333 4792 3333333333333333333333333333333333333333333333333333333 4793 3333333333333333333333333333333333333333333333333333333 4794 3333333333333333333333333333333333333333333333333333333 4795 3333333333333333333333333333333333333333333333333333333 4796 3333333333333333333333333333333333333333333333333333333 4797 3333333333333333333333333333333333333333333333333333333 4798 3333333333333333333333333333333333333333333333333333333 4799 3333333333333333333333333333333333333333333333333333333 4800 3333333333333333333333333333333333333333333333333333333 4801 3333333333333333333333333333333333333333333333333333333 4802 3333333333333333333333333333333333333333333333333333333 4803 3333333333333333333333333333333333333333333333333333333 4804 3333333333333333333333333333333333333333333333333333333 4805 3333333333333333333333333333333333333333333333333333333 4806 3333333333333333333333333333333333333333333333333333333 4807 3333333333333333333333333333333333333333333333333333333 4808 3333333333333333333333333333333333333333333333333333333 4809 3333333333333333333333333333333333333333333333333333333 4810 3333333333333333333333333333333333333333333333333333333 4811 3333333333333333333333333333333333333333333333333333333 4812 3333333333333333333333333333333333333333333333333333333 4813 3333333333333333333333333333333333333333333333333333333 4814 3333333333333333333333333333333333333333333333333333333 4815 3333333333333333333333333333333333333333333333333333333 4816 3333333333333333333333333333333333333333333333333333333 4817 3333333333333333333333333333333333333333333333333333333 4818 3333333333333333333333333333333333333333333333333333333 4819 3333333333333333333333333333333333333333333333333333333 4820 3333333333333333333333333333333333333333333333333333333 4821 3333333333333333333333333333333333333333333333333333333 4822 3333333333333333333333333333333333333333333333333333333 4823 3333333333333333333333333333333333333333333333333333333 4824 3333333333333333333333333333333333333333333333333333333 4825 3333333333333333333333333333333333333333333333333333333 4826 3333333333333333333333333333333333333333333333333333333 4827 3333333333333333333333333333333333333333333333333333333 4828 3333333333333333333333333333333333333333333333333333333 4829 3333333333333333333333333333333333333333333333333333333 4830 3333333333333333333333333333333333333333333333333333333 4831 3333333333333333333333333333333333333333333333333333333 4832 3333333333333333333333333333333333333333333333333333333 4833 3333333333333333333333333333333333333333333333333333333 4834 3333333333333333333333333333333333333333333333333333333 4835 3333333333333333333333333333333333333333333333333333333 4836 3333333333333333333333333333333333333333333333333333333 4837 3333333333333333333333333333333333333333333333333333333 4838 3333333333333333333333333333333333333333333333333333333 4839 3333333333333333333333333333333333333333333333333333333 4840 3333333333333333333333333333333333333333333333333333333 4841 3333333333333333333333333333333333333333333333333333333 4842 3333333333333333333333333333333333333333333333333333333 4843 3333333333333333333333333333333333333333333333333333333 4844 3333333333333333333333333333333333333333333333333333333 4845 3333333333333333333333333333333333333333333333333333333 4846 3333333333333333333333333333333333333333333333333333333 4847 3333333333333333333333333333333333333333333333333333333 4848 3333333333333333333333333333333333333333333333333333333 4849 3333333333333333333333333333333333333333333333333333333 4850 3333333333333333333333333333333333333333333333333333333 4851 3333333333333333333333333333333333333333333333333333333 4852 3333333333333333333333333333333333333333333333333333333 4853 3333333333333333333333333333333333333333333333333333333 4854 3333333333333333333333333333333333333333333333333333333 4855 3333333333333333333333333333333333333333333333333333333 4856 3333333333333333333333333333333333333333333333333333333 4857 3333333333333333333333333333333333333333333333333333333 4858 3333333333333333333333333333333333333333333333333333333 4859 3333333333333333333333333333333333333333333333333333333 4860 3333333333333333333333333333333333333333333333333333333 4861 3333333333333333333333333333333333333333333333333333333 4862 3333333333333333333333333333333333333333333333333333333 4863 3333333333333333333333333333333333333333333333333333333 4864 3333333333333333333333333333333333333333333333333333333 4865 3333333333333333333333333333333333333333333333333333333 4866 3333333333333333333333333333333333333333333333333333333 4867 3333333333333333333333333333333333333333333333333333333 4868 3333333333333333333333333333333333333333333333333333333 4869 3333333333333333333333333333333333333333333333333333333 4870 3333333333333333333333333333333333333333333333333333333 4871 3333333333333333333333333333333333333333333333333333333 4872 3333333333333333333333333333333333333333333333333333333 4873 3333333333333333333333333333333333333333333333333333333 4874 3333333333333333333333333333333333333333333333333333333 4875 3333333333333333333333333333333333333333333333333333333 4876 3333333333333333333333333333333333333333333333333333333 4877 3333333333333333333333333333333333333333333333333333333 4878 3333333333333333333333333333333333333333333333333333333 4879 3333333333333333333333333333333333333333333333333333333 4880 3333333333333333333333333333333333333333333333333333333 4881 3333333333333333333333333333333333333333333333333333333 4882 3333333333333333333333333333333333333333333333333333333 4883 3333333333333333333333333333333333333333333333333333333 4884 3333333333333333333333333333333333333333333333333333333 4885 3333333333333333333333333333333333333333333333333333333 4886 3333333333333333333333333333333333333333333333333333333 4887 3333333333333333333333333333333333333333333333333333333 4888 3333333333333333333333333333333333333333333333333333333 4889 3333333333333333333333333333333333333333333333333333333 4890 3333333333333333333333333333333333333333333333333333333 4891 3333333333333333333333333333333333333333333333333333333 4892 3333333333333333333333333333333333333333333333333333333 4893 3333333333333333333333333333333333333333333333333333333 4894 3333333333333333333333333333333333333333333333333333333 4895 3333333333333333333333333333333333333333333333333333333 4896 3333333333333333333333333333333333333333333333333333333 4897 3333333333333333333333333333333333333333333333333333333 4898 3333333333333333333333333333333333333333333333333333333 4899 3333333333333333333333333333333333333333333333333333333 4900 3333333333333333333333333333333333333333333333333333333 4901 3333333333333333333333333333333333333333333333333333333 4902 3333333333333333333333333333333333333333333333333333333 4903 3333333333333333333333333333333333333333333333333333333 4904 3333333333333333333333333333333333333333333333333333333 4905 3333333333333333333333333333333333333333333333333333333 4906 3333333333333333333333333333333333333333333333333333333 4907 3333333333333333333333333333333333333333333333333333333 4908 3333333333333333333333333333333333333333333333333333333 4909 3333333333333333333333333333333333333333333333333333333 4910 3333333333333333333333333333333333333333333333333333333 4911 3333333333333333333333333333333333333333333333333333333 4912 3333333333333333333333333333333333333333333333333333333 4913 3333333333333333333333333333333333333333333333333333333 4914 3333333333333333333333333333333333333333333333333333333 4915 3333333333333333333333333333333333333333333333333333333 4916 3333333333333333333333333333333333333333333333333333333 4917 3333333333333333333333333333333333333333333333333333333 4918 3333333333333333333333333333333333333333333333333333333 4919 3333333333333333333333333333333333333333333333333333333 4920 3333333333333333333333333333333333333333333333333333333 4921 3333333333333333333333333333333333333333333333333333333 4922 3333333333333333333333333333333333333333333333333333333 4923 3333333333333333333333333333333333333333333333333333333 4924 3333333333333333333333333333333333333333333333333333333 4925 3333333333333333333333333333333333333333333333333333333 4926 3333333333333333333333333333333333333333333333333333333 4927 3333333333333333333333333333333333333333333333333333333 4928 3333333333333333333333333333333333333333333333333333333 4929 3333333333333333333333333333333333333333333333333333333 4930 3333333333333333333333333333333333333333333333333333333 4931 3333333333333333333333333333333333333333333333333333333 4932 3333333333333333333333333333333333333333333333333333333 4933 3333333333333333333333333333333333333333333333333333333 4934 3333333333333333333333333333333333333333333333333333333 4935 3333333333333333333333333333333333333333333333333333333 4936 3333333333333333333333333333333333333333333333333333333 4937 3333333333333333333333333333333333333333333333333333333 4938 3333333333333333333333333333333333333333333333333333333 4939 3333333333333333333333333333333333333333333333333333333 4940 3333333333333333333333333333333333333333333333333333333 4941 3333333333333333333333333333333333333333333333333333333 4942 3333333333333333333333333333333333333333333333333333333 4943 3333333333333333333333333333333333333333333333333333333 4944 3333333333333333333333333333333333333333333333333333333 4945 3333333333333333333333333333333333333333333333333333333 4946 3333333333333333333333333333333333333333333333333333333 4947 3333333333333333333333333333333333333333333333333333333 4948 3333333333333333333333333333333333333333333333333333333 4949 3333333333333333333333333333333333333333333333333333333 4950 3333333333333333333333333333333333333333333333333333333 4951 3333333333333333333333333333333333333333333333333333333 4952 3333333333333333333333333333333333333333333333333333333 4953 3333333333333333333333333333333333333333333333333333333 4954 3333333333333333333333333333333333333333333333333333333 4955 3333333333333333333333333333333333333333333333333333333 4956 3333333333333333333333333333333333333333333333333333333 4957 3333333333333333333333333333333333333333333333333333333 4958 3333333333333333333333333333333333333333333333333333333 4959 3333333333333333333333333333333333333333333333333333333 4960 3333333333333333333333333333333333333333333333333333333 4961 3333333333333333333333333333333333333333333333333333333 4962 3333333333333333333333333333333333333333333333333333333 4963 3333333333333333333333333333333333333333333333333333333 4964 3333333333333333333333333333333333333333333333333333333 4965 3333333333333333333333333333333333333333333333333333333 4966 3333333333333333333333333333333333333333333333333333333 4967 3333333333333333333333333333333333333333333333333333333 4968 3333333333333333333333333333333333333333333333333333333 4969 3333333333333333333333333333333333333333333333333333333 4970 3333333333333333333333333333333333333333333333333333333 4971 3333333333333333333333333333333333333333333333333333333 4972 3333333333333333333333333333333333333333333333333333333 4973 3333333333333333333333333333333333333333333333333333333 4974 3333333333333333333333333333333333333333333333333333333 4975 3333333333333333333333333333333333333333333333333333333 4976 3333333333333333333333333333333333333333333333333333333 4977 3333333333333333333333333333333333333333333333333333333 4978 3333333333333333333333333333333333333333333333333333333 4979 3333333333333333333333333333333333333333333333333333333 4980 3333333333333333333333333333333333333333333333333333333 4981 3333333333333333333333333333333333333333333333333333333 4982 3333333333333333333333333333333333333333333333333333333 4983 3333333333333333333333333333333333333333333333333333333 4984 3333333333333333333333333333333333333333333333333333333 4985 3333333333333333333333333333333333333333333333333333333 4986 3333333333333333333333333333333333333333333333333333333 4987 3333333333333333333333333333333333333333333333333333333 4988 3333333333333333333333333333333333333333333333333333333 4989 3333333333333333333333333333333333333333333333333333333 4990 3333333333333333333333333333333333333333333333333333333 4991 3333333333333333333333333333333333333333333333333333333 4992 3333333333333333333333333333333333333333333333333333333 4993 3333333333333333333333333333333333333333333333333333333 4994 3333333333333333333333333333333333333333333333333333333 4995 3333333333333333333333333333333333333333333333333333333 4996 3333333333333333333333333333333333333333333333333333333 4997 3333333333333333333333333333333333333333333333333333333 4998 3333333333333333333333333333333333333333333333333333333 4999 3333333333333333333333333333333333333333333333333333333 5000 3333333333333333333333333333333333333333333333333333333 5001 3333333333333333333333333333333333333333333333333333333 5002 3333333333333333333333333333333333333333333333333333333 5003 3333333333333333333333333333333333333333333333333333333 5004 3333333333333333333333333333333333333333333333333333333 5005 3333333333333333333333333333333333333333333333333333333 5006 3333333333333333333333333333333333333333333333333333333 5007 3333333333333333333333333333333333333333333333333333333 5008 3333333333333333333333333333333333333333333333333333333 5009 3333333333333333333333333333333333333333333333333333333 5010 3333333333333333333333333333333333333333333333333333333 5011 3333333333333333333333333333333333333333333333333333333 5012 3333333333333333333333333333333333333333333333333333333 5013 3333333333333333333333333333333333333333333333333333333 5014 3333333333333333333333333333333333333333333333333333333 5015 3333333333333333333333333333333333333333333333333333333 5016 3333333333333333333333333333333333333333333333333333333 5017 3333333333333333333333333333333333333333333333333333333 5018 3333333333333333333333333333333333333333333333333333333 5019 3333333333333333333333333333333333333333333333333333333 5020 3333333333333333333333333333333333333333333333333333333 5021 3333333333333333333333333333333333333333333333333333333 5022 3333333333333333333333333333333333333333333333333333333 5023 3333333333333333333333333333333333333333333333333333333 5024 3333333333333333333333333333333333333333333333333333333 5025 3333333333333333333333333333333333333333333333333333333 5026 3333333333333333333333333333333333333333333333333333333 5027 3333333333333333333333333333333333333333333333333333333 5028 3333333333333333333333333333333333333333333333333333333 5029 3333333333333333333333333333333333333333333333333333333 5030 3333333333333333333333333333333333333333333333333333333 5031 3333333333333333333333333333333333333333333333333333333 5032 3333333333333333333333333333333333333333333333333333333 5033 3333333333333333333333333333333333333333333333333333333 5034 3333333333333333333333333333333333333333333333333333333 5035 3333333333333333333333333333333333333333333333333333333 5036 3333333333333333333333333333333333333333333333333333333 5037 3333333333333333333333333333333333333333333333333333333 5038 3333333333333333333333333333333333333333333333333333333 5039 3333333333333333333333333333333333333333333333333333333 5040 3333333333333333333333333333333333333333333333333333333 5041 3333333333333333333333333333333333333333333333333333333 5042 3333333333333333333333333333333333333333333333333333333 5043 3333333333333333333333333333333333333333333333333333333 5044 3333333333333333333333333333333333333333333333333333333 5045 3333333333333333333333333333333333333333333333333333333 5046 3333333333333333333333333333333333333333333333333333333 5047 3333333333333333333333333333333333333333333333333333333 5048 3333333333333333333333333333333333333333333333333333333 5049 3333333333333333333333333333333333333333333333333333333 5050 3333333333333333333333333333333333333333333333333333333 5051 3333333333333333333333333333333333333333333333333333333 5052 3333333333333333333333333333333333333333333333333333333 5053 3333333333333333333333333333333333333333333333333333333 5054 3333333333333333333333333333333333333333333333333333333 5055 3333333333333333333333333333333333333333333333333333333 5056 3333333333333333333333333333333333333333333333333333333 5057 3333333333333333333333333333333333333333333333333333333 5058 3333333333333333333333333333333333333333333333333333333 5059 3333333333333333333333333333333333333333333333333333333 5060 3333333333333333333333333333333333333333333333333333333 5061 3333333333333333333333333333333333333333333333333333333 5062 3333333333333333333333333333333333333333333333333333333 5063 3333333333333333333333333333333333333333333333333333333 5064 3333333333333333333333333333333333333333333333333333333 5065 3333333333333333333333333333333333333333333333333333333 5066 3333333333333333333333333333333333333333333333333333333 5067 3333333333333333333333333333333333333333333333333333333 5068 3333333333333333333333333333333333333333333333333333333 5069 3333333333333333333333333333333333333333333333333333333 5070 3333333333333333333333333333333333333333333333333333333 5071 3333333333333333333333333333333333333333333333333333333 5072 3333333333333333333333333333333333333333333333333333333 5073 3333333333333333333333333333333333333333333333333333333 5074 3333333333333333333333333333333333333333333333333333333 5075 3333333333333333333333333333333333333333333333333333333 5076 3333333333333333333333333333333333333333333333333333333 5077 3333333333333333333333333333333333333333333333333333333 5078 3333333333333333333333333333333333333333333333333333333 5079 3333333333333333333333333333333333333333333333333333333 5080 3333333333333333333333333333333333333333333333333333333 5081 3333333333333333333333333333333333333333333333333333333 5082 3333333333333333333333333333333333333333333333333333333 5083 3333333333333333333333333333333333333333333333333333333 5084 3333333333333333333333333333333333333333333333333333333 5085 3333333333333333333333333333333333333333333333333333333 5086 3333333333333333333333333333333333333333333333333333333 5087 3333333333333333333333333333333333333333333333333333333 5088 3333333333333333333333333333333333333333333333333333333 5089 3333333333333333333333333333333333333333333333333333333 5090 3333333333333333333333333333333333333333333333333333333 5091 3333333333333333333333333333333333333333333333333333333 5092 3333333333333333333333333333333333333333333333333333333 5093 3333333333333333333333333333333333333333333333333333333 5094 3333333333333333333333333333333333333333333333333333333 5095 3333333333333333333333333333333333333333333333333333333 5096 3333333333333333333333333333333333333333333333333333333 5097 3333333333333333333333333333333333333333333333333333333 5098 3333333333333333333333333333333333333333333333333333333 5099 3333333333333333333333333333333333333333333333333333333 5100 3333333333333333333333333333333333333333333333333333333 5101 3333333333333333333333333333333333333333333333333333333 5102 3333333333333333333333333333333333333333333333333333333 5103 3333333333333333333333333333333333333333333333333333333 5104 3333333333333333333333333333333333333333333333333333333 5105 3333333333333333333333333333333333333333333333333333333 5106 3333333333333333333333333333333333333333333333333333333 5107 3333333333333333333333333333333333333333333333333333333 5108 3333333333333333333333333333333333333333333333333333333 5109 3333333333333333333333333333333333333333333333333333333 5110 3333333333333333333333333333333333333333333333333333333 5111 3333333333333333333333333333333333333333333333333333333 5112 3333333333333333333333333333333333333333333333333333333 5113 3333333333333333333333333333333333333333333333333333333 5114 3333333333333333333333333333333333333333333333333333333 5115 3333333333333333333333333333333333333333333333333333333 5116 3333333333333333333333333333333333333333333333333333333 5117 3333333333333333333333333333333333333333333333333333333 5118 3333333333333333333333333333333333333333333333333333333 5119 3333333333333333333333333333333333333333333333333333333 5120 3333333333333333333333333333333333333333333333333333333 5121 3333333333333333333333333333333333333333333333333333333 5122 3333333333333333333333333333333333333333333333333333333 5123 3333333333333333333333333333333333333333333333333333333 5124 3333333333333333333333333333333333333333333333333333333 5125 3333333333333333333333333333333333333333333333333333333 5126 3333333333333333333333333333333333333333333333333333333 5127 3333333333333333333333333333333333333333333333333333333 5128 3333333333333333333333333333333333333333333333333333333 5129 3333333333333333333333333333333333333333333333333333333 5130 3333333333333333333333333333333333333333333333333333333 5131 3333333333333333333333333333333333333333333333333333333 5132 3333333333333333333333333333333333333333333333333333333 5133 3333333333333333333333333333333333333333333333333333333 5134 3333333333333333333333333333333333333333333333333333333 5135 3333333333333333333333333333333333333333333333333333333 5136 3333333333333333333333333333333333333333333333333333333 5137 3333333333333333333333333333333333333333333333333333333 5138 3333333333333333333333333333333333333333333333333333333 5139 3333333333333333333333333333333333333333333333333333333 5140 3333333333333333333333333333333333333333333333333333333 5141 3333333333333333333333333333333333333333333333333333333 5142 3333333333333333333333333333333333333333333333333333333 5143 3333333333333333333333333333333333333333333333333333333 5144 3333333333333333333333333333333333333333333333333333333 5145 3333333333333333333333333333333333333333333333333333333 5146 3333333333333333333333333333333333333333333333333333333 5147 3333333333333333333333333333333333333333333333333333333 5148 3333333333333333333333333333333333333333333333333333333 5149 3333333333333333333333333333333333333333333333333333333 5150 3333333333333333333333333333333333333333333333333333333 5151 3333333333333333333333333333333333333333333333333333333 5152 3333333333333333333333333333333333333333333333333333333 5153 3333333333333333333333333333333333333333333333333333333 5154 3333333333333333333333333333333333333333333333333333333 5155 3333333333333333333333333333333333333333333333333333333 5156 3333333333333333333333333333333333333333333333333333333 5157 3333333333333333333333333333333333333333333333333333333 5158 3333333333333333333333333333333333333333333333333333333 5159 3333333333333333333333333333333333333333333333333333333 5160 3333333333333333333333333333333333333333333333333333333 5161 3333333333333333333333333333333333333333333333333333333 5162 3333333333333333333333333333333333333333333333333333333 5163 3333333333333333333333333333333333333333333333333333333 5164 3333333333333333333333333333333333333333333333333333333 5165 3333333333333333333333333333333333333333333333333333333 5166 3333333333333333333333333333333333333333333333333333333 5167 3333333333333333333333333333333333333333333333333333333 5168 3333333333333333333333333333333333333333333333333333333 5169 3333333333333333333333333333333333333333333333333333333 5170 3333333333333333333333333333333333333333333333333333333 5171 3333333333333333333333333333333333333333333333333333333 5172 3333333333333333333333333333333333333333333333333333333 5173 3333333333333333333333333333333333333333333333333333333 5174 3333333333333333333333333333333333333333333333333333333 5175 3333333333333333333333333333333333333333333333333333333 5176 3333333333333333333333333333333333333333333333333333333 5177 3333333333333333333333333333333333333333333333333333333 5178 3333333333333333333333333333333333333333333333333333333 5179 3333333333333333333333333333333333333333333333333333333 5180 3333333333333333333333333333333333333333333333333333333 5181 3333333333333333333333333333333333333333333333333333333 5182 3333333333333333333333333333333333333333333333333333333 5183 3333333333333333333333333333333333333333333333333333333 5184 3333333333333333333333333333333333333333333333333333333 5185 3333333333333333333333333333333333333333333333333333333 5186 3333333333333333333333333333333333333333333333333333333 5187 3333333333333333333333333333333333333333333333333333333 5188 3333333333333333333333333333333333333333333333333333333 5189 3333333333333333333333333333333333333333333333333333333 5190 3333333333333333333333333333333333333333333333333333333 5191 3333333333333333333333333333333333333333333333333333333 5192 3333333333333333333333333333333333333333333333333333333 5193 3333333333333333333333333333333333333333333333333333333 5194 3333333333333333333333333333333333333333333333333333333 5195 3333333333333333333333333333333333333333333333333333333 5196 3333333333333333333333333333333333333333333333333333333 5197 3333333333333333333333333333333333333333333333333333333 5198 3333333333333333333333333333333333333333333333333333333 5199 3333333333333333333333333333333333333333333333333333333 5200 3333333333333333333333333333333333333333333333333333333 5201 3333333333333333333333333333333333333333333333333333333 5202 3333333333333333333333333333333333333333333333333333333 5203 3333333333333333333333333333333333333333333333333333333 5204 3333333333333333333333333333333333333333333333333333333 5205 3333333333333333333333333333333333333333333333333333333 5206 3333333333333333333333333333333333333333333333333333333 5207 3333333333333333333333333333333333333333333333333333333 5208 3333333333333333333333333333333333333333333333333333333 5209 3333333333333333333333333333333333333333333333333333333 5210 3333333333333333333333333333333333333333333333333333333 5211 3333333333333333333333333333333333333333333333333333333 5212 3333333333333333333333333333333333333333333333333333333 5213 3333333333333333333333333333333333333333333333333333333 5214 3333333333333333333333333333333333333333333333333333333 5215 3333333333333333333333333333333333333333333333333333333 5216 3333333333333333333333333333333333333333333333333333333 5217 3333333333333333333333333333333333333333333333333333333 5218 3333333333333333333333333333333333333333333333333333333 5219 3333333333333333333333333333333333333333333333333333333 5220 3333333333333333333333333333333333333333333333333333333 5221 3333333333333333333333333333333333333333333333333333333 5222 3333333333333333333333333333333333333333333333333333333 5223 3333333333333333333333333333333333333333333333333333333 5224 3333333333333333333333333333333333333333333333333333333 5225 3333333333333333333333333333333333333333333333333333333 5226 3333333333333333333333333333333333333333333333333333333 5227 3333333333333333333333333333333333333333333333333333333 5228 3333333333333333333333333333333333333333333333333333333 5229 3333333333333333333333333333333333333333333333333333333 5230 3333333333333333333333333333333333333333333333333333333 5231 3333333333333333333333333333333333333333333333333333333 5232 3333333333333333333333333333333333333333333333333333333 5233 3333333333333333333333333333333333333333333333333333333 5234 3333333333333333333333333333333333333333333333333333333 5235 3333333333333333333333333333333333333333333333333333333 5236 3333333333333333333333333333333333333333333333333333333 5237 3333333333333333333333333333333333333333333333333333333 5238 3333333333333333333333333333333333333333333333333333333 5239 3333333333333333333333333333333333333333333333333333333 5240 3333333333333333333333333333333333333333333333333333333 5241 3333333333333333333333333333333333333333333333333333333 5242 3333333333333333333333333333333333333333333333333333333 5243 3333333333333333333333333333333333333333333333333333333 5244 3333333333333333333333333333333333333333333333333333333 5245 3333333333333333333333333333333333333333333333333333333 5246 3333333333333333333333333333333333333333333333333333333 5247 3333333333333333333333333333333333333333333333333333333 5248 3333333333333333333333333333333333333333333333333333333 5249 3333333333333333333333333333333333333333333333333333333 5250 3333333333333333333333333333333333333333333333333333333 5251 3333333333333333333333333333333333333333333333333333333 5252 3333333333333333333333333333333333333333333333333333333 5253 3333333333333333333333333333333333333333333333333333333 5254 3333333333333333333333333333333333333333333333333333333 5255 3333333333333333333333333333333333333333333333333333333 5256 3333333333333333333333333333333333333333333333333333333 5257 3333333333333333333333333333333333333333333333333333333 5258 3333333333333333333333333333333333333333333333333333333 5259 3333333333333333333333333333333333333333333333333333333 5260 3333333333333333333333333333333333333333333333333333333 5261 3333333333333333333333333333333333333333333333333333333 5262 3333333333333333333333333333333333333333333333333333333 5263 3333333333333333333333333333333333333333333333333333333 5264 3333333333333333333333333333333333333333333333333333333 5265 3333333333333333333333333333333333333333333333333333333 5266 3333333333333333333333333333333333333333333333333333333 5267 3333333333333333333333333333333333333333333333333333333 5268 3333333333333333333333333333333333333333333333333333333 5269 3333333333333333333333333333333333333333333333333333333 5270 3333333333333333333333333333333333333333333333333333333 5271 3333333333333333333333333333333333333333333333333333333 5272 3333333333333333333333333333333333333333333333333333333 5273 3333333333333333333333333333333333333333333333333333333 5274 3333333333333333333333333333333333333333333333333333333 5275 3333333333333333333333333333333333333333333333333333333 5276 3333333333333333333333333333333333333333333333333333333 5277 3333333333333333333333333333333333333333333333333333333 5278 3333333333333333333333333333333333333333333333333333333 5279 3333333333333333333333333333333333333333333333333333333 5280 3333333333333333333333333333333333333333333333333333333 5281 3333333333333333333333333333333333333333333333333333333 5282 3333333333333333333333333333333333333333333333333333333 5283 3333333333333333333333333333333333333333333333333333333 5284 3333333333333333333333333333333333333333333333333333333 5285 3333333333333333333333333333333333333333333333333333333 5286 3333333333333333333333333333333333333333333333333333333 5287 3333333333333333333333333333333333333333333333333333333 5288 3333333333333333333333333333333333333333333333333333333 5289 3333333333333333333333333333333333333333333333333333333 5290 3333333333333333333333333333333333333333333333333333333 5291 3333333333333333333333333333333333333333333333333333333 5292 3333333333333333333333333333333333333333333333333333333 5293 3333333333333333333333333333333333333333333333333333333 5294 3333333333333333333333333333333333333333333333333333333 5295 3333333333333333333333333333333333333333333333333333333 5296 3333333333333333333333333333333333333333333333333333333 5297 3333333333333333333333333333333333333333333333333333333 5298 3333333333333333333333333333333333333333333333333333333 5299 3333333333333333333333333333333333333333333333333333333 5300 3333333333333333333333333333333333333333333333333333333 5301 3333333333333333333333333333333333333333333333333333333 5302 3333333333333333333333333333333333333333333333333333333 5303 3333333333333333333333333333333333333333333333333333333 5304 3333333333333333333333333333333333333333333333333333333 5305 3333333333333333333333333333333333333333333333333333333 5306 3333333333333333333333333333333333333333333333333333333 5307 3333333333333333333333333333333333333333333333333333333 5308 3333333333333333333333333333333333333333333333333333333 5309 3333333333333333333333333333333333333333333333333333333 5310 3333333333333333333333333333333333333333333333333333333 5311 3333333333333333333333333333333333333333333333333333333 5312 3333333333333333333333333333333333333333333333333333333 5313 3333333333333333333333333333333333333333333333333333333 5314 3333333333333333333333333333333333333333333333333333333 5315 3333333333333333333333333333333333333333333333333333333 5316 3333333333333333333333333333333333333333333333333333333 5317 3333333333333333333333333333333333333333333333333333333 5318 3333333333333333333333333333333333333333333333333333333 5319 3333333333333333333333333333333333333333333333333333333 5320 3333333333333333333333333333333333333333333333333333333 5321 3333333333333333333333333333333333333333333333333333333 5322 3333333333333333333333333333333333333333333333333333333 5323 3333333333333333333333333333333333333333333333333333333 5324 3333333333333333333333333333333333333333333333333333333 5325 3333333333333333333333333333333333333333333333333333333 5326 3333333333333333333333333333333333333333333333333333333 5327 3333333333333333333333333333333333333333333333333333333 5328 3333333333333333333333333333333333333333333333333333333 5329 3333333333333333333333333333333333333333333333333333333 5330 3333333333333333333333333333333333333333333333333333333 5331 3333333333333333333333333333333333333333333333333333333 5332 3333333333333333333333333333333333333333333333333333333 5333 3333333333333333333333333333333333333333333333333333333 5334 3333333333333333333333333333333333333333333333333333333 5335 3333333333333333333333333333333333333333333333333333333 5336 3333333333333333333333333333333333333333333333333333333 5337 3333333333333333333333333333333333333333333333333333333 5338 3333333333333333333333333333333333333333333333333333333 5339 3333333333333333333333333333333333333333333333333333333 5340 3333333333333333333333333333333333333333333333333333333 5341 3333333333333333333333333333333333333333333333333333333 5342 3333333333333333333333333333333333333333333333333333333 5343 3333333333333333333333333333333333333333333333333333333 5344 3333333333333333333333333333333333333333333333333333333 5345 3333333333333333333333333333333333333333333333333333333 5346 3333333333333333333333333333333333333333333333333333333 5347 3333333333333333333333333333333333333333333333333333333 5348 3333333333333333333333333333333333333333333333333333333 5349 3333333333333333333333333333333333333333333333333333333 5350 3333333333333333333333333333333333333333333333333333333 5351 3333333333333333333333333333333333333333333333333333333 5352 3333333333333333333333333333333333333333333333333333333 5353 3333333333333333333333333333333333333333333333333333333 5354 3333333333333333333333333333333333333333333333333333333 5355 3333333333333333333333333333333333333333333333333333333 5356 3333333333333333333333333333333333333333333333333333333 5357 3333333333333333333333333333333333333333333333333333333 5358 3333333333333333333333333333333333333333333333333333333 5359 3333333333333333333333333333333333333333333333333333333 5360 3333333333333333333333333333333333333333333333333333333 5361 3333333333333333333333333333333333333333333333333333333 5362 3333333333333333333333333333333333333333333333333333333 5363 3333333333333333333333333333333333333333333333333333333 5364 3333333333333333333333333333333333333333333333333333333 5365 3333333333333333333333333333333333333333333333333333333 5366 3333333333333333333333333333333333333333333333333333333 5367 3333333333333333333333333333333333333333333333333333333 5368 3333333333333333333333333333333333333333333333333333333 5369 3333333333333333333333333333333333333333333333333333333 5370 3333333333333333333333333333333333333333333333333333333 5371 3333333333333333333333333333333333333333333333333333333 5372 3333333333333333333333333333333333333333333333333333333 5373 3333333333333333333333333333333333333333333333333333333 5374 3333333333333333333333333333333333333333333333333333333 5375 3333333333333333333333333333333333333333333333333333333 5376 3333333333333333333333333333333333333333333333333333333 5377 3333333333333333333333333333333333333333333333333333333 5378 3333333333333333333333333333333333333333333333333333333 5379 3333333333333333333333333333333333333333333333333333333 5380 3333333333333333333333333333333333333333333333333333333 5381 3333333333333333333333333333333333333333333333333333333 5382 3333333333333333333333333333333333333333333333333333333 5383 3333333333333333333333333333333333333333333333333333333 5384 3333333333333333333333333333333333333333333333333333333 5385 3333333333333333333333333333333333333333333333333333333 5386 3333333333333333333333333333333333333333333333333333333 5387 3333333333333333333333333333333333333333333333333333333 5388 3333333333333333333333333333333333333333333333333333333 5389 3333333333333333333333333333333333333333333333333333333 5390 3333333333333333333333333333333333333333333333333333333 5391 3333333333333333333333333333333333333333333333333333333 5392 3333333333333333333333333333333333333333333333333333333 5393 3333333333333333333333333333333333333333333333333333333 5394 3333333333333333333333333333333333333333333333333333333 5395 3333333333333333333333333333333333333333333333333333333 5396 3333333333333333333333333333333333333333333333333333333 5397 3333333333333333333333333333333333333333333333333333333 5398 3333333333333333333333333333333333333333333333333333333 5399 3333333333333333333333333333333333333333333333333333333 5400 3333333333333333333333333333333333333333333333333333333 5401 3333333333333333333333333333333333333333333333333333333 5402 3333333333333333333333333333333333333333333333333333333 5403 3333333333333333333333333333333333333333333333333333333 5404 3333333333333333333333333333333333333333333333333333333 5405 3333333333333333333333333333333333333333333333333333333 5406 3333333333333333333333333333333333333333333333333333333 5407 3333333333333333333333333333333333333333333333333333333 5408 3333333333333333333333333333333333333333333333333333333 5409 3333333333333333333333333333333333333333333333333333333 5410 3333333333333333333333333333333333333333333333333333333 5411 3333333333333333333333333333333333333333333333333333333 5412 3333333333333333333333333333333333333333333333333333333 5413 3333333333333333333333333333333333333333333333333333333 5414 3333333333333333333333333333333333333333333333333333333 5415 3333333333333333333333333333333333333333333333333333333 5416 3333333333333333333333333333333333333333333333333333333 5417 3333333333333333333333333333333333333333333333333333333 5418 3333333333333333333333333333333333333333333333333333333 5419 3333333333333333333333333333333333333333333333333333333 5420 3333333333333333333333333333333333333333333333333333333 5421 3333333333333333333333333333333333333333333333333333333 5422 3333333333333333333333333333333333333333333333333333333 5423 3333333333333333333333333333333333333333333333333333333 5424 3333333333333333333333333333333333333333333333333333333 5425 3333333333333333333333333333333333333333333333333333333 5426 3333333333333333333333333333333333333333333333333333333 5427 3333333333333333333333333333333333333333333333333333333 5428 3333333333333333333333333333333333333333333333333333333 5429 3333333333333333333333333333333333333333333333333333333 5430 3333333333333333333333333333333333333333333333333333333 5431 3333333333333333333333333333333333333333333333333333333 5432 3333333333333333333333333333333333333333333333333333333 5433 3333333333333333333333333333333333333333333333333333333 5434 3333333333333333333333333333333333333333333333333333333 5435 3333333333333333333333333333333333333333333333333333333 5436 3333333333333333333333333333333333333333333333333333333 5437 3333333333333333333333333333333333333333333333333333333 5438 3333333333333333333333333333333333333333333333333333333 5439 3333333333333333333333333333333333333333333333333333333 5440 3333333333333333333333333333333333333333333333333333333 5441 3333333333333333333333333333333333333333333333333333333 5442 3333333333333333333333333333333333333333333333333333333 5443 3333333333333333333333333333333333333333333333333333333 5444 3333333333333333333333333333333333333333333333333333333 5445 3333333333333333333333333333333333333333333333333333333 5446 3333333333333333333333333333333333333333333333333333333 5447 3333333333333333333333333333333333333333333333333333333 5448 3333333333333333333333333333333333333333333333333333333 5449 3333333333333333333333333333333333333333333333333333333 5450 3333333333333333333333333333333333333333333333333333333 5451 3333333333333333333333333333333333333333333333333333333 5452 3333333333333333333333333333333333333333333333333333333 5453 3333333333333333333333333333333333333333333333333333333 5454 3333333333333333333333333333333333333333333333333333333 5455 3333333333333333333333333333333333333333333333333333333 5456 3333333333333333333333333333333333333333333333333333333 5457 3333333333333333333333333333333333333333333333333333333 5458 3333333333333333333333333333333333333333333333333333333 5459 3333333333333333333333333333333333333333333333333333333 5460 3333333333333333333333333333333333333333333333333333333 5461 3333333333333333333333333333333333333333333333333333333 5462 3333333333333333333333333333333333333333333333333333333 5463 3333333333333333333333333333333333333333333333333333333 5464 3333333333333333333333333333333333333333333333333333333 5465 3333333333333333333333333333333333333333333333333333333 5466 3333333333333333333333333333333333333333333333333333333 5467 3333333333333333333333333333333333333333333333333333333 5468 3333333333333333333333333333333333333333333333333333333 5469 3333333333333333333333333333333333333333333333333333333 5470 3333333333333333333333333333333333333333333333333333333 5471 3333333333333333333333333333333333333333333333333333333 5472 3333333333333333333333333333333333333333333333333333333 5473 3333333333333333333333333333333333333333333333333333333 5474 3333333333333333333333333333333333333333333333333333333 5475 3333333333333333333333333333333333333333333333333333333 5476 3333333333333333333333333333333333333333333333333333333 5477 3333333333333333333333333333333333333333333333333333333 5478 3333333333333333333333333333333333333333333333333333333 5479 3333333333333333333333333333333333333333333333333333333 5480 3333333333333333333333333333333333333333333333333333333 5481 3333333333333333333333333333333333333333333333333333333 5482 3333333333333333333333333333333333333333333333333333333 5483 3333333333333333333333333333333333333333333333333333333 5484 3333333333333333333333333333333333333333333333333333333 5485 3333333333333333333333333333333333333333333333333333333 5486 3333333333333333333333333333333333333333333333333333333 5487 3333333333333333333333333333333333333333333333333333333 5488 3333333333333333333333333333333333333333333333333333333 5489 3333333333333333333333333333333333333333333333333333333 5490 3333333333333333333333333333333333333333333333333333333 5491 3333333333333333333333333333333333333333333333333333333 5492 3333333333333333333333333333333333333333333333333333333 5493 3333333333333333333333333333333333333333333333333333333 5494 3333333333333333333333333333333333333333333333333333333 5495 3333333333333333333333333333333333333333333333333333333 5496 3333333333333333333333333333333333333333333333333333333 5497 3333333333333333333333333333333333333333333333333333333 5498 3333333333333333333333333333333333333333333333333333333 5499 3333333333333333333333333333333333333333333333333333333 5500 3333333333333333333333333333333333333333333333333333333 5501 3333333333333333333333333333333333333333333333333333333 5502 3333333333333333333333333333333333333333333333333333333 5503 3333333333333333333333333333333333333333333333333333333 5504 3333333333333333333333333333333333333333333333333333333 5505 3333333333333333333333333333333333333333333333333333333 5506 3333333333333333333333333333333333333333333333333333333 5507 3333333333333333333333333333333333333333333333333333333 5508 3333333333333333333333333333333333333333333333333333333 5509 3333333333333333333333333333333333333333333333333333333 5510 3333333333333333333333333333333333333333333333333333333 5511 3333333333333333333333333333333333333333333333333333333 5512 3333333333333333333333333333333333333333333333333333333 5513 3333333333333333333333333333333333333333333333333333333 5514 3333333333333333333333333333333333333333333333333333333 5515 3333333333333333333333333333333333333333333333333333333 5516 3333333333333333333333333333333333333333333333333333333 5517 3333333333333333333333333333333333333333333333333333333 5518 3333333333333333333333333333333333333333333333333333333 5519 3333333333333333333333333333333333333333333333333333333 5520 3333333333333333333333333333333333333333333333333333333 5521 3333333333333333333333333333333333333333333333333333333 5522 3333333333333333333333333333333333333333333333333333333 5523 3333333333333333333333333333333333333333333333333333333 5524 3333333333333333333333333333333333333333333333333333333 5525 3333333333333333333333333333333333333333333333333333333 5526 3333333333333333333333333333333333333333333333333333333 5527 3333333333333333333333333333333333333333333333333333333 5528 3333333333333333333333333333333333333333333333333333333 5529 3333333333333333333333333333333333333333333333333333333 5530 3333333333333333333333333333333333333333333333333333333 5531 3333333333333333333333333333333333333333333333333333333 5532 3333333333333333333333333333333333333333333333333333333 5533 3333333333333333333333333333333333333333333333333333333 5534 3333333333333333333333333333333333333333333333333333333 5535 3333333333333333333333333333333333333333333333333333333 5536 3333333333333333333333333333333333333333333333333333333 5537 3333333333333333333333333333333333333333333333333333333 5538 3333333333333333333333333333333333333333333333333333333 5539 3333333333333333333333333333333333333333333333333333333 5540 3333333333333333333333333333333333333333333333333333333 5541 3333333333333333333333333333333333333333333333333333333 5542 3333333333333333333333333333333333333333333333333333333 5543 3333333333333333333333333333333333333333333333333333333 5544 3333333333333333333333333333333333333333333333333333333 5545 3333333333333333333333333333333333333333333333333333333 5546 3333333333333333333333333333333333333333333333333333333 5547 3333333333333333333333333333333333333333333333333333333 5548 3333333333333333333333333333333333333333333333333333333 5549 3333333333333333333333333333333333333333333333333333333 5550 3333333333333333333333333333333333333333333333333333333 5551 3333333333333333333333333333333333333333333333333333333 5552 3333333333333333333333333333333333333333333333333333333 5553 3333333333333333333333333333333333333333333333333333333 5554 3333333333333333333333333333333333333333333333333333333 5555 3333333333333333333333333333333333333333333333333333333 5556 3333333333333333333333333333333333333333333333333333333 5557 3333333333333333333333333333333333333333333333333333333 5558 3333333333333333333333333333333333333333333333333333333 5559 3333333333333333333333333333333333333333333333333333333 5560 3333333333333333333333333333333333333333333333333333333 5561 3333333333333333333333333333333333333333333333333333333 5562 3333333333333333333333333333333333333333333333333333333 5563 3333333333333333333333333333333333333333333333333333333 5564 3333333333333333333333333333333333333333333333333333333 5565 3333333333333333333333333333333333333333333333333333333 5566 3333333333333333333333333333333333333333333333333333333 5567 3333333333333333333333333333333333333333333333333333333 5568 3333333333333333333333333333333333333333333333333333333 5569 3333333333333333333333333333333333333333333333333333333 5570 3333333333333333333333333333333333333333333333333333333 5571 3333333333333333333333333333333333333333333333333333333 5572 3333333333333333333333333333333333333333333333333333333 5573 3333333333333333333333333333333333333333333333333333333 5574 3333333333333333333333333333333333333333333333333333333 5575 3333333333333333333333333333333333333333333333333333333 5576 3333333333333333333333333333333333333333333333333333333 5577 3333333333333333333333333333333333333333333333333333333 5578 3333333333333333333333333333333333333333333333333333333 5579 3333333333333333333333333333333333333333333333333333333 5580 3333333333333333333333333333333333333333333333333333333 5581 3333333333333333333333333333333333333333333333333333333 5582 3333333333333333333333333333333333333333333333333333333 5583 3333333333333333333333333333333333333333333333333333333 5584 3333333333333333333333333333333333333333333333333333333 5585 3333333333333333333333333333333333333333333333333333333 5586 3333333333333333333333333333333333333333333333333333333 5587 3333333333333333333333333333333333333333333333333333333 5588 3333333333333333333333333333333333333333333333333333333 5589 3333333333333333333333333333333333333333333333333333333 5590 3333333333333333333333333333333333333333333333333333333 5591 3333333333333333333333333333333333333333333333333333333 5592 3333333333333333333333333333333333333333333333333333333 5593 3333333333333333333333333333333333333333333333333333333 5594 3333333333333333333333333333333333333333333333333333333 5595 3333333333333333333333333333333333333333333333333333333 5596 3333333333333333333333333333333333333333333333333333333 5597 3333333333333333333333333333333333333333333333333333333 5598 3333333333333333333333333333333333333333333333333333333 5599 3333333333333333333333333333333333333333333333333333333 5600 3333333333333333333333333333333333333333333333333333333 5601 3333333333333333333333333333333333333333333333333333333 5602 3333333333333333333333333333333333333333333333333333333 5603 3333333333333333333333333333333333333333333333333333333 5604 3333333333333333333333333333333333333333333333333333333 5605 3333333333333333333333333333333333333333333333333333333 5606 3333333333333333333333333333333333333333333333333333333 5607 3333333333333333333333333333333333333333333333333333333 5608 3333333333333333333333333333333333333333333333333333333 5609 3333333333333333333333333333333333333333333333333333333 5610 3333333333333333333333333333333333333333333333333333333 5611 3333333333333333333333333333333333333333333333333333333 5612 3333333333333333333333333333333333333333333333333333333 5613 3333333333333333333333333333333333333333333333333333333 5614 3333333333333333333333333333333333333333333333333333333 5615 3333333333333333333333333333333333333333333333333333333 5616 3333333333333333333333333333333333333333333333333333333 5617 3333333333333333333333333333333333333333333333333333333 5618 3333333333333333333333333333333333333333333333333333333 5619 3333333333333333333333333333333333333333333333333333333 5620 3333333333333333333333333333333333333333333333333333333 5621 3333333333333333333333333333333333333333333333333333333 5622 3333333333333333333333333333333333333333333333333333333 5623 3333333333333333333333333333333333333333333333333333333 5624 3333333333333333333333333333333333333333333333333333333 5625 3333333333333333333333333333333333333333333333333333333 5626 3333333333333333333333333333333333333333333333333333333 5627 3333333333333333333333333333333333333333333333333333333 5628 3333333333333333333333333333333333333333333333333333333 5629 3333333333333333333333333333333333333333333333333333333 5630 3333333333333333333333333333333333333333333333333333333 5631 3333333333333333333333333333333333333333333333333333333 5632 3333333333333333333333333333333333333333333333333333333 5633 3333333333333333333333333333333333333333333333333333333 5634 3333333333333333333333333333333333333333333333333333333 5635 3333333333333333333333333333333333333333333333333333333 5636 3333333333333333333333333333333333333333333333333333333 5637 3333333333333333333333333333333333333333333333333333333 5638 3333333333333333333333333333333333333333333333333333333 5639 3333333333333333333333333333333333333333333333333333333 5640 3333333333333333333333333333333333333333333333333333333 5641 3333333333333333333333333333333333333333333333333333333 5642 3333333333333333333333333333333333333333333333333333333 5643 3333333333333333333333333333333333333333333333333333333 5644 3333333333333333333333333333333333333333333333333333333 5645 3333333333333333333333333333333333333333333333333333333 5646 3333333333333333333333333333333333333333333333333333333 5647 3333333333333333333333333333333333333333333333333333333 5648 3333333333333333333333333333333333333333333333333333333 5649 3333333333333333333333333333333333333333333333333333333 5650 3333333333333333333333333333333333333333333333333333333 5651 3333333333333333333333333333333333333333333333333333333 5652 3333333333333333333333333333333333333333333333333333333 5653 3333333333333333333333333333333333333333333333333333333 5654 3333333333333333333333333333333333333333333333333333333 5655 3333333333333333333333333333333333333333333333333333333 5656 3333333333333333333333333333333333333333333333333333333 5657 3333333333333333333333333333333333333333333333333333333 5658 3333333333333333333333333333333333333333333333333333333 5659 3333333333333333333333333333333333333333333333333333333 5660 3333333333333333333333333333333333333333333333333333333 5661 3333333333333333333333333333333333333333333333333333333 5662 3333333333333333333333333333333333333333333333333333333 5663 3333333333333333333333333333333333333333333333333333333 5664 3333333333333333333333333333333333333333333333333333333 5665 3333333333333333333333333333333333333333333333333333333 5666 3333333333333333333333333333333333333333333333333333333 5667 3333333333333333333333333333333333333333333333333333333 5668 3333333333333333333333333333333333333333333333333333333 5669 3333333333333333333333333333333333333333333333333333333 5670 3333333333333333333333333333333333333333333333333333333 5671 3333333333333333333333333333333333333333333333333333333 5672 3333333333333333333333333333333333333333333333333333333 5673 3333333333333333333333333333333333333333333333333333333 5674 3333333333333333333333333333333333333333333333333333333 5675 3333333333333333333333333333333333333333333333333333333 5676 3333333333333333333333333333333333333333333333333333333 5677 3333333333333333333333333333333333333333333333333333333 5678 3333333333333333333333333333333333333333333333333333333 5679 3333333333333333333333333333333333333333333333333333333 5680 3333333333333333333333333333333333333333333333333333333 5681 3333333333333333333333333333333333333333333333333333333 5682 3333333333333333333333333333333333333333333333333333333 5683 3333333333333333333333333333333333333333333333333333333 5684 3333333333333333333333333333333333333333333333333333333 5685 3333333333333333333333333333333333333333333333333333333 5686 3333333333333333333333333333333333333333333333333333333 5687 3333333333333333333333333333333333333333333333333333333 5688 3333333333333333333333333333333333333333333333333333333 5689 3333333333333333333333333333333333333333333333333333333 5690 3333333333333333333333333333333333333333333333333333333 5691 3333333333333333333333333333333333333333333333333333333 5692 3333333333333333333333333333333333333333333333333333333 5693 3333333333333333333333333333333333333333333333333333333 5694 3333333333333333333333333333333333333333333333333333333 5695 3333333333333333333333333333333333333333333333333333333 5696 3333333333333333333333333333333333333333333333333333333 5697 3333333333333333333333333333333333333333333333333333333 5698 3333333333333333333333333333333333333333333333333333333 5699 3333333333333333333333333333333333333333333333333333333 5700 3333333333333333333333333333333333333333333333333333333 5701 3333333333333333333333333333333333333333333333333333333 5702 3333333333333333333333333333333333333333333333333333333 5703 3333333333333333333333333333333333333333333333333333333 5704 3333333333333333333333333333333333333333333333333333333 5705 3333333333333333333333333333333333333333333333333333333 5706 3333333333333333333333333333333333333333333333333333333 5707 3333333333333333333333333333333333333333333333333333333 5708 3333333333333333333333333333333333333333333333333333333 5709 3333333333333333333333333333333333333333333333333333333 5710 3333333333333333333333333333333333333333333333333333333 5711 3333333333333333333333333333333333333333333333333333333 5712 3333333333333333333333333333333333333333333333333333333 5713 3333333333333333333333333333333333333333333333333333333 5714 3333333333333333333333333333333333333333333333333333333 5715 3333333333333333333333333333333333333333333333333333333 5716 3333333333333333333333333333333333333333333333333333333 5717 3333333333333333333333333333333333333333333333333333333 5718 3333333333333333333333333333333333333333333333333333333 5719 3333333333333333333333333333333333333333333333333333333 5720 3333333333333333333333333333333333333333333333333333333 5721 3333333333333333333333333333333333333333333333333333333 5722 3333333333333333333333333333333333333333333333333333333 5723 3333333333333333333333333333333333333333333333333333333 5724 3333333333333333333333333333333333333333333333333333333 5725 3333333333333333333333333333333333333333333333333333333 5726 3333333333333333333333333333333333333333333333333333333 5727 3333333333333333333333333333333333333333333333333333333 5728 3333333333333333333333333333333333333333333333333333333 5729 3333333333333333333333333333333333333333333333333333333 5730 3333333333333333333333333333333333333333333333333333333 5731 3333333333333333333333333333333333333333333333333333333 5732 3333333333333333333333333333333333333333333333333333333 5733 3333333333333333333333333333333333333333333333333333333 5734 3333333333333333333333333333333333333333333333333333333 5735 3333333333333333333333333333333333333333333333333333333 5736 3333333333333333333333333333333333333333333333333333333 5737 3333333333333333333333333333333333333333333333333333333 5738 3333333333333333333333333333333333333333333333333333333 5739 3333333333333333333333333333333333333333333333333333333 5740 3333333333333333333333333333333333333333333333333333333 5741 3333333333333333333333333333333333333333333333333333333 5742 3333333333333333333333333333333333333333333333333333333 5743 3333333333333333333333333333333333333333333333333333333 5744 3333333333333333333333333333333333333333333333333333333 5745 3333333333333333333333333333333333333333333333333333333 5746 3333333333333333333333333333333333333333333333333333333 5747 3333333333333333333333333333333333333333333333333333333 5748 3333333333333333333333333333333333333333333333333333333 5749 3333333333333333333333333333333333333333333333333333333 5750 3333333333333333333333333333333333333333333333333333333 5751 3333333333333333333333333333333333333333333333333333333 5752 3333333333333333333333333333333333333333333333333333333 5753 3333333333333333333333333333333333333333333333333333333 5754 3333333333333333333333333333333333333333333333333333333 5755 3333333333333333333333333333333333333333333333333333333 5756 3333333333333333333333333333333333333333333333333333333 5757 3333333333333333333333333333333333333333333333333333333 5758 3333333333333333333333333333333333333333333333333333333 5759 3333333333333333333333333333333333333333333333333333333 5760 3333333333333333333333333333333333333333333333333333333 5761 3333333333333333333333333333333333333333333333333333333 5762 3333333333333333333333333333333333333333333333333333333 5763 3333333333333333333333333333333333333333333333333333333 5764 3333333333333333333333333333333333333333333333333333333 5765 3333333333333333333333333333333333333333333333333333333 5766 3333333333333333333333333333333333333333333333333333333 5767 3333333333333333333333333333333333333333333333333333333 5768 3333333333333333333333333333333333333333333333333333333 5769 3333333333333333333333333333333333333333333333333333333 5770 3333333333333333333333333333333333333333333333333333333 5771 3333333333333333333333333333333333333333333333333333333 5772 3333333333333333333333333333333333333333333333333333333 5773 3333333333333333333333333333333333333333333333333333333 5774 3333333333333333333333333333333333333333333333333333333 5775 3333333333333333333333333333333333333333333333333333333 5776 3333333333333333333333333333333333333333333333333333333 5777 3333333333333333333333333333333333333333333333333333333 5778 3333333333333333333333333333333333333333333333333333333 5779 3333333333333333333333333333333333333333333333333333333 5780 3333333333333333333333333333333333333333333333333333333 5781 3333333333333333333333333333333333333333333333333333333 5782 3333333333333333333333333333333333333333333333333333333 5783 3333333333333333333333333333333333333333333333333333333 5784 3333333333333333333333333333333333333333333333333333333 5785 3333333333333333333333333333333333333333333333333333333 5786 3333333333333333333333333333333333333333333333333333333 5787 3333333333333333333333333333333333333333333333333333333 5788 3333333333333333333333333333333333333333333333333333333 5789 3333333333333333333333333333333333333333333333333333333 5790 3333333333333333333333333333333333333333333333333333333 5791 3333333333333333333333333333333333333333333333333333333 5792 3333333333333333333333333333333333333333333333333333333 5793 3333333333333333333333333333333333333333333333333333333 5794 3333333333333333333333333333333333333333333333333333333 5795 3333333333333333333333333333333333333333333333333333333 5796 3333333333333333333333333333333333333333333333333333333 5797 3333333333333333333333333333333333333333333333333333333 5798 3333333333333333333333333333333333333333333333333333333 5799 3333333333333333333333333333333333333333333333333333333 5800 3333333333333333333333333333333333333333333333333333333 5801 3333333333333333333333333333333333333333333333333333333 5802 3333333333333333333333333333333333333333333333333333333 5803 3333333333333333333333333333333333333333333333333333333 5804 3333333333333333333333333333333333333333333333333333333 5805 3333333333333333333333333333333333333333333333333333333 5806 3333333333333333333333333333333333333333333333333333333 5807 3333333333333333333333333333333333333333333333333333333 5808 3333333333333333333333333333333333333333333333333333333 5809 3333333333333333333333333333333333333333333333333333333 5810 3333333333333333333333333333333333333333333333333333333 5811 3333333333333333333333333333333333333333333333333333333 5812 3333333333333333333333333333333333333333333333333333333 5813 3333333333333333333333333333333333333333333333333333333 5814 3333333333333333333333333333333333333333333333333333333 5815 3333333333333333333333333333333333333333333333333333333 5816 3333333333333333333333333333333333333333333333333333333 5817 3333333333333333333333333333333333333333333333333333333 5818 3333333333333333333333333333333333333333333333333333333 5819 3333333333333333333333333333333333333333333333333333333 5820 3333333333333333333333333333333333333333333333333333333 5821 3333333333333333333333333333333333333333333333333333333 5822 3333333333333333333333333333333333333333333333333333333 5823 3333333333333333333333333333333333333333333333333333333 5824 3333333333333333333333333333333333333333333333333333333 5825 3333333333333333333333333333333333333333333333333333333 5826 3333333333333333333333333333333333333333333333333333333 5827 3333333333333333333333333333333333333333333333333333333 5828 3333333333333333333333333333333333333333333333333333333 5829 3333333333333333333333333333333333333333333333333333333 5830 3333333333333333333333333333333333333333333333333333333 5831 3333333333333333333333333333333333333333333333333333333 5832 3333333333333333333333333333333333333333333333333333333 5833 3333333333333333333333333333333333333333333333333333333 5834 3333333333333333333333333333333333333333333333333333333 5835 3333333333333333333333333333333333333333333333333333333 5836 3333333333333333333333333333333333333333333333333333333 5837 3333333333333333333333333333333333333333333333333333333 5838 3333333333333333333333333333333333333333333333333333333 5839 3333333333333333333333333333333333333333333333333333333 5840 3333333333333333333333333333333333333333333333333333333 5841 3333333333333333333333333333333333333333333333333333333 5842 3333333333333333333333333333333333333333333333333333333 5843 3333333333333333333333333333333333333333333333333333333 5844 3333333333333333333333333333333333333333333333333333333 5845 3333333333333333333333333333333333333333333333333333333 5846 3333333333333333333333333333333333333333333333333333333 5847 3333333333333333333333333333333333333333333333333333333 5848 3333333333333333333333333333333333333333333333333333333 5849 3333333333333333333333333333333333333333333333333333333 5850 3333333333333333333333333333333333333333333333333333333 5851 3333333333333333333333333333333333333333333333333333333 5852 3333333333333333333333333333333333333333333333333333333 5853 3333333333333333333333333333333333333333333333333333333 5854 3333333333333333333333333333333333333333333333333333333 5855 3333333333333333333333333333333333333333333333333333333 5856 3333333333333333333333333333333333333333333333333333333 5857 3333333333333333333333333333333333333333333333333333333 5858 3333333333333333333333333333333333333333333333333333333 5859 3333333333333333333333333333333333333333333333333333333 5860 3333333333333333333333333333333333333333333333333333333 5861 3333333333333333333333333333333333333333333333333333333 5862 3333333333333333333333333333333333333333333333333333333 5863 3333333333333333333333333333333333333333333333333333333 5864 3333333333333333333333333333333333333333333333333333333 5865 3333333333333333333333333333333333333333333333333333333 5866 3333333333333333333333333333333333333333333333333333333 5867 3333333333333333333333333333333333333333333333333333333 5868 3333333333333333333333333333333333333333333333333333333 5869 3333333333333333333333333333333333333333333333333333333 5870 3333333333333333333333333333333333333333333333333333333 5871 3333333333333333333333333333333333333333333333333333333 5872 3333333333333333333333333333333333333333333333333333333 5873 3333333333333333333333333333333333333333333333333333333 5874 3333333333333333333333333333333333333333333333333333333 5875 3333333333333333333333333333333333333333333333333333333 5876 3333333333333333333333333333333333333333333333333333333 5877 3333333333333333333333333333333333333333333333333333333 5878 3333333333333333333333333333333333333333333333333333333 5879 3333333333333333333333333333333333333333333333333333333 5880 3333333333333333333333333333333333333333333333333333333 5881 3333333333333333333333333333333333333333333333333333333 5882 3333333333333333333333333333333333333333333333333333333 5883 3333333333333333333333333333333333333333333333333333333 5884 3333333333333333333333333333333333333333333333333333333 5885 3333333333333333333333333333333333333333333333333333333 5886 3333333333333333333333333333333333333333333333333333333 5887 3333333333333333333333333333333333333333333333333333333 5888 3333333333333333333333333333333333333333333333333333333 5889 3333333333333333333333333333333333333333333333333333333 5890 3333333333333333333333333333333333333333333333333333333 5891 3333333333333333333333333333333333333333333333333333333 5892 3333333333333333333333333333333333333333333333333333333 5893 3333333333333333333333333333333333333333333333333333333 5894 3333333333333333333333333333333333333333333333333333333 5895 3333333333333333333333333333333333333333333333333333333 5896 3333333333333333333333333333333333333333333333333333333 5897 3333333333333333333333333333333333333333333333333333333 5898 3333333333333333333333333333333333333333333333333333333 5899 3333333333333333333333333333333333333333333333333333333 5900 3333333333333333333333333333333333333333333333333333333 5901 3333333333333333333333333333333333333333333333333333333 5902 3333333333333333333333333333333333333333333333333333333 5903 3333333333333333333333333333333333333333333333333333333 5904 3333333333333333333333333333333333333333333333333333333 5905 3333333333333333333333333333333333333333333333333333333 5906 3333333333333333333333333333333333333333333333333333333 5907 3333333333333333333333333333333333333333333333333333333 5908 3333333333333333333333333333333333333333333333333333333 5909 3333333333333333333333333333333333333333333333333333333 5910 3333333333333333333333333333333333333333333333333333333 5911 3333333333333333333333333333333333333333333333333333333 5912 3333333333333333333333333333333333333333333333333333333 5913 3333333333333333333333333333333333333333333333333333333 5914 3333333333333333333333333333333333333333333333333333333 5915 3333333333333333333333333333333333333333333333333333333 5916 3333333333333333333333333333333333333333333333333333333 5917 3333333333333333333333333333333333333333333333333333333 5918 3333333333333333333333333333333333333333333333333333333 5919 3333333333333333333333333333333333333333333333333333333 5920 3333333333333333333333333333333333333333333333333333333 5921 3333333333333333333333333333333333333333333333333333333 5922 3333333333333333333333333333333333333333333333333333333 5923 3333333333333333333333333333333333333333333333333333333 5924 3333333333333333333333333333333333333333333333333333333 5925 3333333333333333333333333333333333333333333333333333333 5926 3333333333333333333333333333333333333333333333333333333 5927 3333333333333333333333333333333333333333333333333333333 5928 3333333333333333333333333333333333333333333333333333333 5929 3333333333333333333333333333333333333333333333333333333 5930 3333333333333333333333333333333333333333333333333333333 5931 3333333333333333333333333333333333333333333333333333333 5932 3333333333333333333333333333333333333333333333333333333 5933 3333333333333333333333333333333333333333333333333333333 5934 3333333333333333333333333333333333333333333333333333333 5935 3333333333333333333333333333333333333333333333333333333 5936 3333333333333333333333333333333333333333333333333333333 5937 3333333333333333333333333333333333333333333333333333333 5938 3333333333333333333333333333333333333333333333333333333 5939 3333333333333333333333333333333333333333333333333333333 5940 3333333333333333333333333333333333333333333333333333333 5941 3333333333333333333333333333333333333333333333333333333 5942 3333333333333333333333333333333333333333333333333333333 5943 3333333333333333333333333333333333333333333333333333333 5944 3333333333333333333333333333333333333333333333333333333 5945 3333333333333333333333333333333333333333333333333333333 5946 3333333333333333333333333333333333333333333333333333333 5947 3333333333333333333333333333333333333333333333333333333 5948 3333333333333333333333333333333333333333333333333333333 5949 3333333333333333333333333333333333333333333333333333333 5950 3333333333333333333333333333333333333333333333333333333 5951 3333333333333333333333333333333333333333333333333333333 5952 3333333333333333333333333333333333333333333333333333333 5953 3333333333333333333333333333333333333333333333333333333 5954 3333333333333333333333333333333333333333333333333333333 5955 3333333333333333333333333333333333333333333333333333333 5956 3333333333333333333333333333333333333333333333333333333 5957 3333333333333333333333333333333333333333333333333333333 5958 3333333333333333333333333333333333333333333333333333333 5959 3333333333333333333333333333333333333333333333333333333 5960 3333333333333333333333333333333333333333333333333333333 5961 3333333333333333333333333333333333333333333333333333333 5962 3333333333333333333333333333333333333333333333333333333 5963 3333333333333333333333333333333333333333333333333333333 5964 3333333333333333333333333333333333333333333333333333333 5965 3333333333333333333333333333333333333333333333333333333 5966 3333333333333333333333333333333333333333333333333333333 5967 3333333333333333333333333333333333333333333333333333333 5968 3333333333333333333333333333333333333333333333333333333 5969 3333333333333333333333333333333333333333333333333333333 5970 3333333333333333333333333333333333333333333333333333333 5971 3333333333333333333333333333333333333333333333333333333 5972 3333333333333333333333333333333333333333333333333333333 5973 3333333333333333333333333333333333333333333333333333333 5974 3333333333333333333333333333333333333333333333333333333 5975 3333333333333333333333333333333333333333333333333333333 5976 3333333333333333333333333333333333333333333333333333333 5977 3333333333333333333333333333333333333333333333333333333 5978 3333333333333333333333333333333333333333333333333333333 5979 3333333333333333333333333333333333333333333333333333333 5980 3333333333333333333333333333333333333333333333333333333 5981 3333333333333333333333333333333333333333333333333333333 5982 3333333333333333333333333333333333333333333333333333333 5983 3333333333333333333333333333333333333333333333333333333 5984 3333333333333333333333333333333333333333333333333333333 5985 3333333333333333333333333333333333333333333333333333333 5986 3333333333333333333333333333333333333333333333333333333 5987 3333333333333333333333333333333333333333333333333333333 5988 3333333333333333333333333333333333333333333333333333333 5989 3333333333333333333333333333333333333333333333333333333 5990 3333333333333333333333333333333333333333333333333333333 5991 3333333333333333333333333333333333333333333333333333333 5992 3333333333333333333333333333333333333333333333333333333 5993 3333333333333333333333333333333333333333333333333333333 5994 3333333333333333333333333333333333333333333333333333333 5995 3333333333333333333333333333333333333333333333333333333 5996 3333333333333333333333333333333333333333333333333333333 5997 3333333333333333333333333333333333333333333333333333333 5998 3333333333333333333333333333333333333333333333333333333 5999 3333333333333333333333333333333333333333333333333333333 6000 3333333333333333333333333333333333333333333333333333333 6001 3333333333333333333333333333333333333333333333333333333 6002 3333333333333333333333333333333333333333333333333333333 6003 3333333333333333333333333333333333333333333333333333333 6004 3333333333333333333333333333333333333333333333333333333 6005 3333333333333333333333333333333333333333333333333333333 6006 3333333333333333333333333333333333333333333333333333333 6007 3333333333333333333333333333333333333333333333333333333 6008 3333333333333333333333333333333333333333333333333333333 6009 3333333333333333333333333333333333333333333333333333333 6010 3333333333333333333333333333333333333333333333333333333 6011 3333333333333333333333333333333333333333333333333333333 6012 3333333333333333333333333333333333333333333333333333333 6013 3333333333333333333333333333333333333333333333333333333 6014 3333333333333333333333333333333333333333333333333333333 6015 3333333333333333333333333333333333333333333333333333333 6016 3333333333333333333333333333333333333333333333333333333 6017 3333333333333333333333333333333333333333333333333333333 6018 3333333333333333333333333333333333333333333333333333333 6019 3333333333333333333333333333333333333333333333333333333 6020 3333333333333333333333333333333333333333333333333333333 6021 3333333333333333333333333333333333333333333333333333333 6022 3333333333333333333333333333333333333333333333333333333 6023 3333333333333333333333333333333333333333333333333333333 6024 3333333333333333333333333333333333333333333333333333333 6025 3333333333333333333333333333333333333333333333333333333 6026 3333333333333333333333333333333333333333333333333333333 6027 3333333333333333333333333333333333333333333333333333333 6028 3333333333333333333333333333333333333333333333333333333 6029 3333333333333333333333333333333333333333333333333333333 6030 3333333333333333333333333333333333333333333333333333333 6031 3333333333333333333333333333333333333333333333333333333 6032 3333333333333333333333333333333333333333333333333333333 6033 3333333333333333333333333333333333333333333333333333333 6034 3333333333333333333333333333333333333333333333333333333 6035 3333333333333333333333333333333333333333333333333333333 6036 3333333333333333333333333333333333333333333333333333333 6037 3333333333333333333333333333333333333333333333333333333 6038 3333333333333333333333333333333333333333333333333333333 6039 3333333333333333333333333333333333333333333333333333333 6040 3333333333333333333333333333333333333333333333333333333 6041 3333333333333333333333333333333333333333333333333333333 6042 3333333333333333333333333333333333333333333333333333333 6043 3333333333333333333333333333333333333333333333333333333 6044 3333333333333333333333333333333333333333333333333333333 6045 3333333333333333333333333333333333333333333333333333333 6046 3333333333333333333333333333333333333333333333333333333 6047 3333333333333333333333333333333333333333333333333333333 6048 3333333333333333333333333333333333333333333333333333333 6049 3333333333333333333333333333333333333333333333333333333 6050 3333333333333333333333333333333333333333333333333333333 6051 3333333333333333333333333333333333333333333333333333333 6052 3333333333333333333333333333333333333333333333333333333 6053 3333333333333333333333333333333333333333333333333333333 6054 3333333333333333333333333333333333333333333333333333333 6055 3333333333333333333333333333333333333333333333333333333 6056 3333333333333333333333333333333333333333333333333333333 6057 3333333333333333333333333333333333333333333333333333333 6058 3333333333333333333333333333333333333333333333333333333 6059 3333333333333333333333333333333333333333333333333333333 6060 3333333333333333333333333333333333333333333333333333333 6061 3333333333333333333333333333333333333333333333333333333 6062 3333333333333333333333333333333333333333333333333333333 6063 3333333333333333333333333333333333333333333333333333333 6064 3333333333333333333333333333333333333333333333333333333 6065 3333333333333333333333333333333333333333333333333333333 6066 3333333333333333333333333333333333333333333333333333333 6067 3333333333333333333333333333333333333333333333333333333 6068 3333333333333333333333333333333333333333333333333333333 6069 3333333333333333333333333333333333333333333333333333333 6070 3333333333333333333333333333333333333333333333333333333 6071 3333333333333333333333333333333333333333333333333333333 6072 3333333333333333333333333333333333333333333333333333333 6073 3333333333333333333333333333333333333333333333333333333 6074 3333333333333333333333333333333333333333333333333333333 6075 3333333333333333333333333333333333333333333333333333333 6076 3333333333333333333333333333333333333333333333333333333 6077 3333333333333333333333333333333333333333333333333333333 6078 3333333333333333333333333333333333333333333333333333333 6079 3333333333333333333333333333333333333333333333333333333 6080 3333333333333333333333333333333333333333333333333333333 6081 3333333333333333333333333333333333333333333333333333333 6082 3333333333333333333333333333333333333333333333333333333 6083 3333333333333333333333333333333333333333333333333333333 6084 3333333333333333333333333333333333333333333333333333333 6085 3333333333333333333333333333333333333333333333333333333 6086 3333333333333333333333333333333333333333333333333333333 6087 3333333333333333333333333333333333333333333333333333333 6088 3333333333333333333333333333333333333333333333333333333 6089 3333333333333333333333333333333333333333333333333333333 6090 3333333333333333333333333333333333333333333333333333333 6091 3333333333333333333333333333333333333333333333333333333 6092 3333333333333333333333333333333333333333333333333333333 6093 3333333333333333333333333333333333333333333333333333333 6094 3333333333333333333333333333333333333333333333333333333 6095 3333333333333333333333333333333333333333333333333333333 6096 3333333333333333333333333333333333333333333333333333333 6097 3333333333333333333333333333333333333333333333333333333 6098 3333333333333333333333333333333333333333333333333333333 6099 3333333333333333333333333333333333333333333333333333333 6100 3333333333333333333333333333333333333333333333333333333 6101 3333333333333333333333333333333333333333333333333333333 6102 3333333333333333333333333333333333333333333333333333333 6103 3333333333333333333333333333333333333333333333333333333 6104 3333333333333333333333333333333333333333333333333333333 6105 3333333333333333333333333333333333333333333333333333333 6106 3333333333333333333333333333333333333333333333333333333 6107 3333333333333333333333333333333333333333333333333333333 6108 3333333333333333333333333333333333333333333333333333333 6109 3333333333333333333333333333333333333333333333333333333 6110 3333333333333333333333333333333333333333333333333333333 6111 3333333333333333333333333333333333333333333333333333333 6112 3333333333333333333333333333333333333333333333333333333 6113 3333333333333333333333333333333333333333333333333333333 6114 3333333333333333333333333333333333333333333333333333333 6115 3333333333333333333333333333333333333333333333333333333 6116 3333333333333333333333333333333333333333333333333333333 6117 3333333333333333333333333333333333333333333333333333333 6118 3333333333333333333333333333333333333333333333333333333 6119 3333333333333333333333333333333333333333333333333333333 6120 3333333333333333333333333333333333333333333333333333333 6121 3333333333333333333333333333333333333333333333333333333 6122 3333333333333333333333333333333333333333333333333333333 6123 3333333333333333333333333333333333333333333333333333333 6124 3333333333333333333333333333333333333333333333333333333 6125 3333333333333333333333333333333333333333333333333333333 6126 3333333333333333333333333333333333333333333333333333333 6127 3333333333333333333333333333333333333333333333333333333 6128 3333333333333333333333333333333333333333333333333333333 6129 3333333333333333333333333333333333333333333333333333333 6130 3333333333333333333333333333333333333333333333333333333 6131 3333333333333333333333333333333333333333333333333333333 6132 3333333333333333333333333333333333333333333333333333333 6133 3333333333333333333333333333333333333333333333333333333 6134 3333333333333333333333333333333333333333333333333333333 6135 3333333333333333333333333333333333333333333333333333333 6136 3333333333333333333333333333333333333333333333333333333 6137 3333333333333333333333333333333333333333333333333333333 6138 3333333333333333333333333333333333333333333333333333333 6139 3333333333333333333333333333333333333333333333333333333 6140 3333333333333333333333333333333333333333333333333333333 6141 3333333333333333333333333333333333333333333333333333333 6142 3333333333333333333333333333333333333333333333333333333 6143 3333333333333333333333333333333333333333333333333333333 6144 3333333333333333333333333333333333333333333333333333333 6145 3333333333333333333333333333333333333333333333333333333 6146 3333333333333333333333333333333333333333333333333333333 6147 3333333333333333333333333333333333333333333333333333333 6148 3333333333333333333333333333333333333333333333333333333 6149 3333333333333333333333333333333333333333333333333333333 6150 3333333333333333333333333333333333333333333333333333333 6151 3333333333333333333333333333333333333333333333333333333 6152 3333333333333333333333333333333333333333333333333333333 6153 3333333333333333333333333333333333333333333333333333333 6154 3333333333333333333333333333333333333333333333333333333 6155 3333333333333333333333333333333333333333333333333333333 6156 3333333333333333333333333333333333333333333333333333333 6157 3333333333333333333333333333333333333333333333333333333 6158 3333333333333333333333333333333333333333333333333333333 6159 3333333333333333333333333333333333333333333333333333333 6160 3333333333333333333333333333333333333333333333333333333 6161 3333333333333333333333333333333333333333333333333333333 6162 3333333333333333333333333333333333333333333333333333333 6163 3333333333333333333333333333333333333333333333333333333 6164 3333333333333333333333333333333333333333333333333333333 6165 3333333333333333333333333333333333333333333333333333333 6166 3333333333333333333333333333333333333333333333333333333 6167 3333333333333333333333333333333333333333333333333333333 6168 3333333333333333333333333333333333333333333333333333333 6169 3333333333333333333333333333333333333333333333333333333 6170 3333333333333333333333333333333333333333333333333333333 6171 3333333333333333333333333333333333333333333333333333333 6172 3333333333333333333333333333333333333333333333333333333 6173 3333333333333333333333333333333333333333333333333333333 6174 3333333333333333333333333333333333333333333333333333333 6175 3333333333333333333333333333333333333333333333333333333 6176 3333333333333333333333333333333333333333333333333333333 6177 3333333333333333333333333333333333333333333333333333333 6178 3333333333333333333333333333333333333333333333333333333 6179 3333333333333333333333333333333333333333333333333333333 6180 3333333333333333333333333333333333333333333333333333333 6181 3333333333333333333333333333333333333333333333333333333 6182 3333333333333333333333333333333333333333333333333333333 6183 3333333333333333333333333333333333333333333333333333333 6184 3333333333333333333333333333333333333333333333333333333 6185 3333333333333333333333333333333333333333333333333333333 6186 3333333333333333333333333333333333333333333333333333333 6187 3333333333333333333333333333333333333333333333333333333 6188 3333333333333333333333333333333333333333333333333333333 6189 3333333333333333333333333333333333333333333333333333333 6190 3333333333333333333333333333333333333333333333333333333 6191 3333333333333333333333333333333333333333333333333333333 6192 3333333333333333333333333333333333333333333333333333333 6193 3333333333333333333333333333333333333333333333333333333 6194 3333333333333333333333333333333333333333333333333333333 6195 3333333333333333333333333333333333333333333333333333333 6196 3333333333333333333333333333333333333333333333333333333 6197 3333333333333333333333333333333333333333333333333333333 6198 3333333333333333333333333333333333333333333333333333333 6199 3333333333333333333333333333333333333333333333333333333 6200 3333333333333333333333333333333333333333333333333333333 6201 3333333333333333333333333333333333333333333333333333333 6202 3333333333333333333333333333333333333333333333333333333 6203 3333333333333333333333333333333333333333333333333333333 6204 3333333333333333333333333333333333333333333333333333333 6205 3333333333333333333333333333333333333333333333333333333 6206 3333333333333333333333333333333333333333333333333333333 6207 3333333333333333333333333333333333333333333333333333333 6208 3333333333333333333333333333333333333333333333333333333 6209 3333333333333333333333333333333333333333333333333333333 6210 3333333333333333333333333333333333333333333333333333333 6211 3333333333333333333333333333333333333333333333333333333 6212 3333333333333333333333333333333333333333333333333333333 6213 3333333333333333333333333333333333333333333333333333333 6214 3333333333333333333333333333333333333333333333333333333 6215 3333333333333333333333333333333333333333333333333333333 6216 3333333333333333333333333333333333333333333333333333333 6217 3333333333333333333333333333333333333333333333333333333 6218 3333333333333333333333333333333333333333333333333333333 6219 3333333333333333333333333333333333333333333333333333333 6220 3333333333333333333333333333333333333333333333333333333 6221 3333333333333333333333333333333333333333333333333333333 6222 3333333333333333333333333333333333333333333333333333333 6223 3333333333333333333333333333333333333333333333333333333 6224 3333333333333333333333333333333333333333333333333333333 6225 3333333333333333333333333333333333333333333333333333333 6226 3333333333333333333333333333333333333333333333333333333 6227 3333333333333333333333333333333333333333333333333333333 6228 3333333333333333333333333333333333333333333333333333333 6229 3333333333333333333333333333333333333333333333333333333 6230 3333333333333333333333333333333333333333333333333333333 6231 3333333333333333333333333333333333333333333333333333333 6232 3333333333333333333333333333333333333333333333333333333 6233 3333333333333333333333333333333333333333333333333333333 6234 3333333333333333333333333333333333333333333333333333333 6235 3333333333333333333333333333333333333333333333333333333 6236 3333333333333333333333333333333333333333333333333333333 6237 3333333333333333333333333333333333333333333333333333333 6238 3333333333333333333333333333333333333333333333333333333 6239 3333333333333333333333333333333333333333333333333333333 6240 3333333333333333333333333333333333333333333333333333333 6241 3333333333333333333333333333333333333333333333333333333 6242 3333333333333333333333333333333333333333333333333333333 6243 3333333333333333333333333333333333333333333333333333333 6244 3333333333333333333333333333333333333333333333333333333 6245 3333333333333333333333333333333333333333333333333333333 6246 3333333333333333333333333333333333333333333333333333333 6247 3333333333333333333333333333333333333333333333333333333 6248 3333333333333333333333333333333333333333333333333333333 6249 3333333333333333333333333333333333333333333333333333333 6250 3333333333333333333333333333333333333333333333333333333 6251 3333333333333333333333333333333333333333333333333333333 6252 3333333333333333333333333333333333333333333333333333333 6253 3333333333333333333333333333333333333333333333333333333 6254 3333333333333333333333333333333333333333333333333333333 6255 3333333333333333333333333333333333333333333333333333333 6256 3333333333333333333333333333333333333333333333333333333 6257 3333333333333333333333333333333333333333333333333333333 6258 3333333333333333333333333333333333333333333333333333333 6259 3333333333333333333333333333333333333333333333333333333 6260 3333333333333333333333333333333333333333333333333333333 6261 3333333333333333333333333333333333333333333333333333333 6262 3333333333333333333333333333333333333333333333333333333 6263 3333333333333333333333333333333333333333333333333333333 6264 3333333333333333333333333333333333333333333333333333333 6265 3333333333333333333333333333333333333333333333333333333 6266 3333333333333333333333333333333333333333333333333333333 6267 3333333333333333333333333333333333333333333333333333333 6268 3333333333333333333333333333333333333333333333333333333 6269 3333333333333333333333333333333333333333333333333333333 6270 3333333333333333333333333333333333333333333333333333333 6271 3333333333333333333333333333333333333333333333333333333 6272 3333333333333333333333333333333333333333333333333333333 6273 3333333333333333333333333333333333333333333333333333333 6274 3333333333333333333333333333333333333333333333333333333 6275 3333333333333333333333333333333333333333333333333333333 6276 3333333333333333333333333333333333333333333333333333333 6277 3333333333333333333333333333333333333333333333333333333 6278 3333333333333333333333333333333333333333333333333333333 6279 3333333333333333333333333333333333333333333333333333333 6280 3333333333333333333333333333333333333333333333333333333 6281 3333333333333333333333333333333333333333333333333333333 6282 3333333333333333333333333333333333333333333333333333333 6283 3333333333333333333333333333333333333333333333333333333 6284 3333333333333333333333333333333333333333333333333333333 6285 3333333333333333333333333333333333333333333333333333333 6286 3333333333333333333333333333333333333333333333333333333 6287 3333333333333333333333333333333333333333333333333333333 6288 3333333333333333333333333333333333333333333333333333333 6289 3333333333333333333333333333333333333333333333333333333 6290 3333333333333333333333333333333333333333333333333333333 6291 3333333333333333333333333333333333333333333333333333333 6292 3333333333333333333333333333333333333333333333333333333 6293 3333333333333333333333333333333333333333333333333333333 6294 3333333333333333333333333333333333333333333333333333333 6295 3333333333333333333333333333333333333333333333333333333 6296 3333333333333333333333333333333333333333333333333333333 6297 3333333333333333333333333333333333333333333333333333333 6298 3333333333333333333333333333333333333333333333333333333 6299 3333333333333333333333333333333333333333333333333333333 6300 3333333333333333333333333333333333333333333333333333333 6301 3333333333333333333333333333333333333333333333333333333 6302 3333333333333333333333333333333333333333333333333333333 6303 3333333333333333333333333333333333333333333333333333333 6304 3333333333333333333333333333333333333333333333333333333 6305 3333333333333333333333333333333333333333333333333333333 6306 3333333333333333333333333333333333333333333333333333333 6307 3333333333333333333333333333333333333333333333333333333 6308 3333333333333333333333333333333333333333333333333333333 6309 3333333333333333333333333333333333333333333333333333333 6310 3333333333333333333333333333333333333333333333333333333 6311 3333333333333333333333333333333333333333333333333333333 6312 3333333333333333333333333333333333333333333333333333333 6313 3333333333333333333333333333333333333333333333333333333 6314 3333333333333333333333333333333333333333333333333333333 6315 3333333333333333333333333333333333333333333333333333333 6316 3333333333333333333333333333333333333333333333333333333 6317 3333333333333333333333333333333333333333333333333333333 6318 3333333333333333333333333333333333333333333333333333333 6319 3333333333333333333333333333333333333333333333333333333 6320 3333333333333333333333333333333333333333333333333333333 6321 3333333333333333333333333333333333333333333333333333333 6322 3333333333333333333333333333333333333333333333333333333 6323 3333333333333333333333333333333333333333333333333333333 6324 3333333333333333333333333333333333333333333333333333333 6325 3333333333333333333333333333333333333333333333333333333 6326 3333333333333333333333333333333333333333333333333333333 6327 3333333333333333333333333333333333333333333333333333333 6328 3333333333333333333333333333333333333333333333333333333 6329 3333333333333333333333333333333333333333333333333333333 6330 3333333333333333333333333333333333333333333333333333333 6331 3333333333333333333333333333333333333333333333333333333 6332 3333333333333333333333333333333333333333333333333333333 6333 3333333333333333333333333333333333333333333333333333333 6334 3333333333333333333333333333333333333333333333333333333 6335 3333333333333333333333333333333333333333333333333333333 6336 3333333333333333333333333333333333333333333333333333333 6337 3333333333333333333333333333333333333333333333333333333 6338 3333333333333333333333333333333333333333333333333333333 6339 3333333333333333333333333333333333333333333333333333333 6340 3333333333333333333333333333333333333333333333333333333 6341 3333333333333333333333333333333333333333333333333333333 6342 3333333333333333333333333333333333333333333333333333333 6343 3333333333333333333333333333333333333333333333333333333 6344 3333333333333333333333333333333333333333333333333333333 6345 3333333333333333333333333333333333333333333333333333333 6346 3333333333333333333333333333333333333333333333333333333 6347 3333333333333333333333333333333333333333333333333333333 6348 3333333333333333333333333333333333333333333333333333333 6349 3333333333333333333333333333333333333333333333333333333 6350 3333333333333333333333333333333333333333333333333333333 6351 3333333333333333333333333333333333333333333333333333333 6352 3333333333333333333333333333333333333333333333333333333 6353 3333333333333333333333333333333333333333333333333333333 6354 3333333333333333333333333333333333333333333333333333333 6355 3333333333333333333333333333333333333333333333333333333 6356 3333333333333333333333333333333333333333333333333333333 6357 3333333333333333333333333333333333333333333333333333333 6358 3333333333333333333333333333333333333333333333333333333 6359 3333333333333333333333333333333333333333333333333333333 6360 3333333333333333333333333333333333333333333333333333333 6361 3333333333333333333333333333333333333333333333333333333 6362 3333333333333333333333333333333333333333333333333333333 6363 3333333333333333333333333333333333333333333333333333333 6364 3333333333333333333333333333333333333333333333333333333 6365 3333333333333333333333333333333333333333333333333333333 6366 3333333333333333333333333333333333333333333333333333333 6367 3333333333333333333333333333333333333333333333333333333 6368 3333333333333333333333333333333333333333333333333333333 6369 3333333333333333333333333333333333333333333333333333333 6370 3333333333333333333333333333333333333333333333333333333 6371 3333333333333333333333333333333333333333333333333333333 6372 3333333333333333333333333333333333333333333333333333333 6373 3333333333333333333333333333333333333333333333333333333 6374 3333333333333333333333333333333333333333333333333333333 6375 3333333333333333333333333333333333333333333333333333333 6376 3333333333333333333333333333333333333333333333333333333 6377 3333333333333333333333333333333333333333333333333333333 6378 3333333333333333333333333333333333333333333333333333333 6379 3333333333333333333333333333333333333333333333333333333 6380 3333333333333333333333333333333333333333333333333333333 6381 3333333333333333333333333333333333333333333333333333333 6382 3333333333333333333333333333333333333333333333333333333 6383 3333333333333333333333333333333333333333333333333333333 6384 3333333333333333333333333333333333333333333333333333333 6385 3333333333333333333333333333333333333333333333333333333 6386 3333333333333333333333333333333333333333333333333333333 6387 3333333333333333333333333333333333333333333333333333333 6388 3333333333333333333333333333333333333333333333333333333 6389 3333333333333333333333333333333333333333333333333333333 6390 3333333333333333333333333333333333333333333333333333333 6391 3333333333333333333333333333333333333333333333333333333 6392 3333333333333333333333333333333333333333333333333333333 6393 3333333333333333333333333333333333333333333333333333333 6394 3333333333333333333333333333333333333333333333333333333 6395 3333333333333333333333333333333333333333333333333333333 6396 3333333333333333333333333333333333333333333333333333333 6397 3333333333333333333333333333333333333333333333333333333 6398 3333333333333333333333333333333333333333333333333333333 6399 3333333333333333333333333333333333333333333333333333333 6400 3333333333333333333333333333333333333333333333333333333 6401 3333333333333333333333333333333333333333333333333333333 6402 3333333333333333333333333333333333333333333333333333333 6403 3333333333333333333333333333333333333333333333333333333 6404 3333333333333333333333333333333333333333333333333333333 6405 3333333333333333333333333333333333333333333333333333333 6406 3333333333333333333333333333333333333333333333333333333 6407 3333333333333333333333333333333333333333333333333333333 6408 3333333333333333333333333333333333333333333333333333333 6409 3333333333333333333333333333333333333333333333333333333 6410 3333333333333333333333333333333333333333333333333333333 6411 3333333333333333333333333333333333333333333333333333333 6412 3333333333333333333333333333333333333333333333333333333 6413 3333333333333333333333333333333333333333333333333333333 6414 3333333333333333333333333333333333333333333333333333333 6415 3333333333333333333333333333333333333333333333333333333 6416 3333333333333333333333333333333333333333333333333333333 6417 3333333333333333333333333333333333333333333333333333333 6418 3333333333333333333333333333333333333333333333333333333 6419 3333333333333333333333333333333333333333333333333333333 6420 3333333333333333333333333333333333333333333333333333333 6421 3333333333333333333333333333333333333333333333333333333 6422 3333333333333333333333333333333333333333333333333333333 6423 3333333333333333333333333333333333333333333333333333333 6424 3333333333333333333333333333333333333333333333333333333 6425 3333333333333333333333333333333333333333333333333333333 6426 3333333333333333333333333333333333333333333333333333333 6427 3333333333333333333333333333333333333333333333333333333 6428 3333333333333333333333333333333333333333333333333333333 6429 3333333333333333333333333333333333333333333333333333333 6430 3333333333333333333333333333333333333333333333333333333 6431 3333333333333333333333333333333333333333333333333333333 6432 3333333333333333333333333333333333333333333333333333333 6433 3333333333333333333333333333333333333333333333333333333 6434 3333333333333333333333333333333333333333333333333333333 6435 3333333333333333333333333333333333333333333333333333333 6436 3333333333333333333333333333333333333333333333333333333 6437 3333333333333333333333333333333333333333333333333333333 6438 3333333333333333333333333333333333333333333333333333333 6439 3333333333333333333333333333333333333333333333333333333 6440 3333333333333333333333333333333333333333333333333333333 6441 3333333333333333333333333333333333333333333333333333333 6442 3333333333333333333333333333333333333333333333333333333 6443 3333333333333333333333333333333333333333333333333333333 6444 3333333333333333333333333333333333333333333333333333333 6445 3333333333333333333333333333333333333333333333333333333 6446 3333333333333333333333333333333333333333333333333333333 6447 3333333333333333333333333333333333333333333333333333333 6448 3333333333333333333333333333333333333333333333333333333 6449 3333333333333333333333333333333333333333333333333333333 6450 3333333333333333333333333333333333333333333333333333333 6451 3333333333333333333333333333333333333333333333333333333 6452 3333333333333333333333333333333333333333333333333333333 6453 3333333333333333333333333333333333333333333333333333333 6454 3333333333333333333333333333333333333333333333333333333 6455 3333333333333333333333333333333333333333333333333333333 6456 3333333333333333333333333333333333333333333333333333333 6457 3333333333333333333333333333333333333333333333333333333 6458 3333333333333333333333333333333333333333333333333333333 6459 3333333333333333333333333333333333333333333333333333333 6460 3333333333333333333333333333333333333333333333333333333 6461 3333333333333333333333333333333333333333333333333333333 6462 3333333333333333333333333333333333333333333333333333333 6463 3333333333333333333333333333333333333333333333333333333 6464 3333333333333333333333333333333333333333333333333333333 6465 3333333333333333333333333333333333333333333333333333333 6466 3333333333333333333333333333333333333333333333333333333 6467 3333333333333333333333333333333333333333333333333333333 6468 3333333333333333333333333333333333333333333333333333333 6469 3333333333333333333333333333333333333333333333333333333 6470 3333333333333333333333333333333333333333333333333333333 6471 3333333333333333333333333333333333333333333333333333333 6472 3333333333333333333333333333333333333333333333333333333 6473 3333333333333333333333333333333333333333333333333333333 6474 3333333333333333333333333333333333333333333333333333333 6475 3333333333333333333333333333333333333333333333333333333 6476 3333333333333333333333333333333333333333333333333333333 6477 3333333333333333333333333333333333333333333333333333333 6478 3333333333333333333333333333333333333333333333333333333 6479 3333333333333333333333333333333333333333333333333333333 6480 3333333333333333333333333333333333333333333333333333333 6481 3333333333333333333333333333333333333333333333333333333 6482 3333333333333333333333333333333333333333333333333333333 6483 3333333333333333333333333333333333333333333333333333333 6484 3333333333333333333333333333333333333333333333333333333 6485 3333333333333333333333333333333333333333333333333333333 6486 3333333333333333333333333333333333333333333333333333333 6487 3333333333333333333333333333333333333333333333333333333 6488 3333333333333333333333333333333333333333333333333333333 6489 3333333333333333333333333333333333333333333333333333333 6490 3333333333333333333333333333333333333333333333333333333 6491 3333333333333333333333333333333333333333333333333333333 6492 3333333333333333333333333333333333333333333333333333333 6493 3333333333333333333333333333333333333333333333333333333 6494 3333333333333333333333333333333333333333333333333333333 6495 3333333333333333333333333333333333333333333333333333333 6496 3333333333333333333333333333333333333333333333333333333 6497 3333333333333333333333333333333333333333333333333333333 6498 3333333333333333333333333333333333333333333333333333333 6499 3333333333333333333333333333333333333333333333333333333 6500 3333333333333333333333333333333333333333333333333333333 6501 3333333333333333333333333333333333333333333333333333333 6502 3333333333333333333333333333333333333333333333333333333 6503 3333333333333333333333333333333333333333333333333333333 6504 3333333333333333333333333333333333333333333333333333333 6505 3333333333333333333333333333333333333333333333333333333 6506 3333333333333333333333333333333333333333333333333333333 6507 3333333333333333333333333333333333333333333333333333333 6508 3333333333333333333333333333333333333333333333333333333 6509 3333333333333333333333333333333333333333333333333333333 6510 3333333333333333333333333333333333333333333333333333333 6511 3333333333333333333333333333333333333333333333333333333 6512 3333333333333333333333333333333333333333333333333333333 6513 3333333333333333333333333333333333333333333333333333333 6514 3333333333333333333333333333333333333333333333333333333 6515 3333333333333333333333333333333333333333333333333333333 6516 3333333333333333333333333333333333333333333333333333333 6517 3333333333333333333333333333333333333333333333333333333 6518 3333333333333333333333333333333333333333333333333333333 6519 3333333333333333333333333333333333333333333333333333333 6520 3333333333333333333333333333333333333333333333333333333 6521 3333333333333333333333333333333333333333333333333333333 6522 3333333333333333333333333333333333333333333333333333333 6523 3333333333333333333333333333333333333333333333333333333 6524 3333333333333333333333333333333333333333333333333333333 6525 3333333333333333333333333333333333333333333333333333333 6526 3333333333333333333333333333333333333333333333333333333 6527 3333333333333333333333333333333333333333333333333333333 6528 3333333333333333333333333333333333333333333333333333333 6529 3333333333333333333333333333333333333333333333333333333 6530 3333333333333333333333333333333333333333333333333333333 6531 3333333333333333333333333333333333333333333333333333333 6532 3333333333333333333333333333333333333333333333333333333 6533 3333333333333333333333333333333333333333333333333333333 6534 3333333333333333333333333333333333333333333333333333333 6535 3333333333333333333333333333333333333333333333333333333 6536 3333333333333333333333333333333333333333333333333333333 6537 3333333333333333333333333333333333333333333333333333333 6538 3333333333333333333333333333333333333333333333333333333 6539 3333333333333333333333333333333333333333333333333333333 6540 3333333333333333333333333333333333333333333333333333333 6541 3333333333333333333333333333333333333333333333333333333 6542 3333333333333333333333333333333333333333333333333333333 6543 3333333333333333333333333333333333333333333333333333333 6544 3333333333333333333333333333333333333333333333333333333 6545 3333333333333333333333333333333333333333333333333333333 6546 3333333333333333333333333333333333333333333333333333333 6547 3333333333333333333333333333333333333333333333333333333 6548 3333333333333333333333333333333333333333333333333333333 6549 3333333333333333333333333333333333333333333333333333333 6550 3333333333333333333333333333333333333333333333333333333 6551 3333333333333333333333333333333333333333333333333333333 6552 3333333333333333333333333333333333333333333333333333333 6553 3333333333333333333333333333333333333333333333333333333 6554 3333333333333333333333333333333333333333333333333333333 6555 3333333333333333333333333333333333333333333333333333333 6556 3333333333333333333333333333333333333333333333333333333 6557 3333333333333333333333333333333333333333333333333333333 6558 3333333333333333333333333333333333333333333333333333333 6559 3333333333333333333333333333333333333333333333333333333 6560 3333333333333333333333333333333333333333333333333333333 6561 3333333333333333333333333333333333333333333333333333333 6562 3333333333333333333333333333333333333333333333333333333 6563 3333333333333333333333333333333333333333333333333333333 6564 3333333333333333333333333333333333333333333333333333333 6565 3333333333333333333333333333333333333333333333333333333 6566 3333333333333333333333333333333333333333333333333333333 6567 3333333333333333333333333333333333333333333333333333333 6568 3333333333333333333333333333333333333333333333333333333 6569 3333333333333333333333333333333333333333333333333333333 6570 3333333333333333333333333333333333333333333333333333333 6571 3333333333333333333333333333333333333333333333333333333 6572 3333333333333333333333333333333333333333333333333333333 6573 3333333333333333333333333333333333333333333333333333333 6574 3333333333333333333333333333333333333333333333333333333 6575 3333333333333333333333333333333333333333333333333333333 6576 3333333333333333333333333333333333333333333333333333333 6577 3333333333333333333333333333333333333333333333333333333 6578 3333333333333333333333333333333333333333333333333333333 6579 3333333333333333333333333333333333333333333333333333333 6580 3333333333333333333333333333333333333333333333333333333 6581 3333333333333333333333333333333333333333333333333333333 6582 3333333333333333333333333333333333333333333333333333333 6583 3333333333333333333333333333333333333333333333333333333 6584 3333333333333333333333333333333333333333333333333333333 6585 3333333333333333333333333333333333333333333333333333333 6586 3333333333333333333333333333333333333333333333333333333 6587 3333333333333333333333333333333333333333333333333333333 6588 3333333333333333333333333333333333333333333333333333333 6589 3333333333333333333333333333333333333333333333333333333 6590 3333333333333333333333333333333333333333333333333333333 6591 3333333333333333333333333333333333333333333333333333333 6592 3333333333333333333333333333333333333333333333333333333 6593 3333333333333333333333333333333333333333333333333333333 6594 3333333333333333333333333333333333333333333333333333333 6595 3333333333333333333333333333333333333333333333333333333 6596 3333333333333333333333333333333333333333333333333333333 6597 3333333333333333333333333333333333333333333333333333333 6598 3333333333333333333333333333333333333333333333333333333 6599 3333333333333333333333333333333333333333333333333333333 6600 3333333333333333333333333333333333333333333333333333333 6601 3333333333333333333333333333333333333333333333333333333 6602 3333333333333333333333333333333333333333333333333333333 6603 3333333333333333333333333333333333333333333333333333333 6604 3333333333333333333333333333333333333333333333333333333 6605 3333333333333333333333333333333333333333333333333333333 6606 3333333333333333333333333333333333333333333333333333333 6607 3333333333333333333333333333333333333333333333333333333 6608 3333333333333333333333333333333333333333333333333333333 6609 3333333333333333333333333333333333333333333333333333333 6610 3333333333333333333333333333333333333333333333333333333 6611 3333333333333333333333333333333333333333333333333333333 6612 3333333333333333333333333333333333333333333333333333333 6613 3333333333333333333333333333333333333333333333333333333 6614 3333333333333333333333333333333333333333333333333333333 6615 3333333333333333333333333333333333333333333333333333333 6616 3333333333333333333333333333333333333333333333333333333 6617 3333333333333333333333333333333333333333333333333333333 6618 3333333333333333333333333333333333333333333333333333333 6619 3333333333333333333333333333333333333333333333333333333 6620 3333333333333333333333333333333333333333333333333333333 6621 3333333333333333333333333333333333333333333333333333333 6622 3333333333333333333333333333333333333333333333333333333 6623 3333333333333333333333333333333333333333333333333333333 6624 3333333333333333333333333333333333333333333333333333333 6625 3333333333333333333333333333333333333333333333333333333 6626 3333333333333333333333333333333333333333333333333333333 6627 3333333333333333333333333333333333333333333333333333333 6628 3333333333333333333333333333333333333333333333333333333 6629 3333333333333333333333333333333333333333333333333333333 6630 3333333333333333333333333333333333333333333333333333333 6631 3333333333333333333333333333333333333333333333333333333 6632 3333333333333333333333333333333333333333333333333333333 6633 3333333333333333333333333333333333333333333333333333333 6634 3333333333333333333333333333333333333333333333333333333 6635 3333333333333333333333333333333333333333333333333333333 6636 3333333333333333333333333333333333333333333333333333333 6637 3333333333333333333333333333333333333333333333333333333 6638 3333333333333333333333333333333333333333333333333333333 6639 3333333333333333333333333333333333333333333333333333333 6640 3333333333333333333333333333333333333333333333333333333 6641 3333333333333333333333333333333333333333333333333333333 6642 3333333333333333333333333333333333333333333333333333333 6643 3333333333333333333333333333333333333333333333333333333 6644 3333333333333333333333333333333333333333333333333333333 6645 3333333333333333333333333333333333333333333333333333333 6646 3333333333333333333333333333333333333333333333333333333 6647 3333333333333333333333333333333333333333333333333333333 6648 3333333333333333333333333333333333333333333333333333333 6649 3333333333333333333333333333333333333333333333333333333 6650 3333333333333333333333333333333333333333333333333333333 6651 3333333333333333333333333333333333333333333333333333333 6652 3333333333333333333333333333333333333333333333333333333 6653 3333333333333333333333333333333333333333333333333333333 6654 3333333333333333333333333333333333333333333333333333333 6655 3333333333333333333333333333333333333333333333333333333 6656 3333333333333333333333333333333333333333333333333333333 6657 3333333333333333333333333333333333333333333333333333333 6658 3333333333333333333333333333333333333333333333333333333 6659 3333333333333333333333333333333333333333333333333333333 6660 3333333333333333333333333333333333333333333333333333333 6661 3333333333333333333333333333333333333333333333333333333 6662 3333333333333333333333333333333333333333333333333333333 6663 3333333333333333333333333333333333333333333333333333333 6664 3333333333333333333333333333333333333333333333333333333 6665 3333333333333333333333333333333333333333333333333333333 6666 3333333333333333333333333333333333333333333333333333333 6667 3333333333333333333333333333333333333333333333333333333 6668 3333333333333333333333333333333333333333333333333333333 6669 3333333333333333333333333333333333333333333333333333333 6670 3333333333333333333333333333333333333333333333333333333 6671 3333333333333333333333333333333333333333333333333333333 6672 3333333333333333333333333333333333333333333333333333333 6673 3333333333333333333333333333333333333333333333333333333 6674 3333333333333333333333333333333333333333333333333333333 6675 3333333333333333333333333333333333333333333333333333333 6676 3333333333333333333333333333333333333333333333333333333 6677 3333333333333333333333333333333333333333333333333333333 6678 3333333333333333333333333333333333333333333333333333333 6679 3333333333333333333333333333333333333333333333333333333 6680 3333333333333333333333333333333333333333333333333333333 6681 3333333333333333333333333333333333333333333333333333333 6682 3333333333333333333333333333333333333333333333333333333 6683 3333333333333333333333333333333333333333333333333333333 6684 3333333333333333333333333333333333333333333333333333333 6685 3333333333333333333333333333333333333333333333333333333 6686 3333333333333333333333333333333333333333333333333333333 6687 3333333333333333333333333333333333333333333333333333333 6688 3333333333333333333333333333333333333333333333333333333 6689 3333333333333333333333333333333333333333333333333333333 6690 3333333333333333333333333333333333333333333333333333333 6691 3333333333333333333333333333333333333333333333333333333 6692 3333333333333333333333333333333333333333333333333333333 6693 3333333333333333333333333333333333333333333333333333333 6694 3333333333333333333333333333333333333333333333333333333 6695 3333333333333333333333333333333333333333333333333333333 6696 3333333333333333333333333333333333333333333333333333333 6697 3333333333333333333333333333333333333333333333333333333 6698 3333333333333333333333333333333333333333333333333333333 6699 3333333333333333333333333333333333333333333333333333333 6700 3333333333333333333333333333333333333333333333333333333 6701 3333333333333333333333333333333333333333333333333333333 6702 3333333333333333333333333333333333333333333333333333333 6703 3333333333333333333333333333333333333333333333333333333 6704 3333333333333333333333333333333333333333333333333333333 6705 3333333333333333333333333333333333333333333333333333333 6706 3333333333333333333333333333333333333333333333333333333 6707 3333333333333333333333333333333333333333333333333333333 6708 3333333333333333333333333333333333333333333333333333333 6709 3333333333333333333333333333333333333333333333333333333 6710 3333333333333333333333333333333333333333333333333333333 6711 3333333333333333333333333333333333333333333333333333333 6712 3333333333333333333333333333333333333333333333333333333 6713 3333333333333333333333333333333333333333333333333333333 6714 3333333333333333333333333333333333333333333333333333333 6715 3333333333333333333333333333333333333333333333333333333 6716 3333333333333333333333333333333333333333333333333333333 6717 3333333333333333333333333333333333333333333333333333333 6718 3333333333333333333333333333333333333333333333333333333 6719 3333333333333333333333333333333333333333333333333333333 6720 3333333333333333333333333333333333333333333333333333333 6721 3333333333333333333333333333333333333333333333333333333 6722 3333333333333333333333333333333333333333333333333333333 6723 3333333333333333333333333333333333333333333333333333333 6724 3333333333333333333333333333333333333333333333333333333 6725 3333333333333333333333333333333333333333333333333333333 6726 3333333333333333333333333333333333333333333333333333333 6727 3333333333333333333333333333333333333333333333333333333 6728 3333333333333333333333333333333333333333333333333333333 6729 3333333333333333333333333333333333333333333333333333333 6730 3333333333333333333333333333333333333333333333333333333 6731 3333333333333333333333333333333333333333333333333333333 6732 3333333333333333333333333333333333333333333333333333333 6733 3333333333333333333333333333333333333333333333333333333 6734 3333333333333333333333333333333333333333333333333333333 6735 3333333333333333333333333333333333333333333333333333333 6736 3333333333333333333333333333333333333333333333333333333 6737 3333333333333333333333333333333333333333333333333333333 6738 3333333333333333333333333333333333333333333333333333333 6739 3333333333333333333333333333333333333333333333333333333 6740 3333333333333333333333333333333333333333333333333333333 6741 3333333333333333333333333333333333333333333333333333333 6742 3333333333333333333333333333333333333333333333333333333 6743 3333333333333333333333333333333333333333333333333333333 6744 3333333333333333333333333333333333333333333333333333333 6745 3333333333333333333333333333333333333333333333333333333 6746 3333333333333333333333333333333333333333333333333333333 6747 3333333333333333333333333333333333333333333333333333333 6748 3333333333333333333333333333333333333333333333333333333 6749 3333333333333333333333333333333333333333333333333333333 6750 3333333333333333333333333333333333333333333333333333333 6751 3333333333333333333333333333333333333333333333333333333 6752 3333333333333333333333333333333333333333333333333333333 6753 3333333333333333333333333333333333333333333333333333333 6754 3333333333333333333333333333333333333333333333333333333 6755 3333333333333333333333333333333333333333333333333333333 6756 3333333333333333333333333333333333333333333333333333333 6757 3333333333333333333333333333333333333333333333333333333 6758 3333333333333333333333333333333333333333333333333333333 6759 3333333333333333333333333333333333333333333333333333333 6760 3333333333333333333333333333333333333333333333333333333 6761 3333333333333333333333333333333333333333333333333333333 6762 3333333333333333333333333333333333333333333333333333333 6763 3333333333333333333333333333333333333333333333333333333 6764 3333333333333333333333333333333333333333333333333333333 6765 3333333333333333333333333333333333333333333333333333333 6766 3333333333333333333333333333333333333333333333333333333 6767 3333333333333333333333333333333333333333333333333333333 6768 3333333333333333333333333333333333333333333333333333333 6769 3333333333333333333333333333333333333333333333333333333 6770 3333333333333333333333333333333333333333333333333333333 6771 3333333333333333333333333333333333333333333333333333333 6772 3333333333333333333333333333333333333333333333333333333 6773 3333333333333333333333333333333333333333333333333333333 6774 3333333333333333333333333333333333333333333333333333333 6775 3333333333333333333333333333333333333333333333333333333 6776 3333333333333333333333333333333333333333333333333333333 6777 3333333333333333333333333333333333333333333333333333333 6778 3333333333333333333333333333333333333333333333333333333 6779 3333333333333333333333333333333333333333333333333333333 6780 3333333333333333333333333333333333333333333333333333333 6781 3333333333333333333333333333333333333333333333333333333 6782 3333333333333333333333333333333333333333333333333333333 6783 3333333333333333333333333333333333333333333333333333333 6784 3333333333333333333333333333333333333333333333333333333 6785 3333333333333333333333333333333333333333333333333333333 6786 3333333333333333333333333333333333333333333333333333333 6787 3333333333333333333333333333333333333333333333333333333 6788 3333333333333333333333333333333333333333333333333333333 6789 3333333333333333333333333333333333333333333333333333333 6790 3333333333333333333333333333333333333333333333333333333 6791 3333333333333333333333333333333333333333333333333333333 6792 3333333333333333333333333333333333333333333333333333333 6793 3333333333333333333333333333333333333333333333333333333 6794 3333333333333333333333333333333333333333333333333333333 6795 3333333333333333333333333333333333333333333333333333333 6796 3333333333333333333333333333333333333333333333333333333 6797 3333333333333333333333333333333333333333333333333333333 6798 3333333333333333333333333333333333333333333333333333333 6799 3333333333333333333333333333333333333333333333333333333 6800 3333333333333333333333333333333333333333333333333333333 6801 3333333333333333333333333333333333333333333333333333333 6802 3333333333333333333333333333333333333333333333333333333 6803 3333333333333333333333333333333333333333333333333333333 6804 3333333333333333333333333333333333333333333333333333333 6805 3333333333333333333333333333333333333333333333333333333 6806 3333333333333333333333333333333333333333333333333333333 6807 3333333333333333333333333333333333333333333333333333333 6808 3333333333333333333333333333333333333333333333333333333 6809 3333333333333333333333333333333333333333333333333333333 6810 3333333333333333333333333333333333333333333333333333333 6811 3333333333333333333333333333333333333333333333333333333 6812 3333333333333333333333333333333333333333333333333333333 6813 3333333333333333333333333333333333333333333333333333333 6814 3333333333333333333333333333333333333333333333333333333 6815 3333333333333333333333333333333333333333333333333333333 6816 3333333333333333333333333333333333333333333333333333333 6817 3333333333333333333333333333333333333333333333333333333 6818 3333333333333333333333333333333333333333333333333333333 6819 3333333333333333333333333333333333333333333333333333333 6820 3333333333333333333333333333333333333333333333333333333 6821 3333333333333333333333333333333333333333333333333333333 6822 3333333333333333333333333333333333333333333333333333333 6823 3333333333333333333333333333333333333333333333333333333 6824 3333333333333333333333333333333333333333333333333333333 6825 3333333333333333333333333333333333333333333333333333333 6826 3333333333333333333333333333333333333333333333333333333 6827 3333333333333333333333333333333333333333333333333333333 6828 3333333333333333333333333333333333333333333333333333333 6829 3333333333333333333333333333333333333333333333333333333 6830 3333333333333333333333333333333333333333333333333333333 6831 3333333333333333333333333333333333333333333333333333333 6832 3333333333333333333333333333333333333333333333333333333 6833 3333333333333333333333333333333333333333333333333333333 6834 3333333333333333333333333333333333333333333333333333333 6835 3333333333333333333333333333333333333333333333333333333 6836 3333333333333333333333333333333333333333333333333333333 6837 3333333333333333333333333333333333333333333333333333333 6838 3333333333333333333333333333333333333333333333333333333 6839 3333333333333333333333333333333333333333333333333333333 6840 3333333333333333333333333333333333333333333333333333333 6841 3333333333333333333333333333333333333333333333333333333 6842 3333333333333333333333333333333333333333333333333333333 6843 3333333333333333333333333333333333333333333333333333333 6844 3333333333333333333333333333333333333333333333333333333 6845 3333333333333333333333333333333333333333333333333333333 6846 3333333333333333333333333333333333333333333333333333333 6847 3333333333333333333333333333333333333333333333333333333 6848 3333333333333333333333333333333333333333333333333333333 6849 3333333333333333333333333333333333333333333333333333333 6850 3333333333333333333333333333333333333333333333333333333 6851 3333333333333333333333333333333333333333333333333333333 6852 3333333333333333333333333333333333333333333333333333333 6853 3333333333333333333333333333333333333333333333333333333 6854 3333333333333333333333333333333333333333333333333333333 6855 3333333333333333333333333333333333333333333333333333333 6856 3333333333333333333333333333333333333333333333333333333 6857 3333333333333333333333333333333333333333333333333333333 6858 3333333333333333333333333333333333333333333333333333333 6859 3333333333333333333333333333333333333333333333333333333 6860 3333333333333333333333333333333333333333333333333333333 6861 3333333333333333333333333333333333333333333333333333333 6862 3333333333333333333333333333333333333333333333333333333 6863 3333333333333333333333333333333333333333333333333333333 6864 3333333333333333333333333333333333333333333333333333333 6865 3333333333333333333333333333333333333333333333333333333 6866 3333333333333333333333333333333333333333333333333333333 6867 3333333333333333333333333333333333333333333333333333333 6868 3333333333333333333333333333333333333333333333333333333 6869 3333333333333333333333333333333333333333333333333333333 6870 3333333333333333333333333333333333333333333333333333333 6871 3333333333333333333333333333333333333333333333333333333 6872 3333333333333333333333333333333333333333333333333333333 6873 3333333333333333333333333333333333333333333333333333333 6874 3333333333333333333333333333333333333333333333333333333 6875 3333333333333333333333333333333333333333333333333333333 6876 3333333333333333333333333333333333333333333333333333333 6877 3333333333333333333333333333333333333333333333333333333 6878 3333333333333333333333333333333333333333333333333333333 6879 3333333333333333333333333333333333333333333333333333333 6880 3333333333333333333333333333333333333333333333333333333 6881 3333333333333333333333333333333333333333333333333333333 6882 3333333333333333333333333333333333333333333333333333333 6883 3333333333333333333333333333333333333333333333333333333 6884 3333333333333333333333333333333333333333333333333333333 6885 3333333333333333333333333333333333333333333333333333333 6886 3333333333333333333333333333333333333333333333333333333 6887 3333333333333333333333333333333333333333333333333333333 6888 3333333333333333333333333333333333333333333333333333333 6889 3333333333333333333333333333333333333333333333333333333 6890 3333333333333333333333333333333333333333333333333333333 6891 3333333333333333333333333333333333333333333333333333333 6892 3333333333333333333333333333333333333333333333333333333 6893 3333333333333333333333333333333333333333333333333333333 6894 3333333333333333333333333333333333333333333333333333333 6895 3333333333333333333333333333333333333333333333333333333 6896 3333333333333333333333333333333333333333333333333333333 6897 3333333333333333333333333333333333333333333333333333333 6898 3333333333333333333333333333333333333333333333333333333 6899 3333333333333333333333333333333333333333333333333333333 6900 3333333333333333333333333333333333333333333333333333333 6901 3333333333333333333333333333333333333333333333333333333 6902 3333333333333333333333333333333333333333333333333333333 6903 3333333333333333333333333333333333333333333333333333333 6904 3333333333333333333333333333333333333333333333333333333 6905 3333333333333333333333333333333333333333333333333333333 6906 3333333333333333333333333333333333333333333333333333333 6907 3333333333333333333333333333333333333333333333333333333 6908 3333333333333333333333333333333333333333333333333333333 6909 3333333333333333333333333333333333333333333333333333333 6910 3333333333333333333333333333333333333333333333333333333 6911 3333333333333333333333333333333333333333333333333333333 6912 3333333333333333333333333333333333333333333333333333333 6913 3333333333333333333333333333333333333333333333333333333 6914 3333333333333333333333333333333333333333333333333333333 6915 3333333333333333333333333333333333333333333333333333333 6916 3333333333333333333333333333333333333333333333333333333 6917 3333333333333333333333333333333333333333333333333333333 6918 3333333333333333333333333333333333333333333333333333333 6919 3333333333333333333333333333333333333333333333333333333 6920 3333333333333333333333333333333333333333333333333333333 6921 3333333333333333333333333333333333333333333333333333333 6922 3333333333333333333333333333333333333333333333333333333 6923 3333333333333333333333333333333333333333333333333333333 6924 3333333333333333333333333333333333333333333333333333333 6925 3333333333333333333333333333333333333333333333333333333 6926 3333333333333333333333333333333333333333333333333333333 6927 3333333333333333333333333333333333333333333333333333333 6928 3333333333333333333333333333333333333333333333333333333 6929 3333333333333333333333333333333333333333333333333333333 6930 3333333333333333333333333333333333333333333333333333333 6931 3333333333333333333333333333333333333333333333333333333 6932 3333333333333333333333333333333333333333333333333333333 6933 3333333333333333333333333333333333333333333333333333333 6934 3333333333333333333333333333333333333333333333333333333 6935 3333333333333333333333333333333333333333333333333333333 6936 3333333333333333333333333333333333333333333333333333333 6937 3333333333333333333333333333333333333333333333333333333 6938 3333333333333333333333333333333333333333333333333333333 6939 3333333333333333333333333333333333333333333333333333333 6940 3333333333333333333333333333333333333333333333333333333 6941 3333333333333333333333333333333333333333333333333333333 6942 3333333333333333333333333333333333333333333333333333333 6943 3333333333333333333333333333333333333333333333333333333 6944 3333333333333333333333333333333333333333333333333333333 6945 3333333333333333333333333333333333333333333333333333333 6946 3333333333333333333333333333333333333333333333333333333 6947 3333333333333333333333333333333333333333333333333333333 6948 3333333333333333333333333333333333333333333333333333333 6949 3333333333333333333333333333333333333333333333333333333 6950 3333333333333333333333333333333333333333333333333333333 6951 3333333333333333333333333333333333333333333333333333333 6952 3333333333333333333333333333333333333333333333333333333 6953 3333333333333333333333333333333333333333333333333333333 6954 3333333333333333333333333333333333333333333333333333333 6955 3333333333333333333333333333333333333333333333333333333 6956 3333333333333333333333333333333333333333333333333333333 6957 3333333333333333333333333333333333333333333333333333333 6958 3333333333333333333333333333333333333333333333333333333 6959 3333333333333333333333333333333333333333333333333333333 6960 3333333333333333333333333333333333333333333333333333333 6961 3333333333333333333333333333333333333333333333333333333 6962 3333333333333333333333333333333333333333333333333333333 6963 3333333333333333333333333333333333333333333333333333333 6964 3333333333333333333333333333333333333333333333333333333 6965 3333333333333333333333333333333333333333333333333333333 6966 3333333333333333333333333333333333333333333333333333333 6967 3333333333333333333333333333333333333333333333333333333 6968 3333333333333333333333333333333333333333333333333333333 6969 3333333333333333333333333333333333333333333333333333333 6970 3333333333333333333333333333333333333333333333333333333 6971 3333333333333333333333333333333333333333333333333333333 6972 3333333333333333333333333333333333333333333333333333333 6973 3333333333333333333333333333333333333333333333333333333 6974 3333333333333333333333333333333333333333333333333333333 6975 3333333333333333333333333333333333333333333333333333333 6976 3333333333333333333333333333333333333333333333333333333 6977 3333333333333333333333333333333333333333333333333333333 6978 3333333333333333333333333333333333333333333333333333333 6979 3333333333333333333333333333333333333333333333333333333 6980 3333333333333333333333333333333333333333333333333333333 6981 3333333333333333333333333333333333333333333333333333333 6982 3333333333333333333333333333333333333333333333333333333 6983 3333333333333333333333333333333333333333333333333333333 6984 3333333333333333333333333333333333333333333333333333333 6985 3333333333333333333333333333333333333333333333333333333 6986 3333333333333333333333333333333333333333333333333333333 6987 3333333333333333333333333333333333333333333333333333333 6988 3333333333333333333333333333333333333333333333333333333 6989 3333333333333333333333333333333333333333333333333333333 6990 3333333333333333333333333333333333333333333333333333333 6991 3333333333333333333333333333333333333333333333333333333 6992 3333333333333333333333333333333333333333333333333333333 6993 3333333333333333333333333333333333333333333333333333333 6994 3333333333333333333333333333333333333333333333333333333 6995 3333333333333333333333333333333333333333333333333333333 6996 3333333333333333333333333333333333333333333333333333333 6997 3333333333333333333333333333333333333333333333333333333 6998 3333333333333333333333333333333333333333333333333333333 6999 3333333333333333333333333333333333333333333333333333333 7000 3333333333333333333333333333333333333333333333333333333 7001 3333333333333333333333333333333333333333333333333333333 7002 3333333333333333333333333333333333333333333333333333333 7003 3333333333333333333333333333333333333333333333333333333 7004 3333333333333333333333333333333333333333333333333333333 7005 3333333333333333333333333333333333333333333333333333333 7006 3333333333333333333333333333333333333333333333333333333 7007 3333333333333333333333333333333333333333333333333333333 7008 3333333333333333333333333333333333333333333333333333333 7009 3333333333333333333333333333333333333333333333333333333 7010 3333333333333333333333333333333333333333333333333333333 7011 3333333333333333333333333333333333333333333333333333333 7012 3333333333333333333333333333333333333333333333333333333 7013 3333333333333333333333333333333333333333333333333333333 7014 3333333333333333333333333333333333333333333333333333333 7015 3333333333333333333333333333333333333333333333333333333 7016 3333333333333333333333333333333333333333333333333333333 7017 3333333333333333333333333333333333333333333333333333333 7018 3333333333333333333333333333333333333333333333333333333 7019 3333333333333333333333333333333333333333333333333333333 7020 3333333333333333333333333333333333333333333333333333333 7021 3333333333333333333333333333333333333333333333333333333 7022 3333333333333333333333333333333333333333333333333333333 7023 3333333333333333333333333333333333333333333333333333333 7024 3333333333333333333333333333333333333333333333333333333 7025 3333333333333333333333333333333333333333333333333333333 7026 3333333333333333333333333333333333333333333333333333333 7027 3333333333333333333333333333333333333333333333333333333 7028 3333333333333333333333333333333333333333333333333333333 7029 3333333333333333333333333333333333333333333333333333333 7030 3333333333333333333333333333333333333333333333333333333 7031 3333333333333333333333333333333333333333333333333333333 7032 3333333333333333333333333333333333333333333333333333333 7033 3333333333333333333333333333333333333333333333333333333 7034 3333333333333333333333333333333333333333333333333333333 7035 3333333333333333333333333333333333333333333333333333333 7036 3333333333333333333333333333333333333333333333333333333 7037 3333333333333333333333333333333333333333333333333333333 7038 3333333333333333333333333333333333333333333333333333333 7039 3333333333333333333333333333333333333333333333333333333 7040 3333333333333333333333333333333333333333333333333333333 7041 3333333333333333333333333333333333333333333333333333333 7042 3333333333333333333333333333333333333333333333333333333 7043 3333333333333333333333333333333333333333333333333333333 7044 3333333333333333333333333333333333333333333333333333333 7045 3333333333333333333333333333333333333333333333333333333 7046 3333333333333333333333333333333333333333333333333333333 7047 3333333333333333333333333333333333333333333333333333333 7048 3333333333333333333333333333333333333333333333333333333 7049 3333333333333333333333333333333333333333333333333333333 7050 3333333333333333333333333333333333333333333333333333333 7051 3333333333333333333333333333333333333333333333333333333 7052 3333333333333333333333333333333333333333333333333333333 7053 3333333333333333333333333333333333333333333333333333333 7054 3333333333333333333333333333333333333333333333333333333 7055 3333333333333333333333333333333333333333333333333333333 7056 3333333333333333333333333333333333333333333333333333333 7057 3333333333333333333333333333333333333333333333333333333 7058 3333333333333333333333333333333333333333333333333333333 7059 3333333333333333333333333333333333333333333333333333333 7060 3333333333333333333333333333333333333333333333333333333 7061 3333333333333333333333333333333333333333333333333333333 7062 3333333333333333333333333333333333333333333333333333333 7063 3333333333333333333333333333333333333333333333333333333 7064 3333333333333333333333333333333333333333333333333333333 7065 3333333333333333333333333333333333333333333333333333333 7066 3333333333333333333333333333333333333333333333333333333 7067 3333333333333333333333333333333333333333333333333333333 7068 3333333333333333333333333333333333333333333333333333333 7069 3333333333333333333333333333333333333333333333333333333 7070 3333333333333333333333333333333333333333333333333333333 7071 3333333333333333333333333333333333333333333333333333333 7072 3333333333333333333333333333333333333333333333333333333 7073 3333333333333333333333333333333333333333333333333333333 7074 3333333333333333333333333333333333333333333333333333333 7075 3333333333333333333333333333333333333333333333333333333 7076 3333333333333333333333333333333333333333333333333333333 7077 3333333333333333333333333333333333333333333333333333333 7078 3333333333333333333333333333333333333333333333333333333 7079 3333333333333333333333333333333333333333333333333333333 7080 3333333333333333333333333333333333333333333333333333333 7081 3333333333333333333333333333333333333333333333333333333 7082 3333333333333333333333333333333333333333333333333333333 7083 3333333333333333333333333333333333333333333333333333333 7084 3333333333333333333333333333333333333333333333333333333 7085 3333333333333333333333333333333333333333333333333333333 7086 3333333333333333333333333333333333333333333333333333333 7087 3333333333333333333333333333333333333333333333333333333 7088 3333333333333333333333333333333333333333333333333333333 7089 3333333333333333333333333333333333333333333333333333333 7090 3333333333333333333333333333333333333333333333333333333 7091 3333333333333333333333333333333333333333333333333333333 7092 3333333333333333333333333333333333333333333333333333333 7093 3333333333333333333333333333333333333333333333333333333 7094 3333333333333333333333333333333333333333333333333333333 7095 3333333333333333333333333333333333333333333333333333333 7096 3333333333333333333333333333333333333333333333333333333 7097 3333333333333333333333333333333333333333333333333333333 7098 3333333333333333333333333333333333333333333333333333333 7099 3333333333333333333333333333333333333333333333333333333 7100 3333333333333333333333333333333333333333333333333333333 7101 3333333333333333333333333333333333333333333333333333333 7102 3333333333333333333333333333333333333333333333333333333 7103 3333333333333333333333333333333333333333333333333333333 7104 3333333333333333333333333333333333333333333333333333333 7105 3333333333333333333333333333333333333333333333333333333 7106 3333333333333333333333333333333333333333333333333333333 7107 3333333333333333333333333333333333333333333333333333333 7108 3333333333333333333333333333333333333333333333333333333 7109 3333333333333333333333333333333333333333333333333333333 7110 3333333333333333333333333333333333333333333333333333333 7111 3333333333333333333333333333333333333333333333333333333 7112 3333333333333333333333333333333333333333333333333333333 7113 3333333333333333333333333333333333333333333333333333333 7114 3333333333333333333333333333333333333333333333333333333 7115 3333333333333333333333333333333333333333333333333333333 7116 3333333333333333333333333333333333333333333333333333333 7117 3333333333333333333333333333333333333333333333333333333 7118 3333333333333333333333333333333333333333333333333333333 7119 3333333333333333333333333333333333333333333333333333333 7120 3333333333333333333333333333333333333333333333333333333 7121 3333333333333333333333333333333333333333333333333333333 7122 3333333333333333333333333333333333333333333333333333333 7123 3333333333333333333333333333333333333333333333333333333 7124 3333333333333333333333333333333333333333333333333333333 7125 3333333333333333333333333333333333333333333333333333333 7126 3333333333333333333333333333333333333333333333333333333 7127 3333333333333333333333333333333333333333333333333333333 7128 3333333333333333333333333333333333333333333333333333333 7129 3333333333333333333333333333333333333333333333333333333 7130 3333333333333333333333333333333333333333333333333333333 7131 3333333333333333333333333333333333333333333333333333333 7132 3333333333333333333333333333333333333333333333333333333 7133 3333333333333333333333333333333333333333333333333333333 7134 3333333333333333333333333333333333333333333333333333333 7135 3333333333333333333333333333333333333333333333333333333 7136 3333333333333333333333333333333333333333333333333333333 7137 3333333333333333333333333333333333333333333333333333333 7138 3333333333333333333333333333333333333333333333333333333 7139 3333333333333333333333333333333333333333333333333333333 7140 3333333333333333333333333333333333333333333333333333333 7141 3333333333333333333333333333333333333333333333333333333 7142 3333333333333333333333333333333333333333333333333333333 7143 3333333333333333333333333333333333333333333333333333333 7144 3333333333333333333333333333333333333333333333333333333 7145 3333333333333333333333333333333333333333333333333333333 7146 3333333333333333333333333333333333333333333333333333333 7147 3333333333333333333333333333333333333333333333333333333 7148 3333333333333333333333333333333333333333333333333333333 7149 3333333333333333333333333333333333333333333333333333333 7150 3333333333333333333333333333333333333333333333333333333 7151 3333333333333333333333333333333333333333333333333333333 7152 3333333333333333333333333333333333333333333333333333333 7153 3333333333333333333333333333333333333333333333333333333 7154 3333333333333333333333333333333333333333333333333333333 7155 3333333333333333333333333333333333333333333333333333333 7156 3333333333333333333333333333333333333333333333333333333 7157 3333333333333333333333333333333333333333333333333333333 7158 3333333333333333333333333333333333333333333333333333333 7159 3333333333333333333333333333333333333333333333333333333 7160 3333333333333333333333333333333333333333333333333333333 7161 3333333333333333333333333333333333333333333333333333333 7162 3333333333333333333333333333333333333333333333333333333 7163 3333333333333333333333333333333333333333333333333333333 7164 3333333333333333333333333333333333333333333333333333333 7165 3333333333333333333333333333333333333333333333333333333 7166 3333333333333333333333333333333333333333333333333333333 7167 3333333333333333333333333333333333333333333333333333333 7168 3333333333333333333333333333333333333333333333333333333 7169 3333333333333333333333333333333333333333333333333333333 7170 3333333333333333333333333333333333333333333333333333333 7171 3333333333333333333333333333333333333333333333333333333 7172 3333333333333333333333333333333333333333333333333333333 7173 3333333333333333333333333333333333333333333333333333333 7174 3333333333333333333333333333333333333333333333333333333 7175 3333333333333333333333333333333333333333333333333333333 7176 3333333333333333333333333333333333333333333333333333333 7177 3333333333333333333333333333333333333333333333333333333 7178 3333333333333333333333333333333333333333333333333333333 7179 3333333333333333333333333333333333333333333333333333333 7180 3333333333333333333333333333333333333333333333333333333 7181 3333333333333333333333333333333333333333333333333333333 7182 3333333333333333333333333333333333333333333333333333333 7183 3333333333333333333333333333333333333333333333333333333 7184 3333333333333333333333333333333333333333333333333333333 7185 3333333333333333333333333333333333333333333333333333333 7186 3333333333333333333333333333333333333333333333333333333 7187 3333333333333333333333333333333333333333333333333333333 7188 3333333333333333333333333333333333333333333333333333333 7189 3333333333333333333333333333333333333333333333333333333 7190 3333333333333333333333333333333333333333333333333333333 7191 3333333333333333333333333333333333333333333333333333333 7192 3333333333333333333333333333333333333333333333333333333 7193 3333333333333333333333333333333333333333333333333333333 7194 3333333333333333333333333333333333333333333333333333333 7195 3333333333333333333333333333333333333333333333333333333 7196 3333333333333333333333333333333333333333333333333333333 7197 3333333333333333333333333333333333333333333333333333333 7198 3333333333333333333333333333333333333333333333333333333 7199 3333333333333333333333333333333333333333333333333333333 7200 3333333333333333333333333333333333333333333333333333333 7201 3333333333333333333333333333333333333333333333333333333 7202 3333333333333333333333333333333333333333333333333333333 7203 3333333333333333333333333333333333333333333333333333333 7204 3333333333333333333333333333333333333333333333333333333 7205 3333333333333333333333333333333333333333333333333333333 7206 3333333333333333333333333333333333333333333333333333333 7207 3333333333333333333333333333333333333333333333333333333 7208 3333333333333333333333333333333333333333333333333333333 7209 3333333333333333333333333333333333333333333333333333333 7210 3333333333333333333333333333333333333333333333333333333 7211 3333333333333333333333333333333333333333333333333333333 7212 3333333333333333333333333333333333333333333333333333333 7213 3333333333333333333333333333333333333333333333333333333 7214 3333333333333333333333333333333333333333333333333333333 7215 3333333333333333333333333333333333333333333333333333333 7216 3333333333333333333333333333333333333333333333333333333 7217 3333333333333333333333333333333333333333333333333333333 7218 3333333333333333333333333333333333333333333333333333333 7219 3333333333333333333333333333333333333333333333333333333 7220 3333333333333333333333333333333333333333333333333333333 7221 3333333333333333333333333333333333333333333333333333333 7222 3333333333333333333333333333333333333333333333333333333 7223 3333333333333333333333333333333333333333333333333333333 7224 3333333333333333333333333333333333333333333333333333333 7225 3333333333333333333333333333333333333333333333333333333 7226 3333333333333333333333333333333333333333333333333333333 7227 3333333333333333333333333333333333333333333333333333333 7228 3333333333333333333333333333333333333333333333333333333 7229 3333333333333333333333333333333333333333333333333333333 7230 3333333333333333333333333333333333333333333333333333333 7231 3333333333333333333333333333333333333333333333333333333 7232 3333333333333333333333333333333333333333333333333333333 7233 3333333333333333333333333333333333333333333333333333333 7234 3333333333333333333333333333333333333333333333333333333 7235 3333333333333333333333333333333333333333333333333333333 7236 3333333333333333333333333333333333333333333333333333333 7237 3333333333333333333333333333333333333333333333333333333 7238 3333333333333333333333333333333333333333333333333333333 7239 3333333333333333333333333333333333333333333333333333333 7240 3333333333333333333333333333333333333333333333333333333 7241 3333333333333333333333333333333333333333333333333333333 7242 3333333333333333333333333333333333333333333333333333333 7243 3333333333333333333333333333333333333333333333333333333 7244 3333333333333333333333333333333333333333333333333333333 7245 3333333333333333333333333333333333333333333333333333333 7246 3333333333333333333333333333333333333333333333333333333 7247 3333333333333333333333333333333333333333333333333333333 7248 3333333333333333333333333333333333333333333333333333333 7249 3333333333333333333333333333333333333333333333333333333 7250 3333333333333333333333333333333333333333333333333333333 7251 3333333333333333333333333333333333333333333333333333333 7252 3333333333333333333333333333333333333333333333333333333 7253 3333333333333333333333333333333333333333333333333333333 7254 3333333333333333333333333333333333333333333333333333333 7255 3333333333333333333333333333333333333333333333333333333 7256 3333333333333333333333333333333333333333333333333333333 7257 3333333333333333333333333333333333333333333333333333333 7258 3333333333333333333333333333333333333333333333333333333 7259 3333333333333333333333333333333333333333333333333333333 7260 3333333333333333333333333333333333333333333333333333333 7261 3333333333333333333333333333333333333333333333333333333 7262 3333333333333333333333333333333333333333333333333333333 7263 3333333333333333333333333333333333333333333333333333333 7264 3333333333333333333333333333333333333333333333333333333 7265 3333333333333333333333333333333333333333333333333333333 7266 3333333333333333333333333333333333333333333333333333333 7267 3333333333333333333333333333333333333333333333333333333 7268 3333333333333333333333333333333333333333333333333333333 7269 3333333333333333333333333333333333333333333333333333333 7270 3333333333333333333333333333333333333333333333333333333 7271 3333333333333333333333333333333333333333333333333333333 7272 3333333333333333333333333333333333333333333333333333333 7273 3333333333333333333333333333333333333333333333333333333 7274 3333333333333333333333333333333333333333333333333333333 7275 3333333333333333333333333333333333333333333333333333333 7276 3333333333333333333333333333333333333333333333333333333 7277 3333333333333333333333333333333333333333333333333333333 7278 3333333333333333333333333333333333333333333333333333333 7279 3333333333333333333333333333333333333333333333333333333 7280 3333333333333333333333333333333333333333333333333333333 7281 3333333333333333333333333333333333333333333333333333333 7282 3333333333333333333333333333333333333333333333333333333 7283 3333333333333333333333333333333333333333333333333333333 7284 3333333333333333333333333333333333333333333333333333333 7285 3333333333333333333333333333333333333333333333333333333 7286 3333333333333333333333333333333333333333333333333333333 7287 3333333333333333333333333333333333333333333333333333333 7288 3333333333333333333333333333333333333333333333333333333 7289 3333333333333333333333333333333333333333333333333333333 7290 3333333333333333333333333333333333333333333333333333333 7291 3333333333333333333333333333333333333333333333333333333 7292 3333333333333333333333333333333333333333333333333333333 7293 3333333333333333333333333333333333333333333333333333333 7294 3333333333333333333333333333333333333333333333333333333 7295 3333333333333333333333333333333333333333333333333333333 7296 3333333333333333333333333333333333333333333333333333333 7297 3333333333333333333333333333333333333333333333333333333 7298 3333333333333333333333333333333333333333333333333333333 7299 3333333333333333333333333333333333333333333333333333333 7300 3333333333333333333333333333333333333333333333333333333 7301 3333333333333333333333333333333333333333333333333333333 7302 3333333333333333333333333333333333333333333333333333333 7303 3333333333333333333333333333333333333333333333333333333 7304 3333333333333333333333333333333333333333333333333333333 7305 3333333333333333333333333333333333333333333333333333333 7306 3333333333333333333333333333333333333333333333333333333 7307 3333333333333333333333333333333333333333333333333333333 7308 3333333333333333333333333333333333333333333333333333333 7309 3333333333333333333333333333333333333333333333333333333 7310 3333333333333333333333333333333333333333333333333333333 7311 3333333333333333333333333333333333333333333333333333333 7312 3333333333333333333333333333333333333333333333333333333 7313 3333333333333333333333333333333333333333333333333333333 7314 3333333333333333333333333333333333333333333333333333333 7315 3333333333333333333333333333333333333333333333333333333 7316 3333333333333333333333333333333333333333333333333333333 7317 3333333333333333333333333333333333333333333333333333333 7318 3333333333333333333333333333333333333333333333333333333 7319 3333333333333333333333333333333333333333333333333333333 7320 3333333333333333333333333333333333333333333333333333333 7321 3333333333333333333333333333333333333333333333333333333 7322 3333333333333333333333333333333333333333333333333333333 7323 3333333333333333333333333333333333333333333333333333333 7324 3333333333333333333333333333333333333333333333333333333 7325 3333333333333333333333333333333333333333333333333333333 7326 3333333333333333333333333333333333333333333333333333333 7327 3333333333333333333333333333333333333333333333333333333 7328 3333333333333333333333333333333333333333333333333333333 7329 3333333333333333333333333333333333333333333333333333333 7330 3333333333333333333333333333333333333333333333333333333 7331 3333333333333333333333333333333333333333333333333333333 7332 3333333333333333333333333333333333333333333333333333333 7333 3333333333333333333333333333333333333333333333333333333 7334 3333333333333333333333333333333333333333333333333333333 7335 3333333333333333333333333333333333333333333333333333333 7336 3333333333333333333333333333333333333333333333333333333 7337 3333333333333333333333333333333333333333333333333333333 7338 3333333333333333333333333333333333333333333333333333333 7339 3333333333333333333333333333333333333333333333333333333 7340 3333333333333333333333333333333333333333333333333333333 7341 3333333333333333333333333333333333333333333333333333333 7342 3333333333333333333333333333333333333333333333333333333 7343 3333333333333333333333333333333333333333333333333333333 7344 3333333333333333333333333333333333333333333333333333333 7345 3333333333333333333333333333333333333333333333333333333 7346 3333333333333333333333333333333333333333333333333333333 7347 3333333333333333333333333333333333333333333333333333333 7348 3333333333333333333333333333333333333333333333333333333 7349 3333333333333333333333333333333333333333333333333333333 7350 3333333333333333333333333333333333333333333333333333333 7351 3333333333333333333333333333333333333333333333333333333 7352 3333333333333333333333333333333333333333333333333333333 7353 3333333333333333333333333333333333333333333333333333333 7354 3333333333333333333333333333333333333333333333333333333 7355 3333333333333333333333333333333333333333333333333333333 7356 3333333333333333333333333333333333333333333333333333333 7357 3333333333333333333333333333333333333333333333333333333 7358 3333333333333333333333333333333333333333333333333333333 7359 3333333333333333333333333333333333333333333333333333333 7360 3333333333333333333333333333333333333333333333333333333 7361 3333333333333333333333333333333333333333333333333333333 7362 3333333333333333333333333333333333333333333333333333333 7363 3333333333333333333333333333333333333333333333333333333 7364 3333333333333333333333333333333333333333333333333333333 7365 3333333333333333333333333333333333333333333333333333333 7366 3333333333333333333333333333333333333333333333333333333 7367 3333333333333333333333333333333333333333333333333333333 7368 3333333333333333333333333333333333333333333333333333333 7369 3333333333333333333333333333333333333333333333333333333 7370 3333333333333333333333333333333333333333333333333333333 7371 3333333333333333333333333333333333333333333333333333333 7372 3333333333333333333333333333333333333333333333333333333 7373 3333333333333333333333333333333333333333333333333333333 7374 3333333333333333333333333333333333333333333333333333333 7375 3333333333333333333333333333333333333333333333333333333 7376 3333333333333333333333333333333333333333333333333333333 7377 3333333333333333333333333333333333333333333333333333333 7378 3333333333333333333333333333333333333333333333333333333 7379 3333333333333333333333333333333333333333333333333333333 7380 3333333333333333333333333333333333333333333333333333333 7381 3333333333333333333333333333333333333333333333333333333 7382 3333333333333333333333333333333333333333333333333333333 7383 3333333333333333333333333333333333333333333333333333333 7384 3333333333333333333333333333333333333333333333333333333 7385 3333333333333333333333333333333333333333333333333333333 7386 3333333333333333333333333333333333333333333333333333333 7387 3333333333333333333333333333333333333333333333333333333 7388 3333333333333333333333333333333333333333333333333333333 7389 3333333333333333333333333333333333333333333333333333333 7390 3333333333333333333333333333333333333333333333333333333 7391 3333333333333333333333333333333333333333333333333333333 7392 3333333333333333333333333333333333333333333333333333333 7393 3333333333333333333333333333333333333333333333333333333 7394 3333333333333333333333333333333333333333333333333333333 7395 3333333333333333333333333333333333333333333333333333333 7396 3333333333333333333333333333333333333333333333333333333 7397 3333333333333333333333333333333333333333333333333333333 7398 3333333333333333333333333333333333333333333333333333333 7399 3333333333333333333333333333333333333333333333333333333 7400 3333333333333333333333333333333333333333333333333333333 7401 3333333333333333333333333333333333333333333333333333333 7402 3333333333333333333333333333333333333333333333333333333 7403 3333333333333333333333333333333333333333333333333333333 7404 3333333333333333333333333333333333333333333333333333333 7405 3333333333333333333333333333333333333333333333333333333 7406 3333333333333333333333333333333333333333333333333333333 7407 3333333333333333333333333333333333333333333333333333333 7408 3333333333333333333333333333333333333333333333333333333 7409 3333333333333333333333333333333333333333333333333333333 7410 3333333333333333333333333333333333333333333333333333333 7411 3333333333333333333333333333333333333333333333333333333 7412 3333333333333333333333333333333333333333333333333333333 7413 3333333333333333333333333333333333333333333333333333333 7414 3333333333333333333333333333333333333333333333333333333 7415 3333333333333333333333333333333333333333333333333333333 7416 3333333333333333333333333333333333333333333333333333333 7417 3333333333333333333333333333333333333333333333333333333 7418 3333333333333333333333333333333333333333333333333333333 7419 3333333333333333333333333333333333333333333333333333333 7420 3333333333333333333333333333333333333333333333333333333 7421 3333333333333333333333333333333333333333333333333333333 7422 3333333333333333333333333333333333333333333333333333333 7423 3333333333333333333333333333333333333333333333333333333 7424 3333333333333333333333333333333333333333333333333333333 7425 3333333333333333333333333333333333333333333333333333333 7426 3333333333333333333333333333333333333333333333333333333 7427 3333333333333333333333333333333333333333333333333333333 7428 3333333333333333333333333333333333333333333333333333333 7429 3333333333333333333333333333333333333333333333333333333 7430 3333333333333333333333333333333333333333333333333333333 7431 3333333333333333333333333333333333333333333333333333333 7432 3333333333333333333333333333333333333333333333333333333 7433 3333333333333333333333333333333333333333333333333333333 7434 3333333333333333333333333333333333333333333333333333333 7435 3333333333333333333333333333333333333333333333333333333 7436 3333333333333333333333333333333333333333333333333333333 7437 3333333333333333333333333333333333333333333333333333333 7438 3333333333333333333333333333333333333333333333333333333 7439 3333333333333333333333333333333333333333333333333333333 7440 3333333333333333333333333333333333333333333333333333333 7441 3333333333333333333333333333333333333333333333333333333 7442 3333333333333333333333333333333333333333333333333333333 7443 3333333333333333333333333333333333333333333333333333333 7444 3333333333333333333333333333333333333333333333333333333 7445 3333333333333333333333333333333333333333333333333333333 7446 3333333333333333333333333333333333333333333333333333333 7447 3333333333333333333333333333333333333333333333333333333 7448 3333333333333333333333333333333333333333333333333333333 7449 3333333333333333333333333333333333333333333333333333333 7450 3333333333333333333333333333333333333333333333333333333 7451 3333333333333333333333333333333333333333333333333333333 7452 3333333333333333333333333333333333333333333333333333333 7453 3333333333333333333333333333333333333333333333333333333 7454 3333333333333333333333333333333333333333333333333333333 7455 3333333333333333333333333333333333333333333333333333333 7456 3333333333333333333333333333333333333333333333333333333 7457 3333333333333333333333333333333333333333333333333333333 7458 3333333333333333333333333333333333333333333333333333333 7459 3333333333333333333333333333333333333333333333333333333 7460 3333333333333333333333333333333333333333333333333333333 7461 3333333333333333333333333333333333333333333333333333333 7462 3333333333333333333333333333333333333333333333333333333 7463 3333333333333333333333333333333333333333333333333333333 7464 3333333333333333333333333333333333333333333333333333333 7465 3333333333333333333333333333333333333333333333333333333 7466 3333333333333333333333333333333333333333333333333333333 7467 3333333333333333333333333333333333333333333333333333333 7468 3333333333333333333333333333333333333333333333333333333 7469 3333333333333333333333333333333333333333333333333333333 7470 3333333333333333333333333333333333333333333333333333333 7471 3333333333333333333333333333333333333333333333333333333 7472 3333333333333333333333333333333333333333333333333333333 7473 3333333333333333333333333333333333333333333333333333333 7474 3333333333333333333333333333333333333333333333333333333 7475 3333333333333333333333333333333333333333333333333333333 7476 3333333333333333333333333333333333333333333333333333333 7477 3333333333333333333333333333333333333333333333333333333 7478 3333333333333333333333333333333333333333333333333333333 7479 3333333333333333333333333333333333333333333333333333333 7480 3333333333333333333333333333333333333333333333333333333 7481 3333333333333333333333333333333333333333333333333333333 7482 3333333333333333333333333333333333333333333333333333333 7483 3333333333333333333333333333333333333333333333333333333 7484 3333333333333333333333333333333333333333333333333333333 7485 3333333333333333333333333333333333333333333333333333333 7486 3333333333333333333333333333333333333333333333333333333 7487 3333333333333333333333333333333333333333333333333333333 7488 3333333333333333333333333333333333333333333333333333333 7489 3333333333333333333333333333333333333333333333333333333 7490 3333333333333333333333333333333333333333333333333333333 7491 3333333333333333333333333333333333333333333333333333333 7492 3333333333333333333333333333333333333333333333333333333 7493 3333333333333333333333333333333333333333333333333333333 7494 3333333333333333333333333333333333333333333333333333333 7495 3333333333333333333333333333333333333333333333333333333 7496 3333333333333333333333333333333333333333333333333333333 7497 3333333333333333333333333333333333333333333333333333333 7498 3333333333333333333333333333333333333333333333333333333 7499 3333333333333333333333333333333333333333333333333333333 7500 3333333333333333333333333333333333333333333333333333333 7501 3333333333333333333333333333333333333333333333333333333 7502 3333333333333333333333333333333333333333333333333333333 7503 3333333333333333333333333333333333333333333333333333333 7504 3333333333333333333333333333333333333333333333333333333 7505 3333333333333333333333333333333333333333333333333333333 7506 3333333333333333333333333333333333333333333333333333333 7507 3333333333333333333333333333333333333333333333333333333 7508 3333333333333333333333333333333333333333333333333333333 7509 3333333333333333333333333333333333333333333333333333333 7510 3333333333333333333333333333333333333333333333333333333 7511 3333333333333333333333333333333333333333333333333333333 7512 3333333333333333333333333333333333333333333333333333333 7513 3333333333333333333333333333333333333333333333333333333 7514 3333333333333333333333333333333333333333333333333333333 7515 3333333333333333333333333333333333333333333333333333333 7516 3333333333333333333333333333333333333333333333333333333 7517 3333333333333333333333333333333333333333333333333333333 7518 3333333333333333333333333333333333333333333333333333333 7519 3333333333333333333333333333333333333333333333333333333 7520 3333333333333333333333333333333333333333333333333333333 7521 3333333333333333333333333333333333333333333333333333333 7522 3333333333333333333333333333333333333333333333333333333 7523 3333333333333333333333333333333333333333333333333333333 7524 3333333333333333333333333333333333333333333333333333333 7525 3333333333333333333333333333333333333333333333333333333 7526 3333333333333333333333333333333333333333333333333333333 7527 3333333333333333333333333333333333333333333333333333333 7528 3333333333333333333333333333333333333333333333333333333 7529 3333333333333333333333333333333333333333333333333333333 7530 3333333333333333333333333333333333333333333333333333333 7531 3333333333333333333333333333333333333333333333333333333 7532 3333333333333333333333333333333333333333333333333333333 7533 3333333333333333333333333333333333333333333333333333333 7534 3333333333333333333333333333333333333333333333333333333 7535 3333333333333333333333333333333333333333333333333333333 7536 3333333333333333333333333333333333333333333333333333333 7537 3333333333333333333333333333333333333333333333333333333 7538 3333333333333333333333333333333333333333333333333333333 7539 3333333333333333333333333333333333333333333333333333333 7540 3333333333333333333333333333333333333333333333333333333 7541 3333333333333333333333333333333333333333333333333333333 7542 3333333333333333333333333333333333333333333333333333333 7543 3333333333333333333333333333333333333333333333333333333 7544 3333333333333333333333333333333333333333333333333333333 7545 3333333333333333333333333333333333333333333333333333333 7546 3333333333333333333333333333333333333333333333333333333 7547 3333333333333333333333333333333333333333333333333333333 7548 3333333333333333333333333333333333333333333333333333333 7549 3333333333333333333333333333333333333333333333333333333 7550 3333333333333333333333333333333333333333333333333333333 7551 3333333333333333333333333333333333333333333333333333333 7552 3333333333333333333333333333333333333333333333333333333 7553 3333333333333333333333333333333333333333333333333333333 7554 3333333333333333333333333333333333333333333333333333333 7555 3333333333333333333333333333333333333333333333333333333 7556 3333333333333333333333333333333333333333333333333333333 7557 3333333333333333333333333333333333333333333333333333333 7558 3333333333333333333333333333333333333333333333333333333 7559 3333333333333333333333333333333333333333333333333333333 7560 3333333333333333333333333333333333333333333333333333333 7561 3333333333333333333333333333333333333333333333333333333 7562 3333333333333333333333333333333333333333333333333333333 7563 3333333333333333333333333333333333333333333333333333333 7564 3333333333333333333333333333333333333333333333333333333 7565 3333333333333333333333333333333333333333333333333333333 7566 3333333333333333333333333333333333333333333333333333333 7567 3333333333333333333333333333333333333333333333333333333 7568 3333333333333333333333333333333333333333333333333333333 7569 3333333333333333333333333333333333333333333333333333333 7570 3333333333333333333333333333333333333333333333333333333 7571 3333333333333333333333333333333333333333333333333333333 7572 3333333333333333333333333333333333333333333333333333333 7573 3333333333333333333333333333333333333333333333333333333 7574 3333333333333333333333333333333333333333333333333333333 7575 3333333333333333333333333333333333333333333333333333333 7576 3333333333333333333333333333333333333333333333333333333 7577 3333333333333333333333333333333333333333333333333333333 7578 3333333333333333333333333333333333333333333333333333333 7579 3333333333333333333333333333333333333333333333333333333 7580 3333333333333333333333333333333333333333333333333333333 7581 3333333333333333333333333333333333333333333333333333333 7582 3333333333333333333333333333333333333333333333333333333 7583 3333333333333333333333333333333333333333333333333333333 7584 3333333333333333333333333333333333333333333333333333333 7585 3333333333333333333333333333333333333333333333333333333 7586 3333333333333333333333333333333333333333333333333333333 7587 3333333333333333333333333333333333333333333333333333333 7588 3333333333333333333333333333333333333333333333333333333 7589 3333333333333333333333333333333333333333333333333333333 7590 3333333333333333333333333333333333333333333333333333333 7591 3333333333333333333333333333333333333333333333333333333 7592 3333333333333333333333333333333333333333333333333333333 7593 3333333333333333333333333333333333333333333333333333333 7594 3333333333333333333333333333333333333333333333333333333 7595 3333333333333333333333333333333333333333333333333333333 7596 3333333333333333333333333333333333333333333333333333333 7597 3333333333333333333333333333333333333333333333333333333 7598 3333333333333333333333333333333333333333333333333333333 7599 3333333333333333333333333333333333333333333333333333333 7600 3333333333333333333333333333333333333333333333333333333 7601 3333333333333333333333333333333333333333333333333333333 7602 3333333333333333333333333333333333333333333333333333333 7603 3333333333333333333333333333333333333333333333333333333 7604 3333333333333333333333333333333333333333333333333333333 7605 3333333333333333333333333333333333333333333333333333333 7606 3333333333333333333333333333333333333333333333333333333 7607 3333333333333333333333333333333333333333333333333333333 7608 3333333333333333333333333333333333333333333333333333333 7609 3333333333333333333333333333333333333333333333333333333 7610 3333333333333333333333333333333333333333333333333333333 7611 3333333333333333333333333333333333333333333333333333333 7612 3333333333333333333333333333333333333333333333333333333 7613 3333333333333333333333333333333333333333333333333333333 7614 3333333333333333333333333333333333333333333333333333333 7615 3333333333333333333333333333333333333333333333333333333 7616 3333333333333333333333333333333333333333333333333333333 7617 3333333333333333333333333333333333333333333333333333333 7618 3333333333333333333333333333333333333333333333333333333 7619 3333333333333333333333333333333333333333333333333333333 7620 3333333333333333333333333333333333333333333333333333333 7621 3333333333333333333333333333333333333333333333333333333 7622 3333333333333333333333333333333333333333333333333333333 7623 3333333333333333333333333333333333333333333333333333333 7624 3333333333333333333333333333333333333333333333333333333 7625 3333333333333333333333333333333333333333333333333333333 7626 3333333333333333333333333333333333333333333333333333333 7627 3333333333333333333333333333333333333333333333333333333 7628 3333333333333333333333333333333333333333333333333333333 7629 3333333333333333333333333333333333333333333333333333333 7630 3333333333333333333333333333333333333333333333333333333 7631 3333333333333333333333333333333333333333333333333333333 7632 3333333333333333333333333333333333333333333333333333333 7633 3333333333333333333333333333333333333333333333333333333 7634 3333333333333333333333333333333333333333333333333333333 7635 3333333333333333333333333333333333333333333333333333333 7636 3333333333333333333333333333333333333333333333333333333 7637 3333333333333333333333333333333333333333333333333333333 7638 3333333333333333333333333333333333333333333333333333333 7639 3333333333333333333333333333333333333333333333333333333 7640 3333333333333333333333333333333333333333333333333333333 7641 3333333333333333333333333333333333333333333333333333333 7642 3333333333333333333333333333333333333333333333333333333 7643 3333333333333333333333333333333333333333333333333333333 7644 3333333333333333333333333333333333333333333333333333333 7645 3333333333333333333333333333333333333333333333333333333 7646 3333333333333333333333333333333333333333333333333333333 7647 3333333333333333333333333333333333333333333333333333333 7648 3333333333333333333333333333333333333333333333333333333 7649 3333333333333333333333333333333333333333333333333333333 7650 3333333333333333333333333333333333333333333333333333333 7651 3333333333333333333333333333333333333333333333333333333 7652 3333333333333333333333333333333333333333333333333333333 7653 3333333333333333333333333333333333333333333333333333333 7654 3333333333333333333333333333333333333333333333333333333 7655 3333333333333333333333333333333333333333333333333333333 7656 3333333333333333333333333333333333333333333333333333333 7657 3333333333333333333333333333333333333333333333333333333 7658 3333333333333333333333333333333333333333333333333333333 7659 3333333333333333333333333333333333333333333333333333333 7660 3333333333333333333333333333333333333333333333333333333 7661 3333333333333333333333333333333333333333333333333333333 7662 3333333333333333333333333333333333333333333333333333333 7663 3333333333333333333333333333333333333333333333333333333 7664 3333333333333333333333333333333333333333333333333333333 7665 3333333333333333333333333333333333333333333333333333333 7666 3333333333333333333333333333333333333333333333333333333 7667 3333333333333333333333333333333333333333333333333333333 7668 3333333333333333333333333333333333333333333333333333333 7669 3333333333333333333333333333333333333333333333333333333 7670 3333333333333333333333333333333333333333333333333333333 7671 3333333333333333333333333333333333333333333333333333333 7672 3333333333333333333333333333333333333333333333333333333 7673 3333333333333333333333333333333333333333333333333333333 7674 3333333333333333333333333333333333333333333333333333333 7675 3333333333333333333333333333333333333333333333333333333 7676 3333333333333333333333333333333333333333333333333333333 7677 3333333333333333333333333333333333333333333333333333333 7678 3333333333333333333333333333333333333333333333333333333 7679 3333333333333333333333333333333333333333333333333333333 7680 3333333333333333333333333333333333333333333333333333333 7681 3333333333333333333333333333333333333333333333333333333 7682 3333333333333333333333333333333333333333333333333333333 7683 3333333333333333333333333333333333333333333333333333333 7684 3333333333333333333333333333333333333333333333333333333 7685 3333333333333333333333333333333333333333333333333333333 7686 3333333333333333333333333333333333333333333333333333333 7687 3333333333333333333333333333333333333333333333333333333 7688 3333333333333333333333333333333333333333333333333333333 7689 3333333333333333333333333333333333333333333333333333333 7690 3333333333333333333333333333333333333333333333333333333 7691 3333333333333333333333333333333333333333333333333333333 7692 3333333333333333333333333333333333333333333333333333333 7693 3333333333333333333333333333333333333333333333333333333 7694 3333333333333333333333333333333333333333333333333333333 7695 3333333333333333333333333333333333333333333333333333333 7696 3333333333333333333333333333333333333333333333333333333 7697 3333333333333333333333333333333333333333333333333333333 7698 3333333333333333333333333333333333333333333333333333333 7699 3333333333333333333333333333333333333333333333333333333 7700 3333333333333333333333333333333333333333333333333333333 7701 3333333333333333333333333333333333333333333333333333333 7702 3333333333333333333333333333333333333333333333333333333 7703 3333333333333333333333333333333333333333333333333333333 7704 3333333333333333333333333333333333333333333333333333333 7705 3333333333333333333333333333333333333333333333333333333 7706 3333333333333333333333333333333333333333333333333333333 7707 3333333333333333333333333333333333333333333333333333333 7708 3333333333333333333333333333333333333333333333333333333 7709 3333333333333333333333333333333333333333333333333333333 7710 3333333333333333333333333333333333333333333333333333333 7711 3333333333333333333333333333333333333333333333333333333 7712 3333333333333333333333333333333333333333333333333333333 7713 3333333333333333333333333333333333333333333333333333333 7714 3333333333333333333333333333333333333333333333333333333 7715 3333333333333333333333333333333333333333333333333333333 7716 3333333333333333333333333333333333333333333333333333333 7717 3333333333333333333333333333333333333333333333333333333 7718 3333333333333333333333333333333333333333333333333333333 7719 3333333333333333333333333333333333333333333333333333333 7720 3333333333333333333333333333333333333333333333333333333 7721 3333333333333333333333333333333333333333333333333333333 7722 3333333333333333333333333333333333333333333333333333333 7723 3333333333333333333333333333333333333333333333333333333 7724 3333333333333333333333333333333333333333333333333333333 7725 3333333333333333333333333333333333333333333333333333333 7726 3333333333333333333333333333333333333333333333333333333 7727 3333333333333333333333333333333333333333333333333333333 7728 3333333333333333333333333333333333333333333333333333333 7729 3333333333333333333333333333333333333333333333333333333 7730 3333333333333333333333333333333333333333333333333333333 7731 3333333333333333333333333333333333333333333333333333333 7732 3333333333333333333333333333333333333333333333333333333 7733 3333333333333333333333333333333333333333333333333333333 7734 3333333333333333333333333333333333333333333333333333333 7735 3333333333333333333333333333333333333333333333333333333 7736 3333333333333333333333333333333333333333333333333333333 7737 3333333333333333333333333333333333333333333333333333333 7738 3333333333333333333333333333333333333333333333333333333 7739 3333333333333333333333333333333333333333333333333333333 7740 3333333333333333333333333333333333333333333333333333333 7741 3333333333333333333333333333333333333333333333333333333 7742 3333333333333333333333333333333333333333333333333333333 7743 3333333333333333333333333333333333333333333333333333333 7744 3333333333333333333333333333333333333333333333333333333 7745 3333333333333333333333333333333333333333333333333333333 7746 3333333333333333333333333333333333333333333333333333333 7747 3333333333333333333333333333333333333333333333333333333 7748 3333333333333333333333333333333333333333333333333333333 7749 3333333333333333333333333333333333333333333333333333333 7750 3333333333333333333333333333333333333333333333333333333 7751 3333333333333333333333333333333333333333333333333333333 7752 3333333333333333333333333333333333333333333333333333333 7753 3333333333333333333333333333333333333333333333333333333 7754 3333333333333333333333333333333333333333333333333333333 7755 3333333333333333333333333333333333333333333333333333333 7756 3333333333333333333333333333333333333333333333333333333 7757 3333333333333333333333333333333333333333333333333333333 7758 3333333333333333333333333333333333333333333333333333333 7759 3333333333333333333333333333333333333333333333333333333 7760 3333333333333333333333333333333333333333333333333333333 7761 3333333333333333333333333333333333333333333333333333333 7762 3333333333333333333333333333333333333333333333333333333 7763 3333333333333333333333333333333333333333333333333333333 7764 3333333333333333333333333333333333333333333333333333333 7765 3333333333333333333333333333333333333333333333333333333 7766 3333333333333333333333333333333333333333333333333333333 7767 3333333333333333333333333333333333333333333333333333333 7768 3333333333333333333333333333333333333333333333333333333 7769 3333333333333333333333333333333333333333333333333333333 7770 3333333333333333333333333333333333333333333333333333333 7771 3333333333333333333333333333333333333333333333333333333 7772 3333333333333333333333333333333333333333333333333333333 7773 3333333333333333333333333333333333333333333333333333333 7774 3333333333333333333333333333333333333333333333333333333 7775 3333333333333333333333333333333333333333333333333333333 7776 3333333333333333333333333333333333333333333333333333333 7777 3333333333333333333333333333333333333333333333333333333 7778 3333333333333333333333333333333333333333333333333333333 7779 3333333333333333333333333333333333333333333333333333333 7780 3333333333333333333333333333333333333333333333333333333 7781 3333333333333333333333333333333333333333333333333333333 7782 3333333333333333333333333333333333333333333333333333333 7783 3333333333333333333333333333333333333333333333333333333 7784 3333333333333333333333333333333333333333333333333333333 7785 3333333333333333333333333333333333333333333333333333333 7786 3333333333333333333333333333333333333333333333333333333 7787 3333333333333333333333333333333333333333333333333333333 7788 3333333333333333333333333333333333333333333333333333333 7789 3333333333333333333333333333333333333333333333333333333 7790 3333333333333333333333333333333333333333333333333333333 7791 3333333333333333333333333333333333333333333333333333333 7792 3333333333333333333333333333333333333333333333333333333 7793 3333333333333333333333333333333333333333333333333333333 7794 3333333333333333333333333333333333333333333333333333333 7795 3333333333333333333333333333333333333333333333333333333 7796 3333333333333333333333333333333333333333333333333333333 7797 3333333333333333333333333333333333333333333333333333333 7798 3333333333333333333333333333333333333333333333333333333 7799 3333333333333333333333333333333333333333333333333333333 7800 3333333333333333333333333333333333333333333333333333333 7801 3333333333333333333333333333333333333333333333333333333 7802 3333333333333333333333333333333333333333333333333333333 7803 3333333333333333333333333333333333333333333333333333333 7804 3333333333333333333333333333333333333333333333333333333 7805 3333333333333333333333333333333333333333333333333333333 7806 3333333333333333333333333333333333333333333333333333333 7807 3333333333333333333333333333333333333333333333333333333 7808 3333333333333333333333333333333333333333333333333333333 7809 3333333333333333333333333333333333333333333333333333333 7810 3333333333333333333333333333333333333333333333333333333 7811 3333333333333333333333333333333333333333333333333333333 7812 3333333333333333333333333333333333333333333333333333333 7813 3333333333333333333333333333333333333333333333333333333 7814 3333333333333333333333333333333333333333333333333333333 7815 3333333333333333333333333333333333333333333333333333333 7816 3333333333333333333333333333333333333333333333333333333 7817 3333333333333333333333333333333333333333333333333333333 7818 3333333333333333333333333333333333333333333333333333333 7819 3333333333333333333333333333333333333333333333333333333 7820 3333333333333333333333333333333333333333333333333333333 7821 3333333333333333333333333333333333333333333333333333333 7822 3333333333333333333333333333333333333333333333333333333 7823 3333333333333333333333333333333333333333333333333333333 7824 3333333333333333333333333333333333333333333333333333333 7825 3333333333333333333333333333333333333333333333333333333 7826 3333333333333333333333333333333333333333333333333333333 7827 3333333333333333333333333333333333333333333333333333333 7828 3333333333333333333333333333333333333333333333333333333 7829 3333333333333333333333333333333333333333333333333333333 7830 3333333333333333333333333333333333333333333333333333333 7831 3333333333333333333333333333333333333333333333333333333 7832 3333333333333333333333333333333333333333333333333333333 7833 3333333333333333333333333333333333333333333333333333333 7834 3333333333333333333333333333333333333333333333333333333 7835 3333333333333333333333333333333333333333333333333333333 7836 3333333333333333333333333333333333333333333333333333333 7837 3333333333333333333333333333333333333333333333333333333 7838 3333333333333333333333333333333333333333333333333333333 7839 3333333333333333333333333333333333333333333333333333333 7840 3333333333333333333333333333333333333333333333333333333 7841 3333333333333333333333333333333333333333333333333333333 7842 3333333333333333333333333333333333333333333333333333333 7843 3333333333333333333333333333333333333333333333333333333 7844 3333333333333333333333333333333333333333333333333333333 7845 3333333333333333333333333333333333333333333333333333333 7846 3333333333333333333333333333333333333333333333333333333 7847 3333333333333333333333333333333333333333333333333333333 7848 3333333333333333333333333333333333333333333333333333333 7849 3333333333333333333333333333333333333333333333333333333 7850 3333333333333333333333333333333333333333333333333333333 7851 3333333333333333333333333333333333333333333333333333333 7852 3333333333333333333333333333333333333333333333333333333 7853 3333333333333333333333333333333333333333333333333333333 7854 3333333333333333333333333333333333333333333333333333333 7855 3333333333333333333333333333333333333333333333333333333 7856 3333333333333333333333333333333333333333333333333333333 7857 3333333333333333333333333333333333333333333333333333333 7858 3333333333333333333333333333333333333333333333333333333 7859 3333333333333333333333333333333333333333333333333333333 7860 3333333333333333333333333333333333333333333333333333333 7861 3333333333333333333333333333333333333333333333333333333 7862 3333333333333333333333333333333333333333333333333333333 7863 3333333333333333333333333333333333333333333333333333333 7864 3333333333333333333333333333333333333333333333333333333 7865 3333333333333333333333333333333333333333333333333333333 7866 3333333333333333333333333333333333333333333333333333333 7867 3333333333333333333333333333333333333333333333333333333 7868 3333333333333333333333333333333333333333333333333333333 7869 3333333333333333333333333333333333333333333333333333333 7870 3333333333333333333333333333333333333333333333333333333 7871 3333333333333333333333333333333333333333333333333333333 7872 3333333333333333333333333333333333333333333333333333333 7873 3333333333333333333333333333333333333333333333333333333 7874 3333333333333333333333333333333333333333333333333333333 7875 3333333333333333333333333333333333333333333333333333333 7876 3333333333333333333333333333333333333333333333333333333 7877 3333333333333333333333333333333333333333333333333333333 7878 3333333333333333333333333333333333333333333333333333333 7879 3333333333333333333333333333333333333333333333333333333 7880 3333333333333333333333333333333333333333333333333333333 7881 3333333333333333333333333333333333333333333333333333333 7882 3333333333333333333333333333333333333333333333333333333 7883 3333333333333333333333333333333333333333333333333333333 7884 3333333333333333333333333333333333333333333333333333333 7885 3333333333333333333333333333333333333333333333333333333 7886 3333333333333333333333333333333333333333333333333333333 7887 3333333333333333333333333333333333333333333333333333333 7888 3333333333333333333333333333333333333333333333333333333 7889 3333333333333333333333333333333333333333333333333333333 7890 3333333333333333333333333333333333333333333333333333333 7891 3333333333333333333333333333333333333333333333333333333 7892 3333333333333333333333333333333333333333333333333333333 7893 3333333333333333333333333333333333333333333333333333333 7894 3333333333333333333333333333333333333333333333333333333 7895 3333333333333333333333333333333333333333333333333333333 7896 3333333333333333333333333333333333333333333333333333333 7897 3333333333333333333333333333333333333333333333333333333 7898 3333333333333333333333333333333333333333333333333333333 7899 3333333333333333333333333333333333333333333333333333333 7900 3333333333333333333333333333333333333333333333333333333 7901 3333333333333333333333333333333333333333333333333333333 7902 3333333333333333333333333333333333333333333333333333333 7903 3333333333333333333333333333333333333333333333333333333 7904 3333333333333333333333333333333333333333333333333333333 7905 3333333333333333333333333333333333333333333333333333333 7906 3333333333333333333333333333333333333333333333333333333 7907 3333333333333333333333333333333333333333333333333333333 7908 3333333333333333333333333333333333333333333333333333333 7909 3333333333333333333333333333333333333333333333333333333 7910 3333333333333333333333333333333333333333333333333333333 7911 3333333333333333333333333333333333333333333333333333333 7912 3333333333333333333333333333333333333333333333333333333 7913 3333333333333333333333333333333333333333333333333333333 7914 3333333333333333333333333333333333333333333333333333333 7915 3333333333333333333333333333333333333333333333333333333 7916 3333333333333333333333333333333333333333333333333333333 7917 3333333333333333333333333333333333333333333333333333333 7918 3333333333333333333333333333333333333333333333333333333 7919 3333333333333333333333333333333333333333333333333333333 7920 3333333333333333333333333333333333333333333333333333333 7921 3333333333333333333333333333333333333333333333333333333 7922 3333333333333333333333333333333333333333333333333333333 7923 3333333333333333333333333333333333333333333333333333333 7924 3333333333333333333333333333333333333333333333333333333 7925 3333333333333333333333333333333333333333333333333333333 7926 3333333333333333333333333333333333333333333333333333333 7927 3333333333333333333333333333333333333333333333333333333 7928 3333333333333333333333333333333333333333333333333333333 7929 3333333333333333333333333333333333333333333333333333333 7930 3333333333333333333333333333333333333333333333333333333 7931 3333333333333333333333333333333333333333333333333333333 7932 3333333333333333333333333333333333333333333333333333333 7933 3333333333333333333333333333333333333333333333333333333 7934 3333333333333333333333333333333333333333333333333333333 7935 3333333333333333333333333333333333333333333333333333333 7936 3333333333333333333333333333333333333333333333333333333 7937 3333333333333333333333333333333333333333333333333333333 7938 3333333333333333333333333333333333333333333333333333333 7939 3333333333333333333333333333333333333333333333333333333 7940 3333333333333333333333333333333333333333333333333333333 7941 3333333333333333333333333333333333333333333333333333333 7942 3333333333333333333333333333333333333333333333333333333 7943 3333333333333333333333333333333333333333333333333333333 7944 3333333333333333333333333333333333333333333333333333333 7945 3333333333333333333333333333333333333333333333333333333 7946 3333333333333333333333333333333333333333333333333333333 7947 3333333333333333333333333333333333333333333333333333333 7948 3333333333333333333333333333333333333333333333333333333 7949 3333333333333333333333333333333333333333333333333333333 7950 3333333333333333333333333333333333333333333333333333333 7951 3333333333333333333333333333333333333333333333333333333 7952 3333333333333333333333333333333333333333333333333333333 7953 3333333333333333333333333333333333333333333333333333333 7954 3333333333333333333333333333333333333333333333333333333 7955 3333333333333333333333333333333333333333333333333333333 7956 3333333333333333333333333333333333333333333333333333333 7957 3333333333333333333333333333333333333333333333333333333 7958 3333333333333333333333333333333333333333333333333333333 7959 3333333333333333333333333333333333333333333333333333333 7960 3333333333333333333333333333333333333333333333333333333 7961 3333333333333333333333333333333333333333333333333333333 7962 3333333333333333333333333333333333333333333333333333333 7963 3333333333333333333333333333333333333333333333333333333 7964 3333333333333333333333333333333333333333333333333333333 7965 3333333333333333333333333333333333333333333333333333333 7966 3333333333333333333333333333333333333333333333333333333 7967 3333333333333333333333333333333333333333333333333333333 7968 3333333333333333333333333333333333333333333333333333333 7969 3333333333333333333333333333333333333333333333333333333 7970 3333333333333333333333333333333333333333333333333333333 7971 3333333333333333333333333333333333333333333333333333333 7972 3333333333333333333333333333333333333333333333333333333 7973 3333333333333333333333333333333333333333333333333333333 7974 3333333333333333333333333333333333333333333333333333333 7975 3333333333333333333333333333333333333333333333333333333 7976 3333333333333333333333333333333333333333333333333333333 7977 3333333333333333333333333333333333333333333333333333333 7978 3333333333333333333333333333333333333333333333333333333 7979 3333333333333333333333333333333333333333333333333333333 7980 3333333333333333333333333333333333333333333333333333333 7981 3333333333333333333333333333333333333333333333333333333 7982 3333333333333333333333333333333333333333333333333333333 7983 3333333333333333333333333333333333333333333333333333333 7984 3333333333333333333333333333333333333333333333333333333 7985 3333333333333333333333333333333333333333333333333333333 7986 3333333333333333333333333333333333333333333333333333333 7987 3333333333333333333333333333333333333333333333333333333 7988 3333333333333333333333333333333333333333333333333333333 7989 3333333333333333333333333333333333333333333333333333333 7990 3333333333333333333333333333333333333333333333333333333 7991 3333333333333333333333333333333333333333333333333333333 7992 3333333333333333333333333333333333333333333333333333333 7993 3333333333333333333333333333333333333333333333333333333 7994 3333333333333333333333333333333333333333333333333333333 7995 3333333333333333333333333333333333333333333333333333333 7996 3333333333333333333333333333333333333333333333333333333 7997 3333333333333333333333333333333333333333333333333333333 7998 3333333333333333333333333333333333333333333333333333333 7999 3333333333333333333333333333333333333333333333333333333 8000 3333333333333333333333333333333333333333333333333333333 8001 3333333333333333333333333333333333333333333333333333333 8002 3333333333333333333333333333333333333333333333333333333 8003 3333333333333333333333333333333333333333333333333333333 8004 3333333333333333333333333333333333333333333333333333333 8005 3333333333333333333333333333333333333333333333333333333 8006 3333333333333333333333333333333333333333333333333333333 8007 3333333333333333333333333333333333333333333333333333333 8008 3333333333333333333333333333333333333333333333333333333 8009 3333333333333333333333333333333333333333333333333333333 8010 3333333333333333333333333333333333333333333333333333333 8011 3333333333333333333333333333333333333333333333333333333 8012 3333333333333333333333333333333333333333333333333333333 8013 3333333333333333333333333333333333333333333333333333333 8014 3333333333333333333333333333333333333333333333333333333 8015 3333333333333333333333333333333333333333333333333333333 8016 3333333333333333333333333333333333333333333333333333333 8017 3333333333333333333333333333333333333333333333333333333 8018 3333333333333333333333333333333333333333333333333333333 8019 3333333333333333333333333333333333333333333333333333333 8020 3333333333333333333333333333333333333333333333333333333 8021 3333333333333333333333333333333333333333333333333333333 8022 3333333333333333333333333333333333333333333333333333333 8023 3333333333333333333333333333333333333333333333333333333 8024 3333333333333333333333333333333333333333333333333333333 8025 3333333333333333333333333333333333333333333333333333333 8026 3333333333333333333333333333333333333333333333333333333 8027 3333333333333333333333333333333333333333333333333333333 8028 3333333333333333333333333333333333333333333333333333333 8029 3333333333333333333333333333333333333333333333333333333 8030 3333333333333333333333333333333333333333333333333333333 8031 3333333333333333333333333333333333333333333333333333333 8032 3333333333333333333333333333333333333333333333333333333 8033 3333333333333333333333333333333333333333333333333333333 8034 3333333333333333333333333333333333333333333333333333333 8035 3333333333333333333333333333333333333333333333333333333 8036 3333333333333333333333333333333333333333333333333333333 8037 3333333333333333333333333333333333333333333333333333333 8038 3333333333333333333333333333333333333333333333333333333 8039 3333333333333333333333333333333333333333333333333333333 8040 3333333333333333333333333333333333333333333333333333333 8041 3333333333333333333333333333333333333333333333333333333 8042 3333333333333333333333333333333333333333333333333333333 8043 3333333333333333333333333333333333333333333333333333333 8044 3333333333333333333333333333333333333333333333333333333 8045 3333333333333333333333333333333333333333333333333333333 8046 3333333333333333333333333333333333333333333333333333333 8047 3333333333333333333333333333333333333333333333333333333 8048 3333333333333333333333333333333333333333333333333333333 8049 3333333333333333333333333333333333333333333333333333333 8050 3333333333333333333333333333333333333333333333333333333 8051 3333333333333333333333333333333333333333333333333333333 8052 3333333333333333333333333333333333333333333333333333333 8053 3333333333333333333333333333333333333333333333333333333 8054 3333333333333333333333333333333333333333333333333333333 8055 3333333333333333333333333333333333333333333333333333333 8056 3333333333333333333333333333333333333333333333333333333 8057 3333333333333333333333333333333333333333333333333333333 8058 3333333333333333333333333333333333333333333333333333333 8059 3333333333333333333333333333333333333333333333333333333 8060 3333333333333333333333333333333333333333333333333333333 8061 3333333333333333333333333333333333333333333333333333333 8062 3333333333333333333333333333333333333333333333333333333 8063 3333333333333333333333333333333333333333333333333333333 8064 3333333333333333333333333333333333333333333333333333333 8065 3333333333333333333333333333333333333333333333333333333 8066 3333333333333333333333333333333333333333333333333333333 8067 3333333333333333333333333333333333333333333333333333333 8068 3333333333333333333333333333333333333333333333333333333 8069 3333333333333333333333333333333333333333333333333333333 8070 3333333333333333333333333333333333333333333333333333333 8071 3333333333333333333333333333333333333333333333333333333 8072 3333333333333333333333333333333333333333333333333333333 8073 3333333333333333333333333333333333333333333333333333333 8074 3333333333333333333333333333333333333333333333333333333 8075 3333333333333333333333333333333333333333333333333333333 8076 3333333333333333333333333333333333333333333333333333333 8077 3333333333333333333333333333333333333333333333333333333 8078 3333333333333333333333333333333333333333333333333333333 8079 3333333333333333333333333333333333333333333333333333333 8080 3333333333333333333333333333333333333333333333333333333 8081 3333333333333333333333333333333333333333333333333333333 8082 3333333333333333333333333333333333333333333333333333333 8083 3333333333333333333333333333333333333333333333333333333 8084 3333333333333333333333333333333333333333333333333333333 8085 3333333333333333333333333333333333333333333333333333333 8086 3333333333333333333333333333333333333333333333333333333 8087 3333333333333333333333333333333333333333333333333333333 8088 3333333333333333333333333333333333333333333333333333333 8089 3333333333333333333333333333333333333333333333333333333 8090 3333333333333333333333333333333333333333333333333333333 8091 3333333333333333333333333333333333333333333333333333333 8092 3333333333333333333333333333333333333333333333333333333 8093 3333333333333333333333333333333333333333333333333333333 8094 3333333333333333333333333333333333333333333333333333333 8095 3333333333333333333333333333333333333333333333333333333 8096 3333333333333333333333333333333333333333333333333333333 8097 3333333333333333333333333333333333333333333333333333333 8098 3333333333333333333333333333333333333333333333333333333 8099 3333333333333333333333333333333333333333333333333333333 8100 3333333333333333333333333333333333333333333333333333333 8101 3333333333333333333333333333333333333333333333333333333 8102 3333333333333333333333333333333333333333333333333333333 8103 3333333333333333333333333333333333333333333333333333333 8104 3333333333333333333333333333333333333333333333333333333 8105 3333333333333333333333333333333333333333333333333333333 8106 3333333333333333333333333333333333333333333333333333333 8107 3333333333333333333333333333333333333333333333333333333 8108 3333333333333333333333333333333333333333333333333333333 8109 3333333333333333333333333333333333333333333333333333333 8110 3333333333333333333333333333333333333333333333333333333 8111 3333333333333333333333333333333333333333333333333333333 8112 3333333333333333333333333333333333333333333333333333333 8113 3333333333333333333333333333333333333333333333333333333 8114 3333333333333333333333333333333333333333333333333333333 8115 3333333333333333333333333333333333333333333333333333333 8116 3333333333333333333333333333333333333333333333333333333 8117 3333333333333333333333333333333333333333333333333333333 8118 3333333333333333333333333333333333333333333333333333333 8119 3333333333333333333333333333333333333333333333333333333 8120 3333333333333333333333333333333333333333333333333333333 8121 3333333333333333333333333333333333333333333333333333333 8122 3333333333333333333333333333333333333333333333333333333 8123 3333333333333333333333333333333333333333333333333333333 8124 3333333333333333333333333333333333333333333333333333333 8125 3333333333333333333333333333333333333333333333333333333 8126 3333333333333333333333333333333333333333333333333333333 8127 3333333333333333333333333333333333333333333333333333333 8128 3333333333333333333333333333333333333333333333333333333 8129 3333333333333333333333333333333333333333333333333333333 8130 3333333333333333333333333333333333333333333333333333333 8131 3333333333333333333333333333333333333333333333333333333 8132 3333333333333333333333333333333333333333333333333333333 8133 3333333333333333333333333333333333333333333333333333333 8134 3333333333333333333333333333333333333333333333333333333 8135 3333333333333333333333333333333333333333333333333333333 8136 3333333333333333333333333333333333333333333333333333333 8137 3333333333333333333333333333333333333333333333333333333 8138 3333333333333333333333333333333333333333333333333333333 8139 3333333333333333333333333333333333333333333333333333333 8140 3333333333333333333333333333333333333333333333333333333 8141 3333333333333333333333333333333333333333333333333333333 8142 3333333333333333333333333333333333333333333333333333333 8143 3333333333333333333333333333333333333333333333333333333 8144 3333333333333333333333333333333333333333333333333333333 8145 3333333333333333333333333333333333333333333333333333333 8146 3333333333333333333333333333333333333333333333333333333 8147 3333333333333333333333333333333333333333333333333333333 8148 3333333333333333333333333333333333333333333333333333333 8149 3333333333333333333333333333333333333333333333333333333 8150 3333333333333333333333333333333333333333333333333333333 8151 3333333333333333333333333333333333333333333333333333333 8152 3333333333333333333333333333333333333333333333333333333 8153 3333333333333333333333333333333333333333333333333333333 8154 3333333333333333333333333333333333333333333333333333333 8155 3333333333333333333333333333333333333333333333333333333 8156 3333333333333333333333333333333333333333333333333333333 8157 3333333333333333333333333333333333333333333333333333333 8158 3333333333333333333333333333333333333333333333333333333 8159 3333333333333333333333333333333333333333333333333333333 8160 3333333333333333333333333333333333333333333333333333333 8161 3333333333333333333333333333333333333333333333333333333 8162 3333333333333333333333333333333333333333333333333333333 8163 3333333333333333333333333333333333333333333333333333333 8164 3333333333333333333333333333333333333333333333333333333 8165 3333333333333333333333333333333333333333333333333333333 8166 3333333333333333333333333333333333333333333333333333333 8167 3333333333333333333333333333333333333333333333333333333 8168 3333333333333333333333333333333333333333333333333333333 8169 3333333333333333333333333333333333333333333333333333333 8170 3333333333333333333333333333333333333333333333333333333 8171 3333333333333333333333333333333333333333333333333333333 8172 3333333333333333333333333333333333333333333333333333333 8173 3333333333333333333333333333333333333333333333333333333 8174 3333333333333333333333333333333333333333333333333333333 8175 3333333333333333333333333333333333333333333333333333333 8176 3333333333333333333333333333333333333333333333333333333 8177 3333333333333333333333333333333333333333333333333333333 8178 3333333333333333333333333333333333333333333333333333333 8179 3333333333333333333333333333333333333333333333333333333 8180 3333333333333333333333333333333333333333333333333333333 8181 3333333333333333333333333333333333333333333333333333333 8182 3333333333333333333333333333333333333333333333333333333 8183 3333333333333333333333333333333333333333333333333333333 8184 3333333333333333333333333333333333333333333333333333333 8185 3333333333333333333333333333333333333333333333333333333 8186 3333333333333333333333333333333333333333333333333333333 8187 3333333333333333333333333333333333333333333333333333333 8188 3333333333333333333333333333333333333333333333333333333 8189 3333333333333333333333333333333333333333333333333333333 8190 3333333333333333333333333333333333333333333333333333333 8191 3333333333333333333333333333333333333333333333333333333 8192 3333333333333333333333333333333333333333333333333333333 8193 3333333333333333333333333333333333333333333333333333333 8194 3333333333333333333333333333333333333333333333333333333 8195 3333333333333333333333333333333333333333333333333333333 8196 3333333333333333333333333333333333333333333333333333333 8197 3333333333333333333333333333333333333333333333333333333 8198 3333333333333333333333333333333333333333333333333333333 8199 3333333333333333333333333333333333333333333333333333333 8200 3333333333333333333333333333333333333333333333333333333 8201 3333333333333333333333333333333333333333333333333333333 8202 3333333333333333333333333333333333333333333333333333333 8203 3333333333333333333333333333333333333333333333333333333 8204 3333333333333333333333333333333333333333333333333333333 8205 3333333333333333333333333333333333333333333333333333333 8206 3333333333333333333333333333333333333333333333333333333 8207 3333333333333333333333333333333333333333333333333333333 8208 3333333333333333333333333333333333333333333333333333333 8209 3333333333333333333333333333333333333333333333333333333 8210 3333333333333333333333333333333333333333333333333333333 8211 3333333333333333333333333333333333333333333333333333333 8212 3333333333333333333333333333333333333333333333333333333 8213 3333333333333333333333333333333333333333333333333333333 8214 3333333333333333333333333333333333333333333333333333333 8215 3333333333333333333333333333333333333333333333333333333 8216 3333333333333333333333333333333333333333333333333333333 8217 3333333333333333333333333333333333333333333333333333333 8218 3333333333333333333333333333333333333333333333333333333 8219 3333333333333333333333333333333333333333333333333333333 8220 3333333333333333333333333333333333333333333333333333333 8221 3333333333333333333333333333333333333333333333333333333 8222 3333333333333333333333333333333333333333333333333333333 8223 3333333333333333333333333333333333333333333333333333333 8224 3333333333333333333333333333333333333333333333333333333 8225 3333333333333333333333333333333333333333333333333333333 8226 3333333333333333333333333333333333333333333333333333333 8227 3333333333333333333333333333333333333333333333333333333 8228 3333333333333333333333333333333333333333333333333333333 8229 3333333333333333333333333333333333333333333333333333333 8230 3333333333333333333333333333333333333333333333333333333 8231 3333333333333333333333333333333333333333333333333333333 8232 3333333333333333333333333333333333333333333333333333333 8233 3333333333333333333333333333333333333333333333333333333 8234 3333333333333333333333333333333333333333333333333333333 8235 3333333333333333333333333333333333333333333333333333333 8236 3333333333333333333333333333333333333333333333333333333 8237 3333333333333333333333333333333333333333333333333333333 8238 3333333333333333333333333333333333333333333333333333333 8239 3333333333333333333333333333333333333333333333333333333 8240 3333333333333333333333333333333333333333333333333333333 8241 3333333333333333333333333333333333333333333333333333333 8242 3333333333333333333333333333333333333333333333333333333 8243 3333333333333333333333333333333333333333333333333333333 8244 3333333333333333333333333333333333333333333333333333333 8245 3333333333333333333333333333333333333333333333333333333 8246 3333333333333333333333333333333333333333333333333333333 8247 3333333333333333333333333333333333333333333333333333333 8248 3333333333333333333333333333333333333333333333333333333 8249 3333333333333333333333333333333333333333333333333333333 8250 3333333333333333333333333333333333333333333333333333333 8251 3333333333333333333333333333333333333333333333333333333 8252 3333333333333333333333333333333333333333333333333333333 8253 3333333333333333333333333333333333333333333333333333333 8254 3333333333333333333333333333333333333333333333333333333 8255 3333333333333333333333333333333333333333333333333333333 8256 3333333333333333333333333333333333333333333333333333333 8257 3333333333333333333333333333333333333333333333333333333 8258 3333333333333333333333333333333333333333333333333333333 8259 3333333333333333333333333333333333333333333333333333333 8260 3333333333333333333333333333333333333333333333333333333 8261 3333333333333333333333333333333333333333333333333333333 8262 3333333333333333333333333333333333333333333333333333333 8263 3333333333333333333333333333333333333333333333333333333 8264 3333333333333333333333333333333333333333333333333333333 8265 3333333333333333333333333333333333333333333333333333333 8266 3333333333333333333333333333333333333333333333333333333 8267 3333333333333333333333333333333333333333333333333333333 8268 3333333333333333333333333333333333333333333333333333333 8269 3333333333333333333333333333333333333333333333333333333 8270 3333333333333333333333333333333333333333333333333333333 8271 3333333333333333333333333333333333333333333333333333333 8272 3333333333333333333333333333333333333333333333333333333 8273 3333333333333333333333333333333333333333333333333333333 8274 3333333333333333333333333333333333333333333333333333333 8275 3333333333333333333333333333333333333333333333333333333 8276 3333333333333333333333333333333333333333333333333333333 8277 3333333333333333333333333333333333333333333333333333333 8278 3333333333333333333333333333333333333333333333333333333 8279 3333333333333333333333333333333333333333333333333333333 8280 3333333333333333333333333333333333333333333333333333333 8281 3333333333333333333333333333333333333333333333333333333 8282 3333333333333333333333333333333333333333333333333333333 8283 3333333333333333333333333333333333333333333333333333333 8284 3333333333333333333333333333333333333333333333333333333 8285 3333333333333333333333333333333333333333333333333333333 8286 3333333333333333333333333333333333333333333333333333333 8287 3333333333333333333333333333333333333333333333333333333 8288 3333333333333333333333333333333333333333333333333333333 8289 3333333333333333333333333333333333333333333333333333333 8290 3333333333333333333333333333333333333333333333333333333 8291 3333333333333333333333333333333333333333333333333333333 8292 3333333333333333333333333333333333333333333333333333333 8293 3333333333333333333333333333333333333333333333333333333 8294 3333333333333333333333333333333333333333333333333333333 8295 3333333333333333333333333333333333333333333333333333333 8296 3333333333333333333333333333333333333333333333333333333 8297 3333333333333333333333333333333333333333333333333333333 8298 3333333333333333333333333333333333333333333333333333333 8299 3333333333333333333333333333333333333333333333333333333 8300 3333333333333333333333333333333333333333333333333333333 8301 3333333333333333333333333333333333333333333333333333333 8302 3333333333333333333333333333333333333333333333333333333 8303 3333333333333333333333333333333333333333333333333333333 8304 3333333333333333333333333333333333333333333333333333333 8305 3333333333333333333333333333333333333333333333333333333 8306 3333333333333333333333333333333333333333333333333333333 8307 3333333333333333333333333333333333333333333333333333333 8308 3333333333333333333333333333333333333333333333333333333 8309 3333333333333333333333333333333333333333333333333333333 8310 3333333333333333333333333333333333333333333333333333333 8311 3333333333333333333333333333333333333333333333333333333 8312 3333333333333333333333333333333333333333333333333333333 8313 3333333333333333333333333333333333333333333333333333333 8314 3333333333333333333333333333333333333333333333333333333 8315 3333333333333333333333333333333333333333333333333333333 8316 3333333333333333333333333333333333333333333333333333333 8317 3333333333333333333333333333333333333333333333333333333 8318 3333333333333333333333333333333333333333333333333333333 8319 3333333333333333333333333333333333333333333333333333333 8320 3333333333333333333333333333333333333333333333333333333 8321 3333333333333333333333333333333333333333333333333333333 8322 3333333333333333333333333333333333333333333333333333333 8323 3333333333333333333333333333333333333333333333333333333 8324 3333333333333333333333333333333333333333333333333333333 8325 3333333333333333333333333333333333333333333333333333333 8326 3333333333333333333333333333333333333333333333333333333 8327 3333333333333333333333333333333333333333333333333333333 8328 3333333333333333333333333333333333333333333333333333333 8329 3333333333333333333333333333333333333333333333333333333 8330 3333333333333333333333333333333333333333333333333333333 8331 3333333333333333333333333333333333333333333333333333333 8332 3333333333333333333333333333333333333333333333333333333 8333 3333333333333333333333333333333333333333333333333333333 8334 3333333333333333333333333333333333333333333333333333333 8335 3333333333333333333333333333333333333333333333333333333 8336 3333333333333333333333333333333333333333333333333333333 8337 3333333333333333333333333333333333333333333333333333333 8338 3333333333333333333333333333333333333333333333333333333 8339 3333333333333333333333333333333333333333333333333333333 8340 3333333333333333333333333333333333333333333333333333333 8341 3333333333333333333333333333333333333333333333333333333 8342 3333333333333333333333333333333333333333333333333333333 8343 3333333333333333333333333333333333333333333333333333333 8344 3333333333333333333333333333333333333333333333333333333 8345 3333333333333333333333333333333333333333333333333333333 8346 3333333333333333333333333333333333333333333333333333333 8347 3333333333333333333333333333333333333333333333333333333 8348 3333333333333333333333333333333333333333333333333333333 8349 3333333333333333333333333333333333333333333333333333333 8350 3333333333333333333333333333333333333333333333333333333 8351 3333333333333333333333333333333333333333333333333333333 8352 3333333333333333333333333333333333333333333333333333333 8353 3333333333333333333333333333333333333333333333333333333 8354 3333333333333333333333333333333333333333333333333333333 8355 3333333333333333333333333333333333333333333333333333333 8356 3333333333333333333333333333333333333333333333333333333 8357 3333333333333333333333333333333333333333333333333333333 8358 3333333333333333333333333333333333333333333333333333333 8359 3333333333333333333333333333333333333333333333333333333 8360 3333333333333333333333333333333333333333333333333333333 8361 3333333333333333333333333333333333333333333333333333333 8362 3333333333333333333333333333333333333333333333333333333 8363 3333333333333333333333333333333333333333333333333333333 8364 3333333333333333333333333333333333333333333333333333333 8365 3333333333333333333333333333333333333333333333333333333 8366 3333333333333333333333333333333333333333333333333333333 8367 3333333333333333333333333333333333333333333333333333333 8368 3333333333333333333333333333333333333333333333333333333 8369 3333333333333333333333333333333333333333333333333333333 8370 3333333333333333333333333333333333333333333333333333333 8371 3333333333333333333333333333333333333333333333333333333 8372 3333333333333333333333333333333333333333333333333333333 8373 3333333333333333333333333333333333333333333333333333333 8374 3333333333333333333333333333333333333333333333333333333 8375 3333333333333333333333333333333333333333333333333333333 8376 3333333333333333333333333333333333333333333333333333333 8377 3333333333333333333333333333333333333333333333333333333 8378 3333333333333333333333333333333333333333333333333333333 8379 3333333333333333333333333333333333333333333333333333333 8380 3333333333333333333333333333333333333333333333333333333 8381 3333333333333333333333333333333333333333333333333333333 8382 3333333333333333333333333333333333333333333333333333333 8383 3333333333333333333333333333333333333333333333333333333 8384 3333333333333333333333333333333333333333333333333333333 8385 3333333333333333333333333333333333333333333333333333333 8386 3333333333333333333333333333333333333333333333333333333 8387 3333333333333333333333333333333333333333333333333333333 8388 3333333333333333333333333333333333333333333333333333333 8389 3333333333333333333333333333333333333333333333333333333 8390 3333333333333333333333333333333333333333333333333333333 8391 3333333333333333333333333333333333333333333333333333333 8392 3333333333333333333333333333333333333333333333333333333 8393 3333333333333333333333333333333333333333333333333333333 8394 3333333333333333333333333333333333333333333333333333333 8395 3333333333333333333333333333333333333333333333333333333 8396 3333333333333333333333333333333333333333333333333333333 8397 3333333333333333333333333333333333333333333333333333333 8398 3333333333333333333333333333333333333333333333333333333 8399 3333333333333333333333333333333333333333333333333333333 8400 3333333333333333333333333333333333333333333333333333333 8401 3333333333333333333333333333333333333333333333333333333 8402 3333333333333333333333333333333333333333333333333333333 8403 3333333333333333333333333333333333333333333333333333333 8404 3333333333333333333333333333333333333333333333333333333 8405 3333333333333333333333333333333333333333333333333333333 8406 3333333333333333333333333333333333333333333333333333333 8407 3333333333333333333333333333333333333333333333333333333 8408 3333333333333333333333333333333333333333333333333333333 8409 3333333333333333333333333333333333333333333333333333333 8410 3333333333333333333333333333333333333333333333333333333 8411 3333333333333333333333333333333333333333333333333333333 8412 3333333333333333333333333333333333333333333333333333333 8413 3333333333333333333333333333333333333333333333333333333 8414 3333333333333333333333333333333333333333333333333333333 8415 3333333333333333333333333333333333333333333333333333333 8416 3333333333333333333333333333333333333333333333333333333 8417 3333333333333333333333333333333333333333333333333333333 8418 3333333333333333333333333333333333333333333333333333333 8419 3333333333333333333333333333333333333333333333333333333 8420 3333333333333333333333333333333333333333333333333333333 8421 3333333333333333333333333333333333333333333333333333333 8422 3333333333333333333333333333333333333333333333333333333 8423 3333333333333333333333333333333333333333333333333333333 8424 3333333333333333333333333333333333333333333333333333333 8425 3333333333333333333333333333333333333333333333333333333 8426 3333333333333333333333333333333333333333333333333333333 8427 3333333333333333333333333333333333333333333333333333333 8428 3333333333333333333333333333333333333333333333333333333 8429 3333333333333333333333333333333333333333333333333333333 8430 3333333333333333333333333333333333333333333333333333333 8431 3333333333333333333333333333333333333333333333333333333 8432 3333333333333333333333333333333333333333333333333333333 8433 3333333333333333333333333333333333333333333333333333333 8434 3333333333333333333333333333333333333333333333333333333 8435 3333333333333333333333333333333333333333333333333333333 8436 3333333333333333333333333333333333333333333333333333333 8437 3333333333333333333333333333333333333333333333333333333 8438 3333333333333333333333333333333333333333333333333333333 8439 3333333333333333333333333333333333333333333333333333333 8440 3333333333333333333333333333333333333333333333333333333 8441 3333333333333333333333333333333333333333333333333333333 8442 3333333333333333333333333333333333333333333333333333333 8443 3333333333333333333333333333333333333333333333333333333 8444 3333333333333333333333333333333333333333333333333333333 8445 3333333333333333333333333333333333333333333333333333333 8446 3333333333333333333333333333333333333333333333333333333 8447 3333333333333333333333333333333333333333333333333333333 8448 3333333333333333333333333333333333333333333333333333333 8449 3333333333333333333333333333333333333333333333333333333 8450 3333333333333333333333333333333333333333333333333333333 8451 3333333333333333333333333333333333333333333333333333333 8452 3333333333333333333333333333333333333333333333333333333 8453 3333333333333333333333333333333333333333333333333333333 8454 3333333333333333333333333333333333333333333333333333333 8455 3333333333333333333333333333333333333333333333333333333 8456 3333333333333333333333333333333333333333333333333333333 8457 3333333333333333333333333333333333333333333333333333333 8458 3333333333333333333333333333333333333333333333333333333 8459 3333333333333333333333333333333333333333333333333333333 8460 3333333333333333333333333333333333333333333333333333333 8461 3333333333333333333333333333333333333333333333333333333 8462 3333333333333333333333333333333333333333333333333333333 8463 3333333333333333333333333333333333333333333333333333333 8464 3333333333333333333333333333333333333333333333333333333 8465 3333333333333333333333333333333333333333333333333333333 8466 3333333333333333333333333333333333333333333333333333333 8467 3333333333333333333333333333333333333333333333333333333 8468 3333333333333333333333333333333333333333333333333333333 8469 3333333333333333333333333333333333333333333333333333333 8470 3333333333333333333333333333333333333333333333333333333 8471 3333333333333333333333333333333333333333333333333333333 8472 3333333333333333333333333333333333333333333333333333333 8473 3333333333333333333333333333333333333333333333333333333 8474 3333333333333333333333333333333333333333333333333333333 8475 3333333333333333333333333333333333333333333333333333333 8476 3333333333333333333333333333333333333333333333333333333 8477 3333333333333333333333333333333333333333333333333333333 8478 3333333333333333333333333333333333333333333333333333333 8479 3333333333333333333333333333333333333333333333333333333 8480 3333333333333333333333333333333333333333333333333333333 8481 3333333333333333333333333333333333333333333333333333333 8482 3333333333333333333333333333333333333333333333333333333 8483 3333333333333333333333333333333333333333333333333333333 8484 3333333333333333333333333333333333333333333333333333333 8485 3333333333333333333333333333333333333333333333333333333 8486 3333333333333333333333333333333333333333333333333333333 8487 3333333333333333333333333333333333333333333333333333333 8488 3333333333333333333333333333333333333333333333333333333 8489 3333333333333333333333333333333333333333333333333333333 8490 3333333333333333333333333333333333333333333333333333333 8491 3333333333333333333333333333333333333333333333333333333 8492 3333333333333333333333333333333333333333333333333333333 8493 3333333333333333333333333333333333333333333333333333333 8494 3333333333333333333333333333333333333333333333333333333 8495 3333333333333333333333333333333333333333333333333333333 8496 3333333333333333333333333333333333333333333333333333333 8497 3333333333333333333333333333333333333333333333333333333 8498 3333333333333333333333333333333333333333333333333333333 8499 3333333333333333333333333333333333333333333333333333333 8500 3333333333333333333333333333333333333333333333333333333 8501 3333333333333333333333333333333333333333333333333333333 8502 3333333333333333333333333333333333333333333333333333333 8503 3333333333333333333333333333333333333333333333333333333 8504 3333333333333333333333333333333333333333333333333333333 8505 3333333333333333333333333333333333333333333333333333333 8506 3333333333333333333333333333333333333333333333333333333 8507 3333333333333333333333333333333333333333333333333333333 8508 3333333333333333333333333333333333333333333333333333333 8509 3333333333333333333333333333333333333333333333333333333 8510 3333333333333333333333333333333333333333333333333333333 8511 3333333333333333333333333333333333333333333333333333333 8512 3333333333333333333333333333333333333333333333333333333 8513 3333333333333333333333333333333333333333333333333333333 8514 3333333333333333333333333333333333333333333333333333333 8515 3333333333333333333333333333333333333333333333333333333 8516 3333333333333333333333333333333333333333333333333333333 8517 3333333333333333333333333333333333333333333333333333333 8518 3333333333333333333333333333333333333333333333333333333 8519 3333333333333333333333333333333333333333333333333333333 8520 3333333333333333333333333333333333333333333333333333333 8521 3333333333333333333333333333333333333333333333333333333 8522 3333333333333333333333333333333333333333333333333333333 8523 3333333333333333333333333333333333333333333333333333333 8524 3333333333333333333333333333333333333333333333333333333 8525 3333333333333333333333333333333333333333333333333333333 8526 3333333333333333333333333333333333333333333333333333333 8527 3333333333333333333333333333333333333333333333333333333 8528 3333333333333333333333333333333333333333333333333333333 8529 3333333333333333333333333333333333333333333333333333333 8530 3333333333333333333333333333333333333333333333333333333 8531 3333333333333333333333333333333333333333333333333333333 8532 3333333333333333333333333333333333333333333333333333333 8533 3333333333333333333333333333333333333333333333333333333 8534 3333333333333333333333333333333333333333333333333333333 8535 3333333333333333333333333333333333333333333333333333333 8536 3333333333333333333333333333333333333333333333333333333 8537 3333333333333333333333333333333333333333333333333333333 8538 3333333333333333333333333333333333333333333333333333333 8539 3333333333333333333333333333333333333333333333333333333 8540 3333333333333333333333333333333333333333333333333333333 8541 3333333333333333333333333333333333333333333333333333333 8542 3333333333333333333333333333333333333333333333333333333 8543 3333333333333333333333333333333333333333333333333333333 8544 3333333333333333333333333333333333333333333333333333333 8545 3333333333333333333333333333333333333333333333333333333 8546 3333333333333333333333333333333333333333333333333333333 8547 3333333333333333333333333333333333333333333333333333333 8548 3333333333333333333333333333333333333333333333333333333 8549 3333333333333333333333333333333333333333333333333333333 8550 3333333333333333333333333333333333333333333333333333333 8551 3333333333333333333333333333333333333333333333333333333 8552 3333333333333333333333333333333333333333333333333333333 8553 3333333333333333333333333333333333333333333333333333333 8554 3333333333333333333333333333333333333333333333333333333 8555 3333333333333333333333333333333333333333333333333333333 8556 3333333333333333333333333333333333333333333333333333333 8557 3333333333333333333333333333333333333333333333333333333 8558 3333333333333333333333333333333333333333333333333333333 8559 3333333333333333333333333333333333333333333333333333333 8560 3333333333333333333333333333333333333333333333333333333 8561 3333333333333333333333333333333333333333333333333333333 8562 3333333333333333333333333333333333333333333333333333333 8563 3333333333333333333333333333333333333333333333333333333 8564 3333333333333333333333333333333333333333333333333333333 8565 3333333333333333333333333333333333333333333333333333333 8566 3333333333333333333333333333333333333333333333333333333 8567 3333333333333333333333333333333333333333333333333333333 8568 3333333333333333333333333333333333333333333333333333333 8569 3333333333333333333333333333333333333333333333333333333 8570 3333333333333333333333333333333333333333333333333333333 8571 3333333333333333333333333333333333333333333333333333333 8572 3333333333333333333333333333333333333333333333333333333 8573 3333333333333333333333333333333333333333333333333333333 8574 3333333333333333333333333333333333333333333333333333333 8575 3333333333333333333333333333333333333333333333333333333 8576 3333333333333333333333333333333333333333333333333333333 8577 3333333333333333333333333333333333333333333333333333333 8578 3333333333333333333333333333333333333333333333333333333 8579 3333333333333333333333333333333333333333333333333333333 8580 3333333333333333333333333333333333333333333333333333333 8581 3333333333333333333333333333333333333333333333333333333 8582 3333333333333333333333333333333333333333333333333333333 8583 3333333333333333333333333333333333333333333333333333333 8584 3333333333333333333333333333333333333333333333333333333 8585 3333333333333333333333333333333333333333333333333333333 8586 3333333333333333333333333333333333333333333333333333333 8587 3333333333333333333333333333333333333333333333333333333 8588 3333333333333333333333333333333333333333333333333333333 8589 3333333333333333333333333333333333333333333333333333333 8590 3333333333333333333333333333333333333333333333333333333 8591 3333333333333333333333333333333333333333333333333333333 8592 3333333333333333333333333333333333333333333333333333333 8593 3333333333333333333333333333333333333333333333333333333 8594 3333333333333333333333333333333333333333333333333333333 8595 3333333333333333333333333333333333333333333333333333333 8596 3333333333333333333333333333333333333333333333333333333 8597 3333333333333333333333333333333333333333333333333333333 8598 3333333333333333333333333333333333333333333333333333333 8599 3333333333333333333333333333333333333333333333333333333 8600 3333333333333333333333333333333333333333333333333333333 8601 3333333333333333333333333333333333333333333333333333333 8602 3333333333333333333333333333333333333333333333333333333 8603 3333333333333333333333333333333333333333333333333333333 8604 3333333333333333333333333333333333333333333333333333333 8605 3333333333333333333333333333333333333333333333333333333 8606 3333333333333333333333333333333333333333333333333333333 8607 3333333333333333333333333333333333333333333333333333333 8608 3333333333333333333333333333333333333333333333333333333 8609 3333333333333333333333333333333333333333333333333333333 8610 3333333333333333333333333333333333333333333333333333333 8611 3333333333333333333333333333333333333333333333333333333 8612 3333333333333333333333333333333333333333333333333333333 8613 3333333333333333333333333333333333333333333333333333333 8614 3333333333333333333333333333333333333333333333333333333 8615 3333333333333333333333333333333333333333333333333333333 8616 3333333333333333333333333333333333333333333333333333333 8617 3333333333333333333333333333333333333333333333333333333 8618 3333333333333333333333333333333333333333333333333333333 8619 3333333333333333333333333333333333333333333333333333333 8620 3333333333333333333333333333333333333333333333333333333 8621 3333333333333333333333333333333333333333333333333333333 8622 3333333333333333333333333333333333333333333333333333333 8623 3333333333333333333333333333333333333333333333333333333 8624 3333333333333333333333333333333333333333333333333333333 8625 3333333333333333333333333333333333333333333333333333333 8626 3333333333333333333333333333333333333333333333333333333 8627 3333333333333333333333333333333333333333333333333333333 8628 3333333333333333333333333333333333333333333333333333333 8629 3333333333333333333333333333333333333333333333333333333 8630 3333333333333333333333333333333333333333333333333333333 8631 3333333333333333333333333333333333333333333333333333333 8632 3333333333333333333333333333333333333333333333333333333 8633 3333333333333333333333333333333333333333333333333333333 8634 3333333333333333333333333333333333333333333333333333333 8635 3333333333333333333333333333333333333333333333333333333 8636 3333333333333333333333333333333333333333333333333333333 8637 3333333333333333333333333333333333333333333333333333333 8638 3333333333333333333333333333333333333333333333333333333 8639 3333333333333333333333333333333333333333333333333333333 8640 3333333333333333333333333333333333333333333333333333333 8641 3333333333333333333333333333333333333333333333333333333 8642 3333333333333333333333333333333333333333333333333333333 8643 3333333333333333333333333333333333333333333333333333333 8644 3333333333333333333333333333333333333333333333333333333 8645 3333333333333333333333333333333333333333333333333333333 8646 3333333333333333333333333333333333333333333333333333333 8647 3333333333333333333333333333333333333333333333333333333 8648 3333333333333333333333333333333333333333333333333333333 8649 3333333333333333333333333333333333333333333333333333333 8650 3333333333333333333333333333333333333333333333333333333 8651 3333333333333333333333333333333333333333333333333333333 8652 3333333333333333333333333333333333333333333333333333333 8653 3333333333333333333333333333333333333333333333333333333 8654 3333333333333333333333333333333333333333333333333333333 8655 3333333333333333333333333333333333333333333333333333333 8656 3333333333333333333333333333333333333333333333333333333 8657 3333333333333333333333333333333333333333333333333333333 8658 3333333333333333333333333333333333333333333333333333333 8659 3333333333333333333333333333333333333333333333333333333 8660 3333333333333333333333333333333333333333333333333333333 8661 3333333333333333333333333333333333333333333333333333333 8662 3333333333333333333333333333333333333333333333333333333 8663 3333333333333333333333333333333333333333333333333333333 8664 3333333333333333333333333333333333333333333333333333333 8665 3333333333333333333333333333333333333333333333333333333 8666 3333333333333333333333333333333333333333333333333333333 8667 3333333333333333333333333333333333333333333333333333333 8668 3333333333333333333333333333333333333333333333333333333 8669 3333333333333333333333333333333333333333333333333333333 8670 3333333333333333333333333333333333333333333333333333333 8671 3333333333333333333333333333333333333333333333333333333 8672 3333333333333333333333333333333333333333333333333333333 8673 3333333333333333333333333333333333333333333333333333333 8674 3333333333333333333333333333333333333333333333333333333 8675 3333333333333333333333333333333333333333333333333333333 8676 3333333333333333333333333333333333333333333333333333333 8677 3333333333333333333333333333333333333333333333333333333 8678 3333333333333333333333333333333333333333333333333333333 8679 3333333333333333333333333333333333333333333333333333333 8680 3333333333333333333333333333333333333333333333333333333 8681 3333333333333333333333333333333333333333333333333333333 8682 3333333333333333333333333333333333333333333333333333333 8683 3333333333333333333333333333333333333333333333333333333 8684 3333333333333333333333333333333333333333333333333333333 8685 3333333333333333333333333333333333333333333333333333333 8686 3333333333333333333333333333333333333333333333333333333 8687 3333333333333333333333333333333333333333333333333333333 8688 3333333333333333333333333333333333333333333333333333333 8689 3333333333333333333333333333333333333333333333333333333 8690 3333333333333333333333333333333333333333333333333333333 8691 3333333333333333333333333333333333333333333333333333333 8692 3333333333333333333333333333333333333333333333333333333 8693 3333333333333333333333333333333333333333333333333333333 8694 3333333333333333333333333333333333333333333333333333333 8695 3333333333333333333333333333333333333333333333333333333 8696 3333333333333333333333333333333333333333333333333333333 8697 3333333333333333333333333333333333333333333333333333333 8698 3333333333333333333333333333333333333333333333333333333 8699 3333333333333333333333333333333333333333333333333333333 8700 3333333333333333333333333333333333333333333333333333333 8701 3333333333333333333333333333333333333333333333333333333 8702 3333333333333333333333333333333333333333333333333333333 8703 3333333333333333333333333333333333333333333333333333333 8704 3333333333333333333333333333333333333333333333333333333 8705 3333333333333333333333333333333333333333333333333333333 8706 3333333333333333333333333333333333333333333333333333333 8707 3333333333333333333333333333333333333333333333333333333 8708 3333333333333333333333333333333333333333333333333333333 8709 3333333333333333333333333333333333333333333333333333333 8710 3333333333333333333333333333333333333333333333333333333 8711 3333333333333333333333333333333333333333333333333333333 8712 3333333333333333333333333333333333333333333333333333333 8713 3333333333333333333333333333333333333333333333333333333 8714 3333333333333333333333333333333333333333333333333333333 8715 3333333333333333333333333333333333333333333333333333333 8716 3333333333333333333333333333333333333333333333333333333 8717 3333333333333333333333333333333333333333333333333333333 8718 3333333333333333333333333333333333333333333333333333333 8719 3333333333333333333333333333333333333333333333333333333 8720 3333333333333333333333333333333333333333333333333333333 8721 3333333333333333333333333333333333333333333333333333333 8722 3333333333333333333333333333333333333333333333333333333 8723 3333333333333333333333333333333333333333333333333333333 8724 3333333333333333333333333333333333333333333333333333333 8725 3333333333333333333333333333333333333333333333333333333 8726 3333333333333333333333333333333333333333333333333333333 8727 3333333333333333333333333333333333333333333333333333333 8728 3333333333333333333333333333333333333333333333333333333 8729 3333333333333333333333333333333333333333333333333333333 8730 3333333333333333333333333333333333333333333333333333333 8731 3333333333333333333333333333333333333333333333333333333 8732 3333333333333333333333333333333333333333333333333333333 8733 3333333333333333333333333333333333333333333333333333333 8734 3333333333333333333333333333333333333333333333333333333 8735 3333333333333333333333333333333333333333333333333333333 8736 3333333333333333333333333333333333333333333333333333333 8737 3333333333333333333333333333333333333333333333333333333 8738 3333333333333333333333333333333333333333333333333333333 8739 3333333333333333333333333333333333333333333333333333333 8740 3333333333333333333333333333333333333333333333333333333 8741 3333333333333333333333333333333333333333333333333333333 8742 3333333333333333333333333333333333333333333333333333333 8743 3333333333333333333333333333333333333333333333333333333 8744 3333333333333333333333333333333333333333333333333333333 8745 3333333333333333333333333333333333333333333333333333333 8746 3333333333333333333333333333333333333333333333333333333 8747 3333333333333333333333333333333333333333333333333333333 8748 3333333333333333333333333333333333333333333333333333333 8749 3333333333333333333333333333333333333333333333333333333 8750 3333333333333333333333333333333333333333333333333333333 8751 3333333333333333333333333333333333333333333333333333333 8752 3333333333333333333333333333333333333333333333333333333 8753 3333333333333333333333333333333333333333333333333333333 8754 3333333333333333333333333333333333333333333333333333333 8755 3333333333333333333333333333333333333333333333333333333 8756 3333333333333333333333333333333333333333333333333333333 8757 3333333333333333333333333333333333333333333333333333333 8758 3333333333333333333333333333333333333333333333333333333 8759 3333333333333333333333333333333333333333333333333333333 8760 3333333333333333333333333333333333333333333333333333333 8761 3333333333333333333333333333333333333333333333333333333 8762 3333333333333333333333333333333333333333333333333333333 8763 3333333333333333333333333333333333333333333333333333333 8764 3333333333333333333333333333333333333333333333333333333 8765 3333333333333333333333333333333333333333333333333333333 8766 3333333333333333333333333333333333333333333333333333333 8767 3333333333333333333333333333333333333333333333333333333 8768 3333333333333333333333333333333333333333333333333333333 8769 3333333333333333333333333333333333333333333333333333333 8770 3333333333333333333333333333333333333333333333333333333 8771 3333333333333333333333333333333333333333333333333333333 8772 3333333333333333333333333333333333333333333333333333333 8773 3333333333333333333333333333333333333333333333333333333 8774 3333333333333333333333333333333333333333333333333333333 8775 3333333333333333333333333333333333333333333333333333333 8776 3333333333333333333333333333333333333333333333333333333 8777 3333333333333333333333333333333333333333333333333333333 8778 3333333333333333333333333333333333333333333333333333333 8779 3333333333333333333333333333333333333333333333333333333 8780 3333333333333333333333333333333333333333333333333333333 8781 3333333333333333333333333333333333333333333333333333333 8782 3333333333333333333333333333333333333333333333333333333 8783 3333333333333333333333333333333333333333333333333333333 8784 3333333333333333333333333333333333333333333333333333333 8785 3333333333333333333333333333333333333333333333333333333 8786 3333333333333333333333333333333333333333333333333333333 8787 3333333333333333333333333333333333333333333333333333333 8788 3333333333333333333333333333333333333333333333333333333 8789 3333333333333333333333333333333333333333333333333333333 8790 3333333333333333333333333333333333333333333333333333333 8791 3333333333333333333333333333333333333333333333333333333 8792 3333333333333333333333333333333333333333333333333333333 8793 3333333333333333333333333333333333333333333333333333333 8794 3333333333333333333333333333333333333333333333333333333 8795 3333333333333333333333333333333333333333333333333333333 8796 3333333333333333333333333333333333333333333333333333333 8797 3333333333333333333333333333333333333333333333333333333 8798 3333333333333333333333333333333333333333333333333333333 8799 3333333333333333333333333333333333333333333333333333333 8800 3333333333333333333333333333333333333333333333333333333 8801 3333333333333333333333333333333333333333333333333333333 8802 3333333333333333333333333333333333333333333333333333333 8803 3333333333333333333333333333333333333333333333333333333 8804 3333333333333333333333333333333333333333333333333333333 8805 3333333333333333333333333333333333333333333333333333333 8806 3333333333333333333333333333333333333333333333333333333 8807 3333333333333333333333333333333333333333333333333333333 8808 3333333333333333333333333333333333333333333333333333333 8809 3333333333333333333333333333333333333333333333333333333 8810 3333333333333333333333333333333333333333333333333333333 8811 3333333333333333333333333333333333333333333333333333333 8812 3333333333333333333333333333333333333333333333333333333 8813 3333333333333333333333333333333333333333333333333333333 8814 3333333333333333333333333333333333333333333333333333333 8815 3333333333333333333333333333333333333333333333333333333 8816 3333333333333333333333333333333333333333333333333333333 8817 3333333333333333333333333333333333333333333333333333333 8818 3333333333333333333333333333333333333333333333333333333 8819 3333333333333333333333333333333333333333333333333333333 8820 3333333333333333333333333333333333333333333333333333333 8821 3333333333333333333333333333333333333333333333333333333 8822 3333333333333333333333333333333333333333333333333333333 8823 3333333333333333333333333333333333333333333333333333333 8824 3333333333333333333333333333333333333333333333333333333 8825 3333333333333333333333333333333333333333333333333333333 8826 3333333333333333333333333333333333333333333333333333333 8827 3333333333333333333333333333333333333333333333333333333 8828 3333333333333333333333333333333333333333333333333333333 8829 3333333333333333333333333333333333333333333333333333333 8830 3333333333333333333333333333333333333333333333333333333 8831 3333333333333333333333333333333333333333333333333333333 8832 3333333333333333333333333333333333333333333333333333333 8833 3333333333333333333333333333333333333333333333333333333 8834 3333333333333333333333333333333333333333333333333333333 8835 3333333333333333333333333333333333333333333333333333333 8836 3333333333333333333333333333333333333333333333333333333 8837 3333333333333333333333333333333333333333333333333333333 8838 3333333333333333333333333333333333333333333333333333333 8839 3333333333333333333333333333333333333333333333333333333 8840 3333333333333333333333333333333333333333333333333333333 8841 3333333333333333333333333333333333333333333333333333333 8842 3333333333333333333333333333333333333333333333333333333 8843 3333333333333333333333333333333333333333333333333333333 8844 3333333333333333333333333333333333333333333333333333333 8845 3333333333333333333333333333333333333333333333333333333 8846 3333333333333333333333333333333333333333333333333333333 8847 3333333333333333333333333333333333333333333333333333333 8848 3333333333333333333333333333333333333333333333333333333 8849 3333333333333333333333333333333333333333333333333333333 8850 3333333333333333333333333333333333333333333333333333333 8851 3333333333333333333333333333333333333333333333333333333 8852 3333333333333333333333333333333333333333333333333333333 8853 3333333333333333333333333333333333333333333333333333333 8854 3333333333333333333333333333333333333333333333333333333 8855 3333333333333333333333333333333333333333333333333333333 8856 3333333333333333333333333333333333333333333333333333333 8857 3333333333333333333333333333333333333333333333333333333 8858 3333333333333333333333333333333333333333333333333333333 8859 3333333333333333333333333333333333333333333333333333333 8860 3333333333333333333333333333333333333333333333333333333 8861 3333333333333333333333333333333333333333333333333333333 8862 3333333333333333333333333333333333333333333333333333333 8863 3333333333333333333333333333333333333333333333333333333 8864 3333333333333333333333333333333333333333333333333333333 8865 3333333333333333333333333333333333333333333333333333333 8866 3333333333333333333333333333333333333333333333333333333 8867 3333333333333333333333333333333333333333333333333333333 8868 3333333333333333333333333333333333333333333333333333333 8869 3333333333333333333333333333333333333333333333333333333 8870 3333333333333333333333333333333333333333333333333333333 8871 3333333333333333333333333333333333333333333333333333333 8872 3333333333333333333333333333333333333333333333333333333 8873 3333333333333333333333333333333333333333333333333333333 8874 3333333333333333333333333333333333333333333333333333333 8875 3333333333333333333333333333333333333333333333333333333 8876 3333333333333333333333333333333333333333333333333333333 8877 3333333333333333333333333333333333333333333333333333333 8878 3333333333333333333333333333333333333333333333333333333 8879 3333333333333333333333333333333333333333333333333333333 8880 3333333333333333333333333333333333333333333333333333333 8881 3333333333333333333333333333333333333333333333333333333 8882 3333333333333333333333333333333333333333333333333333333 8883 3333333333333333333333333333333333333333333333333333333 8884 3333333333333333333333333333333333333333333333333333333 8885 3333333333333333333333333333333333333333333333333333333 8886 3333333333333333333333333333333333333333333333333333333 8887 3333333333333333333333333333333333333333333333333333333 8888 3333333333333333333333333333333333333333333333333333333 8889 3333333333333333333333333333333333333333333333333333333 8890 3333333333333333333333333333333333333333333333333333333 8891 3333333333333333333333333333333333333333333333333333333 8892 3333333333333333333333333333333333333333333333333333333 8893 3333333333333333333333333333333333333333333333333333333 8894 3333333333333333333333333333333333333333333333333333333 8895 3333333333333333333333333333333333333333333333333333333 8896 3333333333333333333333333333333333333333333333333333333 8897 3333333333333333333333333333333333333333333333333333333 8898 3333333333333333333333333333333333333333333333333333333 8899 3333333333333333333333333333333333333333333333333333333 8900 3333333333333333333333333333333333333333333333333333333 8901 3333333333333333333333333333333333333333333333333333333 8902 3333333333333333333333333333333333333333333333333333333 8903 3333333333333333333333333333333333333333333333333333333 8904 3333333333333333333333333333333333333333333333333333333 8905 3333333333333333333333333333333333333333333333333333333 8906 3333333333333333333333333333333333333333333333333333333 8907 3333333333333333333333333333333333333333333333333333333 8908 3333333333333333333333333333333333333333333333333333333 8909 3333333333333333333333333333333333333333333333333333333 8910 3333333333333333333333333333333333333333333333333333333 8911 3333333333333333333333333333333333333333333333333333333 8912 3333333333333333333333333333333333333333333333333333333 8913 3333333333333333333333333333333333333333333333333333333 8914 3333333333333333333333333333333333333333333333333333333 8915 3333333333333333333333333333333333333333333333333333333 8916 3333333333333333333333333333333333333333333333333333333 8917 3333333333333333333333333333333333333333333333333333333 8918 3333333333333333333333333333333333333333333333333333333 8919 3333333333333333333333333333333333333333333333333333333 8920 3333333333333333333333333333333333333333333333333333333 8921 3333333333333333333333333333333333333333333333333333333 8922 3333333333333333333333333333333333333333333333333333333 8923 3333333333333333333333333333333333333333333333333333333 8924 3333333333333333333333333333333333333333333333333333333 8925 3333333333333333333333333333333333333333333333333333333 8926 3333333333333333333333333333333333333333333333333333333 8927 3333333333333333333333333333333333333333333333333333333 8928 3333333333333333333333333333333333333333333333333333333 8929 3333333333333333333333333333333333333333333333333333333 8930 3333333333333333333333333333333333333333333333333333333 8931 3333333333333333333333333333333333333333333333333333333 8932 3333333333333333333333333333333333333333333333333333333 8933 3333333333333333333333333333333333333333333333333333333 8934 3333333333333333333333333333333333333333333333333333333 8935 3333333333333333333333333333333333333333333333333333333 8936 3333333333333333333333333333333333333333333333333333333 8937 3333333333333333333333333333333333333333333333333333333 8938 3333333333333333333333333333333333333333333333333333333 8939 3333333333333333333333333333333333333333333333333333333 8940 3333333333333333333333333333333333333333333333333333333 8941 3333333333333333333333333333333333333333333333333333333 8942 3333333333333333333333333333333333333333333333333333333 8943 3333333333333333333333333333333333333333333333333333333 8944 3333333333333333333333333333333333333333333333333333333 8945 3333333333333333333333333333333333333333333333333333333 8946 3333333333333333333333333333333333333333333333333333333 8947 3333333333333333333333333333333333333333333333333333333 8948 3333333333333333333333333333333333333333333333333333333 8949 3333333333333333333333333333333333333333333333333333333 8950 3333333333333333333333333333333333333333333333333333333 8951 3333333333333333333333333333333333333333333333333333333 8952 3333333333333333333333333333333333333333333333333333333 8953 3333333333333333333333333333333333333333333333333333333 8954 3333333333333333333333333333333333333333333333333333333 8955 3333333333333333333333333333333333333333333333333333333 8956 3333333333333333333333333333333333333333333333333333333 8957 3333333333333333333333333333333333333333333333333333333 8958 3333333333333333333333333333333333333333333333333333333 8959 3333333333333333333333333333333333333333333333333333333 8960 3333333333333333333333333333333333333333333333333333333 8961 3333333333333333333333333333333333333333333333333333333 8962 3333333333333333333333333333333333333333333333333333333 8963 3333333333333333333333333333333333333333333333333333333 8964 3333333333333333333333333333333333333333333333333333333 8965 3333333333333333333333333333333333333333333333333333333 8966 3333333333333333333333333333333333333333333333333333333 8967 3333333333333333333333333333333333333333333333333333333 8968 3333333333333333333333333333333333333333333333333333333 8969 3333333333333333333333333333333333333333333333333333333 8970 3333333333333333333333333333333333333333333333333333333 8971 3333333333333333333333333333333333333333333333333333333 8972 3333333333333333333333333333333333333333333333333333333 8973 3333333333333333333333333333333333333333333333333333333 8974 3333333333333333333333333333333333333333333333333333333 8975 3333333333333333333333333333333333333333333333333333333 8976 3333333333333333333333333333333333333333333333333333333 8977 3333333333333333333333333333333333333333333333333333333 8978 3333333333333333333333333333333333333333333333333333333 8979 3333333333333333333333333333333333333333333333333333333 8980 3333333333333333333333333333333333333333333333333333333 8981 3333333333333333333333333333333333333333333333333333333 8982 3333333333333333333333333333333333333333333333333333333 8983 3333333333333333333333333333333333333333333333333333333 8984 3333333333333333333333333333333333333333333333333333333 8985 3333333333333333333333333333333333333333333333333333333 8986 3333333333333333333333333333333333333333333333333333333 8987 3333333333333333333333333333333333333333333333333333333 8988 3333333333333333333333333333333333333333333333333333333 8989 3333333333333333333333333333333333333333333333333333333 8990 3333333333333333333333333333333333333333333333333333333 8991 3333333333333333333333333333333333333333333333333333333 8992 3333333333333333333333333333333333333333333333333333333 8993 3333333333333333333333333333333333333333333333333333333 8994 3333333333333333333333333333333333333333333333333333333 8995 3333333333333333333333333333333333333333333333333333333 8996 3333333333333333333333333333333333333333333333333333333 8997 3333333333333333333333333333333333333333333333333333333 8998 3333333333333333333333333333333333333333333333333333333 8999 3333333333333333333333333333333333333333333333333333333 9000 3333333333333333333333333333333333333333333333333333333 9001 3333333333333333333333333333333333333333333333333333333 9002 3333333333333333333333333333333333333333333333333333333 9003 3333333333333333333333333333333333333333333333333333333 9004 3333333333333333333333333333333333333333333333333333333 9005 3333333333333333333333333333333333333333333333333333333 9006 3333333333333333333333333333333333333333333333333333333 9007 3333333333333333333333333333333333333333333333333333333 9008 3333333333333333333333333333333333333333333333333333333 9009 3333333333333333333333333333333333333333333333333333333 9010 3333333333333333333333333333333333333333333333333333333 9011 3333333333333333333333333333333333333333333333333333333 9012 3333333333333333333333333333333333333333333333333333333 9013 3333333333333333333333333333333333333333333333333333333 9014 3333333333333333333333333333333333333333333333333333333 9015 3333333333333333333333333333333333333333333333333333333 9016 3333333333333333333333333333333333333333333333333333333 9017 3333333333333333333333333333333333333333333333333333333 9018 3333333333333333333333333333333333333333333333333333333 9019 3333333333333333333333333333333333333333333333333333333 9020 3333333333333333333333333333333333333333333333333333333 9021 3333333333333333333333333333333333333333333333333333333 9022 3333333333333333333333333333333333333333333333333333333 9023 3333333333333333333333333333333333333333333333333333333 9024 3333333333333333333333333333333333333333333333333333333 9025 3333333333333333333333333333333333333333333333333333333 9026 3333333333333333333333333333333333333333333333333333333 9027 3333333333333333333333333333333333333333333333333333333 9028 3333333333333333333333333333333333333333333333333333333 9029 3333333333333333333333333333333333333333333333333333333 9030 3333333333333333333333333333333333333333333333333333333 9031 3333333333333333333333333333333333333333333333333333333 9032 3333333333333333333333333333333333333333333333333333333 9033 3333333333333333333333333333333333333333333333333333333 9034 3333333333333333333333333333333333333333333333333333333 9035 3333333333333333333333333333333333333333333333333333333 9036 3333333333333333333333333333333333333333333333333333333 9037 3333333333333333333333333333333333333333333333333333333 9038 3333333333333333333333333333333333333333333333333333333 9039 3333333333333333333333333333333333333333333333333333333 9040 3333333333333333333333333333333333333333333333333333333 9041 3333333333333333333333333333333333333333333333333333333 9042 3333333333333333333333333333333333333333333333333333333 9043 3333333333333333333333333333333333333333333333333333333 9044 3333333333333333333333333333333333333333333333333333333 9045 3333333333333333333333333333333333333333333333333333333 9046 3333333333333333333333333333333333333333333333333333333 9047 3333333333333333333333333333333333333333333333333333333 9048 3333333333333333333333333333333333333333333333333333333 9049 3333333333333333333333333333333333333333333333333333333 9050 3333333333333333333333333333333333333333333333333333333 9051 3333333333333333333333333333333333333333333333333333333 9052 3333333333333333333333333333333333333333333333333333333 9053 3333333333333333333333333333333333333333333333333333333 9054 3333333333333333333333333333333333333333333333333333333 9055 3333333333333333333333333333333333333333333333333333333 9056 3333333333333333333333333333333333333333333333333333333 9057 3333333333333333333333333333333333333333333333333333333 9058 3333333333333333333333333333333333333333333333333333333 9059 3333333333333333333333333333333333333333333333333333333 9060 3333333333333333333333333333333333333333333333333333333 9061 3333333333333333333333333333333333333333333333333333333 9062 3333333333333333333333333333333333333333333333333333333 9063 3333333333333333333333333333333333333333333333333333333 9064 3333333333333333333333333333333333333333333333333333333 9065 3333333333333333333333333333333333333333333333333333333 9066 3333333333333333333333333333333333333333333333333333333 9067 3333333333333333333333333333333333333333333333333333333 9068 3333333333333333333333333333333333333333333333333333333 9069 3333333333333333333333333333333333333333333333333333333 9070 3333333333333333333333333333333333333333333333333333333 9071 3333333333333333333333333333333333333333333333333333333 9072 3333333333333333333333333333333333333333333333333333333 9073 3333333333333333333333333333333333333333333333333333333 9074 3333333333333333333333333333333333333333333333333333333 9075 3333333333333333333333333333333333333333333333333333333 9076 3333333333333333333333333333333333333333333333333333333 9077 3333333333333333333333333333333333333333333333333333333 9078 3333333333333333333333333333333333333333333333333333333 9079 3333333333333333333333333333333333333333333333333333333 9080 3333333333333333333333333333333333333333333333333333333 9081 3333333333333333333333333333333333333333333333333333333 9082 3333333333333333333333333333333333333333333333333333333 9083 3333333333333333333333333333333333333333333333333333333 9084 3333333333333333333333333333333333333333333333333333333 9085 3333333333333333333333333333333333333333333333333333333 9086 3333333333333333333333333333333333333333333333333333333 9087 3333333333333333333333333333333333333333333333333333333 9088 3333333333333333333333333333333333333333333333333333333 9089 3333333333333333333333333333333333333333333333333333333 9090 3333333333333333333333333333333333333333333333333333333 9091 3333333333333333333333333333333333333333333333333333333 9092 3333333333333333333333333333333333333333333333333333333 9093 3333333333333333333333333333333333333333333333333333333 9094 3333333333333333333333333333333333333333333333333333333 9095 3333333333333333333333333333333333333333333333333333333 9096 3333333333333333333333333333333333333333333333333333333 9097 3333333333333333333333333333333333333333333333333333333 9098 3333333333333333333333333333333333333333333333333333333 9099 3333333333333333333333333333333333333333333333333333333 9100 3333333333333333333333333333333333333333333333333333333 9101 3333333333333333333333333333333333333333333333333333333 9102 3333333333333333333333333333333333333333333333333333333 9103 3333333333333333333333333333333333333333333333333333333 9104 3333333333333333333333333333333333333333333333333333333 9105 3333333333333333333333333333333333333333333333333333333 9106 3333333333333333333333333333333333333333333333333333333 9107 3333333333333333333333333333333333333333333333333333333 9108 3333333333333333333333333333333333333333333333333333333 9109 3333333333333333333333333333333333333333333333333333333 9110 3333333333333333333333333333333333333333333333333333333 9111 3333333333333333333333333333333333333333333333333333333 9112 3333333333333333333333333333333333333333333333333333333 9113 3333333333333333333333333333333333333333333333333333333 9114 3333333333333333333333333333333333333333333333333333333 9115 3333333333333333333333333333333333333333333333333333333 9116 3333333333333333333333333333333333333333333333333333333 9117 3333333333333333333333333333333333333333333333333333333 9118 3333333333333333333333333333333333333333333333333333333 9119 3333333333333333333333333333333333333333333333333333333 9120 3333333333333333333333333333333333333333333333333333333 9121 3333333333333333333333333333333333333333333333333333333 9122 3333333333333333333333333333333333333333333333333333333 9123 3333333333333333333333333333333333333333333333333333333 9124 3333333333333333333333333333333333333333333333333333333 9125 3333333333333333333333333333333333333333333333333333333 9126 3333333333333333333333333333333333333333333333333333333 9127 3333333333333333333333333333333333333333333333333333333 9128 3333333333333333333333333333333333333333333333333333333 9129 3333333333333333333333333333333333333333333333333333333 9130 3333333333333333333333333333333333333333333333333333333 9131 3333333333333333333333333333333333333333333333333333333 9132 3333333333333333333333333333333333333333333333333333333 9133 3333333333333333333333333333333333333333333333333333333 9134 3333333333333333333333333333333333333333333333333333333 9135 3333333333333333333333333333333333333333333333333333333 9136 3333333333333333333333333333333333333333333333333333333 9137 3333333333333333333333333333333333333333333333333333333 9138 3333333333333333333333333333333333333333333333333333333 9139 3333333333333333333333333333333333333333333333333333333 9140 3333333333333333333333333333333333333333333333333333333 9141 3333333333333333333333333333333333333333333333333333333 9142 3333333333333333333333333333333333333333333333333333333 9143 3333333333333333333333333333333333333333333333333333333 9144 3333333333333333333333333333333333333333333333333333333 9145 3333333333333333333333333333333333333333333333333333333 9146 3333333333333333333333333333333333333333333333333333333 9147 3333333333333333333333333333333333333333333333333333333 9148 3333333333333333333333333333333333333333333333333333333 9149 3333333333333333333333333333333333333333333333333333333 9150 3333333333333333333333333333333333333333333333333333333 9151 3333333333333333333333333333333333333333333333333333333 9152 3333333333333333333333333333333333333333333333333333333 9153 3333333333333333333333333333333333333333333333333333333 9154 3333333333333333333333333333333333333333333333333333333 9155 3333333333333333333333333333333333333333333333333333333 9156 3333333333333333333333333333333333333333333333333333333 9157 3333333333333333333333333333333333333333333333333333333 9158 3333333333333333333333333333333333333333333333333333333 9159 3333333333333333333333333333333333333333333333333333333 9160 3333333333333333333333333333333333333333333333333333333 9161 3333333333333333333333333333333333333333333333333333333 9162 3333333333333333333333333333333333333333333333333333333 9163 3333333333333333333333333333333333333333333333333333333 9164 3333333333333333333333333333333333333333333333333333333 9165 3333333333333333333333333333333333333333333333333333333 9166 3333333333333333333333333333333333333333333333333333333 9167 3333333333333333333333333333333333333333333333333333333 9168 3333333333333333333333333333333333333333333333333333333 9169 3333333333333333333333333333333333333333333333333333333 9170 3333333333333333333333333333333333333333333333333333333 9171 3333333333333333333333333333333333333333333333333333333 9172 3333333333333333333333333333333333333333333333333333333 9173 3333333333333333333333333333333333333333333333333333333 9174 3333333333333333333333333333333333333333333333333333333 9175 3333333333333333333333333333333333333333333333333333333 9176 3333333333333333333333333333333333333333333333333333333 9177 3333333333333333333333333333333333333333333333333333333 9178 3333333333333333333333333333333333333333333333333333333 9179 3333333333333333333333333333333333333333333333333333333 9180 3333333333333333333333333333333333333333333333333333333 9181 3333333333333333333333333333333333333333333333333333333 9182 3333333333333333333333333333333333333333333333333333333 9183 3333333333333333333333333333333333333333333333333333333 9184 3333333333333333333333333333333333333333333333333333333 9185 3333333333333333333333333333333333333333333333333333333 9186 3333333333333333333333333333333333333333333333333333333 9187 3333333333333333333333333333333333333333333333333333333 9188 3333333333333333333333333333333333333333333333333333333 9189 3333333333333333333333333333333333333333333333333333333 9190 3333333333333333333333333333333333333333333333333333333 9191 3333333333333333333333333333333333333333333333333333333 9192 3333333333333333333333333333333333333333333333333333333 9193 3333333333333333333333333333333333333333333333333333333 9194 3333333333333333333333333333333333333333333333333333333 9195 3333333333333333333333333333333333333333333333333333333 9196 3333333333333333333333333333333333333333333333333333333 9197 3333333333333333333333333333333333333333333333333333333 9198 3333333333333333333333333333333333333333333333333333333 9199 3333333333333333333333333333333333333333333333333333333 9200 3333333333333333333333333333333333333333333333333333333 9201 3333333333333333333333333333333333333333333333333333333 9202 3333333333333333333333333333333333333333333333333333333 9203 3333333333333333333333333333333333333333333333333333333 9204 3333333333333333333333333333333333333333333333333333333 9205 3333333333333333333333333333333333333333333333333333333 9206 3333333333333333333333333333333333333333333333333333333 9207 3333333333333333333333333333333333333333333333333333333 9208 3333333333333333333333333333333333333333333333333333333 9209 3333333333333333333333333333333333333333333333333333333 9210 3333333333333333333333333333333333333333333333333333333 9211 3333333333333333333333333333333333333333333333333333333 9212 3333333333333333333333333333333333333333333333333333333 9213 3333333333333333333333333333333333333333333333333333333 9214 3333333333333333333333333333333333333333333333333333333 9215 3333333333333333333333333333333333333333333333333333333 9216 3333333333333333333333333333333333333333333333333333333 9217 3333333333333333333333333333333333333333333333333333333 9218 3333333333333333333333333333333333333333333333333333333 9219 3333333333333333333333333333333333333333333333333333333 9220 3333333333333333333333333333333333333333333333333333333 9221 3333333333333333333333333333333333333333333333333333333 9222 3333333333333333333333333333333333333333333333333333333 9223 3333333333333333333333333333333333333333333333333333333 9224 3333333333333333333333333333333333333333333333333333333 9225 3333333333333333333333333333333333333333333333333333333 9226 3333333333333333333333333333333333333333333333333333333 9227 3333333333333333333333333333333333333333333333333333333 9228 3333333333333333333333333333333333333333333333333333333 9229 3333333333333333333333333333333333333333333333333333333 9230 3333333333333333333333333333333333333333333333333333333 9231 3333333333333333333333333333333333333333333333333333333 9232 3333333333333333333333333333333333333333333333333333333 9233 3333333333333333333333333333333333333333333333333333333 9234 3333333333333333333333333333333333333333333333333333333 9235 3333333333333333333333333333333333333333333333333333333 9236 3333333333333333333333333333333333333333333333333333333 9237 3333333333333333333333333333333333333333333333333333333 9238 3333333333333333333333333333333333333333333333333333333 9239 3333333333333333333333333333333333333333333333333333333 9240 3333333333333333333333333333333333333333333333333333333 9241 3333333333333333333333333333333333333333333333333333333 9242 3333333333333333333333333333333333333333333333333333333 9243 3333333333333333333333333333333333333333333333333333333 9244 3333333333333333333333333333333333333333333333333333333 9245 3333333333333333333333333333333333333333333333333333333 9246 3333333333333333333333333333333333333333333333333333333 9247 3333333333333333333333333333333333333333333333333333333 9248 3333333333333333333333333333333333333333333333333333333 9249 3333333333333333333333333333333333333333333333333333333 9250 3333333333333333333333333333333333333333333333333333333 9251 3333333333333333333333333333333333333333333333333333333 9252 3333333333333333333333333333333333333333333333333333333 9253 3333333333333333333333333333333333333333333333333333333 9254 3333333333333333333333333333333333333333333333333333333 9255 3333333333333333333333333333333333333333333333333333333 9256 3333333333333333333333333333333333333333333333333333333 9257 3333333333333333333333333333333333333333333333333333333 9258 3333333333333333333333333333333333333333333333333333333 9259 3333333333333333333333333333333333333333333333333333333 9260 3333333333333333333333333333333333333333333333333333333 9261 3333333333333333333333333333333333333333333333333333333 9262 3333333333333333333333333333333333333333333333333333333 9263 3333333333333333333333333333333333333333333333333333333 9264 3333333333333333333333333333333333333333333333333333333 9265 3333333333333333333333333333333333333333333333333333333 9266 3333333333333333333333333333333333333333333333333333333 9267 3333333333333333333333333333333333333333333333333333333 9268 3333333333333333333333333333333333333333333333333333333 9269 3333333333333333333333333333333333333333333333333333333 9270 3333333333333333333333333333333333333333333333333333333 9271 3333333333333333333333333333333333333333333333333333333 9272 3333333333333333333333333333333333333333333333333333333 9273 3333333333333333333333333333333333333333333333333333333 9274 3333333333333333333333333333333333333333333333333333333 9275 3333333333333333333333333333333333333333333333333333333 9276 3333333333333333333333333333333333333333333333333333333 9277 3333333333333333333333333333333333333333333333333333333 9278 3333333333333333333333333333333333333333333333333333333 9279 3333333333333333333333333333333333333333333333333333333 9280 3333333333333333333333333333333333333333333333333333333 9281 3333333333333333333333333333333333333333333333333333333 9282 3333333333333333333333333333333333333333333333333333333 9283 3333333333333333333333333333333333333333333333333333333 9284 3333333333333333333333333333333333333333333333333333333 9285 3333333333333333333333333333333333333333333333333333333 9286 3333333333333333333333333333333333333333333333333333333 9287 3333333333333333333333333333333333333333333333333333333 9288 3333333333333333333333333333333333333333333333333333333 9289 3333333333333333333333333333333333333333333333333333333 9290 3333333333333333333333333333333333333333333333333333333 9291 3333333333333333333333333333333333333333333333333333333 9292 3333333333333333333333333333333333333333333333333333333 9293 3333333333333333333333333333333333333333333333333333333 9294 3333333333333333333333333333333333333333333333333333333 9295 3333333333333333333333333333333333333333333333333333333 9296 3333333333333333333333333333333333333333333333333333333 9297 3333333333333333333333333333333333333333333333333333333 9298 3333333333333333333333333333333333333333333333333333333 9299 3333333333333333333333333333333333333333333333333333333 9300 3333333333333333333333333333333333333333333333333333333 9301 3333333333333333333333333333333333333333333333333333333 9302 3333333333333333333333333333333333333333333333333333333 9303 3333333333333333333333333333333333333333333333333333333 9304 3333333333333333333333333333333333333333333333333333333 9305 3333333333333333333333333333333333333333333333333333333 9306 3333333333333333333333333333333333333333333333333333333 9307 3333333333333333333333333333333333333333333333333333333 9308 3333333333333333333333333333333333333333333333333333333 9309 3333333333333333333333333333333333333333333333333333333 9310 3333333333333333333333333333333333333333333333333333333 9311 3333333333333333333333333333333333333333333333333333333 9312 3333333333333333333333333333333333333333333333333333333 9313 3333333333333333333333333333333333333333333333333333333 9314 3333333333333333333333333333333333333333333333333333333 9315 3333333333333333333333333333333333333333333333333333333 9316 3333333333333333333333333333333333333333333333333333333 9317 3333333333333333333333333333333333333333333333333333333 9318 3333333333333333333333333333333333333333333333333333333 9319 3333333333333333333333333333333333333333333333333333333 9320 3333333333333333333333333333333333333333333333333333333 9321 3333333333333333333333333333333333333333333333333333333 9322 3333333333333333333333333333333333333333333333333333333 9323 3333333333333333333333333333333333333333333333333333333 9324 3333333333333333333333333333333333333333333333333333333 9325 3333333333333333333333333333333333333333333333333333333 9326 3333333333333333333333333333333333333333333333333333333 9327 3333333333333333333333333333333333333333333333333333333 9328 3333333333333333333333333333333333333333333333333333333 9329 3333333333333333333333333333333333333333333333333333333 9330 3333333333333333333333333333333333333333333333333333333 9331 3333333333333333333333333333333333333333333333333333333 9332 3333333333333333333333333333333333333333333333333333333 9333 3333333333333333333333333333333333333333333333333333333 9334 3333333333333333333333333333333333333333333333333333333 9335 3333333333333333333333333333333333333333333333333333333 9336 3333333333333333333333333333333333333333333333333333333 9337 3333333333333333333333333333333333333333333333333333333 9338 3333333333333333333333333333333333333333333333333333333 9339 3333333333333333333333333333333333333333333333333333333 9340 3333333333333333333333333333333333333333333333333333333 9341 3333333333333333333333333333333333333333333333333333333 9342 3333333333333333333333333333333333333333333333333333333 9343 3333333333333333333333333333333333333333333333333333333 9344 3333333333333333333333333333333333333333333333333333333 9345 3333333333333333333333333333333333333333333333333333333 9346 3333333333333333333333333333333333333333333333333333333 9347 3333333333333333333333333333333333333333333333333333333 9348 3333333333333333333333333333333333333333333333333333333 9349 3333333333333333333333333333333333333333333333333333333 9350 3333333333333333333333333333333333333333333333333333333 9351 3333333333333333333333333333333333333333333333333333333 9352 3333333333333333333333333333333333333333333333333333333 9353 3333333333333333333333333333333333333333333333333333333 9354 3333333333333333333333333333333333333333333333333333333 9355 3333333333333333333333333333333333333333333333333333333 9356 3333333333333333333333333333333333333333333333333333333 9357 3333333333333333333333333333333333333333333333333333333 9358 3333333333333333333333333333333333333333333333333333333 9359 3333333333333333333333333333333333333333333333333333333 9360 3333333333333333333333333333333333333333333333333333333 9361 3333333333333333333333333333333333333333333333333333333 9362 3333333333333333333333333333333333333333333333333333333 9363 3333333333333333333333333333333333333333333333333333333 9364 3333333333333333333333333333333333333333333333333333333 9365 3333333333333333333333333333333333333333333333333333333 9366 3333333333333333333333333333333333333333333333333333333 9367 3333333333333333333333333333333333333333333333333333333 9368 3333333333333333333333333333333333333333333333333333333 9369 3333333333333333333333333333333333333333333333333333333 9370 3333333333333333333333333333333333333333333333333333333 9371 3333333333333333333333333333333333333333333333333333333 9372 3333333333333333333333333333333333333333333333333333333 9373 3333333333333333333333333333333333333333333333333333333 9374 3333333333333333333333333333333333333333333333333333333 9375 3333333333333333333333333333333333333333333333333333333 9376 3333333333333333333333333333333333333333333333333333333 9377 3333333333333333333333333333333333333333333333333333333 9378 3333333333333333333333333333333333333333333333333333333 9379 3333333333333333333333333333333333333333333333333333333 9380 3333333333333333333333333333333333333333333333333333333 9381 3333333333333333333333333333333333333333333333333333333 9382 3333333333333333333333333333333333333333333333333333333 9383 3333333333333333333333333333333333333333333333333333333 9384 3333333333333333333333333333333333333333333333333333333 9385 3333333333333333333333333333333333333333333333333333333 9386 3333333333333333333333333333333333333333333333333333333 9387 3333333333333333333333333333333333333333333333333333333 9388 3333333333333333333333333333333333333333333333333333333 9389 3333333333333333333333333333333333333333333333333333333 9390 3333333333333333333333333333333333333333333333333333333 9391 3333333333333333333333333333333333333333333333333333333 9392 3333333333333333333333333333333333333333333333333333333 9393 3333333333333333333333333333333333333333333333333333333 9394 3333333333333333333333333333333333333333333333333333333 9395 3333333333333333333333333333333333333333333333333333333 9396 3333333333333333333333333333333333333333333333333333333 9397 3333333333333333333333333333333333333333333333333333333 9398 3333333333333333333333333333333333333333333333333333333 9399 3333333333333333333333333333333333333333333333333333333 9400 3333333333333333333333333333333333333333333333333333333 9401 3333333333333333333333333333333333333333333333333333333 9402 3333333333333333333333333333333333333333333333333333333 9403 3333333333333333333333333333333333333333333333333333333 9404 3333333333333333333333333333333333333333333333333333333 9405 3333333333333333333333333333333333333333333333333333333 9406 3333333333333333333333333333333333333333333333333333333 9407 3333333333333333333333333333333333333333333333333333333 9408 3333333333333333333333333333333333333333333333333333333 9409 3333333333333333333333333333333333333333333333333333333 9410 3333333333333333333333333333333333333333333333333333333 9411 3333333333333333333333333333333333333333333333333333333 9412 3333333333333333333333333333333333333333333333333333333 9413 3333333333333333333333333333333333333333333333333333333 9414 3333333333333333333333333333333333333333333333333333333 9415 3333333333333333333333333333333333333333333333333333333 9416 3333333333333333333333333333333333333333333333333333333 9417 3333333333333333333333333333333333333333333333333333333 9418 3333333333333333333333333333333333333333333333333333333 9419 3333333333333333333333333333333333333333333333333333333 9420 3333333333333333333333333333333333333333333333333333333 9421 3333333333333333333333333333333333333333333333333333333 9422 3333333333333333333333333333333333333333333333333333333 9423 3333333333333333333333333333333333333333333333333333333 9424 3333333333333333333333333333333333333333333333333333333 9425 3333333333333333333333333333333333333333333333333333333 9426 3333333333333333333333333333333333333333333333333333333 9427 3333333333333333333333333333333333333333333333333333333 9428 3333333333333333333333333333333333333333333333333333333 9429 3333333333333333333333333333333333333333333333333333333 9430 3333333333333333333333333333333333333333333333333333333 9431 3333333333333333333333333333333333333333333333333333333 9432 3333333333333333333333333333333333333333333333333333333 9433 3333333333333333333333333333333333333333333333333333333 9434 3333333333333333333333333333333333333333333333333333333 9435 3333333333333333333333333333333333333333333333333333333 9436 3333333333333333333333333333333333333333333333333333333 9437 3333333333333333333333333333333333333333333333333333333 9438 3333333333333333333333333333333333333333333333333333333 9439 3333333333333333333333333333333333333333333333333333333 9440 3333333333333333333333333333333333333333333333333333333 9441 3333333333333333333333333333333333333333333333333333333 9442 3333333333333333333333333333333333333333333333333333333 9443 3333333333333333333333333333333333333333333333333333333 9444 3333333333333333333333333333333333333333333333333333333 9445 3333333333333333333333333333333333333333333333333333333 9446 3333333333333333333333333333333333333333333333333333333 9447 3333333333333333333333333333333333333333333333333333333 9448 3333333333333333333333333333333333333333333333333333333 9449 3333333333333333333333333333333333333333333333333333333 9450 3333333333333333333333333333333333333333333333333333333 9451 3333333333333333333333333333333333333333333333333333333 9452 3333333333333333333333333333333333333333333333333333333 9453 3333333333333333333333333333333333333333333333333333333 9454 3333333333333333333333333333333333333333333333333333333 9455 3333333333333333333333333333333333333333333333333333333 9456 3333333333333333333333333333333333333333333333333333333 9457 3333333333333333333333333333333333333333333333333333333 9458 3333333333333333333333333333333333333333333333333333333 9459 3333333333333333333333333333333333333333333333333333333 9460 3333333333333333333333333333333333333333333333333333333 9461 3333333333333333333333333333333333333333333333333333333 9462 3333333333333333333333333333333333333333333333333333333 9463 3333333333333333333333333333333333333333333333333333333 9464 3333333333333333333333333333333333333333333333333333333 9465 3333333333333333333333333333333333333333333333333333333 9466 3333333333333333333333333333333333333333333333333333333 9467 3333333333333333333333333333333333333333333333333333333 9468 3333333333333333333333333333333333333333333333333333333 9469 3333333333333333333333333333333333333333333333333333333 9470 3333333333333333333333333333333333333333333333333333333 9471 3333333333333333333333333333333333333333333333333333333 9472 3333333333333333333333333333333333333333333333333333333 9473 3333333333333333333333333333333333333333333333333333333 9474 3333333333333333333333333333333333333333333333333333333 9475 3333333333333333333333333333333333333333333333333333333 9476 3333333333333333333333333333333333333333333333333333333 9477 3333333333333333333333333333333333333333333333333333333 9478 3333333333333333333333333333333333333333333333333333333 9479 3333333333333333333333333333333333333333333333333333333 9480 3333333333333333333333333333333333333333333333333333333 9481 3333333333333333333333333333333333333333333333333333333 9482 3333333333333333333333333333333333333333333333333333333 9483 3333333333333333333333333333333333333333333333333333333 9484 3333333333333333333333333333333333333333333333333333333 9485 3333333333333333333333333333333333333333333333333333333 9486 3333333333333333333333333333333333333333333333333333333 9487 3333333333333333333333333333333333333333333333333333333 9488 3333333333333333333333333333333333333333333333333333333 9489 3333333333333333333333333333333333333333333333333333333 9490 3333333333333333333333333333333333333333333333333333333 9491 3333333333333333333333333333333333333333333333333333333 9492 3333333333333333333333333333333333333333333333333333333 9493 3333333333333333333333333333333333333333333333333333333 9494 3333333333333333333333333333333333333333333333333333333 9495 3333333333333333333333333333333333333333333333333333333 9496 3333333333333333333333333333333333333333333333333333333 9497 3333333333333333333333333333333333333333333333333333333 9498 3333333333333333333333333333333333333333333333333333333 9499 3333333333333333333333333333333333333333333333333333333 9500 3333333333333333333333333333333333333333333333333333333 9501 3333333333333333333333333333333333333333333333333333333 9502 3333333333333333333333333333333333333333333333333333333 9503 3333333333333333333333333333333333333333333333333333333 9504 3333333333333333333333333333333333333333333333333333333 9505 3333333333333333333333333333333333333333333333333333333 9506 3333333333333333333333333333333333333333333333333333333 9507 3333333333333333333333333333333333333333333333333333333 9508 3333333333333333333333333333333333333333333333333333333 9509 3333333333333333333333333333333333333333333333333333333 9510 3333333333333333333333333333333333333333333333333333333 9511 3333333333333333333333333333333333333333333333333333333 9512 3333333333333333333333333333333333333333333333333333333 9513 3333333333333333333333333333333333333333333333333333333 9514 3333333333333333333333333333333333333333333333333333333 9515 3333333333333333333333333333333333333333333333333333333 9516 3333333333333333333333333333333333333333333333333333333 9517 3333333333333333333333333333333333333333333333333333333 9518 3333333333333333333333333333333333333333333333333333333 9519 3333333333333333333333333333333333333333333333333333333 9520 3333333333333333333333333333333333333333333333333333333 9521 3333333333333333333333333333333333333333333333333333333 9522 3333333333333333333333333333333333333333333333333333333 9523 3333333333333333333333333333333333333333333333333333333 9524 3333333333333333333333333333333333333333333333333333333 9525 3333333333333333333333333333333333333333333333333333333 9526 3333333333333333333333333333333333333333333333333333333 9527 3333333333333333333333333333333333333333333333333333333 9528 3333333333333333333333333333333333333333333333333333333 9529 3333333333333333333333333333333333333333333333333333333 9530 3333333333333333333333333333333333333333333333333333333 9531 3333333333333333333333333333333333333333333333333333333 9532 3333333333333333333333333333333333333333333333333333333 9533 3333333333333333333333333333333333333333333333333333333 9534 3333333333333333333333333333333333333333333333333333333 9535 3333333333333333333333333333333333333333333333333333333 9536 3333333333333333333333333333333333333333333333333333333 9537 3333333333333333333333333333333333333333333333333333333 9538 3333333333333333333333333333333333333333333333333333333 9539 3333333333333333333333333333333333333333333333333333333 9540 3333333333333333333333333333333333333333333333333333333 9541 3333333333333333333333333333333333333333333333333333333 9542 3333333333333333333333333333333333333333333333333333333 9543 3333333333333333333333333333333333333333333333333333333 9544 3333333333333333333333333333333333333333333333333333333 9545 3333333333333333333333333333333333333333333333333333333 9546 3333333333333333333333333333333333333333333333333333333 9547 3333333333333333333333333333333333333333333333333333333 9548 3333333333333333333333333333333333333333333333333333333 9549 3333333333333333333333333333333333333333333333333333333 9550 3333333333333333333333333333333333333333333333333333333 9551 3333333333333333333333333333333333333333333333333333333 9552 3333333333333333333333333333333333333333333333333333333 9553 3333333333333333333333333333333333333333333333333333333 9554 3333333333333333333333333333333333333333333333333333333 9555 3333333333333333333333333333333333333333333333333333333 9556 3333333333333333333333333333333333333333333333333333333 9557 3333333333333333333333333333333333333333333333333333333 9558 3333333333333333333333333333333333333333333333333333333 9559 3333333333333333333333333333333333333333333333333333333 9560 3333333333333333333333333333333333333333333333333333333 9561 3333333333333333333333333333333333333333333333333333333 9562 3333333333333333333333333333333333333333333333333333333 9563 3333333333333333333333333333333333333333333333333333333 9564 3333333333333333333333333333333333333333333333333333333 9565 3333333333333333333333333333333333333333333333333333333 9566 3333333333333333333333333333333333333333333333333333333 9567 3333333333333333333333333333333333333333333333333333333 9568 3333333333333333333333333333333333333333333333333333333 9569 3333333333333333333333333333333333333333333333333333333 9570 3333333333333333333333333333333333333333333333333333333 9571 3333333333333333333333333333333333333333333333333333333 9572 3333333333333333333333333333333333333333333333333333333 9573 3333333333333333333333333333333333333333333333333333333 9574 3333333333333333333333333333333333333333333333333333333 9575 3333333333333333333333333333333333333333333333333333333 9576 3333333333333333333333333333333333333333333333333333333 9577 3333333333333333333333333333333333333333333333333333333 9578 3333333333333333333333333333333333333333333333333333333 9579 3333333333333333333333333333333333333333333333333333333 9580 3333333333333333333333333333333333333333333333333333333 9581 3333333333333333333333333333333333333333333333333333333 9582 3333333333333333333333333333333333333333333333333333333 9583 3333333333333333333333333333333333333333333333333333333 9584 3333333333333333333333333333333333333333333333333333333 9585 3333333333333333333333333333333333333333333333333333333 9586 3333333333333333333333333333333333333333333333333333333 9587 3333333333333333333333333333333333333333333333333333333 9588 3333333333333333333333333333333333333333333333333333333 9589 3333333333333333333333333333333333333333333333333333333 9590 3333333333333333333333333333333333333333333333333333333 9591 3333333333333333333333333333333333333333333333333333333 9592 3333333333333333333333333333333333333333333333333333333 9593 3333333333333333333333333333333333333333333333333333333 9594 3333333333333333333333333333333333333333333333333333333 9595 3333333333333333333333333333333333333333333333333333333 9596 3333333333333333333333333333333333333333333333333333333 9597 3333333333333333333333333333333333333333333333333333333 9598 3333333333333333333333333333333333333333333333333333333 9599 3333333333333333333333333333333333333333333333333333333 9600 3333333333333333333333333333333333333333333333333333333 9601 3333333333333333333333333333333333333333333333333333333 9602 3333333333333333333333333333333333333333333333333333333 9603 3333333333333333333333333333333333333333333333333333333 9604 3333333333333333333333333333333333333333333333333333333 9605 3333333333333333333333333333333333333333333333333333333 9606 3333333333333333333333333333333333333333333333333333333 9607 3333333333333333333333333333333333333333333333333333333 9608 3333333333333333333333333333333333333333333333333333333 9609 3333333333333333333333333333333333333333333333333333333 9610 3333333333333333333333333333333333333333333333333333333 9611 3333333333333333333333333333333333333333333333333333333 9612 3333333333333333333333333333333333333333333333333333333 9613 3333333333333333333333333333333333333333333333333333333 9614 3333333333333333333333333333333333333333333333333333333 9615 3333333333333333333333333333333333333333333333333333333 9616 3333333333333333333333333333333333333333333333333333333 9617 3333333333333333333333333333333333333333333333333333333 9618 3333333333333333333333333333333333333333333333333333333 9619 3333333333333333333333333333333333333333333333333333333 9620 3333333333333333333333333333333333333333333333333333333 9621 3333333333333333333333333333333333333333333333333333333 9622 3333333333333333333333333333333333333333333333333333333 9623 3333333333333333333333333333333333333333333333333333333 9624 3333333333333333333333333333333333333333333333333333333 9625 3333333333333333333333333333333333333333333333333333333 9626 3333333333333333333333333333333333333333333333333333333 9627 3333333333333333333333333333333333333333333333333333333 9628 3333333333333333333333333333333333333333333333333333333 9629 3333333333333333333333333333333333333333333333333333333 9630 3333333333333333333333333333333333333333333333333333333 9631 3333333333333333333333333333333333333333333333333333333 9632 3333333333333333333333333333333333333333333333333333333 9633 3333333333333333333333333333333333333333333333333333333 9634 3333333333333333333333333333333333333333333333333333333 9635 3333333333333333333333333333333333333333333333333333333 9636 3333333333333333333333333333333333333333333333333333333 9637 3333333333333333333333333333333333333333333333333333333 9638 3333333333333333333333333333333333333333333333333333333 9639 3333333333333333333333333333333333333333333333333333333 9640 3333333333333333333333333333333333333333333333333333333 9641 3333333333333333333333333333333333333333333333333333333 9642 3333333333333333333333333333333333333333333333333333333 9643 3333333333333333333333333333333333333333333333333333333 9644 3333333333333333333333333333333333333333333333333333333 9645 3333333333333333333333333333333333333333333333333333333 9646 3333333333333333333333333333333333333333333333333333333 9647 3333333333333333333333333333333333333333333333333333333 9648 3333333333333333333333333333333333333333333333333333333 9649 3333333333333333333333333333333333333333333333333333333 9650 3333333333333333333333333333333333333333333333333333333 9651 3333333333333333333333333333333333333333333333333333333 9652 3333333333333333333333333333333333333333333333333333333 9653 3333333333333333333333333333333333333333333333333333333 9654 3333333333333333333333333333333333333333333333333333333 9655 3333333333333333333333333333333333333333333333333333333 9656 3333333333333333333333333333333333333333333333333333333 9657 3333333333333333333333333333333333333333333333333333333 9658 3333333333333333333333333333333333333333333333333333333 9659 3333333333333333333333333333333333333333333333333333333 9660 3333333333333333333333333333333333333333333333333333333 9661 3333333333333333333333333333333333333333333333333333333 9662 3333333333333333333333333333333333333333333333333333333 9663 3333333333333333333333333333333333333333333333333333333 9664 3333333333333333333333333333333333333333333333333333333 9665 3333333333333333333333333333333333333333333333333333333 9666 3333333333333333333333333333333333333333333333333333333 9667 3333333333333333333333333333333333333333333333333333333 9668 3333333333333333333333333333333333333333333333333333333 9669 3333333333333333333333333333333333333333333333333333333 9670 3333333333333333333333333333333333333333333333333333333 9671 3333333333333333333333333333333333333333333333333333333 9672 3333333333333333333333333333333333333333333333333333333 9673 3333333333333333333333333333333333333333333333333333333 9674 3333333333333333333333333333333333333333333333333333333 9675 3333333333333333333333333333333333333333333333333333333 9676 3333333333333333333333333333333333333333333333333333333 9677 3333333333333333333333333333333333333333333333333333333 9678 3333333333333333333333333333333333333333333333333333333 9679 3333333333333333333333333333333333333333333333333333333 9680 3333333333333333333333333333333333333333333333333333333 9681 3333333333333333333333333333333333333333333333333333333 9682 3333333333333333333333333333333333333333333333333333333 9683 3333333333333333333333333333333333333333333333333333333 9684 3333333333333333333333333333333333333333333333333333333 9685 3333333333333333333333333333333333333333333333333333333 9686 3333333333333333333333333333333333333333333333333333333 9687 3333333333333333333333333333333333333333333333333333333 9688 3333333333333333333333333333333333333333333333333333333 9689 3333333333333333333333333333333333333333333333333333333 9690 3333333333333333333333333333333333333333333333333333333 9691 3333333333333333333333333333333333333333333333333333333 9692 3333333333333333333333333333333333333333333333333333333 9693 3333333333333333333333333333333333333333333333333333333 9694 3333333333333333333333333333333333333333333333333333333 9695 3333333333333333333333333333333333333333333333333333333 9696 3333333333333333333333333333333333333333333333333333333 9697 3333333333333333333333333333333333333333333333333333333 9698 3333333333333333333333333333333333333333333333333333333 9699 3333333333333333333333333333333333333333333333333333333 9700 3333333333333333333333333333333333333333333333333333333 9701 3333333333333333333333333333333333333333333333333333333 9702 3333333333333333333333333333333333333333333333333333333 9703 3333333333333333333333333333333333333333333333333333333 9704 3333333333333333333333333333333333333333333333333333333 9705 3333333333333333333333333333333333333333333333333333333 9706 3333333333333333333333333333333333333333333333333333333 9707 3333333333333333333333333333333333333333333333333333333 9708 3333333333333333333333333333333333333333333333333333333 9709 3333333333333333333333333333333333333333333333333333333 9710 3333333333333333333333333333333333333333333333333333333 9711 3333333333333333333333333333333333333333333333333333333 9712 3333333333333333333333333333333333333333333333333333333 9713 3333333333333333333333333333333333333333333333333333333 9714 3333333333333333333333333333333333333333333333333333333 9715 3333333333333333333333333333333333333333333333333333333 9716 3333333333333333333333333333333333333333333333333333333 9717 3333333333333333333333333333333333333333333333333333333 9718 3333333333333333333333333333333333333333333333333333333 9719 3333333333333333333333333333333333333333333333333333333 9720 3333333333333333333333333333333333333333333333333333333 9721 3333333333333333333333333333333333333333333333333333333 9722 3333333333333333333333333333333333333333333333333333333 9723 3333333333333333333333333333333333333333333333333333333 9724 3333333333333333333333333333333333333333333333333333333 9725 3333333333333333333333333333333333333333333333333333333 9726 3333333333333333333333333333333333333333333333333333333 9727 3333333333333333333333333333333333333333333333333333333 9728 3333333333333333333333333333333333333333333333333333333 9729 3333333333333333333333333333333333333333333333333333333 9730 3333333333333333333333333333333333333333333333333333333 9731 3333333333333333333333333333333333333333333333333333333 9732 3333333333333333333333333333333333333333333333333333333 9733 3333333333333333333333333333333333333333333333333333333 9734 3333333333333333333333333333333333333333333333333333333 9735 3333333333333333333333333333333333333333333333333333333 9736 3333333333333333333333333333333333333333333333333333333 9737 3333333333333333333333333333333333333333333333333333333 9738 3333333333333333333333333333333333333333333333333333333 9739 3333333333333333333333333333333333333333333333333333333 9740 3333333333333333333333333333333333333333333333333333333 9741 3333333333333333333333333333333333333333333333333333333 9742 3333333333333333333333333333333333333333333333333333333 9743 3333333333333333333333333333333333333333333333333333333 9744 3333333333333333333333333333333333333333333333333333333 9745 3333333333333333333333333333333333333333333333333333333 9746 3333333333333333333333333333333333333333333333333333333 9747 3333333333333333333333333333333333333333333333333333333 9748 3333333333333333333333333333333333333333333333333333333 9749 3333333333333333333333333333333333333333333333333333333 9750 3333333333333333333333333333333333333333333333333333333 9751 3333333333333333333333333333333333333333333333333333333 9752 3333333333333333333333333333333333333333333333333333333 9753 3333333333333333333333333333333333333333333333333333333 9754 3333333333333333333333333333333333333333333333333333333 9755 3333333333333333333333333333333333333333333333333333333 9756 3333333333333333333333333333333333333333333333333333333 9757 3333333333333333333333333333333333333333333333333333333 9758 3333333333333333333333333333333333333333333333333333333 9759 3333333333333333333333333333333333333333333333333333333 9760 3333333333333333333333333333333333333333333333333333333 9761 3333333333333333333333333333333333333333333333333333333 9762 3333333333333333333333333333333333333333333333333333333 9763 3333333333333333333333333333333333333333333333333333333 9764 3333333333333333333333333333333333333333333333333333333 9765 3333333333333333333333333333333333333333333333333333333 9766 3333333333333333333333333333333333333333333333333333333 9767 3333333333333333333333333333333333333333333333333333333 9768 3333333333333333333333333333333333333333333333333333333 9769 3333333333333333333333333333333333333333333333333333333 9770 3333333333333333333333333333333333333333333333333333333 9771 3333333333333333333333333333333333333333333333333333333 9772 3333333333333333333333333333333333333333333333333333333 9773 3333333333333333333333333333333333333333333333333333333 9774 3333333333333333333333333333333333333333333333333333333 9775 3333333333333333333333333333333333333333333333333333333 9776 3333333333333333333333333333333333333333333333333333333 9777 3333333333333333333333333333333333333333333333333333333 9778 3333333333333333333333333333333333333333333333333333333 9779 3333333333333333333333333333333333333333333333333333333 9780 3333333333333333333333333333333333333333333333333333333 9781 3333333333333333333333333333333333333333333333333333333 9782 3333333333333333333333333333333333333333333333333333333 9783 3333333333333333333333333333333333333333333333333333333 9784 3333333333333333333333333333333333333333333333333333333 9785 3333333333333333333333333333333333333333333333333333333 9786 3333333333333333333333333333333333333333333333333333333 9787 3333333333333333333333333333333333333333333333333333333 9788 3333333333333333333333333333333333333333333333333333333 9789 3333333333333333333333333333333333333333333333333333333 9790 3333333333333333333333333333333333333333333333333333333 9791 3333333333333333333333333333333333333333333333333333333 9792 3333333333333333333333333333333333333333333333333333333 9793 3333333333333333333333333333333333333333333333333333333 9794 3333333333333333333333333333333333333333333333333333333 9795 3333333333333333333333333333333333333333333333333333333 9796 3333333333333333333333333333333333333333333333333333333 9797 3333333333333333333333333333333333333333333333333333333 9798 3333333333333333333333333333333333333333333333333333333 9799 3333333333333333333333333333333333333333333333333333333 9800 3333333333333333333333333333333333333333333333333333333 9801 3333333333333333333333333333333333333333333333333333333 9802 3333333333333333333333333333333333333333333333333333333 9803 3333333333333333333333333333333333333333333333333333333 9804 3333333333333333333333333333333333333333333333333333333 9805 3333333333333333333333333333333333333333333333333333333 9806 3333333333333333333333333333333333333333333333333333333 9807 3333333333333333333333333333333333333333333333333333333 9808 3333333333333333333333333333333333333333333333333333333 9809 3333333333333333333333333333333333333333333333333333333 9810 3333333333333333333333333333333333333333333333333333333 9811 3333333333333333333333333333333333333333333333333333333 9812 3333333333333333333333333333333333333333333333333333333 9813 3333333333333333333333333333333333333333333333333333333 9814 3333333333333333333333333333333333333333333333333333333 9815 3333333333333333333333333333333333333333333333333333333 9816 3333333333333333333333333333333333333333333333333333333 9817 3333333333333333333333333333333333333333333333333333333 9818 3333333333333333333333333333333333333333333333333333333 9819 3333333333333333333333333333333333333333333333333333333 9820 3333333333333333333333333333333333333333333333333333333 9821 3333333333333333333333333333333333333333333333333333333 9822 3333333333333333333333333333333333333333333333333333333 9823 3333333333333333333333333333333333333333333333333333333 9824 3333333333333333333333333333333333333333333333333333333 9825 3333333333333333333333333333333333333333333333333333333 9826 3333333333333333333333333333333333333333333333333333333 9827 3333333333333333333333333333333333333333333333333333333 9828 3333333333333333333333333333333333333333333333333333333 9829 3333333333333333333333333333333333333333333333333333333 9830 3333333333333333333333333333333333333333333333333333333 9831 3333333333333333333333333333333333333333333333333333333 9832 3333333333333333333333333333333333333333333333333333333 9833 3333333333333333333333333333333333333333333333333333333 9834 3333333333333333333333333333333333333333333333333333333 9835 3333333333333333333333333333333333333333333333333333333 9836 3333333333333333333333333333333333333333333333333333333 9837 3333333333333333333333333333333333333333333333333333333 9838 3333333333333333333333333333333333333333333333333333333 9839 3333333333333333333333333333333333333333333333333333333 9840 3333333333333333333333333333333333333333333333333333333 9841 3333333333333333333333333333333333333333333333333333333 9842 3333333333333333333333333333333333333333333333333333333 9843 3333333333333333333333333333333333333333333333333333333 9844 3333333333333333333333333333333333333333333333333333333 9845 3333333333333333333333333333333333333333333333333333333 9846 3333333333333333333333333333333333333333333333333333333 9847 3333333333333333333333333333333333333333333333333333333 9848 3333333333333333333333333333333333333333333333333333333 9849 3333333333333333333333333333333333333333333333333333333 9850 3333333333333333333333333333333333333333333333333333333 9851 3333333333333333333333333333333333333333333333333333333 9852 3333333333333333333333333333333333333333333333333333333 9853 3333333333333333333333333333333333333333333333333333333 9854 3333333333333333333333333333333333333333333333333333333 9855 3333333333333333333333333333333333333333333333333333333 9856 3333333333333333333333333333333333333333333333333333333 9857 3333333333333333333333333333333333333333333333333333333 9858 3333333333333333333333333333333333333333333333333333333 9859 3333333333333333333333333333333333333333333333333333333 9860 3333333333333333333333333333333333333333333333333333333 9861 3333333333333333333333333333333333333333333333333333333 9862 3333333333333333333333333333333333333333333333333333333 9863 3333333333333333333333333333333333333333333333333333333 9864 3333333333333333333333333333333333333333333333333333333 9865 3333333333333333333333333333333333333333333333333333333 9866 3333333333333333333333333333333333333333333333333333333 9867 3333333333333333333333333333333333333333333333333333333 9868 3333333333333333333333333333333333333333333333333333333 9869 3333333333333333333333333333333333333333333333333333333 9870 3333333333333333333333333333333333333333333333333333333 9871 3333333333333333333333333333333333333333333333333333333 9872 3333333333333333333333333333333333333333333333333333333 9873 3333333333333333333333333333333333333333333333333333333 9874 3333333333333333333333333333333333333333333333333333333 9875 3333333333333333333333333333333333333333333333333333333 9876 3333333333333333333333333333333333333333333333333333333 9877 3333333333333333333333333333333333333333333333333333333 9878 3333333333333333333333333333333333333333333333333333333 9879 3333333333333333333333333333333333333333333333333333333 9880 3333333333333333333333333333333333333333333333333333333 9881 3333333333333333333333333333333333333333333333333333333 9882 3333333333333333333333333333333333333333333333333333333 9883 3333333333333333333333333333333333333333333333333333333 9884 3333333333333333333333333333333333333333333333333333333 9885 3333333333333333333333333333333333333333333333333333333 9886 3333333333333333333333333333333333333333333333333333333 9887 3333333333333333333333333333333333333333333333333333333 9888 3333333333333333333333333333333333333333333333333333333 9889 3333333333333333333333333333333333333333333333333333333 9890 3333333333333333333333333333333333333333333333333333333 9891 3333333333333333333333333333333333333333333333333333333 9892 3333333333333333333333333333333333333333333333333333333 9893 3333333333333333333333333333333333333333333333333333333 9894 3333333333333333333333333333333333333333333333333333333 9895 3333333333333333333333333333333333333333333333333333333 9896 3333333333333333333333333333333333333333333333333333333 9897 3333333333333333333333333333333333333333333333333333333 9898 3333333333333333333333333333333333333333333333333333333 9899 3333333333333333333333333333333333333333333333333333333 9900 3333333333333333333333333333333333333333333333333333333 9901 3333333333333333333333333333333333333333333333333333333 9902 3333333333333333333333333333333333333333333333333333333 9903 3333333333333333333333333333333333333333333333333333333 9904 3333333333333333333333333333333333333333333333333333333 9905 3333333333333333333333333333333333333333333333333333333 9906 3333333333333333333333333333333333333333333333333333333 9907 3333333333333333333333333333333333333333333333333333333 9908 3333333333333333333333333333333333333333333333333333333 9909 3333333333333333333333333333333333333333333333333333333 9910 3333333333333333333333333333333333333333333333333333333 9911 3333333333333333333333333333333333333333333333333333333 9912 3333333333333333333333333333333333333333333333333333333 9913 3333333333333333333333333333333333333333333333333333333 9914 3333333333333333333333333333333333333333333333333333333 9915 3333333333333333333333333333333333333333333333333333333 9916 3333333333333333333333333333333333333333333333333333333 9917 3333333333333333333333333333333333333333333333333333333 9918 3333333333333333333333333333333333333333333333333333333 9919 3333333333333333333333333333333333333333333333333333333 9920 3333333333333333333333333333333333333333333333333333333 9921 3333333333333333333333333333333333333333333333333333333 9922 3333333333333333333333333333333333333333333333333333333 9923 3333333333333333333333333333333333333333333333333333333 9924 3333333333333333333333333333333333333333333333333333333 9925 3333333333333333333333333333333333333333333333333333333 9926 3333333333333333333333333333333333333333333333333333333 9927 3333333333333333333333333333333333333333333333333333333 9928 3333333333333333333333333333333333333333333333333333333 9929 3333333333333333333333333333333333333333333333333333333 9930 3333333333333333333333333333333333333333333333333333333 9931 3333333333333333333333333333333333333333333333333333333 9932 3333333333333333333333333333333333333333333333333333333 9933 3333333333333333333333333333333333333333333333333333333 9934 3333333333333333333333333333333333333333333333333333333 9935 3333333333333333333333333333333333333333333333333333333 9936 3333333333333333333333333333333333333333333333333333333 9937 3333333333333333333333333333333333333333333333333333333 9938 3333333333333333333333333333333333333333333333333333333 9939 3333333333333333333333333333333333333333333333333333333 9940 3333333333333333333333333333333333333333333333333333333 9941 3333333333333333333333333333333333333333333333333333333 9942 3333333333333333333333333333333333333333333333333333333 9943 3333333333333333333333333333333333333333333333333333333 9944 3333333333333333333333333333333333333333333333333333333 9945 3333333333333333333333333333333333333333333333333333333 9946 3333333333333333333333333333333333333333333333333333333 9947 3333333333333333333333333333333333333333333333333333333 9948 3333333333333333333333333333333333333333333333333333333 9949 3333333333333333333333333333333333333333333333333333333 9950 3333333333333333333333333333333333333333333333333333333 9951 3333333333333333333333333333333333333333333333333333333 9952 3333333333333333333333333333333333333333333333333333333 9953 3333333333333333333333333333333333333333333333333333333 9954 3333333333333333333333333333333333333333333333333333333 9955 3333333333333333333333333333333333333333333333333333333 9956 3333333333333333333333333333333333333333333333333333333 9957 3333333333333333333333333333333333333333333333333333333 9958 3333333333333333333333333333333333333333333333333333333 9959 3333333333333333333333333333333333333333333333333333333 9960 3333333333333333333333333333333333333333333333333333333 9961 3333333333333333333333333333333333333333333333333333333 9962 3333333333333333333333333333333333333333333333333333333 9963 3333333333333333333333333333333333333333333333333333333 9964 3333333333333333333333333333333333333333333333333333333 9965 3333333333333333333333333333333333333333333333333333333 9966 3333333333333333333333333333333333333333333333333333333 9967 3333333333333333333333333333333333333333333333333333333 9968 3333333333333333333333333333333333333333333333333333333 9969 3333333333333333333333333333333333333333333333333333333 9970 3333333333333333333333333333333333333333333333333333333 9971 3333333333333333333333333333333333333333333333333333333 9972 3333333333333333333333333333333333333333333333333333333 9973 3333333333333333333333333333333333333333333333333333333 9974 3333333333333333333333333333333333333333333333333333333 9975 3333333333333333333333333333333333333333333333333333333 9976 3333333333333333333333333333333333333333333333333333333 9977 3333333333333333333333333333333333333333333333333333333 9978 3333333333333333333333333333333333333333333333333333333 9979 3333333333333333333333333333333333333333333333333333333 9980 3333333333333333333333333333333333333333333333333333333 9981 3333333333333333333333333333333333333333333333333333333 9982 3333333333333333333333333333333333333333333333333333333 9983 3333333333333333333333333333333333333333333333333333333 9984 3333333333333333333333333333333333333333333333333333333 9985 3333333333333333333333333333333333333333333333333333333 9986 3333333333333333333333333333333333333333333333333333333 9987 3333333333333333333333333333333333333333333333333333333 9988 3333333333333333333333333333333333333333333333333333333 9989 3333333333333333333333333333333333333333333333333333333 9990 3333333333333333333333333333333333333333333333333333333 9991 3333333333333333333333333333333333333333333333333333333 9992 3333333333333333333333333333333333333333333333333333333 9993 3333333333333333333333333333333333333333333333333333333 9994 3333333333333333333333333333333333333333333333333333333 9995 3333333333333333333333333333333333333333333333333333333 9996 3333333333333333333333333333333333333333333333333333333 9997 3333333333333333333333333333333333333333333333333333333 9998 3333333333333333333333333333333333333333333333333333333 9999 3333333333333333333333333333333333333333333333333333333 jetty-6.1.26/examples/test-webapp/src/main/webapp/jetty_banner.gif0000644000175000017500000017755010342241254023700 0ustar moonmoonGIF89aÓ<çÿ    '1)3#-6%$%#<-? (|EF*--+ 1™S$#231)ë?/0/í=33Z#:H11X';8973ÿ4û6ì1Ù<ï?â;ÿ9Þ0éA@>8îo,DP>;@ýDÐ BîLABZ<;Hòu.@KåCïDàIÿFHF :úJý~-G#=ì%?ÝDðEñMðTõEû"GìUþWéNñOPN%HîPäOò‘3D(IïPôOÿ+Lâ^÷ WÿXò_ø RçPü`ù_ÿ QôYìYôUVS#SïZõ&Tðaÿ(Uñ'Sÿ[ö¡7M¯2BZý+Uò]écöjÿ7Qð\÷,Uú.Xæcý­7=dï"]ñ[]Zd÷&^ò«<>'_ì&]ÿeø(_ôg\]eÿ)_û*`õ`a^fùhìÈ549[ñoù-aö"gÿ/aþoÿ$iõzZ[â1&&jömbbÇ=43fìegdqü5eó?að)k÷Ê?05eû+kÿ,lùÁCOû3â=!%uù|ÿ&uÿæ:24pöý6 ?lómnkKgðý6ÿ7 7qÿ‡hiü? GróPnñUsÍ3{ÿ>w÷0~ütvsÿBý@!stýA)E~÷z|y\uñSzõ†z{W€õ‚O…øg‚󆇅]‰÷‹Šuˆôqõ‘n’÷i–ø•—”}–õ…”ôw›÷›š…žö ¢Ÿ~£ù¥§¤ˆ§ø”¥÷©«¨”¬øŽ¯ù­®«°²¯¯ö¤­ö™µú´¶³¢¹ù©¶÷¹»¸½¿¼ªÀúÀÿ³ÆúÆÈŽÍûÍÏÌÊÍøÆÒúÂÖüÔÖÒÐ×ûËÛüÚÜØÕàüàâÞàäôÞæüåæðæèåâéÿëíêìí÷êîþñóðñòöóôþ÷úöõûýûøýøýÿüþúþÿüÿÿÿ!ÿ NETSCAPE2.0!ùÿ,Ó<þaH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£ÇþBŠI²¤É“(Sª\ɲ¥Ë—0cÊœù’µ\‡ÖÚÉs &ž@eùÙ'Kž}ŠæAÔ“N }íô©ó)&LˆòLÉb4‘¡W±fñj¤¬‘C‰®¦}z(¬Û5:“æì têϺ‡„5ŠT)S§u£Ú­ºójÖ­]¿ºJÖ,Zµ€ »½ ÷\¶l{Þ­«×2ßIÇþ} ƒ¦éÓ¨S«^ͺ5?sÊP!J”¥-*T›óÔ>”gLŽ1·1¹1e "c’cÚÍUj^Ƙ­IôéЧ¦yÙ!EžO®>þEŒ)”˜`yr•ö§ÔD¨>ÅO”h'×ñ˳ж›§î½ýÜpÅ—ÜËÙ—…sˆ@'uÖa‡ˆvÜyžxkfzê±wU^hÅ7_}‡Ü×Wûaœ»n‡œrÌåQZk8æ¨ãŽ<öXÏ6½´qFnøÈ%}øqÆW gÔF¼pF"}r†/Œ0 ;¼@DgLÙG˜mô!ägÒGe2åFQ~Œ±Yø! VaõqI P¹Ý•„’Èyø!¤QU&¥›Œ"&´áÆE™ä’MŽñd”bZ‰¥–\z ¦˜dš¹dšk¶I$œrÒi'žþWéɧŸ;*(¡†ž¨škfÁ¨ŽB*)¥F"©$“NŽÉ)•žf¹e—_†I%7öhíµØf‹-;ÐŒFT0A¸^€a®TØ.A¨.`0Á„ h`‚ Aáº`aB ð²D‘Ra°ºTLâ,¨ .4bºvðɧÁN¡¡BEƒÛFvTÑT a.ÉŠL²r¸ãRQî¹é®Ûî»ñÎ[ï½ùîKE¿ÿœ/Áà ®Â ;|rħk±ÇTd¼qLJ<.É&£¬ò·v´ü²¸äš Å6»kGÀ:Û‹¯¾ü‘BµÚÆ-÷Üt«„O8Å2DþCL²Èó[D$xAÅà$ ‚»Ÿ]»÷ú„LÐàCá:Ñ4Áè2á…&TaîÅ`TQ Ÿè!o°0I#L¬.Ƀ ò¸µÇÎÄÞ}ã8¸‚n8âŠ3>1ûk‚ä”[Ž9š£Ëy¸Ÿ‡>ºÇ¥Ÿ{Ê«·þzì!Ó^òø¸—¬;ï~#üwº?#><áÅSÑ8ò›ðvÝøç¯?¶ïLóÊÂ2“]ìFfseÎ,` ò58&¬…˜X¹&66Øñ eá*‚&¡®íÉÌL( ø&Ƨ‘Œ{E𪠉ý d±ÉÊe°ÛÉ+€$œ]Q=*þAp  (Á±Ðü‘·Á¢ëƒ!„˜ì*)¢P…,t¡º`8¾bІâÚW hÀ&pAhà#h‡ Qpƒ‰4æHÇ:ÒQýÈ£÷ÇG¹µÃŽsIþHAÂD°q™ e§DsA/c>P ˜ˆIT2và‹úF;‹MdüJW#`g0 b!lCøÔˆIígm˜|P‰JTác&«Øì6Iƒäe‹lšØâåHJ’’–´¤. /N’u²åÏDIJ*˜•[d¥+ KYÒÒ–¸$ÙO6„^²ë—W_#‰iÌI^R™™lfù!‡8ºDþȧ>÷©OR€#ùÐãûHе#ü̧4ð˜Çƒ& è@Oò£]âd&×&Í¥:-pw“ÞÉPvK˜‘Ìw«Y×<*]E(B âEE$†O†ßb— ¦¦Õ‰PNxÜ·d†Á’aÔŠÝ$ä>:„^Í€%›ôÔ•Rª*‚¥˜{éádJSÔ5nd8e»xêSˆU¨a;XÖ2ú³­uÔLuêÈ j0©Ž+ ölI>AÀ×¾ú)JØ€N´ ˆM Bð×À>ƒ°‹m,[X‰–„êpF(4JAÕQy>H dZˆí™,]§]ßÞ°&ÎíåP ‚ãþšÒ'p.vPD%TYÑU &¤ÈQ s=Ž›µ»ÂŒ¨ÔϦP´¤5-ðR‹°Õµ¦éÒ%lÛ'[ÚÚ“HÔ-o} 2à w\Ä5®¸V2år¶€ž•×s]tÖ¨¾KM†W™à²°€,‹&Ö.¬aû¡­<¢ÆÁ‰M‰Pƒ`²„p…|aÊ*X $ÁÇ7€QÀ…‘ì‘ȃkháÅ4 "·d¹D˜ÅxUPnd°…ÞÖ$§º@(¨|Ú­4=V²‚ ¡P/çT ã‚ÁÄg+fŠI°bˆ…ƒÙí-íÀ5c–ÂÆSͱv„ÿØdAf2þºˆ\#Ã+É`xÜ’mWRÑAÅEP1 X|åkÙj]¶C^WÒ€€Àˆ¾0)æàFW–Á§±c&=iX:=¬¤)ÝK+Ó™†t„C‚PpbÀœÈç3ü‹|žZÀ©@3mC8$ÜZE[wÇë øà‡âd¤&§9Å%S¡’“Xå2AÀì[ qöµäHfI¬a¬œDÌÆÆ.L’’(‹ao6„_ªîÜìúõƒ-Lx[vÆF¶²ÁÇì“6-М¦½ÁH™¯bØž„¶9ÛíoÏôØ0.©ʽktûØËä—»QVì[à«ìoL&|D8ŸËˆG<þæArGôÖþ}hB?ýè=þWåúd9a-;j ¸P@£m>`œëœÖ ž9„÷1dTq‡4¨Ü¾ià4ðá.^uš²FhobÚÛëN@'Ð+`Pìü­K1Y{ØS¢¯9@Ü5o±v;Ì¥¹’n90½¦S…:±G8@#¶ÁêÐÌú%f]¯sìb/aÍ2´OÓ\ko;ÂÕ\ÞÒ‘lîJ·{Ó7Ç̨G¼ïU¯D=cÒW{\À–Èg;Vß‘3:臅É^ýz‡Úמ©‚OžÇÙ÷Õö·Ïýî,j‚–úÕŽõ/HÎ ÓÃ:ŸË'¹ôM¾`È#¶è¤ºœþðë Ñ…?‹Ý·JÊÏ—l¨`¨ÄU¡™]f²ïg¡ B!´çÊÅ«Yb£$'Æ4Ö†JP,†º¤RºÔÜÇÞW à'Eãw;Çwç§QêçICAâòD`óÇ'õWv÷‡D̶Iû§ý÷ããZÚG€Ý÷}Ë%~'ÀR—C¢Š q/O  8˜ƒ:¨ –è€ë°«7r¯'t);˜„@WXÏOI¸ƒKØ„-WP¶ƒ>'rñ†…Z†%Wk¼§çà £À[¨“1&0’`KÒTyW³wGU4EE5ƒoðZNPZ>¦&ƒ5Ä4%t.þ±IA°Y!4@¶S3½µ†þâ†pØ4rxB X‡—BxøDzHI°µI~ˆŠ ˆûUˆsˆc“ˆ*°ˆ±4€¸E«;lH‰½e‰;4‡™8Bvȉ4xO†…:xat@ÆøƒBèzAG|¡ÖŒý@ Á(Œ8xa‘ }¯—`ÐÒ8PÓG}ÌèŒÅg͈Îèâàj:k¼°zÕ Ž9ÈŽ«„¬G„°×ô0b"µ=A`€C272ÉÜ$>¨#>ì¢u$$/¯81ÀMÞÆB;$eWI.”5é/TI3N¹Ô·d‘TÐé4M“>ÏDUÇvM„þJĉH‘ô2‘•4;à¥y2).¹4³’#9=&ù”’á²’åSS “£…süÄ à¼°:°•:^ù•œ–“ö •GœÐÛ¨ ùô•nù•h©–ÛØ–o™¤@ `)–” %z©— % –|)Qh^˜í„ˆ©ƒ8—AøƒÈ˜ŒEPüÀ-¯P1·¸p¦äÐ Êæ@Oµ7:äˆÈ9CP1Ð9ÖRâ‚7dB»³5û22»“0×9È# ³£þWS˜äˆbS,ðYPËæÙ94Z 68ºQ1JÕ^HšNAj.CK}#p.Iº¤ Ô¤¨ó¤[¥S*/U:EW.Yº¥ ×¥*ó¥áÓ£cÚþG0h(‘OÀ—¨¶XÁ€–{¥¨ ©€•O à ˆ |kÉ ‘Ú‰š©›šOœ©µ‡sƒ•¢º¨à ú ©z8÷ „u˜R˜Oà¢à˜µ Ú ¾ú«ä„­w™ï@ ¶oMÃûF\þV` ÀD@ÒÊMcóeܳ‘ûÒ7+©jÐ$Ð(=ŸÓà1Ajö¤iTbõmš$!“¬Ëz:Í):КN:ôJÕzKªƒ­ çlTÀ­Þ ®W%®>@®æŠ®`ö4T5ˆ#/ï MñŠ¥>À¬õú¬ÑÚžúÊ™×Z@Q`¨'…kXŽ*—k¹–ð¡ö˜'›þ©-{²w€¨ki`¤€`–Š„k™OÝ ³Ûˆs¿Ðh7Û¡8ø¡€¢ËP¢:ø¡t Wé Þp•â¬-š÷PtÔ^à2^÷M‘X3çV5X0>©³2!ï`°¤i7Eh>†w '9ó'>Så¶.ù.*”~!£IÑ3Z»<µÔµêòµ ¶Ò´5[f¶hûn:m+±C·»5EóÄ‹´c·€·/{›µ[û·«äµE:¸b›2d»E¤+1…*{8;—út/{²œð¡]øº J»ÒxaàºÛHÒ'² ª³¾+Ê ÒG«:h`Ð ¾š«,‹ƒÈ[ ÞÐ Ò+½Þà«Âþ:rµö×€ F”2ªSÞf…ÀF3Ez‹¶3lEA^pUÓ3)Õc¡Cò5í’t)5L­å›EC8`° LìâÎ6ß¾ãKB̵;$e;ççnë[bî»=ðkvó[¿ø£ú‹=bÓ¿©ù¿$À¬;“sÀ |/ \1 |¾,: _ì{U© Œ«+Œq O5`»k¹Ã>…B;ÄC›OBÌºÇ rG›ÃQ؃Í×¼Qkä r䀴 €@âð„j¢ÐÒ« Ú` dÜ àµ-zæ€ „Pã'_“B… ³7‘‚2$%¹*£JXc@þÝ™.Ûe‡*àðcÃ…€¦ÒY†€íW1kjyCÐ0A0 Mú’`w2r Zu|ÇD£Ç;Ú4}œK¢LNgƒ|y…|ÈTK‹¤¬éÈRÇ^$4É&SÉ­ˆÉS$0q,›žlÇ|‚Ç>¹ÇŒTÊŒÊc [±°–8F…ZÍëˆÍñ¨O(›OA¸‘ÍkéZ¬³+;,™AÎ7¨ƒ@Ü«¬ 휃@ü dl ÕÏÖÐ ÕK-š»P$ÐKA@C ã §ó¯ês0#DlcqéÒÐ'4Rã²oÒ’Ã7 Ø^°/¥5ÑÙ•“5p…þp¡0?‰CÐ]Ð ½Ð ­­"ÑÂö~=Dã4.€¬ÑŒ:ý§Òv0ÒÇVÒkÊ>^G*ÍÒ=8/ÐÊ*ÓÑY31ó‚å7ÑSѱsÃ-—#›OѼ@¼Oc-älÖa½Ÿg-ŒE•Rœ„8gÇØ˜&+ŒùTjIŒÖ Áº³i¹ƒ¥LëÅw­ µeœÏsT fÜÏ-ÊÑP &©8ø²tËú†£2%¥Dª„:?CA+™“Esb36ÔÐ{K§Q«é}äRIUá’/‹É©¬øbÙÒVw Ù W:Ôú-³È/¢í‰™>ë…Ú Ú:½RíþõÚm58.¹cÔ9¸]IW—ˆ½-I¿ÙMÊÙÅýÙÛÃ\£½ÜTàÕ,Á¡¢ðÞðߢ OM ßö­rö-ßi­Oqßñm ýíßïM•@aþÞåOà` î-à@| ùtàï=¼¾Jò,ß º àŸß  øã#5Wëå4¤„Ab³ã±ìãHäC^äxxäìC;JîLžCñ’gPN0RîÈUî.Žå2¾Aþ[nãýåG^[<^9cÃÞ*ñ_^Öpà@ ŽŽ– áä $jjŒžO±p—Ž~ ¼ ÄÐj–îà˜®é±Àéz-áyMÆ·ÐáŽs+€P á±ö Ý`ØòX ÝPéõß!þ Â>âû R‹½Ú› ~Ã^ËÎ$~yü-#£:b³CÔ®¶«4 âÇü2A^€/… mnçtË)Rƒçðò_Ö4A”8MÚQ7‡».ÏN¯5Î7ðr.¥¹²S:•´í?þdcóíò'îGîÊ•ðm$Tê.MíNハÓ$ï+IïÐÞçø^íûnD”íoÌìÏéžþÖ áÓÌO.àùt—¬îß8‘0óšnê€ðòùó3 5Îèª6â.á­qôJ¿ôq€sÏúyòrÑõž×Õ Ã.쎭¼Á:¬l¬ P~¼ø3ø26:ÊåJµïð[1?V­æâ[ý2¬Óv·>WÛ7G6ÓÅ.sl®=ýÈ&P­ÊTn—‰Âvö³½žÍ”ïçFBoïÂ¥Cq[ó-uïwu›ýn5Ó÷Að÷ÖºIƒ_ø’û’ÇXÍ/ŒŸöœ¼öJÕöm ÷•Ÿ.ëÖë.»$ßêðûÀßûþýà)üùM²€ü4 ¼ð ¹þjüöüÊÏó±`α~à8—ǰ ËPà+ïßùt ·Ð˜û9t ì zë`ÑËài©þÀØÂÞ \¯ &n™ð° $†Üý3Ê:ZaLm2„ •*TÀ´ ±’@;v˜Ø©b°ŠB/`˜(Š ;TÙ ÔÈN›!mF´3I@/T˜˜’0¡M*4ø£(¤F#Á€©èåÊ‘™ø)àà 6|1ÐD¤1jäè¤H’&Qªdé’aE™4mâÔ¹ð©O B‰íª4S£O£,XU!C‡%Rôš£ þ?† ¹œD]Æœ™eq2þZt ‚ è,3et\ŠD*¯_¨=«ÅÚ5ز-¨[TI‚ãEÙ²ê8”‰#•AzêÕ­wY¶¬ åσ(ë¦ ÷ÌÞüª&íÙ³fÍžI³Ö 9tëâÍ»ÇÚ*‡÷¶ƒ —Ž¢Á&¢,Á‚A¤(";„"©¥•Ú(Ê£}à ½²òoŒHb %Kòbˆ"L"&V ‚8¸¨’NTÊé¡ý[)ÀÁ(ðÀKZ°ÁK:ª )´ÃÂ60tjÃ?„(Ä+rÉĤR„ÑEe¤ÑqlðÉþ–P@ƒDPA|0É%©þР'‹²¢±ÈötL ®9å„#44âtˆePæ(££‹.x‹m¶[MPGí-ÑÔp£,ÚèøS8Ò,ø¥Ô`ˆ9f™f¤©¦UõšYæYQ .³Qó†ÖÏHƒ ½õÚs¯mº‡œuÚ¹žpŒIá@Nt‰ †l ¢Hjèͣ⤪0:©°¤oƒ ©¨$”ž Ä̯”l·&4,ÂL`‚|  I*ù‰'?ãY,ך–‰j¯QÛ£ì6«‘ÂEÉ(‡ÌE7©u'i7ËŒàmC^zíÅW_~ýø *Z„GRØÚ…vða òvbœ+>BO>#þÛÎá<  ÐB¾l3èH"TÜHSàRHI¹å—ñŒV j©{€@)‹%–[~·CoA›—SS]OšW³“µéÊ4ëTkº^.iÊñ•=÷X•Oœúî³çjlI—c%/|ò(*ŠhÑZ¾vbPM‘$é¨@‚èB?ò!©ÿB‘pÁ‘ BÒE…î rT !ˆFBÁ°‚\zr)v²ñ!_xò…*W çYÞ|¥ÿp]ô•HßËôËS_u\‡]vÚ±©Ü÷Ú}yßœó‰‡O°xÌ‘çü¿žÞSMU+€²²‘.´¹H€ûE#N¤)µeÀ àþe£D@T€)dC™Û¨†Q‘HB55 vð±:†®l€Ø­"Ä iÐ7`=£ñ)Ö±îss(ã$¨À$T¼Óy$ ƒB’¡¬Td/CÊæ$Ô®‘A²ËÒº–"½v]k àC Á .ê„"*шI¨©" ÚJµÂ—âùˆG"‘¶Õ¹¥ QJŸZœE-±$i¢B‡×i1v]ü"Â8Æ2F9ÔáN×C&üÐZAÂ縗:&±`à{ü3™¹©Fió '<°JV¶Ò•­¬"aÜ(MìMÕˆAKS²—±Zþ€@¬@‚Ûñn rÆ™ÏÔÁ-ŽÌ¼‰Bi‘°F5ðF7ðM=~{°À!8ûÌÃîØÆ.цIB‡JjÜÓ…yÑ&b²î¶…ðý1]% DCò¥&4‚NÑá$ªà#ƒlwiRHL  ì… *`‚$Ľã5¬ïìƒæ ³9ážcÌÈ‚¶¥;¦+¥A º–„.T@ }ÈMщVÔ"ÕhÊB¢l}4"ð|ÓH©eÏåS¥ëçôDJQúÃOXM8SMÐhõ™_+]C©Ðèok²QÛ/È ³â­¼´`q"‰4ph4`^éþÊC-£ÃÌL H˜Íjüõ3‚]á7[bÑYøQ4F! ­4]ꈀ‘&—<(ž㈆ª”F(B%IÂH“â…˜RŒ‰ÛË´â‚8Ä*7éb]X'¦@b©¡D‚È9٣̶a³>âÉgC;­‘Ö´,“–j=ÂZ ¸öD1‰mSª@[$ÝÖ¹ Ên+ÑÛ M‘²Â½,Š{\5y  = sb‡Òž0Édžªê˜ ÝÕiª!šVPXÎ`|`:D‚X Ñ¢†©ØB6¤ø¯h$üKRÀf­ŸYæ\€§~:q„£U$ƒøL§²©ÖþǸ›,t µá r߯׈œ•E]%iƒLP„­t¡1Kâ»6Ô¤ £‘"NbÄ­%wH®T®7‘ˆ´ •PD ‡3†“í"’ºH„E%3ÙFOFâ‰ú9e=ÄÊXf‚–ÓõŸÝuà ³¹Š@æ@˜ÍjtÇ(+!"ÇÙÈH>Ê–ÜdlÒ‰“(¨VêäQ`ŸYu̘„uM&§ ©gc¦~I˜±³?sv¯GX<®O;Ìyq£Œ7m¨Ë±ÔÜ–²„øcXDñ–èŸÃAhÀ×TÎTñ¸þN‚Ø„{`(;‡„”±ËáðÂû÷ôÞå² þÎï€o„à9òÃïÛ·HÙ®ßøÚ"ÉôjÂä+OßF`^óœÈ·‘ÐçÒ€ì{îQ¯z·¾ðˆ§*ü®ºâcgX4fÀ~öµ¿}30B«[Ó¦]tî›ADKÔøU3ˆòŸ_íäÏ~Ù Aùqý2æÁ6µ)ÓŒôä3^]Åj÷ˆù@‡Ç*œl°…¡B!¾•ð‚‡J h(¨—³) Y¨)jÀ‡€#ð6@³+i 3™' É$® 4S˜7Ã,Ù.Çi@v¹¼© t ´¬uÉÀØâ§–*ˆ Ál}3ApAAhAExA#ŠÁ•˜Aþ4޹A <­ ¼@™ûAŒB©zˆQ¥þ‚¶ßX6ü1´éùßú!;54;Ê,:D:@ óà ­ê58<»´KÃË`;t»#'d±bH‰Â[£ËQ‹–:/ªáŠ-„h #I$ /è ‡97é*ð‚"ø!1a"v+(…Ñ8˜ÓÄÒ±“GœžJ48LÄM|D-ñÄy ÅQƒR®SLÅU˜,¹²WŒÅ ˜ÅÔâ ©’¹èÉÅÒ¢6°D_܈ FƒF/`Œý¢ >Œ«@ ÃCÌ0O)ùQ?¤a„ýûy<šzä tlÇÌÐGdþ"º5 »Ò?à?iÈy@ä6ùð6s‚‡m†k|9:ù²Áè(""'ˆ ² '€=†ˆ"|„0€3N"‰Ä’JÅJèÄÏy („ˆjjBÿÈ­P8‹DŒœ³mÙÈŽ/&ÉI©HÛ@›Ð4”ü-uaIv‹—ŒÉŠóš´Iœœž¼Æq³ˆá Ê£ÊIðH£ ɤôÂ)GQ‡á0¸Œ„.€KÈ~¼ 8ŽS¡…»¤Ã¹4k ÁTCÂ\¸äGÜÈËëƒËÅdGЀKÆ\»H‚V9ËÌŒÀ̶Ó13E´ýx;PþƒÚ¡J›·¦ é£ø"@ IË}*˜ ¸+«‚!ð"€™+Œ² 8"ðT,Éy¡É‚cÉ¡ÄëÃPÍÿ`Íš‰×\Ù ÚŠÛܖܬˆÝd‚ÞüÍà\—át©y 䤓Ž( …’BpNèÜJ¤¢Î5j(ÔÁN*ÐÎØtˆÙ¬MðtœBÏ )Ï!H ã“ÃŒSÀ@XL¸ìÆTCF€K@xYYR€Ëh‚î;¾ì€øà…-ÑÇ̵è€j¸Ð …ÃÏ0ƒ{QXLû…¹„Ë0½?¸\†ôH‚R!…A R·ñ›†4@¼þ‡e½Ò™–p¢¢ˆí£t*¡Àˆ=ú2Kœ ‚&Zá²¹•ô…X&cœ‘O¨ØŠR ˜P8uÙ¬$ Æ©H¼.M$0uí‚ 2J½’8S*PI—5í‘ÕyS‚‘Sæ¬ÓÑ!*¤E)’"’èÓ,u¸-ÍÔÀ(Ô1ET3‰`Ð=áè •ÕY Ò€¨P:X¨Ì^õÕ_V¸TI•¿¡^ Öd…KRx»_@Ve VR€ …V¸lZ¥UQˆLj­V€kU[íõ oWYWЖƒ!{HÀ^˜¡¸®!j’——Aâ…Š(…þXŠ…â§”¸SŠÈ¢%ó˜'ŒžGt‰Ûâ"nqŠî|‘PH;"²Ú›€×8Ç#\³|mSÕéW¨Ø”AŠ­ƒ-ÙÞÚÄ…]†…˜‡}͘Ø<²X„‹2—ª{] )l}U~Â5(’‰*‚¥x0l¥Õ€$¨Ð ¥«ðÖ«ÅÚ¬ÕZ¬eU•pÒ†gèp€­5[p„U‰o¨> Û³ÝZG ²R«…[§•U&רU¸õÖ €˜…Yõ[^X$(ÜÃí[¨EW@Æ2ÀrZDsp†P0-쑇ј`¨.›²›ÆþDU—g1(EÈ7¥`"(¤‚‰´'QŒÍóq'X'hˆÌ Nಊè 43(,ìÜ®³}ë­4]¡¯C3‘Ô]ÝiÝ×Ý5ë˜ÚÕ"ÜÕ]…àÝÇIàÝYÄ ^Îí3äU—"´›!ÝçÕÔe¹é}E×eUø‰À_¾•U3XÚH˜ÚØ ^ _à…[R˜«¹’ ±¡ãøP¯ý›uíoð†nèkx†e †_0à’[P›c–añp ®† Þàî ±¡ü%¦áî€Æa@€ Ðß mp€ÝÈ¥_†TÉŽìøü-ZØþ€ö %fb'V×a‰!ÒD'`ˆˆìÜ¡¯Ç“—"+‚ã¼Ev‰/ð± ŠBÀŠ…®•¼2T …y͵¸ãL¢‚N˜ˆ ƒââ>ób>¦7•( Ì")ãÐ!·ˆà˜4~ 6Η7Žcò‚Ê:ö;†X=¶>öã d€M/ÈC20Fd$cF6ãGFc0œä3mK>A€¨Mp\¾í'ö_ªE+"þK6àXhaæÎŽÉ]×q8am¨†f8†`àà° &bÖ± ¦` ¶ifjækæ…Z®€@çtVçuNç2Èe§mè€_›_@Uþ•eàƒž…\@^h}®€~î[€&†¶£\ú°\{P‡Ìå²7éY”øÔy;Æ*JEÈÉ$uQ˜Øé<ËB¸Œ(3hÂ!Ù7vkÓ¿3DÎ •ԸɂՕ!´ñŠîŽÁ,à ‚&‰Ž¾³Ø‹6 ‰*iqiSy!‘+[ihiÛ£´(‘iÛ|ˆšîœ›žh–ÃR‹æiõòi ¶ˆjR6ê‘nÂV}ŒZîç¶vë¶6…@øß&bb}j.`´I›^#Æg°àqjfgpžfÞëF•¶à®`hÎàÄÞklfkPЄÌÖìÍælM…·mþShØ *b|n}^€XÕ €8b>XmZuíp•õÀíu½b¡‡o(†A$¡¯J˜§Syáã!²‰Q­0ˈp9w³©E—Îø¼ˆ°Ì=yi‘„R£la/ ŠÀÈ–> î#Á¡âöˆã¢9ƒævnÕŒîÞ¢n6zœ"ÀîŠPˆí®'ïðÖ"ñ> ª(o#:o¤HorYd›@î#£'ø†dù&>úÎîè‹ tí·6…2 €ø_` aÀŽb8ŽR1†àt¡enfrpqrhæÃ–f§æcfV!a‡ÈNá/q"¦ X€ 'ò"×ð2¨eÓþ%mÆífp„r)'€€>â'ò)gHè¾i›dhÂ)j8ÍuáÇù§ xÀoÙ·I8´J~Ý$Z—={ ¸®ÿðÍa¢ÏÉÝJˆŠB¯1­ãØ‘Å-‹ŽMž>s=5o6·ˆ‘„ó¤s-b2Š]£€±—<_‰=g³Ó1J'ôt˜(t‘FD/ E?óŽªG‡t7Oœ8wã9Çt?Rc<¯ ƒ #ŸP¨rH`Ó&†¯uÒ|–•ç V#Vñpz!nqt vtpqq—•m/VÁfæÂ~æo†n?Z €¨`W÷·…@€p«Ù(âþv•_xrüÅ÷ `Y^¸w|¯e]°kû&Mš»ºƒsDæéôÉdêuùã•޽˗“ä-ˆ˜ ‹¬¤ìØ„00ðGMR•O‰ð\ Ù<øMàÅŽaøvqx’€ø™9 ¨¬øH¼Œ„ÿœðx|y‘WÓ’7ʓߊ”?¢ `ù"py˜§¬;)‰†‡8;¸ù®œxÖëŠ.íùñÒøŠ¹2¡§# ‡ _O÷ 7…Apw @à¦{^ºµJá'm¡÷`•Vxm–À)–úX‡Á§v¯àlÂû®ûÁnñk7lh–Üö0÷¨…Ê·üËÇüÌÇüÃþ¹– š]šûh÷ûl"]@ýÔ×…&o_ ZP}](}Wq›u­\1w‡lØ…Ð=ŸWdsØ=ˆ}c¢˜®Q˜ëAðÍ!—,2ã3 œ9$),i¥X™+£ãì ÙA6UYDó}àÌ$†1p°_ãw"É1¨e~>Ï7DƒþPU éYˆ°þÎÁ~í¢Fèþ.KØ„ˆ"4h)2Ä&Tì0 Ô†J›6 íšh§ &ATc§Q 0`¨ˆ âƒI ŠvŽÀðçòåK 4™©iÓLP E*PR±x;Ö¬š¶nݼySªÍšµjR¥BÕf5©Ò¥àĉ#þ‡ݺuíÆ¶[‡Žœ8pMŸN­f «·­]½~%‡6­Ó¨RuQèaê/àÀ‚e¦ºt¡CP¢F‘fÍjª^©Ò¤=ëÜYš[¬yÛ&ÝJNl¼yöî©s6ŠJ ŒN˜03„öH†T¼PLép!EŠŠTN#pöŒ ©dôa¢M¥‰EQ’aŒÀV±#¡îàm˜8ñ‘±ˆùJ!R”ûvmà»{§|ØP8q†Æi WμùsÑaG’qÖ©”sv÷Gv,TÑxå—ÞzÅFÞ{¸ÉÇ›o¿ÝÈp!tÉÑöÎA7K0¹˜  0#3J@Á þ´Äâ“O±Üò‹QÒhWE‚£VeJ1u$“EΖXíÄ3eùØ3þOY䀣4ËóË-gÿKQÏ,uXá›å%ù䋲”*?ªõÊ.Û\þ—dQ9ÿXáÃï%É~®U gÍ,s ‰Œþ‚ËPì™îUƒitùò—«)©ONRË–¼‚šGEÊ`ðBn*Â!mE®"챃"Ba9@î>Í2κ>˜W¡ ËÒ©ª '€ä" ùºD'ª”T"$C°ÛuØ6C”(„v!­ru®0tubÂS¡†7ÜTwØÃL1;BĈD¹5ëTL‚¡8 ~‡Šk³âD°Cýl‘†6$—<—,¯yÏ‹ÞôªwŒëþÜ› Ÿ4˜2÷Õ¬’–œdjV¦µMn²}”¼dú2ɲQRÉ’ç«‹Ÿ•g4Ã<1ÈÈfLc’9J$¡dJ0ÝÌHG*’ÓžL°8Jkù`3Þ*ë?(œD¨¦C ˆ€¨Ñò§|ã«Á&# ñA·>"M•äXðBR…"Âf)IJàÖ Û“ $xN3¤h^‹$ÓÄ–"¬©/lZ(%Û$O7k“¢pž3;/4‰8õ“Îì°3Vïô<õ#¬6Þ³ ù\È>£éO‘P3 ×ŒHAU²)„^è› g‹YHçAohéF5žË“Ñ8$©>–ͯþ¨FåúìѼ¥:¯“D=ê(9)ÕçyÒ¨õ»Ò»•þùï”e/–½[8²(zª8ˆyT÷ñ2˜tŸÌÔú¨|Ü#¾( €ç·Óu¶bÛ´éLˆÔ"ØB(sêÆÌ”°§V¶±”$0‘ÅÁF% *\!ð' ®—›Ö©H ½ên:lûOAjƒF&ˆ°½1l  ,66ך΃YÂRÖ (T f5ËÙ|ö6·máJÛWÔvµjm6ósX'üG±ðllbš¼™>/f‡7¨çÊW.ã(CJë“*ÕQ²lªRe*| é^õ¾¾ó%¥ËÀ„p¨’þieW_)Ëëý¢ÀÁðéY½^Gi’ªUµÒø¼t>J5©Qj>Þ1 VÄ€1Hn%ªpÄ‘(gq­ Bg‡uU¤`™³I‚°¸‡Øî¹Û‰±Œ!„dçl>>›¸Yxdpœ¡ITðáî„xÄ̉Ýxì€â´ø>.öŒ+5ãŒ`ËÆd³Ôtì¶ýêµÚŒ k×Vž"™‹>P2ˆE|©'—(ÊSV1‹WŒGÝdYƵª±3½£Ý…q·eí8‹8´ÊÕf<4ç•ë&íë^÷Æw©Ë»t¥›:ÕLsZÓœl_YP¹½lÆ3^†WaKr ) >M1'ýÔ«¢“5þCŸúŒ¹s ã ¯2A`9ç„kÕÆ (Êì¯,D‘‘ŒDº™„HòÃK‘íƒÓzÕ‰´EXÞ› JìÐC†ø‰–ªM€Ýe‘ ÛT<6»”:ÛЃ´½CíÈ‰Ä ×F¢é¶mÅ5K7 ·Æm‡rӿܕRwðÚ=žw?ÙѳυgG;œmØ·iýmäšyM­Ò•øËª”fÁÆp§cÎÔKÓ¼æ2oÍ1Íi§¢ÑxAÔS2Ã?ÎüÀŒ~†[øÔ• FZÒìkÙZUõ—cßh `€ƒàÀ rHƒÒ…4¼áQ8ÂÒpXAGøÛúÛÓHŒÝG€„Üß ÷¼ŸÝ 8°Ápðƒ%¼Á KXBlxà V°»ÚÕŽv¹çýz7¼Ž`xË>)ûN‚°ýçº×Á.v²›}òko{Üã>÷ºß=ï{'{ßÿøÁþð‰_|ãŸöáOžòe¿ü2¿ù7tþóQýèKú®=ìc/ûÙ‡Ïv·Ãýë³OƒÝñNöÛ¿!÷‹ç½á¯øÀÃ`î?üã/ÿùÓ¿þö¿?þó¯ÿýó¿ÿþÿ?    & N@@!ùÈÿ,Ó<þÿ H° Áƒ*\Ȱ¡Ã‡#JœHq"Œ‹3jÜȱ£Ç CŠI²¤É“(SªäX±¥Ë—0cÊœI“à¡Cknêĉi§NDYzöÉÒGgŸ¡yõÁ”sgD7×0Åy&Dy¦d!šÇHP«W³t5BÖÈ¡DVÑ6=¶íšœG©FõÉ“î! B‰EªtªS¨›ï¾ýZ °ÀØÜ0+̰ÃK;qÅgì¬{í´Õ’ ­ÉvÀ›r¹ç¦»n),ëõ×`»Xõm QïÄß»nAàl“@‚ Ý\uÛšëCþN0AƒE@ëÏó^Ë„>˜PE³ƒQE%o^;D¸ApÀÂ$"p¶ üðÃÒz®9d›zÚÏ®ÝöÛqÏ]·ÀLàÝ® {÷ýwàL ~máÐ"®8ã ;¹æSn9æšCÜ9Å̇Nñ襟}/ÚØº7ëm»N…ݱçmB×a‡/þøA­ºk.±Í n ,€.ÛLL\I!S+°µ™¯{1´E°Ã$²E¼ù€ ìK^ú%±gM®>Ð@`0´=Ls›µêºp…lsê›Xûr÷¾øÍ/õ³Ãýòg-öÙ¡.û_ìHÀkÿÚÁ(±âAP‚þÌV¶.È< þ¯ƒç!çØw1ÂO~A Ÿýðgý¹PäË¢·H—my1lVîæ˜€ ˜D5—mwBl˜ÎÀnæDgäì&1v’[ð”ç¿èiO¨Ù iÍì'4óÐJ¬ õ:¨´ÒÌ–º4F÷jás.Êæ,ñ*†-žRlG«%ñÒg5¬mivˆ"œP8Í5B•ðcG40˜ÀŒ D%š…·WzÎh1Ýßäú;Ü4§;MOïÔe¦[Ž4ªõªT¦²ñ…P•*UfU¬JK«\–½(VgŠ•¦e=k tz-ž.ót[_ÅXúÒÊZ–&ƒ¾&6ÆØÔ¬ßÚÙþ¼J±FÞ«`ëc(‰71£æNi{›þ\ ±Ì7E•ŽTPhHx@0„"°…óci9¨Ùv¶Ÿ%Ah«ù?¸NµsÏBí7W‹P×:¶A-m+f[á^K·¼ýÖoÁ€·à~.›‹ÛlÕ2éY€ö_Ì%ís‹&];\ö¾ø­È$'ÇßmùÀ„µ´¤½¨Ãàæv“øã'±>¸æV ä ‚ö615à$@f­mÑàŒh¼§j¯!ì—t(–0€?¹®oxsNc‚ïúÂó,fÛ„å%@B=`F0‡«„‡ëœ¹-m6í`â~¢8šÿ•_€wéâ‹X}ž1eóËå.'¤Yl ü6aô,y¡—þ3{¦D‹A¬Ã؆­…9&¯Ï ã ‘9;²aÂ^ðb(ahõ»Côà †1ÿÍfN'BÕL`ª¯…m€säè2¬­x怞ùü¦8v3Ðób³ }è${—¯Ža£É é3”kfñ¥ß\ czù×Àþ‡Ù'ü7*¬ Ë4ç,Ç™ÒÒ»'*ÁÐMÔÕs™YƒPˆá ’¨„¢cÀîh1Ó­ •éM¢ûØÉŽ)³-:+C{qΤ¶¶¿hÙ Ûîö›¾ýgÁoò¦·ëéS:[NuRZ]`¹Þ[ÚˆEJŒxA¸ ¶á6ìê¯\^ä–·-:§/\HX#^ùa¤0süûŸÓXA¤a \T(£¿BØÈ¾ ð‚W$§ -žIoÃ&²ãùX¿«¿òãº|9w×wÞbŸ–èuƹÒûwŸ8á¿xx×;/Œ×³|½÷ê#3}qg²þЈN(¸~%Û×Nì ¡1hƒkíءò\ꢕnW'}v÷5ÝéA+úþÙ7Û×}ß1å†6&\!¤9ç—~ë‡;ô~ñWó'NˆV8–å'FÜÒCD€è}£c€o„€IW~ ˆ~mwÖ÷‚âBq-‰3m’`~6$R CGÍDX†ó4C:J£.Ah66@æS’0D£B°ÇFkW-EÀdõ3¤‚Tƒ•pƒ ˜ƒÏ´ƒÊ#YÕãA $„ÍB„…d„öƒJÈ„t”né…C$…Txdõr…0ƒL …\Èd^˜1`È9bøƒÒr0xˆþãS`<³‡> U>VQ` ”´>”øJÖ’‡Åóyêb6®§jÐ$€nú¶;ˆÓÐ0€?Þ…‹·Lbn´o³ˆæˆ¸8’øEK4H—¸H“£‰Læ`Tà‰ (Š EŠ>`Ѝ¨ŠÔå3Bäsy.±¸i³h8µ9·‰“ˆ‚¼‚™È>Q€ˆâø5-DX„g²ÄtÞÄ_Dƒ¥„11¾L8h:p&0[’Æd{Óm˃Pû8lÞAÓ1n´9~‡1è˜Hê˜-ìø0îˆ[J]óX/¶?‰£ÔˆsÜU:DLvÇ3UCph1ß‚ 3 ©r U6¤ÓŽï8þ‘òcˆãx“Èâ6ôa&PTtNýˆq÷9&Vûã Å;Cpj c¡@TÛ4Ü2fÝÄKB¥4Ó6`°àIÛ¢“<Ó±ã“@™>2E:Øô9ÑæbHÉ>JI(ÄÓ”€ö”QÉn“‡0*`•ÁS-YY~[I]ù•£Ã7;Ù“ær–“–DÉ–‹ã–7—” e“8Y™/‚.ÍVSxA… C6„r1Øô‘ãGGÓ>ˆ-rs*à@[hÃ…† XoÃn×F0HkCÀ/A0 p;˜i’îWVù™3#šM8–ÎÒH‹CIhVT$Ã>­ùšBTH³)„èþg›l6Xé³›Ó›hœ:/™Yœœé™ošÀ7š–TšÎ‰šÉc–YŸ§ÁrIE†04 />С9Á8=ö¢@v‡÷‚-ÚC×$-F'°÷/ecomàê¢SwW»g/@PI Ü“ŸlCüéŸ* œ1*`Ù†e BÒ‚šz—‘#¡€djš[Š„Õƒg$ð¡!JúI¢Ef¢Ê€Þ2gJJ3*¤9”iŸT:{x.ss.eV‹)'0“M1äG‘Ói.”u™'=‚e- ³XQÊ4D`Ît~ÈÆ>â¤xþp§þ/>` Ðì€ü€ìp þoÐ6f$axš¨‰ ¦ŠÚ¨-t‡g:išTÀ¦zŒ‹deqÊ6£å‘îf8èÒˆÀ¹xWj¨Z i\ ‡_j‰Í9¦2åz»G3SZ¥´Ú±ãÚ¢YlSN1@U•‚¤1&éU3haä÷SH4`-æ³4L Lœ¬X/í±“Ih6@v¨ÈÕˆŠ§ü ßâló­‰zRL`®xZ-ÈšËúƒÎ ­Ò*sÔjeÎs­N­D.ݪ>-y«¹J®Q„~¾ ¬×„®ÄŠGÿîÉê7Ö2«µ±q6PjCÚBÓšûä’Q3RåÈ>4 ÑR̪YÖâçR†hhfþ€Ö40äú-“—‡ÛЧr#Pw*Æ0@ʰx ®—¨{°39B;Së8i4²%«?(Ëm+›d- VT[Eö4³¸…B7;yfçE-'Œ;´Âʱ#ã±÷²Lkô)±l =|/ç2çb-”DP¡ô-3Õ”C[—fV¦4ÎR9‡¶HÉ£­fce$£VÛâ0¹µH‰Ê&`-þð éfbvà xz ”¨ÒW·è*´ü•>|»˜Žó·~)¸éF¸ræ¥/æMŠŒ‹‰ox{‰žd¹¡Ù¤ë2·tj‚w;Rz«}[ºØŽm{¼ ñ¨—˜ .³‡8²ìcu“-™:/¶þU¦äœáB-øY¡À¡´µ3eC3t4 \÷6âB–¿˜¨>°g “C/„§ø ‰ú¼Î¶4ನ„T0éÖBÙ{4Û .8õ½Õ¾D6$gç -'×_4øNíËPKX¯»Dl–è¼”¿ÒëAÕë¿ØëVU`È[ áLD|ÎÔhœx6Ï”1þCrnŠ-â'1\«–>ÀŒå,4»{‹T4ºÉ3^p~YãYA¨*Ô ŸVšÏBxª*̾hôÂ1:‰C4ÌP6Œ€9œ1;ÜÃórAÄj³{×RÄÈ….H,˜–·ÄM¼O.“Âu+f-lÅåöL39\lgœ3yþkk‚,Ìö/Úú,J75$ëo~÷L#¦ë2/õ"~=C­.37T¤nkÔCËDrm`O¤A,pF4@7‰šrÌV?…»€§õ€È5{§JÅÈWœÅñØ¿“¼Mݤj˜lI;daj%¦„Êç÷_¤L7Àc¨Œk«lÈE“ÈÛ²È=uÅQɸYêF;ÈÇûgj¤`ÍÔ>l£T ú‹ G3ÛdeŒcv0ZHîucÙÂ0¬õ?ã2(.þ¥lsU$¨w”A`¥9繂¨®þ@3F«®êü/ìÌ9Ò‚Ÿ>Ïm Ï»CÏ»tÏ”SFû¬ò ™ÖwÓ`kÎ $ÎóÓµ™xþÎÒC`ë\Cm°ÍÜ,±"–H‚– è .1 T1D:®ç—÷Çdà™ÿ‚aõÂ-AÀ`zW1z‡Ãê8ð(aò#qãÏ…WfÔ¨Ô`¿êºÓX¬®Ž4A}N‘C/T`ÔHý„ÍÔ çÔÕɇ0LðšWÕ¬«U‰$Gè ÃLÓ$ëÕ=­1?-ÖB]Ö0Óµêw“ pyÈ@oÔH¯/:‰@çS¼ôgyc‹ä7ЊGãmTµ>çd‚æÓ.É<:*¨Äƒ¸³ ‰ZÀ YœRè2Ù*t®—­ÔÿظÐBÝ0Ÿ=p¡]K÷tR¥m§]5*À’U«í\Ò²ØÃþóG'5MÛ†IÙ}1¹Ín»‡ØUz6ZÕ?¹Am *Lƒíë Ö™M ‹WfÌÓ”àâ¾½=ÚÚc„ÅAToÓ+.7Áþ¥Äã'@æ¨úÐ çÛ Ãˆ`àÞ¶L­ò½hõ Jø­0´9ž¦qG³N.ï#a{æ_*”dNÞ§@ƒÞê]·îÞÛeÉöTóílÓ”,ÞË ûæcÊoðøF&`N•pŠí$ÖÚzWª1osQ–vm6šë#9øì¼úœno‚™ª t«ð ´@N>äCPäZ•¨¤ƒÆL¾ONþЕÃRînT^ÏŽåï·C˜Imþ¹ei ôW›6泓ЄæG>Úk¾äŽÔäÎâ;Îãµêº:´imM^;›n…$X}®q»øFUÄ4¶Üž$D¤õX.ÆL1`-QE(AðGª}À€¯ ’V1çºf“é±ìwøÓ„6 ®.Š0êLPêÛä<•ê{8ʬîê3ë³0Õ¶@’tž£Ët7ɾ¾é¯èEDìMé.éö h=XíÉ|Õ]xF×ç¢é:¤6æfqG°= ÉEã@&7UÎÀ‰ªZ~íÙ’Åðnd§Äÿˆï0¦ïÃïþ:O ñNþðcð˜ð ÏF¥Îtê^IìnzñòÎ`õ{Bœï‹îûœÏ·F-‰«§7ߣ\æý&T9‹ãÝ›Ólà2aè6ã9ØC“ì4€BMù¿p³ðа-š³¨cÐwÚ’boô öËû|NψQ7H*yõ<­õlCm^Ÿ>=%>¯xjô¸3Ïdö ”ô”öËã,Îó–‰Î÷.Gõî®Wl±¾âô’ƒµ¡ÔSEÔ?.SêÙRäšÓQš:…T4‡Û2¿wº<(öþ€Pb0#öC Yšœžo±üúG/ÙR–¨l±ZJƒ´ñŽO=o±²Oùþcù=ŠP©ã$¬øTzf?n0UîAˆF$08˜S ‚c-‹äXƒÏ¬¤P>_H½*N>ºéV”ÓÆ€§ìpA©ã3÷§ýÃýAÅŽ*` ’pbgR£JT˜8c§ •*m ¨JD‡CLÔÆN E؆I T*M"HE%4 1a¤‘$Ev*IiqdÆŒ3Ê<‰³àÅ‚.lø0âÄŠ‡n$hãßV®]½~VìX²eÍžE›VíZ¶m¹¶É؈¨‘!z¡’—“6pc‚q„ÆHIvp4¸´ÊÀŸ}™Tâ£H‘ F ž,ÉÄ > þ¢â…ãa›m‚0éÅÎßjgUBö;·îI¼zùúÍ X0aÚ+fLW%dÉ”-ƒÁLÐ7gÏ E+×\úôçJ?«¸î 7Ü¢³ï楲ößÀƒ>ü ÅàŽ!§p_þ|úõíßOkT¿@Em†$¾h±©*ã¡ÓHBÎ0þ»n1;YH$*‚Èë4œHh=*†0©@œŠ0¡t(ºJ \-Åpèj¨ýìèï? P" dA‘£Á lDB 'Ä)G”4ä.™QDI$íÄ+鮢‹r‘?ÿ¤QAÛ(00#äÑÇ#$hÈðc³M7ß„S>E¶ þ&”b²ƒCŠÂp¤ {ôБ$2h(¹¨ôŒ Bô!ͤ‚$ðèÚ°È Xà(±c2ýѧžqŠYì¢9å²¥¼òÌk¢A1ús#œ%i£ˆbC4"EuT×Hc2©ÒY1%HÓœö*ÂS*$!)¤R:µÎ;ñÔÓÕ>Ac0PœµÕÐ@rUpÑ"à‹³\sÏE—¾oAµ;ÄTų$’ÀlJ%* ²¤‘ D‘Š>¤…œ$û/0®}ÍÊ!‚ðA'œ(Ò‰‰Š ·ŒŽdŒÝ:Ý-TßUåU²^&î}ð$>ùõw¦"¸ˆ‚F)£¾fØaˆq’˜ Š×³øU/}þÒxŽ#òت_é5È^|MÞW®”xÍt§¦ºj«¤%0,i‚¼x b‹à+¦":›–(¡{’Õ‡ (d‚0)d¢Õ×1|hÄ0NÙë› ¯©èä§;{ÄZ.­“Vup°û¨ ²%Ôí;Õî—PšÞvHnºífo±õæÛï½7lð§E\.ÅSb¼ë¯ÃŽŒÉͶ<æŒÖÖÜm µ²:xᇿϯydp¤#Mh0½˜,¯ÅΉ„ ÍúÔŠ2ZÔ'VGòì‹TòL€9, ¼ÀlƒÀñŽ"ù~·´£ùÀ€ž²éªÞõš¥8íi§{?IR þº”h'æC_±´S’ý‡ ïCŽüŒ§¤ú!î~ÿɜǿèýÏoÖ÷³½@Ðăa eX¡EC 1IpbÖ‡T 6îÌ 4¿:MJòb‘É@g 8 Èö6*Õ©:‘ÉÀ‚‘ž$h"5Ü_n@Ȩ‡d\Iò"D"fĈy!I)%Á‰½‰âhE*}Q‹\„ŸDèˆzdŒ:\•ƒF ‚‡»+âQÈ„a†—Ĥ ­¥@%­çNkƒ SC…˜,n›’ÌyšUÑ„©šWdr’%>Ä 1^N¾¥¸ë4ÐÖË Œ.þ¶§¡DdkV±(EÉ«L”rk™*‡Ò,¹–t‘¥Ìjù0\A—•ृTòËÓT¦'ƒ"fFŒ™˜O"g™¤tff É01kšƒ*^94dÒŸÿœÚk ç<õE N"3b8“dvqûˆOd5øI%1ð_`åM€á3Gòf˜³ÐŽea ¦,f¸ôe !)¨P*¾¡0”E?DI Q¸T4Íèµ*ÕÑf(¤é·JJ’“¦ +¨K BP¤4¡|úVÞª$ò”¢]IP+ P²–ÕMô’T¥V&E—UÓ*´ìKÌî4‘œ¨ ‘‹¦åþƒY¦„ Þ$‘€Rømi{„JhШ@'…ÝzÒê͵NÆkw‹K1Ó'AÖõ®XÓ+ÃúÊ¢JC¥ÒU_ÄúE±Œul# Û¡_å…²4`ëeHH¤È%t ‚]ñªÀDîu´–4kr•멚ñæK6¢Ðòbý⬂V1)e>0A G)ƒA‚ßÇ,²˜“OtyˆRù6„¥~zî‚ÃêŒÊË®íhÀÝ9¼âÕZS̋މŒ=íÕ×¼â;ßúÒ±.¹™~¥;»êþ»¬Û®à üÝð޹ËEqŠÉÒ70½­Gï­ˆHüCIþ¢Ìɯp±±8™T™„‰l¡LêÄáToéJhÄÉ‹¶?ŠÝ ù6Þ#ב>†„¯qÝ_µL"é5²|n7?/¬‡þë û;Í^ïµ§ÂííúÑ÷Ÿx SX¿J€ ƒY#ÁQ‰db8’€3Ô¹ùóEÁ5‹Ø5`±´·‚F(” Z¥{´R'ðˆè k,\ \ ¢ ˜i@Ãx@Ü 4¨ œòÂ@ L-×p‘¹ø@<$Añ·ÀdA¤¤tÀAñµa»0¤@ÜPþ/þó¿,¬ÍXõy'1ͨ ‡€,ìX¾DáPƒ"“0Kãÿ  ¥¬ñ¸ˆ6˹˜Ã_·™•ÓØ/40„/þq¤2´‹fACÙ‰I`C­3 ¢i?/C y6¤”‹÷’‰! ¯²?Ì @ìB¿Ä04Ä5BĺŸ¥`Ä5ƒ6¤‹7$¯8-ÄEª±‚#X(°9H+Hƒ(Hƒ78‚(8‚#Hƒ#°+„#FiLƒ4€c´#€„j|ƒnäFe´°^ü%x+X‚%ˆGÀ(°‚llÆf\ÆjäÆ#èFtÜEtÄÇ^L(Æ8øgäE_Fa$FcDFedFg„Fj¤FkÄFmäFo›ï¾ýZ °ÀØÜ0+̰ÃK;qÅgì¬{í´Õ’ ­ÉvÀ›r¹ç¦»n),ëõ×`»Xõm QïÄß»nAàl“@‚ Ý\uÛšëCþN0AƒE@ëÏó^Ë„>˜PE³ƒQE%o^;D¸ApÀÂ$"p¶ üðÃÒz®9d›zÚÏ®ÝöÛqÏ]·ÀLàÝ® {÷ýwàL ~máÐ"®8ã ;¹æSn9æšCÜ9Å̇Nñ襟}/ÚØº7ëm»N…ݱçmB×a‡/þøA­ºk.±Í n ,€.ÛLL\I!S+°µ™¯{1´E°Ã$²E¼ù€ ìK^ú%±gM®>Ð@`0´=Ls›µêºp…lsê›Xûr÷¾øÍ/õ³Ãýòg-öÙ¡.û_ìHÀkÿÚÁ(±âAP‚þÌV¶.È< þ¯ƒç!çØw1ÂO~A Ÿýðgý¹PäË¢·H—my1lVîæ˜€ ˜D5—mwBl˜ÎÀnæDgäì&1v’[ð”ç¿èiO¨Ù iÍì'4óÐJ¬ õ:¨´ÒÌ–º4F÷jás.Êæ,ñ*†-žRlG«%ñÒg5¬mivˆ"œP8Í5B•ðcG40˜ÀŒ D%š…·WzÎh1Ýßäú;Ü4§;MOïÔe¦[Ž4ªõªT¦²ñ…P•*UfU¬JK«\–½(VgŠ•¦e=k tz-ž.ót[_ÅXúÒÊZ–&ƒ¾&6ÆØÔ¬ßÚÙþ¼J±FÞ«`ëc(‰71£æNi{›þ\ ±Ì7E•ŽTPhHx@0„"°…óci9¨Ùv¶Ÿ%Ah«ù?¸NµsÏBí7W‹P×:¶A-m+f[á^K·¼ýÖoÁ€·à~.›‹ÛlÕ2éY€ö_Ì%ís‹&];\ö¾ø­È$'ÇßmùÀ„µ´¤½¨Ãàæv“øã'±>¸æV ä ‚ö615à$@f­mÑàŒh¼§j¯!ì—t(–0€?¹®oxsNc‚ïúÂó,fÛ„å%@B=`F0‡«„‡ëœ¹-m6í`â~¢8šÿ•_€wéâ‹X}ž1eóËå.'¤Yl ü6aô,y¡—þ3{¦D‹A¬Ã؆­…9&¯Ï ã ‘9;²aÂ^ðb(ahõ»Côà †1ÿÍfN'BÕL`ª¯…m€säè2¬­x怞ùü¦8v3Ðób³ }è${—¯Ža£É é3”kfñ¥ß\ czù×Àþ‡Ù'ü7*¬ Ë4ç,Ç™ÒÒ»'*ÁÐMÔÕs™YƒPˆá ’¨„¢cÀîh1Ó­ •éM¢ûØÉŽ)³-:+C{qΤ¶¶¿hÙ Ûîö›¾ýgÁoò¦·ëéS:[NuRZ]`¹Þ[ÚˆEJŒxA¸ ¶á6ìê¯\^ä–·-:§/\HX#^ùa¤0süûŸÓXA¤a \T(£¿BØÈ¾ ð‚W$§ -žIoÃ&²ãùX¿«¿òãº|9w×wÞbŸ–èuƹÒûwŸ8á¿xx×;/Œ×³|½÷ê#3}qg²þЈN(¸~%Û×Nì ¡1hƒkíءò\ꢕnW'}v÷5ÝéA+úþÙ7Û×}ß1å†6&\!¤9ç—~ë‡;ô~ñWó'NˆV8–å'FÜÒCD€è}£c€o„€IW~ ˆ~mwÖ÷‚âBq-‰3m’`~6$R CGÍDX†ó4C:J£.Ah66@æS’0D£B°ÇFkW-EÀdõ3¤‚Tƒ•pƒ ˜ƒÏ´ƒÊ#YÕãA $„ÍB„…d„öƒJÈ„t”né…C$…Txdõr…0ƒL …\Èd^˜1`È9bøƒÒr0xˆþãS`<³‡> U>VQ` ”´>”øJÖ’‡Åóyêb6®§jÐ$€nú¶;ˆÓÐ0€?Þ…‹·Lbn´o³ˆæˆ¸8’øEK4H—¸H“£‰Læ`Tà‰ (Š EŠ>`Ѝ¨ŠÔå3Bäsy.±¸i³h8µ9·‰“ˆ‚¼‚™È>Q€ˆâø5-DX„g²ÄtÞÄ_Dƒ¥„11¾L8h:p&0[’Æd{Óm˃Pû8lÞAÓ1n´9~‡1è˜Hê˜-ìø0îˆ[J]óX/¶?‰£ÔˆsÜU:DLvÇ3UCph1ß‚ 3 ©r U6¤ÓŽï8þ‘òcˆãx“Èâ6ôa&PTtNýˆq÷9&Vûã Å;Cpj c¡@TÛ4Ü2fÝÄKB¥4Ó6`°àIÛ¢“<Ó±ã“@™>2E:Øô9ÑæbHÉ>JI(ÄÓ”€ö”QÉn“‡0*`•ÁS-YY~[I]ù•£Ã7;Ù“ær–“–DÉ–‹ã–7—” e“8Y™/‚.ÍVSxA… C6„r1Øô‘ãGGÓ>ˆ-rs*à@[hÃ…† XoÃn×F0HkCÀ/A0 p;˜i’îWVù™3#šM8–ÎÒH‹CIhVT$Ã>­ùšBTH³)„èþg›l6Xé³›Ó›hœ:/™Yœœé™ošÀ7š–TšÎ‰šÉc–YŸ§ÁrIE†04 />С9Á8=ö¢@v‡÷‚-ÚC×$-F'°÷/ecomàê¢SwW»g/@PI Ü“ŸlCüéŸ* œ1*`Ù†e BÒ‚šz—‘ó/þp£þdjš[Š„Õƒg$ð¡!JúI¢Ef¢Ê€Þ2gJJ3*¤9”iŸV:{x.ss.eV‹)'0“M1äG‘Ói.”u™'=‚e- ³XSj¶à áÀøÀøÀÛð oÄ6£å‘îfCõ€£þgþD§¥f$a>€ ÜðûÀúPìÙ ¦Crë²?®·{4ÃYõ¦à¦zŒU ¨Ît~ÈÆ>â¤xB45–F„š¥ms¨]Úˆ_ÊdŽc‰ÍY¦2•©iJUz¥ÀÚ±ãÚ¢YlSN1@U•‚¤1&éU3haä÷SH4`-æ³4L Lœš#¨àÊÐ;EIh6@Ž.á®-9¬Åêls à ®'%X=ƒGÿS-Ôš×úƒÚÊ­Þ*sT ¨;æÊ3èÊl‚ª>íj›ïz¬è§¬ÌzMõ ­øÚ©Í²¯Öj-¿¬g#¥6¤-$0m¡¹O.5#UŽìóþG“-E€­še-^p.…°aˆv£ò€ j¤ û€£Å00ðú-“—‡<È0¯1²ƒEÊ€£å° …л øà39*;S,ë8i³2«?5Ëm8›dhF°`…-CK¹…[A ¨“gv^ÔrÂH²&K±Yû-#³²÷è²`kôù±‚ =|/ç2çb-”DP¡¤·ü•>´u‰`feJã,•sh‹”<þð `6ã 8zjµ-Ó¶ýD ?Ë®L¦.¡™q쀣l }S áP¯\;SMI0‘»˜ŽC¹~y¹é–¹r¦hË9=Eº™»Hoô¶8ª› Ⱥ†KJˆ+» c»Zþ‹»ëBçԻ؎ƒû½ ÑBæ¢.³‡8Õ²ìcu“-Ê;/¶u¦äœáB-øY¡À¡´Ùà4Ó8Šp -'×_ôºþ`‚б»DlT 8êçëlK.Z« çPú€ê@ z¦« êpµê€£ÔÀ¡Ô€£ìP6+@FEÊ`ŒéÀ „Ð~óšÀÍb ß úÀõpÓ° j¾$ÁêëAí[0éÖBñ{46¾PœÎDDÀçLv@›måöLþc© …-â'1q«–>ÀŒå,F»{‹4‹8ª×âç—5žÕ6Øp£ê ‚ZšSLlsµ7ú þl€Fœx6Ï´ òpÃõÐ 5‚ú ‚ú´vœ¾0Â7ª ‹D°»— ‡<¯ò@ msÃ8ê,ÀàÀ7lÅ#ÈZüLÓÅ‘óÅvÆ9“¸Q<ËÁlÿ‚®Ï¢tS³þæwÏ42cº.óR/â×3ê2sCEê¶F=´L½€£õ/ç÷_gDtƒ 7ʯP ¤Z8ŒƒËs‚ºé° à æøFv¨þ€Ã@š|£õp¿#¨ú  ƒ-~ÌQ¹0ÿK/ šìŒ¾”ð:AòB°j6/ìÐÀ1¹à ì@X» zé\¹þ³MhLÌÛÔMKËßûgj¤`ÍÔ>l£þT ú‹ ·©¦Ä8f£…ä^7–- ÃZÿÓâ|£ã.”SFlsUlpµïpGþ‹£ëÃF%B»@Êóz¹@ÌL0 8 g $Ì8‚ Êu\ɚɛ£h Ñ€£Ì a*° hJ°hNÝs!tR“Ò1»ÒÑÒÒÒC`0]CmÒ"ý±"–H‚– › .1 T1D:®ç—÷Çdà™ÿ‚aõÂ-n:q¸;ÿsÂU=&?çéàõ°ÍD°f£U‰$G4³  ®ú` üУ 1ÜœÍC0Ù‚Ê0[I8:³ÓþÕ#¨ gÛ¡Í8šL𚤠WfþÃÎþpÔ` ¯°©„Ì‹³»‹ÆDµÛ”9 ؃¬~7 —‡ ôFôJñ¢“Dq>ÅK7¶H~íxô0ÞFU³ ‚ZùL9& A0:¦Ý Põ­Í»ÞíýG'5U° Ô`~Œ£æPßN Ê,- Œ‰ý]Úþ°–ºê àÑÝ© ÊíÌ’ Èí\T 7,VmáÛ”RèBßÉvßQsWÏ÷]èÞWz6ZÕ?¹Am ULƒ>ž`Ù”¯x0`ÆmV*ð~;„.qŽ£µi¬^=®> ÿ+ë›ì„`ëàèH½ëÛÂ`àÇáàÈíLDÓy.ÂîQ”no‚™Ô6é7ºCªÞ½à ÛPíõ00; M±®U´ž†»—ßΪ많êÁêMÿ¸iñmMs;%›n…d¯Î^Dh£ÎꢦLàI«j/À°á¦½ {Èþ`@ªAðG õTo’ÀKtžc¶P=ÍÜ܉㕜[‘AæÞ¼ŸñL@àíìÇÛpm~£áâg]É*43)?[ÃÍk0/Ÿ>x|£û ïSGÌŸ-t‡;¿‹ï‚oŸ€ÖƒPŸ<ÀGó#€gDqmp.¯CjS`nw4ÀÛc´Õã,Î õ8ªbPRvJyºF#çh_m‹ÀÊð c Ä- ÝzGÏ0 À@ ìpmÈ]Zv÷T` óº Ðïþ@ø`@7ŠÈ`-¯° ÑðJ]íÆ`0Ãа ™ Ðøù䨨*¨Ûr=eÈMI ¤F µìßýš³ Ô­´ÄƒÜû7þ•°çáO*mÚô—Ð_&Cì«§PbB;vQ¡61!*â³åå Á@쀆“F* T…#L;2-Ú)Xñd+ÿ|þTèP¢EEšTéR¦M>…úó`Ni朊³ME‚mœ©R©¥Ë* Ry9I«ƒv¼xÂ0“\âÄYÐãD´m˜HdÄ¢Ú­UìH¤ª¦Ë‚Ʋ{‡O?|ì¾íò Vl JÐÎÑþã·OÞ8h¹©í¨Ð-\¹t')“ˆ¬ ÁƒíT tp4s õffë4[;ÐØé“¸õ´qõ&WÎ6Š-Áµy3‡[Ó,õÁkÛz±UüxòåÍŸGßíbšV/¬È„ ]´8ÁÜ'áÄΤF•¨0qŒš¨¨¢­—bð¿!L !·›ðÚª*¿b˜«Ô ’Ï ‘/ˆF$Qä¶š,j‹½»›-¾ù8âê>•ôãÏ?¬‚@­²IA¼«¯ªØb‚B*,´.à ;ü0ÄJFÌm=ö|/Bùèk?ûû/À ¬ÇÃK/L1Ç$³ÌñÚ€i,—¶rЭ³h`‚¤¼ÀøþŠ‹$±C>9âÈ0 b¢Š!|(¢Á¬¢+B®˜¸ |(ä"¸pÒsÃ6Š´’%«¨"7’JZŒ¸6½x3N4ç¬óÎ<u‘>?—TPB =0ѪþkôÑH©˜ô?F-Å”³M;¥-ÍPÙŒT‚à”“ :ƒ°3<õlµÏŠ`õKÐÌä¶[o¿=ï@qÑR¤”8ªÏ0 @†\c+”ÀàÔÏFøÛŠŠ bH¾»N"hˆ¾Ú•¯Š€7^J­¤]Îhj£À­׎rÏåNÝšØu— xåM©ÞŠîm$ß}õ•ÏcИ-‚™0á“ö ö·5%ö³½«,þ6÷¾ŒOÚ¸v¿RYáyE¶ƒd“ :\©§¦ºjŸU­[јÀõ£"d‚û½I&Åh0‚8؇˜1ê"å XHPèv¡…9%q)7Ãêú%­u¢®ë´(lzÇ–¯ìû¬j)m×nûíË©»¯°íÆÛ>>ƒ³¿©œÄÁ+*|¸­íPüë——©ÃÈÉšmxOb»ˆm­>xáÉãLÃ!vñ¼_“Ïx™0A°’¹¬%E ,˜#4¥ Àø&ƒ$"àu‰”¨±£©è䥕¯5þ4ä'§ž;œš§ëù蛎ÐzøˆëùfÚã^þ¼>ÅxŠ|æCŸúäÃ>*¸#ñcœ€nS?»4xÑç\Ö?¿üozx9õ°wÀíEmx/„a ‰Ò4PéÄh ãŠCxÕ4‚¡qÊKõ£ÅØ%DµóAöÅ€A…¨Q»DH=@ùÀ&!Ý| ƒEvbIU¡ [bÃû(*l8ñÑB—æ«‚C¬J X“v%q‰M|bçó¯¾øÅŠXäxØœxñGalÉ+rC3ê0&Y£H!ú€ˆ01"™`G*€I†ŸeðNÕ¼!„Ì"\ìb4/*ÁK`H„´Õ°p‚ ÛDÔ²@ì‡õñ Áhþ`@2^í¡KCÚõ¡°KN¤4%ƒæ–ºä ­4,Ñ"KZnŒ·DS t¹$^úr>‹d”|†YLû„³EÊd žâåÌQº¬”a”fJ¨¹ÊkºR›y Â,kùÍ’àRœ&Q(ºÐoÈšÎÒg•Ì|ÁŒõ9KÁTPı`í""dÈ"»RÁ",LEC Á•¨³Ih*&2_"…ÕÈ¡ï£KD+1ÑvUô‡:ä A4ÊQ˜x” . ét BR“® ¥*íæi\jSîÉÔ‰;ÐMÑ5¯¦ítt>½hP}U„b²£09ª’z†¶Õ­aZLtÃ.©5^)ÍÓ&þ@&îPÒ MàµInMƒòX“0”¾¼20œ#§ÐéƒYÆbòóšUæ*´ª|¯ xS—öº¨&&°î¹I «¶ V|][· @–,~òce¢›dV®.c‘N< Z½òµ´æCXêB5X¬Öixkt¥ OAr•3ZœÒsÂä‹>"šË˜È Û$jhÜ„|pªÙÕÍ`ˆÔÊêv4=y4)…·ø¤º8¹îl´Ë]'}—8á5ÚxIP^4¡÷=AZoø>÷ÞøV%é” ø8s_—äw¿`è¯y bÝÜ`·-Ûý¥U ! &x˜ öOƒÓ aþö²uº7ƱQÞ'·º)UàIÎù’‘(ê_ Œ Š  –èmm>Hì"qR·•Üep—3HÈÐD¶œÊ/4x”Tà¡B@h&yéñ å)*¦È¬ÕI’¼d:Ù|Q&Îçª\‘+ï$h¸ä²œ¾æ17¢ÌaÀd6™D)’_œÿ%3¹—λs{lœcNsZTYÒSÝ&Ê•4²Ç¡§<òI|¬>MI¨>0A¾8ûUel©0Ébê­ @>øO€ãœ\@¡ÖFK½˜S0Õ>¤«}•QXËÚ†ý³õ]"ƃ†×(’€ ³a/•M f”¨ƒ»CSþ×'pX;äªÍâêÿT{Ö›ît¾¥k£)‘^_+ÐVÌÅ÷À›8h‚7naV„‚í‡81Tm'!È.¿qŠÛQ»øÜËŠ ¡ &ÑŽ°u¢¾ÏeþŽkMà3ð‚k›-Ξ˜_ Õp=¼‚J< ų+Ä‹/N]¯ Ça÷q>“{䢂Éûý½”¼µ_ŒÁs…Ï<ÁN°yÄsn|ëÛë ­J™Õ¤kkœ:«DˆŒV¢eé{ Œ_’tpsEädA‹aû5X (1iƒ;ù AÖbÙEjö¯Ïel¿•»ب È}>!’Ä-‰w&M…ï¶Ãß $xˆþÚðaÿqâotÆßÄñkÏü¢¾2ù½Yžîëî×u¯P(ók¥Žy¢#¤ˆP¨=ADîÃO˜Á}&ÇåÆã„È‚׌ çÃPÒ¯µË`¾¿ ðq+|Ößex‰cò~Mï;¿ Ð?§¦_ý_ÿ_ÙÇÍöýµï÷>%¿/‘bŒá3?£A?Öº!åc¿æ{>“À¥ÜÛ½Œ!ˆ5H¢E Zëóz"²8ø•ÎÁ•Mb8Z$vy2<‰ÅA“ˆÁ Îé 5‘< ó¸£À6°@rÉ@ÖÛ@„‹/‰¡ ÔA' Át"´9\»!óaÁ{9¼û˜¨þÁ“¸ÁvÉÁ´˜¤¡Bì26iì1Bc«£\ˆé: tê" ½{´2:‹Ba”ìË‹5Á#C“„­} ¬`½ò I°)s9ˆö0¸˜8´•ù Š—‹Ã9t=Ö‹—;ü¡cº êH‘öX¤@D˜¢‚AüÀœR"Dœ Ã㜻hÄ*xD ‹Ä’™Ä#9Œ‰K$!MÌÃP9 ­ C E# ÄRD«lÃ7TÆo1ˆ\¬Aù¡j¿P«üs  ËÆäŠs[Ã;ˆÄÛÃÅS¢!h„É™§ÀB­)\£7¹§ö³g4Œh,t)›ï¾ýZ °ÀØÜ0+̰ÃK;qÅgì¬{í´Õ’ ­ÉvÀ›r¹ç¦»n),ëõ×`»Xõm QïÄß»nAàl“@‚ Ý\uÛšëCþN0AƒE@ëÏó^Ë„>˜PE³ƒQE%o^;D¸ApÀÂ$"p¶ üðÃÒz®9d›zÚÏ®ÝöÛqÏ]·ÀLàÝ® {÷ýwàL ~máÐ"®8ã ;¹æSn9æšCÜ9Å̇Nñ襟}/ÚØº7ëm»N…ݱçmB×a‡/þøA­ºk.±Í n ,€.ÛLL\I!S+°µ™¯{1´E°Ã$²E¼ù€ ìK^ú%±gM®>Ð@`0´=Ls›µêºp…lsê›Xûr÷¾øÍ/õ³Ãýòg-öÙ¡.û_ìHÀkÿÚÁ(±âAP‚þÌV¶.È< þ¯ƒç!çØw1ÂO~A Ÿýðgý¹PäË¢·H—my1lVîæ˜€ ˜D5—mwBl˜ÎÀnæDgäì&1v’[ð”ç¿èiO¨Ù iÍì'4óÐJ¬ õ:¨´ÒÌ–º4F÷jás.Êæ,ñ*†-žRlG«%ñÒg5¬mivˆ"œP8Í5B•ðcG40˜ÀŒ D%š…·WzÎh1Ýßäú;Ü4§;MOïÔe¦[Ž4ªõªT¦²ñ…P•*UfU¬JK«\–½(VgŠ•¦e=k tz-ž.ót[_ÅXúÒÊZ–&ƒ¾&6ÆØÔ¬ßÚÙþ¼J±FÞ«`ëc(‰71£æNi{›þ\ ±Ì7E•ŽTPhHx@0„"°…óci9¨Ùv¶Ÿ%Ah«ù?¸NµsÏBí7W‹P×:¶A-m+f[á^K·¼ýÖoÁ€·à~.›‹ÛlÕ2éY€ö_Ì%ís‹&];\ö¾ø­È$'ÇßmùÀ„µ´¤½¨Ãàæv“øã'±>¸æV ä ‚ö615à$@f­mÑàŒh¼§j¯!ì—t(–0€?¹®oxsNc‚ïúÂó,fÛ„å%@B=`F0‡«„‡ëœ¹-m6í`â~¢8šÿ•_€wéâ‹X}ž1eóËå.'¤Yl ü6aô,y¡—þ3{¦D‹A¬Ã؆­…9&¯Ï ã ‘9;²aÂ^ðb(ahõ»Côà †1ÿÍfN'BÕL`ª¯…m€säè2¬­x怞ùü¦8v3Ðób³ }è${—¯Ža£É é3”kfñ¥ß\ czù×Àþ‡Ù'ü7*¬ Ë4ç,Ç™ÒÒ»'*ÁÐMÔÕs™YƒPˆá ’¨„¢cÀîh1Ó­ •éM¢ûØÉŽ)³-:+C{qΤ¶¶¿hÙ Ûîö›¾ýgÁoò¦·ëéS:[NuRZ]`¹Þ[ÚˆEJŒxA¸ ¶á6ìê¯\^ä–·-:§/\HX#^ùa¤0süûŸÓXA¤a \T(£¿BØÈ¾ ð‚W$§ -žIoÃ&²ãùX¿«¿òãº|9w×wÞbŸ–èuƹÒûwŸ8á¿xx×;/Œ×³|½÷ê#3}qg²þЈN(¸~%Û×Nì ¡1hƒkíءò\ꢕnW'}v÷5ÝéA+úþÙ7Û×}ß1å†6&\!¤9ç—~ë‡;ô~ñWó'NˆV8–å'FÜÒCD€è}£c€o„€IW~ ˆ~mwÖ÷‚âBq-‰3m’`~6$R CGÍDX†ó4C:J£.Ah66@æS’0D£B°ÇFkW-EÀdõ3¤‚Tƒ•pƒ ˜ƒÏ´ƒÊ#YÕãA $„ÍB„…d„öƒJÈ„t”né…C$…Txdõr…0ƒL …\Èd^˜1`È9bøƒÒr0xˆþãS`<³‡> U>VQ` ”´>”øJÖ’‡Åóyêb6®§jÐ$€nú¶;ˆÓÐ0€?Þ…‹·Lbn´o³ˆæˆ¸8’øEK4H—¸H“£‰Læ`Tà‰ (Š EŠ>`Ѝ¨ŠÔå3Bäsy.±¸i³h8µ9·‰“ˆ‚¼‚™È>Q€ˆâø5-DX„g²ÄtÞÄ_Dƒ¥„11¾L8h:p&0[’Æd{Óm˃Pû8lÞAÓ1n´9~‡1è˜Hê˜-ìø0îˆ[J]óX/¶?‰£ÔˆsÜU:DLvÇ3UCph1ß‚ 3 ©r U6¤ÓŽï8þ‘òcˆãx“Èâ6ôa&PTtNýˆq÷9&Vûã Å;Cpj c¡@TÛ4Ü2fÝÄKB¥4Ó6`°àIÛ¢“<Ó±ã“@™>2E:Øô9ÑæbHÉ>JI(ÄÓ”€ö”QÉn“‡0*`•ÁS-YY~[I]ù•£Ã7;Ù“ær–“–DÉ–‹ã–7—” e“8Y™/‚.ÍVSxA… C6„r1Øô‘ãGGÓ>ˆ-rs*à@[hÃ…† XoÃn×F0HkCÀ/A0 p;˜i’îWVù™3#šM8–ÎÒH‹CIhVT$Ã>­ùšBTH³)„èþg›l6Xé³›Ó›hœ:/™Yœœé™ošÀ7š–TšÎ‰šÉc–YŸ§ÁrIE†04 />С9Á8=ö¢@v‡÷‚-ÚC×$-F'°÷/ecomàê¢SwW»g/@PI Ü“ŸlCüéŸ* œ1*`Ù†e BÒ‚šz—‘#¡€djš[Š„Õƒg$ð¡!JúI¢Ef¢Ê€Þ2gJJ3*¤9”iŸT:{x.ss.eV‹)'0“M1äG‘Ói.”u™'=‚e- ³XQÊ4D`Ît~ÈÆ>âÔ9¯à áÀøÀøÀ×@ igD‡¥þf$a¾0ôÀ§ç  ^ê8–Øœoâ’êeZ/Àò°ü õÀá –0“:ªû á° V§l3Zén†ƒ.œ‹w¥mS¨[Úˆ]ÊdŽZ/Crë²?®·{43¥UZ¬-;^ -šÅ6å$PQ)Hc’^0ƒFNp?…DÖb>KÃÀÁÉŠ¼jeÎ;™„f“0ªìÊÐ0/Þ„¬Êª/áÀ®’:LtR‚Õ30ªØú ö:ªœ®;ªÙ`®ƒ®N ®D.ÈÕˆ¯¶9¯ÌŠ~ϭפ¯ÕŠGÿS-ÙšÜjÄj¬$g¥6¤-$0m¡¹þO.5#UŽìóG“-EЭše-^p.…°aˆ†fhMãö4y ©ò€ ßâ ø0©ÀS';XÛ ©ûà 1 ú ©Û@“³`0ª›Ê0©æ0 T ¶ M[E<;ªš3 ½P“ª ÛdcDû-F‹[($7ÕikÖr¨²,›±Óµ#³÷H³6k-ôY²Ž =|/ç2çb-”DP¡ô-3Õ”C[—fV¦4ÎR9‡¶HÉ3@Áhe$£VÛâ0¹åßP6ÇÂ0©êÀ€êš=“ “z°çr ’Ê«€¹3Mnë¹ì0©£º`0 áФ[ `KCÀ`»"þÙCÓº¦»Ho4»&p‰ždb@FuV¹tj‚™;Rœ«Ÿë8VŽ¿ ÑBæ¢.³‡85³ìcu“-Ü;/¶U¦äœáB-øY¡À¡´µ3eC3t4 \÷6âB–C 4øN>`“ŠåºKŽ” “º øË»’J K.ýëºn›n`µ’ªGSÀà‚S ¶¢µÁÁÐrrýuÁ‡´g°„ü«ö .f@ÎvÂ(æ¿„T0, ;nU6 ¿TœÎDDÀçLv@À‰góLã?¾ÊPØ"~3y( pÀXÎ’‡ºéƒj³{×âç—5žÅ•–•“º¥yÅÄfþʻŔ0©çðÅÆ.¶dìÂþw¿ãk¬96<@G+©üÆs\ÇèrÇ‚™Ç•Ð ŸÖÇ.ƒÅ—+f\ìÅ1zÈ8ë8‘CÆvÆ9“׸U\ËÁlÿ‚ºÏ¢tSs³þæwÏ42aº.ðYêÆ«.37T¤nk„½Crm`O¤A,pF4@7Àc’P½’ZšÇ8º,·’úªl0©õÌ¢».£ÚÆTÈ“Êì° È0gÊ,0nkaÜìêÍÒ|~ÿeÍØ¬Íªf…ÎEÃËÛâË=µÊQ3ÌM\/â×3T0²¶¿¦F ÖLíÃ6J• ¿˜p4³MVÆ8f£…ä^7–þ- ÃZÿÓ9.ƒBáâ_*À6W%?šiç@ÈëÃF­9ŒìEE@{L3 GT°ÎŸ— ŒÌ®çÀ (}-nû&» s»K0M9eDÓ*`ÓGwGV<‡!tRÃÑ7ëÑÑÒÒC`$]Cm@Ñ]²"–H‚– ! .1 T1D:®ç—÷ÇdA|N‘C/TÀ-AÀ`zW1z‡Ôê¨#aò#qïY Ô0ªÔŒZ•HrÄÈ£Y“ª{͹åjÀm ɰû@ ‡ý,;©Ûši=|“]Ù2^š[t-G!ýÅL×7;Ú}­1=ý/l×qm¬~7 'Ö'þ5ôJñ¢“Dq>ÅK7¶H~®xô0ÞFU;}O'e>í’Í££L°„kÎÛ%-Ð=<$ÎþàcØbÎØlÛí¶ì61½@ çд£ZL€Gªmª½°˜&¨Þ&ÀÞUãÞ’UÄ£ºÏÝ4ÝÕRèÒßÚýÙQ£Øÿ˜[ÌÝÜUz6ZÕ?¹Am×ˈ`à Ö™M‹WfÌÓ”àâ4 0´9ž¦qçÆN.ï#a{æ_vÐ îLµ½P@óBq ¤Êûâm d;a3^ã¼:ªO•ãÎÆWÀ`嘼=¶D~AõÖ¿â"q>°ä¦BI6~)»â d1.ãþ #ã4>ß^Ôia¾h;n´Œâ%Ë û¦ßÕÃoðøF&`N¡|Ni(Çw5­ó6ey`×f£¹>’Óø;Óéö&˜i TÚÀPjYµi„Â’ú´Ø’ÏÓ0‘®U§ØNCà¸LÖÚ¯˜Ì.°ŸîÒn>êï·C˜Im¹ei ôW®¾M¾“Ðtë“®ë–îH˜î,^pèˆn¬Þô›VÝÖèC°²éVHûêêE„6oTELÓhîíIBDZå0áòÏ$ÖU„UP ÞͶ°CáÕv@Âþ »ëÂ{î©î¯àc¹à/Mé¡0©éÀžä¯×ÆSø¾‡Õ¼þïý>3?[Sm î:4îÛTîÿñéîAwø×äîï‚ßnŸ€Öƒ*Ÿ<ÀW=Ð%€gDqmp.é®CjS`nw4ÀÛcäÄ\4ôarÃcwD^m0 CÐÀ£ª¡Àt?ߣÊòSëû°êÃàÂÛ`ôâÊ`JŸ-`›:’ªʰ ×b O. S_ë ])‰õRvJ\ïõA  kä9$÷E;Íòþ¡EodH_÷ÿØô0æf'Þó7ùœÏ·F-™¬§—ã£\,þ&T9‹àa»†nóƒ=ÑN@(Ô”, 7‹¯ÛòÚ“Šš£ªF ã°ã¨yøµ“þÚú—üÚ܌ԦÁ“µ¶û|½ûlCmÛr=% ¯xÄïM¤ÿw¦Ë¿@«A—èÝÎâížo™!ÍôrYDïzÅðTŽA/9Xh’*mì´¡bÇ‹0,HP3)‚ ¶ÁHÅK‘AìT „ð “"4UaÄßJ–-W¤Ø2ÐD˜ÈÌáã‡Ïœ1‹mœ©R©ÑL;UÀ°ÜGQ ±lãÞáÓ—“Ý7V#Nly1ãÆŽC&lCÒ$J¥ˆ LŠJ‰ÂTKÐ`ÏŸA‡ND9dmB;fá&ôbãß`Â… FœXñbÆ?†YòdÊ• 'œ™Ùm ‹™0þÈ"0$œØ™Ô¨&NÀ¥RE¤[£™ 1A"d_Š`Û¦eãa¥kÃ2ñA£Ðç $)úˆökßÌ©sÆè4ѤKŸN½šÉ*–ìdó¥^›5nÝ­ûþV8â=?'_žÒ9ôJÒEV·.³Îìø,´Þ¼3 5ÕXs ¶óÚšI=Á,£°B /Ä0C #kc¦»&ro./ö¢ Œh‚è'ú’„@&¼ãŽ»*(ê#&ª‡"Šðˆ:ˆæêíE0˜ Á‡B8cȶ•k#&ެ¤¿*ªéÄ@>‰jC6´¨ûÔŽPGýÕT_ÿTµ5']u)œikmäÖ\qý¬Õ¶~ ¶[bEöÖG™u$¥•”(jA•T¾NåvÕo}…UÖ))"×ܵNà´a‡†8CE(΄ôŠ 3Ã(æ>ãͨ×<|v[0‚0Ö‡^ô• Á6Ý X¸“Ô!ƒ(±ˆPô’d¢fþäkâ¡*n«TŒ«ÐX)Ž=N dô©'`¨ $“Q.Be–¹{ù ˜™£™ ›SÊyg*zî+ÚŠ¬¥ø7‹ì8:é¾–v×I£ºä×N6ÖÒˆÿª]"Æq¯Hw‚ïýñÈç¬òâ3ßœaÁ߇?~ ´-U“ím‚¼>|0Š0‘EŠP$·eF"Ðñ˜þ‚+&Ð Š(Ò†ä²ÄÙÈ>hpšeð6éD~Ó1ú Å~¤°ö׿„@€·ªc@ËeH d !(AÐô ,a¹ 7›þ}v"\Wë—Ma¡Ø^(@6Ïv¼á©0!ùuÑ‹_dŒ—7YõåZ¯aˆDTµé¯")!A¬V?¡Éf&(‹N°1,ò%,â LÁé "·’s&›W‰QXd$¡åú¥«¬qGApcBà(GŸ™°Ž‚ÂcôÈGЂ$ä« 9¤Q1A‘¯b¤¢ÆXFIŽŠ’j19¹MÎÑ“W²c Bþi0Ó˜_œMH~«×¨æE‡”ŸØ›µK¼ËÄ8CA'¥Å8Õ+‚’´3pöšD”NRÎÁ5ÐIÒ’ù:ˆØÒ™1 k¤¹¶½X›3ÑæZ&ÒM¯œât9ÍÉI¨Sží|'Á`3ÏeÚ³ÏR4HM<áš3©œåf"P;ôÇDiJ‡4ê¼æ~è)é«ÊI Ù } ¼™Žå3¢¸ 9, ˆrÔª¯°3uBJúdƒÄqL‰µd—±– ‹;¿ù\fj"ôLâ¦äܱЦŸú¨:ÈPEgœÖ8©J ^$D¨z:¼¡êL\Jþ*¬Ê4œ\m‹WƒÖäíô:¼¹áYí•6Ö±™ª!Õ¨—ŒØÁ å,åLDŸíu+$øHA¡†¹ÉÇ^RZRM†#­+©«z”fqG”Òq@G4‹B:„Ɇ„²"¹l©³Ù³lKX ÌMh;DZìç´¡‹Ùj[«½×¶&¶}šíDj{[0äV´¼%Èd/’àf¶O“›Kg‡ôY厶´ÎEíI;_úRèu(JjIÊ©<_•R)ºR¯`“¡™{lœéˆš‚$•êB DÖ/;JXQa¡A‘| ‚æ¢"÷µH~i°_ýMBFk[F`ÓÏf'óÁ‚ϳþ[h{Ȭ:da/aXÃn„‡Áµ‹…ÄýEÏW²#;³&>ð‹¬/ùÖ×ÊWfL–ô¨¤>³7ü«N2Í(`_•Duz)P5}`‚6 !¤ñ(„£¥;„Ì(½“Qk| Ï=¯F·s³î‹º|Õ†™/>›˜ÛþGƒ3㩟kn³ýFgëÌÙD¼³ðFâ„=“¤ÏuÏ–ý(Ñ€93b©¢Í|G«™ÍH¬2–e=ëdPU ì˜ÆdcQ1á:‰>K‡=W’¡ « AxQM1¤àAXz*_eB2XO·EuH+œ°pÍR¼d§×¿®ôARMìþ»5ɮޛ=W„ 0ÚsFËLum¸iÛTݦȷ©î[ŽÜE1wRÑÍ`aã8íî–à½ìyÛ!Ö´Æ8}+AÎDMÇ›ú.•Ï*UýÇm ú²R' \Ó½ÉZÈ2£¢j̯ ÅIÚP’Áí3Ch3ÇMäq¯\c„–Éãä-æÍ), täV=ÈÜ?{áÍÍísÙð¼-]úÆG<ôš¾Ù×!ïËÈ“.· ý¤é7ƒºË1ÃØŒ×ý±&@¤ÆÀ<-„Ðd.ŠÉïT@«&ÛW !I\n;þ)%N`*|¤=ukv¥ãÁ†T¬¼ófïs¥ [/øµ¡þõ~†ÏåæßÆ{iJ|q'ß+A=+V»rU·8?*½‡Ì›~§Èè…UzÙ¾Ú©Oüâ3hGºÛÝù(%› Y*E „ס!•°[+­@á­q™œcìþ¥…‘0.¿¯XºÛ pÆvƒš Ó©ËH"Iß" ²~ÑG#Z–[MîÑÌq‚ð{‘ñKˆm“¶û1ôË5u‹pïùùó•lë–èkƒéÿ`Ã>îÐ>ÿë>Íø¾äŒÔ‘´Ÿ*¸¸çcAù šK›ÞÙ‹y‘Ú»?¹Àøðc«\¹ ¸x³Ò I'Qé;ë¶“²uù à)¹^{Áä¯@þ¡ Uz‹Ré }I‹À¤‚ äµ!\ #¼ s% *hBíyÂri¤ü"<‰*|³WÁÂÔ ¬ëBëd' ©2\ÁDÄÀ1ˆ;¬ùœjº°()`žj›ˆ³;¹P; Cˆ¡ËÁ¢[ !h¼%ž:,÷{Uá´×€$ÕÛ°Fœ‘G,_ù9Jä¤K”MŒNĤŒE¬EL*E£j!«Ð²V„lI¼XtDH´ÅIôµ\ÌÄ]$>¹˜›NF/Æ68ÄDLJy”Q%_^{‘Ca ”*Œ‘hK ƒ˜Ò('°øœË%Qᑉ0Eþ9´yÜガ-;P æp¾9GÒpuÌ¥~rÇÝð™xDz´Gòk’Î /àÇ]™9¤ &È,ˆ‚|*ŠHÈ”XHsô‡„Hv|ks¾°ÈøÀÈeÑÈ|,º}ä¢qJ‡±‚#X(°9H+Hƒ(Hƒ78‚(8‚#Hƒ#°+„#PJ­Lƒ4€§´#€„®|ƒ²$K©´°¢ü%x+X‚%ˆXKÀ(°‚°¬ÊªœÊ®$Ë#(K¸J¸Ì¢LhÊ8ø«$J£DJ¥dJ§„J©¤J«ÄJ®äJ¯K±$K³|J´TK¶tK¸”Kº,Êk»ÌËËäKªôK¨ Ì%Ì%(L8ÌÄ\ÌÆÊ¢<ʤ\ʦ|ʨìKÌÌÊ­TJÎLƒ°˧Í7ͺlË·ŒË¹¬Ë ´Î†™€ìÔÎíäÎîôÎïÏðÏñ$Ïò4ÏóDÏôTÏõdÏöÏ€!ùÈÿ,Ó<þÿ H° Áƒ*\Ȱ¡Ã‡#JœHq"Œ‹3jÜȱ£Ç CŠI²¤É“(SªäX±¥Ë—0cÊœI“à¡Cknêĉi§NDYzöÉÒGgŸ¡yõÁ”sgD7×0Åy&Dy¦d!šÇHP«W³t5BÖÈ¡DVÑ6=¶íšœG©FõÉ“î! B‰EªtªS¨›ï¾ýZ °ÀØÜ0+̰ÃK;qÅgì¬{í´Õ’ ­ÉvÀ›r¹ç¦»n),ëõ×`»Xõm QïÄß»nAàl“@‚ Ý\uÛšëCþN0AƒE@ëÏó^Ë„>˜PE³ƒQE%o^;D¸ApÀÂ$"p¶ üðÃÒz®9d›zÚÏ®ÝöÛqÏ]·ÀLàÝ® {÷ýwàL ~máÐ"®8ã ;¹æSn9æšCÜ9Å̇Nñ襟}/ÚØº7ëm»N…ݱçmB×a‡/þøA­ºk.±Í n ,€.ÛLL\I!S+°µ™¯{1´E°Ã$²E¼ù€ ìK^ú%±gM®>Ð@`0´=Ls›µêºp…lsê›Xûr÷¾øÍ/õ³Ãýòg-öÙ¡.û_ìHÀkÿÚÁ(±âAP‚þÌV¶.È< þ¯ƒç!çØw1ÂO~A Ÿýðgý¹PäË¢·H—my1lVîæ˜€ ˜D5—mwBl˜ÎÀnæDgäì&1v’[ð”ç¿èiO¨Ù iÍì'4óÐJ¬ õ:¨´ÒÌ–º4F÷jás.Êæ,ñ*†-žRlG«%ñÒg5¬mivˆ"œP8Í5B•ðcG40˜ÀŒ D%š…·WzÎh1Ýßäú;Ü4§;MOïÔe¦[Ž4ªõªT¦²ñ…P•*UfU¬JK«\–½(VgŠ•¦e=k tz-ž.ót[_ÅXúÒÊZ–&ƒ¾&6ÆØÔ¬ßÚÙþ¼J±FÞ«`ëc(‰71£æNi{›þ\ ±Ì7E•ŽTPhHx@0„"°…óci9¨Ùv¶Ÿ%Ah«ù?¸NµsÏBí7W‹P×:¶A-m+f[á^K·¼ýÖoÁ€·à~.›‹ÛlÕ2éY€ö_Ì%ís‹&];\ö¾ø­È$'ÇßmùÀ„µ´¤½¨Ãàæv“øã'±>¸æV ä ‚ö615à$@f­mÑàŒh¼§j¯!ì—t(–0€?¹®oxsNc‚ïúÂó,fÛ„å%@B=`F0‡«„‡ëœ¹-m6í`â~¢8šÿ•_€wéâ‹X}ž1eóËå.'¤Yl ü6aô,y¡—þ3{¦D‹A¬Ã؆­…9&¯Ï ã ‘9;²aÂ^ðb(ahõ»Côà †1ÿÍfN'BÕL`ª¯…m€säè2¬­x怞ùü¦8v3Ðób³ }è${—¯Ža£É é3”kfñ¥ß\ czù×Àþ‡Ù'ü7*¬ Ë4ç,Ç™ÒÒ»'*ÁÐMÔÕs™YƒPˆá ’¨„¢cÀîh1Ó­ •éM¢ûØÉŽ)³-:+C{qΤ¶¶¿hÙ Ûîö›¾ýgÁoò¦·ëéS:[NuRZ]`¹Þ[ÚˆEJŒxA¸ ¶á6ìê¯\^ä–·-:§/\HX#^ùa¤0süûŸÓXA¤a \T(£¿BØÈ¾ ð‚W$§ -žIoÃ&²ãùX¿«¿òãº|9w×wÞbŸ–èuƹÒûwŸ8á¿xx×;/Œ×³|½÷ê#3}qg²þЈN(¸~%Û×Nì ¡1hƒkíءò\ꢕnW'}v÷5ÝéA+úþÙ7Û×}ß1å†6&\!¤9ç—~ë‡;ô~ñWó'NˆV8–å'FÜÒCD€è}£c€o„€IW~ ˆ~mwÖ÷‚âBq-‰3m’`~6$R CGÍDX†ó4C:J£.Ah66@æS’0D£B°ÇFkW-EÀdõ3¤‚Tƒ•pƒ ˜ƒÏ´ƒÊ#YÕãA $„ÍB„…d„öƒJÈ„t”né…C$…Txdõr…0ƒL …\Èd^˜1`È9bøƒÒr0xˆþãS`<³‡> U>VQ` ”´>”øJÖ’‡Åóyêb6®§jÐ$€nú¶;ˆÓÐ0€?Þ…‹·Lbn´o³ˆæˆ¸8’øEK4H—¸H“£‰Læ`Tà‰ (Š EŠ>`Ѝ¨ŠÔå3Bäsy.±¸i³h8µ9·‰“ˆ‚¼‚™È>Q€ˆâø5-DX„g²ÄtÞÄ_Dƒ¥„11¾L8h:p&0[’Æd{Óm˃Pû8lÞAÓ1n´9~‡1è˜Hê˜-ìø0îˆ[J]óX/¶?‰£ÔˆsÜU:DLvÇ3UCph1ß‚ 3 ©r U6¤ÓŽï8þ‘òcˆãx“Èâ6ôa&PTtNýˆq÷9&Vûã Å;Cpj c¡@TÛ4Ü2fÝÄKB¥4Ó6`°àIÛ¢“<Ó±ã“@™>2E:Øô9ÑæbHÉ>JI(ÄÓ”€ö”QÉn“‡0*`•ÁS-YY~[I]ù•£Ã7;Ù“ær–“–DÉ–‹ã–7—” e“8Y™/‚.ÍVSxA… C6„r1Øô‘ãGGÓ>ˆ-rs*à@[hÃ…† XoÃn×F0HkCÀ/A0 p;˜i’îWVù™3#šM8–ÎÒH‹CIhVT$Ã>­ùšBTH³)„èþg›l6Xé³›Ó›hœ:/™Yœœé™ošÀ7š–TšÎ‰šÉc–YŸ§ÁrIE†04 />С9Á8=ö¢@v‡÷‚-ÚC×$-F'°÷/ecomàê¢SwW»g/@PI Ü“ŸlCüéŸ* œ1*`Ù†e BÒ‚šz—‘#¡€djš[Š„Õƒg$ð¡!JúI¢Ef¢Ê€Þ2gJJ3*¤9”iŸT:{x.ss.eV‹)'0“M1äG‘Ói.”u™'=‚ ÊÀ òànêšsŒ‹deÈ`øÀôPÈÀ>â´<Æ`§ü€ãà þ–Fó ßPúPÜ@Y*aL@þà Ð¥Læ8–Øœoê2åz»G3œU/Ö’0‹¥LƒAæLç‡l|ê‘îf8èÒˆÀ¹xWÚ6f$aÆ¥pø¥™*¦ÄÓ©fš SZ¥ÄÚ±ãÚ¢YlSN1@U•‚¤1&éU3haä÷SH4`-æã,›º©¬(ª„0ßê¦á€F4 ÑRܪYÖ"Ü ¶®Ÿ2Ûà¦û0 vP ûà¦×ð-“—´þ°ÀP¾€nº v¯þ v nú <³ þ “ ³Ø(­6;2{;Û³?«?^p.…°aˆ†fhMñR›[¸…Br#P¶f-'Œ1;³!Û¶Ö‚³p›Frkôɲ” =|/ç2çÒ¸ Ó¯35RMI0´u‰`feJã,•£U›*g^º0o ¶#¶þÀ„à0«ð¦×0 nʯ Fñê 3 nZlÔ¦Ð`UÒGIJß²º¢ëBçä8¦ë—©þ›n‹”<k6VF2jµ-¸ýx`—èI&dT'`›Ë§&è¼ ›>£»˜Ô‹-áX¹øË-Ôi.ê2{ˆS:Ë>V79Ñ2§ób[eŠ@Î.Ô‚ŸE T°º;S6m@ o “`Tfë¦ÑÀ“Óð¦»PFÀ ¯;yüà¦<Ó»ÙòÁì@ƒìlK.ÁoZ0• Ópõ°‹zÐN‡£oJ jÁnÊeó Ó`ŠÚÃÎ@o#.dù‹{øN>°g•:y1´KÄf‰ÿ@0<ÀdÀ6œÀnU6¿jœÎDDÀçLv@À‰góLã?$wªØ"~3y2 pþÀX<@‹dB즿+0Äë¦å€.æð¦lÀ– oz<¼‹\m úà» frLÇ1š1w ®qZ®oúc£ oª‡ìʰHªì¦¬|~YãY\iy*Ô ŸVšmLlÌ+ÊhDÊåöLx9 µÇ8y“»ÆÒ,Ìö/û,J75>ëo~÷L#¦ë2/õ"~=#ª.37T®–:’ꦊÐxCoZ,`Áëh710ÏõãµÙ@Tû mðÈß`PJÅÍ¥5«KHê  «€-«àµþ° V¦µ³•®ë¦ø@/ ý i„¨¯{~ÿuF4@7Àc)ÇþlõS8ŒsÍDcÐÛÜS ýÍñHH?CÎݤ²ÓŒ¿¦F ÖLíÃ6J• ¿˜p jJŒcv0ZHî•Â5ÌZóÉnj1(Äoº*POë¦A èö¦ú -ð*¯¡àÊõ0 £¨‹Ú¨>KÔÑ’p meI-0o*ÒÂØð¦Ê 9®<¶1úzõR×þ•Õí¢òãÕw”A`ÅF>B'u1BÝÖ4SÔp$=6×Á¥Ó;Ͳ"–H‚–   .1 T1D:®ç—÷Çd•zN‘C/TÀ-]ý,¼;Qý¦“Tò¬´ò³ÕþÀ¯™H`í¥i]üPá𠡯Æ0Ö›Z„à³¥ºþ]Ãé3 Рø Õ`]/AÛþ0soš 1: Ó€ÝÚí¦úÀ.Û&qãÛPH ÓºZ•HrªuÌ£ Ýb$Ýa„ ¸ÚÿÂFš½ÙÅêw“ pyÈ@oÔH¯/:‰@çS¼ôgyc‹ä7 ‹GêLUÓÎþðHv0Ï'}ÏT PU óüUmàÃs¯çÐþ< ²û èáÉÆSo¯pϪ -4 é ´¶Õê@U=~Ënš7'=:*À(. /†à þG'5žR7Þz1~WÏ÷]nàUz6ZÕ?¹AmðÎÌˈ`à Ö™M‹WfÌÓ”àâA¾=þ´º`:U³< 35 ojW<Ë«P ¹u»nz4/½p¶¯Á; аÉ4xÅp¾]4ì¦ü³®þð Ø»©‡äÈð¦È` zýJ¢Nê.³©ï#a{æ_*”dã³g®@£æl2nÞé„åEöTuîlÓ”ÑLæ,Ë ûæcÊoðøF&`N•pŠí4»gáÒª1osQ–v#þ¦À—Am » .L€ ¯K0èn Š[Àðº ôWÃþ0 ×rÂ!þ¯g MÕ®UØÞÐâCèä¾-^‹µû0? ò´©Yno‚™Ô–[–Vï|ÛT=ÒîþOí甆Û~WÝî,^°ìÌ^¬Þô›æàÖDìC ¶ÙâAw˜Úæî/M©.ŠÐhOîI›êÃèù>Ò¼;»¶0/J¿ £T˶ВËcÁò€A—NšŽ1:_HÑRðÚy}íÎDÏT‹͵›Söá" oU„ÄPOµi³D@ç9Ûtóÿ“ó)ö¯¤÷E„6oTE.óö h=8[›| 1xF×ç’nÿ¨6æfqG°=y°Ð…´ E0 R½ hñ× ´ÅP ŰúÓLm° Ÿ ÉãÏPãecd—ŸùÐkâí¦Ù éïúTP´ßþº ÐUüþ€ 1P î™Üúº+ kä9$÷EëùÉ#ùùû–Ï`™{E£C">挓Ïù|kÔ’Èzzuž1Ê…æoBU‘³8ì¶<¦ 0L|øð—Pá„Ta2ŽaÂqL‚TRĤˆÄ‰ãìT©BJ;vÎù (;£ê1¬ Ì0$˜4 TRåœUréc¸maÁƒm*©[¨Îa›6Tv](T!•"3ÉigåÇ’m@Š$©s’J–m¼4e¨‘™5ofU’ŠÊ`´ÚY’m+ÿüþXð`Â… FœXñbÆ?†ü·i^½ZéæŒ7ìR'AªTþÂٓɇ,µNÒl§©/^À° AeâĦ^ŠÄbì>~øÎ!ÓH#P‹v”íîmΘêÒaíó‡/Tμ£¾ÕãWï[(¼#;Há>‡%{Ó·³6CaS3IÙBd#™6Í5Ÿzg⮸@P#©Š®š«Ì2êHÊŒ2Î<.âH+ï´ÔVó†È6ä°C?1ÄÆXR©DÈbª$&˜€Ï4ø"Á ;&i¤*˜p®*¨¨bµCÂk4H„¤¬ÊJ° &bˆ­Ô–ZÑ Y1ˆF$QÄŽJ¸*’ÄáB1¬[,éÅšd¤±[bgÇM³ ȇþ²È»ðR-É%›|r¤(§¬òÊ,·4°KéRÐ>YÃE‚Μ±ÆsüˆGã´‹ Eä´SO?•Ã6T /O;Y+&ÒêŒÎhÐJ;V|´ÑF ÔR5%«‡"ª:>ç‚$ˆ |(d%ׂdŒ)Û‚‰d+!´Š"ÓRËD#Ãò"ÕUGmõÕXmaG!fl層-™b‚W_µLØÊn,öØd©XöÆfŸvÚj¯5[º¶-©[‡TeÕ!Wƒ€5Yi}´E\×ÝuˆBÅ8c7ñDYR¤ š5Í@{,¨3&rˆ-š@µI¢"‡¢]1+¶*« ‹þ0¡–[Ö×ÙJ ¤’{äʲíyä Mþe£õO¡px©$™¡ÙæšW\Y/’ISÍg‚šfZi8ze¥sòª@Yd‘Jf«ê®.»å¶`özf¼Ä>cÅg¼q¿ÉµyY¢pÇ;µ¢âeŸq¾+$»HMše¶‚Ú‡šÝ™ºòš‚¨J2© †5 …4Ir*Ò@Ó ÇIr½Ê«œD½VÒ¼J&üѧžqŠ!È2œ”î Ò‹0õFU/+s²ƒx¯Ø-RµˆÚ©¸]+¯ð„:òwÈr‰#$ã™è¼yС·Kú /v¼ÿÿïPÒÑ»=êwÝùÝþl%&˜ v[™NƒEôèg4`E|E“ €á}×bÚ‚à–9Á dsÂŽŠ0*tB'fS×TÀæI°BxQà‹”ä@nf‚¨ ’‚“ÁƒI"B²Å„(T! ]x9»hI†cQ` ñtù¤M‡ |`ñ4 ZpˆLHÕ¸F6‚ÙÒË@ZV¦!àÅ Ü"аªîáX *ÑX²$?ÁfL Qˆ¤‹d×AÖ>h’ulá–*¿7â$ŽqNæìˆG–Àg4£Ê+H ÖÅ †¼Q"ÙHé¬,J’ä¬f—®K⥚4›%áþØPþ“w\K)õÈG‡øÑ€T‰ ]YH›mª×ĦÿÀ¥À!¼L+Q³‹kÆ2ÛT¥Žx² .‚;Oò®G*!]®ÐŸíÑ4Jò L`‚d QðMA®´”±Š›Þ¢ÞXŸ"¡œA8'KÒ¹N­´S-ï D<·4Ïz²¨+ÍZ‘>ùé½€•© 4¹‰¬RÐm¦­›œL(M:N‡þ ¢œ(ôàè΀iÔÙjP7棆*L¦5j@ݶGL–É!?SA C¹•t1Z UŠÀ¬E {4äÜ&A­áøi„AÈQ–Z¶#¢²>G­DR ²ÔÑ ¯4P•ªJ¨êþœ\•9YýWg5š¯Zd"+[5ˆVEî¥Rm%Y[ W[1S#uuÑS5ÕhN•,V¥ŸŽ TÒ––Sî£gÚU™¶á«³ºÔ$6ƒHÙùÊa¸£ Ë ÂßÑ­W+ë’ŸLˆˆ`%BUû¨ÔYœ,Ý…G^²‹ád‡Ö¾vUp’m™h«A¡•ÏDºõo‡§šßªd2J.D-’4OvM5Yî›KÔFW$¬ˆuc;ÛDr÷¶ º QÄk‡4˜ÖÀ†Ìµ’9NÒ0…%N(¬—4‰¤¾¥ ‘CÒÒH¡Ì))>—N´g0$ËlI­Tr´*ÒE„ðÕë\ˆþã…Áöyp„-3á!iÆôT˜À(q|QTP6Õþìèžé K…‡^܈zT0s^V‚£kÓÊEwܶip¹é‘áÖ×]Ë}îDÝìöJ…šb xKÒN¨·Fêo#Y»YØþ÷¡¸ Doáã¾ÑÂíi·üÀkˆ!ã'¼1" "xžFEp\)éW#IÙñR¬L"]ºJå##Ε‚Ä:µvBÖòëå„;`ÚdHdô+QÎDò¦ù¼@ǑЩbÈÝÁ~TºåLZkU1êS'õ¬Þ.*d=æäzÍÉ v½feì<ÿèÏÿæµ½íb¹Ë%/ÔJxa†j8ýʃ;Œ¤m5ÞžT‡f%Eþ«ïcüÞ{Â’BMFxç´ËtzDç–¤uC0ŠåW…yæ4}óZéü@>¿¾«!±XA(=‹²$¼2©¾R\rý]`oÙ·öz¹}îë¼ûK5Å÷ ç™ÿ»âùQþ 'Ü9cšû°*t‚+)_a‰©k79¡/œ9ÕÈ¥™ , 4t«aC7„8l°":”B#A ÊÃ}# -ôC¯ˆ¼"ÅÆñ# ð B)6P*_iìŽRšÂ>+„› Ìð> I`+‘i Dɹáè5³éŒˆ¯ÅR¼‹.AÅfÚ#ºŒòPDéŠ3ÌÃY¤‚Z”·2$]´Ü›‹¬øÅ*F1F°)Æ9#RŽdô>HÅfdÅÒÐ K¬ŒX¬F³ºFÑ•O Å~ܘþRXÇJà•Ò,Ü£ŸuB¢ÐÊ Í[ŸŽ“ÜkŠÝkņ3¤!h„æY)Ü02D À8»x)H4‚!’Y„¤.lÈrÈyHˆr0Š”Ç޻Ȍt4kqšïúµž I¨¼4“Ô’‚TÉÑP’–¤§—¼‹˜ü™”È—›l~ôǬ•f!b Waf1˜Ñ4k1­@X$‰I ˆ¯*‹j8‡™ª®°ê86¦·‘ê 2;(¤*‰ýñJ‚p‚°t¨»*K;Á´¬ÇµlK-„–1{‘³èKœa½yÄË;ÑK§šKå*‰À4,®$1p1LÄKþiùÆDËQˉ̷¤L‚8 kÒÊÛü+8‚%ÀÀ+ƒ4°‚4ˆ‚4xƒ#ˆ‚#8‚48°A8‚àŒÎ4HH(N8H Î7àÎíLN+ÀàÍX‚7°‚%X‚(°ñĈ+ÀNædNå¤Îí<î›ï¾ýZ °ÀØÜ0+̰ÃK;qÅgì¬{í´Õ’ ­ÉvÀ›r¹ç¦»n),ëõ×`»Xõm QïÄß»nAàl“@‚ Ý\uÛšëCþN0AƒE@ëÏó^Ë„>˜PE³ƒQE%o^;D¸ApÀÂ$"p¶ üðÃÒz®9d›zÚÏ®ÝöÛqÏ]·ÀLàÝ® {÷ýwàL ~máÐ"®8ã ;¹æSn9æšCÜ9Å̇Nñ襟}/ÚØº7ëm»N…ݱçmB×a‡/þøA­ºk.±Í n ,€.ÛLL\I!S+°µ™¯{1´E°Ã$²E¼ù€ ìK^ú%±gM®>Ð@`0´=Ls›µêºp…lsê›Xûr÷¾øÍ/õ³Ãýòg-öÙ¡.û_ìHÀkÿÚÁ(±âAP‚þÌV¶.È< þ¯ƒç!çØw1ÂO~A Ÿýðgý¹PäË¢·H—my1lVîæ˜€ ˜D5—mwBl˜ÎÀnæDgäì&1v’[ð”ç¿èiO¨Ù iÍì'4óÐJ¬ õ:¨´ÒÌ–º4F÷jás.Êæ,ñ*†-žRlG«%ñÒg5¬mivˆ"œP8Í5B•ðcG40˜ÀŒ D%š…·WzÎh1Ýßäú;Ü4§;MOïÔe¦[Ž4ªõªT¦²ñ…P•*UfU¬JK«\–½(VgŠ•¦e=k tz-ž.ót[_ÅXúÒÊZ–&ƒ¾&6ÆØÔ¬ßÚÙþ¼J±FÞ«`ëc(‰71£æNi{›þ\ ±Ì7E•ŽTPhHx@0„"°…óci9¨Ùv¶Ÿ%Ah«ù?¸NµsÏBí7W‹P×:¶A-m+f[á^K·¼ýÖoÁ€·à~.›‹ÛlÕ2éY€ö_Ì%ís‹&];\ö¾ø­È$'ÇßmùÀ„µ´¤½¨Ãàæv“øã'±>¸æV ä ‚ö615à$@f­mÑàŒh¼§j¯!ì—t(–0€?¹®oxsNc‚ïúÂó,fÛ„å%@B=`F0‡«„‡ëœ¹-m6í`â~¢8šÿ•_€wéâ‹X}ž1eóËå.'¤Yl ü6aô,y¡—þ3{¦D‹A¬Ã؆­…9&¯Ï ã ‘9;²aÂ^ðb(ahõ»Côà †1ÿÍfN'BÕL`ª¯…m€säè2¬­x怞ùü¦8v3Ðób³ }è${—¯Ža£É é3”kfñ¥ß\ czù×Àþ‡Ù'ü7*¬ Ë4ç,Ç™ÒÒ»'*ÁÐMÔÕs™YƒPˆá ’¨„¢cÀîh1Ó­ •éM¢ûØÉŽ)³-:+C{qΤ¶¶¿hÙ Ûîö›¾ýgÁoò¦·ëéS:[NuRZ]`¹Þ[ÚˆEJŒxA¸ ¶á6ìê¯\^ä–·-:§/\HX#^ùa¤0süûŸÓXA¤a \T(£¿BØÈ¾ ð‚W$§ -žIoÃ&²ãùX¿«¿òãº|9w×wÞbŸ–èuƹÒûwŸ8á¿xx×;/Œ×³|½÷ê#3}qg²þЈN(¸~%Û×Nì ¡1hƒkíءò\ꢕnW'}v÷5ÝéA+úþÙ7Û×}ß1å†6&\!¤9ç—~ë‡;ô~ñWó'NˆV8–å'FÜÒCD€è}£c€o„€IW~ ˆ~mwÖ÷‚âBq-‰3m’`~6$R CGÍDX†ó4C:J£.Ah66@æS’0D£B°ÇFkW-EÀdõ3¤‚Tƒ•pƒ ˜ƒÏ´ƒÊ#YÕãA $„ÍB„…d„öƒJÈ„t”né…C$…Txdõr…0ƒL …\Èd^˜1`È9bøƒÒr0xˆþãS`<³‡> U>VQ` ”´>”øJÖ’‡Åóyêb6®§jÐ$€nú¶;ˆÓÐ0€?Þ…‹·Lbn´o³ˆæˆ¸8’øEK4H—¸H“£‰Læ`Tà‰ (Š EŠ>`Ѝ¨ŠÔå3Bäsy.±¸i³h8µ9·‰“ˆ‚¼‚™È>Q€ˆâø5-DX„g²ÄtÞÄ_Dƒ¥„11¾L8h:p&0[’Æd{Óm˃Pû8lÞAÓ1n´9~‡1è˜Hê˜-ìø0îˆ[J]óX/¶?‰£ÔˆsÜU:DLvÇ3UCph1ß‚ 3 ©r U6¤ÓŽï8þ‘òcˆãx“Èâ6ôa&PTtNýˆq÷9&Vûã Å;Cpj c¡@TÛ4Ü2fÝÄKB¥4Ó6`°àIÛ¢“<Ó±ã“@™>2E:Øô9ÑæbHÉ>JI(ÄÓ”€ö”QÉn“‡0*`•ÁS-YY~[I]ù•£Ã7;Ù“ær–“–DÉ–‹ã–7—” e“8Y™/‚.ÍVSxA… C6„r1Øô‘ãGGÓ>ˆ-rs*à@[hÃ…† XoÃn×F0HkCÀ/A0 p;˜i’îWVù™3#šM8–ÎÒH‹CIhVT$Ã>­ùšBTH³)„èþg›l6Xé³›Ó›hœ:/™Yœœé™ošÀ7š–TšÎ‰šÉc–YŸ§ÁrIE†04 />С9Á8=ö¢@v‡÷‚-ÚC×$-F'°÷/ecomàê¢SwW»g/@PI Ü“ŸlCüéŸ* œ1*`Ù†e BÒ‚šz—‘#¡€djš[Š„Õƒg$ð¡!JúI¢Ef¢Ê€Þ2gJJ3*¤9”iŸT:{x.ss.eV‹)'0“M1äG‘Ói.”u™'=‚e- ³X*änê„eeoêl3§vj§Ûr§zêfzªò»à8þ–è,Ôàïp-£  ß sº{4ÃYõ¢¦¶  áPsºHVæLç‡lì#NŠ'DS#aigD‡¥}º¥Ø¥LF¨“Úœc*S®©õ2¥Uš«-;^ -šÅ6å$PQ)Hc’^0ƒFNp?…DÖb>KÃÀÁù¨±JsZ5{z§ÈÕ­vú«àêÙpR‚Eï@® ³§Ù ­?8­ÕZ {š­;™„fäHà‚\H@ÞÄ«¾êÀŠ~ÃZ¬×d®ÉŠGÿS-ÍÚ®Ö‚«º±q6PjCÚBÓšûä’Q3RåÈ>4 ÑRѪYÖâçRv-Û þ2Ó²UdOÛz-($7ÕisÚr6§[ Àà¨nª  £à¦¹09õð ʰ s*²pS²úƒ²Ü6 I‹ ¯³hM#°ß2yyÈ35K7kv^¤³®w±{°39;Së8i4²ÖBŸ[·Ñ3À÷r.s.ÖBIJß2SMI0´u‰`feJã,•sh‹Ûj6rú¦jµ-Úú¦ýx`—¨Fš·É3§|k¾ð¦ê`’oÄ þPü•>Š0§‡‹-‰Û‹›nks ¹Æ9=E¹Ë©C€¹š«› ¨.¡Ù¤ëº~k®n+¸¬ëBçä8VŽv;½ ÑBþæ¢.³‡8²ìcu“-œ:/¶U¦äœáB-øY¡À¡­+¹dÃAÛªYÐrr9»‡ïä{KX¹nº.ÄÆ¿þ`VDoŠ 49éàÛ@H#¯oZ¾Gs¾à‚Së[=´u»4CG“Àuo#.dù‹ö{Hù»¿1´Kÿ;©Ú@ζ4àò½ÃÀãÛBL16@½6œÎDDÀçLv@À‰góLã?$Ç4 %~3y- pÀXÎ’‡› WÏÒ²^p~ç2§\iy*Ô Ÿ6®«Ã3§ƒFü‹å”Àþ `9í릨ÄjéMl£T ú‹ ©¦Ä8f£…ä^7–-¡0®.þ¥<ši}7=:Ï!”³E@¬´þ  ™8þüìE®[C ŠŸ>0ÐmÀ0®ûþz.ƒB-a*À6W%? }GVl$тؠ÷L²ù-û,=æÏ"ýÎð,±"–H‚– ‘ .1 T1D:®ç—÷Çdú{N‘C/TÀ- :ÑlÐþ0FX̯Iq…WsšHr4Åຠb4“°þP R>ú/V/ZÍ`ª9)[ÈJ¨Öɇ0d U2^š[H½ÖgÄLÐÔ$ûÔƒ«OLTCPÕxM0D]Ôºêw“ pyÈ@oÔH¯/:È}1¼ôgyc‹ä7ÕŠG9X[K`Ò”c`ËL PEÕÚwõ|ßÕÙž]¥g£UýcÔаÃ4ˆ¿ž`Ù´°x0`Æ0§%] I6~Äí¦§@3§î·Œþ0ªÜiOµ© JáùÚc!þÕToß›á¶gþ¥B¾>4/#c&+-'2)^àÛõâüÃg‹6㕜ßË ûæcÊoðøF&`N‚|NiØËwu¬ó6ey`§DÛº>,ûÀfõÒéæºÔ–[–F(zÛ„Çþ’M_®¿øÑcž¯Õ Ç‹æÛ¢æ´ån¯Ü9ŃÐqþ~;„™uN¥–U›¦åÕÃåþôçaÞN™MèúºOg^åV®«Þô›fÚÖT¶CгÙâAw8Õ„6oTELÓhåíI¤º­<å0 K1`-Qõ¨ õT™¾®Ö {sÛ®Þ³Ààü@¯”é9î/M©.oì¼¾Mü뻵‡Ù,ìÄ>3AðGÇ^m ”ê:´êíLw§ ë…t®Ö^ëØ^E.xêö h=8[›|Õ]xF×ç’nÿ¨6æfqG°=_[=¯œ’4°ÌwD^mð¨Âë9$Àµ¤î×îw1Ab¤ÈY&\Øðaĉ/fÜØñcÈ‘%O irå@—0›ÎC‰I9wöü4fØ¢müÛWï^¾}ýþXð`Â… FœXqÞ6&4(’¥*•i0iÓ8"'Ahˆþ”Ô’ Z˜0Cz4¨°ÊEŠIèåS‚£Á0!á£l/F1‚±Ø&“Ý•¶V™Ù1äƒKíP¶ŒYseÎAØùËú7Ú—@~ÌÌduë×±g#¬=·nÞ¾G^üxòÆ£l>¹2•ËÊ7wþ,íl›©»ÓÀSmˆc°A„0B ‹­Â‚icˆc ɧ*‚º­3&ã 04üð´FÚ:ˆŠ *#°ì€‰Š!œº £"L(‚Äk{¯’Û©¿ @ª0,‚ìÀPÃê$yŽDQüp iñE1¡o4(G&vì‘Æw rÈ"jãÈÓPRþò 7„’F)Û±J¯#E-Y$ÈË&D4QEe´AEì "ô*³ãF JÊÆ@sŒ‘©¢|Z®H=Á‚GbF*ÚÏ Á ‚£ ¼Í³3C¹QF )¦G“!J-­Ó”4- £Nú4¬ÇDõ‰TSQvÕˆœzUYYe*-£ËŠÀ• ]%ëu _#E/¢J++–©cQä#Ogr–Hi,µˆå·_ÿ}HE€Å-aÕm ÎÒJdÂظlJ¤¶Q$(i`!£Ö4 ŒMÊìÈ!‚ðD'œÓ‰b‹à“ŠNRó»#-˜Þˆ)M¸Ì—v؈—þŒô±Š'*c‹àØã¡’™d“QÆHe*X†éewõôhæIjöéæ¹¬my&…zþ¹¤‰‡¾8ãCf»m·ßöÒ„Äv‚¼ðyÉ—ŠÀ,¢"rK÷¤­;JÖ‡ ^d‚0)¤ØÛ¬8<|h¤%[½«œ »]þ½@ã~lî›ÚïÊ Ú»ïÊþö!p“é6ÃWœqÇ™€|IÉ)·ü2Ì[Ú¼“ÎÅ é±Ðâst‚JÏu0ønqjÀÑœâØ):œŠ»Þæ¾{ï%ÔLá!P©IŸzÛšO/\ Âî%3"!Qåþ5(“JEÌ@rä;&…r¤ LpºÑé%š»ÍFþþ"ÿˆ|»ÓsÀ>0¬ï5î+üä·«ÐÕ¯>øûˆþø‡;ä# Lês2A%b`øÊ4¾ÏAPC¤ Û1 ίƒö±_ @h‡ïшGŒP$S£ù$'£9`‹Î¤¹%]KG*Ü}%k y•!‰k€DÍÑ€o‡{Ó$Œˆb)„dAèIG~ÔÆ˜Œ„‰7|b·¤È·Í5¥2WÌ¢I¶XxÑU™ZÆ(š!˜1#ŒÔÛ¨18.îO?Q¢©ƒÇJ@ñ6{¤bLöÈ×iQ,]dÂ@Ž€DV¶òˆí2‰O’7;t¬ fl‰ÙÂ’(îhÚJHþD N¬QW$Â'Ä }!Rè²dŠÄ/#L‚Ù¥Â"ˡǖ¸ÄÌ\&ÁËÄÕª5À Ë®hDLc™ #39hVBš§Qˆ¬ ›Ž0E›±,“YòME†!ãlJ99.È ÓÅH\9Qв-9§Kß2S'8Ò+sÊ@ºÆ§Ä%Å# „D²Ìø@3ïjv#&z†è7&R×P22´FV/#Ic2ƒÑ‘hT(í_X@¬‘4€$8icT*…´ô¥+¥§ d:£™j#’Ív„žá§®jˆš¡•pÔ£JœH‘w›§F5¥+­ªKÁ²þÊŠöÕ¯‰j«^U43"mséJf†‚žbeDEpâþF²d"oy¸ ’^ò§;Ùo³þQ rãh¤ºƒ‰`éIXרíqC êSfôÇB6n´"•*™W‘ ³½ŠVfPÔ˜Ïj&´£-m#N‹#kUfµ4(¬kI˜’Ø.! Âc#‹[ÊÒ‰¯oxÙðä7ô„bSðö•L–o¶4*Ênä’?úÀmIfRd6N8#IHXÒ5L)Ä >ØI¬“ ®Ô¼£A¯@©°Þ“´—bï} ä˦QÚ¿ Ùý[,ÿygÀƒO|¦#²9o9ïoDIaþxÂìÂéÊð†é»ï»ârS9>.P˜ ÊA2”Ê“<ʲq2>ÏT‰„ˆoyM"åÔHrÿEÒm ´¿ ¡ • ‹‚²b ¬LF†%H»ät:92PfV ]Sež\yj‡Û2>ÃØ°€¹C© ™+uf(©y l¦‚›‹Ü±8'ÙLd¡ rc)Nðs–m‡ ÙÔ§®D#ûÓ‹™R»ªDGø$”÷¾¥c>ʈq×ca¹uÌ*WHòêJÉ5llCÑ`SfŒ ¿ªÆ «¿èjL ¬L´N—­•¦ž è:Ò@–‚=lÉ´J îóɱƒ¢l„þ ×Ù©†n´u©ßTÛÚ³îuB;³íZy›×"‘è©.d SëE’«XÅE„BÖF \@¯L£Þœ),s³ý¤”'H3¤ÈãJBNR¤ÅÈJ·Ù‘Á™‚p|6—á/S›¼‰WåoCÆ5ó!Ž{œ© 9òF¾¿‘ÉèO(/¸†î©/.Ü\0ç“ÌaFsDÛÜ⯜ý>p®ƒ—÷=¥%w§@Pžé‘2Ó:YÌ «Ú‰ì¨œ7'dt§Q»„Z…"­jk2 •ºv¢)}]­×bÙ]µ0”2ŽYJV,dä̸›°5A3ÐíÞºÌyÓqê;ÍÁ‹þÔÌ$5|Ø/¤xýî¬ñi‡<ÛÁâöÊËó ©B©»¾ûVþM yWĶ׌¦>‚E]ägÛÊÇóE÷‘H—KI´1C$¡“Ù¸\1uÆg³^²ïÏá—ˆø|+ JZ5: ½ùË|¾X ÿ’‘QßúÎ^X´_î‹Ôû\*‘ð#ßc#òÓ/ó[ô;>Äc¿å#½·s>*€>ÈÓ=Þ³À""ˆ¬„Õè˜?Ò…¨%’D+A©#ˆ#g#‰hC¼Å;œ!hz¡`J§•¬290Ÿ ¡›#­ ‰™i6Ü ¥1Á–@Áè“Ü(llŸ .äPþ’†j.ÙÁJq‹ûAô@" ÁT:ÂdŠzË6lŸ'œ«À „÷R) 5q% èØ‰ÓBŽæ‰ÒÈÔ`‹™0#§è˜i«  y —Ð,ÿ¨#ä‰:ªƒ*;0ei©Ã™¸Cjª QâÃ¥Ø@\¾ƒ˜Bœ;á©ñEŒr[ V™Ô 0‰˜D}ˆK|¤9Ô*ÍàD<üÄ? E?ÜŸî(ÅAŽT<ÄÅKÄí‰Ãg|+8‚%ÀÀ+ƒ4°‚4ˆ‚4xƒ#ˆ‚#8‚48°A8‚lLÇ4HHèF8H`Ç7 Çy G+À ÆX‚7°‚%¿X‚(°}Ĉ+€Gr$GqdÇy<züGiüLJ¤ÆHnüH0Çi¬ÆkÌÆmìÆo Çq,Çs\ÇulÇwŒÇy¬Go¼Ç|ÜÇ~üÇ€Hj4H„4É…džüFˆ\‰\ŠÄ‹ÄHäHi¤FkÄFmäFoG†›ï¾ýZ °ÀØÜ0+̰ÃK;qÅgì¬{í´Õ’ ­ÉvÀ›r¹ç¦»n),ëõ×`»Xõm QïÄß»nAàl“@‚ Ý\uÛšëCþN0AƒE@ëÏó^Ë„>˜PE³ƒQE%o^;D¸ApÀÂ$"p¶ üðÃÒz®9d›zÚÏ®ÝöÛqÏ]·ÀLàÝ® {÷ýwàL ~máÐ"®8ã ;¹æSn9æšCÜ9Å̇Nñ襟}/ÚØº7ëm»N…ݱçmB×a‡/þøA­ºk.±Í n ,€.ÛLL\I!S+°µ™¯{1´E°Ã$²E¼ù€ ìK^ú%±gM®>Ð@`0´=Ls›µêºp…lsê›Xûr÷¾øÍ/õ³Ãýòg-öÙ¡.û_ìHÀkÿÚÁ(±âAP‚þÌV¶.È< þ¯ƒç!çØw1ÂO~A Ÿýðgý¹PäË¢·H—my1lVîæ˜€ ˜D5—mwBl˜ÎÀnæDgäì&1v’[ð”ç¿èiO¨Ù iÍì'4óÐJ¬ õ:¨´ÒÌ–º4F÷jás.Êæ,ñ*†-žRlG«%ñÒg5¬mivˆ"œP8Í5B•ðcG40˜ÀŒ D%š…·WzÎh1Ýßäú;Ü4§;MOïÔe¦[Ž4ªõªT¦²ñ…P•*UfU¬JK«\–½(VgŠ•¦e=k tz-ž.ót[_ÅXúÒÊZ–&ƒ¾&6ÆØÔ¬ßÚÙþ¼J±FÞ«`ëc(‰71£æNi{›þ\ ±Ì7E•ŽTPhHx@0„"°…óci9¨Ùv¶Ÿ%Ah«ù?¸NµsÏBí7W‹P×:¶A-m+f[á^K·¼ýÖoÁ€·à~.›‹ÛlÕ2éY€ö_Ì%ís‹&];\ö¾ø­È$'ÇßmùÀ„µ´¤½¨Ãàæv“øã'±>¸æV ä ‚ö615à$@f­mÑàŒh¼§j¯!ì—t(–0€?¹®oxsNc‚ïúÂó,fÛ„å%@B=`F0‡«„‡ëœ¹-m6í`â~¢8šÿ•_€wéâ‹X}ž1eóËå.'¤Yl ü6aô,y¡—þ3{¦D‹A¬Ã؆­…9&¯Ï ã ‘9;²aÂ^ðb(ahõ»Côà †1ÿÍfN'BÕL`ª¯…m€säè2¬­x怞ùü¦8v3Ðób³ }è${—¯Ža£É é3”kfñ¥ß\ czù×Àþ‡Ù'ü7*¬ Ë4ç,Ç™ÒÒ»'*ÁÐMÔÕs™YƒPˆá ’¨„¢cÀîh1Ó­ •éM¢ûØÉŽ)³-:+C{qΤ¶¶¿hÙ Ûîö›¾ýgÁoò¦·ëéS:[NuRZ]`¹Þ[ÚˆEJŒxA¸ ¶á6ìê¯\^ä–·-:§/\HX#^ùa¤0süûŸÓXA¤a \T(£¿BØÈ¾ ð‚W$§ -žIoÃ&²ãùX¿«¿òãº|9w×wÞbŸ–èuƹÒûwŸ8á¿xx×;/Œ×³|½÷ê#3}qg²þЈN(¸~%Û×Nì ¡1hƒkíءò\ꢕnW'}v÷5ÝéA+úþÙ7Û×}ß1å†6&\!¤9ç—~ë‡;ô~ñWó'NˆV8–å'FÜÒCD€è}£c€o„€IW~ ˆ~mwÖ÷‚âBq-‰3m’`~6$R CGÍDX†ó4C:J£.Ah66@æS’0D£B°ÇFkW-EÀdõ3¤‚Tƒ•pƒ ˜ƒÏ´ƒÊ#YÕãA $„ÍB„…d„öƒJÈ„t”né…C$…Txdõr…0ƒL …\Èd^˜1`È9bøƒÒr0xˆþãS`<³‡> U>VQ` ”´>”øJÖ’‡Åóyêb6®§jÐ$€nú¶;ˆÓÐ0€?Þ…‹·Lbn´o³ˆæˆ¸8’øEK4H—¸H“£‰Læ`Tà‰ (Š EŠ>`Ѝ¨ŠÔå3Bäsy.±¸i³h8µ9·‰“ˆ‚¼‚™È>Q€ˆâø5-DX„g²ÄtÞÄ_Dƒ¥„11¾L8h:p&0[’Æd{Óm˃Pû8lÞAÓ1n´9~‡1è˜Hê˜-ìø0îˆ[J]óX/¶?‰£ÔˆsÜU:DLvÇ3UCph1ß‚ 3 ©r U6¤ÓŽï8þ‘òcˆãx“Èâ6ôa&PTtNýˆq÷9&Vûã Å;Cpj c¡@TÛ4Ü2fÝÄKB¥4Ó6`°àIÛ¢“<Ó±ã“@™>2E:Øô9ÑæbHÉ>JI(ÄÓ”€ö”QÉn“‡0*`•ÁS-YY~[I]ù•£Ã7;Ù“ær–“–DÉ–‹ã–7—” e“8Y™/‚.ÍVSxA… C6„r1Øô‘ãGGÓ>ˆ-rs*à@[hÃ…† XoÃn×F0HkCÀ/A0 p;˜i’îWVù™3#šM8–ÎÒH‹CIhVT$Ã>­ùšBTH³)„èþg›l6Xé³›Ó›hœ:/™Yœœé™ošÀ7š–TšÎ‰šÉc–YŸ§ÁrIE†04 />С9vàê “q¦t‡÷‚-ÚC×$-F'°÷/ecomàê¢SwW»g/@PI Ü“ŸlCüéŸ* œ1ö¢@¦ 4£Bj Úz—‘C¡€djš[Š„Õƒg$¢#Júi¢E†¢Ê€Þt ,ö¢®f/J™öy¥3±‡ç27çRfµ˜r3£õ¢1$·.ûãz»G3œ5¦I¥‹¥BšsŒ‹deÎt~ÈÆ>â¤xB45–FqFt[jFiþ_ ‡“M1äG‘Ói.”u™7£‚e- ó¦*§V§l3Zén†ƒ.œ‹§¥m#¨^Úˆ`ÊdŽc‰Í¹¨2…¦™W/VŠ¥²Ú±ãÚ¢YlSN1@U•‚4£ ×¢xô?Õâ÷3£?¸4È nCÕÓ9±“Ih6@Ž.ÈÕˆäMµz«^«èÇ«¾zM'%X=3¬Àj¬ÙIº4L Lœ¬8¦Væ<ÑêÓJTÖJ;êÓ’Û -¸EßÚ«$®&éU3ha„®…DÖ«³ú°q61jCÚBÓš3:9Q3RåÈ>4 Èê2úãbŠhhf€Ö40Ýú-“—þ‡<ƒBr#P¶f-'Œ{±ë’;S`¬-E0£#{.…°a&K8`•´UdO-‹[0K2kv^T³®w³Ø¨1£±#ñ÷ø³pc-ô ±b =|/ç2çb-”DP¡ô-3Õ”C[—سŠª3ºHÉC­fce$£VÛâ0¹5§Cx`—èI&dT'`i‹§&ض#Õ”Àº˜ŽC·z·†–nz+gÓ·Æ9=¸zK¸†‹¸ºÉ€êšº.»¶ãʳo›>rk¹Teá8¶ºË-ÔiX6¦{ˆS ¬(†@Ì`õ ø ÔÐ .4£Ð똽þìþP ÔÀAvà Êo#.d93ª¸Ê;½0Ù ü€ã —x/“ é€û@æ Ì£¬ÊÊÀø@½ÈZ1B[ õ»¼»P=´Õ Ùpõ°úPæà 4 êP Ó¾C  Ý[F‡´g°„ó[¿í«ÐpŒ43£$ ììÓ½0ø€é0 T0£“n-„@Îi»ûà áLD|ÎÔhf¬3« Ô[¶€-œ¹S\½L ï 6L Ìàç—5±3£Ñ½ú ï@ƽpi¶POœ ;£ÛPÅÈ*13z Ñ‹ óò0Sü¡0 ÆP þï€\è’: `y*Ô ƒ l½õÐ D<£Ø²ÈÀЛ 8§ %~3ya Ä ,Ìö/Ôú,J75EzJl-ŒÃ`¶àÄþPF6bªjsS²§ì¯àG¯P ú0 ¤A,pFêZ Ü ˜¬Ì»0 ÔP çðfô@ ø `€ ìô ~7£û  çÄ¿Z/â'ÅŠ»`¥°Íû° ;¤Îð Ùò ßP ÛPH½< ÿźf)§9“PÍþpÍT° ÛL•@43ªÉP5ز û`ÍÀ@¾°Íº.óbÎÛÔMʺûgj¤`ÍÔ>l£þT-ÓP Ð:À€Áÿ2½ŠŸ>0Ç £9-M Ð01ÐP á.þ¥lc3ê ™Ìª 3 é¬`ÍìÌp1E š )\ Ìp ¬3M@GmÓÜK ùœÓ»ce*ì2Æ\\FÈÔA ™ÖwvÕÎÀF?M XMÇZ=?ÖÇ\ÜOc½ÑÆ8f§>!-Ò+b‰$h ª¦àQ©MyÆ: Î2[Ý€Ã[‰vÈ9­Ê„²ÅþP ð(aò#q3ú ×3 f–L ‘s½ Ò [Ú14££F󒱜ý/] ¡À-A` €9¡@ êþ€¤ýÐ.3 ÕfEȺ LðšWx–í “HÎ]ÚYM Ä,Ù©<Þ£À3«€ÃD5Ç-Ú‰­Ø³êw“ pyÈ@oÔH¯´-ÈJq]Åø:8¼H~ã®>p‹sÏú ¿}Ð)•7š3£š6 uûÍÚßÕíÂÛDÿ¬“L0£ÃK!ûÀJîZ  9k\Å'áÒ«JÊ% PE<`â„Ðû ÿ|R·Ì§!¾„T¹wõ|ßußø¥g£UýcÔŠ@Ä7\ žðš!>Å`†¬àâ.¾åíIÙtÞþ yíÙ Ôï#a{vâšdNØÒ²¬väþXþ,ÿæ¡ü8\ 0Þº nLÔB+-Ûby¡í/D³Åê€Ú«¼Dno‚·u9(1¡Ýî=0Jíì0&´‡ž†»Gè'5½“P9L æï 9åmàÔý.>`ªºí¥0mŠ[ 4ÞG÷&ÙÎ6´¬ðãm §”¾Ñöëâê°ë³êMÿ¸inM^4£éÖ;íâ|E41·-½LÓh*Àþ!ï|›óÇÐËÇL(N(ÐN Oõ&%Ë׸­9QÍ »3ØÙ0 ©¯9'O‰o4£Ì@%?ØÛp-!vWL ÿP¾½ìðGŠ ßvØþ€ÔÃóË4íS›ó…ăíÂŽ”AhóFUä‚oŸ€Öƒ³µiÀ÷¬ƒñ ÆÊn£ Ôð›#Ëþ` ÌC@½Œ =‹½L ÉÀc(> …;£žtç4jóþPm£°Íê½°Ðv`d3øK­@˜¸  ½èðLò®×v° M R¦BïÈ  Ü«œ v œ—À^çÐ5”PàêìÚ¬ç©þS`nåm“Ïù|kÔ’¶zz¬®áÉÓ ¹/ßÒÍÑ;amÕbÚCT°ñþ°”n¯^çÌãÕy^ jÔ0»ðý³œ £\™LU(5 ú³“ðà´ƒ•Q±C%—¾†Û±SɆ÷ ¤Ð`Â6UvÕkX°^¯@Ûl¨ÑÆ!`|ñ«x0d0vBRi“pc+ÿŒEšTéR¦M>…UêTªU­^Åz´  B üt+Ä®V©ÔH "gæèñÛ'o4[“"…ÆŽ¢ATÀ(Ê»·`Â[)í3x.ÐV;:«0 ÓN•ÆËê Ûš:|üð©þƒÖˆk'‘ îd2dtàƒv¶d‹3¾sÀ"F¤²Ë¾}ì”ÑÉ8(â‚ã‚øœÔÚ5×I›;¦*lå‚eG;aµ[Ÿ:eÉ âãúÕnWÆ^ldEŸ^ýzöíÝW…VàW@ƒÚaÂÄ/D³÷9±c’F*¡‚ 'zª‚Š*£§ˆR3„Å|JÈ%¯\c‚ƒŒÁ­ü| ¡ü‚hDE2šÌ'Æä ɧúK(¿ý*£F@TA,pˆ'lÑB¯<Œ¡¯JÆŠ /4,MD‘²Å⓾–`ÄO?0øóËFÌÅ v\¿{¢â¼÷Þ„3N9çLþ/&™ÀrMÅ„¼àŠ ˜ ,$ïü©‡Ÿ$鲯÷£ E˜¨bŠ(â8ýº¯B&jôÅ |ìð‚ÍüÀ± ˜($J4ª¢ŠÅ½s¾ &µÏ?Å ŒÒ ÑQe4!tÒJéÃÔ«kd‚R¥"Ô;ýîÏTWÌÕÂRKV=kåêÖ˜rÝõP;,*š/¿ltX#MNy祷ÞöèÃ"EÚ¨éKþ(ëItýÙæÔÀ ŒšZm´ƒ¢"®NͯŸRÍ50œd…ƒ¨©âQi¨dcUe]0Eóµcß~ÃKÁ7.‰ƒ^¸Õ„nb‰#þÎÏf¡ü͸ó+„"F8¢Q.vÑ‹L±ƒZÔ"£5­B‰V‘†" 7EpÖ…ÀRÄñ„ >‚Ę@ƒ¿"ASbúåÌ$sú¡Œ!ÑØ x ‰¼Cf:4zAda£¹GÈQ tœÌÆð¨G>*Â~ÑÅ\â!B2RSF^è‘aŒ$I&yƈXr&˜l#ĨþÀIOb°Ž¢Ìc›¾¸LfŠo\KÂÂ|Ⲟ„ªˆF󥂀‘Û@†A ]$G· (E ÄÑÚÈ&0Á/v5TÖ„ %ÊÌpMišPk Ã5ÁÍJq"ÞççÆ8N;™S#èT§~H²©ü¼3ž™g‘6fO|"LŸÏÔX4oéÏšT ݦýÎ…Ê„œp¨š9SšÖ‹A‹ñ—Âz2 M¡RdmDcó ”Ḇ[ukI OE’Ñ ³bBŒRCƒ6æqjË[U ä!á@'jÚVùƒS®è4Œ•èéÆ~:K0qiEýäQë£Ô¨.(N…ªT‡@þUÈ$«SÛªÿ¼ú—¡Læ®_‰ _JÊSÌ­5¨¸jàjŵÌ5$KµÃjºYξ zéÔØ—¼À6P?>šÄ÷¸1.Íxx:ØYP:JÊfWjÒ c°MȨjŒ:þ ™–Qpo.êIÕdÒšPjJ­¦øÈÂ^}n>±õÁlèÛp4rÂn'ßî¤Q¬îqND¡ã $¹‹-œ‹ZÕN·µÕuÑç6"Û»¥¡³ÿ0V^õËkª†0q_±ÔH# Ñh{ŒPF€5ø¤I1ðÁ¸V79€!UC›ÍF%’ q>3äÀ¤€7Á­Ä„0^Œ“àþuºˆÁyêšÆ L ǤÂ[b†5la{Øb £(A¢* ž8).Š—ãâ6À˜_öA°‚ml¿û8xcïä1|la$e¸Eš pšÕì”Bnr*¤j ÷«¦+qIu IdTP„¦s]‰óÁmI‘É‘@h)òËP´FÎDãÊC4p–T@¢Bܦ͸y3 âŒ@°Å™²˜aõÌg\.ªF4tžzgè…n{„YXL=®GGzÒ¨´Kt‡é,nzΞ¶Ïv…’ç ì¹Ï¦tªÑ¼ff3;O-1Ш&×Ó YR>7f¨7¢BªFFnõ ÚÐÈåÔH²‡. ̶B™.þWCNðAnG1wÚJž¶h{™ß+QЄÚf# º=Ô>ÝQÜäÞŠ¹U€î±3–í¾ ïƻ޳*¾G&kƒÛÿ¶%·SCpp\(ËnvÊ<£åñ‘|[X&—ߺ :&5?o ‹šµ1"•"ï$béš­À1®IÀêê*!¡ 3™LÅ…ÂÀ•Oc.‡Þd`ፂ¥æyºùN&J)žÈçÃÌãò†~`£·(Ý1[:híàt¨?ævS‡¬Þòf=æÜízemòœ“ýÁN8;ÐÕN”«Üñ5­Ä^oÕo¦nL}Ÿ«Ä‰Œ¶¢ e<€Lƒ Wõs"¾Uþèî;ˆ•ÆÂ7nöD: R¡¥æžŸ!Œ[ò€¢|¹£Ìka¥7>¹ÐNï7Ýé ›"ܲ>ˆvx}b/”i×>ò𯽾{¾‘OcœW–ðȬ ˆþøññïãÕ?S¤F´!±¶Ê¶2–…Â÷·ñÊ3ÄP¥0´:rÊÈp‚ß2¤»3;9…¡˜›Ù˜¤q?¾‰¿ó ¤²PûÓüÛ®2ò¹è¿JÀ™ÀV!@Ä1´œ¬˜¡xÀö« ¦¢¿ ¼¿å¢¬«zÀÿkƒŒ‰ô[¿!ô"·_ E° ±ØE¹¹K™ÂÈ/<ó'Pþ¢e¹£S#’˜@ÛÂHC‹–À X ñ "§{0#¬2Èj™%,·0™0SÚ ±€<Ñ:¹BŠšˆ€:¤+#ú—s Й%*"3DCš˜™f9B7TB°kÂ/yÂ:$ºY¹ý±Bh%-üÃ’h<"E¹# +Q‘0Y=JÙtÃ`»’8C+ü.‰éòH¸ IØ*~™¿ù:­Êµ¡)0Ú<®+ÅS¤+ ™>aŌڻÀÄ#™Å>á**¸E;T¬<âEû¨=%ÆF ÔBd$SÔªeL¸ßÛ¤6‚ÆW¼ÃP‹ =¬El|¢ ÅQäÇz¡!þˆu¬„H ·J a® ‰ºZH ¬ŒKœÚÛ ÜsÃrË£!P Ws••­ Ô5xë ‘êAI HÊÈòÚCÈ„ †Ä‡¼ ‹È£È>©¼‹ÌÈ|²®)$Cõ1œ»~ñ?’H‚LɃŒ*–lH ٽ΃Èm¢Éq±IרÇ~´Ê9ÙÅ™§Ëq±Ø>q«JÓ–e\—£#‰ €RÑBSq°0ñ~©A4\«³¢Ñ‚Ûá1;À£9îÙÊéJ ¨‚K"ñ‰²¤G´¬ªr‰ª¼‚KŠI=iü "Œ»м®„è˾ÊÊÁôÊ ËÉ@ÌþtÚÅ Æ\KÈ,7Ét“«¤Í9±‚#X(°9H+Hƒ(Hƒ78‚(8‚#Hƒ#°+„#ðMçLƒ4€á´#€„è|ƒìÄNã´°Üü%x+X‚%ˆøNÀ(°‚êLÎä<ÎèÄÎ#ÈNò¼Mò¤ÏÜLÎ8øåÄMÝäMßNá$NãDNådNè„Né¤NëÄNíNîôNðOò4OôÌÍõlÏ…Oä”Oâ¬Ï%¸Ï%ÈOØÏþüϽÍÜÜÍÞüÍàÎâŒOmÎçôMMƒê¼Îá¤Ð7°Ðô Ïñ,ÏóLÏÚTÒ8™€&uÒ'…Ò(•Ò)¥Ò*µÒ+ÅÒ,ÕÒ-åÒ.õÒ/Ó0¥Ò€;jetty-6.1.26/examples/test-webapp/src/main/webapp/snoop.jsp0000644000175000017500000000736111173372264022402 0ustar moonmoon JSP snoop page <%@ page import="javax.servlet.http.HttpUtils,java.util.Enumeration" %>

    WebApp JSP Snoop page

    Request information

    Requested URL: <%= HttpUtils.getRequestURL(request) %>
    Request method: <%= request.getMethod() %>
    Request URI: <%= request.getRequestURI() %>
    Request protocol: <%= request.getProtocol() %>
    Servlet path: <%= request.getServletPath() %>
    Path info: <%= request.getPathInfo() %>
    Path translated: <%= request.getPathTranslated() %>
    Query string: <% if(request.getQueryString()!=null) out.write(request.getQueryString().replaceAll("<", "<").replaceAll(">",">")); %>
    Content length: <%= request.getContentLength() %>
    Content type: <%= request.getContentType() %>
    Server name: <%= request.getServerName() %>
    Server port: <%= request.getServerPort() %>
    Remote user: <%= request.getRemoteUser() %>
    Remote address: <%= request.getRemoteAddr() %>
    Remote host: <%= request.getRemoteHost() %>
    Authorization scheme: <%= request.getAuthType() %>
    <% Enumeration e = request.getHeaderNames(); if(e != null && e.hasMoreElements()) { %>

    Request headers

    <% while(e.hasMoreElements()) { String k = (String) e.nextElement(); %> <% } %>
    Header: Value:
    <%= k %> <%= request.getHeader(k) %>
    <% } %> <% e = request.getParameterNames(); if(e != null && e.hasMoreElements()) { %>

    Request parameters

    <% while(e.hasMoreElements()) { String k = (String) e.nextElement(); String val = request.getParameter(k); String vals[] = request.getParameterValues(k); %> <% } %>
    Parameter: Value: Multiple values:
    <%= k.replaceAll("<", "<").replaceAll(">",">") %> <%= val.replaceAll("<", "<").replaceAll(">",">") %> <% for(int i = 0; i < vals.length; i++) { if(i > 0) out.print("
    "); out.print(vals[i].replaceAll("<", "<").replaceAll(">",">")); } %>
    <% } %> <% e = request.getAttributeNames(); if(e != null && e.hasMoreElements()) { %>

    Request Attributes

    <% while(e.hasMoreElements()) { String k = (String) e.nextElement(); Object val = request.getAttribute(k); %> <% } %>
    Attribute: Value:
    <%= k.replaceAll("<", "<").replaceAll(">",">") %> <%= val.toString().replaceAll("<", "<").replaceAll(">",">") %>
    <% } %> <% e = getServletConfig().getInitParameterNames(); if(e != null && e.hasMoreElements()) { %>

    Init parameters

    <% while(e.hasMoreElements()) { String k = (String) e.nextElement(); String val = getServletConfig().getInitParameter(k); %> <% } %>
    Parameter: Value:
    <%= k %> <%= val %>
    <% } %> jetty-6.1.26/examples/test-webapp/src/main/webapp/logonError.html0000644000175000017500000000042710472631505023535 0ustar moonmoon

    Authentication ERROR

    Username, password or role incorrect.                                                         jetty-6.1.26/examples/test-webapp/src/main/webapp/jsp/0000755000175000017500000000000011745736500021315 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/webapp/jsp/dump.jsp0000644000175000017500000000110011173372264022766 0ustar moonmoon <%@ page import="java.util.Enumeration" %>

    JSP Dump

    <% Enumeration e =request.getParameterNames(); while(e.hasMoreElements()) { String name = (String)e.nextElement(); %> <% } %>
    Request URI:<%= request.getRequestURI() %>
    ServletPath:<%= request.getServletPath() %>
    PathInfo:<%= request.getPathInfo() %>
    getParameter("<%= name %>") <%= request.getParameter(name) %>
    jetty-6.1.26/examples/test-webapp/src/main/webapp/jsp/bean1.jsp0000644000175000017500000000072211173372264023020 0ustar moonmoon <%@ page session="true"%>

    JSP1.2 Beans: 1

    Counter accessed times.
    Counter last accessed by
    Goto bean2.jsp jetty-6.1.26/examples/test-webapp/src/main/webapp/jsp/bean2.jsp0000644000175000017500000000072211173372264023021 0ustar moonmoon <%@ page session="true"%>

    JSP1.2 Beans: 2

    Counter accessed times.
    Counter last accessed by
    Goto bean1.jsp jetty-6.1.26/examples/test-webapp/src/main/webapp/jsp/tag.jsp0000644000175000017500000000064611173372264022612 0ustar moonmoon <%@ taglib uri="http://www.acme.com/taglib" prefix="acme" %> <acme:date tz="GMT">EEE, dd/MMM/yyyy HH:mm:ss ZZZ</acme:date> ==> EEE, dd/MMM/yyyy HH:mm:ss ZZZ
    <acme:date tz="EST">EEE, dd-MMM-yyyy HH:mm:ss ZZZ</acme:date> ==> EEE, dd-MMM-yyyy HH:mm:ss ZZZ
    jetty-6.1.26/examples/test-webapp/src/main/webapp/jsp/tagfile.jsp0000644000175000017500000000176711173372264023457 0ustar moonmoon<%@ taglib prefix="acme" tagdir="/WEB-INF/tags" %>

    JSP 2.0 Tag File Example


    Panel tag created from JSP fragment file in WEB-INF/tags


    First panel.
    Second panel.
    Second panel.
    Second panel.
    Second panel.
    Third panel.
    A panel in a panel. Third panel.
    jetty-6.1.26/examples/test-webapp/src/main/webapp/jsp/tag2.jsp0000644000175000017500000000041311173372264022664 0ustar moonmoon <%@ taglib uri="http://www.acme.com/taglib2" prefix="acme" %> On ${day} of ${month} in the year ${year}
    ${day} - ${month} - ${year}
    jetty-6.1.26/examples/test-webapp/src/main/webapp/jsp/expr.jsp0000644000175000017500000000076011173372264023012 0ustar moonmoon

    JSP2.0 Expressions

    ExpressionResult
    \${param["A"]} ${param["A"]} 
    \${header["host"]} ${header["host"]}
    \${header["user-agent"]} ${header["user-agent"]}
    \${1+1} ${1+1}
    \${param["A"] * 2} ${param["A"] * 2} 
    jetty-6.1.26/examples/test-webapp/src/main/webapp/jsp/index.html0000644000175000017500000000054010472631505023304 0ustar moonmoon

    Day2

    JSP 1.2 embedded java
    JSP 1.2 Bean demo
    JSP 1.2 BodyTag demo
    JSP 2.0 SimpleTag demo
    JSP 2.0 Tag File demo
    JSP 2.0 Tag Expression
    jetty-6.1.26/examples/test-webapp/src/main/webapp/remote.html0000644000175000017500000000262511421722110022666 0ustar moonmoon Powered By Jetty

    Welcome to Jetty 6 (REMOTE)

    This is the Test webapp for the Jetty 6 HTTP Server and Servlet Container. For more information about Jetty, please visit our website or wiki. Commercial support for Jetty is available via webtide.

    This is a test context that serves several demo filters and servlets. However, these test servlets are not safe for deployment on the internet as (by design) they contain cross domain scripting vulnerabilities and reveal private information. This page is displayed because you have access the context from a non local IP address. You can disable the remote address checking by editing the web.xml and changing the "remote" init parameter to true for the TestFilter. Once the webapp has been reconfigured, you can access the demonstrations here, or here if you can access the local machine.

    This webapp is deployed in $JETTY_HOME/webapp/test and configured by $JETTY_HOME/contexts/test.xml

    jetty-6.1.26/examples/test-webapp/src/main/webapp/favicon.ico0000644000175000017500000000217610342241254022635 0ustar moonmoon h(  øìèÿõb%ÿô\#ÿô^$ÿô\$ÿóX#ÿóZ$ÿõa'ÿóX$ÿòR"ÿóZ%ÿî@ÿë3ÿôa'ÿô\%ÿøìèÿ÷l)ÿõ`%ÿõe'ÿõd'ÿô\%ÿóW#ÿóV#ÿõa'ÿô]&ÿñO!ÿîAÿë2ÿîDÿøs.ÿó\%ÿñR ÿ÷k)ÿõa%ÿÿÿÿÿ6ÿóZ%ÿóY%ÿðKÿïEÿé*ÿô]%ÿ÷l+ÿô`&ÿóX#ÿ÷l*ÿöf'ÿÿ5üÿ5üÿ46Çÿÿ¢:ÿóX$ÿïFÿî?ÿê/ÿõe)ÿöl+ÿôb'ÿóY#ÿöh)ÿöi)ÿÿB*uÿ6üÿ6üÿ;#YÿQ ÿP ÿP ÿOÿP ÿ×Iÿõf)ÿòU"ÿó[$ÿô[$ÿöd'ÿˆ2ÿ-;ÿ7üÿ7üÿ?6¬ÿÿD1ÿ?6¬ÿ?6¬ÿ ÿ¡:ÿòU"ÿðKÿñO ÿòU"ÿóZ$ÿ¾Iÿÿ8üÿ8üÿ$9áÿÿ?6¬ÿ8üÿ8üÿ;$Yÿ¥HÿóW#ÿòV"ÿðIÿô\%ÿòU"ÿô\%ÿÿ?7¬ÿ9üÿ9üÿ-;ÿ ÿ;$Yÿ;$Yÿ-;ÿ£?ÿòV"ÿöe(ÿöi*ÿòV#ÿô]%ÿñMÿQ ÿD3ÿ:üÿ:üÿB,uÿR$ÿQ ÿQ ÿQ ÿQ ÿÙS!ÿõa'ÿõe(ÿóZ%ÿòS"ÿñMÿk! ÿ;%Yÿ;üÿ;üÿ?8¬ÿÿ?8¬ÿ?8¬ÿ?8¬ÿÿ£?ÿõc(ÿög)ÿòT#ÿñO ÿñN ÿŸ,ÿÿ<üÿ<üÿ<üÿÿ?8¬ÿ<üÿ<üÿ;%Yÿ£>ÿõ`'ÿõa'ÿóY%ÿóZ%ÿðLÿîCÿÿD4ÿ?8¬ÿ?8¬ÿÿÿ;%Yÿ;%Yÿ-;ÿ£=ÿô]%ÿô\%ÿök,ÿõb(ÿïEÿì:ÿj ÿB.uÿ=üÿ=üÿB.uÿ‡2ÿ£?ÿ£>ÿ¢;ÿ¾Gÿõ`&ÿõ_&ÿô_'ÿñR"ÿïFÿí=ÿˆ5ÿÿ;%Yÿ;%Yÿ-;ÿˆ6ÿõ`&ÿô]$ÿóX#ÿô\%ÿöd(ÿöf)ÿê+ÿê-ÿì5ÿê+ÿØO ÿ¥Lÿ¤Eÿ£Cÿ¥IÿÀPÿõb&ÿô_%ÿôZ$ÿô^%ÿöe(ÿög)ÿøìèÿîBÿîAÿé'ÿîBÿør-ÿ÷l*ÿöi)ÿög(ÿô_%ÿô]$ÿô^%ÿô\%ÿô^%ÿöc(ÿøìèÿjetty-6.1.26/examples/test-webapp/src/main/webapp/auth/0000755000175000017500000000000011745736500021462 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/webapp/auth/relax.txt0000644000175000017500000000114210732574322023331 0ustar moonmoon0000 0000000000000000000000000000000000000000000000000000000 0001 0000000000000000000000000000000000000000000000000000000 0002 0000000000000000000000000000000000000000000000000000000 0003 0000000000000000000000000000000000000000000000000000000 0004 0000000000000000000000000000000000000000000000000000000 0005 0000000000000000000000000000000000000000000000000000000 0006 0000000000000000000000000000000000000000000000000000000 0007 0000000000000000000000000000000000000000000000000000000 0008 0000000000000000000000000000000000000000000000000000000 0009 0000000000000000000000000000000000000000000000000000000 jetty-6.1.26/examples/test-webapp/src/main/webapp/auth/file.txt0000644000175000017500000000114210732574322023135 0ustar moonmoon0000 0000000000000000000000000000000000000000000000000000000 0001 0000000000000000000000000000000000000000000000000000000 0002 0000000000000000000000000000000000000000000000000000000 0003 0000000000000000000000000000000000000000000000000000000 0004 0000000000000000000000000000000000000000000000000000000 0005 0000000000000000000000000000000000000000000000000000000 0006 0000000000000000000000000000000000000000000000000000000 0007 0000000000000000000000000000000000000000000000000000000 0008 0000000000000000000000000000000000000000000000000000000 0009 0000000000000000000000000000000000000000000000000000000 jetty-6.1.26/examples/test-webapp/src/main/webapp/d.txt0000644000175000017500000000114210472631505021476 0ustar moonmoon0000 0000000000000000000000000000000000000000000000000000000 0001 0000000000000000000000000000000000000000000000000000000 0002 0000000000000000000000000000000000000000000000000000000 0003 0000000000000000000000000000000000000000000000000000000 0004 0000000000000000000000000000000000000000000000000000000 0005 0000000000000000000000000000000000000000000000000000000 0006 0000000000000000000000000000000000000000000000000000000 0007 0000000000000000000000000000000000000000000000000000000 0008 0000000000000000000000000000000000000000000000000000000 0009 0000000000000000000000000000000000000000000000000000000 jetty-6.1.26/examples/test-webapp/src/main/webapp/da.txt0000644000175000017500000016711010472631505021647 0ustar moonmoon0000 1111111111111111111111111111111111111111111111111111111 0001 1111111111111111111111111111111111111111111111111111111 0002 1111111111111111111111111111111111111111111111111111111 0003 1111111111111111111111111111111111111111111111111111111 0004 1111111111111111111111111111111111111111111111111111111 0005 1111111111111111111111111111111111111111111111111111111 0006 1111111111111111111111111111111111111111111111111111111 0007 1111111111111111111111111111111111111111111111111111111 0008 1111111111111111111111111111111111111111111111111111111 0009 1111111111111111111111111111111111111111111111111111111 0010 1111111111111111111111111111111111111111111111111111111 0011 1111111111111111111111111111111111111111111111111111111 0012 1111111111111111111111111111111111111111111111111111111 0013 1111111111111111111111111111111111111111111111111111111 0014 1111111111111111111111111111111111111111111111111111111 0015 1111111111111111111111111111111111111111111111111111111 0016 1111111111111111111111111111111111111111111111111111111 0017 1111111111111111111111111111111111111111111111111111111 0018 1111111111111111111111111111111111111111111111111111111 0019 1111111111111111111111111111111111111111111111111111111 0020 1111111111111111111111111111111111111111111111111111111 0021 1111111111111111111111111111111111111111111111111111111 0022 1111111111111111111111111111111111111111111111111111111 0023 1111111111111111111111111111111111111111111111111111111 0024 1111111111111111111111111111111111111111111111111111111 0025 1111111111111111111111111111111111111111111111111111111 0026 1111111111111111111111111111111111111111111111111111111 0027 1111111111111111111111111111111111111111111111111111111 0028 1111111111111111111111111111111111111111111111111111111 0029 1111111111111111111111111111111111111111111111111111111 0030 1111111111111111111111111111111111111111111111111111111 0031 1111111111111111111111111111111111111111111111111111111 0032 1111111111111111111111111111111111111111111111111111111 0033 1111111111111111111111111111111111111111111111111111111 0034 1111111111111111111111111111111111111111111111111111111 0035 1111111111111111111111111111111111111111111111111111111 0036 1111111111111111111111111111111111111111111111111111111 0037 1111111111111111111111111111111111111111111111111111111 0038 1111111111111111111111111111111111111111111111111111111 0039 1111111111111111111111111111111111111111111111111111111 0040 1111111111111111111111111111111111111111111111111111111 0041 1111111111111111111111111111111111111111111111111111111 0042 1111111111111111111111111111111111111111111111111111111 0043 1111111111111111111111111111111111111111111111111111111 0044 1111111111111111111111111111111111111111111111111111111 0045 1111111111111111111111111111111111111111111111111111111 0046 1111111111111111111111111111111111111111111111111111111 0047 1111111111111111111111111111111111111111111111111111111 0048 1111111111111111111111111111111111111111111111111111111 0049 1111111111111111111111111111111111111111111111111111111 0050 1111111111111111111111111111111111111111111111111111111 0051 1111111111111111111111111111111111111111111111111111111 0052 1111111111111111111111111111111111111111111111111111111 0053 1111111111111111111111111111111111111111111111111111111 0054 1111111111111111111111111111111111111111111111111111111 0055 1111111111111111111111111111111111111111111111111111111 0056 1111111111111111111111111111111111111111111111111111111 0057 1111111111111111111111111111111111111111111111111111111 0058 1111111111111111111111111111111111111111111111111111111 0059 1111111111111111111111111111111111111111111111111111111 0060 1111111111111111111111111111111111111111111111111111111 0061 1111111111111111111111111111111111111111111111111111111 0062 1111111111111111111111111111111111111111111111111111111 0063 1111111111111111111111111111111111111111111111111111111 0064 1111111111111111111111111111111111111111111111111111111 0065 1111111111111111111111111111111111111111111111111111111 0066 1111111111111111111111111111111111111111111111111111111 0067 1111111111111111111111111111111111111111111111111111111 0068 1111111111111111111111111111111111111111111111111111111 0069 1111111111111111111111111111111111111111111111111111111 0070 1111111111111111111111111111111111111111111111111111111 0071 1111111111111111111111111111111111111111111111111111111 0072 1111111111111111111111111111111111111111111111111111111 0073 1111111111111111111111111111111111111111111111111111111 0074 1111111111111111111111111111111111111111111111111111111 0075 1111111111111111111111111111111111111111111111111111111 0076 1111111111111111111111111111111111111111111111111111111 0077 1111111111111111111111111111111111111111111111111111111 0078 1111111111111111111111111111111111111111111111111111111 0079 1111111111111111111111111111111111111111111111111111111 0080 1111111111111111111111111111111111111111111111111111111 0081 1111111111111111111111111111111111111111111111111111111 0082 1111111111111111111111111111111111111111111111111111111 0083 1111111111111111111111111111111111111111111111111111111 0084 1111111111111111111111111111111111111111111111111111111 0085 1111111111111111111111111111111111111111111111111111111 0086 1111111111111111111111111111111111111111111111111111111 0087 1111111111111111111111111111111111111111111111111111111 0088 1111111111111111111111111111111111111111111111111111111 0089 1111111111111111111111111111111111111111111111111111111 0090 1111111111111111111111111111111111111111111111111111111 0091 1111111111111111111111111111111111111111111111111111111 0092 1111111111111111111111111111111111111111111111111111111 0093 1111111111111111111111111111111111111111111111111111111 0094 1111111111111111111111111111111111111111111111111111111 0095 1111111111111111111111111111111111111111111111111111111 0096 1111111111111111111111111111111111111111111111111111111 0097 1111111111111111111111111111111111111111111111111111111 0098 1111111111111111111111111111111111111111111111111111111 0099 1111111111111111111111111111111111111111111111111111111 0100 1111111111111111111111111111111111111111111111111111111 0101 1111111111111111111111111111111111111111111111111111111 0102 1111111111111111111111111111111111111111111111111111111 0103 1111111111111111111111111111111111111111111111111111111 0104 1111111111111111111111111111111111111111111111111111111 0105 1111111111111111111111111111111111111111111111111111111 0106 1111111111111111111111111111111111111111111111111111111 0107 1111111111111111111111111111111111111111111111111111111 0108 1111111111111111111111111111111111111111111111111111111 0109 1111111111111111111111111111111111111111111111111111111 0110 1111111111111111111111111111111111111111111111111111111 0111 1111111111111111111111111111111111111111111111111111111 0112 1111111111111111111111111111111111111111111111111111111 0113 1111111111111111111111111111111111111111111111111111111 0114 1111111111111111111111111111111111111111111111111111111 0115 1111111111111111111111111111111111111111111111111111111 0116 1111111111111111111111111111111111111111111111111111111 0117 1111111111111111111111111111111111111111111111111111111 0118 1111111111111111111111111111111111111111111111111111111 0119 1111111111111111111111111111111111111111111111111111111 0120 1111111111111111111111111111111111111111111111111111111 0121 1111111111111111111111111111111111111111111111111111111 0122 1111111111111111111111111111111111111111111111111111111 0123 1111111111111111111111111111111111111111111111111111111 0124 1111111111111111111111111111111111111111111111111111111 0125 1111111111111111111111111111111111111111111111111111111 0126 1111111111111111111111111111111111111111111111111111111 0127 1111111111111111111111111111111111111111111111111111111 0128 1111111111111111111111111111111111111111111111111111111 0129 1111111111111111111111111111111111111111111111111111111 0130 1111111111111111111111111111111111111111111111111111111 0131 1111111111111111111111111111111111111111111111111111111 0132 1111111111111111111111111111111111111111111111111111111 0133 1111111111111111111111111111111111111111111111111111111 0134 1111111111111111111111111111111111111111111111111111111 0135 1111111111111111111111111111111111111111111111111111111 0136 1111111111111111111111111111111111111111111111111111111 0137 1111111111111111111111111111111111111111111111111111111 0138 1111111111111111111111111111111111111111111111111111111 0139 1111111111111111111111111111111111111111111111111111111 0140 1111111111111111111111111111111111111111111111111111111 0141 1111111111111111111111111111111111111111111111111111111 0142 1111111111111111111111111111111111111111111111111111111 0143 1111111111111111111111111111111111111111111111111111111 0144 1111111111111111111111111111111111111111111111111111111 0145 1111111111111111111111111111111111111111111111111111111 0146 1111111111111111111111111111111111111111111111111111111 0147 1111111111111111111111111111111111111111111111111111111 0148 1111111111111111111111111111111111111111111111111111111 0149 1111111111111111111111111111111111111111111111111111111 0150 1111111111111111111111111111111111111111111111111111111 0151 1111111111111111111111111111111111111111111111111111111 0152 1111111111111111111111111111111111111111111111111111111 0153 1111111111111111111111111111111111111111111111111111111 0154 1111111111111111111111111111111111111111111111111111111 0155 1111111111111111111111111111111111111111111111111111111 0156 1111111111111111111111111111111111111111111111111111111 0157 1111111111111111111111111111111111111111111111111111111 0158 1111111111111111111111111111111111111111111111111111111 0159 1111111111111111111111111111111111111111111111111111111 0160 1111111111111111111111111111111111111111111111111111111 0161 1111111111111111111111111111111111111111111111111111111 0162 1111111111111111111111111111111111111111111111111111111 0163 1111111111111111111111111111111111111111111111111111111 0164 1111111111111111111111111111111111111111111111111111111 0165 1111111111111111111111111111111111111111111111111111111 0166 1111111111111111111111111111111111111111111111111111111 0167 1111111111111111111111111111111111111111111111111111111 0168 1111111111111111111111111111111111111111111111111111111 0169 1111111111111111111111111111111111111111111111111111111 0170 1111111111111111111111111111111111111111111111111111111 0171 1111111111111111111111111111111111111111111111111111111 0172 1111111111111111111111111111111111111111111111111111111 0173 1111111111111111111111111111111111111111111111111111111 0174 1111111111111111111111111111111111111111111111111111111 0175 1111111111111111111111111111111111111111111111111111111 0176 1111111111111111111111111111111111111111111111111111111 0177 1111111111111111111111111111111111111111111111111111111 0178 1111111111111111111111111111111111111111111111111111111 0179 1111111111111111111111111111111111111111111111111111111 0180 1111111111111111111111111111111111111111111111111111111 0181 1111111111111111111111111111111111111111111111111111111 0182 1111111111111111111111111111111111111111111111111111111 0183 1111111111111111111111111111111111111111111111111111111 0184 1111111111111111111111111111111111111111111111111111111 0185 1111111111111111111111111111111111111111111111111111111 0186 1111111111111111111111111111111111111111111111111111111 0187 1111111111111111111111111111111111111111111111111111111 0188 1111111111111111111111111111111111111111111111111111111 0189 1111111111111111111111111111111111111111111111111111111 0190 1111111111111111111111111111111111111111111111111111111 0191 1111111111111111111111111111111111111111111111111111111 0192 1111111111111111111111111111111111111111111111111111111 0193 1111111111111111111111111111111111111111111111111111111 0194 1111111111111111111111111111111111111111111111111111111 0195 1111111111111111111111111111111111111111111111111111111 0196 1111111111111111111111111111111111111111111111111111111 0197 1111111111111111111111111111111111111111111111111111111 0198 1111111111111111111111111111111111111111111111111111111 0199 1111111111111111111111111111111111111111111111111111111 0200 1111111111111111111111111111111111111111111111111111111 0201 1111111111111111111111111111111111111111111111111111111 0202 1111111111111111111111111111111111111111111111111111111 0203 1111111111111111111111111111111111111111111111111111111 0204 1111111111111111111111111111111111111111111111111111111 0205 1111111111111111111111111111111111111111111111111111111 0206 1111111111111111111111111111111111111111111111111111111 0207 1111111111111111111111111111111111111111111111111111111 0208 1111111111111111111111111111111111111111111111111111111 0209 1111111111111111111111111111111111111111111111111111111 0210 1111111111111111111111111111111111111111111111111111111 0211 1111111111111111111111111111111111111111111111111111111 0212 1111111111111111111111111111111111111111111111111111111 0213 1111111111111111111111111111111111111111111111111111111 0214 1111111111111111111111111111111111111111111111111111111 0215 1111111111111111111111111111111111111111111111111111111 0216 1111111111111111111111111111111111111111111111111111111 0217 1111111111111111111111111111111111111111111111111111111 0218 1111111111111111111111111111111111111111111111111111111 0219 1111111111111111111111111111111111111111111111111111111 0220 1111111111111111111111111111111111111111111111111111111 0221 1111111111111111111111111111111111111111111111111111111 0222 1111111111111111111111111111111111111111111111111111111 0223 1111111111111111111111111111111111111111111111111111111 0224 1111111111111111111111111111111111111111111111111111111 0225 1111111111111111111111111111111111111111111111111111111 0226 1111111111111111111111111111111111111111111111111111111 0227 1111111111111111111111111111111111111111111111111111111 0228 1111111111111111111111111111111111111111111111111111111 0229 1111111111111111111111111111111111111111111111111111111 0230 1111111111111111111111111111111111111111111111111111111 0231 1111111111111111111111111111111111111111111111111111111 0232 1111111111111111111111111111111111111111111111111111111 0233 1111111111111111111111111111111111111111111111111111111 0234 1111111111111111111111111111111111111111111111111111111 0235 1111111111111111111111111111111111111111111111111111111 0236 1111111111111111111111111111111111111111111111111111111 0237 1111111111111111111111111111111111111111111111111111111 0238 1111111111111111111111111111111111111111111111111111111 0239 1111111111111111111111111111111111111111111111111111111 0240 1111111111111111111111111111111111111111111111111111111 0241 1111111111111111111111111111111111111111111111111111111 0242 1111111111111111111111111111111111111111111111111111111 0243 1111111111111111111111111111111111111111111111111111111 0244 1111111111111111111111111111111111111111111111111111111 0245 1111111111111111111111111111111111111111111111111111111 0246 1111111111111111111111111111111111111111111111111111111 0247 1111111111111111111111111111111111111111111111111111111 0248 1111111111111111111111111111111111111111111111111111111 0249 1111111111111111111111111111111111111111111111111111111 0250 1111111111111111111111111111111111111111111111111111111 0251 1111111111111111111111111111111111111111111111111111111 0252 1111111111111111111111111111111111111111111111111111111 0253 1111111111111111111111111111111111111111111111111111111 0254 1111111111111111111111111111111111111111111111111111111 0255 1111111111111111111111111111111111111111111111111111111 0256 1111111111111111111111111111111111111111111111111111111 0257 1111111111111111111111111111111111111111111111111111111 0258 1111111111111111111111111111111111111111111111111111111 0259 1111111111111111111111111111111111111111111111111111111 0260 1111111111111111111111111111111111111111111111111111111 0261 1111111111111111111111111111111111111111111111111111111 0262 1111111111111111111111111111111111111111111111111111111 0263 1111111111111111111111111111111111111111111111111111111 0264 1111111111111111111111111111111111111111111111111111111 0265 1111111111111111111111111111111111111111111111111111111 0266 1111111111111111111111111111111111111111111111111111111 0267 1111111111111111111111111111111111111111111111111111111 0268 1111111111111111111111111111111111111111111111111111111 0269 1111111111111111111111111111111111111111111111111111111 0270 1111111111111111111111111111111111111111111111111111111 0271 1111111111111111111111111111111111111111111111111111111 0272 1111111111111111111111111111111111111111111111111111111 0273 1111111111111111111111111111111111111111111111111111111 0274 1111111111111111111111111111111111111111111111111111111 0275 1111111111111111111111111111111111111111111111111111111 0276 1111111111111111111111111111111111111111111111111111111 0277 1111111111111111111111111111111111111111111111111111111 0278 1111111111111111111111111111111111111111111111111111111 0279 1111111111111111111111111111111111111111111111111111111 0280 1111111111111111111111111111111111111111111111111111111 0281 1111111111111111111111111111111111111111111111111111111 0282 1111111111111111111111111111111111111111111111111111111 0283 1111111111111111111111111111111111111111111111111111111 0284 1111111111111111111111111111111111111111111111111111111 0285 1111111111111111111111111111111111111111111111111111111 0286 1111111111111111111111111111111111111111111111111111111 0287 1111111111111111111111111111111111111111111111111111111 0288 1111111111111111111111111111111111111111111111111111111 0289 1111111111111111111111111111111111111111111111111111111 0290 1111111111111111111111111111111111111111111111111111111 0291 1111111111111111111111111111111111111111111111111111111 0292 1111111111111111111111111111111111111111111111111111111 0293 1111111111111111111111111111111111111111111111111111111 0294 1111111111111111111111111111111111111111111111111111111 0295 1111111111111111111111111111111111111111111111111111111 0296 1111111111111111111111111111111111111111111111111111111 0297 1111111111111111111111111111111111111111111111111111111 0298 1111111111111111111111111111111111111111111111111111111 0299 1111111111111111111111111111111111111111111111111111111 0300 1111111111111111111111111111111111111111111111111111111 0301 1111111111111111111111111111111111111111111111111111111 0302 1111111111111111111111111111111111111111111111111111111 0303 1111111111111111111111111111111111111111111111111111111 0304 1111111111111111111111111111111111111111111111111111111 0305 1111111111111111111111111111111111111111111111111111111 0306 1111111111111111111111111111111111111111111111111111111 0307 1111111111111111111111111111111111111111111111111111111 0308 1111111111111111111111111111111111111111111111111111111 0309 1111111111111111111111111111111111111111111111111111111 0310 1111111111111111111111111111111111111111111111111111111 0311 1111111111111111111111111111111111111111111111111111111 0312 1111111111111111111111111111111111111111111111111111111 0313 1111111111111111111111111111111111111111111111111111111 0314 1111111111111111111111111111111111111111111111111111111 0315 1111111111111111111111111111111111111111111111111111111 0316 1111111111111111111111111111111111111111111111111111111 0317 1111111111111111111111111111111111111111111111111111111 0318 1111111111111111111111111111111111111111111111111111111 0319 1111111111111111111111111111111111111111111111111111111 0320 1111111111111111111111111111111111111111111111111111111 0321 1111111111111111111111111111111111111111111111111111111 0322 1111111111111111111111111111111111111111111111111111111 0323 1111111111111111111111111111111111111111111111111111111 0324 1111111111111111111111111111111111111111111111111111111 0325 1111111111111111111111111111111111111111111111111111111 0326 1111111111111111111111111111111111111111111111111111111 0327 1111111111111111111111111111111111111111111111111111111 0328 1111111111111111111111111111111111111111111111111111111 0329 1111111111111111111111111111111111111111111111111111111 0330 1111111111111111111111111111111111111111111111111111111 0331 1111111111111111111111111111111111111111111111111111111 0332 1111111111111111111111111111111111111111111111111111111 0333 1111111111111111111111111111111111111111111111111111111 0334 1111111111111111111111111111111111111111111111111111111 0335 1111111111111111111111111111111111111111111111111111111 0336 1111111111111111111111111111111111111111111111111111111 0337 1111111111111111111111111111111111111111111111111111111 0338 1111111111111111111111111111111111111111111111111111111 0339 1111111111111111111111111111111111111111111111111111111 0340 1111111111111111111111111111111111111111111111111111111 0341 1111111111111111111111111111111111111111111111111111111 0342 1111111111111111111111111111111111111111111111111111111 0343 1111111111111111111111111111111111111111111111111111111 0344 1111111111111111111111111111111111111111111111111111111 0345 1111111111111111111111111111111111111111111111111111111 0346 1111111111111111111111111111111111111111111111111111111 0347 1111111111111111111111111111111111111111111111111111111 0348 1111111111111111111111111111111111111111111111111111111 0349 1111111111111111111111111111111111111111111111111111111 0350 1111111111111111111111111111111111111111111111111111111 0351 1111111111111111111111111111111111111111111111111111111 0352 1111111111111111111111111111111111111111111111111111111 0353 1111111111111111111111111111111111111111111111111111111 0354 1111111111111111111111111111111111111111111111111111111 0355 1111111111111111111111111111111111111111111111111111111 0356 1111111111111111111111111111111111111111111111111111111 0357 1111111111111111111111111111111111111111111111111111111 0358 1111111111111111111111111111111111111111111111111111111 0359 1111111111111111111111111111111111111111111111111111111 0360 1111111111111111111111111111111111111111111111111111111 0361 1111111111111111111111111111111111111111111111111111111 0362 1111111111111111111111111111111111111111111111111111111 0363 1111111111111111111111111111111111111111111111111111111 0364 1111111111111111111111111111111111111111111111111111111 0365 1111111111111111111111111111111111111111111111111111111 0366 1111111111111111111111111111111111111111111111111111111 0367 1111111111111111111111111111111111111111111111111111111 0368 1111111111111111111111111111111111111111111111111111111 0369 1111111111111111111111111111111111111111111111111111111 0370 1111111111111111111111111111111111111111111111111111111 0371 1111111111111111111111111111111111111111111111111111111 0372 1111111111111111111111111111111111111111111111111111111 0373 1111111111111111111111111111111111111111111111111111111 0374 1111111111111111111111111111111111111111111111111111111 0375 1111111111111111111111111111111111111111111111111111111 0376 1111111111111111111111111111111111111111111111111111111 0377 1111111111111111111111111111111111111111111111111111111 0378 1111111111111111111111111111111111111111111111111111111 0379 1111111111111111111111111111111111111111111111111111111 0380 1111111111111111111111111111111111111111111111111111111 0381 1111111111111111111111111111111111111111111111111111111 0382 1111111111111111111111111111111111111111111111111111111 0383 1111111111111111111111111111111111111111111111111111111 0384 1111111111111111111111111111111111111111111111111111111 0385 1111111111111111111111111111111111111111111111111111111 0386 1111111111111111111111111111111111111111111111111111111 0387 1111111111111111111111111111111111111111111111111111111 0388 1111111111111111111111111111111111111111111111111111111 0389 1111111111111111111111111111111111111111111111111111111 0390 1111111111111111111111111111111111111111111111111111111 0391 1111111111111111111111111111111111111111111111111111111 0392 1111111111111111111111111111111111111111111111111111111 0393 1111111111111111111111111111111111111111111111111111111 0394 1111111111111111111111111111111111111111111111111111111 0395 1111111111111111111111111111111111111111111111111111111 0396 1111111111111111111111111111111111111111111111111111111 0397 1111111111111111111111111111111111111111111111111111111 0398 1111111111111111111111111111111111111111111111111111111 0399 1111111111111111111111111111111111111111111111111111111 0400 1111111111111111111111111111111111111111111111111111111 0401 1111111111111111111111111111111111111111111111111111111 0402 1111111111111111111111111111111111111111111111111111111 0403 1111111111111111111111111111111111111111111111111111111 0404 1111111111111111111111111111111111111111111111111111111 0405 1111111111111111111111111111111111111111111111111111111 0406 1111111111111111111111111111111111111111111111111111111 0407 1111111111111111111111111111111111111111111111111111111 0408 1111111111111111111111111111111111111111111111111111111 0409 1111111111111111111111111111111111111111111111111111111 0410 1111111111111111111111111111111111111111111111111111111 0411 1111111111111111111111111111111111111111111111111111111 0412 1111111111111111111111111111111111111111111111111111111 0413 1111111111111111111111111111111111111111111111111111111 0414 1111111111111111111111111111111111111111111111111111111 0415 1111111111111111111111111111111111111111111111111111111 0416 1111111111111111111111111111111111111111111111111111111 0417 1111111111111111111111111111111111111111111111111111111 0418 1111111111111111111111111111111111111111111111111111111 0419 1111111111111111111111111111111111111111111111111111111 0420 1111111111111111111111111111111111111111111111111111111 0421 1111111111111111111111111111111111111111111111111111111 0422 1111111111111111111111111111111111111111111111111111111 0423 1111111111111111111111111111111111111111111111111111111 0424 1111111111111111111111111111111111111111111111111111111 0425 1111111111111111111111111111111111111111111111111111111 0426 1111111111111111111111111111111111111111111111111111111 0427 1111111111111111111111111111111111111111111111111111111 0428 1111111111111111111111111111111111111111111111111111111 0429 1111111111111111111111111111111111111111111111111111111 0430 1111111111111111111111111111111111111111111111111111111 0431 1111111111111111111111111111111111111111111111111111111 0432 1111111111111111111111111111111111111111111111111111111 0433 1111111111111111111111111111111111111111111111111111111 0434 1111111111111111111111111111111111111111111111111111111 0435 1111111111111111111111111111111111111111111111111111111 0436 1111111111111111111111111111111111111111111111111111111 0437 1111111111111111111111111111111111111111111111111111111 0438 1111111111111111111111111111111111111111111111111111111 0439 1111111111111111111111111111111111111111111111111111111 0440 1111111111111111111111111111111111111111111111111111111 0441 1111111111111111111111111111111111111111111111111111111 0442 1111111111111111111111111111111111111111111111111111111 0443 1111111111111111111111111111111111111111111111111111111 0444 1111111111111111111111111111111111111111111111111111111 0445 1111111111111111111111111111111111111111111111111111111 0446 1111111111111111111111111111111111111111111111111111111 0447 1111111111111111111111111111111111111111111111111111111 0448 1111111111111111111111111111111111111111111111111111111 0449 1111111111111111111111111111111111111111111111111111111 0450 1111111111111111111111111111111111111111111111111111111 0451 1111111111111111111111111111111111111111111111111111111 0452 1111111111111111111111111111111111111111111111111111111 0453 1111111111111111111111111111111111111111111111111111111 0454 1111111111111111111111111111111111111111111111111111111 0455 1111111111111111111111111111111111111111111111111111111 0456 1111111111111111111111111111111111111111111111111111111 0457 1111111111111111111111111111111111111111111111111111111 0458 1111111111111111111111111111111111111111111111111111111 0459 1111111111111111111111111111111111111111111111111111111 0460 1111111111111111111111111111111111111111111111111111111 0461 1111111111111111111111111111111111111111111111111111111 0462 1111111111111111111111111111111111111111111111111111111 0463 1111111111111111111111111111111111111111111111111111111 0464 1111111111111111111111111111111111111111111111111111111 0465 1111111111111111111111111111111111111111111111111111111 0466 1111111111111111111111111111111111111111111111111111111 0467 1111111111111111111111111111111111111111111111111111111 0468 1111111111111111111111111111111111111111111111111111111 0469 1111111111111111111111111111111111111111111111111111111 0470 1111111111111111111111111111111111111111111111111111111 0471 1111111111111111111111111111111111111111111111111111111 0472 1111111111111111111111111111111111111111111111111111111 0473 1111111111111111111111111111111111111111111111111111111 0474 1111111111111111111111111111111111111111111111111111111 0475 1111111111111111111111111111111111111111111111111111111 0476 1111111111111111111111111111111111111111111111111111111 0477 1111111111111111111111111111111111111111111111111111111 0478 1111111111111111111111111111111111111111111111111111111 0479 1111111111111111111111111111111111111111111111111111111 0480 1111111111111111111111111111111111111111111111111111111 0481 1111111111111111111111111111111111111111111111111111111 0482 1111111111111111111111111111111111111111111111111111111 0483 1111111111111111111111111111111111111111111111111111111 0484 1111111111111111111111111111111111111111111111111111111 0485 1111111111111111111111111111111111111111111111111111111 0486 1111111111111111111111111111111111111111111111111111111 0487 1111111111111111111111111111111111111111111111111111111 0488 1111111111111111111111111111111111111111111111111111111 0489 1111111111111111111111111111111111111111111111111111111 0490 1111111111111111111111111111111111111111111111111111111 0491 1111111111111111111111111111111111111111111111111111111 0492 1111111111111111111111111111111111111111111111111111111 0493 1111111111111111111111111111111111111111111111111111111 0494 1111111111111111111111111111111111111111111111111111111 0495 1111111111111111111111111111111111111111111111111111111 0496 1111111111111111111111111111111111111111111111111111111 0497 1111111111111111111111111111111111111111111111111111111 0498 1111111111111111111111111111111111111111111111111111111 0499 1111111111111111111111111111111111111111111111111111111 0500 1111111111111111111111111111111111111111111111111111111 0501 1111111111111111111111111111111111111111111111111111111 0502 1111111111111111111111111111111111111111111111111111111 0503 1111111111111111111111111111111111111111111111111111111 0504 1111111111111111111111111111111111111111111111111111111 0505 1111111111111111111111111111111111111111111111111111111 0506 1111111111111111111111111111111111111111111111111111111 0507 1111111111111111111111111111111111111111111111111111111 0508 1111111111111111111111111111111111111111111111111111111 0509 1111111111111111111111111111111111111111111111111111111 0510 1111111111111111111111111111111111111111111111111111111 0511 1111111111111111111111111111111111111111111111111111111 0512 1111111111111111111111111111111111111111111111111111111 0513 1111111111111111111111111111111111111111111111111111111 0514 1111111111111111111111111111111111111111111111111111111 0515 1111111111111111111111111111111111111111111111111111111 0516 1111111111111111111111111111111111111111111111111111111 0517 1111111111111111111111111111111111111111111111111111111 0518 1111111111111111111111111111111111111111111111111111111 0519 1111111111111111111111111111111111111111111111111111111 0520 1111111111111111111111111111111111111111111111111111111 0521 1111111111111111111111111111111111111111111111111111111 0522 1111111111111111111111111111111111111111111111111111111 0523 1111111111111111111111111111111111111111111111111111111 0524 1111111111111111111111111111111111111111111111111111111 0525 1111111111111111111111111111111111111111111111111111111 0526 1111111111111111111111111111111111111111111111111111111 0527 1111111111111111111111111111111111111111111111111111111 0528 1111111111111111111111111111111111111111111111111111111 0529 1111111111111111111111111111111111111111111111111111111 0530 1111111111111111111111111111111111111111111111111111111 0531 1111111111111111111111111111111111111111111111111111111 0532 1111111111111111111111111111111111111111111111111111111 0533 1111111111111111111111111111111111111111111111111111111 0534 1111111111111111111111111111111111111111111111111111111 0535 1111111111111111111111111111111111111111111111111111111 0536 1111111111111111111111111111111111111111111111111111111 0537 1111111111111111111111111111111111111111111111111111111 0538 1111111111111111111111111111111111111111111111111111111 0539 1111111111111111111111111111111111111111111111111111111 0540 1111111111111111111111111111111111111111111111111111111 0541 1111111111111111111111111111111111111111111111111111111 0542 1111111111111111111111111111111111111111111111111111111 0543 1111111111111111111111111111111111111111111111111111111 0544 1111111111111111111111111111111111111111111111111111111 0545 1111111111111111111111111111111111111111111111111111111 0546 1111111111111111111111111111111111111111111111111111111 0547 1111111111111111111111111111111111111111111111111111111 0548 1111111111111111111111111111111111111111111111111111111 0549 1111111111111111111111111111111111111111111111111111111 0550 1111111111111111111111111111111111111111111111111111111 0551 1111111111111111111111111111111111111111111111111111111 0552 1111111111111111111111111111111111111111111111111111111 0553 1111111111111111111111111111111111111111111111111111111 0554 1111111111111111111111111111111111111111111111111111111 0555 1111111111111111111111111111111111111111111111111111111 0556 1111111111111111111111111111111111111111111111111111111 0557 1111111111111111111111111111111111111111111111111111111 0558 1111111111111111111111111111111111111111111111111111111 0559 1111111111111111111111111111111111111111111111111111111 0560 1111111111111111111111111111111111111111111111111111111 0561 1111111111111111111111111111111111111111111111111111111 0562 1111111111111111111111111111111111111111111111111111111 0563 1111111111111111111111111111111111111111111111111111111 0564 1111111111111111111111111111111111111111111111111111111 0565 1111111111111111111111111111111111111111111111111111111 0566 1111111111111111111111111111111111111111111111111111111 0567 1111111111111111111111111111111111111111111111111111111 0568 1111111111111111111111111111111111111111111111111111111 0569 1111111111111111111111111111111111111111111111111111111 0570 1111111111111111111111111111111111111111111111111111111 0571 1111111111111111111111111111111111111111111111111111111 0572 1111111111111111111111111111111111111111111111111111111 0573 1111111111111111111111111111111111111111111111111111111 0574 1111111111111111111111111111111111111111111111111111111 0575 1111111111111111111111111111111111111111111111111111111 0576 1111111111111111111111111111111111111111111111111111111 0577 1111111111111111111111111111111111111111111111111111111 0578 1111111111111111111111111111111111111111111111111111111 0579 1111111111111111111111111111111111111111111111111111111 0580 1111111111111111111111111111111111111111111111111111111 0581 1111111111111111111111111111111111111111111111111111111 0582 1111111111111111111111111111111111111111111111111111111 0583 1111111111111111111111111111111111111111111111111111111 0584 1111111111111111111111111111111111111111111111111111111 0585 1111111111111111111111111111111111111111111111111111111 0586 1111111111111111111111111111111111111111111111111111111 0587 1111111111111111111111111111111111111111111111111111111 0588 1111111111111111111111111111111111111111111111111111111 0589 1111111111111111111111111111111111111111111111111111111 0590 1111111111111111111111111111111111111111111111111111111 0591 1111111111111111111111111111111111111111111111111111111 0592 1111111111111111111111111111111111111111111111111111111 0593 1111111111111111111111111111111111111111111111111111111 0594 1111111111111111111111111111111111111111111111111111111 0595 1111111111111111111111111111111111111111111111111111111 0596 1111111111111111111111111111111111111111111111111111111 0597 1111111111111111111111111111111111111111111111111111111 0598 1111111111111111111111111111111111111111111111111111111 0599 1111111111111111111111111111111111111111111111111111111 0600 1111111111111111111111111111111111111111111111111111111 0601 1111111111111111111111111111111111111111111111111111111 0602 1111111111111111111111111111111111111111111111111111111 0603 1111111111111111111111111111111111111111111111111111111 0604 1111111111111111111111111111111111111111111111111111111 0605 1111111111111111111111111111111111111111111111111111111 0606 1111111111111111111111111111111111111111111111111111111 0607 1111111111111111111111111111111111111111111111111111111 0608 1111111111111111111111111111111111111111111111111111111 0609 1111111111111111111111111111111111111111111111111111111 0610 1111111111111111111111111111111111111111111111111111111 0611 1111111111111111111111111111111111111111111111111111111 0612 1111111111111111111111111111111111111111111111111111111 0613 1111111111111111111111111111111111111111111111111111111 0614 1111111111111111111111111111111111111111111111111111111 0615 1111111111111111111111111111111111111111111111111111111 0616 1111111111111111111111111111111111111111111111111111111 0617 1111111111111111111111111111111111111111111111111111111 0618 1111111111111111111111111111111111111111111111111111111 0619 1111111111111111111111111111111111111111111111111111111 0620 1111111111111111111111111111111111111111111111111111111 0621 1111111111111111111111111111111111111111111111111111111 0622 1111111111111111111111111111111111111111111111111111111 0623 1111111111111111111111111111111111111111111111111111111 0624 1111111111111111111111111111111111111111111111111111111 0625 1111111111111111111111111111111111111111111111111111111 0626 1111111111111111111111111111111111111111111111111111111 0627 1111111111111111111111111111111111111111111111111111111 0628 1111111111111111111111111111111111111111111111111111111 0629 1111111111111111111111111111111111111111111111111111111 0630 1111111111111111111111111111111111111111111111111111111 0631 1111111111111111111111111111111111111111111111111111111 0632 1111111111111111111111111111111111111111111111111111111 0633 1111111111111111111111111111111111111111111111111111111 0634 1111111111111111111111111111111111111111111111111111111 0635 1111111111111111111111111111111111111111111111111111111 0636 1111111111111111111111111111111111111111111111111111111 0637 1111111111111111111111111111111111111111111111111111111 0638 1111111111111111111111111111111111111111111111111111111 0639 1111111111111111111111111111111111111111111111111111111 0640 1111111111111111111111111111111111111111111111111111111 0641 1111111111111111111111111111111111111111111111111111111 0642 1111111111111111111111111111111111111111111111111111111 0643 1111111111111111111111111111111111111111111111111111111 0644 1111111111111111111111111111111111111111111111111111111 0645 1111111111111111111111111111111111111111111111111111111 0646 1111111111111111111111111111111111111111111111111111111 0647 1111111111111111111111111111111111111111111111111111111 0648 1111111111111111111111111111111111111111111111111111111 0649 1111111111111111111111111111111111111111111111111111111 0650 1111111111111111111111111111111111111111111111111111111 0651 1111111111111111111111111111111111111111111111111111111 0652 1111111111111111111111111111111111111111111111111111111 0653 1111111111111111111111111111111111111111111111111111111 0654 1111111111111111111111111111111111111111111111111111111 0655 1111111111111111111111111111111111111111111111111111111 0656 1111111111111111111111111111111111111111111111111111111 0657 1111111111111111111111111111111111111111111111111111111 0658 1111111111111111111111111111111111111111111111111111111 0659 1111111111111111111111111111111111111111111111111111111 0660 1111111111111111111111111111111111111111111111111111111 0661 1111111111111111111111111111111111111111111111111111111 0662 1111111111111111111111111111111111111111111111111111111 0663 1111111111111111111111111111111111111111111111111111111 0664 1111111111111111111111111111111111111111111111111111111 0665 1111111111111111111111111111111111111111111111111111111 0666 1111111111111111111111111111111111111111111111111111111 0667 1111111111111111111111111111111111111111111111111111111 0668 1111111111111111111111111111111111111111111111111111111 0669 1111111111111111111111111111111111111111111111111111111 0670 1111111111111111111111111111111111111111111111111111111 0671 1111111111111111111111111111111111111111111111111111111 0672 1111111111111111111111111111111111111111111111111111111 0673 1111111111111111111111111111111111111111111111111111111 0674 1111111111111111111111111111111111111111111111111111111 0675 1111111111111111111111111111111111111111111111111111111 0676 1111111111111111111111111111111111111111111111111111111 0677 1111111111111111111111111111111111111111111111111111111 0678 1111111111111111111111111111111111111111111111111111111 0679 1111111111111111111111111111111111111111111111111111111 0680 1111111111111111111111111111111111111111111111111111111 0681 1111111111111111111111111111111111111111111111111111111 0682 1111111111111111111111111111111111111111111111111111111 0683 1111111111111111111111111111111111111111111111111111111 0684 1111111111111111111111111111111111111111111111111111111 0685 1111111111111111111111111111111111111111111111111111111 0686 1111111111111111111111111111111111111111111111111111111 0687 1111111111111111111111111111111111111111111111111111111 0688 1111111111111111111111111111111111111111111111111111111 0689 1111111111111111111111111111111111111111111111111111111 0690 1111111111111111111111111111111111111111111111111111111 0691 1111111111111111111111111111111111111111111111111111111 0692 1111111111111111111111111111111111111111111111111111111 0693 1111111111111111111111111111111111111111111111111111111 0694 1111111111111111111111111111111111111111111111111111111 0695 1111111111111111111111111111111111111111111111111111111 0696 1111111111111111111111111111111111111111111111111111111 0697 1111111111111111111111111111111111111111111111111111111 0698 1111111111111111111111111111111111111111111111111111111 0699 1111111111111111111111111111111111111111111111111111111 0700 1111111111111111111111111111111111111111111111111111111 0701 1111111111111111111111111111111111111111111111111111111 0702 1111111111111111111111111111111111111111111111111111111 0703 1111111111111111111111111111111111111111111111111111111 0704 1111111111111111111111111111111111111111111111111111111 0705 1111111111111111111111111111111111111111111111111111111 0706 1111111111111111111111111111111111111111111111111111111 0707 1111111111111111111111111111111111111111111111111111111 0708 1111111111111111111111111111111111111111111111111111111 0709 1111111111111111111111111111111111111111111111111111111 0710 1111111111111111111111111111111111111111111111111111111 0711 1111111111111111111111111111111111111111111111111111111 0712 1111111111111111111111111111111111111111111111111111111 0713 1111111111111111111111111111111111111111111111111111111 0714 1111111111111111111111111111111111111111111111111111111 0715 1111111111111111111111111111111111111111111111111111111 0716 1111111111111111111111111111111111111111111111111111111 0717 1111111111111111111111111111111111111111111111111111111 0718 1111111111111111111111111111111111111111111111111111111 0719 1111111111111111111111111111111111111111111111111111111 0720 1111111111111111111111111111111111111111111111111111111 0721 1111111111111111111111111111111111111111111111111111111 0722 1111111111111111111111111111111111111111111111111111111 0723 1111111111111111111111111111111111111111111111111111111 0724 1111111111111111111111111111111111111111111111111111111 0725 1111111111111111111111111111111111111111111111111111111 0726 1111111111111111111111111111111111111111111111111111111 0727 1111111111111111111111111111111111111111111111111111111 0728 1111111111111111111111111111111111111111111111111111111 0729 1111111111111111111111111111111111111111111111111111111 0730 1111111111111111111111111111111111111111111111111111111 0731 1111111111111111111111111111111111111111111111111111111 0732 1111111111111111111111111111111111111111111111111111111 0733 1111111111111111111111111111111111111111111111111111111 0734 1111111111111111111111111111111111111111111111111111111 0735 1111111111111111111111111111111111111111111111111111111 0736 1111111111111111111111111111111111111111111111111111111 0737 1111111111111111111111111111111111111111111111111111111 0738 1111111111111111111111111111111111111111111111111111111 0739 1111111111111111111111111111111111111111111111111111111 0740 1111111111111111111111111111111111111111111111111111111 0741 1111111111111111111111111111111111111111111111111111111 0742 1111111111111111111111111111111111111111111111111111111 0743 1111111111111111111111111111111111111111111111111111111 0744 1111111111111111111111111111111111111111111111111111111 0745 1111111111111111111111111111111111111111111111111111111 0746 1111111111111111111111111111111111111111111111111111111 0747 1111111111111111111111111111111111111111111111111111111 0748 1111111111111111111111111111111111111111111111111111111 0749 1111111111111111111111111111111111111111111111111111111 0750 1111111111111111111111111111111111111111111111111111111 0751 1111111111111111111111111111111111111111111111111111111 0752 1111111111111111111111111111111111111111111111111111111 0753 1111111111111111111111111111111111111111111111111111111 0754 1111111111111111111111111111111111111111111111111111111 0755 1111111111111111111111111111111111111111111111111111111 0756 1111111111111111111111111111111111111111111111111111111 0757 1111111111111111111111111111111111111111111111111111111 0758 1111111111111111111111111111111111111111111111111111111 0759 1111111111111111111111111111111111111111111111111111111 0760 1111111111111111111111111111111111111111111111111111111 0761 1111111111111111111111111111111111111111111111111111111 0762 1111111111111111111111111111111111111111111111111111111 0763 1111111111111111111111111111111111111111111111111111111 0764 1111111111111111111111111111111111111111111111111111111 0765 1111111111111111111111111111111111111111111111111111111 0766 1111111111111111111111111111111111111111111111111111111 0767 1111111111111111111111111111111111111111111111111111111 0768 1111111111111111111111111111111111111111111111111111111 0769 1111111111111111111111111111111111111111111111111111111 0770 1111111111111111111111111111111111111111111111111111111 0771 1111111111111111111111111111111111111111111111111111111 0772 1111111111111111111111111111111111111111111111111111111 0773 1111111111111111111111111111111111111111111111111111111 0774 1111111111111111111111111111111111111111111111111111111 0775 1111111111111111111111111111111111111111111111111111111 0776 1111111111111111111111111111111111111111111111111111111 0777 1111111111111111111111111111111111111111111111111111111 0778 1111111111111111111111111111111111111111111111111111111 0779 1111111111111111111111111111111111111111111111111111111 0780 1111111111111111111111111111111111111111111111111111111 0781 1111111111111111111111111111111111111111111111111111111 0782 1111111111111111111111111111111111111111111111111111111 0783 1111111111111111111111111111111111111111111111111111111 0784 1111111111111111111111111111111111111111111111111111111 0785 1111111111111111111111111111111111111111111111111111111 0786 1111111111111111111111111111111111111111111111111111111 0787 1111111111111111111111111111111111111111111111111111111 0788 1111111111111111111111111111111111111111111111111111111 0789 1111111111111111111111111111111111111111111111111111111 0790 1111111111111111111111111111111111111111111111111111111 0791 1111111111111111111111111111111111111111111111111111111 0792 1111111111111111111111111111111111111111111111111111111 0793 1111111111111111111111111111111111111111111111111111111 0794 1111111111111111111111111111111111111111111111111111111 0795 1111111111111111111111111111111111111111111111111111111 0796 1111111111111111111111111111111111111111111111111111111 0797 1111111111111111111111111111111111111111111111111111111 0798 1111111111111111111111111111111111111111111111111111111 0799 1111111111111111111111111111111111111111111111111111111 0800 1111111111111111111111111111111111111111111111111111111 0801 1111111111111111111111111111111111111111111111111111111 0802 1111111111111111111111111111111111111111111111111111111 0803 1111111111111111111111111111111111111111111111111111111 0804 1111111111111111111111111111111111111111111111111111111 0805 1111111111111111111111111111111111111111111111111111111 0806 1111111111111111111111111111111111111111111111111111111 0807 1111111111111111111111111111111111111111111111111111111 0808 1111111111111111111111111111111111111111111111111111111 0809 1111111111111111111111111111111111111111111111111111111 0810 1111111111111111111111111111111111111111111111111111111 0811 1111111111111111111111111111111111111111111111111111111 0812 1111111111111111111111111111111111111111111111111111111 0813 1111111111111111111111111111111111111111111111111111111 0814 1111111111111111111111111111111111111111111111111111111 0815 1111111111111111111111111111111111111111111111111111111 0816 1111111111111111111111111111111111111111111111111111111 0817 1111111111111111111111111111111111111111111111111111111 0818 1111111111111111111111111111111111111111111111111111111 0819 1111111111111111111111111111111111111111111111111111111 0820 1111111111111111111111111111111111111111111111111111111 0821 1111111111111111111111111111111111111111111111111111111 0822 1111111111111111111111111111111111111111111111111111111 0823 1111111111111111111111111111111111111111111111111111111 0824 1111111111111111111111111111111111111111111111111111111 0825 1111111111111111111111111111111111111111111111111111111 0826 1111111111111111111111111111111111111111111111111111111 0827 1111111111111111111111111111111111111111111111111111111 0828 1111111111111111111111111111111111111111111111111111111 0829 1111111111111111111111111111111111111111111111111111111 0830 1111111111111111111111111111111111111111111111111111111 0831 1111111111111111111111111111111111111111111111111111111 0832 1111111111111111111111111111111111111111111111111111111 0833 1111111111111111111111111111111111111111111111111111111 0834 1111111111111111111111111111111111111111111111111111111 0835 1111111111111111111111111111111111111111111111111111111 0836 1111111111111111111111111111111111111111111111111111111 0837 1111111111111111111111111111111111111111111111111111111 0838 1111111111111111111111111111111111111111111111111111111 0839 1111111111111111111111111111111111111111111111111111111 0840 1111111111111111111111111111111111111111111111111111111 0841 1111111111111111111111111111111111111111111111111111111 0842 1111111111111111111111111111111111111111111111111111111 0843 1111111111111111111111111111111111111111111111111111111 0844 1111111111111111111111111111111111111111111111111111111 0845 1111111111111111111111111111111111111111111111111111111 0846 1111111111111111111111111111111111111111111111111111111 0847 1111111111111111111111111111111111111111111111111111111 0848 1111111111111111111111111111111111111111111111111111111 0849 1111111111111111111111111111111111111111111111111111111 0850 1111111111111111111111111111111111111111111111111111111 0851 1111111111111111111111111111111111111111111111111111111 0852 1111111111111111111111111111111111111111111111111111111 0853 1111111111111111111111111111111111111111111111111111111 0854 1111111111111111111111111111111111111111111111111111111 0855 1111111111111111111111111111111111111111111111111111111 0856 1111111111111111111111111111111111111111111111111111111 0857 1111111111111111111111111111111111111111111111111111111 0858 1111111111111111111111111111111111111111111111111111111 0859 1111111111111111111111111111111111111111111111111111111 0860 1111111111111111111111111111111111111111111111111111111 0861 1111111111111111111111111111111111111111111111111111111 0862 1111111111111111111111111111111111111111111111111111111 0863 1111111111111111111111111111111111111111111111111111111 0864 1111111111111111111111111111111111111111111111111111111 0865 1111111111111111111111111111111111111111111111111111111 0866 1111111111111111111111111111111111111111111111111111111 0867 1111111111111111111111111111111111111111111111111111111 0868 1111111111111111111111111111111111111111111111111111111 0869 1111111111111111111111111111111111111111111111111111111 0870 1111111111111111111111111111111111111111111111111111111 0871 1111111111111111111111111111111111111111111111111111111 0872 1111111111111111111111111111111111111111111111111111111 0873 1111111111111111111111111111111111111111111111111111111 0874 1111111111111111111111111111111111111111111111111111111 0875 1111111111111111111111111111111111111111111111111111111 0876 1111111111111111111111111111111111111111111111111111111 0877 1111111111111111111111111111111111111111111111111111111 0878 1111111111111111111111111111111111111111111111111111111 0879 1111111111111111111111111111111111111111111111111111111 0880 1111111111111111111111111111111111111111111111111111111 0881 1111111111111111111111111111111111111111111111111111111 0882 1111111111111111111111111111111111111111111111111111111 0883 1111111111111111111111111111111111111111111111111111111 0884 1111111111111111111111111111111111111111111111111111111 0885 1111111111111111111111111111111111111111111111111111111 0886 1111111111111111111111111111111111111111111111111111111 0887 1111111111111111111111111111111111111111111111111111111 0888 1111111111111111111111111111111111111111111111111111111 0889 1111111111111111111111111111111111111111111111111111111 0890 1111111111111111111111111111111111111111111111111111111 0891 1111111111111111111111111111111111111111111111111111111 0892 1111111111111111111111111111111111111111111111111111111 0893 1111111111111111111111111111111111111111111111111111111 0894 1111111111111111111111111111111111111111111111111111111 0895 1111111111111111111111111111111111111111111111111111111 0896 1111111111111111111111111111111111111111111111111111111 0897 1111111111111111111111111111111111111111111111111111111 0898 1111111111111111111111111111111111111111111111111111111 0899 1111111111111111111111111111111111111111111111111111111 0900 1111111111111111111111111111111111111111111111111111111 0901 1111111111111111111111111111111111111111111111111111111 0902 1111111111111111111111111111111111111111111111111111111 0903 1111111111111111111111111111111111111111111111111111111 0904 1111111111111111111111111111111111111111111111111111111 0905 1111111111111111111111111111111111111111111111111111111 0906 1111111111111111111111111111111111111111111111111111111 0907 1111111111111111111111111111111111111111111111111111111 0908 1111111111111111111111111111111111111111111111111111111 0909 1111111111111111111111111111111111111111111111111111111 0910 1111111111111111111111111111111111111111111111111111111 0911 1111111111111111111111111111111111111111111111111111111 0912 1111111111111111111111111111111111111111111111111111111 0913 1111111111111111111111111111111111111111111111111111111 0914 1111111111111111111111111111111111111111111111111111111 0915 1111111111111111111111111111111111111111111111111111111 0916 1111111111111111111111111111111111111111111111111111111 0917 1111111111111111111111111111111111111111111111111111111 0918 1111111111111111111111111111111111111111111111111111111 0919 1111111111111111111111111111111111111111111111111111111 0920 1111111111111111111111111111111111111111111111111111111 0921 1111111111111111111111111111111111111111111111111111111 0922 1111111111111111111111111111111111111111111111111111111 0923 1111111111111111111111111111111111111111111111111111111 0924 1111111111111111111111111111111111111111111111111111111 0925 1111111111111111111111111111111111111111111111111111111 0926 1111111111111111111111111111111111111111111111111111111 0927 1111111111111111111111111111111111111111111111111111111 0928 1111111111111111111111111111111111111111111111111111111 0929 1111111111111111111111111111111111111111111111111111111 0930 1111111111111111111111111111111111111111111111111111111 0931 1111111111111111111111111111111111111111111111111111111 0932 1111111111111111111111111111111111111111111111111111111 0933 1111111111111111111111111111111111111111111111111111111 0934 1111111111111111111111111111111111111111111111111111111 0935 1111111111111111111111111111111111111111111111111111111 0936 1111111111111111111111111111111111111111111111111111111 0937 1111111111111111111111111111111111111111111111111111111 0938 1111111111111111111111111111111111111111111111111111111 0939 1111111111111111111111111111111111111111111111111111111 0940 1111111111111111111111111111111111111111111111111111111 0941 1111111111111111111111111111111111111111111111111111111 0942 1111111111111111111111111111111111111111111111111111111 0943 1111111111111111111111111111111111111111111111111111111 0944 1111111111111111111111111111111111111111111111111111111 0945 1111111111111111111111111111111111111111111111111111111 0946 1111111111111111111111111111111111111111111111111111111 0947 1111111111111111111111111111111111111111111111111111111 0948 1111111111111111111111111111111111111111111111111111111 0949 1111111111111111111111111111111111111111111111111111111 0950 1111111111111111111111111111111111111111111111111111111 0951 1111111111111111111111111111111111111111111111111111111 0952 1111111111111111111111111111111111111111111111111111111 0953 1111111111111111111111111111111111111111111111111111111 0954 1111111111111111111111111111111111111111111111111111111 0955 1111111111111111111111111111111111111111111111111111111 0956 1111111111111111111111111111111111111111111111111111111 0957 1111111111111111111111111111111111111111111111111111111 0958 1111111111111111111111111111111111111111111111111111111 0959 1111111111111111111111111111111111111111111111111111111 0960 1111111111111111111111111111111111111111111111111111111 0961 1111111111111111111111111111111111111111111111111111111 0962 1111111111111111111111111111111111111111111111111111111 0963 1111111111111111111111111111111111111111111111111111111 0964 1111111111111111111111111111111111111111111111111111111 0965 1111111111111111111111111111111111111111111111111111111 0966 1111111111111111111111111111111111111111111111111111111 0967 1111111111111111111111111111111111111111111111111111111 0968 1111111111111111111111111111111111111111111111111111111 0969 1111111111111111111111111111111111111111111111111111111 0970 1111111111111111111111111111111111111111111111111111111 0971 1111111111111111111111111111111111111111111111111111111 0972 1111111111111111111111111111111111111111111111111111111 0973 1111111111111111111111111111111111111111111111111111111 0974 1111111111111111111111111111111111111111111111111111111 0975 1111111111111111111111111111111111111111111111111111111 0976 1111111111111111111111111111111111111111111111111111111 0977 1111111111111111111111111111111111111111111111111111111 0978 1111111111111111111111111111111111111111111111111111111 0979 1111111111111111111111111111111111111111111111111111111 0980 1111111111111111111111111111111111111111111111111111111 0981 1111111111111111111111111111111111111111111111111111111 0982 1111111111111111111111111111111111111111111111111111111 0983 1111111111111111111111111111111111111111111111111111111 0984 1111111111111111111111111111111111111111111111111111111 0985 1111111111111111111111111111111111111111111111111111111 0986 1111111111111111111111111111111111111111111111111111111 0987 1111111111111111111111111111111111111111111111111111111 0988 1111111111111111111111111111111111111111111111111111111 0989 1111111111111111111111111111111111111111111111111111111 0990 1111111111111111111111111111111111111111111111111111111 0991 1111111111111111111111111111111111111111111111111111111 0992 1111111111111111111111111111111111111111111111111111111 0993 1111111111111111111111111111111111111111111111111111111 0994 1111111111111111111111111111111111111111111111111111111 0995 1111111111111111111111111111111111111111111111111111111 0996 1111111111111111111111111111111111111111111111111111111 0997 1111111111111111111111111111111111111111111111111111111 0998 1111111111111111111111111111111111111111111111111111111 0999 1111111111111111111111111111111111111111111111111111111 jetty-6.1.26/examples/test-webapp/src/main/webapp/data.txt.gz0000644000175000017500000006213310342241254022604 0ustar moonmoon‹??oB¥Ø9¡m9AP|OêMÍŸØ 7Ê//­øûûûû¿í¿ï{ä|årN9—œ[Î#ç'ç…ó‘ÂŽv¤°#…)ìHaG ;RؑŽv¥°+…])ìJaW »Rؕ®v¥°+……RXHa!……RXHa!……RXJa)…¥–RXJa)…¥–RXJa)…•VRXIa%…•VRXIa%…•VRXKa-…µÖRXKa-…µÖRXKa-…6RØHa#…6RØHa#…6Rؓžö¤°'…=)ìIaO {Rؓž¶RØJa+…­¶RØJa+…­¶RØBaGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?búOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú ¦þÀô¿óï…}çß ûοö/ì;ÿ^Øwþ½°ïü{aßù÷¾³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úß ;búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_0ýû¦ÿ/ì;ÿ^Øwþ½°ïü{aßù÷¾óï…}çß ûοö¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎPØÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þ‚éǘþwþ½°ïü{aßù÷¾óï…}çß ûοö/ì;ÿ^Øw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;CaGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?búOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú ¦Ÿ`úßù÷¾óï…}çß ûοö/ì;ÿ^Øwþ½°ïü{aßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï …1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé/˜~ýéçß ûοö/ì;ÿ^Øwþ½°ïü{aßù÷¾óï…}g) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿3vÄô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿`úý¦ÿ/ì;ÿ^Øwþ½°ïü{aßù÷¾óï…}çß ûοö¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎPØÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þ‚éϘþwþ½°ïü{aßù÷¾óï…}çß ûοö/ì;ÿ^Øw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;CaGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?búOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú ¦ÿþÀô¿óï…}çß ûοö/ì;ÿ^Øwþ½°ïü{aßù÷¾³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úß ;búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_0ýýÓÿοö/ì;ÿ^Øwþ½°ïü{aßù÷¾óï…}çß ûÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég(ìˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[LÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÁôÿyÝ8ÐN jetty-6.1.26/examples/test-webapp/src/main/webapp/cgi-bin/0000755000175000017500000000000011745736500022031 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/webapp/cgi-bin/hello.sh0000755000175000017500000000011210501267237023460 0ustar moonmoon#!/bin/sh echo "Content-Type: text/html" echo echo "

    Hello World

    " jetty-6.1.26/examples/test-webapp/src/main/webapp/index.html0000644000175000017500000000350411065421731022510 0ustar moonmoon Powered By Jetty

    Welcome to Jetty 6

    This is the Test webapp for the Jetty 6 HTTP Server and Servlet Container. For more information about Jetty, please visit our website or wiki. Commercial support for Jetty is available via webtide.

    This is a test context that serves:

    Other demonstration contexts, some of which may need manual deployment (check the README.txt file for details):

    This webapp is deployed in $JETTY_HOME/webapp/test and configured by $JETTY_HOME/contexts/test.xml jetty-6.1.26/examples/test-webapp/src/main/webapp/js/0000755000175000017500000000000011745736500021135 5ustar moonmoonjetty-6.1.26/examples/test-webapp/src/main/webapp/js/behaviour.js0000644000175000017500000001733010472631505023456 0ustar moonmoon/* Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work of Simon Willison (see comments by Simon below). Description: Uses css selectors to apply javascript behaviours to enable unobtrusive javascript in html documents. Usage: var myrules = { 'b.someclass' : function(element){ element.onclick = function(){ alert(this.innerHTML); } }, '#someid u' : function(element){ element.onmouseover = function(){ this.innerHTML = "BLAH!"; } } }; Behaviour.register(myrules); // Call Behaviour.apply() to re-apply the rules (if you // update the dom, etc). License: This file is entirely BSD licensed. More information: http://ripcord.co.nz/behaviour/ */ var Behaviour = { list : new Array, register : function(sheet){ Behaviour.list.push(sheet); }, start : function(){ Behaviour.addLoadEvent(function(){ Behaviour.apply(); }); }, apply : function(){ for (h=0;sheet=Behaviour.list[h];h++){ for (selector in sheet){ list = document.getElementsBySelector(selector); if (!list){ continue; } for (i=0;element=list[i];i++){ sheet[selector](element); } } } }, addLoadEvent : function(func){ var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { oldonload(); func(); } } } } Behaviour.start(); /* The following code is Copyright (C) Simon Willison 2004. document.getElementsBySelector(selector) - returns an array of element objects from the current document matching the CSS selector. Selectors can contain element names, class names and ids and can be nested. For example: elements = document.getElementsBySelect('div#main p a.external') Will return an array of all 'a' elements with 'external' in their class attribute that are contained inside 'p' elements that are contained inside the 'div' element which has id="main" New in version 0.4: Support for CSS2 and CSS3 attribute selectors: See http://www.w3.org/TR/css3-selectors/#attribute-selectors Version 0.4 - Simon Willison, March 25th 2003 -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows -- Opera 7 fails */ function getAllChildren(e) { // Returns all children of element. Workaround required for IE5/Windows. Ugh. return e.all ? e.all : e.getElementsByTagName('*'); } document.getElementsBySelector = function(selector) { // Attempt to fail gracefully in lesser browsers if (!document.getElementsByTagName) { return new Array(); } // Split selector in to tokens var tokens = selector.split(' '); var currentContext = new Array(document); for (var i = 0; i < tokens.length; i++) { token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');; if (token.indexOf('#') > -1) { // Token is an ID selector var bits = token.split('#'); var tagName = bits[0]; var id = bits[1]; var element = document.getElementById(id); if (tagName && element.nodeName.toLowerCase() != tagName) { // tag with that ID not found, return false return new Array(); } // Set currentContext to contain just this element currentContext = new Array(element); continue; // Skip to next token } if (token.indexOf('.') > -1) { // Token contains a class selector var bits = token.split('.'); var tagName = bits[0]; var className = bits[1]; if (!tagName) { tagName = '*'; } // Get elements matching tag, filter them for class selector var found = new Array; var foundCount = 0; for (var h = 0; h < currentContext.length; h++) { var elements; if (tagName == '*') { elements = getAllChildren(currentContext[h]); } else { elements = currentContext[h].getElementsByTagName(tagName); } for (var j = 0; j < elements.length; j++) { found[foundCount++] = elements[j]; } } currentContext = new Array; var currentContextIndex = 0; for (var k = 0; k < found.length; k++) { if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) { currentContext[currentContextIndex++] = found[k]; } } continue; // Skip to next token } // Code to deal with attribute selectors if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) { var tagName = RegExp.$1; var attrName = RegExp.$2; var attrOperator = RegExp.$3; var attrValue = RegExp.$4; if (!tagName) { tagName = '*'; } // Grab all of the tagName elements within current context var found = new Array; var foundCount = 0; for (var h = 0; h < currentContext.length; h++) { var elements; if (tagName == '*') { elements = getAllChildren(currentContext[h]); } else { elements = currentContext[h].getElementsByTagName(tagName); } for (var j = 0; j < elements.length; j++) { found[foundCount++] = elements[j]; } } currentContext = new Array; var currentContextIndex = 0; var checkFunction; // This function will be used to filter the elements switch (attrOperator) { case '=': // Equality checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); }; break; case '~': // Match one of space seperated words checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); }; break; case '|': // Match start with value followed by optional hyphen checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); }; break; case '^': // Match starts with value checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); }; break; case '$': // Match ends with value - fails with "Warning" in Opera 7 checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); }; break; case '*': // Match ends with value checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); }; break; default : // Just test for existence of attribute checkFunction = function(e) { return e.getAttribute(attrName); }; } currentContext = new Array; var currentContextIndex = 0; for (var k = 0; k < found.length; k++) { if (checkFunction(found[k])) { currentContext[currentContextIndex++] = found[k]; } } // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue); continue; // Skip to next token } if (!currentContext[0]){ return; } // If we get here, token is JUST an element (not a class or ID selector) tagName = token; var found = new Array; var foundCount = 0; for (var h = 0; h < currentContext.length; h++) { var elements = currentContext[h].getElementsByTagName(tagName); for (var j = 0; j < elements.length; j++) { found[foundCount++] = elements[j]; } } currentContext = found; } return currentContext; } /* That revolting regular expression explained /^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/ \---/ \---/\-------------/ \-------/ | | | | | | | The value | | ~,|,^,$,* or = | Attribute Tag */ jetty-6.1.26/examples/test-webapp/src/main/webapp/js/ajax.js0000644000175000017500000001272310656205363022421 0ustar moonmoon // AJAX handler var ajax = { poll: true, _first: true, _pollEvent: function(first) {}, _handlers: new Array(), _messages:0, _messageQueue: '', _queueMessages: false, _xhr: function(method,uri,body,handler) { var req=null; if (window.XMLHttpRequest) { // Non-IE browsers req = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE req = new ActiveXObject("Microsoft.XMLHTTP"); } req.onreadystatechange=function() { if (req.readyState==4) { try { handler(req); } catch(e) { window.status="ERROR: xhr "+e.name + ": " + e.message; // alert(e.name+" "+e.message); } } } if (body!=null) { req.open(method,uri,true); req.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); req.send(body); } else { req.open(method,uri,true); req.send(null); } }, _messageHandler: function(request) { var qm=ajax._queueMessages; ajax._queueMessages=true; try { if (request.status == 200) { var response = request.responseXML.getElementsByTagName("ajax-response"); if (response != null && response.length == 1) { var responses = response[0].getElementsByTagName("response"); for ( var i = 0 ; i < responses.length ; i++ ) { var responseElement = responses[i]; // only process nodes of type element..... if ( responseElement.nodeType != 1 ) continue; var id = responseElement.getAttribute('id'); var handler = ajax._handlers[id]; if (handler!=null) { for (var j = 0; j < responseElement.childNodes.length; j++) { var child = responseElement.childNodes[j] if (child.nodeType == 1) { handler(child); } } } } } } } catch(e) { window.status="ERROR: _messageHandler "+e.name + ": " + e.message; // alert(e.name + ": " + e.message); } ajax._queueMessages=qm; if (!ajax._queueMessages && ajax._messages>0) { var body = ajax._messageQueue; ajax._messageQueue=''; ajax._messages=0; ajax._xhr('POST','.',body,ajax._pollHandler); } }, _pollHandler: function(request) { if (request.status != 200) return; ajax._queueMessages=true; try { ajax._messageHandler(request); ajax._pollEvent(ajax._first); ajax._first=false; } catch(e) { window.status="ERROR: pollHandler "+e.name + ": " + e.message; // alert(e.name + ": " + e.message); } ajax._queueMessages=false; if (ajax._messages==0) { if (ajax.poll) ajax._xhr('POST','.?ajax=poll&message=poll',null,ajax._pollHandler); } else { var body = ajax._messageQueue+'&ajax=poll&message=poll'; ajax._messageQueue=''; ajax._messages=0; ajax._xhr('POST','.',body,ajax._pollHandler); } }, addPollHandler : function(func) { var old = ajax._pollEvent; ajax._pollEvent = function(first) { old(first); func(first); } }, // Listen on a channel or topic. handler must be a function taking a message arguement addListener : function(id,handler) { ajax._handlers[id]=handler; }, // remove Listener from channel or topic. removeListener : function(id) { ajax._handlers[id]=null; }, sendMessage : function(destination,message) { message=message.replace('%','%25'); message=message.replace('&','%26'); message=message.replace('=','%3D'); if (ajax._queueMessages) { ajax._messageQueue+=(ajax._messages==0?'ajax=':'&ajax=')+destination+'&message='+message; ajax._messages++; } else { ajax._xhr('POST','.','ajax='+destination+'&message='+message,ajax._messageHandler); } }, _startPolling : function() { if (ajax.poll) ajax._xhr('POST','.?ajax=poll&message=poll&timeout=0',null,ajax._pollHandler); }, getContentAsString: function( parentNode ) { return parentNode.xml != undefined ? ajax._getContentAsStringIE(parentNode) : ajax._getContentAsStringMozilla(parentNode); }, _getContentAsStringIE: function(parentNode) { var contentStr = ""; for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) { var n = parentNode.childNodes[i]; if (n.nodeType == 4) { contentStr += n.nodeValue; } else { contentStr += n.xml; } } return contentStr; }, _getContentAsStringMozilla: function(parentNode) { var xmlSerializer = new XMLSerializer(); var contentStr = ""; for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) { var n = parentNode.childNodes[i]; if (n.nodeType == 4) { // CDATA node contentStr += n.nodeValue; } else { contentStr += xmlSerializer.serializeToString(n); } } return contentStr; } }; var EvUtil = { getKeyCode : function(ev) { var keyc; if (window.event) keyc=window.event.keyCode; else keyc=ev.keyCode; return keyc; } }; Behaviour.addLoadEvent(ajax._startPolling); jetty-6.1.26/examples/test-webapp/src/main/webapp/js/index.htm0000644000175000017500000000005011173372264022747 0ustar moonmoon

    Test authenticated welcome file

    jetty-6.1.26/examples/test-webapp/jetty-chat.jmx0000644000175000017500000004677510540052016020330 0ustar moonmoon false false 1165945030000 400 false 1 false 1165945030000 continue 10 = 50 rooms = /test/chat/ localhost http 8080 true GET true true = poll true ajax false = poll true message false = 0 true timeout false = ${__javaScript(${__threadNum}%${rooms},room)} true room false false false POST true false = join true ajax false = Elvis${__threadNum} true message false = ${__javaScript(${__threadNum}%${rooms},room)} true room false false false -1 true ${__Random(3,20,random)} true GET true true = poll true ajax false = poll true message false = ${__Random(3000,10000,poll)} true timeout false = ${__javaScript(${__threadNum}%${rooms},room)} true room false false false POST true false = chat true ajax false = Give me ${__Random(1,200,mars)} deep fried mars bars true message false = ${__javaScript(${__threadNum}%${rooms},room)} true room false false false POST true false = leave true ajax false = Elvis${__threadNum} true message false = ${__javaScript(${__threadNum}%${rooms},room)} true room false false false true true true true true true true false true true false false false false false false false false 0 saveConfig false jetty-6.1.26/examples/test-webapp/pom.xml0000644000175000017500000001352011466510412017036 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-test war Jetty Test Webapp maven-antrun-plugin clean clean run install run org.apache.maven.plugins maven-surefire-plugin test test **/WebAppTest.java org.mortbay.jetty maven-jetty-plugin ${project.version} 8087 foo 1 fooprop 222 / ${project.build.directory}/work ${basedir}/target/sessions Test Realm ../../etc/realm.properties org.mortbay.jetty jetty-client ${project.version} org.mortbay.jetty servlet-api ${servlet-version} provided javax.servlet.jsp jsp-api 2.1 provided junit junit test org.mortbay.jetty jetty-servlet-tester ${project.version} test org.mortbay.jetty jetty ${project.version} test jetty-6.1.26/examples/test-jndi-webapp/0000755000175000017500000000000011745736500016452 5ustar moonmoonjetty-6.1.26/examples/test-jndi-webapp/src/0000755000175000017500000000000011745736500017241 5ustar moonmoonjetty-6.1.26/examples/test-jndi-webapp/src/main/0000755000175000017500000000000011745736500020165 5ustar moonmoonjetty-6.1.26/examples/test-jndi-webapp/src/main/java/0000755000175000017500000000000011745736500021106 5ustar moonmoonjetty-6.1.26/examples/test-jndi-webapp/src/main/java/com/0000755000175000017500000000000011745736500021664 5ustar moonmoonjetty-6.1.26/examples/test-jndi-webapp/src/main/java/com/acme/0000755000175000017500000000000011745736500022571 5ustar moonmoonjetty-6.1.26/examples/test-jndi-webapp/src/main/java/com/acme/JNDITest.java0000644000175000017500000002511611065421731025015 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== /** * */ package com.acme; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.naming.InitialContext; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; import javax.sql.XADataSource; import javax.transaction.UserTransaction; /** * JNDITest * * Use JNDI from within Jetty. * * Also, use servlet spec 2.5 resource injection and lifecycle callbacks from within the web.xml * to set up some of the JNDI resources. * */ public class JNDITest extends HttpServlet { public static final String DATE_FORMAT = "EEE, d MMM yy HH:mm:ss Z"; private static SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); private static final String TABLE1 = "mytestdata1"; private static final String TABLE2 = "mytestdata2"; private static boolean setupDone = false; private DataSource myDS; private DataSource myDS2; private DataSource myDS99; private Session myMailSession; private Double wiggle; private Integer woggle; public void setMyDatasource(DataSource ds) { myDS=ds; } public void setMyDatasource2(DataSource ds) { myDS2=ds; } public void setMyDatasource99(DataSource ds) { myDS99=ds; } private void postConstruct () { System.err.println("mydatasource="+myDS); System.err.println("mydatasource2="+myDS2); System.err.println("mydatasource99="+myDS99); System.err.println("wiggle="+wiggle); } private void preDestroy() { System.err.println("PreDestroy called"); } public void init(ServletConfig config) throws ServletException { super.init(config); String realPath = config.getServletContext().getRealPath("/"); try { InitialContext ic = new InitialContext(); woggle = (Integer)ic.lookup("java:comp/env/woggle"); System.err.println(realPath+":woggle="+woggle); UserTransaction utx = (UserTransaction)ic.lookup("java:comp/UserTransaction"); System.err.println(realPath+":utx="+utx); myMailSession = (Session)ic.lookup("java:comp/env/mail/Session"); System.err.println(realPath+":myMailSession: "+myMailSession); doSetup(); } catch (Exception e) { System.err.println(realPath+":"+e.getMessage()); throw new ServletException(e); } } /* ------------------------------------------------------------ */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /* ------------------------------------------------------------ */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean doCommit = true; String complete = request.getParameter("completion"); String mailTo = request.getParameter("mailto"); String mailFrom = request.getParameter("mailfrom"); if (complete != null) { complete = complete.trim(); if (complete.trim().equals("commit")) doCommit = true; else doCommit = false; } if (mailTo != null) mailTo = mailTo.trim(); if (mailFrom != null) mailFrom = mailFrom.trim(); try { response.setContentType("text/html"); ServletOutputStream out = response.getOutputStream(); out.println(""); out.println("

    Jetty6 JNDI & Transaction Tests

    "); out.println(""); if (complete != null) { doTransaction(out, doCommit); out.println("

    Value of foo in myDS after "+(doCommit?"commit":"rollback")+": "+getFoo(myDS)+"

    "); out.println("

    Value of foo in myDS2 after "+(doCommit?"commit":"rollback")+": "+getFoo(myDS2)+"

    "); } else if (mailTo != null && mailFrom != null) { doMail (mailTo, mailFrom); out.println("

    Sent!

    "); } out.println("Try again?"); out.println(""); out.println(""); out.flush(); } catch (Exception e) { throw new ServletException(e); } } public void doMail (String mailTo, String mailFrom) throws Exception { Message msg = new MimeMessage(myMailSession); // set the from and to address InternetAddress addressFrom = new InternetAddress(mailFrom); msg.setFrom(addressFrom); msg.addRecipient(Message.RecipientType.TO, new InternetAddress(mailTo)); msg.setSubject("Jetty Mail Test Succeeded"); msg.setContent("The test of Jetty Mail @ "+new Date()+" has been successful.", "text/plain"); msg.addHeader ("Date", dateFormat.format(new Date())); Transport.send(msg); } public void doTransaction(ServletOutputStream out, boolean doCommit) throws Exception { //check DataSource and Transactions Connection c1 = null; Connection c2 = null; Statement s1 = null; Statement s2 = null; UserTransaction utx = null; try { doSetup(); InitialContext ic = new InitialContext(); utx = (UserTransaction)ic.lookup("java:comp/UserTransaction"); utx.begin(); c1 = myDS.getConnection(); c2 = myDS2.getConnection(); s1 = c1.createStatement(); s2 = c2.createStatement(); s1.executeUpdate("update "+TABLE1+" set foo=foo + 1 where id=1"); s2.executeUpdate("update "+TABLE2+" set foo=foo + 1 where id=1"); s1.close(); s2.close(); c1.close(); c2.close(); } catch (Exception e) { e.printStackTrace(); doCommit = false; } finally { if (doCommit) utx.commit(); else utx.rollback(); } } private Integer getFoo (DataSource ds) throws Exception { Connection c = null; Statement s = null; Integer value = null; try { c = ds.getConnection(); s = c.createStatement(); String tablename = (ds.equals(myDS)?TABLE1:TABLE2); ResultSet results = s.executeQuery("select foo from "+tablename+" where id=1"); if (results.next()) value = new Integer(results.getInt(1)); results.close(); return value; } finally { if (s != null) s.close(); if (c != null) c.close(); } } private void doSetup () throws Exception { if (setupDone) return; Connection c1=null; Connection c2=null; Statement s1=null; Statement s2=null; try { c1 = myDS.getConnection(); c2 = myDS2.getConnection(); s1 = c1.createStatement(); s2 = c2.createStatement(); s1.execute("create table "+TABLE1+" ( id INTEGER, foo INTEGER )"); s1.executeUpdate("insert into "+TABLE1+" (id, foo) values (1, 1)"); c1.commit(); s2.execute("create table "+TABLE2+" ( id INTEGER, foo INTEGER )"); s2.executeUpdate("insert into "+TABLE2+" (id, foo) values (1, 1)"); c2.commit(); setupDone = true; } finally { if (s1 != null) s1.close(); if (s2 != null) s2.close(); if (c1 != null) c1.close(); if (c2 != null) c2.close(); } } private void doTearDown() throws Exception { Connection c1=null; Connection c2=null; Statement s1=null; Statement s2=null; try { c1 = myDS.getConnection(); c2 = myDS2.getConnection(); s1 = c1.createStatement(); s2 = c2.createStatement(); s1.execute("drop table "+TABLE1); c1.commit(); s2.execute("drop table "+TABLE2); c2.commit(); } catch (IllegalStateException e) { System.err.println("Caught expected IllegalStateException from Atomikos on doTearDown"); doTearDown(); } finally { if (s1 != null) s1.close(); if (s2 != null) s2.close(); if (c1 != null) c1.close(); if (c2 != null) c2.close(); } } public void destroy () { try { doTearDown(); } catch (Exception e) { throw new RuntimeException(e); } finally { super.destroy(); } } } jetty-6.1.26/examples/test-jndi-webapp/src/main/webapp/0000755000175000017500000000000011745736500021443 5ustar moonmoonjetty-6.1.26/examples/test-jndi-webapp/src/main/webapp/WEB-INF/0000755000175000017500000000000011745736500022472 5ustar moonmoonjetty-6.1.26/examples/test-jndi-webapp/src/main/webapp/WEB-INF/instruction-web.xml0000644000175000017500000000072510643364732026354 0ustar moonmoon Test JNDI WebApp instructions.html jetty-6.1.26/examples/test-jndi-webapp/src/main/webapp/WEB-INF/web.xml0000644000175000017500000000506011065421731023762 0ustar moonmoon Test JNDI WebApp JNDITest com.acme.JNDITest 1 JNDITest /test/* wiggle 99.99 java.lang.Double com.acme.JNDITest wiggle jdbc/mydatasource1 javax.sql.DataSource Container com.acme.JNDITest myDatasource jdbc/mydatasource2 javax.sql.DataSource Container com.acme.JNDITest myDatasource2 jdbc/mydatasource99 javax.sql.DataSource Container com.acme.JNDITest myDatasource99 mail/Session javax.mail.Session Container com.acme.JNDITest postConstruct com.acme.JNDITest preDestroy jetty-6.1.26/examples/test-jndi-webapp/src/main/webapp/instructions.html0000644000175000017500000000433611065421731025073 0ustar moonmoon Jetty JNDI Demo

    Instructions to run the Jetty JNDI demo

    If you are viewing this page, then you need to perform a couple of configuration tasks before the demo will be available. It is important that you follow the steps in the order given so that Jetty can hot-redeploy this demonstration webapp.

    First, make sure you read and follow the instructions in the $jetty.home/contexts/README-test-jndi.txt file.

    1. Ensure that you have installed the jars for the transaction manager of your choice in $JETTY_HOME/lib/ext. This demo has been tested with JOTM and Atomikos.
    2. Ensure that you have installed the database of your choice - this demo assumes that you will use Derby. If you wish to use a different database, then you will need to edit the $jetty.home/contexts/test-jndi.xml file and the $jetty.home/contexts/test-jndi.d/WEB-INF/jetty-env.xml files and replace the references to Derby with your chosen database.
    3. Edit >$jetty.home/contexts/test-jndi.d/WEB-INF/jetty-env.xml and uncomment the transaction manager setup of your choice. Save the file.
    4. Edit $jetty.home/contexts/test-jndi.xml and:
      • Uncomment the transaction manager setup of your choice, replacing any references to Derby if you are using a different database
      • If you want to use the mail-sending demonstration, change the smtp authentication information appropriately for your environment on the mail/Session Resource.
      • Remove the line <Set name="descriptor"><SystemProperty name="jetty.home" default="."/>/contexts/test-jndi.d/WEB-INF/instruction-web.xml</Set>.
      • Save the file

    This webapp should now be automatically hot redeployed and the demonstration will be available to you. If not, then you may need to stop and restart jetty.

    jetty-6.1.26/examples/test-jndi-webapp/src/main/webapp/index.html0000644000175000017500000000335311065421731023434 0ustar moonmoon Powered By Jetty

    Jetty and JNDI

    This example shows how to configure and lookup resources such as DataSources, a JTA transaction manager and a java.mail.Session in JNDI. The demo shows you how to perform a distributed transaction across two different databases, and how to send email.

    Preparation

    Follow the instructions in the README-test-jndi.txt file in $JETTY-HOME/contexts.

    Now you can start the demo:

      > java -jar start.jar
    

    If you want to use the Mail demonstration, you will need to edit the $JETTY-HOME/contexts/test-jndi.xml file and change the smtp authentication information and properties appropriately for your environment.

    The Datasources/Transaction Demo

    Click Commit to make a distributed update to 2 different databases, or Rollback to prevent the update from happening.

    Commit
    Rollback

    The Mail Demo

    Send a test email to: 

    From: 

    jetty-6.1.26/examples/test-jndi-webapp/src/templates/0000755000175000017500000000000011745736500021237 5ustar moonmoonjetty-6.1.26/examples/test-jndi-webapp/src/templates/filter.properties0000644000175000017500000001226511231755675024654 0ustar moonmoon ATOMIKOS-DATASOURCE1-PRE= ATOMIKOS-DATASOURCE2-PRE= ATOMIKOS-DATASOURCE1=\ \ org.apache.derby.jdbc.EmbeddedXADataSource\ \ \ \ databaseName\ testdb\ \ \ createDatabase\ create\ \ \ \ mydatasource\ \ ATOMIKOS-DATASOURCE2=\ \ org.apache.derby.jdbc.EmbeddedXADataSource\ \ \ \ databaseName\ testdb2\ \ \ createDatabase\ create\ \ \ \ mydatasource2\ ATOMIKOS-DATASOURCE99-PRE= ATOMIKOS-DATASOURCE99=\ \ org.apache.derby.jdbc.EmbeddedXADataSource\ \ \ \ databaseName\ testdb99\ \ \ createDatabase\ create\ \ \ \ mydatasource99\ ATOMIKOS-TRANSACTIONMANAGER= ATOMIKOS-USERTRANSACTION= JOTM-DATASOURCE1-PRE=\ \ \ myxadatasource\ \ \ org.apache.derby.jdbc.EmbeddedDriver\ jdbc:derby:myderbyDB1;create=true\ \ \ \ \ \ \ JOTM-DATASOURCE1=\ \ \ \ JOTM-DATASOURCE2-PRE=\ \ \ myxadatasource2\ \ \ org.apache.derby.jdbc.EmbeddedDriver\ jdbc:derby:myderbyDB2;create=true\ \ \ \ \ \ \ JOTM-DATASOURCE2=\ \ \ \ JOTM-DATASOURCE99-PRE=\ txmgr\ \ \ myxadatasource99\ \ \ org.apache.derby.jdbc.EmbeddedDriver\ jdbc:derby:myderbyDB99;create=true\ \ \ \ \ \ \ JOTM-DATASOURCE99=\ \ \ \ JOTM-TRANSACTIONMANAGER=\ \ True\ False\ \ \ \ \ \ txmgr\ \ \ \ \ javax.transaction.TransactionManager\ \ \ \ JOTM-USERTRANSACTION= jetty-6.1.26/examples/test-jndi-webapp/src/templates/jetty-env.xml0000644000175000017500000000361011065421731023676 0ustar moonmoon gargle 100 true wiggle 55.0 true jdbc/mydatasource1 jdbc/mydatasource jetty-6.1.26/examples/test-jndi-webapp/src/templates/jta.properties0000644000175000017500000001155110405565250024130 0ustar moonmoon#SAMPLE PROPERTIES FILE FOR THE TRANSACTION SERVICE #THIS FILE ILLUSTRATES THE DIFFERENT SETTINGS FOR THE TRANSACTION MANAGER #UNCOMMENT THE ASSIGNMENTS TO OVERRIDE DEFAULT VALUES; #different implementations of our JTA exists; #this property indicates which one you use. #NOTE: there is no default for this, so it MUST be specified! #value below is for TransactionsJTA # com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory # #Use the service below for TransactionsRMI # #com.atomikos.icatch.service=com.atomikos.icatch.trmi.UserTransactionServiceFactory #Set base name of file where messages are output #(also known as the 'console file'). # #com.atomikos.icatch.console_file_name = tm.out #Size limit (in bytes) for the console file; #negative means unlimited. # #com.atomikos.icatch.console_file_limit=-1 #For size-limited console files, this option #specifies a number of rotating files to #maintain. # #com.atomikos.icatch.console_file_count=1 #Set the number of log writes between checkpoints # #com.atomikos.icatch.checkpoint_interval=500 #Set output directory where console file and other files are to be put #make sure this directory exists! # com.atomikos.icatch.output_dir = @JAVA_TMP_DIR@ #Set directory of log files; make sure this directory exists! # com.atomikos.icatch.log_base_dir = @JAVA_TMP_DIR@ #Set base name of log file #this name will be used as the first part of #the system-generated log file name # #com.atomikos.icatch.log_base_name = tmlog #Set the max number of active local transactions #or -1 for unlimited. Note: this may be overridden #by your license! # #com.atomikos.icatch.max_actives = 50 #Set the max timeout (in milliseconds) for local transactions # #com.atomikos.icatch.max_timeout = 60000 #The globally unique name of this transaction manager process #override this value with a globally unique name # #com.atomikos.icatch.tm_unique_name = tm #Do we want to use parallel subtransactions? JTA's default #is NO for J2EE compatibility # #com.atomikos.icatch.serial_jta_transactions=true #If you want to do explicit resource registration then #you need to set this value to false. # #com.atomikos.icatch.automatic_resource_registration=true #Set this to WARN, INFO or DEBUG to control the granularity #of output to the console file. # #com.atomikos.icatch.console_log_level=WARN #Do you want transaction logging to be enabled or not? #If set to false, then no logging overhead will be done #at the risk of losing data after restart or crash. #Note: this setting may be overridden depending on your license! # #com.atomikos.icatch.enable_logging=true #The last part of this file contains specific TransactionsRMI settings #used for the binding of transaction stubs and the lookup of the #transaction service across a network. Uncomment to take effect. #Important: you need to choose between JRMP and IIOP settings. #TransactionsRMI with RMI-JRMP (native RMI) settings. #NOTE: you need to start the RMI registry first, with transactions_X_YZ.jar #in the classpath, or it will not work. Example:type 'rmiregistry' in a #command shell. Don't forget to have transactions_X_YZ.jar in the classpath! #Uncomment the following 3 lines to make the settings effective. #Also, replace localhost with the real IP address of your server. # #com.atomikos.icatch.rmi_export_class=UnicastRemoteObject #java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory #java.naming.provider.url=rmi://localhost:1099 #TransactionsRMI with RMI-IIOP (CORBA) settings. #Don't use this if you already uncommented the RMI-JRMP settings above! #NOTE: you need to start the COSNaming service first, with transactions_X_YZ.jar #in the classpath, or it will not work. Example: type 'tnameserv -ORBInitialPort 1050' #in a command shell. Don't forget to have transactions_X_YZ.jar in the classpath! #Uncomment the following 3 lines to make the settings effective. #Also, replace localhost with the real IP address of your server. # #com.atomikos.icatch.rmi_export_class=PortableRemoteObject #java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory #java.naming.provider.url=iiop://localhost:1050 #For TransactionsRMI: do we trust a client's transaction manager #when it tells us to forget heuristic problem transactions? #Setting this to true enables more automated administration, #but implies more trust in the client system. # #com.atomikos.icatch.trust_client_tm=false #Do we want the UserTransaction to be available remotely #in other VMs? Default is not. If you set this to #true then you must also set the JNDI initial #context factory and provider URL, and start the naming #service first. These are used #by the UserTransaction internally, to contact the #transaction service. You are still required to #make the UserTransaction available by binding #it in a JNDI environment of your own. # #com.atomikos.icatch.client_demarcation=false jetty-6.1.26/examples/test-jndi-webapp/src/templates/jetty-test-jndi.xml0000644000175000017500000001115511065421731025012 0ustar moonmoon org.mortbay.jetty.webapp.WebInfConfiguration org.mortbay.jetty.plus.webapp.EnvConfiguration org.mortbay.jetty.plus.webapp.Configuration org.mortbay.jetty.webapp.JettyWebXmlConfiguration org.mortbay.jetty.webapp.TagLibConfiguration /test-jndi /contexts/test-jndi.d false false /contexts/test-jndi.d/WEB-INF/instruction-web.xml derby.system.home com.atomikos.icatch.file /contexts/test-jndi.d/WEB-INF/classes/jta.properties woggle 4000 false wiggle 100 true mail/Session CHANGE-ME CHANGE-ME false CHANGE-ME CHANGE-ME true jetty-6.1.26/examples/test-jndi-webapp/pom.xml0000644000175000017500000000632111466510412017761 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-test-jndi war Jetty JNDI Test Webapp maven-antrun-plugin clean clean run mkconfig process-sources run install install run geronimo-spec geronimo-spec-jta provided org.mortbay.jetty jetty ${project.version} provided javax.mail mail provided jetty-6.1.26/examples/test-jndi-webapp/README.txt0000644000175000017500000000346611106765742020162 0ustar moonmoonDeploying -------------- Jetty does not ship with a native transaction manager, but can plugin a variety of solutions. This demo has been tested with both JOTM (http://jotm.objectweb.org) or Atomikos (http://www.atomikos.com). You will need to download the relevant jars for your chosen transaction manager, and install them into $JETTY-HOME/lib/ext. See the jetty wiki pages for JOTM(http://docs.codehaus.org/display/JETTY/JOTM) and Atomikos (http://docs.codehaus.org/display/JETTY/Atomikos) for more info. The example uses the Derby database, so also download the derby.jar and derbytools.jar file from the Derby site (http://db.apache.org/derby) and put them in $JETTY-HOME/lib/ext. Now edit $JETTY-HOME/contexts/test-jndi.xml and uncomment one of the transaction manager setups. Edit $JETTY-HOME/contexts/test-jndi.d/WEB-INF/jetty-env.xml and uncomment one of the transaction manager setups. Running the Demo ---------------- You run the demo like so: java -jar start.jar Adding Support for a Different Transaction Manager -------------------------------------------------- 1. Edit the filter.properties file in $JETTY-HOME/modules/examples/test-jndi-webapp/src/templates and add a new set of token and replacement strings following the pattern established for ATOMIKOS and JOTM. 2. Edit the jetty-env.xml file in $JETTY-HOME/modules/examples/test-jndi-webapp/src/templates and add configuration for new transaction manager following the pattern established for the other transaction managers. 3. Edit jetty-test-jndi.xml file in $JETTY-HOME/modules/examples/test-jndi-webapp/src/templates and add configuration for the new transaction manager following the pattern established for the other transaction managers. 4. Rebuild $JETTY-HOME/modules/examples/test-jndi-webapp (mvn clean install). jetty-6.1.26/contrib/0000755000175000017500000000000011745736535013127 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/0000755000175000017500000000000011745736514015043 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/0000755000175000017500000000000011745736513015631 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/test/0000755000175000017500000000000011745736513016610 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/test/java/0000755000175000017500000000000011745736513017531 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/test/java/org/0000755000175000017500000000000011745736513020320 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/test/java/org/mortbay/0000755000175000017500000000000011745736513021775 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736513023134 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/test/java/org/mortbay/jetty/ant/0000755000175000017500000000000011745736513023716 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/test/java/org/mortbay/jetty/ant/JettyRunTaskTest.java0000755000175000017500000000023510572403343030020 0ustar moonmoonpackage org.mortbay.jetty.ant; import junit.framework.TestCase; public class JettyRunTaskTest extends TestCase { public void testInit() { } } jetty-6.1.26/contrib/jetty-ant/src/test/resources/0000755000175000017500000000000011745736513020622 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/0000755000175000017500000000000011745736514016556 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/java/0000755000175000017500000000000011745736513017476 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/java/org/0000755000175000017500000000000011745736513020265 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/0000755000175000017500000000000011745736513021742 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736513023101 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/0000755000175000017500000000000011745736514023664 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/utils/0000755000175000017500000000000011745736513025023 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/utils/WebApplicationProxy.java0000644000175000017500000000263010572403343031617 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant.utils; import org.mortbay.jetty.handler.ContextHandlerCollection; public interface WebApplicationProxy { public Object getProxiedObject(); /** * Starts this web application context. */ public void start(); /** * Stops this web application context. */ public void stop(); /** * Creates a new Jetty web application context from this object. * * @param contexts collection of context this application should be added * to. */ public void createApplicationContext(ContextHandlerCollection contexts); }jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/utils/TaskLog.java0000644000175000017500000000300310572403343027213 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant.utils; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.tools.ant.Task; /** * Provides logging functionality for classes without access to the Ant project * variable. * * @author Jakub Pawlowicz */ public class TaskLog { private static Task task; private static SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSS"); public static void setTask(Task task) { TaskLog.task = task; } public static void log(String message) { task.log(message); } public static void logWithTimestamp(String message) { task.log(format.format(new Date()) + ": " + message); } } jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/utils/ServerProxy.java0000644000175000017500000000231310605413675030170 0ustar moonmoon//======================================================================== //Copyright 2006-2007 Sabre Holdings. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ant.utils; public interface ServerProxy { /** * Adds a new web application to this server. * * @param webApp a WebApplicationProxy object. * @param scanIntervalSeconds */ public void addWebApplication(WebApplicationProxy webApp, int scanIntervalSeconds); /** * Starts this server. */ public void start(); public Object getProxiedObject(); }jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/types/0000755000175000017500000000000011745736514025030 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/types/SystemProperties.java0000755000175000017500000000367610605413675031245 0ustar moonmoon//======================================================================== //Copyright 2006-2007 Sabre Holdings. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ant.types; import java.util.ArrayList; import java.util.List; import org.apache.tools.ant.taskdefs.Property; import org.mortbay.jetty.ant.utils.TaskLog; /** * Ant tag definition. * * @author Jakub Pawlowicz */ public class SystemProperties { private List systemProperties = new ArrayList(); public List getSystemProperties() { return systemProperties; } public void addSystemProperty(Property property) { systemProperties.add(property); } /** * Set a System.property with this value if it is not already set. * * @return */ public static boolean setIfNotSetAlready(Property property) { if (System.getProperty(property.getName()) == null) { System.setProperty(property.getName(), (property.getValue() == null ? "" : property .getValue())); TaskLog.log("Setting property '" + property.getName() + "' to value '" + property.getValue() + "'"); return true; } return false; } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/types/FileMatchingConfiguration.javajetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/types/FileMatchingConfiguration.j0000644000175000017500000000571110605413402032247 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant.types; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.tools.ant.DirectoryScanner; /** * Describes set of files matched by elements in ant configuration * file. It is used to group application classes, libraries, and scannedTargets * elements. * * @author Jakub Pawlowicz */ public class FileMatchingConfiguration { private List directoryScanners; public FileMatchingConfiguration() { this.directoryScanners = new ArrayList(); } /** * @param directoryScanner new directory scanner retrieved from the * element. */ public void addDirectoryScanner(DirectoryScanner directoryScanner) { this.directoryScanners.add(directoryScanner); } /** * @return a list of base directories denoted by a list of directory * scanners. */ public List getBaseDirectories() { List baseDirs = new ArrayList(); Iterator scanners = directoryScanners.iterator(); while (scanners.hasNext()) { DirectoryScanner scanner = (DirectoryScanner) scanners.next(); baseDirs.add(scanner.getBasedir()); } return baseDirs; } /** * Checks if passed file is scanned by any of the directory scanners. * * @param pathToFile a fully qualified path to tested file. * @return true if so, false otherwise. */ public boolean isIncluded(String pathToFile) { Iterator scanners = directoryScanners.iterator(); while (scanners.hasNext()) { DirectoryScanner scanner = (DirectoryScanner) scanners.next(); scanner.scan(); String[] includedFiles = scanner.getIncludedFiles(); for (int i = 0; i < includedFiles.length; i++) { File includedFile = new File(scanner.getBasedir(), includedFiles[i]); if (pathToFile.equalsIgnoreCase(includedFile.getAbsolutePath())) { return true; } } } return false; } } jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/types/UserRealms.java0000644000175000017500000000241610605413675027752 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant.types; import java.util.ArrayList; import java.util.List; import org.mortbay.jetty.security.UserRealm; /** * Specifies a jetty configuration element for Ant build file. * * @author Jakub Pawlowicz */ public class UserRealms { private List userRealms = new ArrayList(); public void add(UserRealm realm) { userRealms.add(realm); } public List getUserRealms() { return userRealms; } } jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/types/ContextHandlers.java0000644000175000017500000000245110605413675030774 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant.types; import java.util.ArrayList; import java.util.List; import org.mortbay.jetty.handler.ContextHandler; /** * Specifies element in web app configuration. * * @author Jakub Pawlowicz */ public class ContextHandlers { private List contextHandlers = new ArrayList(); public void add(ContextHandler handler) { contextHandlers.add(handler); } public List getContextHandlers() { return contextHandlers; } } jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/types/Connectors.java0000644000175000017500000000317510605413675030010 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant.types; import java.util.ArrayList; import java.util.List; import org.mortbay.jetty.Connector; import org.mortbay.jetty.nio.SelectChannelConnector; /** * Specifies a jetty configuration element for Ant build file. * * @author Jakub Pawlowicz */ public class Connectors { public static final List DEFAULT_CONNECTORS = new ArrayList(); static { org.mortbay.jetty.Connector defaultConnector = new SelectChannelConnector(); defaultConnector.setPort(8080); defaultConnector.setMaxIdleTime(30000); DEFAULT_CONNECTORS.add(defaultConnector); } private List connectors = new ArrayList(); public void add(Connector connector) { connectors.add(connector); } public List getConnectors() { return connectors; } } jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/types/WebApp.java0000755000175000017500000001573311051041454027043 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant.types; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.FileSet; /** * Ant's WebApp object definition. * * @author Jakub Pawlowicz */ public class WebApp { /** List of web application libraries. */ private List libraries = new ArrayList(); /** List of web application class directories. */ private List classes = new ArrayList(); /** Reference to Ant project variable. */ private Project project; /** Application context path. */ private String contextPath; /** Application name. */ private String name; /** Application war file (either exploded or not). */ private File warFile; /** Location of application web.xml file. */ private File webXmlFile; /** Location of jetty-env.xml file. */ private File jettyEnvXml; /** List of extra scan targets for this web application. */ private FileSet scanTargets; /** List of optional context handlers. */ private ContextHandlers contextHandlers; private File webDefaultXmlFile; /** * Length of interval in which application will be scanned for changes (0 * means scanner wouldn't be created). */ private int scanIntervalSeconds = 0; public WebApp(Project project) { this.project = project; } public File getWebDefaultXmlFile() { return this.webDefaultXmlFile; } public void setWebDefaultXmlFile(File webDefaultXmlfile) { this.webDefaultXmlFile = webDefaultXmlfile; } public void addLib(FileSet lib) { libraries.add(lib); } public List getLibraries() { return libraries; } public void addClasses(FileSet classes) { this.classes.add(classes); } public List getClasses() { return classes; } public File getWarFile() { return warFile; } public void setWarFile(File warFile) { this.warFile = warFile; } public String getContextPath() { return contextPath; } public void setContextPath(String contextPath) { this.contextPath = contextPath; } public String getName() { return name; } public void setName(String name) { this.name = name; } /** * @return a list of classpath files (libraries and class directories). */ public List getClassPathFiles() { List classPathFiles = new ArrayList(); Iterator classesIterator = classes.iterator(); while (classesIterator.hasNext()) { FileSet clazz = (FileSet) classesIterator.next(); classPathFiles.add(clazz.getDirectoryScanner(project).getBasedir()); } Iterator iterator = libraries.iterator(); while (iterator.hasNext()) { FileSet library = (FileSet) iterator.next(); String[] includedFiles = library.getDirectoryScanner(project).getIncludedFiles(); File baseDir = library.getDirectoryScanner(project).getBasedir(); for (int i = 0; i < includedFiles.length; i++) { classPathFiles.add(new File(baseDir, includedFiles[i])); } } return classPathFiles; } /** * @return a FileMatchingConfiguration object describing the * configuration of all libraries added to this particular web app * (both classes and libraries). */ public FileMatchingConfiguration getLibrariesConfiguration() { FileMatchingConfiguration config = new FileMatchingConfiguration(); Iterator classesIterator = classes.iterator(); while (classesIterator.hasNext()) { FileSet clazz = (FileSet) classesIterator.next(); config.addDirectoryScanner(clazz.getDirectoryScanner(project)); } Iterator librariesIterator = libraries.iterator(); while (librariesIterator.hasNext()) { FileSet library = (FileSet) librariesIterator.next(); config.addDirectoryScanner(library.getDirectoryScanner(project)); } return config; } public FileMatchingConfiguration getScanTargetsConfiguration() { FileMatchingConfiguration configuration = new FileMatchingConfiguration(); if (scanTargets != null) { configuration.addDirectoryScanner(scanTargets.getDirectoryScanner(project)); } return configuration; } /** * @return location of web.xml file (either inside WAR or on the external * location). */ public File getWebXmlFile() { if (webXmlFile == null) { File webInf = new File(warFile, "WEB-INF"); return new File(webInf, "web.xml"); } return webXmlFile; } public void setWebXmlFile(File webXmlFile) { this.webXmlFile = webXmlFile; } public void addScanTargets(FileSet scanTargets) { if (this.scanTargets != null) { throw new BuildException("Only one tag is allowed!"); } this.scanTargets = scanTargets; } public void addContextHandlers(ContextHandlers contextHandlers) { if (this.contextHandlers != null) { throw new BuildException("Only one tag is allowed!"); } this.contextHandlers = contextHandlers; } public int getScanIntervalSeconds() { return scanIntervalSeconds; } public void setScanIntervalSeconds(int scanIntervalSeconds) { this.scanIntervalSeconds = scanIntervalSeconds; } public File getJettyEnvXml() { return jettyEnvXml; } public void setJettyEnvXml(File jettyEnvXml) { this.jettyEnvXml = jettyEnvXml; } public List getContextHandlers() { return (contextHandlers != null ? contextHandlers.getContextHandlers() : new ArrayList()); } } jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/WebApplicationProxyImpl.java0000644000175000017500000002476111052326153031307 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.util.Iterator; import java.util.List; import org.mortbay.jetty.ant.types.FileMatchingConfiguration; import org.mortbay.jetty.ant.utils.TaskLog; import org.mortbay.jetty.ant.utils.WebApplicationProxy; import org.mortbay.jetty.handler.ContextHandler; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.plus.webapp.EnvConfiguration; import org.mortbay.jetty.webapp.Configuration; import org.mortbay.jetty.webapp.JettyWebXmlConfiguration; import org.mortbay.jetty.webapp.TagLibConfiguration; import org.mortbay.jetty.webapp.WebAppClassLoader; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.jetty.webapp.WebInfConfiguration; /** * An abstraction layer over Jetty WebAppContext. * * @author Jakub Pawlowicz */ public class WebApplicationProxyImpl implements WebApplicationProxy { /** Common root temp directory for all web applications. */ static File baseTempDirectory = new File("."); /** Name of this web application. */ private String name; /** Location of WAR file (either expanded or not). */ private File warFile; /** Application context path. */ private String contextPath; /** Location of web.xml file. */ private File webXmlFile; /** Location of jetty-env.xml file. */ private File jettyEnvXml; /** List of classpath files. */ private List classPathFiles; /** Jetty6 Web Application Context. */ private WebAppContext webAppContext; /** Extra scan targets. */ private FileMatchingConfiguration extraScanTargetsConfiguration; /** Extra context handlers. */ private List contextHandlers; Configuration[] configurations; private FileMatchingConfiguration librariesConfiguration; public static void setBaseTempDirectory(File tempDirectory) { baseTempDirectory = tempDirectory; } /** * Default constructor. Takes application name as an argument. * * @param name web application name. */ public WebApplicationProxyImpl(String name) throws Exception { this.name = name; TaskLog.log("\nConfiguring Jetty for web application: " + name); this.configurations = new Configuration[] { new WebInfConfiguration(), new EnvConfiguration(), new JettyWebAppConfiguration(), new JettyWebXmlConfiguration(), new TagLibConfiguration() }; } public List getClassPathFiles() { return classPathFiles; } public String getContextPath() { return contextPath; } public String getName() { return name; } public File getSourceDirectory() { return warFile; } public File getWebXmlFile() { return webXmlFile; } public void setSourceDirectory(File warFile) { this.warFile = warFile; TaskLog.log("Webapp source directory = " + warFile); } public void setContextPath(String contextPath) { if (!contextPath.startsWith("/")) { contextPath = "/" + contextPath; } this.contextPath = contextPath; TaskLog.log("Context path = " + contextPath); } public void setWebXml(File webXmlFile) { this.webXmlFile = webXmlFile; } public void setJettyEnvXml(File jettyEnvXml) { this.jettyEnvXml = jettyEnvXml; if (this.jettyEnvXml != null) { TaskLog.log("jetty-env.xml file: = " + jettyEnvXml.getAbsolutePath()); } } public void setClassPathFiles(List classPathFiles) { this.classPathFiles = classPathFiles; TaskLog.log("Classpath = " + classPathFiles); } /** * Checks if a given file is scanned according to the internal * configuration. This may be difficult due to use of 'includes' and * 'excludes' statements. * * @param pathToFile a fully qualified path to file. * @return true if file is being scanned, false otherwise. */ public boolean isFileScanned(String pathToFile) { return librariesConfiguration.isIncluded(pathToFile) || extraScanTargetsConfiguration.isIncluded(pathToFile); } public void setLibrariesConfiguration(FileMatchingConfiguration classesConfiguration) { TaskLog.log("Default scanned paths = " + classesConfiguration.getBaseDirectories()); this.librariesConfiguration = classesConfiguration; } public List getLibraries() { return librariesConfiguration.getBaseDirectories(); } public void setExtraScanTargetsConfiguration( FileMatchingConfiguration extraScanTargetsConfiguration) { this.extraScanTargetsConfiguration = extraScanTargetsConfiguration; TaskLog.log("Extra scan targets = " + extraScanTargetsConfiguration.getBaseDirectories()); } public List getExtraScanTargets() { return extraScanTargetsConfiguration.getBaseDirectories(); } public List getContextHandlers() { return contextHandlers; } public void setContextHandlers(List contextHandlers) { this.contextHandlers = contextHandlers; } /** * @see com.sabre.ant.jetty.WebApplicationProxy#getProxiedObject() */ public Object getProxiedObject() { return webAppContext; } /** * @see com.sabre.ant.jetty.WebApplicationProxy#start() */ public void start() { try { TaskLog.logWithTimestamp("Starting web application " + name + " ...\n"); webAppContext.setShutdown(false); webAppContext.start(); } catch (Exception e) { TaskLog.log(e.toString()); } } /** * @see com.sabre.ant.jetty.WebApplicationProxy#stop() */ public void stop() { try { TaskLog.logWithTimestamp("Stopping web application " + name + " ..."); webAppContext.setShutdown(true); Thread.currentThread().sleep(500L); webAppContext.stop(); } catch (InterruptedException e) { TaskLog.log(e.toString()); } catch (Exception e) { TaskLog.log(e.toString()); } } /** * @see com.sabre.ant.jetty.WebApplicationProxy#createApplicationContext(org.mortbay.jetty.handler.ContextHandlerCollection) */ public void createApplicationContext(ContextHandlerCollection contexts) { webAppContext = new WebAppContext(contexts, warFile.getAbsolutePath(), contextPath); webAppContext.setDisplayName(name); configurePaths(); configureHandlers(contexts); applyConfiguration(); } private void configureHandlers(ContextHandlerCollection contexts) { // adding extra context handlers Iterator handlersIterator = contextHandlers.iterator(); while (handlersIterator.hasNext()) { ContextHandler contextHandler = (ContextHandler) handlersIterator.next(); contexts.addHandler(contextHandler); } } private void configurePaths() { // configuring temp directory File tempDir = new File(baseTempDirectory, contextPath); if (!tempDir.exists()) { tempDir.mkdirs(); } webAppContext.setTempDirectory(tempDir); tempDir.deleteOnExit(); TaskLog.log("Temp directory = " + tempDir.getAbsolutePath()); // configuring WAR directory for packaged web applications if (warFile.isFile()) { warFile = new File(tempDir, "webapp"); webXmlFile = new File(new File(warFile, "WEB-INF"), "web.xml"); } } /** * Applies web application configuration at the end of configuration process * or after application restart. */ void applyConfiguration() { for (int i = 0; i < configurations.length; i++) { if (configurations[i] instanceof EnvConfiguration) { try { if (jettyEnvXml != null && jettyEnvXml.exists()) { ((EnvConfiguration) configurations[i]).setJettyEnvXml(jettyEnvXml.toURL()); } } catch (MalformedURLException e) { throw new RuntimeException(e); } } else if (configurations[i] instanceof JettyWebAppConfiguration) { ((JettyWebAppConfiguration) configurations[i]).setClassPathFiles(classPathFiles); ((JettyWebAppConfiguration) configurations[i]).setWebAppBaseDir(warFile); ((JettyWebAppConfiguration) configurations[i]).setWebXmlFile(webXmlFile); ((JettyWebAppConfiguration) configurations[i]).setWebDefaultXmlFile(webDefaultXmlFile); } } try { ClassLoader loader = new WebAppClassLoader(this.getClass().getClassLoader(), webAppContext); webAppContext.setParentLoaderPriority(true); webAppContext.setClassLoader(loader); if (webDefaultXmlFile != null) webAppContext.setDefaultsDescriptor(webDefaultXmlFile.getCanonicalPath()); } catch (IOException e) { TaskLog.log(e.toString()); } webAppContext.setConfigurations(configurations); } private File webDefaultXmlFile; public File getWebDefaultXmlFile() { return this.webDefaultXmlFile; } public void setWebDefaultXmlFile(File webDefaultXmlfile) { this.webDefaultXmlFile = webDefaultXmlfile; } } jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/JettyWebAppConfiguration.java0000755000175000017500000000701511051041454031441 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant; import java.io.File; import java.util.Iterator; import java.util.List; import org.mortbay.jetty.ant.utils.TaskLog; import org.mortbay.jetty.plus.webapp.Configuration; import org.mortbay.jetty.webapp.WebAppClassLoader; /** * This configuration object provides additional way to inject application * properties into the configured web application. The list of classpath files, * the application base directory and web.xml file could be specified in this * way. * * @author Jakub Pawlowicz */ public class JettyWebAppConfiguration extends Configuration { /** List of classpath files. */ private List classPathFiles; /** Web application root directory. */ private File webAppBaseDir; /** Web application web.xml file. */ private File webXmlFile; private File webDefaultXmlFile; public JettyWebAppConfiguration() throws ClassNotFoundException { } public File getWebDefaultXmlFile() { return this.webDefaultXmlFile; } public void setWebDefaultXmlFile(File webDefaultXmlfile) { this.webDefaultXmlFile = webDefaultXmlfile; } public void setClassPathFiles(List classPathFiles) { this.classPathFiles = classPathFiles; } public void setWebAppBaseDir(File webAppBaseDir) { this.webAppBaseDir = webAppBaseDir; } public void setWebXmlFile(File webXmlFile) { this.webXmlFile = webXmlFile; if (webXmlFile.exists()) { TaskLog.log("web.xml file = " + webXmlFile); } } /** * Adds classpath files into web application classloader. * * @see Configuration#configureClassLoader() */ public void configureClassLoader() throws Exception { Iterator filesIterator = classPathFiles.iterator(); while (filesIterator.hasNext()) { File classPathFile = (File) filesIterator.next(); if (classPathFile.exists()) { ((WebAppClassLoader) getWebAppContext().getClassLoader()) .addClassPath(classPathFile.getCanonicalPath()); } } } /** * Sets web.xml and base directory for the configured web application. * * @see Configuration#configureWebApp() */ public void configureWebApp() throws Exception { if (getWebAppContext().isStarted()) { TaskLog.log("Cannot configure webapp after it is started"); return; } getWebAppContext().setResourceBase(webAppBaseDir.getAbsolutePath()); if (webXmlFile.exists()) { configure(webXmlFile.toURL().toString()); } bindUserTransaction(); lockCompEnv(); } } jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/JettyRunTask.java0000755000175000017500000002204111052326153027121 0ustar moonmoon//======================================================================== //Copyright 2006-2007 Sabre Holdings. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.ant; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.taskdefs.Property; import org.mortbay.jetty.RequestLog; import org.mortbay.jetty.ant.types.Connectors; import org.mortbay.jetty.ant.types.SystemProperties; import org.mortbay.jetty.ant.types.UserRealms; import org.mortbay.jetty.ant.types.WebApp; import org.mortbay.jetty.ant.utils.ServerProxy; import org.mortbay.jetty.ant.utils.TaskLog; import org.mortbay.util.Scanner; /** * Ant task for running a Jetty server. * * @author Jakub Pawlowicz */ public class JettyRunTask extends Task { /** Temporary files directory. */ private File tempDirectory; /** List of web applications to be deployed. */ private List webapps = new ArrayList(); /** Location of jetty.xml file. */ private File jettyXml; /** List of server connectors. */ private Connectors connectors = null; /** Server request logger object. */ private RequestLog requestLog; /** List of user realms. */ private UserRealms userRealms; /** List of system properties to be set. */ private SystemProperties systemProperties; /** * Creates a new WebApp Ant object. * * @return a WebApp object. */ public void addWebApp(WebApp webapp) { webapps.add(webapp); } /** * Adds a new Ant's connector tag object if it have not been created yet. */ public void addConnectors(Connectors connectors) { if (this.connectors != null) { throw new BuildException("Only one tag is allowed!"); } this.connectors = connectors; } /** * @return a new Ant's connector tag object if it have not been created yet. */ public void addUserRealms(UserRealms realms) { if (this.userRealms != null) { throw new BuildException("Only one tag is allowed!"); } this.userRealms = realms; } public void addSystemProperties(SystemProperties systemProperties) { if (this.systemProperties != null) { throw new BuildException("Only one tag is allowed!"); } this.systemProperties = systemProperties; } public File getTempDirectory() { return tempDirectory; } public void setTempDirectory(File tempDirectory) { this.tempDirectory = tempDirectory; } public File getJettyXml() { return jettyXml; } public void setJettyXml(File jettyXml) { this.jettyXml = jettyXml; } public void setRequestLog(String className) { try { this.requestLog = (RequestLog) Class.forName(className).newInstance(); } catch (InstantiationException e) { throw new BuildException("Request logger instantiation exception: " + e); } catch (IllegalAccessException e) { throw new BuildException("Request logger instantiation exception: " + e); } catch (ClassNotFoundException e) { throw new BuildException("Unknown request logger class: " + className); } } public String getRequestLog() { if (requestLog != null) { return requestLog.getClass().getName(); } return ""; } /** * Executes this Ant task. The build flow is being stopped until Jetty * server stops. * * @throws BuildException */ public void execute() throws BuildException { TaskLog.setTask(this); TaskLog.log("Configuring Jetty for project: " + getProject().getName()); WebApplicationProxyImpl.setBaseTempDirectory(tempDirectory); setSystemProperties(); List connectorsList = (connectors != null ? connectors.getConnectors() : Connectors.DEFAULT_CONNECTORS); List userRealmsList = (userRealms != null ? userRealms.getUserRealms() : new ArrayList()); ServerProxy server = new ServerProxyImpl(connectorsList, userRealmsList, requestLog, jettyXml); try { Iterator iterator = webapps.iterator(); while (iterator.hasNext()) { WebApp webAppConfiguration = (WebApp) iterator.next(); WebApplicationProxyImpl webApp = new WebApplicationProxyImpl(webAppConfiguration .getName()); webApp.setSourceDirectory(webAppConfiguration.getWarFile()); webApp.setContextPath(webAppConfiguration.getContextPath()); webApp.setWebXml(webAppConfiguration.getWebXmlFile()); webApp.setJettyEnvXml(webAppConfiguration.getJettyEnvXml()); webApp.setClassPathFiles(webAppConfiguration.getClassPathFiles()); webApp.setLibrariesConfiguration(webAppConfiguration.getLibrariesConfiguration()); webApp.setExtraScanTargetsConfiguration(webAppConfiguration .getScanTargetsConfiguration()); webApp.setContextHandlers(webAppConfiguration.getContextHandlers()); webApp.setWebDefaultXmlFile(webAppConfiguration.getWebDefaultXmlFile()); server.addWebApplication(webApp, webAppConfiguration.getScanIntervalSeconds()); } } catch (Exception e) { throw new BuildException(e); } server.start(); } /** * Starts a new thread which scans project files and automatically reloads a * container on any changes. * * @param scanIntervalSeconds * * @param webapp * @param appContext */ static void startScanner(final WebApplicationProxyImpl webApp, int scanIntervalSeconds) { List scanList = new ArrayList(); scanList.add(webApp.getWebXmlFile()); scanList.addAll(webApp.getLibraries()); scanList.addAll(webApp.getExtraScanTargets()); Scanner.Listener changeListener = new Scanner.BulkListener() { public void filesChanged(List changedFiles) { if (hasAnyFileChanged(changedFiles)) { try { webApp.stop(); webApp.applyConfiguration(); webApp.start(); } catch (Exception e) { e.printStackTrace(); } } } /** * Checks if any file in this particular application has changed. * This is not that easy, because some applications may use the same * class'es directory. * * @param changedFiles list of changed files. * @return true if any of passed files has changed, false otherwise. */ private boolean hasAnyFileChanged(List changedFiles) { Iterator changes = changedFiles.iterator(); while (changes.hasNext()) { String className = (String) changes.next(); if (webApp.isFileScanned(className)) { return true; } } return false; } }; TaskLog.log("Web application '" + webApp.getName() + "': starting scanner at interval of " + scanIntervalSeconds + " seconds."); Scanner scanner = new Scanner(); scanner.setScanInterval(scanIntervalSeconds); scanner.addListener(changeListener); scanner.setScanDirs(scanList); scanner.setReportExistingFilesOnStartup(false); scanner.start(); } /** * Sets the system properties. */ private void setSystemProperties() { if (systemProperties != null) { Iterator propertiesIterator = systemProperties.getSystemProperties().iterator(); while (propertiesIterator.hasNext()) { Property property = ((Property) propertiesIterator.next()); SystemProperties.setIfNotSetAlready(property); } } } } jetty-6.1.26/contrib/jetty-ant/src/main/java/org/mortbay/jetty/ant/ServerProxyImpl.java0000644000175000017500000001574011203426034027646 0ustar moonmoon// ======================================================================== // Copyright 2006-2007 Sabre Holdings. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.ant; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.RequestLog; import org.mortbay.jetty.Server; import org.mortbay.jetty.ant.utils.ServerProxy; import org.mortbay.jetty.ant.utils.TaskLog; import org.mortbay.jetty.ant.utils.WebApplicationProxy; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.handler.RequestLogHandler; import org.mortbay.jetty.security.UserRealm; import org.mortbay.resource.Resource; import org.mortbay.xml.XmlConfiguration; /** * A proxy class for interaction with Jetty server object. Used to have some * level of abstraction over standard Jetty classes. * * @author Jakub Pawlowicz */ public class ServerProxyImpl implements ServerProxy { /** Proxied Jetty server object. */ private Server server; /** Collection of context handlers (web application contexts). */ private ContextHandlerCollection contexts; /** Location of jetty.xml file. */ private File jettyXml; /** List of connectors. */ private List connectors; /** Request logger. */ private RequestLog requestLog; /** User realms. */ private List userRealms; /** List of added web applications. */ private Map webApplications = new HashMap(); /** * Default constructor. Creates a new Jetty server with a standard connector * listening on a given port. * * @param userRealmsList * * @param port default connector port number. * @param maxIdleTime default connector maximum idle time of for each * connection. */ public ServerProxyImpl(List connectors, List userRealmsList, RequestLog requestLog, File jettyXml) { server = new Server(); server.setStopAtShutdown(true); this.connectors = connectors; this.userRealms = userRealmsList; this.requestLog = requestLog; this.jettyXml = jettyXml; configure(); } /** * @see org.mortbay.jetty.ant.utils.ServerProxy#addWebApplication(WebApplicationProxy, * int) */ public void addWebApplication(WebApplicationProxy webApp, int scanIntervalSeconds) { webApp.createApplicationContext(contexts); if (scanIntervalSeconds > 0) { webApplications.put(webApp, new Integer(scanIntervalSeconds)); } } /** * Configures Jetty server before adding any web applications to it. */ private void configure() { // Applies external configuration via jetty.xml applyJettyXml(); // Configures connectores for this server instance. Iterator connectorIterator = connectors.iterator(); while (connectorIterator.hasNext()) { Connector jettyConnector = (Connector) connectorIterator.next(); server.addConnector(jettyConnector); } // Configures user realms Iterator realmsIterator = userRealms.iterator(); while (realmsIterator.hasNext()) { UserRealm realm = (UserRealm) realmsIterator.next(); server.addUserRealm(realm); } // Does not cache resources, to prevent Windows from locking files Resource.setDefaultUseCaches(false); // Set default server handlers configureHandlers(); } private void configureHandlers() { RequestLogHandler requestLogHandler = new RequestLogHandler(); if (requestLog != null) { requestLogHandler.setRequestLog(requestLog); } contexts = (ContextHandlerCollection) server .getChildHandlerByClass(ContextHandlerCollection.class); if (contexts == null) { contexts = new ContextHandlerCollection(); HandlerCollection handlers = (HandlerCollection) server .getChildHandlerByClass(HandlerCollection.class); if (handlers == null) { handlers = new HandlerCollection(); server.setHandler(handlers); handlers.setHandlers(new Handler[] { contexts, new DefaultHandler(), requestLogHandler }); } else { handlers.addHandler(contexts); } } } /** * Applies jetty.xml configuration to the Jetty server instance. */ private void applyJettyXml() { if (jettyXml != null && jettyXml.exists()) { TaskLog.log("Configuring jetty from xml configuration file = " + jettyXml.getAbsolutePath()); XmlConfiguration configuration; try { configuration = new XmlConfiguration(jettyXml.toURL()); configuration.configure(server); } catch (Exception e) { throw new RuntimeException(e); } } } /** * @see org.mortbay.jetty.ant.utils.ServerProxy#start() */ public void start() { try { server.start(); startScanners(); server.join(); } catch (InterruptedException e) { new RuntimeException(e); } catch (Exception e) { new RuntimeException(e); } } /** * Starts web applications' scanners. */ private void startScanners() { Iterator i = webApplications.keySet().iterator(); while (i.hasNext()) { WebApplicationProxyImpl webApp = (WebApplicationProxyImpl) i.next(); Integer scanIntervalSeconds = (Integer) webApplications.get(webApp); JettyRunTask.startScanner(webApp, scanIntervalSeconds.intValue()); } } /** * @see org.mortbay.jetty.ant.utils.ServerProxy#getProxiedObject() */ public Object getProxiedObject() { return server; } } jetty-6.1.26/contrib/jetty-ant/src/main/config/0000755000175000017500000000000011745736514020023 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/config/bin/0000755000175000017500000000000011745736514020573 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/config/bin/jetty-tasks.xml0000644000175000017500000000350311466510475023574 0ustar moonmoon jetty-6.1.26/contrib/jetty-ant/src/main/resources/0000755000175000017500000000000011745736514020570 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant/src/main/resources/tasks.properties0000755000175000017500000000005110572403664024024 0ustar moonmoonjetty=org.mortbay.jetty.ant.JettyRunTask jetty-6.1.26/contrib/jetty-ant/pom.xml0000755000175000017500000000522711466510475016365 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-ant jar jetty-ant plugin http://jetty.mortbay.org Apache License Version 2 http://www.apache.org/licenses/LICENSE-2.0 install maven-compiler-plugin 1.3 1.3 maven-antrun-plugin clean clean run copyjar install run junit junit test ant ant 1.6.5 org.mortbay.jetty jetty ${project.version} org.mortbay.jetty jetty-plus ${project.version} org.mortbay.jetty jetty-naming ${project.version} jetty-6.1.26/contrib/jetty-ant/README.TXT0000644000175000017500000000016310614242633016365 0ustar moonmoon For information on the ant jetty plugin, please see http://docs.codehaus.org/display/JETTY/Ant+Jetty+Plugin jetty-6.1.26/contrib/jboss/0000755000175000017500000000000011745736514014244 5ustar moonmoonjetty-6.1.26/contrib/jboss/LICENSES/0000755000175000017500000000000011745736514015451 5ustar moonmoonjetty-6.1.26/contrib/jboss/LICENSES/NOTICE.txt0000644000175000017500000000047011145320743017157 0ustar moonmoon============================================================== Jetty JBoss Integration Copyright 1995-2006 Mort Bay Consulting Pty Ltd ============================================================== This optional package contains code licensed under the Apache 2 license, and some code licensed under the LGPL. jetty-6.1.26/contrib/jboss/src/0000755000175000017500000000000011745736514015033 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/0000755000175000017500000000000011745736514015757 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/0000755000175000017500000000000011745736514016700 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/0000755000175000017500000000000011745736514017467 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/jboss/0000755000175000017500000000000011745736514020607 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/0000755000175000017500000000000011745736514021746 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/Jetty.java0000644000175000017500000001236111145320743023676 0ustar moonmoon//======================================================================== //$Id: $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.jboss.jetty; import java.io.CharArrayWriter; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.jboss.logging.Logger; import org.mortbay.xml.XmlConfiguration; import org.w3c.dom.Element; /** * Jetty * * Extends the jetty Server class. * * TODO remove this class and apply jboss-web.xml configuration in * JettyService class instead. * * @author Julian Gosnell * @author Andreas Schaefer . * *

    * 20011201 andreas: *

      *
    • Fixed fixURL() because it is to "Unix" centric. Right now the method looks for the last * part of the JAR URL (file:/...) which should be the JAR file name and add a "/." before them. * Now this should work for Windows as well (the problem with windows was that after "file:" came * the DRIVE LETTER which created a wrong URL). *
    */ public class Jetty extends org.mortbay.jetty.Server { protected static final Logger _log = Logger.getLogger("org.jboss.jetty"); JettyService _service; /** * the XML snippet */ String _xmlConfigString = null; /** * the XML snippet as a DOM element */ Element _configElement = null; //TODO move these to JettyDeployer? protected boolean _stopWebApplicationsGracefully = false; Jetty(JettyService service) { super(); _service = service; } public Element getConfigurationElement() { return _configElement; } /** * @param configElement XML fragment from jboss-service.xml */ public void setConfigurationElement(Element configElement) { // convert to an xml string to pass into Jetty's normal // configuration mechanism _configElement = configElement; try { DOMSource source = new DOMSource(configElement); CharArrayWriter writer = new CharArrayWriter(); StreamResult result = new StreamResult(writer); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.transform(source, result); _xmlConfigString = writer.toString(); // get rid of the first line, as this will be prepended by // the XmlConfiguration int index = _xmlConfigString.indexOf("?>"); if (index >= 0) { index += 2; while ((_xmlConfigString.charAt(index) == '\n') || (_xmlConfigString.charAt(index) == '\r')) index++; } _xmlConfigString = _xmlConfigString.substring(index); if (_log.isDebugEnabled()) _log.debug("Passing xml config to jetty:\n" + _xmlConfigString); setXMLConfiguration(_xmlConfigString); } catch (TransformerConfigurationException tce) { _log.error("Can't transform config Element -> xml:", tce); } catch (TransformerException te) { _log.error("Can't transform config Element -> xml:", te); } catch (Exception e) { _log.error("Unexpected exception converting configuration Element -> xml", e); } } /* * Actually perform the configuration @param xmlString */ private void setXMLConfiguration(String xmlString) { try { XmlConfiguration xmlConfigurator = new XmlConfiguration(xmlString); xmlConfigurator.configure(this); } catch (Exception e) { _log.error("problem configuring Jetty:", e); } } public String[] getCompileClasspath(ClassLoader cl) { return _service.getCompileClasspath(cl); } public boolean getStopWebApplicationsGracefully() { return _stopWebApplicationsGracefully; } public void setStopWebApplicationsGracefully(boolean graceful) { _stopWebApplicationsGracefully = graceful; } } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/http/0000755000175000017500000000000011745736514022725 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/http/SecurityDomainListener.java0000644000175000017500000000576011145320743030230 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== //======================================================================== //$Id: $ // JBoss Jetty Integration //------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //======================================================================== package org.jboss.jetty.http; import java.io.IOException; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.net.ssl.SSLServerSocketFactory; import org.jboss.security.SecurityDomain; import org.jboss.security.ssl.DomainServerSocketFactory; import org.mortbay.jetty.security.SslSocketConnector; /** * SecurityDomain * * A subclass of JsseListener that uses the KeyStore associated with the * SecurityDomain given by the SecurityDomain attribute. * * @see org.jboss.security.SecurityDoamin * * @author Scott.Stark@jboss.org * */ public class SecurityDomainListener extends SslSocketConnector { private String securityDomainName; private SecurityDomain securityDomain; public SecurityDomainListener() throws IOException { super(); } public String getSecurityDomain() { return securityDomainName; } public void setSecurityDomain(String securityDomainName) throws NamingException { this.securityDomainName = securityDomainName; InitialContext iniCtx = new InitialContext(); this.securityDomain = (SecurityDomain) iniCtx.lookup(securityDomainName); } protected SSLServerSocketFactory createFactory() throws Exception { DomainServerSocketFactory dssf = new DomainServerSocketFactory(securityDomain); return dssf; } } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/JettyService.java0000644000175000017500000003236311145320743025223 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== //======================================================================== //$Id: $ //JBoss Jetty Integration //------------------------------------------------------------------------ //Licensed under LGPL. //See license terms at http://www.gnu.org/licenses/lgpl.html //======================================================================== package org.jboss.jetty; import java.lang.reflect.Method; import javax.management.MBeanRegistration; import javax.management.MBeanServer; import javax.management.ObjectName; import org.jboss.deployment.DeploymentException; import org.jboss.deployment.DeploymentInfo; import org.jboss.deployment.SubDeployerExt; import org.jboss.mx.util.MBeanProxyExt; import org.jboss.system.ServiceControllerMBean; import org.jboss.web.AbstractWebContainer; import org.jboss.web.AbstractWebDeployer; import org.jboss.web.WebApplication; import org.w3c.dom.Element; //------------------------------------------------------------------------------ /** * JettyService * A service to launch jetty as the webserver for JBoss. * * * @jmx:mbean name="jboss.jetty:service=Jetty" * extends="org.jboss.web.AbstractWebContainerMBean" * * @todo convert to use JMXDoclet... * */ public class JettyService extends AbstractWebContainer implements JettyServiceMBean, MBeanRegistration { public static final String NAME = "Jetty"; protected MBeanServer _server = null; protected Jetty _jetty = null; protected Element _jettyConfig = null; protected boolean _supportJSR77; protected String _webDefaultResource; protected SubDeployerExt subDeployerProxy = null; /** * ConfigurationData * * Holds info that the jboss API sets on the * AbstractWebContainer but is needed by the * AbstractWebDeployer. */ public static class ConfigurationData { private boolean _loaderCompliance; private boolean _unpackWars; private boolean _lenientEjbLink; private String _subjectAttributeName; private String _defaultSecurityDomain; private boolean _acceptNonWarDirs; private String _webDefaultResource; private boolean _supportJSR77; private String _mbeanDomain; /** * @return the _webDefaultResource */ public String getWebDefaultResource() { return _webDefaultResource; } /** * @param defaultResource the _webDefaultResource to set */ public void setWebDefaultResource(String defaultResource) { _webDefaultResource = defaultResource; } public void setJava2ClassLoadingCompliance(boolean loaderCompliance) { _loaderCompliance=loaderCompliance; } public boolean getJava2ClassLoadingCompliance() { return _loaderCompliance; } public boolean getUnpackWars() { return _unpackWars; } public void setUnpackWars(boolean unpackWars) { _unpackWars=unpackWars; } public void setLenientEjbLink (boolean lenientEjbLink) { _lenientEjbLink=lenientEjbLink; } public boolean getLenientEjbLink() { return _lenientEjbLink; } public String getSubjectAttributeName() { return _subjectAttributeName; } /** * @jmx:managed-attribute */ public void setSubjectAttributeName(String subjectAttributeName) { _subjectAttributeName=subjectAttributeName; } /** * @return the _defaultSecurityDomain */ public String getDefaultSecurityDomain() { return _defaultSecurityDomain; } /** * @param securityDomain the _defaultSecurityDomain to set */ public void setDefaultSecurityDomain(String securityDomain) { _defaultSecurityDomain = securityDomain; } /** * @return the _acceptNonWarDirs */ public boolean getAcceptNonWarDirs() { return _acceptNonWarDirs; } /** * @param nonWarDirs the _acceptNonWarDirs to set */ public void setAcceptNonWarDirs(boolean nonWarDirs) { _acceptNonWarDirs = nonWarDirs; } /** * @return the _supportJSR77 */ public boolean getSupportJSR77() { return _supportJSR77; } /** * @param _supportjsr77 the _supportJSR77 to set */ public void setSupportJSR77(boolean _supportjsr77) { _supportJSR77 = _supportjsr77; } /** * @return the _mbeanDomain */ public String getMBeanDomain() { return _mbeanDomain; } /** * @param domain the _mbeanDomain to set */ public void setMBeanDomain(String domain) { _mbeanDomain = domain; } } /** * Constructor */ public JettyService() { super(); _jetty = new Jetty(this); } /** * Listen for our registration as an mbean and remember our name. * @see org.jboss.system.ServiceMBeanSupport#preRegister(javax.management.MBeanServer, javax.management.ObjectName) */ public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { super.preRegister(server, name); name = getObjectName(server, name); _server = server; return name; } /** * Listen for post-mbean registration and set up the jetty * mbean infrastructure so it can generate mbeans according * to the elements contained in the element * of the jboss-service.xml file. * @see org.jboss.system.ServiceMBeanSupport#postRegister(java.lang.Boolean) */ public void postRegister(Boolean done) { super.postRegister(done); try { log.debug("Setting up mbeanlistener on Jetty"); _jetty.getContainer().addEventListener(new JBossMBeanContainer(_server)); } catch (Throwable e) { log.error("could not create MBean peers", e); } } /** * @see org.jboss.system.ServiceMBeanSupport#getName() */ public String getName() { return NAME; } /** * @see org.jboss.deployment.SubDeployerSupport#createService() */ public void createService() throws Exception { super.createService(); if (_jettyConfig != null) _jetty.setConfigurationElement(_jettyConfig); } /** * Start up the jetty service. Also, as we need to be able * to have interceptors injected into us to support jboss.ws:service=WebService, * we need to create a proxy to ourselves and register that proxy with the * mainDeployer. * See SubDeployerInterceptorSupport * @see org.jboss.web.AbstractWebContainer#startService() */ public void startService() throws Exception { //do what AbstractWebContainer.startService() would have done serviceController = (ServiceControllerMBean) MBeanProxyExt.create(ServiceControllerMBean.class, ServiceControllerMBean.OBJECT_NAME, server); //instead of calling mainDeployer.addDeployer(this) as SubDeployerSupport super class does, //we register instead a proxy to oursevles so we can support dynamic addition of interceptors subDeployerProxy = (SubDeployerExt)MBeanProxyExt.create(SubDeployerExt.class, super.getServiceName(), super.getServer()); mainDeployer.addDeployer(subDeployerProxy); _jetty.start(); } public void stopService() throws Exception { mainDeployer.removeDeployer(subDeployerProxy); _jetty.stop(); } public void destroyService() throws Exception { super.destroyService(); _jetty.stop(); _jetty = null; } /** * @jmx:managed-attribute */ public boolean getSupportJSR77() { return _supportJSR77; } /** * @jmx:managed-attribute */ public void setSupportJSR77(boolean supportJSR77) { if (log.isDebugEnabled()) log.debug("set SupportJSR77 to " + supportJSR77); _supportJSR77=supportJSR77; } /** * Get the custom webdefault.xml file. * @jmx:managed-attribute */ public String getWebDefaultResource() { return _webDefaultResource; } /** * Set a custom webdefault.xml file. * @jmx:managed-attribute */ public void setWebDefaultResource(String webDefaultResource) { if (log.isDebugEnabled()) log.debug("set WebDefaultResource to " + webDefaultResource); _webDefaultResource=webDefaultResource; } /** * Get the extended Jetty configuration XML fragment * * @jmx:managed-attribute * @return Jetty XML fragment embedded in jboss-service.xml */ public Element getConfigurationElement() { return _jettyConfig; } /** * Configure Jetty * * @param configElement XML fragment from jboss-service.xml * @jmx:managed-attribute */ public void setConfigurationElement(Element configElement) { log.debug("Saving Configuration to xml fragment"); this._jettyConfig = configElement; } /** * Old deployment method from AbstractWebContainer. * * TODO remove this? * @param webApp * @param warUrl * @param parser * @throws DeploymentException */ public void performDeploy(WebApplication webApp, String warUrl, WebDescriptorParser parser) throws DeploymentException { //TODO: backwards compatibility? throw new UnsupportedOperationException("Backward compatibility not implemented"); } /** * Old undeploy method from AbstractWebContainer. * * TODO remove? * @param warUrl * @throws DeploymentException */ public void performUndeploy(String warUrl) throws DeploymentException { //TODO backwards compatibility? throw new UnsupportedOperationException("Backward compatibility not implemented"); } /** * @see org.jboss.web.AbstractWebContainer#getDeployer(org.jboss.deployment.DeploymentInfo) */ public AbstractWebDeployer getDeployer(DeploymentInfo di) throws Exception { JettyDeployer deployer = new JettyDeployer(_jetty, di); ConfigurationData configData = new ConfigurationData(); configData.setMBeanDomain("jboss.jetty"); configData.setAcceptNonWarDirs(getAcceptNonWarDirs()); configData.setJava2ClassLoadingCompliance(getJava2ClassLoadingCompliance()); configData.setLenientEjbLink(getLenientEjbLink()); configData.setSubjectAttributeName(getSubjectAttributeName()); configData.setSupportJSR77(getSupportJSR77()); configData.setUnpackWars(getUnpackWars()); configData.setWebDefaultResource(getWebDefaultResource()); //defaultSecurityDomain was added at a certain point, so do it //this way so we have backwards compatibility try { Method method = AbstractWebContainer.class.getDeclaredMethod("getDefaultSecurityDomain", new Class[0]); String defaultSecurityDomain = (String) method.invoke(JettyService.this, new Object[0]); configData.setDefaultSecurityDomain(defaultSecurityDomain); } catch (Exception e) { // ignore - it means the currently executing version of jboss // does not support this method log.info("Getter/setter for DefaultSecurityDomain not available in this version of JBoss"); } deployer.setServer(_server); deployer.init(configData); return deployer; } } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/JettyDeployer.java0000644000175000017500000002314511255605107025406 0ustar moonmoon//======================================================================== //$Id: JettyDeployer.java 4067 2008-11-18 09:23:11Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under LGPL. //See license terms at http://www.gnu.org/licenses/lgpl.html //======================================================================== package org.jboss.jetty; import java.net.URL; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import javax.management.ObjectName; import org.jboss.deployment.DeploymentException; import org.jboss.deployment.DeploymentInfo; import org.jboss.logging.Logger; import org.jboss.web.AbstractWebDeployer; import org.jboss.web.WebApplication; import org.jboss.web.AbstractWebContainer.WebDescriptorParser; import org.mortbay.jetty.SessionManager; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.util.LazyList; /** * JettyDeployer * * Implementation of the jboss AbstractWebDeployer * for deploying webapps to jetty. */ public class JettyDeployer extends AbstractWebDeployer { protected static final Logger _log = Logger.getLogger("org.jboss.jetty"); protected Jetty _jetty; protected ContextHandlerCollection _contexts; protected DeploymentInfo _deploymentInfo; protected JettyService.ConfigurationData _configData; protected SessionManager _distributableSessionManagerPrototype; protected boolean _forceDistributable = false; /** * use Hashtable because is is synchronised */ Hashtable _deployed = new Hashtable(); public JettyDeployer(Jetty jetty, DeploymentInfo di) { _jetty = jetty; _deploymentInfo = di; _contexts = (ContextHandlerCollection)_jetty.getChildHandlerByClass(ContextHandlerCollection.class); } public void init(Object containerConfig) throws Exception { _configData = (JettyService.ConfigurationData)containerConfig; setLenientEjbLink(_configData.getLenientEjbLink()); setDefaultSecurityDomain(_configData.getDefaultSecurityDomain()); setJava2ClassLoadingCompliance(_configData.getJava2ClassLoadingCompliance()); setUnpackWars(_configData.getUnpackWars()); } public void performDeploy(WebApplication webApp, String warUrl, WebDescriptorParser parser) throws DeploymentException { log.debug("deploying webapp at "+warUrl); try { String contextPath = webApp.getMetaData().getContextRoot(); if (contextPath.equalsIgnoreCase("/root")) contextPath = "/"; webApp.setURL(new URL(warUrl)); if (_deployed.get(warUrl) != null) throw new DeploymentException(warUrl+" is already deployed"); //make a context for the webapp and configure it from the jetty jboss-service.xml defaults //and the jboss-web.xml descriptor JBossWebAppContext app = new JBossWebAppContext(parser, webApp, warUrl); app.setContextPath(contextPath); app.setConfigurationClasses (new String[]{ "org.mortbay.jetty.webapp.WebInfConfiguration","org.jboss.jetty.JBossWebXmlConfiguration", "org.mortbay.jetty.webapp.JettyWebXmlConfiguration", "org.mortbay.jetty.webapp.TagLibConfiguration"}); app.setExtractWAR(getUnpackWars()); app.setParentLoaderPriority(getJava2ClassLoadingCompliance()); //permit urls without a trailing '/' even though it is not a valid url //as the jboss webservice client tests seem to use these invalid urls if (_log.isDebugEnabled()) _log.debug("Allowing non-trailing '/' on context path"); app.setAllowNullPathInfo(true); SessionManager manager = getDistributableSessionManagerPrototype(); if (manager != null) { throw new UnsupportedOperationException("NOT IMPLEMENTED - please ask"); // app.setDistributableSessionManager((Manager) manager.clone()); // if (getForceDistributable()) // app.setDistributable(true); } // if a different webdefault.xml file has been provided, use it if (_configData.getWebDefaultResource() != null) { try { URL url = getClass().getClassLoader().getResource(_configData.getWebDefaultResource()); String fixedUrl = (fixURL(url.toString())); app.setDefaultsDescriptor(fixedUrl); if (_log.isDebugEnabled()) _log.debug("webdefault specification is: " + _configData.getWebDefaultResource()); } catch (Exception e) { _log.error("Could not find resource: " + _configData.getWebDefaultResource()+" using default", e); } } Iterator hosts = webApp.getMetaData().getVirtualHosts(); List hostList = new ArrayList(); while(hosts.hasNext()) hostList.add((String)hosts.next()); app.setVirtualHosts((String[])LazyList.toArray(hostList, String.class)); // Add the webapp to jetty _contexts.addHandler(app); //tell jboss about the classloader the webapp is using - ensure //this is done before the context is started, because webservices //want to get access to this classloader System.err.println("In JettyDeployer, setting webapp.metadata.contextloader="+app.getClassLoader()); webApp.getMetaData().setContextLoader(app.getClassLoader()); //if jetty has been started, then start the //handler just added if (_contexts.isStarted()) app.start(); // keep track of deployed contexts for undeployment _deployed.put(warUrl, app); //tell jboss about the jsr77 mbeans we've created //first check that there is an mbean for the webapp itself ObjectName webAppMBean = new ObjectName(_configData.getMBeanDomain() + ":J2EEServer=none,J2EEApplication=none,J2EEWebModule="+app.getUniqueName()); if (server.isRegistered(webAppMBean)) _deploymentInfo.deployedObject = webAppMBean; else throw new IllegalStateException("No mbean registered for webapp at "+app.getUniqueName()); //now get all the mbeans that represent servlets and set them on the //deployment info so they will be found by the jsr77 management system ObjectName servletQuery = new ObjectName (_configData.getMBeanDomain() + ":J2EEServer=none,J2EEApplication=none,J2EEWebModule="+app.getUniqueName()+ ",j2eeType=Servlet,*"); Iterator iterator = server.queryNames(servletQuery, null).iterator(); while (iterator.hasNext()) { _deploymentInfo.mbeans.add((ObjectName) iterator.next()); } _log.info("successfully deployed " + warUrl + " to " + contextPath); } catch (Exception e) { _log.error("Undeploying on start due to error", e); performUndeploy(warUrl, webApp); throw new DeploymentException(e); } } /** * Undeploy a webapp * @see org.jboss.web.AbstractWebDeployer#performUndeploy(java.lang.String, org.jboss.web.WebApplication) */ public void performUndeploy(String warUrl, WebApplication wa) throws DeploymentException { JBossWebAppContext app = (JBossWebAppContext) _deployed.get(warUrl); if (app == null) _log.warn("app (" + warUrl + ") not currently deployed"); else { try { app.stop(); _contexts.removeHandler(app); app.destroy(); app = null; _log.info("Successfully undeployed " + warUrl); } catch (Exception e) { throw new DeploymentException(e); } finally { _deployed.remove(warUrl); } } } /** * Work around broken JarURLConnection caching... * @param url * @return */ static String fixURL(String url) { String fixedUrl = url; // Get the separator of the JAR URL and the file reference int index = url.indexOf('!'); if (index >= 0) index = url.lastIndexOf('/', index); else index = url.lastIndexOf('/'); // If there is at least one forward slash, add a "/." before the JAR file // change the path just slightly. Otherwise, the url is malformed, but // we will ignore that. if (index >= 0) fixedUrl = url.substring(0, index) + "/." + url.substring(index); return fixedUrl; } public void setDistributableSessionManagerPrototype(SessionManager manager) { throw new UnsupportedOperationException("NOT SUPPORTED - please ask"); // _distributableSessionManagerPrototype = manager; } public SessionManager getDistributableSessionManagerPrototype() { return _distributableSessionManagerPrototype; } public boolean getForceDistributable() { return _forceDistributable; } public void setForceDistributable(boolean distributable) { _forceDistributable = distributable; } } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/JettyServiceMBean.java0000644000175000017500000000376611145320743026133 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== /* * Generated file - Do not edit! */ package org.jboss.jetty; /** * MBean interface. * TODO - use JMXDoclet to autogenerate */ public interface JettyServiceMBean extends org.jboss.web.AbstractWebContainerMBean { //default object name public static final javax.management.ObjectName OBJECT_NAME = org.jboss.mx.util.ObjectNameFactory.create("jboss.jetty:service=Jetty"); void setJava2ClassLoadingCompliance(boolean loaderCompliance) ; boolean getJava2ClassLoadingCompliance() ; boolean getUnpackWars() ; void setUnpackWars(boolean unpackWars) ; boolean getSupportJSR77() ; void setSupportJSR77(boolean supportJSR77) ; java.lang.String getWebDefaultResource() ; void setWebDefaultResource(java.lang.String webDefaultResource) ; /** * Get the extended Jetty configuration XML fragment * @return Jetty XML fragment embedded in jboss-service.xml */ org.w3c.dom.Element getConfig() ; /** * Configure Jetty * @param configElement XML fragment from jboss-service.xml */ void setConfigurationElement(org.w3c.dom.Element configElement) ; java.lang.String getSubjectAttributeName() ; void setSubjectAttributeName(java.lang.String subjectAttributeName) ; } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/session/0000755000175000017500000000000011745736514023431 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/JBossWebAppContext.java0000644000175000017500000001332211145320743026261 0ustar moonmoon//======================================================================== //$Id: $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.jboss.jetty; import org.jboss.jetty.security.JBossUserRealm; import org.jboss.logging.Logger; import org.jboss.web.WebApplication; import org.jboss.web.AbstractWebContainer.WebDescriptorParser; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.jetty.servlet.SessionHandler; import org.mortbay.jetty.servlet.jsr77.Jsr77ServletHandler; import org.mortbay.jetty.webapp.WebAppClassLoader; /** * JBossWebApplicationContext * * Customize the jetty WebAppContext to jboss environment. * */ public class JBossWebAppContext extends WebAppContext { protected static Logger __log=Logger.getLogger(JBossWebAppContext.class); protected WebDescriptorParser _descriptorParser; protected WebApplication _webApp; private String _subjAttrName="j_subject";//TODO what was this doing here? private JBossUserRealm _realm=null; // this is a hack - but we need the session timeout - in case we are // going to use a distributable session manager.... protected boolean _timeOutPresent=false; protected int _timeOutMinutes=0; /** * Constructor * @param descriptorParser * @param webApp * @param warUrl * @throws Exception */ public JBossWebAppContext(WebDescriptorParser descriptorParser,WebApplication webApp, String warUrl) throws Exception { super(null,new SessionHandler(), new Jsr77ServletHandler(), null); setWar(warUrl); ((Jsr77ServletHandler)getServletHandler()).setWebAppContext(this); _descriptorParser=descriptorParser; _webApp=webApp; //very important - establish the classloader now, as it is the one //that is being used for the performDeploy step ClassLoader loader=Thread.currentThread().getContextClassLoader(); /* if(isDistributable()&&getDistributableSessionManager()!=null) setUpDistributableSessionManager(loader); */ setClassLoader(new WebAppClassLoader(loader, this)); } /* ------------------------------------------------------------ */ public void doStop() throws Exception { super.doStop(); _descriptorParser=null; _webApp=null; _subjAttrName=null; _realm = null; } public void setRealm (JBossUserRealm realm) { _realm = realm; } public JBossUserRealm getRealm () { return _realm; } public void setSubjectAttribute (String subjAttr) { _subjAttrName = subjAttr; } public String getSubjectAttribute () { return _subjAttrName; } public String getUniqueName () { return _descriptorParser.getDeploymentInfo().getCanonicalName(); } protected void startContext () throws Exception { //set up the java:comp/env namespace so that it can be refered to //in other parts of the startup setUpENC(getClassLoader()); super.startContext(); //ensure there is always a realm //this is primarily so that jboss's webservices impl will work, as it //sets up a SecurityAssociation that can only be cleared by jetty if //there is a realm if (_realm == null) { _realm = new JBossUserRealm("other", getSubjectAttribute()); getSecurityHandler().setUserRealm(_realm); } //start the realm from within the webapp's classloader as it wants //to do JNDI lookups ClassLoader currentLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(getClassLoader()); try { _realm.init(); } finally { Thread.currentThread().setContextClassLoader(currentLoader); } } /* protected void setUpDistributableSessionManager(ClassLoader loader) { try { Manager sm=(Manager)getDistributableSessionManager(); Store store=sm.getStore(); if(store instanceof AbstractReplicatedStore) ((AbstractReplicatedStore)store).setLoader(loader); if(_timeOutPresent) sm.setMaxInactiveInterval(_timeOutMinutes*60); getSessionHandler().setSessionManager(sm); } catch(Exception e) { __log.error("could not set up Distributable HttpSession Manager - using local one",e); } } */ protected void setUpENC(ClassLoader loader) throws Exception { _webApp.setClassLoader(loader); _webApp.setName(getDisplayName()); _webApp.setAppData(this); __log.debug("setting up ENC..."); _descriptorParser.parseWebAppDescriptors(loader,_webApp.getMetaData()); __log.debug("setting up ENC succeeded"); } } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/JBossMBeanContainer.java0000644000175000017500000000267711145320743026376 0ustar moonmoon//======================================================================== //$Id: $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.jboss.jetty; import javax.management.MBeanServer; import org.mortbay.management.MBeanContainer; /** * JBossMBeanContainer * * Subclass of the jetty MBeanContainer to mesh jetty * jmx architecture with jboss jmx architecture. * */ public class JBossMBeanContainer extends MBeanContainer { public static final String JBOSS_DOMAIN = "jboss.jetty"; public JBossMBeanContainer(MBeanServer server) { super(server); setDomain(JBOSS_DOMAIN); } public void start () { //do nothing - the superclass does initialization of stuff we don't want } } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/JBossWebXmlConfiguration.java0000644000175000017500000000776511145320743027502 0ustar moonmoon//======================================================================== //$Id: JBossWebXmlConfiguration.java 1241 2006-11-17 19:21:19Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.jboss.jetty; import org.jboss.jetty.security.JBossUserRealm; import org.jboss.logging.Logger; import org.jboss.metadata.WebMetaData; import org.mortbay.jetty.security.UserRealm; import org.mortbay.jetty.webapp.WebXmlConfiguration; import org.mortbay.xml.XmlParser; /** * JBossWebXmlConfiguration * * Extends the jetty WebXmlConfiguration to provide jboss * handling of various elements in the web.xml */ public class JBossWebXmlConfiguration extends WebXmlConfiguration { protected static Logger __log=Logger.getLogger(JBossWebAppContext.class); public JBossWebXmlConfiguration() { super(); } public JBossWebAppContext getJBossWebApplicationContext() { return (JBossWebAppContext)getWebAppContext(); } protected void initWebXmlElement(String element,org.mortbay.xml.XmlParser.Node node) throws Exception { //avoid jetty printing a debug message about not implementing these elements //because jboss implements it for us if("resource-ref".equals(element)||"resource-env-ref".equals(element)||"env-entry".equals(element) ||"ejb-ref".equals(element)||"ejb-local-ref".equals(element)||"security-domain".equals(element)) { //ignore } // these are handled by Jetty else super.initWebXmlElement(element,node); } protected void initSessionConfig(XmlParser.Node node) { XmlParser.Node tNode=node.get("session-timeout"); if(tNode!=null) { getJBossWebApplicationContext()._timeOutPresent=true; getJBossWebApplicationContext()._timeOutMinutes=Integer.parseInt(tNode.toString(false,true)); } // pass up to our super class so they can do all this again ! super.initSessionConfig(node); } protected void initLoginConfig(XmlParser.Node node) { // check if a realm has been explicitly set String realmName=null; UserRealm userRealm = getJBossWebApplicationContext().getSecurityHandler().getUserRealm(); if (userRealm!= null) realmName=userRealm.getName(); //use a security domain from jboss-web.xml if (null==realmName) { WebMetaData metaData = getJBossWebApplicationContext()._webApp.getMetaData(); realmName = metaData.getSecurityDomain(); if (null!=realmName) { if (realmName.endsWith("/")) realmName = realmName.substring (0, realmName.length()); int idx = realmName.lastIndexOf('/'); if (idx >= 0) realmName = realmName.substring(idx+1); } } if(__log.isDebugEnabled()) __log.debug("Realm is : "+realmName); if (realmName != null) { JBossUserRealm realm = new JBossUserRealm(realmName,getJBossWebApplicationContext().getSubjectAttribute()); getJBossWebApplicationContext().setRealm(realm); getJBossWebApplicationContext().getSecurityHandler().setUserRealm(realm); } super.initLoginConfig(node); } } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/security/0000755000175000017500000000000011745736514023615 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/security/JBossUserRealm.java0000644000175000017500000004672311145320743027317 0ustar moonmoon//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== //======================================================================== //$Id: $ //JBoss Jetty Integration //------------------------------------------------------------------------ //Licensed under LGPL. //See license terms at http://www.gnu.org/licenses/lgpl.html //======================================================================== package org.jboss.jetty.security; import java.io.Serializable; import java.security.Principal; import java.security.cert.X509Certificate; import java.util.Collections; import java.util.HashMap; import java.util.Set; import java.util.Stack; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.ObjectName; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.security.auth.Subject; import org.jboss.jetty.JBossWebAppContext; import org.jboss.logging.Logger; import org.jboss.security.AuthenticationManager; import org.jboss.security.NobodyPrincipal; import org.jboss.security.RealmMapping; import org.jboss.security.RunAsIdentity; import org.jboss.security.SecurityAssociation; import org.jboss.security.SimplePrincipal; import org.jboss.security.SubjectSecurityManager; import org.mortbay.jetty.security.HashSSORealm; import org.mortbay.jetty.Request; import org.mortbay.jetty.Response; import org.mortbay.jetty.security.SSORealm; import org.mortbay.jetty.security.UserRealm; import org.mortbay.jetty.security.Credential; /** * JBossUserRealm * An implementation of UserRealm that integrates with the JBossSX security * manager associted with the web application. * * @author Scott_Stark@displayscape.com * @author Cert Auth by pdawes@users.sf.net * @author SSO Patch by steve.g@byu.edu * @version $Revision: 1.9 $ */ public class JBossUserRealm implements UserRealm, SSORealm { private final Logger _log; protected final String _realmName; protected final String _subjAttrName; protected SubjectSecurityManager _subjSecMgr = null; protected AuthenticationManager _authMgr = null; private final HashMap _users = new HashMap(); protected RealmMapping _realmMapping = null; protected JBossWebAppContext _jbossWebAppContext = null; /* * Since there is a seperate instance of JBossUserRealm per web-app * regardless of whether the realm-name is the same, this creates an * instance of HashSSORealm shared between all JBossUserRealms that have the * same realm-name. */ private final static HashMap _sharedHashSSORealms = new HashMap(); private String _ssoRealmName = null; private HashSSORealm _ssoRealm = null; /** * JBossUserPrincipal * * */ static class JBossUserPrincipal implements Principal, Serializable { protected transient Logger _logRef; protected transient JBossUserRealm _realm; protected Principal _principal; private String _password; private Stack _roleStack= new Stack();; JBossUserPrincipal() {} JBossUserPrincipal(String name, Logger log) { _principal = new SimplePrincipal(name); this._logRef = log; if (log.isDebugEnabled()) log.debug("created JBossUserRealm::JBossUserPrincipal: " + name); } void associateWithRealm(JBossUserRealm realm) { this._realm = realm; } private boolean isAuthenticated(String password) { boolean authenticated = false; if (password == null) password = ""; char[] passwordChars = password.toCharArray(); if (_logRef.isDebugEnabled()) _logRef.debug("authenticating: Name:" + _principal + " Password:****"/* +password */); Subject subjectCopy = new Subject(); if (_realm._subjSecMgr != null && _realm._subjSecMgr.isValid(this._principal, passwordChars, subjectCopy)) { if (_logRef.isDebugEnabled()) _logRef.debug("authenticated: " + _principal); SecurityAssociation.setPrincipal(_principal); SecurityAssociation.setCredential(passwordChars); SecurityAssociation.setSubject(subjectCopy); authenticated = true; } else { _logRef.warn("authentication failure: " + _principal); } return authenticated; } public boolean equals(Object o) { if (o == this) return true; if (o == null) return false; if (getClass() != o.getClass()) return false; String myName = this.getName(); String yourName = ((JBossUserPrincipal) o).getName(); if (myName == null && yourName == null) return true; if (myName != null && myName.equals(yourName)) return true; return false; } public String getName() { return _realm._realmMapping.getPrincipal(_principal).getName(); } public boolean authenticate(String password, Request request) { _password = password; boolean authenticated = false; authenticated = isAuthenticated(_password); if (authenticated && _realm._subjSecMgr != null) { Subject subject = _realm._subjSecMgr.getActiveSubject(); request.setAttribute(_realm._subjAttrName, subject); } return authenticated; } public boolean isAuthenticated() { return isAuthenticated(_password); } public boolean isUserInRole(String role) { boolean isUserInRole = false; if (!_roleStack.isEmpty() && _roleStack.peek().equals(role)) return true; Set requiredRoles = Collections.singleton(new SimplePrincipal(role)); if (_realm._realmMapping != null && _realm._realmMapping.doesUserHaveRole(this._principal,requiredRoles)) { if (_logRef.isDebugEnabled()) _logRef.debug("JBossUserPrincipal: " + _principal + " is in Role: " + role); isUserInRole = true; } else { if (_logRef.isDebugEnabled()) _logRef.debug("JBossUserPrincipal: " + _principal + " is NOT in Role: " + role); } return isUserInRole; } public String toString() { return getName(); } public void push (String roleName) { _roleStack.push(roleName); } public void pop () { _roleStack.pop(); } } /** * JBossNobodyUserPrincipal * Represents the default user. */ static class JBossNobodyUserPrincipal extends JBossUserPrincipal { public JBossNobodyUserPrincipal(Logger log) { _principal = new NobodyPrincipal(); this._logRef = log; if (log.isDebugEnabled()) log.debug("created JBossUserRealm::JBossNobodyUserPrincipal"); } public boolean isAuthenticated() { return true; } public boolean authenticate(String password, Request request) { return true; } } /** * JBossCertificatePrincipal * Represents a user which has been authenticated elsewhere * (e.g. at the fronting server), and thus doesnt have credentials * */ static class JBossCertificatePrincipal extends JBossUserPrincipal { private X509Certificate[] _certs; JBossCertificatePrincipal(String name, Logger log, X509Certificate[] certs) { super(name, log); _certs = certs; if (_logRef.isDebugEnabled()) _logRef.debug("created JBossUserRealm::JBossCertificatePrincipal: "+ name); } public boolean isAuthenticated() { // TODO I'm dubious if this is correct??? _logRef.debug("JBossUserRealm::isAuthenticated called"); return true; } public boolean authenticate() { boolean authenticated = false; if (_logRef.isDebugEnabled()) _logRef.debug("authenticating: Name:" + _principal); // Authenticate using the cert as the credential Subject subjectCopy = new Subject(); if (_realm._subjSecMgr != null && _realm._subjSecMgr.isValid(_principal, _certs, subjectCopy)) { if (_logRef.isDebugEnabled()) _logRef.debug("authenticated: " + _principal); SecurityAssociation.setPrincipal(_principal); SecurityAssociation.setCredential(_certs); SecurityAssociation.setSubject(subjectCopy); authenticated = true; } else { _logRef.warn("authentication failure: " + _principal); } return authenticated; } } public JBossUserRealm(String realmName, String subjAttrName) { _realmName = realmName; _log = Logger.getLogger(JBossUserRealm.class.getName() + "#"+ _realmName); _subjAttrName = subjAttrName; //always add a default user? JBossUserPrincipal nobody = new JBossNobodyUserPrincipal(_log); nobody.associateWithRealm(this); _users.put("nobody", nobody); } public void init() { _log.debug("initialising realm "+_realmName); try { InitialContext iniCtx = new InitialContext(); Context securityCtx = (Context) iniCtx.lookup("java:comp/env/security"); _authMgr = (AuthenticationManager) securityCtx.lookup("securityMgr"); _realmMapping = (RealmMapping) securityCtx.lookup("realmMapping"); iniCtx = null; if (_authMgr instanceof SubjectSecurityManager) _subjSecMgr = (SubjectSecurityManager) _authMgr; } catch (NamingException e) { _log.error("java:comp/env/security does not appear to be correctly set up", e); } _log.debug("...initialised"); } // this is going to cause contention - TODO private synchronized JBossUserPrincipal ensureUser(String userName) { JBossUserPrincipal user = (JBossUserPrincipal) _users.get(userName); if (user == null) { user = new JBossUserPrincipal(userName, _log); user.associateWithRealm(this); _users.put(userName, user); } return user; } public Principal getPrincipal(String username) { return (Principal) _users.get(username); } /** * @deprecated */ public Principal getUserPrincipal(String username) { return (Principal) _users.get(username); } public Principal authenticate(String userName, Object credential, Request request) { if (_log.isDebugEnabled()) _log.debug("JBossUserPrincipal: " + userName); // until we get DigestAuthentication sorted JBoss side... JBossUserPrincipal user = null; if (credential instanceof java.lang.String) // password { user = ensureUser(userName); if (!user.authenticate((String) credential, request)) { user = null; } } else if (credential instanceof X509Certificate[]) // certificate { X509Certificate[] certs = (X509Certificate[]) credential; user = this.authenticateFromCertificates(certs); } if (user != null) { request.setAuthType(javax.servlet.http.HttpServletRequest.CLIENT_CERT_AUTH); request.setUserPrincipal(user); } return user; } public boolean reauthenticate(Principal user) { return ((JBossUserPrincipal) user).isAuthenticated(); } /** * @deprecated Use reauthenticate */ public boolean isAuthenticated(Principal user) { return ((JBossUserPrincipal) user).isAuthenticated(); } public boolean isUserInRole(Principal user, String role) { return ((JBossUserPrincipal) user).isUserInRole(role); } public JBossUserPrincipal authenticateFromCertificates( X509Certificate[] certs) { JBossCertificatePrincipal user = (JBossCertificatePrincipal) _users .get(certs[0]); if (user == null) { user = new JBossCertificatePrincipal(getFilterFromCertificate(certs[0]), _log, certs); user.associateWithRealm(this); _users.put(certs[0], user); } if (user.authenticate()) { _log.debug("authenticateFromCertificates - authenticated"); return user; } _log.debug("authenticateFromCertificates - returning NULL"); return null; } /** * Takes an X509Certificate object and extracts the certificate's serial * number and issuer in order to construct a unique string representing that * certificate. * * @param cert the user's certificate. * @return an LDAP filter for retrieving the user's entry. */ private String getFilterFromCertificate(X509Certificate cert) { StringBuffer buff = new StringBuffer(); String serialNumber = cert.getSerialNumber().toString(16).toUpperCase(); if (serialNumber.length() % 2 != 0) buff.append("0"); buff.append(serialNumber); buff.append(" "); buff.append(cert.getIssuerDN().toString()); String filter = buff.toString(); return filter; } public void disassociate(Principal user) { SecurityAssociation.clear(); } public Principal pushRole(Principal user, String role) { RunAsIdentity runAs = new RunAsIdentity(role, (user==null?null:user.getName())); if (user==null) user = (JBossUserPrincipal)_users.get("nobody"); //set up security for Jetty ((JBossUserPrincipal)user).push(role); //set up security for calls to jboss ejbs SecurityAssociation.pushRunAsIdentity(runAs); return user; } public Principal popRole(Principal user) { ((JBossUserPrincipal)user).pop(); //clear a run-as role set for jboss ejb calls SecurityAssociation.popRunAsIdentity(); return user; } public void logout(Principal user) { // yukky hack to try and force JBoss to actually // flush the user from the jaas security manager's cache therefore // forcing logincontext.logout() to be called try { Principal pUser = user; if (user instanceof JBossUserPrincipal) pUser = ((JBossUserPrincipal) user)._principal; java.util.ArrayList servers = MBeanServerFactory.findMBeanServer(null); if (servers.size() != 1) _log.warn("More than one MBeanServer found, choosing first"); MBeanServer server = (MBeanServer) servers.get(0); server.invoke(new ObjectName("jboss.security:service=JaasSecurityManager"), "flushAuthenticationCache", new Object[] { getName(), pUser }, new String[] {"java.lang.String", "java.security.Principal" }); } catch (Exception e) { _log.error(e); } catch (Error err) { _log.error(err); } } /** * @param name The name of a Single Sign On realm. Realms that share a sso * realm will share authentication for users. Null if no SSO * realm. */ public void setSSORealmName(String name) { _ssoRealmName = name; _ssoRealm = null; } /** * @return The name of a Single Sign On realm. Realms that share a sso realm * will share authentication for users. Null if no SSO realm. */ public String getSSORealmName() { return _ssoRealmName; } public Credential getSingleSignOn(Request request, Response response) { if (!isSSORealm()) return null; Credential singleSignOnCredential = _ssoRealm.getSingleSignOn(request, response); if (_log.isDebugEnabled()) _log.debug("getSingleSignOn principal=" + request.getUserPrincipal() + " credential=" + singleSignOnCredential); return singleSignOnCredential; } public void setSingleSignOn(Request request, Response response, Principal principal, Credential credential) { if (!isSSORealm()) return; if (_log.isDebugEnabled()) _log.debug("setSingleSignOn called. principal=" + principal + " credential=" + credential); _ssoRealm.setSingleSignOn(request, response, principal, credential); } public void clearSingleSignOn(String username) { if (!isSSORealm()) return; if (_log.isDebugEnabled()) _log.debug("clearSingleSignOn called. username=" + username); _ssoRealm.clearSingleSignOn(username); SecurityAssociation.setPrincipal(null); SecurityAssociation.setCredential(null); } private boolean isSSORealm() { if (_ssoRealm == null && _ssoRealmName != null) { synchronized (_sharedHashSSORealms) { _ssoRealm = (HashSSORealm) _sharedHashSSORealms .get(_ssoRealmName); if (_ssoRealm == null) { _log.debug("created SSORealm for " + _ssoRealmName); _ssoRealm = new HashSSORealm(); _sharedHashSSORealms.put(_ssoRealmName, _ssoRealm); } } } return _ssoRealm != null; } public String getName() { return _realmName; } } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/management/0000755000175000017500000000000011745736514024062 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/management/JBossWebAppContextMBean.java0000644000175000017500000000355211145320743031304 0ustar moonmoon//======================================================================== //$Id: JBossWebAppContextMBean.java 2548 2008-03-28 09:00:37Z gregw $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.jboss.jetty.management; import javax.management.ObjectName; import org.jboss.jetty.JBossWebAppContext; import org.mortbay.jetty.webapp.management.WebAppContextMBean; import org.mortbay.log.Log; /** * JBossWebApplicationContextMBean * * Provides special object name for itself so that * we can integrate with jboss jsr77 management system. */ public class JBossWebAppContextMBean extends WebAppContextMBean { private JBossWebAppContext _webAppContext; public JBossWebAppContextMBean(Object managedObject) { super(managedObject); _webAppContext = (JBossWebAppContext)managedObject; } public ObjectName getObjectName() { ObjectName oname = null; try { oname = new ObjectName(getMBeanContainer().getDomain()+":J2EEServer=none,J2EEApplication=none,J2EEWebModule="+_webAppContext.getUniqueName()); } catch (Exception e) { Log.warn(e); } return oname; } } jetty-6.1.26/contrib/jboss/src/main/java/org/jboss/jetty/jmx/0000755000175000017500000000000011745736514022544 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/0000755000175000017500000000000011745736514021144 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736514022303 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/servlet/0000755000175000017500000000000011745736514023767 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/servlet/jsr77/0000755000175000017500000000000011745736514024743 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/servlet/jsr77/Jsr77ServletHandler.java0000644000175000017500000000331611145320743031353 0ustar moonmoon//======================================================================== //$Id: Jsr77ServletHandler.java 1208 2006-11-13 21:38:44Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.servlet.jsr77; import org.mortbay.jetty.servlet.ServletHandler; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.jetty.webapp.WebAppContext; public class Jsr77ServletHandler extends ServletHandler { WebAppContext _webAppContext; public void setWebAppContext(WebAppContext wac) { _webAppContext = wac; } public WebAppContext getWebAppContext () { return _webAppContext; } public ServletHolder newServletHolder () { Jsr77ServletHolder holder = new Jsr77ServletHolder(); holder.setWebAppContext(_webAppContext); return holder; } public ServletHolder newServletHolder(Class servlet) { Jsr77ServletHolder holder = new Jsr77ServletHolder(servlet); holder.setWebAppContext(_webAppContext); return holder; } } jetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/servlet/jsr77/Jsr77ServletHolder.java0000644000175000017500000000527111145320743031215 0ustar moonmoon//======================================================================== //$Id: Jsr77ServletHolder.java 1216 2006-11-14 14:53:40Z janb $ //Copyright 2006 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.servlet.jsr77; import java.io.IOException; import java.util.Map; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.UnavailableException; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.jetty.webapp.WebAppContext; public class Jsr77ServletHolder extends ServletHolder { private ServletStatsImpl _servletStats = null; private WebAppContext _webAppContext = null; public Jsr77ServletHolder() { } public Jsr77ServletHolder(Servlet servlet) { super(servlet); } public Jsr77ServletHolder(Class servlet) { super(servlet); } public WebAppContext getWebAppContext() { return _webAppContext; } public void setWebAppContext(WebAppContext wac) { _webAppContext = wac; } public void doStart() throws Exception { super.doStart(); _servletStats = new ServletStatsImpl(getName()); } public void handle(ServletRequest request, ServletResponse response) throws ServletException, UnavailableException, IOException { long startTime =0L; long endTime = 0L; try { //start statistic gathering - get the name of Servlet for which this filter will apply, and therefore //on whose behalf we are gathering statistics??? startTime = System.currentTimeMillis(); super.handle(request, response); } finally { //finish statistic gathering endTime = System.currentTimeMillis(); TimeStatisticImpl statistic = (TimeStatisticImpl)_servletStats.getServiceTime(); statistic.addSample(endTime-startTime, endTime); } } public ServletStatsImpl getServletStats() { return this._servletStats; } } jetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/servlet/jsr77/ServletStatsImpl.java0000644000175000017500000000567511145320743031073 0ustar moonmoon//======================================================================== //$Id: ServletStatsImpl.java 1195 2006-11-12 23:02:51Z janb $ //Copyright 200-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.servlet.jsr77; import java.io.Serializable; import javax.management.j2ee.statistics.Statistic; import javax.management.j2ee.statistics.TimeStatistic; /** * Jsr77ServletStats * * Implementation of ServletStats from JSR77 specification. * * @author janb */ public class ServletStatsImpl implements javax.management.j2ee.statistics.ServletStats, Serializable { private static final String[] statisticNames = new String[]{"ServiceTime"}; private TimeStatisticImpl statistic = null; private TimeStatisticImpl[] statistics = new TimeStatisticImpl[1]; private String name = null; public ServletStatsImpl (String servletName) { name = servletName; statistic = new TimeStatisticImpl(this, statisticNames[0], "Servlet service method performance statistics", "MILLISECONDS"); statistic.setStartTime(); statistics[0] = statistic; } /** * * @see javax.management.j2ee.statistics.ServletStats#getServiceTime() */ public TimeStatistic getServiceTime () { return statistic; } /** Get the TimeStatistic * @see javax.management.j2ee.statistics.Stats#getStatistic(java.lang.String) */ public Statistic getStatistic (String statisticName) { if (statisticNames[0].equalsIgnoreCase(statisticName)) return statistic; return null; } /** Get the names of supported statistics. * For ServletStats, only the TimeStatistic is supported * @see javax.management.j2ee.statistics.Stats#getStatisticNames() */ public String[] getStatisticNames () { return statisticNames; } /** Get an object of all the types of statistics supported. * For ServletStats, only the TimeStatistic is supported. * @see javax.management.j2ee.statistics.Stats#getStatistics() */ public Statistic[] getStatistics () { return statistics; } public String getName () { return name; } public String toString () { return statistic.toString(); } } jetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/servlet/jsr77/TimeStatisticImpl.java0000644000175000017500000001175111145320743031206 0ustar moonmoon//======================================================================== //$Id: TimeStatisticImpl.java 1195 2006-11-12 23:02:51Z janb $ //Copyright 200-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.servlet.jsr77; /** * @author janb * * To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ public class TimeStatisticImpl implements javax.management.j2ee.statistics.TimeStatistic { private static final String HOUR = "HOUR"; private static final String MICROSECOND = "MICROSECOND"; private static final String MILLISECONDS = "MILLISECONDS"; private static final String MINUTE = "MINUTE"; private static final String NANOSECOND = "NANOSECOND"; private static final String SECOND = "SECOND"; private ServletStatsImpl servletStats = null; private long count = 0; private long maxTime = 0; private long minTime = 0; private long totalTime = 0; private long startTime = 0; private long lastSampleTime = 0; private String name = null; private String description = null; private String units = null; public TimeStatisticImpl (ServletStatsImpl servletStats, String name, String description, String unit) { setServletStats(servletStats); setName (name); setDescription (description); setUnit (unit); } /** Return number of times statistic has been gathered. * @see javax.management.j2ee.statistics.TimeStatistic#getCount() */ public long getCount () { return count; } /** Return max value of statistic. * @see javax.management.j2ee.statistics.TimeStatistic#getMaxTime() */ public long getMaxTime () { return maxTime; } /** Return min value of statistic. * @see javax.management.j2ee.statistics.TimeStatistic#getMinTime() */ public long getMinTime () { return minTime; } /** Return total time of statistic * @see javax.management.j2ee.statistics.TimeStatistic#getTotalTime() */ public long getTotalTime () { return totalTime; } /** Return name of statistic * @see javax.management.j2ee.statistics.Statistic#getName() */ public String getName () { return name; } public void setName (String n) { name = n; } /** Return units of statistic * @see javax.management.j2ee.statistics.Statistic#getUnit() */ public String getUnit () { return units; } public void setUnit (String u) { units = u; } /** Human readable description of statistic * @see javax.management.j2ee.statistics.Statistic#getDescription() */ public String getDescription () { return description; } public void setDescription (String s) { description = s; } /** Get the time the statistic began to be gathered. * As milliseconds since the last epoch. * @see javax.management.j2ee.statistics.Statistic#getStartTime() */ public long getStartTime () { return startTime; } public void setStartTime () { startTime = System.currentTimeMillis(); } /** Get the time of the last sample. * As milliseconds since the epoch. * @see javax.management.j2ee.statistics.Statistic#getLastSampleTime() */ public long getLastSampleTime () { return lastSampleTime; } public void setServletStats (ServletStatsImpl stats) { servletStats = stats; } public synchronized void addSample (long sample, long time) { count ++; if (sample > maxTime) maxTime = sample; if ((sample < minTime) || (minTime == 0)) minTime = sample; lastSampleTime = time; totalTime = totalTime + sample; } public String toString () { return "Name="+getName()+ ", Description="+getDescription()+ ", Units="+getUnit()+ ", StartTime="+getStartTime()+ ", Count="+getCount()+ ", MinTime="+getMinTime()+ ", MaxTime="+getMaxTime()+ ", TotalTime="+getTotalTime()+ ", LastSampleTime="+getLastSampleTime(); } } jetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/servlet/jsr77/management/0000755000175000017500000000000011745736514027057 5ustar moonmoon././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootjetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/servlet/jsr77/management/Jsr77ServletHolderMBean.javajetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/jetty/servlet/jsr77/management/Jsr77ServletHold0000644000175000017500000001131711145320743032060 0ustar moonmoon//======================================================================== //$Id: Jsr77ServletHolderMBean.java 1259 2006-11-19 16:00:48Z janb $ //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.servlet.jsr77.management; import javax.management.MBeanException; import javax.management.ObjectName; import javax.management.j2ee.statistics.ServletStats; import org.jboss.jetty.JBossWebAppContext; import org.mortbay.jetty.servlet.jsr77.Jsr77ServletHolder; import org.mortbay.management.ObjectMBean; import org.mortbay.log.Log; /** * * Jsr77ServletHolderMBean * * @author janb * @version $Revision: 1259 $ $Date: 2006-11-19 10:00:48 -0600 (Sun, 19 Nov 2006) $ * */ public class Jsr77ServletHolderMBean extends ObjectMBean { private Jsr77ServletHolder _servletHolder = null; private ServletStats _stats; public Jsr77ServletHolderMBean (Object managedObject) throws MBeanException { super(managedObject); _servletHolder = (Jsr77ServletHolder)managedObject; } /**StatisticsProvider * As per the jsr77 spec, we are providing statistics for a * servlet * @return true */ public boolean getStatisticsProvider () { return true; } /**ServletStats * @return the JSR77 servlet stats for the servlet we represent */ public ServletStats getStats () { getJsr77Stats(); return _stats; } /**MaxTime * Necessary for JBoss's JSR77 impl. * @return the max service time statistic */ public Long getMaxTime () { getJsr77Stats(); if (null==_stats) return new Long(0L); return new Long(_stats.getServiceTime().getMaxTime()); } /**MinTime * Necessary for JBoss's JSR77 impl. * @return the min service time statistic */ public Long getMinTime () { getJsr77Stats(); if (null==_stats) return new Long(0L); return new Long(_stats.getServiceTime().getMinTime()); } /**Satisfying JBoss's JSR77 impl * @return */ public Long getProcessingTime () { return new Long(getTotalTime()); } /**Satisfying JBoss's JSR77 impl * @return */ public Integer getRequestCount () { return new Integer((int)getCount()); } /**Count * Convenience method. Also helpful for JBoss's JSR77 impl. * @return the number of times the servlet service() method has been called. */ private long getCount () { getJsr77Stats(); if (null==_stats) return 0L; return _stats.getServiceTime().getCount(); } /**TotalTime * Convenience method. Also helpful for JBoss's JSR77 impl. * @return the total time spent in the servlet's service() method. */ private long getTotalTime() { getJsr77Stats(); if (null==_stats) return 0L; return _stats.getServiceTime().getTotalTime(); } /** Jsr77Stats * Lookup the statistic object for the servlet we represent. * Statistics are captured by a filter placed in front of each servlet. */ private void getJsr77Stats () { if (null==_stats) { if (null==_servletHolder) return; _stats = _servletHolder.getServletStats(); } } public ObjectName getObjectName() { if (getMBeanContainer() == null) return null; //not possible to make a name String name = _servletHolder.getName(); ObjectName oname = null; try { oname = new ObjectName(getMBeanContainer().getDomain()+":J2EEServer=none,J2EEApplication=none,J2EEWebModule="+((JBossWebAppContext)_servletHolder.getWebAppContext()).getUniqueName()+",j2eeType=Servlet,name="+name); } catch (Exception e) { Log.warn(e); } return oname; } } jetty-6.1.26/contrib/jboss/src/main/java/org/mortbay/j2ee/0000755000175000017500000000000011745736514021771 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/resources/0000755000175000017500000000000011745736514017771 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/resources/META-INF/0000755000175000017500000000000011745736514021131 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/resources/META-INF/webserver-xmbean.xml0000644000175000017500000000712711145320743025121 0ustar moonmoon Jetty Web Server for webapp deployment org.jboss.jetty.JettyService MBean Constructor. org.jboss.jetty.JettyService MBean Attribute. SupportJSR77 boolean MBean Attribute. WebDefaultResource java.lang.String MBean Attribute. Java2ClassLoadingCompliance boolean MBean Attribute. AcceptNonWarDirs boolean MBean Attribute. SubjectAttributeName java.lang.String DefaultSecurityDomain java.lang.String MBean Attribute. UnpackWars boolean MBean Attribute. Config org.w3c.dom.Element MBean Attribute. LenientEjbLink boolean MBean Attribute. DefaultSecurityDomain java.lang.String MBean Attribute. ConfigurationElement org.w3c.dom.Element MBean Attribute. EnhancedSuffixes [Ljava.lang.String; &deployerAttributes; &defaultAttributes; &deployerOperations; &defaultOperations; &interceptable; jetty-6.1.26/contrib/jboss/src/main/resources/META-INF/jboss-service.xml0000644000175000017500000001402511255605107024420 0ustar moonmoon webdefault.xml true true false j_subject java:/jaas/other 10 20 200 2 30000 2 8443 jetty-6.1.26/contrib/jboss/src/main/resources/webdefault.xml0000644000175000017500000005121711145320743022626 0ustar moonmoon Default web.xml file. This file is applied to a Web application before it's own WEB_INF/web.xml file default org.mortbay.jetty.servlet.DefaultServlet acceptRanges true dirAllowed true redirectWelcome false maxCacheSize 2000000 maxCachedFileSize 254000 maxCachedFiles 1000 useFileMappedBuffer true 0 default / jsp org.apache.jasper.servlet.JspServlet logVerbosityLevel DEBUG fork false xpoweredBy false 0 jsp *.jsp *.jspf *.jspx *.xsp *.JSP *.JSPF *.JSPX *.XSP 30 index.html index.htm index.jsp arISO-8859-6 beISO-8859-5 bgISO-8859-5 caISO-8859-1 csISO-8859-2 daISO-8859-1 deISO-8859-1 elISO-8859-7 enISO-8859-1 esISO-8859-1 etISO-8859-1 fiISO-8859-1 frISO-8859-1 hrISO-8859-2 huISO-8859-2 isISO-8859-1 itISO-8859-1 iwISO-8859-8 jaShift_JIS koEUC-KR ltISO-8859-2 lvISO-8859-2 mkISO-8859-5 nlISO-8859-1 noISO-8859-1 plISO-8859-2 ptISO-8859-1 roISO-8859-2 ruISO-8859-5 shISO-8859-5 skISO-8859-2 slISO-8859-2 sqISO-8859-2 srISO-8859-5 svISO-8859-1 trISO-8859-9 ukISO-8859-5 zhGB2312 zh_TWBig5 jetty-6.1.26/contrib/jboss/src/main/resources/org/0000755000175000017500000000000011745736514020560 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/resources/org/mortbay/0000755000175000017500000000000011745736514022235 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/resources/org/mortbay/jetty/0000755000175000017500000000000011745736514023374 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/resources/org/mortbay/jetty/servlet/0000755000175000017500000000000011745736514025060 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/resources/org/mortbay/jetty/servlet/jsr77/0000755000175000017500000000000011745736514026034 5ustar moonmoonjetty-6.1.26/contrib/jboss/src/main/resources/org/mortbay/jetty/servlet/jsr77/management/0000755000175000017500000000000011745736514030150 5ustar moonmoon././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootjetty-6.1.26/contrib/jboss/src/main/resources/org/mortbay/jetty/servlet/jsr77/management/Jsr77ServletHolder-mbean.propertiesjetty-6.1.26/contrib/jboss/src/main/resources/org/mortbay/jetty/servlet/jsr77/management/Jsr77Servle0000644000175000017500000000045511145320743032157 0ustar moonmoonJsr77ServletHolder: Jsr77 Servlet Holder statisticsProvider: MBean:RO: is a statistics provider stats: MBean:RO:statistics maxTime: MBean: RO: max execution time minTime: MBean: RO: min execution time processingTime: MBean: RO: total execution time requestCount: MBean: RO: number of requests handled jetty-6.1.26/contrib/jboss/pom.xml0000644000175000017500000001032211466510475015553 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jboss-jetty jboss-sar Jetty JBoss 4.2.3.GA jetty-${project.version}-jboss-${jboss.version}-jsp-2.1 org.codehaus.mojo jboss-packaging-maven-plugin 2.0-beta-1 true jboss-repo jboss http://repository.jboss.com/maven2 default Codehaus Snapshots http://snapshots.repository.codehaus.org/ true false org.mortbay.jetty jetty ${project.version} org.mortbay.jetty jsp-2.1-jetty ${project.version} org.slf4j slf4j-log4j12 1.0.1 org.mortbay.jetty jetty-ajp ${project.version} org.mortbay.jetty jetty-sslengine ${project.version} org.mortbay.jetty jetty-management ${project.version} mx4j mx4j mx4j mx4j-tools jboss jboss ${jboss.version} provided jboss jboss-common ${jboss.version} provided jboss jboss-system ${jboss.version} provided jboss jboss-jmx ${jboss.version} provided jboss jbosssx ${jboss.version} provided jboss jboss-j2ee ${jboss.version} provided org.apache.geronimo.specs geronimo-j2ee-management_1.0_spec 1.1 provided jetty-6.1.26/contrib/jboss/README.txt0000644000175000017500000000173211145320743015730 0ustar moonmoon For full information to build jetty jboss, see http://docs.codehaus.org/display/JETTY/JBoss To build: -------- mvn -P[jdk1.4|jdk1.5] -Djboss.version=4.0.x -Djboss.home=/path/to/jboss-4.0.x clean install Note: you must select either the jdk1.4 or the jdk1.5 profile. This will build with either jsp-2.0 or jsp-2.1 respectively. To install: ---------- 1. delete $JBOSS-HOME/server/default/deploy/jbossweb-tomcat55.sar (or from whichever deploy directory you are using) 2. ensure you have built the Jetty JBoss module in $jetty.home/extras/jboss 3. copy the $jetty.home/extras/jboss/target/jetty-JETTY-VERSION-jboss-JBOSS-VERSION.sar to your JBoss deploy directory (where JETTY-VERSION is the version of jetty you are using and JBOSS-VERSION is the version of JBoss). 4. edit $JBOSS-HOME/server/default/deploy/management/console-mgr.sar/web-console.war/WEB-INF/web.xml and remove servlet and servlet-mapping for Status Servlet (tomcat specific) jetty-6.1.26/contrib/wadi/0000755000175000017500000000000011745736515014051 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/0000755000175000017500000000000011745736515014640 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/test/0000755000175000017500000000000011745736515015617 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/test/groovy/0000755000175000017500000000000011745736515017144 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/test/groovy/org/0000755000175000017500000000000011745736515017733 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/test/groovy/org/mortbay/0000755000175000017500000000000011745736515021410 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/test/groovy/org/mortbay/jetty/0000755000175000017500000000000011745736515022547 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/test/groovy/org/mortbay/jetty/servlet/0000755000175000017500000000000011745736515024233 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/test/groovy/org/mortbay/jetty/servlet/wadi/0000755000175000017500000000000011745736515025157 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/test/groovy/org/mortbay/jetty/servlet/wadi/IntegrationTest.groovy0000644000175000017500000001567311076117615031554 0ustar moonmoonpackage org.mortbay.jetty.servlet.wadi import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit import org.apache.commons.logging.Log import org.apache.commons.logging.LogFactory import org.mortbay.jetty.servlet.wadi.IntegrationTest import org.apache.commons.httpclient.HttpClient import org.apache.commons.httpclient.HttpMethodRetryHandler import org.apache.commons.httpclient.params.HttpMethodParams import org.apache.commons.httpclient.methods.GetMethod class IntegrationTest extends GroovyTestCase { static final def LOG = LogFactory.getLog(IntegrationTest.class.name) // Implementation note: we are using a number of clients sufficient big to increase the probability of having // client HTTP session locations tracked by partitions owned by distinct nodes. static final def NUMBER_CLIENTS = 24 static final def MVN = 'mvn' static final def EXECUTE_GOAL = 'org.codehaus.groovy.maven:gmaven-plugin:execute' def exitProcess = { port, process -> def getMethod = new GetMethod("http://localhost:${port}/exit") try { new HttpClient().executeMethod(getMethod) } catch (Exception e) { } finally { getMethod.releaseConnection() } process.destroy() } def launchProcess = { port, node -> def mvn = MVN String osName = System.getProperty("os.name" ) if (osName.contains('Windows')) { mvn = "cmd /c ${mvn}" } def process = "${mvn} -o -Dport=${port} -Dnode=${node} ${EXECUTE_GOAL}".execute() def processStartedLatch = new CountDownLatch(1) def readIS = { Object[] args -> process.inputStream.eachLine { line -> LOG.info(line) if (line.endsWith("Started SelectChannelConnector@0.0.0.0:${port}")) { processStartedLatch.countDown() } } } as Runnable new Thread(readIS).start() def readES = { Object[] args -> process.errorStream.eachLine { line -> LOG.error(line) } } as Runnable new Thread(readES).start() assert processStartedLatch.await(30l, TimeUnit.SECONDS) exitProcess.curry(port, process) } def incrementCounter = { port, httpClient, expectedCounter -> def getMethod = new GetMethod("http://localhost:${port}/counter") def noRetryHandler = { method, exception, executionCount -> executionCount < 2} as HttpMethodRetryHandler getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, noRetryHandler); try { assert 200 == httpClient.executeMethod(getMethod) def actualCounter = getMethod.responseBodyAsString assert expectedCounter + '' == actualCounter } finally { getMethod.releaseConnection() } } def counter = 0 def httpClients def launchProcess8080 def killProcess8080 def incrementCounter8080 def launchProcess8081 def killProcess8081 def incrementCounter8081 protected void setUp() { httpClients = new HttpClient[NUMBER_CLIENTS] for (i in 0..NUMBER_CLIENTS - 1) { httpClients[i] = new HttpClient() } launchProcess8080 = { -> killProcess8080 = launchProcess(8080, 'red') } launchProcess8080() incrementCounter8080 = incrementCounter.curry(8080) launchProcess8081 = { -> killProcess8081 = launchProcess(8081, 'yellow') } launchProcess8081() incrementCounter8081 = incrementCounter.curry(8081) } protected void tearDown() { if (killProcess8080) { killProcess8080() } if (killProcess8081) { killProcess8081() } } public void testWADIIntegration() { sessionsAreMigratedFrom8080To8081() sessionsAreRestoredOn8080After8081Crash() sessionsAreMigratedFrom8080To8081After8081Crash() singletonPartitionBalancerIsOwnedBy8081After8080CrashAndRestart() // Implementation note: skip this test for now as it fails on Windows. //sessionsAreReplicatedBy8080AtTheSameTimeThan8081Crash() } def sessionsAreMigratedFrom8080To8081() { httpClients.each { httpClient -> incrementCounter8080(httpClient, counter + 1) incrementCounter8081(httpClient, counter + 2) } counter += 2 } def sessionsAreRestoredOn8080After8081Crash() { killProcess8081() httpClients.each { httpClient -> shouldFail({incrementCounter8081(it, -1)}) } counter++ httpClients.each { httpClient -> incrementCounter8080(httpClient, counter) } } def sessionsAreMigratedFrom8080To8081After8081Crash() { launchProcess8081() counter++ httpClients.each { httpClient -> incrementCounter8081(httpClient, counter) } } def singletonPartitionBalancerIsOwnedBy8081After8080CrashAndRestart() { killProcess8080() launchProcess8080() counter++ httpClients.each { httpClient -> incrementCounter8080(httpClient, counter) } } def sessionsAreReplicatedBy8080AtTheSameTimeThan8081Crash() { def httpClientsStartLatch = new CountDownLatch(1) def httpClientsFinishedLatch = new CountDownLatch(NUMBER_CLIENTS) def monitor = new Object() def killed = false httpClients.each { httpClient -> def httpClientCountinuousPingTask = { Object[] args -> httpClientsStartLatch.await(2, TimeUnit.SECONDS) for (i in counter + 1..counter + 100) { incrementCounter8080(httpClient, i) if (i == counter + 50) { synchronized (monitor) { if (!killed) { killProcess8081() } killed = true } } } httpClientsFinishedLatch.countDown() } as Runnable new Thread(httpClientCountinuousPingTask).start() } httpClientsStartLatch.countDown() def clientFinished = httpClientsFinishedLatch.await(20l, TimeUnit.SECONDS) if (!clientFinished) { assert false : 'HTTP Clients have not finished after 20s.' } counter += 100 launchProcess8081() counter++ httpClients.each { httpClient -> incrementCounter8081(httpClient, counter) } } }jetty-6.1.26/contrib/wadi/src/test/resources/0000755000175000017500000000000011745736515017631 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/test/resources/log4j.properties0000644000175000017500000000066011076117615022757 0ustar moonmoonlog4j.rootCategory=INFO, LOGFILE log4j.logger.org.codehaus.wadi=DEBUG, LOGFILE log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=${basedir}/target/surefire-reports/tests.log log4j.appender.LOGFILE.Append=false log4j.appender.LOGFILE.Threshold=DEBUG log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %t %c{1} - %m%n jetty-6.1.26/contrib/wadi/src/main/0000755000175000017500000000000011745736515015564 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/main/java/0000755000175000017500000000000011745736515016505 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/main/java/org/0000755000175000017500000000000011745736515017274 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/0000755000175000017500000000000011745736515020751 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736515022110 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/0000755000175000017500000000000011745736515023574 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/0000755000175000017500000000000011745736515024520 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/WadiSessionAdaptor.java0000644000175000017500000000222110572747467031130 0ustar moonmoonpackage org.mortbay.jetty.servlet.wadi; import java.util.Collection; import java.util.Map; import java.util.Set; import org.codehaus.wadi.core.session.Session; public class WadiSessionAdaptor implements WadiSession { private final Session session; public WadiSessionAdaptor(Session session) { this.session = session; } public String getSessionId() { return session.getName(); } public void release() { try { session.destroy(); } catch (Exception e) { throw new IllegalStateException("Cannot release session " + session); } } public Object addState(String key, Object value) { return session.addState(key, value); } public Object getState(String key) { return session.getState(key); } public Object removeState(String key) { return session.removeState(key); } public Map getState() { return session.getState(); } public void onEndAccess() { session.onEndProcessing(); } } jetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/WadiSessionManager.java0000644000175000017500000002667610711217536031114 0ustar moonmoonpackage org.mortbay.jetty.servlet.wadi; import java.net.URI; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.codehaus.wadi.aop.replication.AOPStackContext; import org.codehaus.wadi.core.assembler.StackContext; import org.codehaus.wadi.core.manager.Manager; import org.codehaus.wadi.core.manager.SessionAlreadyExistException; import org.codehaus.wadi.core.manager.SessionMonitor; import org.codehaus.wadi.core.store.Store; import org.codehaus.wadi.replication.strategy.BackingStrategyFactory; import org.codehaus.wadi.replication.strategy.RoundRobinBackingStrategyFactory; import org.codehaus.wadi.servicespace.ServiceSpace; import org.codehaus.wadi.servicespace.ServiceSpaceName; import org.mortbay.jetty.servlet.AbstractSessionManager; import org.mortbay.jetty.servlet.HashSessionIdManager; import edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArrayList; public class WadiSessionManager extends AbstractSessionManager { private final Map _idToSession = new HashMap(); private BackingStrategyFactory _backingStrategyFactory; private WadiCluster _wadiCluster; private CopyOnWriteArrayList _listeners; private Manager _manager; private SessionMonitor _sessionMonitor; private ServiceSpace _serviceSpace; private int _nbReplica; private int _numPartitions; private int _sweepInterval; private final boolean _enableReplication; private final boolean _deltaReplication; private Store _sharedStore; public WadiSessionManager(WadiCluster wadiCluster, int numPartitions, int sweepInterval) { this(wadiCluster, 0, numPartitions, sweepInterval, false, false); } public WadiSessionManager(WadiCluster wadiCluster, int nbReplica, int numPartitions, int sweepInterval) { this(wadiCluster, nbReplica, numPartitions, sweepInterval, true, false); } /** * Constructs a session manager attached to the provided cluster. * * @param wadiCluster cluster this session manager is attached to. * @param nbReplica number of replicas to be maintained for each sessions managed by this session manager. When a * session is created or updated, it is replicated to a configurable number of other nodes. * @param numPartitions WADI maintains a distributed and indexed look-up map tracking HttpSession locations. * numPartitions is the number of indexes of this look-up map. A standard number of partitions is 24. * @param sweepInterval number of seconds between the execution of HttpSession eviction policies. In other words, * it is how often HttpSessions are scanned to identify and invalidate timed out sessions * @param enableReplication if true, then sessions are replicated to other nodes. The number of replicas is * configured by nbReplica. */ public WadiSessionManager(WadiCluster wadiCluster, int nbReplica, int numPartitions, int sweepInterval, boolean enableReplication, boolean deltaReplication) { _wadiCluster = wadiCluster; _nbReplica = nbReplica; _numPartitions = numPartitions; _sweepInterval = sweepInterval; _enableReplication = enableReplication; _deltaReplication = deltaReplication; _listeners = new CopyOnWriteArrayList(); HashSessionIdManager sessionIdManager = new HashSessionIdManager(); sessionIdManager.setWorkerName(wadiCluster.getNodeName()); setIdManager(sessionIdManager); registerListener(new MigrationListener()); } public Store getSharedStore() { return _sharedStore; } public void setSharedStore(Store store) { _sharedStore = store; } public void doStart() throws Exception { super.doStart(); _backingStrategyFactory = new RoundRobinBackingStrategyFactory(_nbReplica); ServiceSpaceName serviceSpaceName = new ServiceSpaceName(new URI(_context.getContextPath() + "/")); StackContext stackContext; if (_deltaReplication) { stackContext = new AOPStackContext(Thread.currentThread().getContextClassLoader(), serviceSpaceName, _wadiCluster.getDispatcher(), _dftMaxIdleSecs, _numPartitions, _sweepInterval, _backingStrategyFactory); } else { stackContext = new StackContext(Thread.currentThread().getContextClassLoader(), serviceSpaceName, _wadiCluster.getDispatcher(), _dftMaxIdleSecs, _numPartitions, _sweepInterval, _backingStrategyFactory); } stackContext.setSharedStore(_sharedStore); stackContext.setDisableReplication(!_enableReplication); stackContext.build(); _serviceSpace = stackContext.getServiceSpace(); _manager = stackContext.getManager(); _sessionMonitor = stackContext.getSessionMonitor(); _sessionMonitor.addSessionListener(new SessionListenerAdapter()); _serviceSpace.start(); } public void doStop() throws Exception { _serviceSpace.stop(); super.doStop(); } public Manager getClusteredManager() { return _manager; } public WadiSession createSession(String sessionId) throws SessionAlreadyExistsException { org.codehaus.wadi.core.session.Session session; try { session = _manager.createWithName(sessionId); } catch (SessionAlreadyExistException e) { throw new SessionAlreadyExistsException(sessionId); } return new WadiSessionAdaptor(session); } public void registerListener(SessionListener listener) { _listeners.add(listener); } public void unregisterListener(SessionListener listener) { _listeners.remove(listener); } private void notifyInboundSessionMigration(org.codehaus.wadi.core.session.Session session) { for (Iterator iter = _listeners.iterator(); iter.hasNext();) { SessionListener listener = (SessionListener) iter.next(); listener.notifyInboundSessionMigration(new WadiSessionAdaptor(session)); } } private void notifyOutboundSessionMigration(org.codehaus.wadi.core.session.Session session) { for (Iterator iter = _listeners.iterator(); iter.hasNext();) { SessionListener listener = (SessionListener) iter.next(); listener.notifyOutboundSessionMigration(new WadiSessionAdaptor(session)); } } private void notifySessionDestruction(org.codehaus.wadi.core.session.Session session) { for (Iterator iter = _listeners.iterator(); iter.hasNext();) { SessionListener listener = (SessionListener) iter.next(); listener.notifySessionDestruction(new WadiSessionAdaptor(session)); } } private class SessionListenerAdapter implements org.codehaus.wadi.core.manager.SessionListener { public void onSessionCreation(org.codehaus.wadi.core.session.Session session) { } public void onSessionDestruction(org.codehaus.wadi.core.session.Session session) { notifySessionDestruction(session); } public void onInboundSessionMigration(org.codehaus.wadi.core.session.Session session) { notifyInboundSessionMigration(session); } public void onOutbountSessionMigration(org.codehaus.wadi.core.session.Session session) { notifyOutboundSessionMigration(session); } } protected Session newSession(HttpServletRequest request) { return new ClusteredSession(request); } public void complete(HttpSession session) { ClusteredSession clusteredSession = (ClusteredSession) session; clusteredSession.session.onEndAccess(); } protected void addSession(Session session) { ClusteredSession clusteredSession = (ClusteredSession) session; synchronized (_idToSession) { _idToSession.put(clusteredSession.getClusterId(), clusteredSession); } } protected void removeSession(String idInCluster) { // Let MigrationListener handle session removal } public Session getSession(String idInCluster) { synchronized (_idToSession) { return _idToSession.get(idInCluster); } } public int getSessions() { synchronized (_idToSession) { return _idToSession.size(); } } public Map getSessionMap() { throw new AssertionError("getSessionMap is never used."); } protected void invalidateSessions() { } private class MigrationListener implements SessionListener { public void notifyInboundSessionMigration(WadiSession session) { addSession(new ClusteredSession(session), false); } public void notifyOutboundSessionMigration(WadiSession session) { ClusteredSession clusteredSession = getClusteredSession(session); removeSession(clusteredSession, false); } public void notifySessionDestruction(WadiSession session) { ClusteredSession clusteredSession = getClusteredSession(session); removeSession(clusteredSession, true); } private ClusteredSession getClusteredSession(WadiSession session) throws AssertionError { ClusteredSession clusteredSession; synchronized (_idToSession) { clusteredSession = _idToSession.remove(session.getSessionId()); } if (null == clusteredSession) { throw new AssertionError("Session [" + session + "] is undefined"); } return clusteredSession; } } public class ClusteredSession extends Session { private final WadiSession session; protected ClusteredSession(HttpServletRequest request) { super(request); try { this.session = createSession(getClusterId()); } catch (SessionAlreadyExistsException e) { throw (IllegalStateException) new IllegalStateException().initCause(e); } initValues(); } protected ClusteredSession(WadiSession session) { super(System.currentTimeMillis(), session.getSessionId()); this.session = session; initValues(); } protected Map newAttributeMap() { return session.getState(); } protected String getClusterId() { return super.getClusterId(); } public void invalidate() throws IllegalStateException { super.doInvalidate(); session.release(); } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/SessionAlreadyExistsException.javajetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/SessionAlreadyExistsException0000644000175000017500000000076310565041647032447 0ustar moonmoonpackage org.mortbay.jetty.servlet.wadi; public class SessionAlreadyExistsException extends Exception { public SessionAlreadyExistsException() { super(); } public SessionAlreadyExistsException(String arg0, Throwable arg1) { super(arg0, arg1); } public SessionAlreadyExistsException(String arg0) { super(arg0); } public SessionAlreadyExistsException(Throwable arg0) { super(arg0); } } jetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/WadiCluster.java0000644000175000017500000000544210711217536027603 0ustar moonmoonpackage org.mortbay.jetty.servlet.wadi; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import org.apache.catalina.tribes.Member; import org.codehaus.wadi.core.reflect.base.DeclaredMemberFilter; import org.codehaus.wadi.core.reflect.jdk.JDKClassIndexerRegistry; import org.codehaus.wadi.group.Dispatcher; import org.codehaus.wadi.group.DispatcherRegistry; import org.codehaus.wadi.group.StaticDispatcherRegistry; import org.codehaus.wadi.servicespace.admin.AdminServiceSpace; import org.codehaus.wadi.tribes.TribesDispatcher; import org.codehaus.wadi.web.impl.URIEndPoint; import org.mortbay.component.AbstractLifeCycle; public class WadiCluster extends AbstractLifeCycle { private final String _clusterName; private final String _nodeName; private final URI _endPointURI; private final Collection _staticMembers; private Dispatcher _dispatcher; /** * Constructs a cluster having the specified details. * * @param clusterName name of the cluster. * @param nodeName name of the node this cluster instance is running on * @param endPointURI base URL to use from other nodes to reach this node. This value is actually not used and you * pretty much do not need to define a meaningful value; however, it must be a valid URI. * * @throws Exception */ public WadiCluster(String clusterName, String nodeName, String endPointURI) throws Exception { if (null == clusterName) { throw new IllegalArgumentException("clusterName is required"); } else if (null == nodeName) { throw new IllegalArgumentException("nodeName is required"); } _clusterName = clusterName; _nodeName = nodeName; _endPointURI = new URI(endPointURI); _staticMembers = new ArrayList(); } public void addStaticMember(Member member) { _staticMembers.add(member); } public Dispatcher getDispatcher() { return _dispatcher; } public String getNodeName() { return _nodeName; } @Override protected void doStart() throws Exception { _dispatcher = newDispatcher(); DispatcherRegistry dispatcherRegistry = new StaticDispatcherRegistry(); dispatcherRegistry.register(_dispatcher); _dispatcher.start(); AdminServiceSpace adminServiceSpace = new AdminServiceSpace(_dispatcher, new JDKClassIndexerRegistry(new DeclaredMemberFilter())); adminServiceSpace.start(); } @Override protected void doStop() throws Exception { _dispatcher.stop(); } protected Dispatcher newDispatcher() { return new TribesDispatcher(_clusterName, _nodeName, new URIEndPoint(_endPointURI), _staticMembers); } } jetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/WadiSessionHandler.java0000644000175000017500000001404311002374310031064 0ustar moonmoonpackage org.mortbay.jetty.servlet.wadi; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.wadi.core.contextualiser.InvocationException; import org.codehaus.wadi.web.impl.WebInvocation; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.HttpException; import org.mortbay.jetty.Server; import org.mortbay.jetty.SessionManager; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.security.HashUserRealm; import org.mortbay.jetty.servlet.SessionHandler; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.log.Log; public class WadiSessionHandler extends SessionHandler { public WadiSessionHandler(SessionManager sessionManager) { super(sessionManager); } public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { setRequestedId(request, dispatch); WadiClusteredInvocation invocation = new WadiClusteredInvocation(target,request,response,dispatch); try { invocation.invoke(); } catch (Exception e) { Log.warn(e); Throwable cause = e.getCause(); if (cause instanceof HttpException) { throw (HttpException) cause; } else if (cause instanceof IOException) { throw (IOException) cause; } else { throw (IOException) new IOException().initCause(cause); } } } protected class WadiClusteredInvocation { protected final String target; protected final HttpServletRequest request; protected final HttpServletResponse response; protected final int dispatch; protected WadiClusteredInvocation(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) { this.target = target; this.request = request; this.response = response; this.dispatch = dispatch; } public void invoke() throws Exception { WebInvocation invocation = new WebInvocation(); invocation.setDoNotExecuteOnEndProcessing(true); FilterChain chainAdapter = new FilterChain() { public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { try { invokeLocally(); } catch (Exception e) { throw (IOException) new IOException().initCause(e); } } }; invocation.init(request, response, chainAdapter); try { WadiSessionManager wSessionManager = (WadiSessionManager)getSessionManager(); wSessionManager.getClusteredManager().contextualise(invocation); } catch (InvocationException e) { Throwable throwable = e.getCause(); if (throwable instanceof IOException) { throw new Exception(throwable); } else if (throwable instanceof ServletException) { throw new Exception(throwable); } else { throw new Exception(e); } } } protected void invokeLocally() throws Exception { WadiSessionHandler.super.handle(target, request, response, dispatch); } public String getRequestedSessionId() { return request.getRequestedSessionId(); } } public static void main(String args[]) throws Exception { String jetty_home=System.getProperty("jetty.home","../../.."); String jetty_port=System.getProperty("jetty.port", "8080"); String node_name=System.getProperty("node.name", "red"); Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(Integer.parseInt(jetty_port)); server.setConnectors(new Connector[]{connector}); HandlerCollection handlers = new HandlerCollection(); ContextHandlerCollection contexts = new ContextHandlerCollection(); //TODO: find a way to dynamically get the endpoint url WadiCluster wadiCluster = new WadiCluster("CLUSTER", node_name, "http://localhost:"+jetty_port+"/test"); wadiCluster.doStart(); WadiSessionManager wadiManager = new WadiSessionManager(wadiCluster, 2, 24, 360); WadiSessionHandler wSessionHandler = new WadiSessionHandler(wadiManager); WebAppContext wah = new WebAppContext(null, wSessionHandler, null, null); wah.setContextPath("/test"); wah.setResourceBase(jetty_home+"/webapps/test"); contexts.setHandlers(new Handler[]{wah}); handlers.setHandlers(new Handler[]{contexts,new DefaultHandler()}); server.setHandler(handlers); HashUserRealm hur = new HashUserRealm(); hur.setName("Test Realm"); hur.setConfig(jetty_home+"/etc/realm.properties"); wah.getSecurityHandler().setUserRealm(hur); server.start(); server.join(); } } jetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/WadiSession.java0000644000175000017500000000262010565041647027605 0ustar moonmoonpackage org.mortbay.jetty.servlet.wadi; import java.util.Map; public interface WadiSession { /** * Gets the sessionId. * * @return sessionId. */ String getSessionId(); /** * Map like contract to manipulate state information. */ Object addState(String key, Object value); /** * Map like contract to manipulate state information. */ Object getState(String key); /** * Map like contract to manipulate state information. */ Object removeState(String key); /** * Map like contract to manipulate state information. *

    * The returned Map is mutable and is backed by the session. */ Map getState(); /** * Releases the session. *

    * When a Session is released, it is released from the underlying set of SessionManagers. In other words, its * sessionId is unknown and its state is permanently lost. After the release of a Session, the behavior of * the other methods is undefined. */ void release(); /** * Notifies the session that state accesses are now completed. *

    * When state accesses end, the underlying local SessionManager may decide to replicate synchronously or * asynchronously the current state to remote SessionManagers. */ void onEndAccess(); } jetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/SessionListener.java0000644000175000017500000000147310565041647030513 0ustar moonmoonpackage org.mortbay.jetty.servlet.wadi; public interface SessionListener { /** * Calls when the ownership of the provided Session is acquired by the SessionManager to which this listener * is attached. * * @param session New Session now owned by the attached SessionManager. */ void notifyInboundSessionMigration(WadiSession session); /** * Calls when the ownership of the provided Session is relinquished to another SessionManager. * * @param session Session now owned by another SessionManager. */ void notifyOutboundSessionMigration(WadiSession session); /** * Calls when a Session is destroyed. * * @param session Destroyed session. */ void notifySessionDestruction(WadiSession session); } jetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/WADITestServer.java0000644000175000017500000001023311076117615030124 0ustar moonmoon/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.mortbay.jetty.servlet.wadi; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.jetty.handler.ContextHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.nio.SelectChannelConnector; public class WADITestServer { private final int jettyPort; private final String nodeName; private Server server; private WadiCluster wadiCluster; public WADITestServer(int jettyPort, String nodeName) { if (jettyPort < 1) { throw new IllegalArgumentException("jettyPort must be greater than 1"); } else if (null == nodeName) { throw new IllegalArgumentException("nodeName is required"); } this.jettyPort = jettyPort; this.nodeName = nodeName; } public void setUp() throws Exception { server = new Server(); setUpConnector(); wadiCluster = new WadiCluster("CLUSTER", nodeName, "http://localhost:" + jettyPort + "/test"); setUpHandlers(); startCluster(); startServer(); } public void startServer() throws Exception { server.start(); server.join(); } public void startCluster() throws Exception { wadiCluster.doStart(); } protected void setUpHandlers() { HandlerCollection handlerCollection = new HandlerCollection(); Handler handler = newCounterHandler(); handlerCollection.addHandler(handler); handler = newExitHandler(); handlerCollection.addHandler(handler); server.setHandler(handlerCollection); } protected ContextHandler newExitHandler() { ContextHandler ctx = new ContextHandler(); ctx.setContextPath("/exit"); ctx.setHandler(new AbstractHandler() { public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { System.exit(1); } }); return ctx; } protected ContextHandler newCounterHandler() { WadiSessionManager wadiManager = new WadiSessionManager(wadiCluster, 2, 24, 10); wadiManager.setMaxInactiveInterval(120); WadiSessionHandler wadiHandler = new WadiSessionHandler(wadiManager); wadiHandler.setHandler(new CounterHandler()); ContextHandler ctx = new ContextHandler(); ctx.setContextPath("/counter"); ctx.setHandler(wadiHandler); return ctx; } protected void setUpConnector() { SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(jettyPort); server.setConnectors(new Connector[] { connector }); } public static void main(String args[]) throws Exception { String port = System.getProperty("jetty.port", "8080"); String node = System.getProperty("node.name", "red"); new WADITestServer(Integer.parseInt(port), node).setUp(); } } jetty-6.1.26/contrib/wadi/src/main/java/org/mortbay/jetty/servlet/wadi/CounterHandler.java0000644000175000017500000000367611042240554030273 0ustar moonmoon/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.mortbay.jetty.servlet.wadi; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.MimeTypes; import org.mortbay.jetty.handler.AbstractHandler; public class CounterHandler extends AbstractHandler { public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { HttpSession session = request.getSession(); Integer counter = (Integer) session.getAttribute("counter"); if (null == counter) { counter = 0; } counter += 1; session.setAttribute("counter", counter); response.setStatus(HttpServletResponse.SC_OK); response.setContentType(MimeTypes.TEXT_HTML); response.setContentLength((counter + "").length()); PrintWriter writer = response.getWriter(); writer.print(counter); writer.flush(); } } jetty-6.1.26/contrib/wadi/src/main/resources/0000755000175000017500000000000011745736515017576 5ustar moonmoonjetty-6.1.26/contrib/wadi/src/main/resources/wadi.xml0000644000175000017500000000670110711217536021235 0ustar moonmoon /wadi /webapps/test false false /etc/webdefault.xml CLUSTER http://localhost:/test 2 24 360 true false jetty-6.1.26/contrib/wadi/pom.xml0000644000175000017500000003120111466510475015356 0ustar moonmoon 4.0.0 org.mortbay.jetty jetty-wadi-session-manager 6.1.26 Wadi - Jetty Session Cache http://jetty.mortbay.org Apache License Version 2 http://www.apache.org/licenses/LICENSE-2.0 wadi-codehaus-maven2 Wadi Codehaus Maven2 Repo http://snapshots.repository.codehaus.org/ true wadi-dependencies wadi dependencies default http://dist.codehaus.org/wadi/dependencies/maven2 true tribes tribes http://tomcat.apache.org/dev/dist/m2-repository true install maven-compiler-plugin 1.5 1.5 org.apache.maven.plugins maven-surefire-plugin log4j.configuration log4j.properties maven-antrun-plugin clean clean run install install run org.codehaus.mojo dependency-maven-plugin install copy org.slf4j slf4j-simple ${slf4j-version} org.slf4j jcl104-over-slf4j ${slf4j-version} aspectj aspectjrt 1.5.2a org.codehaus.wadi wadi-aop ${wadi-version} org.codehaus.wadi wadi-core ${wadi-version} org.codehaus.wadi wadi-group ${wadi-version} org.codehaus.wadi wadi-tribes ${wadi-version} backport-util-concurrent backport-util-concurrent ${backport-utli-concurrent-version} cglib cglib-nodep ${cglib-version} commons-codec commons-codec ${commons-codec-version} commons-httpclient commons-httpclient ${commons-httpclient-version} concurrent concurrent ${concurrent-version} regexp regexp ${regexp-version} org.apache.tomcat tribes ${tribes-version} org.apache.tomcat juli ${tribes-version} ${project.groupId} ${project.artifactId} ${project.version} ${basedir}/../../lib/wadi org.codehaus.groovy.maven gmaven-plugin ${gmaven-plugin-version} testCompile org.mortbay.jetty servlet-api ${servlet-version} import org.mortbay.jetty.servlet.wadi.WADITestServer Thread.currentThread().setContextClassLoader(WADITestServer.class.classLoader); def port = project.properties.port def node = project.properties.node def server = new WADITestServer(Integer.parseInt(port), node) server.setUp() log4j log4j 1.2.15 javax.jms jms com.sun.jmx jmxri com.sun.jdmk jmxtools test org.mortbay.jetty jetty ${project.version} org.mortbay.jetty jetty-util ${project.version} org.mortbay.jetty servlet-api ${servlet-version} provided org.codehaus.wadi wadi-aop ${wadi-version} org.codehaus.wadi wadi-core ${wadi-version} org.codehaus.wadi wadi-group ${wadi-version} org.codehaus.wadi wadi-tribes ${wadi-version} backport-util-concurrent backport-util-concurrent ${backport-utli-concurrent-version} cglib cglib-nodep ${cglib-version} runtime commons-codec commons-codec ${commons-codec-version} runtime commons-httpclient commons-httpclient ${commons-httpclient-version} runtime concurrent concurrent ${concurrent-version} runtime regexp regexp ${regexp-version} runtime org.apache.tomcat tribes ${tribes-version} compile org.apache.tomcat juli ${tribes-version} runtime org.codehaus.groovy.maven.runtime gmaven-runtime-default ${gmaven-plugin-version} test 2.5-20081211 1.0.1 6.0.16 1.3 1.3.4 3.0 1.2 2.1_3 2.2 2.0 1.0-rc-2 jetty-6.1.26/contrib/jetty-deb/0000755000175000017500000000000011745736515015014 5ustar moonmoonjetty-6.1.26/contrib/jetty-deb/pom.xml0000644000175000017500000000117511466510475016330 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-deb 6.1.26 Jetty Deb Packages pom jetty-6.1.26/contrib/j2se6/0000755000175000017500000000000011745736515014056 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/0000755000175000017500000000000011745736515014645 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/test/0000755000175000017500000000000011745736515015624 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/test/java/0000755000175000017500000000000011745736515016545 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/test/java/org/0000755000175000017500000000000011745736515017334 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/test/java/org/mortbay/0000755000175000017500000000000011745736515021011 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736515022150 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/test/java/org/mortbay/jetty/j2se6/0000755000175000017500000000000011745736515023101 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/test/java/org/mortbay/jetty/j2se6/TestHttpServer.java0000644000175000017500000001375011254647533026714 0ustar moonmoonpackage org.mortbay.jetty.j2se6; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.URL; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.security.B64Code; import org.mortbay.util.IO; import org.mortbay.util.StringUtil; import com.sun.net.httpserver.BasicAuthenticator; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import junit.framework.TestCase; public class TestHttpServer extends TestCase { public class FooFilter extends Filter { public String description() { return "FooFilter"; } public void doFilter(HttpExchange exchange, Chain chain) throws IOException { try { System.err.println("FooFilter called"); exchange.setAttribute("fooFilter", "Was Here"); chain.doFilter(exchange); } finally { System.err.println("FooFilter called back"); } } } public class BarFilter extends Filter { public String description() { return "BarFilter"; } public void doFilter(HttpExchange exchange, Chain chain) throws IOException { try { System.err.println("BarFilter called"); exchange.setAttribute("barFilter", "Was Also Here"); chain.doFilter(exchange); } finally { System.err.println("BarFilter called back"); } } } public class FooBasicAuthenticator extends BasicAuthenticator { public FooBasicAuthenticator(String realm) { super(realm); } public boolean checkCredentials(String name, String credential) { assertEquals("humpty", name); if ("humpty".equals(name) && ("dumpty".equals(credential))) return true; return false; } } public class FooHandler implements HttpHandler { public void handle(HttpExchange exchange) throws IOException { assertEquals("HTTP/1.1", exchange.getProtocol()); assertEquals("POST", exchange.getRequestMethod()); Headers headers = exchange.getRequestHeaders(); assertTrue (headers.containsKey("foo")); String val = headers.getFirst("foo"); assertEquals ("fooValue", val); assertNotNull (exchange.getHttpContext()); assertEquals ("/foo", exchange.getHttpContext().getPath()); assertTrue (this == exchange.getHttpContext().getHandler()); assertTrue (exchange.getHttpContext().getAttributes().containsKey("fooAttribute")); assertEquals("fooValue", (String)exchange.getHttpContext().getAttributes().get("fooAttribute")); assertEquals ("Was Here", (String)exchange.getAttribute("fooFilter")); assertEquals ("Was Also Here", (String)exchange.getAttribute("barFilter")); assertNotNull(exchange.getPrincipal()); assertEquals("humpty", exchange.getPrincipal().getName()); String response = "Hello World!"; InputStream is = exchange.getRequestBody(); String body = IO.toString(is); assertEquals(0, body.length()); Headers responseHeaders = exchange.getResponseHeaders(); responseHeaders.add("bar", "barValue"); exchange.sendResponseHeaders(200, response.length()); OutputStream os = exchange.getResponseBody(); os.write(response.getBytes()); os.close(); } } public void testServer() throws Exception { Server server = new Server(); HandlerCollection handlerCollection = new HandlerCollection(); handlerCollection.setHandlers(new Handler[] {new ContextHandlerCollection(), new DefaultHandler()}); server.setHandler(handlerCollection); //make a new Server JettyHttpServer httpServer = new JettyHttpServer(); httpServer.bind(new InetSocketAddress ("localhost", 8080), 0); HttpContext context = httpServer.createContext("/foo", new FooHandler()); context.getAttributes().put("fooAttribute", "fooValue"); context.getFilters().add(new FooFilter()); context.getFilters().add(new BarFilter()); context.setAuthenticator(new FooBasicAuthenticator("foorealm")); httpServer.start(); URL url = new URL("http://localhost:8080/foo"); HttpURLConnection httpConn = (HttpURLConnection)url.openConnection(); String authenticationString = "Basic " + B64Code.encode( "humpty" + ":" + "dumpty", StringUtil.__ISO_8859_1); httpConn.setRequestMethod("POST"); httpConn.addRequestProperty("foo", "fooValue"); httpConn.addRequestProperty("Authorization", authenticationString); assertEquals(200, httpConn.getResponseCode()); assertEquals("barValue", httpConn.getHeaderField("bar")); InputStream is = httpConn.getInputStream(); String result = IO.toString(is); is.close(); assertEquals("Hello World!", result); url = new URL("http://localhost:8080/other"); httpConn = (HttpURLConnection)url.openConnection(); httpConn.setRequestMethod("GET"); assertEquals(404, httpConn.getResponseCode()); httpServer.stop(0); } } jetty-6.1.26/contrib/j2se6/src/main/0000755000175000017500000000000011745736515015571 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/main/java/0000755000175000017500000000000011745736515016512 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/main/java/org/0000755000175000017500000000000011745736515017301 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/main/java/org/mortbay/0000755000175000017500000000000011745736515020756 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736515022115 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/main/java/org/mortbay/jetty/j2se6/0000755000175000017500000000000011745736515023046 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/main/java/org/mortbay/jetty/j2se6/JettyHttpServerProvider.java0000644000175000017500000000332311254647533030547 0ustar moonmoon//======================================================================== //$$Id: JettyHttpServerProvider.java 1647 2009-09-18 09:14:03Z janb $$ // //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.j2se6; import java.io.IOException; import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpsServer; import com.sun.net.httpserver.spi.HttpServerProvider; /** * Jetty implementation of Java HTTP Server SPI * */ public class JettyHttpServerProvider extends HttpServerProvider { @Override public HttpServer createHttpServer(InetSocketAddress addr, int backlog) throws IOException { JettyHttpServer jettyHttpServer = new JettyHttpServer(); jettyHttpServer.bind(addr, backlog); return jettyHttpServer; } @Override public HttpsServer createHttpsServer(InetSocketAddress addr, int backlog) throws IOException { throw new UnsupportedOperationException(); } } jetty-6.1.26/contrib/j2se6/src/main/java/org/mortbay/jetty/j2se6/ThreadPoolExecutorAdapter.java0000644000175000017500000000676611254647533031005 0ustar moonmoon//======================================================================== //$$Id: ThreadPoolExecutorAdapter.java,v 1.3 2007/11/02 12:39:41 ludovic_orban Exp $$ // //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.j2se6; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.mortbay.component.LifeCycle; import org.mortbay.log.Log; import org.mortbay.thread.ThreadPool; /** * Jetty {@link ThreadPool} that bridges requests to a {@link ThreadPoolExecutor}. * */ public class ThreadPoolExecutorAdapter implements ThreadPool, LifeCycle { private ThreadPoolExecutor executor; public ThreadPoolExecutorAdapter(ThreadPoolExecutor executor) { this.executor = executor; } public boolean dispatch(Runnable job) { try { executor.execute(job); return true; } catch(RejectedExecutionException e) { Log.warn(e); return false; } } public int getIdleThreads() { return executor.getPoolSize()-executor.getActiveCount(); } public int getThreads() { return executor.getPoolSize(); } public boolean isLowOnThreads() { return executor.getActiveCount()>=executor.getMaximumPoolSize(); } public void join() throws InterruptedException { executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); } public boolean isFailed() { return false; } public boolean isRunning() { return !executor.isTerminated() && !executor.isTerminating(); } public boolean isStarted() { return !executor.isTerminated() && !executor.isTerminating(); } public boolean isStarting() { return false; } public boolean isStopped() { return executor.isTerminated(); } public boolean isStopping() { return executor.isTerminating(); } public void start() throws Exception { if (executor.isTerminated() || executor.isTerminating() || executor.isShutdown()) throw new IllegalStateException("Cannot restart"); } public void stop() throws Exception { executor.shutdown(); if (!executor.awaitTermination(60,TimeUnit.SECONDS)) executor.shutdownNow(); } @Override public void addLifeCycleListener(Listener listener) { throw new UnsupportedOperationException ("LifeCycleListeners not implemented"); } @Override public void removeLifeCycleListener(Listener listener) { throw new UnsupportedOperationException ("LifeCycleListeners not implemented"); } } jetty-6.1.26/contrib/j2se6/src/main/java/org/mortbay/jetty/j2se6/JettyHttpExchange.java0000644000175000017500000001302111254647533027304 0ustar moonmoon//======================================================================== //$$Id: JettyHttpExchange.java 1647 2009-09-18 09:14:03Z janb $$ // //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.j2se6; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.URI; import java.net.URISyntaxException; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpPrincipal; /** * Jetty implementation of {@link com.sun.net.httpserver.HttpExchange} * */ public class JettyHttpExchange extends HttpExchange { private HttpContext _context; private HttpServletRequest _req; private HttpServletResponse _resp; private Headers _responseHeaders = new Headers(); private int _responseCode = 0; private InputStream _is; private OutputStream _os; private HttpPrincipal _principal; public JettyHttpExchange(HttpContext context, HttpServletRequest req,HttpServletResponse resp) { this._context = context; this._req = req; this._resp = resp; try { this._is = req.getInputStream(); this._os = resp.getOutputStream(); } catch (IOException ex) { throw new RuntimeException(ex); } } @Override public Headers getRequestHeaders() { Headers headers = new Headers(); Enumeration en = _req.getHeaderNames(); while (en.hasMoreElements()) { String name = (String) en.nextElement(); Enumeration en2 = _req.getHeaders(name); while (en2.hasMoreElements()) { String value = (String) en2.nextElement(); headers.add(name, value); } } return headers; } @Override public Headers getResponseHeaders() { return _responseHeaders; } @Override public URI getRequestURI() { try { String uriAsString = _req.getRequestURI(); if (_req.getQueryString() != null) uriAsString += "?" + _req.getQueryString(); return new URI(uriAsString); } catch (URISyntaxException ex) { throw new RuntimeException(ex); } } @Override public String getRequestMethod() { return _req.getMethod(); } @Override public HttpContext getHttpContext() { return _context; } @Override public void close() { try { _resp.getOutputStream().close(); } catch (IOException ex) { throw new RuntimeException(ex); } } @Override public InputStream getRequestBody() { return _is; } @Override public OutputStream getResponseBody() { return _os; } @Override public void sendResponseHeaders(int rCode, long responseLength) throws IOException { this._responseCode = rCode; Iterator it = _responseHeaders.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String name = (String) entry.getKey(); List values = (List) entry.getValue(); for (int i = 0; i < values.size(); i++) { String value = (String) values.get(i); _resp.setHeader(name, value); } } if (responseLength > 0) _resp.setHeader("content-length", "" + responseLength); _resp.setStatus(rCode); } @Override public InetSocketAddress getRemoteAddress() { return new InetSocketAddress(_req.getRemoteAddr(), _req.getRemotePort()); } @Override public int getResponseCode() { return _responseCode; } @Override public InetSocketAddress getLocalAddress() { return new InetSocketAddress(_req.getLocalAddr(), _req.getLocalPort()); } @Override public String getProtocol() { return _req.getProtocol(); } @Override public Object getAttribute(String name) { return _req.getAttribute(name); } @Override public void setAttribute(String name, Object value) { _req.setAttribute(name, value); } @Override public void setStreams(InputStream i, OutputStream o) { _is = i; _os = o; } @Override public HttpPrincipal getPrincipal() { return _principal; } public void setPrincipal(HttpPrincipal principal) { this._principal = principal; } } jetty-6.1.26/contrib/j2se6/src/main/java/org/mortbay/jetty/j2se6/JettyHttpContext.java0000644000175000017500000000547311254647533027222 0ustar moonmoon//======================================================================== //$$Id: JettyHttpContext.java 1647 2009-09-18 09:14:03Z janb $$ // //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.j2se6; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.sun.net.httpserver.Authenticator; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; /** * Implementation of {@link com.sun.net.httpserver.HttpContext}. * Contains a Jetty ContextHandler. * */ public class JettyHttpContext extends com.sun.net.httpserver.HttpContext { private J2SE6ContextHandler _jettyContextHandler; private HttpServer server; private Map _attributes = new HashMap(); private List _filters = new ArrayList(); private Authenticator _authenticator; protected JettyHttpContext(HttpServer server, String path, HttpHandler handler) { this.server = server; _jettyContextHandler = new J2SE6ContextHandler(this, handler); _jettyContextHandler.setContextPath(path); } protected J2SE6ContextHandler getJettyContextHandler() { return _jettyContextHandler; } @Override public HttpHandler getHandler() { return _jettyContextHandler.getHttpHandler(); } @Override public void setHandler(HttpHandler h) { _jettyContextHandler.setHttpHandler(h); } @Override public String getPath() { return _jettyContextHandler.getContextPath(); } @Override public HttpServer getServer() { return server; } @Override public Map getAttributes() { return _attributes; } @Override public List getFilters() { return _filters; } @Override public Authenticator setAuthenticator(Authenticator auth) { Authenticator previous = _authenticator; _authenticator = auth; return previous; } @Override public Authenticator getAuthenticator() { return _authenticator; } } jetty-6.1.26/contrib/j2se6/src/main/java/org/mortbay/jetty/j2se6/JettyHttpServer.java0000644000175000017500000001413311254647533027035 0ustar moonmoon//======================================================================== //$$Id: JettyHttpServer.java 1647 2009-09-18 09:14:03Z janb $$ // //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.j2se6; import java.io.IOException; import java.net.BindException; import java.net.InetSocketAddress; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.ContextHandler; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.log.Log; import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpHandler; /** * Jetty implementation of {@link com.sun.net.httpserver.HttpServer}. * * One sun HttpServer instance relates to one jetty Server instance, which * has one Connector. * */ public class JettyHttpServer extends com.sun.net.httpserver.HttpServer { private Server _server; private ContextHandlerCollection _contextCollection; private InetSocketAddress _addr; private ThreadPoolExecutor _executor; private boolean _started = false; public JettyHttpServer() { _server = new Server(); HandlerCollection handlerCollection = new HandlerCollection(); _contextCollection = new ContextHandlerCollection(); handlerCollection.setHandlers(new Handler[] {_contextCollection, new DefaultHandler()}); _server.setHandler(handlerCollection); } @Override public void bind(InetSocketAddress addr, int backlog) throws IOException { if (_started) throw new BindException ("Already started"); // check if there is already a connector listening Connector[] connectors = _server.getConnectors(); if (connectors != null) throw new BindException ("Server already bound"); this._addr = addr; if (_executor != null && _server.getThreadPool() == null) { if (Log.isDebugEnabled()) Log.debug("using given Executor for server thread pool"); _server.setThreadPool(new ThreadPoolExecutorAdapter(_executor)); } SelectChannelConnector connector = new SelectChannelConnector(); connector.setAcceptors(1); connector.setAcceptQueueSize(backlog); connector.setPort(addr.getPort()); connector.setHost(addr.getHostName()); _server.addConnector(connector); } @Override public InetSocketAddress getAddress() { return _addr; } @Override public void start() { if (_started) throw new IllegalStateException ("Already started"); try { _server.start(); _started = true; } catch (Exception ex) { throw new RuntimeException(ex); } } @Override public void setExecutor(Executor executor) { if (_started) throw new IllegalStateException ("Server started"); if (!(executor instanceof ThreadPoolExecutor)) throw new IllegalArgumentException("only ThreadPoolExecutor are allowed"); this._executor = (ThreadPoolExecutor) executor; } @Override public Executor getExecutor() { return _executor; } @Override public void stop(int delay) { if (delay < 0) throw new IllegalStateException ("Delay is negative"); _server.setGracefulShutdown(delay * 1000); try { _server.stop(); } catch (Exception ex) { throw new RuntimeException(ex); } } @Override public HttpContext createContext(String path, HttpHandler handler) { checkIfContextIsFree(path); JettyHttpContext context = new JettyHttpContext(this, path, handler); J2SE6ContextHandler jettyContextHandler = context.getJettyContextHandler(); _contextCollection.addHandler(jettyContextHandler); return context; } private void checkIfContextIsFree(String path) { Handler[] handlers = _contextCollection.getChildHandlersByClass(ContextHandler.class); for (int i = 0; handlers!= null && i < handlers.length; i++) { ContextHandler ctx = (ContextHandler) handlers[i]; if (ctx.getContextPath().equals(path)) throw new IllegalArgumentException("another context already bound to path " + path); } } @Override public HttpContext createContext(String path) { return createContext(path, null); } @Override public void removeContext(String path) throws IllegalArgumentException { Handler handler = null; Handler[] handlers = _contextCollection.getChildHandlersByClass(ContextHandler.class); for (int i = 0; handlers!= null && i < handlers.length && handler == null; i++) { ContextHandler ctx = (ContextHandler) handlers[i]; if (ctx.getContextPath().equals(path)) handler = ctx; } if (handler != null) _contextCollection.removeHandler(handler); } @Override public void removeContext(HttpContext context) { removeContext(context.getPath()); } } jetty-6.1.26/contrib/j2se6/src/main/java/org/mortbay/jetty/j2se6/J2SE6ContextHandler.java0000644000175000017500000001122611456742400027334 0ustar moonmoon//======================================================================== //$$Id: J2SE6ContextHandler.java 1919 2010-10-18 03:54:40Z gregw $$ // //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.j2se6; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.Request; import org.mortbay.jetty.handler.ContextHandler; import com.sun.net.httpserver.Authenticator; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpPrincipal; /** * Jetty ContextHandler that bridges requests to {@link HttpHandler}. * */ public class J2SE6ContextHandler extends ContextHandler { private HttpContext _context; private HttpHandler _handler; public J2SE6ContextHandler(HttpContext context, HttpHandler handler) { this._context = context; this._handler = handler; } @Override public void handle(String target, HttpServletRequest req, HttpServletResponse resp, int dispatch) throws IOException, ServletException { if (!target.startsWith(getContextPath())) return; JettyHttpExchange jettyHttpExchange = new JettyHttpExchange(_context, req, resp); try { Authenticator auth = _context.getAuthenticator(); if (auth != null) { Authenticator.Result authResult = auth.authenticate(jettyHttpExchange); if (authResult instanceof Authenticator.Success) { HttpPrincipal p = ((Authenticator.Success)authResult).getPrincipal(); jettyHttpExchange.setPrincipal(p); invokeHandler(jettyHttpExchange); } else if (authResult instanceof Authenticator.Failure) { int rc = ((Authenticator.Failure)authResult).getResponseCode(); resp.sendError(rc); } else if (authResult instanceof Authenticator.Retry) { int rc = ((Authenticator.Retry)authResult).getResponseCode(); resp.sendError(rc); } } else invokeHandler(jettyHttpExchange); } catch(Exception ex) { PrintWriter writer = new PrintWriter(jettyHttpExchange.getResponseBody()); resp.setStatus(500); writer.println("

    HTTP ERROR: 500

    "); writer.println("
    INTERNAL_SERVER_ERROR
    "); writer.println("

    RequestURI=" + req.getRequestURI() + "

    "); writer.println("
    ");
                ex.printStackTrace(writer);
                writer.println("
    "); writer.println("

    Powered by jetty://

    "); writer.close(); } finally { Request base_request = (req instanceof Request) ? (Request)req:HttpConnection.getCurrentConnection().getRequest(); base_request.setHandled(true); } } protected void invokeHandler (JettyHttpExchange exchange) throws IOException { List filters = _context.getFilters(); if (filters != null && filters.size()>0) { List copy = new ArrayList(filters.subList(1, filters.size())); Filter.Chain chain = new Filter.Chain(copy, _handler); filters.get(0).doFilter(exchange, chain); } else _handler.handle(exchange); } public HttpHandler getHttpHandler() { return _handler; } public void setHttpHandler(HttpHandler handler) { this._handler = handler; } } jetty-6.1.26/contrib/j2se6/src/main/resources/0000755000175000017500000000000011745736515017603 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/main/resources/META-INF/0000755000175000017500000000000011745736515020743 5ustar moonmoonjetty-6.1.26/contrib/j2se6/src/main/resources/META-INF/services/0000755000175000017500000000000011745736515022566 5ustar moonmoon././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootjetty-6.1.26/contrib/j2se6/src/main/resources/META-INF/services/com.sun.net.httpserver.spi.HttpServerProviderjetty-6.1.26/contrib/j2se6/src/main/resources/META-INF/services/com.sun.net.httpserver.spi.HttpServe0000644000175000017500000000005710601006220031551 0ustar moonmoonorg.mortbay.jetty.j2se6.JettyHttpServerProviderjetty-6.1.26/contrib/j2se6/pom.xml0000755000175000017500000000416011466510475015372 0ustar moonmoon project org.mortbay.jetty 6.1.26 4.0.0 org.mortbay.jetty jetty-j2se6 jar Jetty :: J2SE6 Http Server http://jetty.mortbay.org Apache License Version 2 http://www.apache.org/licenses/LICENSE-2.0 install src/main/resources **/** org.apache.maven.plugins maven-enforcer-plugin 1.0-beta-1 enforce-java enforce [1.6,) maven-compiler-plugin 1.6 1.6 true junit junit test org.mortbay.jetty jetty ${project.version} jetty-6.1.26/contrib/j2se6/README.TXT0000644000175000017500000000034510577346041015407 0ustar moonmoonTo build this module, jdk6 is required. You need to define the environment variable J2SE6_HOME, or define a property of that name in your maven settings.xml file. eg on linux: export J2SE6_HOME=/usr/lib/jvm/jdk1.6.0 jetty-6.1.26/contrib/jetty-ldap-jaas/0000755000175000017500000000000011745736515016116 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/0000755000175000017500000000000011745736515016705 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/0000755000175000017500000000000011745736515017664 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/java/0000755000175000017500000000000011745736515020605 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/java/org/0000755000175000017500000000000011745736515021374 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/java/org/mortbay/0000755000175000017500000000000011745736515023051 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736515024210 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/java/org/mortbay/jetty/plus/0000755000175000017500000000000011745736515025173 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/java/org/mortbay/jetty/plus/jaas/0000755000175000017500000000000011745736515026111 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/java/org/mortbay/jetty/plus/jaas/ldap/0000755000175000017500000000000011745736515027031 5ustar moonmoon././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/java/org/mortbay/jetty/plus/jaas/ldap/LdapLoginModuleTest.javajetty-6.1.26/contrib/jetty-ldap-jaas/src/test/java/org/mortbay/jetty/plus/jaas/ldap/LdapLoginModuleT0000644000175000017500000002174411245115702032107 0ustar moonmoon// ======================================================================== // Copyright 2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.plus.jaas.ldap; import org.apache.directory.shared.ldap.util.Base64; import org.apache.directory.shared.ldap.exception.LdapNameNotFoundException; import org.codehaus.plexus.PlexusTestCase; import org.codehaus.plexus.apacheds.ApacheDs; import org.mortbay.jetty.security.Credential; import org.mortbay.jetty.plus.jaas.callback.DefaultCallbackHandler; import org.mortbay.jetty.plus.jaas.JAASRole; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.security.auth.Subject; import java.util.HashMap; import java.util.Map; import java.util.Set; public class LdapLoginModuleTest extends PlexusTestCase { private ApacheDs apacheDs; private String suffix; protected void setUp() throws Exception { super.setUp(); apacheDs = (ApacheDs)lookup(ApacheDs.ROLE, "test" ); suffix = apacheDs.addSimplePartition( "test", new String[]{"jetty", "mortbay", "org"} ).getSuffix(); System.out.println( "DN Suffix: " + suffix ); apacheDs.startServer(); makeUsers(); } protected void tearDown() throws Exception { InitialDirContext context = apacheDs.getAdminContext(); unbind(context, createDn( "ldap-admin" ) ); unbind(context, createDn( "jesse" ) ); apacheDs.stopServer(); super.tearDown(); } public void testNothing() throws Exception { } public void testBindingAuth() throws Exception { LdapLoginModule lm = new LdapLoginModule(); Map options = new HashMap(); options.put( "hostname", "localhost" ); options.put( "port", "10390" ); options.put( "contextFactory", "com.sun.jndi.ldap.LdapCtxFactory" ); options.put( "bindDn", "uid=admin,ou=system" ); options.put( "bindPassword", "secret" ); options.put( "userBaseDn", "dc=jetty,dc=mortbay,dc=org" ); options.put( "roleBaseDn", "dc=jetty,dc=mortbay,dc=org" ); options.put( "roleNameAttribute", "cn" ); options.put( "forceBindingLogin", "true" ); options.put("useLdaps", "false"); options.put( "debug", "true" ); Subject subject = new Subject(); DefaultCallbackHandler callbackHandler = new DefaultCallbackHandler(); callbackHandler.setUserName("jesse"); callbackHandler.setCredential("foo"); lm.initialize( subject, callbackHandler, null, options ); assertTrue( lm.bindingLogin( "jesse", "foo" ) ); assertTrue( lm.login() ); assertTrue( lm.commit() ); Set roles = subject.getPrincipals(JAASRole.class); assertEquals(1, roles.size()); assertTrue(roles.contains(new JAASRole("ldap-admin"))); } /* public void testCredentialAuth() throws Exception { LdapLoginModule lm = new LdapLoginModule(); Map options = new HashMap(); options.put( "hostname", "localhost" ); options.put( "port", "10390" ); options.put( "contextFactory", "com.sun.jndi.ldap.LdapCtxFactory" ); options.put( "bindDn", "uid=admin,ou=system" ); options.put( "bindPassword", "secret" ); options.put( "userBaseDn", "dc=jetty,dc=mortbay,dc=org" ); options.put( "forceBindingLogin", "false" ); lm.initialize( null, null, null, options ); UserInfo info = lm.getUserInfo( "jesse" ); assertTrue( lm.credentialLogin( info, "foo" ) ); } */ // ----------------------------------------------------------------------- // Private // ----------------------------------------------------------------------- private void makeUsers() throws Exception { InitialDirContext context = apacheDs.getAdminContext(); unbind(context, createDn("ldap-admin")); unbind(context, createDn( "jesse" ) ); String jesse = bindUserObject( context, "jesse" ); bindGroupObject( context, "ldap-admin", jesse ); assertExist( context, "cn", "jesse" ); } private String bindUserObject(DirContext context, String cn) throws Exception { Attributes attributes = new BasicAttributes(true); BasicAttribute objectClass = new BasicAttribute("objectClass"); objectClass.add("top"); objectClass.add("inetOrgPerson"); objectClass.add("person"); objectClass.add("organizationalperson"); attributes.put(objectClass); attributes.put("cn", cn); attributes.put("sn", "foo"); attributes.put("mail", "foo"); //System.out.println("setting password to : " + LdapLoginModule.convertCredentialJettyToLdap( Credential.MD5.digest( "foo" ) )); String pwd = Credential.MD5.digest( "foo" ); pwd = pwd.substring("MD5:".length(), pwd.length() ); //System.out.println(Credential.MD5.digest( "foo" )); //System.out.println(pwd); //System.out.println(Base64.encode( pwd.getBytes("ISO-8859-1") )); //System.out.println(Base64.encode( pwd.getBytes("UTF-8") )); attributes.put("userPassword", "{MD5}" + doStuff(pwd) ); //attributes.put( "userPassword", "foo"); attributes.put("givenName", "foo"); String dn = createDn(cn); context.createSubcontext(dn, attributes ); return dn; } private void bindGroupObject(DirContext context, String cn, String initialMember) throws Exception { Attributes attributes = new BasicAttributes(true); BasicAttribute objectClass = new BasicAttribute("objectClass"); objectClass.add("top"); objectClass.add("groupOfUniqueNames"); attributes.put(objectClass); attributes.put("cn", cn); attributes.put("uniqueMember", initialMember); context.createSubcontext( createDn( cn ), attributes ); } private String doStuff( String hpwd ) { String HEX_VAL = "0123456789abcdef"; byte[] bpwd = new byte[hpwd.length()>>1]; byte b = 0; boolean high = true; int pos = 0; //for ( char c:hpwd.toCharArray() ) for ( int i = 0 ; i < hpwd.toCharArray().length; ++i ) { char c = hpwd.toCharArray()[i]; if ( high ) { high = false; b = (byte)HEX_VAL.indexOf( c ); } else { high = true; b <<= 4; b += HEX_VAL.indexOf( c ); bpwd[pos++] = b; } } return new String( Base64.encode( bpwd ) ); } private String createDn( String cn ) { return "cn=" + cn + "," + suffix; } private void assertExist( DirContext context, String attribute, String value ) throws NamingException { SearchControls ctls = new SearchControls(); ctls.setDerefLinkFlag( true ); ctls.setSearchScope( SearchControls.ONELEVEL_SCOPE ); ctls.setReturningAttributes( new String[] { "*" } ); BasicAttributes matchingAttributes = new BasicAttributes(); matchingAttributes.put( attribute, value ); BasicAttribute objectClass = new BasicAttribute("objectClass"); objectClass.add("inetOrgPerson"); matchingAttributes.put(objectClass); NamingEnumeration results = context.search( suffix, matchingAttributes ); // NamingEnumeration results = context.search( suffix, "(" + attribute + "=" + value + ")", ctls // ); assertTrue( results.hasMoreElements() ); SearchResult result = (SearchResult)results.nextElement(); Attributes attrs = result.getAttributes(); Attribute testAttr = attrs.get( attribute ); assertEquals( value, testAttr.get() ); } private void unbind(InitialDirContext context, String dn) throws NamingException { try { context.unbind(dn); } catch (LdapNameNotFoundException e) { // ignore } } } jetty-6.1.26/contrib/jetty-ldap-jaas/src/test/resources/0000755000175000017500000000000011745736515021676 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/resources/org/0000755000175000017500000000000011745736515022465 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/resources/org/mortbay/0000755000175000017500000000000011745736515024142 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/resources/org/mortbay/jetty/0000755000175000017500000000000011745736515025301 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/resources/org/mortbay/jetty/plus/0000755000175000017500000000000011745736515026264 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/resources/org/mortbay/jetty/plus/jaas/0000755000175000017500000000000011745736515027202 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/resources/org/mortbay/jetty/plus/jaas/ldap/0000755000175000017500000000000011745736515030122 5ustar moonmoon././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootjetty-6.1.26/contrib/jetty-ldap-jaas/src/test/resources/org/mortbay/jetty/plus/jaas/ldap/LdapLoginModuleTest.xmljetty-6.1.26/contrib/jetty-ldap-jaas/src/test/resources/org/mortbay/jetty/plus/jaas/ldap/LdapLoginMo0000644000175000017500000000074611212700723032176 0ustar moonmoon org.codehaus.plexus.apacheds.ApacheDs test org.codehaus.plexus.apacheds.DefaultApacheDs true ${basedir}/target/apacheds 10390 secret jetty-6.1.26/contrib/jetty-ldap-jaas/src/main/0000755000175000017500000000000011745736515017631 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/main/java/0000755000175000017500000000000011745736515020552 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/main/java/org/0000755000175000017500000000000011745736515021341 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/main/java/org/mortbay/0000755000175000017500000000000011745736515023016 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736515024155 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/main/java/org/mortbay/jetty/plus/0000755000175000017500000000000011745736515025140 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/main/java/org/mortbay/jetty/plus/jaas/0000755000175000017500000000000011745736515026056 5ustar moonmoonjetty-6.1.26/contrib/jetty-ldap-jaas/src/main/java/org/mortbay/jetty/plus/jaas/ldap/0000755000175000017500000000000011745736515026776 5ustar moonmoon././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjetty-6.1.26/contrib/jetty-ldap-jaas/src/main/java/org/mortbay/jetty/plus/jaas/ldap/LdapLoginModule.javajetty-6.1.26/contrib/jetty-ldap-jaas/src/main/java/org/mortbay/jetty/plus/jaas/ldap/LdapLoginModule.0000644000175000017500000005022611245115702032003 0ustar moonmoonpackage org.mortbay.jetty.plus.jaas.ldap; // ======================================================================== // Copyright 2007 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== import java.io.IOException; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Properties; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.UnsupportedCallbackException; import javax.security.auth.login.LoginException; import org.mortbay.jetty.plus.jaas.callback.ObjectCallback; import org.mortbay.jetty.plus.jaas.spi.AbstractLoginModule; import org.mortbay.jetty.plus.jaas.spi.UserInfo; import org.mortbay.jetty.security.Credential; import org.mortbay.log.Log; /** * * A LdapLoginModule for use with JAAS setups * * The jvm should be started with the following parameter: *

    * * -Djava.security.auth.login.config=etc/ldap-loginModule.conf * *

    * and an example of the ldap-loginModule.conf would be: *

    *
     * ldaploginmodule {
     *    org.mortbay.jetty.plus.jaas.spi.LdapLoginModule required
     *    debug="true"
     *    useLdaps="false"
     *    contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
     *    hostname="ldap.example.com"
     *    port="389"
     *    bindDn="cn=Directory Manager"
     *    bindPassword="directory"
     *    authenticationMethod="simple"
     *    forceBindingLogin="false"
     *    userBaseDn="ou=people,dc=alcatel"
     *    userRdnAttribute="uid"
     *    userIdAttribute="uid"
     *    userPasswordAttribute="userPassword"
     *    userObjectClass="inetOrgPerson"
     *    roleBaseDn="ou=groups,dc=example,dc=com"
     *    roleNameAttribute="cn"
     *    roleMemberAttribute="uniqueMember"
     *    roleObjectClass="groupOfUniqueNames";
     *    };
     *  
    * * @author Jesse McConnell * @author Frederic Nizery * @author Trygve Laugstol */ public class LdapLoginModule extends AbstractLoginModule { /** * hostname of the ldap server */ private String _hostname; /** * port of the ldap server */ private int _port; /** * Context.SECURITY_AUTHENTICATION */ private String _authenticationMethod; /** * Context.INITIAL_CONTEXT_FACTORY */ private String _contextFactory; /** * root DN used to connect to */ private String _bindDn; /** * password used to connect to the root ldap context */ private String _bindPassword; /** * object class of a user */ private String _userObjectClass = "inetOrgPerson"; /** * attribute that the principal is located */ private String _userRdnAttribute = "uid"; /** * attribute that the principal is located */ private String _userIdAttribute = "cn"; /** * name of the attribute that a users password is stored under *

    * NOTE: not always accessible, see force binding login */ private String _userPasswordAttribute = "userPassword"; /** * base DN where users are to be searched from */ private String _userBaseDn; /** * base DN where role membership is to be searched from */ private String _roleBaseDn; /** * object class of roles */ private String _roleObjectClass = "groupOfUniqueNames"; /** * name of the attribute that a username would be under a role class */ private String _roleMemberAttribute = "uniqueMember"; /** * the name of the attribute that a role would be stored under */ private String _roleNameAttribute = "roleName"; private boolean _debug; /** * if the getUserInfo can pull a password off of the user then * password comparison is an option for authn, to force binding * login checks, set this to true */ private boolean _forceBindingLogin = false; /** * When true changes the protocol to ldaps */ private boolean _useLdaps = false; private DirContext _rootContext; /** * get the available information about the user *

    * for this LoginModule, the credential can be null which will result in a * binding ldap authentication scenario *

    * roles are also an optional concept if required * * @param username * @return * @throws Exception */ public UserInfo getUserInfo(String username) throws Exception { String pwdCredential = getUserCredentials(username); if (pwdCredential == null) { return null; } pwdCredential = convertCredentialLdapToJetty(pwdCredential); Credential credential = Credential.getCredential(pwdCredential); List roles = getUserRoles(_rootContext, username); return new UserInfo(username, credential, roles); } protected String doRFC2254Encoding(String inputString) { StringBuffer buf = new StringBuffer(inputString.length()); for (int i = 0; i < inputString.length(); i++) { char c = inputString.charAt(i); switch (c) { case '\\': buf.append("\\5c"); break; case '*': buf.append("\\2a"); break; case '(': buf.append("\\28"); break; case ')': buf.append("\\29"); break; case '\0': buf.append("\\00"); break; default: buf.append(c); break; } } return buf.toString(); } /** * attempts to get the users credentials from the users context *

    * NOTE: this is not an user authenticated operation * * @param username * @return * @throws LoginException */ private String getUserCredentials(String username) throws LoginException { String ldapCredential = null; SearchControls ctls = new SearchControls(); ctls.setCountLimit(1); ctls.setDerefLinkFlag(true); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); String filter = "(&(objectClass={0})({1}={2}))"; Log.debug("Searching for users with filter: \'" + filter + "\'" + " from base dn: " + _userBaseDn); try { Object[] filterArguments = {_userObjectClass, _userIdAttribute, username}; NamingEnumeration results = _rootContext.search(_userBaseDn, filter, filterArguments, ctls); Log.debug("Found user?: " + results.hasMoreElements()); if (!results.hasMoreElements()) { throw new LoginException("User not found."); } SearchResult result = findUser(username); Attributes attributes = result.getAttributes(); Attribute attribute = attributes.get(_userPasswordAttribute); if (attribute != null) { try { byte[] value = (byte[]) attribute.get(); ldapCredential = new String(value); } catch (NamingException e) { Log.debug("no password available under attribute: " + _userPasswordAttribute); } } } catch (NamingException e) { throw new LoginException("Root context binding failure."); } Log.debug("user cred is: " + ldapCredential); return ldapCredential; } /** * attempts to get the users roles from the root context *

    * NOTE: this is not an user authenticated operation * * @param dirContext * @param username * @return * @throws LoginException */ private List getUserRoles(DirContext dirContext, String username) throws LoginException, NamingException { String userDn = _userRdnAttribute + "=" + username + "," + _userBaseDn; return getUserRolesByDn(dirContext, userDn); } private List getUserRolesByDn(DirContext dirContext, String userDn) throws LoginException, NamingException { ArrayList roleList = new ArrayList(); if (dirContext == null || _roleBaseDn == null || _roleMemberAttribute == null || _roleObjectClass == null) { return roleList; } SearchControls ctls = new SearchControls(); ctls.setDerefLinkFlag(true); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); String filter = "(&(objectClass={0})({1}={2}))"; Object[] filterArguments = {_roleObjectClass, _roleMemberAttribute, userDn}; NamingEnumeration results = dirContext.search(_roleBaseDn, filter, filterArguments, ctls); Log.debug("Found user roles?: " + results.hasMoreElements()); while (results.hasMoreElements()) { SearchResult result = (SearchResult)results.nextElement(); Attributes attributes = result.getAttributes(); if (attributes == null) { continue; } Attribute roleAttribute = attributes.get(_roleNameAttribute); if (roleAttribute == null) { continue; } NamingEnumeration roles = roleAttribute.getAll(); while (roles.hasMore()) { roleList.add(roles.next()); } } return roleList; } /** * since ldap uses a context bind for valid authentication checking, we override login() *

    * if credentials are not available from the users context or if we are forcing the binding check * then we try a binding authentication check, otherwise if we have the users encoded password then * we can try authentication via that mechanic * * @return * @throws LoginException */ public boolean login() throws LoginException { try { if (getCallbackHandler() == null) { throw new LoginException("No callback handler"); } Callback[] callbacks = configureCallbacks(); getCallbackHandler().handle(callbacks); String webUserName = ((NameCallback) callbacks[0]).getName(); Object webCredential = ((ObjectCallback) callbacks[1]).getObject(); if (webUserName == null || webCredential == null) { setAuthenticated(false); return isAuthenticated(); } if (_forceBindingLogin) { return bindingLogin(webUserName, webCredential); } // This sets read and the credential UserInfo userInfo = getUserInfo(webUserName); if( userInfo == null) { setAuthenticated(false); return false; } setCurrentUser(new JAASUserInfo(userInfo)); if (webCredential instanceof String) { return credentialLogin(Credential.getCredential((String) webCredential)); } return credentialLogin(webCredential); } catch (UnsupportedCallbackException e) { throw new LoginException("Error obtaining callback information."); } catch (IOException e) { if (_debug) { e.printStackTrace(); } throw new LoginException("IO Error performing login."); } catch (Exception e) { if (_debug) { e.printStackTrace(); } throw new LoginException("Error obtaining user info."); } } /** * password supplied authentication check * * @param webCredential * @return * @throws LoginException */ protected boolean credentialLogin(Object webCredential) throws LoginException { setAuthenticated(getCurrentUser().checkCredential(webCredential)); return isAuthenticated(); } /** * binding authentication check * This methode of authentication works only if the user branch of the DIT (ldap tree) * has an ACI (acces control instruction) that allow the access to any user or at least * for the user that logs in. * * @param username * @param password * @return * @throws LoginException */ protected boolean bindingLogin(String username, Object password) throws LoginException, NamingException { SearchResult searchResult = findUser(username); DirContext usrsContext = (DirContext)_rootContext.lookup(_userBaseDn); DirContext usrContext = (DirContext)usrsContext.lookup(searchResult.getName()); String userDn = usrContext.getNameInNamespace(); Log.info("Attempting authentication: " + userDn); Hashtable environment = getEnvironment(); environment.put(Context.SECURITY_PRINCIPAL, userDn); environment.put(Context.SECURITY_CREDENTIALS, password); DirContext dirContext = new InitialDirContext(environment); List roles = getUserRolesByDn(dirContext, userDn); UserInfo userInfo = new UserInfo(username, null, roles); setCurrentUser(new JAASUserInfo(userInfo)); setAuthenticated(true); return true; } private SearchResult findUser(String username) throws NamingException, LoginException { SearchControls ctls = new SearchControls(); ctls.setCountLimit(1); ctls.setDerefLinkFlag(true); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); String filter = "(&(objectClass={0})({1}={2}))"; Log.info("Searching for users with filter: \'" + filter + "\'" + " from base dn: " + _userBaseDn); Object[] filterArguments = new Object[]{ _userObjectClass, _userIdAttribute, username }; NamingEnumeration results = _rootContext.search(_userBaseDn, filter, filterArguments, ctls); Log.info("Found user?: " + results.hasMoreElements()); if (!results.hasMoreElements()) { throw new LoginException("User not found."); } return (SearchResult)results.nextElement(); } public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { super.initialize(subject, callbackHandler, sharedState, options); _hostname = (String) options.get("hostname"); _port = Integer.parseInt((String) options.get("port")); _contextFactory = (String) options.get("contextFactory"); _bindDn = (String) options.get("bindDn"); _bindPassword = (String) options.get("bindPassword"); _authenticationMethod = (String) options.get("authenticationMethod"); _userBaseDn = (String) options.get("userBaseDn"); _roleBaseDn = (String) options.get("roleBaseDn"); if (options.containsKey("forceBindingLogin")) { _forceBindingLogin = Boolean.valueOf((String) options.get("forceBindingLogin")).booleanValue(); } if (options.containsKey("useLdaps")) { _useLdaps = Boolean.parseBoolean((String) options.get("useLdaps")); } _userObjectClass = getOption(options, "userObjectClass", _userObjectClass); _userRdnAttribute = getOption(options, "userRdnAttribute", _userRdnAttribute); _userIdAttribute = getOption(options, "userIdAttribute", _userIdAttribute); _userPasswordAttribute = getOption(options, "userPasswordAttribute", _userPasswordAttribute); _roleObjectClass = getOption(options, "roleObjectClass", _roleObjectClass); _roleMemberAttribute = getOption(options, "roleMemberAttribute", _roleMemberAttribute); _roleNameAttribute = getOption(options, "roleNameAttribute", _roleNameAttribute); _debug = Boolean.valueOf(String.valueOf(getOption(options, "debug", Boolean.toString(_debug)))).booleanValue(); try { _rootContext = new InitialDirContext(getEnvironment()); } catch (NamingException ex) { throw new RuntimeException("Unable to establish root context", ex); } } public boolean commit() throws LoginException { try { _rootContext.close(); } catch (NamingException e) { throw new LoginException("error closing root context: " + e.getMessage()); } return super.commit(); } public boolean abort() throws LoginException { try { _rootContext.close(); } catch (NamingException e) { throw new LoginException("error closing root context: " + e.getMessage()); } return super.abort(); } private String getOption(Map options, String key, String defaultValue) { Object value = options.get(key); if (value == null) { return defaultValue; } return (String) value; } /** * get the context for connection * * @return */ public Hashtable getEnvironment() { Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, _contextFactory); if (_hostname != null) { env.put(Context.PROVIDER_URL, (_useLdaps?"ldaps://":"ldap://") + _hostname + (_port==0?"":":"+_port) +"/"); } if (_authenticationMethod != null) { env.put(Context.SECURITY_AUTHENTICATION, _authenticationMethod); } if (_bindDn != null) { env.put(Context.SECURITY_PRINCIPAL, _bindDn); } if (_bindPassword != null) { env.put(Context.SECURITY_CREDENTIALS, _bindPassword); } return env; } public static String convertCredentialJettyToLdap( String encryptedPassword ) { if ("MD5:".startsWith(encryptedPassword.toUpperCase())) { return "{MD5}" + encryptedPassword.substring("MD5:".length(), encryptedPassword.length()); } if ("CRYPT:".startsWith(encryptedPassword.toUpperCase())) { return "{CRYPT}" + encryptedPassword.substring("CRYPT:".length(), encryptedPassword.length()); } return encryptedPassword; } public static String convertCredentialLdapToJetty( String encryptedPassword ) { if (encryptedPassword == null) { return encryptedPassword; } if ("{MD5}".startsWith(encryptedPassword.toUpperCase())) { return "MD5:" + encryptedPassword.substring("{MD5}".length(), encryptedPassword.length()); } if ("{CRYPT}".startsWith(encryptedPassword.toUpperCase())) { return "CRYPT:" + encryptedPassword.substring("{CRYPT}".length(), encryptedPassword.length()); } return encryptedPassword; } } jetty-6.1.26/contrib/jetty-ldap-jaas/pom.xml0000644000175000017500000000776111466510475017441 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-ldap-jaas Jetty LDAP Jaas Jetty Jaas Login Module for LDAP maven-compiler-plugin 1.5 1.5 maven-antrun-plugin clean clean run copyjar install run org.apache.felix maven-bundle-plugin ${maven-bundle-plugin-version} true manifest J2SE-1.4 org.mortbay.jetty.ldap org.apache.maven.plugins maven-jar-plugin ${project.build.outputDirectory}/META-INF/MANIFEST.MF junit junit test org.codehaus.plexus plexus-apacheds 1.0-alpha-1 test org.codehaus.plexus plexus-container-default 1.0-alpha-20 test org.mortbay.jetty jetty ${project.version} provided org.mortbay.jetty jetty-plus ${project.version} provided org.mortbay.jetty jetty-naming ${project.version} provided jetty-6.1.26/contrib/jetty-rewrite-handler/0000755000175000017500000000000011745736516017357 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/0000755000175000017500000000000011745736515020145 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/0000755000175000017500000000000011745736515021124 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/0000755000175000017500000000000011745736515022045 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/0000755000175000017500000000000011745736515022634 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/0000755000175000017500000000000011745736515024311 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736515025450 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/0000755000175000017500000000000011745736515027065 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/0000755000175000017500000000000011745736515030546 5ustar moonmoon././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/CookiePatternRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/CookiePat0000644000175000017500000000532511001653150032326 0ustar moonmoon// ======================================================================== // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import java.util.Enumeration; import org.mortbay.jetty.HttpFields; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.handler.rewrite.CookiePatternRule; public class CookiePatternRuleTest extends AbstractRuleTestCase { public void setUp() throws Exception { super.setUp(); } public void testSingleCookie() throws IOException { String[][] cookie = { {"cookie", "value"} }; assertCookies(cookie); } public void testMultipleCookies() throws IOException { String[][] cookies = { {"cookie", "value"}, {"name", "wolfgangpuck"}, {"age", "28"} }; assertCookies(cookies); } private void assertCookies(String[][] cookies) throws IOException { for (int i = 0; i < cookies.length; i++) { String[] cookie = cookies[i]; // set cookie pattern CookiePatternRule rule = new CookiePatternRule(); rule.setPattern("*"); rule.setName(cookie[0]); rule.setValue(cookie[1]); System.out.println(rule.toString()); // apply cookie pattern rule.apply(_request.getRequestURI(), _request, _response); // verify HttpFields httpFields = _response.getHttpFields(); Enumeration e = httpFields.getValues(HttpHeaders.SET_COOKIE_BUFFER); int index = 0; while (e.hasMoreElements()) { String[] result = ((String)e.nextElement()).split("="); assertEquals(cookies[index][0], result[0]); assertEquals(cookies[index][1], result[1]); // +1 cookies index index++; } } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RegexRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RegexRule0000644000175000017500000000525511001653150032354 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; import java.io.IOException; import java.util.regex.Matcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.Request; import org.mortbay.jetty.handler.rewrite.RegexRule; import junit.framework.TestCase; public class RegexRuleTest extends TestCase { private RegexRule _rule; public void setUp() { _rule = new TestRegexRule(); } public void tearDown() { _rule = null; } public void testTrueMatch() throws IOException { String[][] matchCases = { // regex: *.jsp {"/.*.jsp", "/hello.jsp"}, {"/.*.jsp", "/abc/hello.jsp"}, // regex: /abc or /def {"/abc|/def", "/abc"}, {"/abc|/def", "/def"}, // regex: *.do or *.jsp {".*\\.do|.*\\.jsp", "/hello.do"}, {".*\\.do|.*\\.jsp", "/hello.jsp"}, {".*\\.do|.*\\.jsp", "/abc/hello.do"}, {".*\\.do|.*\\.jsp", "/abc/hello.jsp"}, {"/abc/.*.htm|/def/.*.htm", "/abc/hello.htm"}, {"/abc/.*.htm|/def/.*.htm", "/abc/def/hello.htm"}, // regex: /abc/*.jsp {"/abc/.*.jsp", "/abc/hello.jsp"}, {"/abc/.*.jsp", "/abc/def/hello.jsp"} }; for (int i = 0; i < matchCases.length; i++) { String[] matchCase = matchCases[i]; assertMatch(true, matchCase); } } public void testFalseMatch() throws IOException { String[][] matchCases = { {"/abc/.*.jsp", "/hello.jsp"} }; for (int i = 0; i < matchCases.length; i++) { String[] matchCase = matchCases[i]; assertMatch(false, matchCase); } } private void assertMatch(boolean flag, String[] matchCase) throws IOException { _rule.setRegex(matchCase[0]); final String uri=matchCase[1]; String result = _rule.matchAndApply(uri, new Request() { public String getRequestURI() { return uri; } }, null ); assertEquals("regex: " + matchCase[0] + " uri: " + matchCase[1], flag, result!=null); } private class TestRegexRule extends RegexRule { public String apply(String target,HttpServletRequest request,HttpServletResponse response, Matcher matcher) throws IOException { return target; } } } ././@LongLink0000000000000000000000000000017600000000000011571 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/ForwardedSchemeHeaderRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/Forwarded0000644000175000017500000000445111040033161032361 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; import org.mortbay.jetty.HttpFields; public class ForwardedSchemeHeaderRuleTest extends AbstractRuleTestCase { private ForwardedSchemeHeaderRule _rule; private HttpFields _requestHeaderFields; public void setUp() throws Exception { super.setUp(); _rule = new ForwardedSchemeHeaderRule(); _requestHeaderFields = _connection.getRequestFields(); _request.setScheme(null); } public void testDefaultScheme() throws Exception { setRequestHeader("X-Forwarded-Scheme", "https"); _rule.setHeader("X-Forwarded-Scheme"); _rule.setHeaderValue("https"); _rule.matchAndApply("/", _request, _response); assertEquals("https", _request.getScheme()); } public void testScheme() throws Exception { setRequestHeader("X-Forwarded-Scheme", "https"); _rule.setHeader("X-Forwarded-Scheme"); _rule.setHeaderValue("https"); _rule.setScheme("https"); _rule.matchAndApply("/", _request, _response); assertEquals("https", _request.getScheme()); _rule.setScheme("http"); _rule.matchAndApply("/", _request, _response); assertEquals("http", _request.getScheme()); } public void testHeaderValue() throws Exception { setRequestHeader("Front-End-Https", "on"); _rule.setHeader("Front-End-Https"); _rule.setHeaderValue("on"); _rule.setScheme("https"); _rule.matchAndApply("/",_request,_response); assertEquals("https",_request.getScheme()); _request.setScheme(null); // header value doesn't match rule's value setRequestHeader("Front-End-Https", "off"); _rule.matchAndApply("/",_request,_response); assertEquals(null,_request.getScheme()); _request.setScheme(null); // header value can be any value setRequestHeader("Front-End-Https", "any"); _rule.setHeaderValue(null); _rule.matchAndApply("/",_request,_response); assertEquals("https",_request.getScheme()); } private void setRequestHeader(String header, String headerValue) { _requestHeaderFields.put(header, headerValue); } } ././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RewriteRegexRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RewriteRe0000644000175000017500000000340310776713744032403 0ustar moonmoon// ======================================================================== // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import org.mortbay.jetty.handler.rewrite.RewriteRegexRule; public class RewriteRegexRuleTest extends AbstractRuleTestCase { private RewriteRegexRule _rule; String[][] _tests= { {"/foo/bar",".*","/replace","/replace"}, {"/foo/bar","/xxx.*","/replace",null}, {"/foo/bar","/(.*)/(.*)","/$2/$1/xxx","/bar/foo/xxx"}, }; public void setUp() throws Exception { super.setUp(); _rule=new RewriteRegexRule(); } public void testRequestUriEnabled() throws IOException { for (int i=0;i<_tests.length;i++) { _rule.setRegex(_tests[i][1]); _rule.setReplacement(_tests[i][2]); String result = _rule.matchAndApply(_tests[i][0], _request, _response); assertEquals(_tests[i][1],_tests[i][3], result); } } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/PatternRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/PatternRu0000644000175000017500000001154211001653150032372 0ustar moonmoon// ======================================================================== // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.Request; import org.mortbay.jetty.handler.rewrite.PatternRule; import junit.framework.TestCase; public class PatternRuleTest extends TestCase { private PatternRule _rule; public void setUp() { _rule = new TestPatternRule(); } public void tearDown() { _rule = null; } public void testTrueMatch() throws IOException { String[][] matchCases = { // index 0 - pattern // index 1 - URI to match {"/abc", "/abc"}, {"/abc/", "/abc/"}, {"/abc/path/longer", "/abc/path/longer"}, {"/abc/path/longer/", "/abc/path/longer/"}, {"/abc/*", "/abc/hello.jsp"}, {"/abc/*", "/abc/a"}, {"/abc/*", "/abc/a/hello.jsp"}, {"/abc/*", "/abc/a/b"}, {"/abc/*", "/abc/a/b/hello.jsp"}, {"/abc/*", "/abc/a/b/c"}, {"/abc/*", "/abc/a/b/c/hello.jsp"}, {"/abc/def/*", "/abc/def/gf"}, {"/abc/def/*", "/abc/def/gf.html"}, {"/abc/def/*", "/abc/def/ghi"}, {"/abc/def/*", "/abc/def/ghi/"}, {"/abc/def/*", "/abc/def/ghi/hello.html"}, {"*.do", "/abc.do"}, {"*.do", "/abc/hello.do"}, {"*.do", "/abc/def/hello.do"}, {"*.do", "/abc/def/ghi/hello.do"}, {"*.jsp", "/abc.jsp"}, {"*.jsp", "/abc/hello.jsp"}, {"*.jsp", "/abc/def/hello.jsp"}, {"*.jsp", "/abc/def/ghi/hello.jsp"}, {"/", "/Other"}, {"/", "/Other/hello.do"}, {"/", "/Other/path"}, {"/", "/Other/path/hello.do"}, {"/", "/abc/def"}, {"/abc:/def", "/abc:/def"} }; for (int i = 0; i < matchCases.length; i++) { String[] matchCase = matchCases[i]; assertMatch(true, matchCase); } } public void testFalseMatch() throws IOException { String[][] matchCases = { {"/abc", "/abcd"}, {"/abc/", "/abcd/"}, {"/abc/path/longer", "/abc/path/longer/"}, {"/abc/path/longer", "/abc/path/longer1"}, {"/abc/path/longer/", "/abc/path/longer"}, {"/abc/path/longer/", "/abc/path/longer1/"}, {"/*.jsp", "/hello.jsp"}, {"/abc/*.jsp", "/abc/hello.jsp"}, {"*.jsp", "/hello.1jsp"}, {"*.jsp", "/hello.jsp1"}, {"*.jsp", "/hello.do"}, {"*.jsp", "/abc/hello.do"}, {"*.jsp", "/abc/def/hello.do"}, {"*.jsp", "/abc.do"} }; for (int i = 0; i < matchCases.length; i++) { String[] matchCase = matchCases[i]; assertMatch(false, matchCase); } } private void assertMatch(boolean flag, String[] matchCase) throws IOException { _rule.setPattern(matchCase[0]); final String uri=matchCase[1]; String result = _rule.matchAndApply(uri, new Request() { { setRequestURI(uri); } }, null ); assertEquals("pattern: " + matchCase[0] + " uri: " + matchCase[1], flag, result!=null); } private class TestPatternRule extends PatternRule { @Override public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { return target; } } } ././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/LowThreadsRuleContainerTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/LowThread0000644000175000017500000001006111354443177032353 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; import org.mortbay.thread.QueuedThreadPool; import org.mortbay.thread.ThreadPool; /** * Test harness for {@link LowThreadsRuleContainer} * * @author joakime */ public class LowThreadsRuleContainerTest extends AbstractRuleTestCase { RewriteHandler _handler; RewritePatternRule _rule; RewritePatternRule _warnRule; QueuedThreadPool _queuedThreadPool; LowThreadsRuleContainer _busyContainerRule; int maxThreads = 5; int lowThreads = 0; public void setUp() throws Exception { _queuedThreadPool = new QueuedThreadPool(); _queuedThreadPool.setMinThreads( maxThreads ); _queuedThreadPool.setLowThreads( lowThreads ); _server.setThreadPool( _queuedThreadPool ); _handler = new RewriteHandler(); _handler.setRewriteRequestURI( true ); _rule = new RewritePatternRule(); _rule.setPattern( "/cheese/*" ); _rule.setReplacement( "/rule" ); _warnRule = new RewritePatternRule(); _warnRule.setPattern( "/cheese/*" ); _warnRule.setReplacement( "/too-busy/" ); _busyContainerRule = new LowThreadsRuleContainer(); _busyContainerRule.setThreadPool( _queuedThreadPool ); _busyContainerRule.setRules( new Rule[] { _warnRule } ); _server.setHandler( _handler ); super.setUp(); _request.setRequestURI( "/cheese/bar" ); } public void tearDown() { _rule = null; } /** * Simple happy path test case. * The alternative rewrite rules based on low thread availability should * not be triggered. * * @throws Exception */ public void testSufficientThreads() throws Exception { LowThreadPool pool = new LowThreadPool(); pool.setLowOnThreads(false); _busyContainerRule.setThreadPool( pool ); _handler.setRules( new Rule[] { _busyContainerRule, _rule } ); _server.handle( "/cheese/bar", _request, _response, 0 ); assertEquals( "/rule/bar", _request.getRequestURI() ); } /** * Simple test case to ensure that low on threads causes appropriate * rules to execute. * The main rewrite rule will not execute, as the low rewrite rule is * handled in this situation. * * @throws Exception */ public void testLowThreads() throws Exception { LowThreadPool pool = new LowThreadPool(); _busyContainerRule.setThreadPool( pool ); _server.setThreadPool( pool ); _handler.setRules( new Rule[] { _busyContainerRule, _rule } ); _server.handle( "/cheese/bar", _request, _response, 0 ); assertEquals( "/too-busy/bar", _request.getRequestURI() ); } /** * Test the ability of the {@link LowThreadsRuleContainer} to * find the ThreadPool from the server. * * @throws Exception */ public void testLowThreadDiscoverViaServer() throws Exception { // Let the rule container find the thread pool itself. _busyContainerRule.setThreadPool( null ); // The thread pool we want to use. LowThreadPool pool = new LowThreadPool(); _server.stop(); _server.setThreadPool( pool ); _server.start(); // Set the rule order _handler.setRules( new Rule[] { _busyContainerRule, _rule } ); _server.handle( "/cheese/bar", _request, _response, 0 ); assertSame( "Found expected thread pool", pool, _busyContainerRule.getThreadPool() ); assertEquals( "/too-busy/bar", _request.getRequestURI() ); } /** * A Test ThreadPool used to test low thread pool conditions. * * @author joakime */ class LowThreadPool extends QueuedThreadPool implements ThreadPool { private boolean lowOnThreads = true; public void setLowOnThreads( boolean low ) { this.lowOnThreads = low; } @Override public boolean isLowOnThreads() { return lowOnThreads; } } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/MsieSslRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/MsieSslRu0000644000175000017500000002167311001653150032342 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; import org.mortbay.jetty.HttpFields; import org.mortbay.jetty.HttpHeaderValues; import org.mortbay.jetty.HttpHeaders; public class MsieSslRuleTest extends AbstractRuleTestCase { private MsieSslRule _rule; public void setUp() throws Exception { // enable SSL _isSecure = true; super.setUp(); _rule = new MsieSslRule(); } public void testWin2kWithIE5() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION));; fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"); result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION));; } public void testWin2kWithIE6() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWin2kWithIE7() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(null, result); assertEquals(null, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWin2kSP1WithIE5() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.01)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.01)"); result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.01)"); result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWin2kSP1WithIE6() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.01)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWin2kSP1WithIE7() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.01)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(null, result); assertEquals(null, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWinXpWithIE5() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.1)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.1)"); result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.1)"); result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWinXpWithIE6() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(null, result); assertEquals(null, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWinXpWithIE7() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(null, result); assertEquals(null, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWinVistaWithIE5() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 6.0)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 6.0)"); result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 6.0)"); result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(_request.getRequestURI(), result); assertEquals(HttpHeaderValues.CLOSE, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWinVistaWithIE6() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.0)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(null, result); assertEquals(null, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWinVistaWithIE7() throws Exception { HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(null, result); assertEquals(null, _response.getHeader(HttpHeaders.CONNECTION)); } public void testWithoutSsl() throws Exception { // disable SSL _isSecure = false; super.stop(); super.start(); HttpFields fields = _connection.getRequestFields(); fields.add("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)"); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); assertEquals(null, result); assertEquals(null, _response.getHeader(HttpHeaders.CONNECTION)); } } ././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RewritePatternRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RewritePa0000644000175000017500000000352011001653150032345 0ustar moonmoon// ======================================================================== // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import org.mortbay.jetty.handler.rewrite.RewritePatternRule; public class RewritePatternRuleTest extends AbstractRuleTestCase { private RewritePatternRule _rule; String[][] _tests= { {"/foo/bar","/","/replace"}, {"/foo/bar","/*","/replace/foo/bar"}, {"/foo/bar","/foo/*","/replace/bar"}, {"/foo/bar","/foo/bar","/replace"}, {"/foo/bar.txt","*.txt","/replace"}, }; public void setUp() throws Exception { super.setUp(); _rule = new RewritePatternRule(); _rule.setReplacement("/replace"); } public void testRequestUriEnabled() throws IOException { for (int i=0;i<_tests.length;i++) { _rule.setPattern(_tests[i][1]); String result = _rule.matchAndApply(_tests[i][0], _request, _response); assertEquals(_tests[i][1],_tests[i][2], result); } } } ././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/HeaderPatternRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/HeaderPat0000644000175000017500000000646111001653150032307 0ustar moonmoon// ======================================================================== // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import java.util.Enumeration; import org.mortbay.jetty.handler.rewrite.HeaderPatternRule; public class HeaderPatternRuleTest extends AbstractRuleTestCase { private HeaderPatternRule _rule; public void setUp() throws Exception { super.setUp(); _rule = new HeaderPatternRule(); _rule.setPattern("*"); } public void testHeaderWithTextValues() throws IOException { // different keys String headers[][] = { { "hnum#1", "test1" }, { "hnum#2", "2test2" }, { "hnum#3", "test3" } }; assertHeaders(headers); } public void testHeaderWithNumberValues() throws IOException { String headers[][] = { { "hello", "1" }, { "hello", "-1" }, { "hello", "100" }, { "hello", "100" }, { "hello", "100" }, { "hello", "100" }, { "hello", "100" }, { "hello1", "200" } }; assertHeaders(headers); } public void testHeaderOverwriteValues() throws IOException { String headers[][] = { { "size", "100" }, { "size", "200" }, { "size", "300" }, { "size", "400" }, { "size", "500" }, { "title", "abc" }, { "title", "bac" }, { "title", "cba" }, { "title1", "abba" }, { "title1", "abba1" }, { "title1", "abba" }, { "title1", "abba1" } }; assertHeaders(headers); Enumeration e = _response.getHeaders("size"); int count = 0; while (e.hasMoreElements()) { e.nextElement(); count++; } assertEquals(1, count); assertEquals("500", _response.getHeader("size")); assertEquals("cba", _response.getHeader("title")); assertEquals("abba1", _response.getHeader("title1")); } private void assertHeaders(String headers[][]) throws IOException { for (int i = 0; i < headers.length; i++) { _rule.setName(headers[i][0]); _rule.setValue(headers[i][1]); _rule.apply(null, _request, _response); assertEquals(headers[i][1], _response.getHeader(headers[i][0])); } } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RewriteHandlerTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RewriteHa0000644000175000017500000001310510776715105032356 0ustar moonmoon// ======================================================================== // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.handler.AbstractHandler; public class RewriteHandlerTest extends AbstractRuleTestCase { RewriteHandler _handler; RewritePatternRule _rule1; RewritePatternRule _rule2; RewritePatternRule _rule3; public void setUp() throws Exception { _handler=new RewriteHandler(); _server.setHandler(_handler); _handler.setHandler(new AbstractHandler(){ public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { response.setStatus(201); request.setAttribute("target",target); request.setAttribute("URI",request.getRequestURI()); request.setAttribute("info",request.getPathInfo()); } }); _rule1 = new RewritePatternRule(); _rule1.setPattern("/aaa/*"); _rule1.setReplacement("/bbb"); _rule2 = new RewritePatternRule(); _rule2.setPattern("/bbb/*"); _rule2.setReplacement("/ccc"); _rule3 = new RewritePatternRule(); _rule3.setPattern("/ccc/*"); _rule3.setReplacement("/ddd"); _handler.setRules(new Rule[]{_rule1,_rule2,_rule3}); super.setUp(); } public void test() throws Exception { _response.setStatus(200); _request.setHandled(false); _handler.setOriginalPathAttribute("/before"); _handler.setRewriteRequestURI(false); _handler.setRewritePathInfo(false); _request.setRequestURI("/foo/bar"); _request.setPathInfo("/foo/bar"); _handler.handle("/foo/bar",_request,_response,0); assertEquals(201,_response.getStatus()); assertEquals("/foo/bar",_request.getAttribute("target")); assertEquals("/foo/bar",_request.getAttribute("URI")); assertEquals("/foo/bar",_request.getAttribute("info")); assertEquals(null,_request.getAttribute("before")); _response.setStatus(200); _request.setHandled(false); _handler.setOriginalPathAttribute(null); _request.setRequestURI("/aaa/bar"); _request.setPathInfo("/aaa/bar"); _handler.handle("/aaa/bar",_request,_response,0); assertEquals(201,_response.getStatus()); assertEquals("/ddd/bar",_request.getAttribute("target")); assertEquals("/aaa/bar",_request.getAttribute("URI")); assertEquals("/aaa/bar",_request.getAttribute("info")); assertEquals(null,_request.getAttribute("before")); _response.setStatus(200); _request.setHandled(false); _handler.setOriginalPathAttribute("before"); _handler.setRewriteRequestURI(true); _handler.setRewritePathInfo(true); _request.setRequestURI("/aaa/bar"); _request.setPathInfo("/aaa/bar"); _handler.handle("/aaa/bar",_request,_response,0); assertEquals(201,_response.getStatus()); assertEquals("/ddd/bar",_request.getAttribute("target")); assertEquals("/ddd/bar",_request.getAttribute("URI")); assertEquals("/ddd/bar",_request.getAttribute("info")); assertEquals("/aaa/bar",_request.getAttribute("before")); _response.setStatus(200); _request.setHandled(false); _rule2.setTerminating(true); _request.setRequestURI("/aaa/bar"); _request.setPathInfo("/aaa/bar"); _handler.handle("/aaa/bar",_request,_response,0); assertEquals(201,_response.getStatus()); assertEquals("/ccc/bar",_request.getAttribute("target")); assertEquals("/ccc/bar",_request.getAttribute("URI")); assertEquals("/ccc/bar",_request.getAttribute("info")); assertEquals("/aaa/bar",_request.getAttribute("before")); _response.setStatus(200); _request.setHandled(false); _rule2.setHandling(true); _request.setAttribute("before",null); _request.setAttribute("target",null); _request.setAttribute("URI",null); _request.setAttribute("info",null); _request.setRequestURI("/aaa/bar"); _request.setPathInfo("/aaa/bar"); _handler.handle("/aaa/bar",_request,_response,0); assertEquals(200,_response.getStatus()); assertEquals(null,_request.getAttribute("target")); assertEquals(null,_request.getAttribute("URI")); assertEquals(null,_request.getAttribute("info")); assertEquals("/aaa/bar",_request.getAttribute("before")); assertTrue(_request.isHandled()); } } ././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/VirtualHostRuleContainerTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/VirtualHo0000644000175000017500000001635111072306035032373 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; public class VirtualHostRuleContainerTest extends AbstractRuleTestCase { RewriteHandler _handler; RewritePatternRule _rule; RewritePatternRule _fooRule; VirtualHostRuleContainer _fooContainerRule; public void setUp() throws Exception { _handler = new RewriteHandler(); _handler.setRewriteRequestURI(true); _rule = new RewritePatternRule(); _rule.setPattern("/cheese/*"); _rule.setReplacement("/rule"); _fooRule = new RewritePatternRule(); _fooRule.setPattern("/cheese/bar/*"); _fooRule.setReplacement("/cheese/fooRule"); _fooContainerRule = new VirtualHostRuleContainer(); _fooContainerRule.setVirtualHosts(new String[] {"foo.com"}); _fooContainerRule.setRules(new Rule[] { _fooRule }); _server.setHandler(_handler); super.setUp(); _request.setRequestURI("/cheese/bar"); } public void testArbitraryHost() throws Exception { _request.setServerName("cheese.com"); _handler.setRules(new Rule[] { _rule, _fooContainerRule }); handleRequest(); assertEquals("{_rule, _fooContainerRule, Host: cheese.com}: applied _rule", "/rule/bar", _request.getRequestURI()); } public void testVirtualHost() throws Exception { _request.setServerName("foo.com"); _handler.setRules(new Rule[] { _fooContainerRule }); handleRequest(); assertEquals("{_fooContainerRule, Host: foo.com}: applied _fooRule", "/cheese/fooRule", _request.getRequestURI()); } public void testCascadingRules() throws Exception { _request.setServerName("foo.com"); _request.setRequestURI("/cheese/bar"); _rule.setTerminating(false); _fooRule.setTerminating(false); _fooContainerRule.setTerminating(false); _handler.setRules(new Rule[]{_rule, _fooContainerRule}); handleRequest(); assertEquals("{_rule, _fooContainerRule}: applied _rule, didn't match _fooRule", "/rule/bar", _request.getRequestURI()); _request.setRequestURI("/cheese/bar"); _handler.setRules(new Rule[] { _fooContainerRule, _rule }); handleRequest(); assertEquals("{_fooContainerRule, _rule}: applied _fooRule, _rule","/rule/fooRule", _request.getRequestURI()); _request.setRequestURI("/cheese/bar"); _fooRule.setTerminating(true); handleRequest(); assertEquals("{_fooContainerRule, _rule}: (_fooRule is terminating); applied _fooRule, _rule", "/rule/fooRule", _request.getRequestURI()); _request.setRequestURI("/cheese/bar"); _fooRule.setTerminating(false); _fooContainerRule.setTerminating(true); handleRequest(); assertEquals("{_fooContainerRule, _rule}: (_fooContainerRule is terminating); applied _fooRule, terminated before _rule", "/cheese/fooRule", _request.getRequestURI()); } public void testCaseInsensitiveHostname() throws Exception { _request.setServerName("Foo.com"); _fooContainerRule.setVirtualHosts(new String[] {"foo.com"} ); _handler.setRules(new Rule[]{ _fooContainerRule }); handleRequest(); assertEquals("Foo.com and foo.com are equivalent", "/cheese/fooRule", _request.getRequestURI()); } public void testEmptyVirtualHost() throws Exception { _request.setServerName("cheese.com"); _handler.setRules(new Rule[] { _fooContainerRule }); _fooContainerRule.setVirtualHosts(null); handleRequest(); assertEquals("{_fooContainerRule: virtual hosts array is null, Host: cheese.com}: apply _fooRule", "/cheese/fooRule", _request.getRequestURI()); _request.setRequestURI("/cheese/bar"); _request.setRequestURI("/cheese/bar"); _fooContainerRule.setVirtualHosts(new String[] {}); handleRequest(); assertEquals("{_fooContainerRule: virtual hosts array is empty, Host: cheese.com}: apply _fooRule", "/cheese/fooRule", _request.getRequestURI()); _request.setRequestURI("/cheese/bar"); _request.setRequestURI("/cheese/bar"); _fooContainerRule.setVirtualHosts(new String[] {null}); handleRequest(); assertEquals("{_fooContainerRule: virtual host is null, Host: cheese.com}: apply _fooRule", "/cheese/fooRule", _request.getRequestURI()); } public void testMultipleVirtualHosts() throws Exception { _request.setServerName("foo.com"); _handler.setRules(new Rule[] {_fooContainerRule }); _fooContainerRule.setVirtualHosts(new String[]{ "cheese.com" }); handleRequest(); assertEquals("{_fooContainerRule: vhosts[cheese.com], Host: foo.com}: no effect", "/cheese/bar", _request.getRequestURI()); _request.setRequestURI("/cheese/bar"); _fooContainerRule.addVirtualHost( "foo.com" ); handleRequest(); assertEquals("{_fooContainerRule: vhosts[cheese.com, foo.com], Host: foo.com}: apply _fooRule", "/cheese/fooRule", _request.getRequestURI()); } public void testWildcardVirtualHosts() throws Exception { checkWildcardHost(true,null,new String[] {"foo.com", ".foo.com", "vhost.foo.com"}); checkWildcardHost(true,new String[] {null},new String[] {"foo.com", ".foo.com", "vhost.foo.com"}); checkWildcardHost(true,new String[] {"foo.com", "*.foo.com"}, new String[] {"foo.com", ".foo.com", "vhost.foo.com"}); checkWildcardHost(false,new String[] {"foo.com", "*.foo.com"}, new String[] {"badfoo.com", ".badfoo.com", "vhost.badfoo.com"}); checkWildcardHost(false,new String[] {"*."}, new String[] {"anything.anything"}); checkWildcardHost(true,new String[] {"*.foo.com"}, new String[] {"vhost.foo.com", ".foo.com"}); checkWildcardHost(false,new String[] {"*.foo.com"}, new String[] {"vhost.www.foo.com", "foo.com", "www.vhost.foo.com"}); checkWildcardHost(true,new String[] {"*.sub.foo.com"}, new String[] {"vhost.sub.foo.com", ".sub.foo.com"}); checkWildcardHost(false,new String[] {"*.sub.foo.com"}, new String[] {".foo.com", "sub.foo.com", "vhost.foo.com"}); checkWildcardHost(false,new String[] {"foo.*.com","foo.com.*"}, new String[] {"foo.vhost.com", "foo.com.vhost", "foo.com"}); } private void checkWildcardHost(boolean succeed, String[] ruleHosts, String[] requestHosts) throws Exception { _fooContainerRule.setVirtualHosts(ruleHosts); _handler.setRules(new Rule[] { _fooContainerRule }); for(String host: requestHosts) { _request.setServerName(host); _request.setRequestURI("/cheese/bar"); handleRequest(); if(succeed) assertEquals("{_fooContainerRule, Host: "+host+"}: should apply _fooRule", "/cheese/fooRule", _request.getRequestURI()); else assertEquals("{_fooContainerRule, Host: "+host+"}: should not apply _fooRule", "/cheese/bar", _request.getRequestURI()); } } private void handleRequest() throws Exception { _server.handle("/cheese/bar", _request, _response, 0); } } ././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RedirectRegexRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RedirectR0000644000175000017500000000465011224733370032345 0ustar moonmoon// ======================================================================== // Copyright 2009 Webtide LLC // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import org.mortbay.jetty.HttpHeaders; public class RedirectRegexRuleTest extends AbstractRuleTestCase { private RedirectRegexRule _rule; public void setUp() throws Exception { super.setUp(); _rule = new RedirectRegexRule(); } public void tearDown() { _rule = null; } public void testLocationWithReplacementGroupEmpty() throws IOException { _rule.setRegex("/my/dir/file/(.*)$"); _rule.setReplacement("http://www.mortbay.org/$1"); // Resource is dir _rule.matchAndApply("/my/dir/file/", _request, _response); assertEquals("http://www.mortbay.org/", _response.getHeader(HttpHeaders.LOCATION)); } public void testLocationWithReplacmentGroupSimple() throws IOException { _rule.setRegex("/my/dir/file/(.*)$"); _rule.setReplacement("http://www.mortbay.org/$1"); // Resource is an image _rule.matchAndApply("/my/dir/file/image.png", _request, _response); assertEquals("http://www.mortbay.org/image.png", _response.getHeader(HttpHeaders.LOCATION)); } public void testLocationWithReplacementGroupDeepWithParams() throws IOException { _rule.setRegex("/my/dir/file/(.*)$"); _rule.setReplacement("http://www.mortbay.org/$1"); // Resource is api with parameters _rule.matchAndApply("/my/dir/file/api/rest/foo?id=100&sort=date", _request, _response); assertEquals("http://www.mortbay.org/api/rest/foo?id=100&sort=date", _response.getHeader(HttpHeaders.LOCATION)); } } ././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/ResponsePatternRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/ResponseP0000644000175000017500000000521110776703501032376 0ustar moonmoon// ======================================================================== // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import org.mortbay.jetty.handler.rewrite.ResponsePatternRule; public class ResponsePatternRuleTest extends AbstractRuleTestCase { private ResponsePatternRule _rule; public void setUp() throws Exception { super.setUp(); _rule = new ResponsePatternRule(); _rule.setPattern("/test"); } public void testStatusCodeNoReason() throws IOException { for (int i = 1; i < 400; i++) { _rule.setCode("" + i); _rule.apply(null, _request, _response); assertEquals(i, _response.getStatus()); } } public void testStatusCodeWithReason() throws IOException { for (int i = 1; i < 400; i++) { _rule.setCode("" + i); _rule.setReason("reason" + i); _rule.apply(null, _request, _response); assertEquals(i, _response.getStatus()); assertEquals(null, _response.getReason()); } } public void testErrorStatusNoReason() throws IOException { for (int i = 400; i < 600; i++) { _rule.setCode("" + i); _rule.apply(null, _request, _response); assertEquals(i, _response.getStatus()); assertEquals("", _response.getReason()); super.reset(); } } public void testErrorStatusWithReason() throws IOException { for (int i = 400; i < 600; i++) { _rule.setCode("" + i); _rule.setReason("reason-" + i); _rule.apply(null, _request, _response); assertEquals(i, _response.getStatus()); assertEquals("reason-" + i, _response.getReason()); super.reset(); } } } ././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/AbstractRuleTestCase.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/AbstractR0000644000175000017500000000456011001653150032335 0ustar moonmoon// ======================================================================== // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import junit.framework.TestCase; import org.mortbay.io.bio.StringEndPoint; import org.mortbay.jetty.Connector; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.LocalConnector; import org.mortbay.jetty.Request; import org.mortbay.jetty.Response; import org.mortbay.jetty.Server; public abstract class AbstractRuleTestCase extends TestCase { protected Server _server=new Server(); protected LocalConnector _connector; protected StringEndPoint _endpoint=new StringEndPoint(); protected HttpConnection _connection; protected Request _request; protected Response _response; protected boolean _isSecure = false; public void setUp() throws Exception { start(); } public void tearDown() throws Exception { stop(); } public void start() throws Exception { _connector = new LocalConnector() { public boolean isConfidential(Request request) { return _isSecure; } }; _server.setConnectors(new Connector[]{_connector}); _server.start(); reset(); } public void stop() throws Exception { _server.stop(); _request = null; _response = null; } public void reset() { _connection = new HttpConnection(_connector,_endpoint,_server); _request = new Request(_connection); _response = new Response(_connection); _request.setRequestURI("/test/"); } } ././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RedirectPatternRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/RedirectP0000644000175000017500000000313110776703501032340 0ustar moonmoon// ======================================================================== // Copyright 2006 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.handler.rewrite.RedirectPatternRule; public class RedirectPatternRuleTest extends AbstractRuleTestCase { private RedirectPatternRule _rule; public void setUp() throws Exception { super.setUp(); _rule = new RedirectPatternRule(); _rule.setPattern("*"); } public void tearDown() { _rule = null; } public void testLocation() throws IOException { String location = "http://mortbay.com"; _rule.setLocation(location); _rule.apply(null, _request, _response); assertEquals(location, _response.getHeader(HttpHeaders.LOCATION)); } } ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/LegacyRuleTest.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/test/java/org/mortbay/jetty/handler/rewrite/LegacyRul0000644000175000017500000000207511001653150032336 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; public class LegacyRuleTest extends AbstractRuleTestCase { private LegacyRule _rule; String[][] _tests= { {"/foo/bar","/*","/replace/foo/bar"}, {"/foo/bar","/foo/*","/replace/bar"}, {"/foo/bar","/foo/bar","/replace"} }; public void setUp() throws Exception { super.setUp(); _rule = new LegacyRule(); } public void tearDown() { _rule = null; } public void testMatchAndApply() throws Exception { for (int i=0;i<_tests.length;i++) { _rule.addRewriteRule(_tests[i][1], "/replace"); String result = _rule.matchAndApply(_tests[i][0], _request, _response); assertEquals(_tests[i][1], _tests[i][2], result); } } public void testAddRewrite() { try { _rule.addRewriteRule("*.txt", "/replace"); fail(); } catch (IllegalArgumentException e) { } } } jetty-6.1.26/contrib/jetty-rewrite-handler/src/test/resources/0000755000175000017500000000000011745736515023136 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/test/resources/org.mortbay.jetty.handler/0000755000175000017500000000000011745736515030153 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/0000755000175000017500000000000011745736516021072 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/0000755000175000017500000000000011745736515022012 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/0000755000175000017500000000000011745736515022601 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/0000755000175000017500000000000011745736515024256 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736515025415 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/0000755000175000017500000000000011745736515027032 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/0000755000175000017500000000000011745736516030514 5ustar moonmoon././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/CookiePatternRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/CookiePat0000644000175000017500000000524311001653150032272 0ustar moonmoon//======================================================================== //$Id: CookiePatternRule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Sets the cookie in the response whenever the rule finds a match. * * @see Cookie */ public class CookiePatternRule extends PatternRule { private String _name; private String _value; /* ------------------------------------------------------------ */ public CookiePatternRule() { _handling = false; _terminating = false; } /* ------------------------------------------------------------ */ /** * Assigns the cookie name. * * @param name a String specifying the name of the cookie. */ public void setName(String name) { _name = name; } /* ------------------------------------------------------------ */ /** * Assigns the cookie value. * * @param value a String specifying the value of the cookie * @see Cookie#setValue(String) */ public void setValue(String value) { _value = value; } /* ------------------------------------------------------------ */ /* * (non-Javadoc) * @see org.mortbay.jetty.handler.rules.RuleBase#apply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { response.addCookie(new Cookie(_name, _value)); return target; } /* ------------------------------------------------------------ */ /** * Returns the cookie contents. */ public String toString() { return super.toString()+"["+_name+","+_value + "]"; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RegexRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RegexRule0000644000175000017500000000621111001653150032312 0ustar moonmoon//======================================================================== //$Id: RegexRule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Abstract rule to use as a base class for rules that match with a regular expression. */ public abstract class RegexRule extends Rule { protected Pattern _regex; /* ------------------------------------------------------------ */ /** * Sets the regular expression string used to match with string URI. * * @param regex the regular expression. */ public void setRegex(String regex) { _regex=Pattern.compile(regex); } /* ------------------------------------------------------------ */ /** * @return get the regular expression */ public String getRegex() { return _regex==null?null:_regex.pattern(); } /* ------------------------------------------------------------ */ public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { Matcher matcher=_regex.matcher(target); boolean matches = matcher.matches(); if (matches) return apply(target,request,response, matcher); return null; } /* ------------------------------------------------------------ */ /** * Apply this rule to the request/response pair. * Called by {@link #matchAndApply(String, HttpServletRequest, HttpServletResponse)} if the regex matches. * @param target field to attempt match * @param request request object * @param response response object * @param matcher The Regex matcher that matched the request (with capture groups available for replacement). * @return The target (possible updated). * @throws IOException exceptions dealing with operating on request or response objects */ protected abstract String apply(String target, HttpServletRequest request, HttpServletResponse response, Matcher matcher) throws IOException; /* ------------------------------------------------------------ */ /** * Returns the regular expression string. */ public String toString() { return super.toString()+"["+_regex+"]"; } } ././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/ForwardedSchemeHeaderRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/Forwarded0000644000175000017500000000206511040033161032325 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.Request; import org.mortbay.jetty.handler.rewrite.PatternRule; /** * Set the scheme for the request * * @author Ervin Varga * @author Athena Yao */ public class ForwardedSchemeHeaderRule extends HeaderRule { private String _scheme="https"; /* ------------------------------------------------------------ */ public String getScheme() { return _scheme; } /* ------------------------------------------------------------ */ /** * @param scheme the scheme to set on the request. Defaults to "https" */ public void setScheme(String scheme) { _scheme = scheme; } /* ------------------------------------------------------------ */ protected String apply(String target, String value, HttpServletRequest request, HttpServletResponse response) { ((Request) request).setScheme(_scheme); return target; } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RewriteRegexRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RewriteRe0000644000175000017500000000511011001653150032315 0ustar moonmoon//======================================================================== //$Id: RewriteRegexRule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import java.util.regex.Matcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Rewrite the URI by matching with a regular expression. * The replacement string may use $n" to replace the nth capture group. */ public class RewriteRegexRule extends RegexRule { private String _replacement; /* ------------------------------------------------------------ */ public RewriteRegexRule() { _handling = false; _terminating = false; } /* ------------------------------------------------------------ */ /** * Whenever a match is found, it replaces with this value. * * @param replacement the replacement string. */ public void setReplacement(String replacement) { _replacement = replacement; } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.jetty.handler.rules.RegexRule#apply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.util.regex.Matcher) */ public String apply(String target, HttpServletRequest request, HttpServletResponse response, Matcher matcher) throws IOException { target=_replacement; for (int g=1;g<=matcher.groupCount();g++) { String group = matcher.group(g); target=target.replaceAll("\\$"+g,group); } return target; } /* ------------------------------------------------------------ */ /** * Returns the replacement string. */ public String toString() { return super.toString()+"["+_replacement+"]"; } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/PatternRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/PatternRu0000644000175000017500000000543511001653150032343 0ustar moonmoon//======================================================================== //$Id: PatternRule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.servlet.PathMap; /** * Abstract rule that use a {@link PathMap} for pattern matching. It uses the * servlet pattern syntax. */ public abstract class PatternRule extends Rule { protected String _pattern; /* ------------------------------------------------------------ */ public String getPattern() { return _pattern; } /* ------------------------------------------------------------ */ /** * Sets the rule pattern. * * @param pattern the pattern */ public void setPattern(String pattern) { _pattern = pattern; } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.jetty.handler.rules.RuleBase#matchAndApply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { if (PathMap.match(_pattern, target)) { return apply(target,request, response); } return null; } /* ------------------------------------------------------------ */ /** Apply the rule to the request * @param target field to attempt match * @param request request object * @param response response object * @return The target (possible updated) * @throws IOException exceptions dealing with operating on request or response objects */ protected abstract String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException; /** * Returns the rule pattern. */ public String toString() { return super.toString()+"["+_pattern+"]"; } } ././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/LowThreadsRuleContainer.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/LowThread0000644000175000017500000000561311223065340032312 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.AbstractConnector; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.log.Log; import org.mortbay.thread.ThreadPool; /** * {@link RuleContainer} for when the {@link ThreadPool} is low on threads * * @author joakime */ public class LowThreadsRuleContainer extends RuleContainer { private ThreadPool _threadPool; private Server _server; /* ------------------------------------------------------------------------------- */ public Server getServer() { return _server; } /* ------------------------------------------------------------------------------- */ public void setServer( Server server ) { _server = server; } /* ------------------------------------------------------------------------------- */ public ThreadPool getThreadPool() { return _threadPool; } /* ------------------------------------------------------------------------------- */ private ThreadPool getThreadPool( Request request ) { if ( _threadPool == null ) { // Lazy load the thread pool from the connector. Connector connector = request.getConnection().getConnector(); if ( connector instanceof AbstractConnector ) { _threadPool = ( (AbstractConnector) connector ).getThreadPool(); return _threadPool; } if ( _server != null ) { // Next, try to load the thread pool from the server. _threadPool = _server.getThreadPool(); return _threadPool; } } return _threadPool; } /* ------------------------------------------------------------------------------- */ public void setThreadPool( ThreadPool pool ) { _threadPool = pool; } /** * Process the contained rules if the threadpool is low on threads * @param target target field to pass on to the contained rules * @param request request object to pass on to the contained rules * @param response response object to pass on to the contained rules */ public String matchAndApply( String target, HttpServletRequest request, HttpServletResponse response ) throws IOException { _threadPool = getThreadPool( (Request) request ); if ( _threadPool == null ) { Log.warn( "ThreadPool not found" ); return target; } Log.debug( "Low on threads: ", _threadPool.isLowOnThreads() ); if ( !_threadPool.isLowOnThreads() ) { return target; } return apply( target, request, response ); } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/MsieSslRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/MsieSslRu0000644000175000017500000000654511001653150032310 0ustar moonmoon//======================================================================== //$Id: MsieSslRule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.HttpHeaderValues; import org.mortbay.jetty.HttpHeaders; import org.mortbay.util.StringMap; /** * MSIE (Microsoft Internet Explorer) SSL Rule. * Disable keep alive for SSL from IE5 or IE6 on Windows 2000. * * @author gregw * */ public class MsieSslRule extends Rule { private static final int IEv5 = '5'; private static final int IEv6 = '6'; private static StringMap __IE6_BadOS = new StringMap(); { __IE6_BadOS.put("NT 5.01", Boolean.TRUE); __IE6_BadOS.put("NT 5.0",Boolean.TRUE); __IE6_BadOS.put("NT 4.0",Boolean.TRUE); __IE6_BadOS.put("98",Boolean.TRUE); __IE6_BadOS.put("98; Win 9x 4.90",Boolean.TRUE); __IE6_BadOS.put("95",Boolean.TRUE); __IE6_BadOS.put("CE",Boolean.TRUE); } public MsieSslRule() { _handling = false; _terminating = false; } public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { if (request.isSecure()) { String user_agent = request.getHeader(HttpHeaders.USER_AGENT); if (user_agent!=null) { int msie=user_agent.indexOf("MSIE"); if (msie>0 && user_agent.length()-msie>5) { // Get Internet Explorer Version int ieVersion = user_agent.charAt(msie+5); if ( ieVersion<=IEv5) { response.setHeader(HttpHeaders.CONNECTION, HttpHeaderValues.CLOSE); return target; } if (ieVersion==IEv6) { int windows = user_agent.indexOf("Windows",msie+5); if (windows>0) { int end=user_agent.indexOf(')',windows+8); if(end<0 || __IE6_BadOS.getEntry(user_agent,windows+8,end-windows-8)!=null) { response.setHeader(HttpHeaders.CONNECTION, HttpHeaderValues.CLOSE); return target; } } } } } } return null; } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RewritePatternRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RewritePa0000644000175000017500000000465211001653150032321 0ustar moonmoon//======================================================================== //$Id: RewritePatternRule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.servlet.PathMap; import org.mortbay.util.URIUtil; /** * Rewrite the URI by replacing the matched {@link PathMap} path with a fixed string. */ public class RewritePatternRule extends PatternRule { private String _replacement; /* ------------------------------------------------------------ */ public RewritePatternRule() { _handling = false; _terminating = false; } /* ------------------------------------------------------------ */ /** * Whenever a match is found, it replaces with this value. * * @param value the replacement string. */ public void setReplacement(String value) { _replacement = value; } /* ------------------------------------------------------------ */ /* * (non-Javadoc) * @see org.mortbay.jetty.handler.rules.RuleBase#apply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { target = URIUtil.addPaths(_replacement, PathMap.pathInfo(_pattern,target)); return target; } /* ------------------------------------------------------------ */ /** * Returns the replacement string. */ public String toString() { return super.toString()+"["+_replacement+"]"; } } jetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/Rule.java0000644000175000017500000000555111001653150032245 0ustar moonmoon//======================================================================== //$Id: Rule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * An abstract rule for creating rewrite rules. */ public abstract class Rule { protected boolean _terminating; protected boolean _handling; /** * This method calls tests the rule against the request/response pair and if the Rule * applies, then the rule's action is triggered. * @param target The target of the request * @param request * @param response * * @return The new target if the rule has matched, else null * @throws IOException TODO */ public abstract String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException; /** * Sets terminating to true or false. * If true, this rule will terminate the loop if this rule has been applied. * * @param terminating */ public void setTerminating(boolean terminating) { _terminating = terminating; } /** * Returns the terminating flag value. * * @return true if the rule needs to terminate; false otherwise. */ public boolean isTerminating() { return _terminating; } /** * Returns the handling flag value. * * @return true if the rule handles the request and nested handlers should not be called. */ public boolean isHandling() { return _handling; } /** * Set the handling flag value. * * @param handling true if the rule handles the request and nested handlers should not be called. */ public void setHandling(boolean handling) { _handling=handling; } /** * Returns the handling and terminating flag values. */ public String toString() { return this.getClass().getName()+(_handling?"[H":"[h")+(_terminating?"T]":"t]"); } }././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RuleContainer.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RuleConta0000644000175000017500000001773711453142150032327 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.Request; import org.mortbay.jetty.servlet.PathMap; import org.mortbay.log.Log; import org.mortbay.util.LazyList; /** * Base container to group rules. Can be extended so that the contained rules * will only be applied under certain conditions * * @author Athena Yao */ public class RuleContainer extends Rule { protected Rule[] _rules; protected boolean _handled; protected String _originalPathAttribute; protected boolean _rewriteRequestURI=true; protected boolean _rewritePathInfo=true; protected LegacyRule _legacy; /* ------------------------------------------------------------ */ private LegacyRule getLegacyRule() { if (_legacy==null) { _legacy= new LegacyRule(); addRule(_legacy); } return _legacy; } /* ------------------------------------------------------------ */ /** * To enable configuration from jetty.xml on rewriteRequestURI, rewritePathInfo and * originalPathAttribute * * @param legacyRule old style rewrite rule */ public void setLegacyRule(LegacyRule legacyRule) { _legacy = legacyRule; } /* ------------------------------------------------------------ */ /** * Returns the list of rules. * @return an array of {@link Rule}. */ public Rule[] getRules() { return _rules; } /* ------------------------------------------------------------ */ /** * Assigns the rules to process. * @param rules an array of {@link Rule}. */ public void setRules(Rule[] rules) { if (_legacy==null) _rules = rules; else { _rules=null; addRule(_legacy); if (rules!=null) for (Rule rule:rules) addRule(rule); } } /* ------------------------------------------------------------ */ /** * Add a Rule * @param rule The rule to add to the end of the rules array */ public void addRule(Rule rule) { _rules = (Rule[])LazyList.addToArray(_rules,rule,Rule.class); } /* ------------------------------------------------------------ */ /** * @return the rewriteRequestURI If true, this handler will rewrite the value * returned by {@link HttpServletRequest#getRequestURI()}. */ public boolean isRewriteRequestURI() { return _rewriteRequestURI; } /* ------------------------------------------------------------ */ /** * @param rewriteRequestURI true if this handler will rewrite the value * returned by {@link HttpServletRequest#getRequestURI()}. */ public void setRewriteRequestURI(boolean rewriteRequestURI) { _rewriteRequestURI=rewriteRequestURI; } /* ------------------------------------------------------------ */ /** * @return true if this handler will rewrite the value * returned by {@link HttpServletRequest#getPathInfo()}. */ public boolean isRewritePathInfo() { return _rewritePathInfo; } /* ------------------------------------------------------------ */ /** * @param rewritePathInfo true if this handler will rewrite the value * returned by {@link HttpServletRequest#getPathInfo()}. */ public void setRewritePathInfo(boolean rewritePathInfo) { _rewritePathInfo=rewritePathInfo; } /* ------------------------------------------------------------ */ /** * @return the originalPathAttribte. If non null, this string will be used * as the attribute name to store the original request path. */ public String getOriginalPathAttribute() { return _originalPathAttribute; } /* ------------------------------------------------------------ */ /** * @param originalPathAttribte If non null, this string will be used * as the attribute name to store the original request path. */ public void setOriginalPathAttribute(String originalPathAttribte) { _originalPathAttribute=originalPathAttribte; } /* ------------------------------------------------------------ */ /** * @deprecated */ public PathMap getRewrite() { return getLegacyRule().getRewrite(); } /* ------------------------------------------------------------ */ /** * @deprecated */ public void setRewrite(PathMap rewrite) { getLegacyRule().setRewrite(rewrite); } /* ------------------------------------------------------------ */ /** * @deprecated */ public void addRewriteRule(String pattern, String prefix) { getLegacyRule().addRewriteRule(pattern,prefix); } /** * @see http://jira.codehaus.org/browse/JETTY-1287 * * @return handled true if one of the rules within the rule container is handling the request * * @deprecated not thread safe, better to rely on baseRequest.isHandled() */ public boolean isHandled() { return _handled; } /*------------------------------------------------------------ */ /** * @param handled true if one of the rules within the rule container is handling the request * * @deprecated best to use the baseRequest.isHandled() */ public void setHandled(boolean handled) { _handled=handled; } /** * Process the contained rules * @param target target field to pass on to the contained rules * @param request request object to pass on to the contained rules * @param response response object to pass on to the contained rules */ @Override public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { return apply(target, request, response); } /** * Process the contained rules (called by matchAndApply) * @param target target field to pass on to the contained rules * @param request request object to pass on to the contained rules * @param response response object to pass on to the contained rules */ protected String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { _handled=false; boolean original_set=_originalPathAttribute==null; for (Rule rule : _rules) { String applied=rule.matchAndApply(target,request, response); if (applied!=null) { Log.debug("applied {}",rule); if (!target.equals(applied)) { Log.debug("rewrote {} to {}",target,applied); if (!original_set) { original_set=true; request.setAttribute(_originalPathAttribute, target); } if (_rewriteRequestURI) ((Request)request).setRequestURI(applied); if (_rewritePathInfo) ((Request)request).setPathInfo(applied); target=applied; } if (rule.isHandling()) { Log.debug("handling {}",rule); _handled=true;// leaving for historical purposes - http://jira.codehaus.org/browse/JETTY-1287 (request instanceof Request?(Request)request:HttpConnection.getCurrentConnection().getRequest()).setHandled(true); } if (rule.isTerminating()) { Log.debug("terminating {}",rule); break; } } } return target; } } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/HeaderPatternRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/HeaderPat0000644000175000017500000000744011001653150032252 0ustar moonmoon//======================================================================== //$Id: HeaderPatternRule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Sets the header in the response whenever the rule finds a match. */ public class HeaderPatternRule extends PatternRule { private String _name; private String _value; private boolean _add=false; /* ------------------------------------------------------------ */ public HeaderPatternRule() { _handling = false; _terminating = false; } /* ------------------------------------------------------------ */ /** * Sets the header name. * * @param name name of the header field */ public void setName(String name) { _name = name; } /* ------------------------------------------------------------ */ /** * Sets the header value. The value can be either a String or int value. * * @param value of the header field */ public void setValue(String value) { _value = value; } /* ------------------------------------------------------------ */ /** * Sets the Add flag. * @param add If true, the header is added to the response, otherwise the header it is set on the response. */ public void setAdd(boolean add) { _add = add; } /* ------------------------------------------------------------ */ /** * Invokes this method when a match found. If the header had already been set, * the new value overwrites the previous one. Otherwise, it adds the new * header name and value. * *@see org.mortbay.jetty.handler.rewrite.Rule#matchAndApply(String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { // process header if (_add) response.addHeader(_name, _value); else response.setHeader(_name, _value); return target; } /* ------------------------------------------------------------ */ /** * Returns the header name. * @return the header name. */ public String getName() { return _name; } /* ------------------------------------------------------------ */ /** * Returns the header value. * @return the header value. */ public String getValue() { return _value; } /* ------------------------------------------------------------ */ /** * Returns the add flag value. */ public boolean isAdd() { return _add; } /* ------------------------------------------------------------ */ /** * Returns the header contents. */ public String toString() { return super.toString()+"["+_name+","+_value+"]"; } } ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/VirtualHostRuleContainer.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/VirtualHo0000644000175000017500000000652311072306035032340 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.util.LazyList; /** * Groups rules that apply only to a specific virtual host * or sets of virtual hosts * * @author Athena Yao */ public class VirtualHostRuleContainer extends RuleContainer { private String[] _virtualHosts; /* ------------------------------------------------------------ */ /** Set the virtual hosts that the rules within this container will apply to * @param virtualHosts Array of virtual hosts that the rules within this container are applied to. * A null hostname or null/empty array means any hostname is acceptable. */ public void setVirtualHosts( String[] virtualHosts ) { if ( virtualHosts == null ) { _virtualHosts = virtualHosts; } else { _virtualHosts = new String[virtualHosts.length]; for ( int i = 0; i < virtualHosts.length; i++ ) _virtualHosts[i] = normalizeHostname( virtualHosts[i]); } } /* ------------------------------------------------------------ */ /** Get the virtual hosts that the rules within this container will apply to * @param virtualHosts Array of virtual hosts that the rules within this container are applied to. * A null hostname or null/empty array means any hostname is acceptable. */ public String[] getVirtualHosts() { return _virtualHosts; } /* ------------------------------------------------------------ */ /** * @param virtualHost add a virtual host to the existing list of virtual hosts * A null hostname means any hostname is acceptable */ public void addVirtualHost(String virtualHost) { _virtualHosts = (String[])LazyList.addToArray(_virtualHosts,virtualHost,String.class); } /** * Process the contained rules if the request is applicable to the virtual hosts of this rule * @param target target field to pass on to the contained rules * @param request request object to pass on to the contained rules * @param response response object to pass on to the contained rules */ @Override public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { if(_virtualHosts != null && _virtualHosts.length > 0 ) { String requestHost = normalizeHostname( request.getServerName() ); for( String ruleHost : _virtualHosts ) { if(ruleHost == null || ruleHost.equalsIgnoreCase(requestHost) || (ruleHost.startsWith("*.") && ruleHost.regionMatches(true,2,requestHost,requestHost.indexOf(".")+1,ruleHost.length()-2))) return apply(target, request, response); } } else { return apply(target, request, response); } return null; } /* ------------------------------------------------------------ */ private String normalizeHostname( String host ) { if ( host == null ) return null; if ( host.endsWith( "." ) ) return host.substring( 0, host.length() -1); return host; } } ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RewriteHandler.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RewriteHa0000644000175000017500000002024211453142150032306 0ustar moonmoon//======================================================================== //$Id: RewriteHandler.java 1918 2010-10-06 18:48:08Z jesse $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.Request; import org.mortbay.jetty.handler.HandlerWrapper; import org.mortbay.jetty.servlet.PathMap; import org.mortbay.log.Log; import org.mortbay.util.LazyList; /* ------------------------------------------------------------ */ /** *

    The RewriteHandler is responsible for managing a list of rules to be applied to requests. * Its capabilities are not only limited to url rewrites such as RewritePatternRule or RewriteRegexRule; * there is also handling for cookies, headers, redirection, setting status or error codes * whenever the rule finds a match. * *

    The rules can be matched by the ff. options: pattern matching of PathMap * (class PatternRule), regular expressions (class RegexRule) or certain conditions set * (e.g. MsieSslRule - the requests must be in SSL mode). * * Here are the list of rules: *

      *
    • CookiePatternRule - adds a new cookie in response.
    • *
    • HeaderPatternRule - adds/modifies the HTTP headers in response.
    • *
    • RedirectPatternRule - sets the redirect location.
    • *
    • ResponsePatternRule - sets the status/error codes.
    • *
    • RewritePatternRule - rewrites the requested URI.
    • *
    • RewriteRegexRule - rewrites the requested URI using regular expression for pattern matching.
    • *
    • MsieSslRule - disables the keep alive on SSL for IE5 and IE6.
    • *
    • LegacyRule - the old version of rewrite.
    • *
    • ForwardedSchemeHeaderRule - set the scheme according to the headers present.
    • *
    * *

    The rules can be grouped into rule containers (class RuleContainerRule), and will only * be applied if the request matches the conditions for their container * (e.g., by virtual host name) * * Here are a list of rule containers: *

      *
    • VirtualHostRuleContainer - checks whether the request matches one of a set of virtual host names.
    • *
    • LowThreadsRuleContainer - checks whether the threadpool is low on threads
    • *
    * */ public class RewriteHandler extends HandlerWrapper { private RuleContainer _rules; /* ------------------------------------------------------------ */ public RewriteHandler() { _rules = new RuleContainer(); } /* ------------------------------------------------------------ */ /** * To enable configuration from jetty.xml on rewriteRequestURI, rewritePathInfo and * originalPathAttribute * * @param legacyRule old style rewrite rule */ public void setLegacyRule(LegacyRule legacyRule) { _rules.setLegacyRule(legacyRule); } /* ------------------------------------------------------------ */ /** * Returns the list of rules. * @return an array of {@link Rule}. */ public Rule[] getRules() { return _rules.getRules(); } /* ------------------------------------------------------------ */ /** * Assigns the rules to process. * @param rules an array of {@link Rule}. */ public void setRules(Rule[] rules) { _rules.setRules(rules); } /*------------------------------------------------------------ */ /** * Assigns the rules to process. * @param rules a {@link RuleContainer} containing other rules to process */ public void setRules(RuleContainer rules) { _rules = rules; } /* ------------------------------------------------------------ */ /** * Add a Rule * @param rule The rule to add to the end of the rules array */ public void addRule(Rule rule) { _rules.addRule(rule); } /* ------------------------------------------------------------ */ /** * @return the rewriteRequestURI If true, this handler will rewrite the value * returned by {@link HttpServletRequest#getRequestURI()}. */ public boolean isRewriteRequestURI() { return _rules.isRewriteRequestURI(); } /* ------------------------------------------------------------ */ /** * @param rewriteRequestURI true if this handler will rewrite the value * returned by {@link HttpServletRequest#getRequestURI()}. */ public void setRewriteRequestURI(boolean rewriteRequestURI) { _rules.setRewriteRequestURI(rewriteRequestURI); } /* ------------------------------------------------------------ */ /** * @return true if this handler will rewrite the value * returned by {@link HttpServletRequest#getPathInfo()}. */ public boolean isRewritePathInfo() { return _rules.isRewritePathInfo(); } /* ------------------------------------------------------------ */ /** * @param rewritePathInfo true if this handler will rewrite the value * returned by {@link HttpServletRequest#getPathInfo()}. */ public void setRewritePathInfo(boolean rewritePathInfo) { _rules.setRewritePathInfo(rewritePathInfo); } /* ------------------------------------------------------------ */ /** * @return the originalPathAttribute. If non null, this string will be used * as the attribute name to store the original request path. */ public String getOriginalPathAttribute() { return _rules.getOriginalPathAttribute(); } /* ------------------------------------------------------------ */ /** * @param originalPathAttribute If non null, this string will be used * as the attribute name to store the original request path. */ public void setOriginalPathAttribute(String originalPathAttribute) { _rules.setOriginalPathAttribute(originalPathAttribute); } /* ------------------------------------------------------------ */ /** * @deprecated */ public PathMap getRewrite() { return _rules.getRewrite(); } /* ------------------------------------------------------------ */ /** * @deprecated */ public void setRewrite(PathMap rewrite) { _rules.setRewrite(rewrite); } /* ------------------------------------------------------------ */ /** * @deprecated */ public void addRewriteRule(String pattern, String prefix) { _rules.addRewriteRule(pattern,prefix); } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.jetty.handler.HandlerWrapper#handle(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int) */ public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { if (isStarted()) { String returned = _rules.matchAndApply(target, request, response); target = (returned == null) ? target : returned; Request baseRequest = (request instanceof Request?(Request)request:HttpConnection.getCurrentConnection().getRequest()); if (!baseRequest.isHandled()) { super.handle(target, request, response, dispatch); } } } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/HeaderRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/HeaderRul0000644000175000017500000000512411040033161032262 0ustar moonmoonpackage org.mortbay.jetty.handler.rewrite; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Abstract rule that matches against request headers. */ public abstract class HeaderRule extends Rule { private String _header; private String _headerValue; /* ------------------------------------------------------------ */ public String getHeader() { return _header; } /* ------------------------------------------------------------ */ /** * @param header * the header name to check for */ public void setHeader(String header) { _header = header; } /* ------------------------------------------------------------ */ public String getHeaderValue() { return _headerValue; } /* ------------------------------------------------------------ */ /** * @param headerValue * the header value to match against. If null, then the * presence of the header is enough to match */ public void setHeaderValue(String headerValue) { _headerValue = headerValue; } /* ------------------------------------------------------------ */ @Override public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { String requestHeaderValue = request.getHeader(_header); if (requestHeaderValue != null) if (_headerValue == null || _headerValue.equals(requestHeaderValue)) apply(target, requestHeaderValue, request, response); return null; } /* ------------------------------------------------------------ */ /** * Apply the rule to the request * * @param target * field to attempt match * @param value * header value found * @param request * request object * @param response * response object * @return The target (possible updated) * @throws IOException * exceptions dealing with operating on request or response * objects */ protected abstract String apply(String target, String value, HttpServletRequest request, HttpServletResponse response) throws IOException; /* ------------------------------------------------------------ */ public String toString() { return super.toString() + "[" + _header + ":" + _headerValue + "]"; } } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RedirectRegexRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RedirectR0000644000175000017500000000372011224733370032307 0ustar moonmoon//======================================================================== //Copyright 2009 Webtide LLC //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import java.io.IOException; import java.util.regex.Matcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Redirects the response by matching with a regular expression. * The replacement string may use $n" to replace the nth capture group. */ public class RedirectRegexRule extends RegexRule { private String _replacement; public RedirectRegexRule() { _handling = true; _terminating = true; } /** * Whenever a match is found, it replaces with this value. * * @param replacement the replacement string. */ public void setReplacement(String replacement) { _replacement = replacement; } @Override protected String apply(String target, HttpServletRequest request, HttpServletResponse response, Matcher matcher) throws IOException { target=_replacement; for (int g=1;g<=matcher.groupCount();g++) { String group = matcher.group(g); target=target.replaceAll("\\$"+g,group); } response.sendRedirect(target); return target; } } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/ResponsePatternRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/ResponseP0000644000175000017500000000543611001653150032336 0ustar moonmoon//======================================================================== //$Id: ResponsePatternRule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Sends the response code whenever the rule finds a match. */ public class ResponsePatternRule extends PatternRule { private String _code; private String _reason = ""; /* ------------------------------------------------------------ */ public ResponsePatternRule() { _handling = true; _terminating = true; } /* ------------------------------------------------------------ */ /** * Sets the response status code. * @param code response code */ public void setCode(String code) { _code = code; } /* ------------------------------------------------------------ */ /** * Sets the reason for the response status code. Reasons will only reflect * if the code value is greater or equal to 400. * * @param reason */ public void setReason(String reason) { _reason = reason; } /* ------------------------------------------------------------ */ /* * (non-Javadoc) * @see org.mortbay.jetty.handler.rules.RuleBase#apply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { int code = Integer.parseInt(_code); // status code 400 and up are error codes if (code >= 400) { response.sendError(code, _reason); } else { response.setStatus(code); } return target; } /* ------------------------------------------------------------ */ /** * Returns the code and reason string. */ public String toString() { return super.toString()+"["+_code+","+_reason+"]"; } } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RedirectPatternRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/RedirectP0000644000175000017500000000435611001653150032301 0ustar moonmoon//======================================================================== //$Id: RedirectPatternRule.java 966 2008-04-17 13:53:44Z gregw $ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Redirects the response whenever the rule finds a match. */ public class RedirectPatternRule extends PatternRule { private String _location; /* ------------------------------------------------------------ */ public RedirectPatternRule() { _handling = true; _terminating = true; } /* ------------------------------------------------------------ */ /** * Sets the redirect location. * * @param value the location to redirect. */ public void setLocation(String value) { _location = value; } /* ------------------------------------------------------------ */ /* * (non-Javadoc) * @see org.mortbay.jetty.handler.rules.RuleBase#apply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { response.sendRedirect(_location); return target; } /* ------------------------------------------------------------ */ /** * Returns the redirect location. */ public String toString() { return super.toString()+"["+_location+"]"; } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/LegacyRule.javajetty-6.1.26/contrib/jetty-rewrite-handler/src/main/java/org/mortbay/jetty/handler/rewrite/LegacyRul0000644000175000017500000000607711001653150032311 0ustar moonmoon//======================================================================== //$Id$ //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.jetty.handler.rewrite; import org.mortbay.jetty.servlet.PathMap; import org.mortbay.util.URIUtil; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Rule implementing the legacy API of RewriteHandler * @author gregw * */ public class LegacyRule extends Rule { private PathMap _rewrite = new PathMap(true); public LegacyRule() { _handling = false; _terminating = false; } /* ------------------------------------------------------------ */ public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { Map.Entry rewrite =_rewrite.getMatch(target); if (rewrite!=null && rewrite.getValue()!=null) { target=URIUtil.addPaths(rewrite.getValue().toString(), PathMap.pathInfo(rewrite.getKey().toString(),target)); return target; } return null; } /* ------------------------------------------------------------ */ /** * Returns the map of rewriting rules. * @return A {@link PathMap} of the rewriting rules. */ public PathMap getRewrite() { return _rewrite; } /* ------------------------------------------------------------ */ /** * Sets the map of rewriting rules. * @param rewrite A {@link PathMap} of the rewriting rules. Only * prefix paths should be included. */ public void setRewrite(PathMap rewrite) { _rewrite=rewrite; } /* ------------------------------------------------------------ */ /** Add a path rewriting rule * @param pattern The path pattern to match. The pattern must start with / and may use * a trailing /* as a wildcard. * @param prefix The path prefix which will replace the matching part of the path. */ public void addRewriteRule(String pattern, String prefix) { if (pattern==null || pattern.length()==0 || !pattern.startsWith("/")) throw new IllegalArgumentException(); if (_rewrite==null) _rewrite=new PathMap(true); _rewrite.put(pattern,prefix); } } jetty-6.1.26/contrib/jetty-rewrite-handler/src/main/config/0000755000175000017500000000000011745736516022337 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/config/etc/0000755000175000017500000000000011745736516023112 5ustar moonmoonjetty-6.1.26/contrib/jetty-rewrite-handler/src/main/config/etc/jetty-rewrite.xml0000644000175000017500000001334411155104412026432 0ustar moonmoon true false requestedPath /* 500 Server busy /favicon.ico Cache-Control Max-Age=3600,public true /rewrite/dump/regex/([^/]*)/(.*) /test/dump/$2/$1 /rewrite /rewrittento /rewrite/session/ 401 Setting error code 401 *.jsp Server Server for JSP /rewrite/dispatch http://jetty.mortbay.org X-Forwarded-Scheme https https mortbay.com www.mortbay.com mortbay.org www.mortbay.org /* CookiePatternRule 1 jetty-6.1.26/contrib/jetty-rewrite-handler/pom.xml0000644000175000017500000000565011466510475020674 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 jetty-rewrite-handler jetty-rewrite-handler http://jetty.mortbay.org Jetty Rewrite Handler install src/main/resources src/test/resources maven-compiler-plugin 1.5 1.5 maven-antrun-plugin clean clean run copyjar install run junit junit test org.mortbay.jetty jetty ${project.version} org.mortbay.jetty servlet-api ${servlet-version} org.mortbay.jetty jetty-servlet-tester ${project.version} test jetty-6.1.26/contrib/jetty-openspaces/0000755000175000017500000000000011745736516016423 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/0000755000175000017500000000000011745736516020271 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/0000755000175000017500000000000011745736516021060 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/test/0000755000175000017500000000000011745736516022037 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/test/java/0000755000175000017500000000000011745736516022760 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/test/java/org/0000755000175000017500000000000011745736516023547 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/test/java/org/mortbay/0000755000175000017500000000000011745736516025224 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/test/java/org/mortbay/jetty/0000755000175000017500000000000011745736516026363 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/test/java/org/mortbay/jetty/opensources/0000755000175000017500000000000011745736516030730 5ustar moonmoon././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootjetty-6.1.26/contrib/jetty-openspaces/sessions/src/test/java/org/mortbay/jetty/opensources/GigaIntegrationTest.javajetty-6.1.26/contrib/jetty-openspaces/sessions/src/test/java/org/mortbay/jetty/opensources/GigaInteg0000644000175000017500000000554711031073233032476 0ustar moonmoon// ======================================================================== // Copyright 2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.opensources; import org.mortbay.jetty.openspaces.GigaSessionIdManager; import org.mortbay.jetty.openspaces.GigaSessionManager; import org.mortbay.jetty.servlet.AbstractSessionTest; import org.mortbay.jetty.servlet.SessionTestServer; import org.openspaces.core.GigaSpace; import org.openspaces.core.GigaSpaceConfigurer; import org.openspaces.core.space.UrlSpaceConfigurer; public class GigaIntegrationTest extends AbstractSessionTest { private GigaSpace _space; public class GigaSessionTestServer extends SessionTestServer { public GigaSessionTestServer(int port, String workerName) { super(port, workerName); } public void configureEnvironment () { UrlSpaceConfigurer uscA = new UrlSpaceConfigurer("/./space"); GigaSpaceConfigurer gigaSpaceConfigurer = new GigaSpaceConfigurer(uscA.space()); _space = gigaSpaceConfigurer.gigaSpace(); } public void configureIdManager() { GigaSessionIdManager idMgr = new GigaSessionIdManager(this); idMgr.setWorkerName(_workerName); idMgr.setSpace(_space); _sessionIdMgr = idMgr; } public void configureSessionManager1() { GigaSessionManager sessionMgr1 = new GigaSessionManager(); sessionMgr1.setIdManager(_sessionIdMgr); sessionMgr1.setSpace(_space); _sessionMgr1 = sessionMgr1; } public void configureSessionManager2() { GigaSessionManager sessionMgr2 = new GigaSessionManager(); sessionMgr2.setIdManager(_sessionIdMgr); sessionMgr2.setSpace(_space); _sessionMgr2 = sessionMgr2; } } public SessionTestServer newServer1() { return new GigaSessionTestServer(Integer.parseInt(__port1), "fred"); } public SessionTestServer newServer2() { return new GigaSessionTestServer(Integer.parseInt(__port2), "mabel"); } } jetty-6.1.26/contrib/jetty-openspaces/sessions/src/main/0000755000175000017500000000000011745736516022004 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/main/java/0000755000175000017500000000000011745736516022725 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/main/java/org/0000755000175000017500000000000011745736516023514 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/main/java/org/mortbay/0000755000175000017500000000000011745736516025171 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736516026330 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/sessions/src/main/java/org/mortbay/jetty/openspaces/0000755000175000017500000000000011745736516030470 5ustar moonmoon././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootjetty-6.1.26/contrib/jetty-openspaces/sessions/src/main/java/org/mortbay/jetty/openspaces/GigaSessionIdManager.javajetty-6.1.26/contrib/jetty-openspaces/sessions/src/main/java/org/mortbay/jetty/openspaces/GigaSessio0000644000175000017500000002134711030261351032430 0ustar moonmoon// ======================================================================== // Copyright 2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.jetty.openspaces; import java.util.HashSet; import java.util.Random; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.servlet.AbstractSessionIdManager; import org.mortbay.jetty.servlet.AbstractSessionManager; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.log.Log; import org.openspaces.core.GigaSpace; import org.openspaces.core.GigaSpaceConfigurer; import org.openspaces.core.space.UrlSpaceConfigurer; import org.openspaces.core.space.cache.LocalCacheSpaceConfigurer; import com.gigaspaces.annotation.pojo.SpaceId; import com.gigaspaces.annotation.pojo.SpaceRouting; /** * GigaspacesSessionIdManager * * A Jetty SessionIDManager where the in-use session ids are stored * in a data grid "cloud". */ public class GigaSessionIdManager extends AbstractSessionIdManager { protected HashSet _sessionIds = new HashSet(); protected long _scavengeIntervalSec = 60 * 10; //10mins - TODO could move back to the SessionManager? protected String _spaceUrl; protected GigaSpace _space; protected long _waitMsec = 5000L; //time in msec to wait on read operations /** * Id * * Class to hold the session id. This is really only needed * for gigaspaces so that we can annotate routing information etc. */ public static class Id { private String _id; public Id() {} public Id(String id) { _id=id; } public void setId(String id) { _id=id; } @SpaceId @SpaceRouting public String getId() { return _id; } public boolean equals(Object o) { if (o == null) return false; Id targetId = (Id)o; if (targetId.getId() == _id) return true; if (targetId.getId().equals(_id)) return true; return false; } } public GigaSessionIdManager(Server server) { super(server); } public GigaSessionIdManager(Server server, Random random) { super(server, random); } public void setSpaceUrl (String url) { _spaceUrl=url; } public String getSpaceUrl () { return _spaceUrl; } public void setWaitMs (long msec) { _waitMsec=msec; } public long getWaitMs () { return _waitMsec; } public void addSession(HttpSession session) { if (session == null) return; synchronized (_sessionIds) { if (session instanceof GigaSessionManager.Session) { String id = ((GigaSessionManager.Session)session).getClusterId(); try { Id theId = new Id(id); add(theId); _sessionIds.add(theId); if (Log.isDebugEnabled()) Log.debug("Added id "+id); } catch (Exception e) { Log.warn("Problem storing session id="+id, e); } } else throw new IllegalStateException ("Session is not a Gigaspaces session"); } } public String getClusterId(String nodeId) { int dot=nodeId.lastIndexOf('.'); return (dot>0)?nodeId.substring(0,dot):nodeId; } public String getNodeId(String clusterId, HttpServletRequest request) { if (_workerName!=null) return clusterId+'.'+_workerName; return clusterId; } public boolean idInUse(String id) { if (id == null) return false; String clusterId = getClusterId(id); Id theId = new Id(clusterId); synchronized (_sessionIds) { if (_sessionIds.contains(theId)) return true; //optimisation - if this session is one we've been managing, we can check locally //otherwise, we need to go to the space to check try { return exists(theId); } catch (Exception e) { Log.warn("Problem checking inUse for id="+clusterId, e); return false; } } } public void invalidateAll(String id) { //take the id out of the list of known sessionids for this node removeSession(id); synchronized (_sessionIds) { //tell all contexts that may have a session object with this id to //get rid of them Handler[] contexts = _server.getChildHandlersByClass(WebAppContext.class); for (int i=0; contexts!=null && i= (_savePeriodMs)) { _data.setLastSaved(System.currentTimeMillis()); willPassivate(); update(_data); didActivate(); if (Log.isDebugEnabled()) Log.debug("Dirty="+_dirty+", accessed-saved="+_data._accessed +"-"+ _data._lastSaved+", savePeriodMs="+_savePeriodMs); } } catch (Exception e) { Log.warn("Problem persisting changed session data id="+getId(), e); } finally { _dirty=false; } } protected void timeout() throws IllegalStateException { if (Log.isDebugEnabled()) Log.debug("Timing out session id="+getClusterId()); super.timeout(); } protected void willPassivate () { super.willPassivate(); } protected void didActivate () { super.didActivate(); } public String getClusterId() { return super.getClusterId(); } public String getNodeId() { return super.getNodeId(); } } /** * Start the session manager. * * @see org.mortbay.jetty.servlet.AbstractSessionManager#doStart() */ public void doStart() throws Exception { if (_sessionIdManager==null) throw new IllegalStateException("No session id manager defined"); _sessions = new ConcurrentHashMap(); if (_space==null) initSpace(); super.doStart(); _timer=new Timer("GigaspaceSessionScavenger_"+(++__id), true); setScavengePeriod(getScavengePeriod()); } /** * Stop the session manager. * * @see org.mortbay.jetty.servlet.AbstractSessionManager#doStop() */ public void doStop() throws Exception { // stop the scavenger synchronized(this) { if (_task!=null) _task.cancel(); if (_timer!=null) _timer.cancel(); _timer=null; } _sessions.clear(); _sessions = null; _space = null; super.doStop(); } public int getSavePeriod () { return _savePeriodMs/1000; } public void setSavePeriod (int seconds) { if (seconds <= 0) seconds=60; _savePeriodMs = seconds*1000; } public int getScavengePeriod() { return _scavengePeriodMs/1000; } public void setScavengePeriod(int seconds) { if (seconds<=0) seconds=60; int old_period=_scavengePeriodMs; int period=seconds*1000; _scavengePeriodMs=period; //add a bit of variability into the scavenge time so that not all //contexts with the same scavenge time sync up int tenPercent = _scavengePeriodMs/10; if ((System.currentTimeMillis()%2) == 0) _scavengePeriodMs += tenPercent; if (Log.isDebugEnabled()) Log.debug("GigspacesSessionScavenger scavenging every "+_scavengePeriodMs+" ms"); if (_timer!=null && (period!=old_period || _task==null)) { synchronized (this) { if (_task!=null) _task.cancel(); _task = new TimerTask() { public void run() { scavenge(); } }; _timer.schedule(_task,_scavengePeriodMs,_scavengePeriodMs); } } } public void setSpace (GigaSpace space) { _space=space; } public GigaSpace getSpace () { return _space; } /** * Get a session matching the id. * * Look in the grid to see if such a session exists, as it may have moved from * another node. * * @see org.mortbay.jetty.servlet.AbstractSessionManager#getSession(java.lang.String) */ public Session getSession(String idInCluster) { synchronized (this) { try { //Ask the space for the session. This might incur serialization: //if we have no localcache, OR the localcache has to fetch the session //because of a cache miss OR the localcache is set to pull mode (where it //checks for changes to an object when that object is requested). //Alternatively, if the localcache is set to push mode, the cloud will //keep the localcache up-to-date with object changes in the background, //so serialization is occuring beyond our control. //TODO consider using the jdbc approach, were we only ask the cloud //intermittently for the session. SessionData template = new SessionData(); template.setId(idInCluster); template.setContextPath(_context.getContextPath()); template.setVirtualHost(getVirtualHost(_context)); SessionData data = fetch (template); Session session = null; if (data == null) { //No session in cloud with matching id and context path. session=null; if (Log.isDebugEnabled()) Log.debug("No session matching id="+idInCluster); } else { Session oldSession = (Session)_sessions.get(idInCluster); //if we had no prior session, or the session from the cloud has been //more recently updated than our copy in memory, we should use it //instead if ((oldSession == null) || (data.getAccessed() > oldSession._data.getAccessed())) { session = new Session(data); _sessions.put(idInCluster, session); session.didActivate(); if (Log.isDebugEnabled()) Log.debug("Refreshed in-memory Session with "+data.toStringExtended()); } else { if (Log.isDebugEnabled()) Log.debug("Not updating session "+idInCluster+", in-memory session is as fresh or fresher"); session = oldSession; } } return session; } catch (Exception e) { Log.warn("Unable to load session from database", e); return null; } } } public void setSpaceUrl (String url) { _spaceUrl=url; } public String getSpaceUrl () { return _spaceUrl; } public void setWaitMs (long msec) { _waitMsec=msec; } public long getWaitMs () { return _waitMsec; } public Map getSessionMap() { return Collections.unmodifiableMap(_sessions); } public int getSessions() { int size = 0; synchronized (this) { size = _sessions.size(); } return size; } protected void invalidateSessions() { //Do nothing - we don't want to remove and //invalidate all the sessions because this //method is called from doStop(), and just //because this context is stopping does not //mean that we should remove the session from //any other nodes } protected Session newSession(HttpServletRequest request) { return new Session(request); } protected void removeSession(String idInCluster) { synchronized (this) { try { Session session = (Session)_sessions.remove(idInCluster); delete(session._data); } catch (Exception e) { Log.warn("Problem deleting session id="+idInCluster, e); } } } public void removeSession(org.mortbay.jetty.servlet.AbstractSessionManager.Session abstractSession, boolean invalidate) { if (! (abstractSession instanceof GigaSessionManager.Session)) throw new IllegalStateException("Session is not a GigaspacesSessionManager.Session "+abstractSession); GigaSessionManager.Session session = (GigaSessionManager.Session)abstractSession; synchronized (_sessionIdManager) { boolean removed = false; synchronized (this) { //take this session out of the map of sessions for this context if (_sessions.get(getClusterId(session)) != null) { removed = true; removeSession(getClusterId(session)); } } if (removed) { // Remove session from all context and global id maps _sessionIdManager.removeSession(session); if (invalidate) _sessionIdManager.invalidateAll(getClusterId(session)); } } if (invalidate && _sessionListeners!=null) { HttpSessionEvent event=new HttpSessionEvent(session); for (int i=LazyList.size(_sessionListeners); i-->0;) ((HttpSessionListener)LazyList.get(_sessionListeners,i)).sessionDestroyed(event); } if (!invalidate) { session.willPassivate(); } } public void invalidateSession(String idInCluster) { synchronized (this) { Session session = (Session)_sessions.get(idInCluster); if (session != null) { session.invalidate(); } } } protected void addSession(org.mortbay.jetty.servlet.AbstractSessionManager.Session abstractSession) { if (abstractSession==null) return; if (!(abstractSession instanceof GigaSessionManager.Session)) throw new IllegalStateException("Not a GigaspacesSessionManager.Session "+abstractSession); synchronized (this) { GigaSessionManager.Session session = (GigaSessionManager.Session)abstractSession; try { _sessions.put(getClusterId(session), session); add(session._data); } catch (Exception e) { Log.warn("Problem writing new SessionData to space ", e); } } } /** * Look for expired sessions that we know about in our * session map, and double check with the grid that * it has really expired, or already been removed. */ protected void scavenge () { //don't attempt to scavenge if we are shutting down if (isStopping() || isStopped()) return; Thread thread=Thread.currentThread(); ClassLoader old_loader=thread.getContextClassLoader(); _scavengeCount++; try { if (_loader!=null) thread.setContextClassLoader(_loader); long now = System.currentTimeMillis(); if (Log.isDebugEnabled()) Log.debug("Scavenger running at "+now+" for context = "+_context.getContextPath()); //go through in-memory map of Sessions, pick out any that are candidates for removal //due to expiry time being reached or passed. synchronized (this) { ArrayList removalCandidates = new ArrayList(); Iterator itor = _sessions.values().iterator(); while (itor.hasNext()) { Session session = (Session)itor.next(); if (session._data._expiryTime < now) removalCandidates.add(session); } //for each candidate, check the session data in the cloud to ensure that some other //node hasn't been updating it's access time. If it's still expired, then delete it //locally and in the cloud. itor = removalCandidates.listIterator(); while (itor.hasNext()) { Session candidate = (Session)itor.next(); SessionData template = new SessionData(); template.setUid(candidate._data._uid); template.setId(candidate.getId()); try { SessionData currentSessionData = fetch(template); if (currentSessionData==null) { //it's no longer in the cloud - either some other node has //expired it or invalidated it _sessions.remove(candidate.getId()); if (Log.isDebugEnabled()) Log.debug("Dropped non-existant session "+candidate._data); } else if (currentSessionData._expiryTime < now) { //its expired, run all the listeners etc candidate.timeout(); itor.remove(); if (Log.isDebugEnabled()) Log.debug("Timed out session "+candidate._data); } } catch (Exception e) { Log.warn("Problem checking current state of session "+candidate._data, e); } } //every so often do a bigger sweep for very old sessions in //the cloud. A very old session is one that is defined to have //expired at least 2 sweeps of the scavenger ago. TODO make //this configurable if ((_scavengeCount % 2) == 0) { if (Log.isDebugEnabled()) Log.debug("Scavenging old sessions, expiring before: "+(now - (2 * _scavengePeriodMs))); Object[] expiredSessions = findExpiredSessions((now - (2 * _scavengePeriodMs))); for (int i = 0; i < expiredSessions.length; i++) { if (Log.isDebugEnabled()) Log.debug("Timing out expired sesson " + expiredSessions[i]); GigaSessionManager.Session expiredSession = new GigaSessionManager.Session((SessionData)expiredSessions[i]); _sessions.put(expiredSession.getClusterId(), expiredSession); //needs to be in there so removeSession test will succeed and remove it expiredSession.timeout(); if (Log.isDebugEnabled()) Log.debug("Expiring old session "+expiredSession._data); } } int count = this._sessions.size(); if (count < this._minSessions) this._minSessions=count; } } catch (Throwable t) { if (t instanceof ThreadDeath) throw ((ThreadDeath)t); else Log.warn("Problem scavenging sessions", t); } finally { thread.setContextClassLoader(old_loader); } } protected void add (SessionData data) throws Exception { _space.write(data); } protected void delete (SessionData data) throws Exception { SessionData sd = new SessionData(); sd.setUid(data.getUid()); sd.setId(data.getId()); _space.takeIfExists(sd, getWaitMs()); } protected void update (SessionData data) throws Exception { _space.write(data); if (Log.isDebugEnabled()) Log.debug("Wrote session "+data.toStringExtended()); } protected SessionData fetch (SessionData template) throws Exception { SessionData obj = (SessionData)_space.readIfExists(template, getWaitMs()); return obj; } protected Object[] findExpiredSessions (long timestamp) throws Exception { _query.setParameter(1, new Long(timestamp)); Object[] sessions = _space.takeMultiple(_query, Integer.MAX_VALUE); return sessions; } protected void initSpace () throws Exception { if (_spaceUrl==null) throw new IllegalStateException ("No url for space"); UrlSpaceConfigurer usc = new UrlSpaceConfigurer(_spaceUrl); LocalCacheSpaceConfigurer lcsc = new LocalCacheSpaceConfigurer(usc.space()); GigaSpaceConfigurer gigaSpaceConfigurer = new GigaSpaceConfigurer(usc.space()); _space = gigaSpaceConfigurer.gigaSpace(); _query = new SQLQuery(SessionData.class, "expiryTime < ?"); } /** * Get the first virtual host for the context. * * Used to help identify the exact session/contextPath. * * @return 0.0.0.0 if no virtual host is defined */ private String getVirtualHost (ContextHandler.SContext context) { String vhost = "0.0.0.0"; if (context==null) return vhost; String [] vhosts = context.getContextHandler().getVirtualHosts(); if (vhosts==null || vhosts.length==0 || vhosts[0]==null) return vhost; return vhosts[0]; } } jetty-6.1.26/contrib/jetty-openspaces/sessions/pom.xml0000644000175000017500000000420511466510475021601 0ustar moonmoon org.mortbay.jetty jetty-openspaces 6.1.26 ../pom.xml 4.0.0 jetty-openspaces-sessions jar Jetty Contrib :: Openspaces :: Sessions Apache License Version 2 http://www.apache.org/licenses/LICENSE-2.0 install org.apache.maven.plugins maven-jar-plugin Jetty Gigaspaces Sessions Implementation Jetty Gigaspaces Sessions Implementation org.mortbay.jetty.jetty-gigaspaces-sessions Mortbay ${project.version} org.mortbay.jetty jetty provided org.mortbay.jetty jetty tests ${project.version} test org.openspaces openspaces provided junit junit test jetty-6.1.26/contrib/jetty-openspaces/pom.xml0000644000175000017500000000516411466510475017740 0ustar moonmoon project org.mortbay.jetty 6.1.26 4.0.0 org.mortbay.jetty jetty-openspaces Jetty Contrib :: Openspaces Openspaces integration. pom 6.5.0 sessions webapp org.mortbay.jetty jetty ${project.version} org.openspaces openspaces 6.5-rc2 junit junit 4.4 org.springframework spring-test 2.5.4 install src/test/java **/*.xml org.apache.maven.plugins maven-compiler-plugin 1.5 1.5 org.apache.maven.plugins maven-assembly-plugin 2.2-beta-2 org.apache.maven.plugins maven-openspaces-plugin ${openspaces-version} jetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/0000755000175000017500000000000011745736516021616 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/0000755000175000017500000000000011745736516022405 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/test/0000755000175000017500000000000011745736516023364 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/test/java/0000755000175000017500000000000011745736516024305 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/test/resources/0000755000175000017500000000000011745736516025376 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/0000755000175000017500000000000011745736516023331 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/java/0000755000175000017500000000000011745736516024252 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/java/org/0000755000175000017500000000000011745736516025041 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/java/org/mortbay/0000755000175000017500000000000011745736516026516 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736516027655 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/java/org/mortbay/jetty/openspaces/0000755000175000017500000000000011745736516032015 5ustar moonmoon././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/java/org/mortbay/jetty/openspaces/plugin/jetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/java/org/mortbay/jetty/openspaces/pl0000755000175000017500000000000011745736516032351 5ustar moonmoon././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/java/org/mortbay/jetty/openspaces/plugin/JOSGeneratePUMojo.javajetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/java/org/mortbay/jetty/openspaces/pl0000644000175000017500000001074511030251745032341 0ustar moonmoonpackage org.mortbay.jetty.openspaces.plugin; /*======================================================================== * $Id:$ * Copyright 2000-2008 Mort Bay Consulting Pty. Ltd. *------------------------------------------------------------------------ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *======================================================================== */ import java.io.File; import java.io.IOException; import java.util.Iterator; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.codehaus.plexus.archiver.ArchiverException; import org.codehaus.plexus.archiver.jar.JarArchiver; import org.codehaus.plexus.util.FileUtils; /* todo: * allow mechanism for specifying other artifacts to be included in the pu jar * artifact name that implies its a pu? * */ /** * Simple plugin that takes a bundled war file, a pu.xml file and the jetty dependencies of this plugin * itself to create an artifact suitable for deployment with os:deploy * * @goal generate-pu * @requiresDependencyResolution runtime * @phase package * @description Generates an openspaces PU for a war project */ public class JOSGeneratePUMojo extends AbstractMojo { /** * @parameter expression="${project.build.directory}/${project.artifactId}-${project.version}.war" */ private String warFile; /** * @parameter expression="src/main/openspaces/pu.xml" */ private String puXMLFile; /** * @parameter expression="${project.build.directory}/${project.artifactId}-${project.version}-pu" */ private String serverDirectory; /** * @parameter expression="${project.build.directory}/${project.artifactId}-${project.version}.jar" */ private String artifactName; /** * @parameter expression="${plugin.artifacts}" */ private java.util.List pluginArtifacts; /** * The Jar archiver. * * @parameter expression="${component.org.codehaus.plexus.archiver.Archiver#jar}" * @required */ private JarArchiver jarArchiver; /** * */ public void execute() throws MojoExecutionException, MojoFailureException { if ( puXMLFile == null || !FileUtils.fileExists( puXMLFile ) ) { throw new MojoExecutionException( "missing pu.xml file" ); } if ( warFile == null || !FileUtils.fileExists( warFile ) ) { throw new MojoExecutionException( "missing war file" ); } try { String puTargetDir = serverDirectory + File.separator + "META-INF" + File.separator + "spring"; String libTargetDir = serverDirectory + File.separator + "lib"; FileUtils.mkdir( serverDirectory ); FileUtils.mkdir( puTargetDir ); FileUtils.mkdir( libTargetDir ); FileUtils.copyFileToDirectory( new File( puXMLFile ), new File( puTargetDir ) ); FileUtils.copyFileToDirectory( new File( warFile ), new File( serverDirectory ) ); for (Iterator artifactIterator = pluginArtifacts.iterator(); artifactIterator.hasNext();) { Artifact artifact = (Artifact) artifactIterator.next(); if (artifact.getGroupId().equals("org.mortbay.jetty") ) { FileUtils.copyFileToDirectory( artifact.getFile().getPath(), libTargetDir ); } } jarArchiver.addDirectory( new File(serverDirectory) ); jarArchiver.setDestFile( new File(artifactName) ); jarArchiver.createArchive(); } catch ( IOException ioe ) { throw new MojoExecutionException( "unable to assemble",ioe ); } catch ( ArchiverException ae ) { throw new MojoExecutionException( "unable to assembly jar", ae ); } } } jetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/src/main/resources/0000755000175000017500000000000011745736516025343 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/jos-maven-plugin/pom.xml0000644000175000017500000000502011466510475023122 0ustar moonmoon org.mortbay.jetty jetty-openspaces 6.1.26 4.0.0 org.mortbay.jetty jos-maven-plugin maven-plugin Jetty Contrib :: Openspaces :: Maven Plugin PU org.openspaces openspaces provided junit junit 4.4 test org.springframework spring-test test org.mortbay.jetty jetty org.mortbay.jetty jetty-openspaces-webapp ${jetty.version} org.mortbay.jetty jetty-openspaces-sessions ${jetty.version} org.apache.maven maven-plugin-api 2.0 org.apache.maven maven-project 2.0.9 org.codehaus.plexus plexus-archiver 1.0-alpha-9 org.codehaus.plexus plexus-container-default org.codehaus.plexus plexus-component-api jetty-6.1.26/contrib/jetty-openspaces/readme.txt0000644000175000017500000000664311032547506020416 0ustar moonmoonBuilding ======== 1. Ensure you have a recent release of Openspaces/Gigaspaces installed. 2. Run the installmavenrep script or bat file in $GIGA-HOME/tools/maven. 3. mvn clean install in this directory Using Openspaces for Session Clustering ======================================= A. Preparing the DataGrid ---------------------- 1. Ensure that you have a recent release of Openspaces and Gigaspaces installed. 2. Start a gsm instance 3. Start as many gsc instances as you need 4. Start a grid-ui instance 5. Using the grid-ui, create an Enterprise Grid called "jettyGrid", clustering according to your preference. B. Preparing Jetty --------------- 1. mkdir $JETTY-HOME/lib/ext/openspaces 2. Copy the following files from your gigaspaces lib directory to $JETTY-HOME/lib/ext/openspaces, maintaining the directory hierarchy: $GIGA-HOME/lib/JSpaces.jar $GIGA-HOME/lib/common/commons-logging.jar $GIGA-HOME/lib/jini/jsk-lib.jar $GIGA-HOME/lib/jini/jsk-platform.jar $GIGA-HOME/lib/jini/reggie.jar $GIGA-HOME/lib/jini/start.jar $GIGA-HOME/lib/openspaces/openspaces.jar $GIGA-HOME/lib/ServiceGrid/gs-boot.jar $GIGA-HOME/lib/ServiceGrid/gs-lib.jar $GIGA-HOME/lib/spring/spring.jar $GIGA-HOME/lib/spring/cglib-nodep-2.1_3.jar 3. Edit your $JETTY-HOME/etc/jetty.xml file and configure a org.mortbay.jetty.openspaces.GigaSessionIdManager: fred gigaIdMgr 4. For each webapp you want to use with clustered sessions, create a context xml configuration file for it and add the following lines: gigaIdMgr 60 5. Start jetty from the command line, passing in the name of the Enterprise Data Grid you created in the step A, and the location of your gigaspaces installation: java -Dext,default -Dspace.url="jini://*/*/jettyGrid?useLocalCache&updateMode=2" \ -Dcom.gs.home=/usr/local/java/gigaspaces-xap-6.5-rc1 \ -Djava.security.policy=/usr/local/java/gigaspaces-xap-6.5-rc1/policy/policy.all \ -jar start.jar etc/jetty.xml NOTE: Openspaces uses spring so if you have issues with deploying your webapp into this setup, check if the webapp is using spring, you might need to do some exclusions or scope settings on your webapp dependencies. For example with the async-webapp which uses cxf which also uses spring 2.0.8 in many of its artifacts. These need to be excluded so that your webapp doesn't package another version of spring which will conflict with the one in Step 2 above. jetty-6.1.26/contrib/jetty-openspaces/webapp/0000755000175000017500000000000011745736516017701 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/Feeder.launch0000644000175000017500000000123411025700413022241 0ustar moonmoon jetty-6.1.26/contrib/jetty-openspaces/webapp/src/0000755000175000017500000000000011745736516020470 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/0000755000175000017500000000000011745736516021414 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/assembly/0000755000175000017500000000000011745736516023233 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/assembly/test.war0000644000175000017500000113512611026410510024705 0ustar moonmoonPKrÓ8 META-INF/þÊPKPKrÓ8META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜êÄš*h—æ)øf&åW—¤æ+xæ%ëiòrñrPK 6²OGGPK k€Ó8auth/PKk€Ó8auth/relax.txt3000P0 p±!%š(ÑlL‰fJ4›R¢ÙŒÍæ”h¶ D³%ÙšPK¹Ð¡¿*bPKk€Ó8 auth/file.txt3000P0 p±!%š(ÑlL‰fJ4›R¢ÙŒÍæ”h¶ D³%ÙšPK¹Ð¡¿*bPK k€Ó8cgi-bin/PKk€Ó8cgi-bin/hello.shSVÔOÊÌÓ/ÎàJMÎÈWPrÎÏ+IÍ+Ñ ©,HµR(I­(ÑÏ(ÉÍQKCÕØxÚy¤æää+„ç夨èùJ\PKK‘+BJPK k€Ó8chat/PKk€Ó8chat/chat.htmlWMÜ6½÷¯(èØ@§•E€&=ØN¶±YÎÈ•-U·8C‘Z‘êŽþý¾")46lÇ}˜‘(±>^½z,í›ÐšÃfß°ªÂot0|xË!ŒT5*ìË´’žúª×] 0v|[þ;”÷ê¢ÒjA¾¯n‹Ý®¬œ­Tø¥¼÷å‘uÑnèw÷þ;YP÷êïx-Æã܇}™Œd?FÛêÙÜ>Œ†}à û ·•÷5=Ÿn‹hCîaDö!Ÿ2%´?ºz$gkœªo‹Þ¹vgX]øÙóBÒþWNôÅÛÑ«˜-Ö6w0Ìp¯ŒI·ëƒ²ÈºÑöìIÝo|ˆÄ*Õܺ›ý `}x¨Q~²ðúÝû÷o~¥?‘ ìˆþ@ žéÄlè$®‚£ÚY˜u}ÂÞ{ºùþ¹¤4Û„Çk¯C`Kƒ‡)º÷¸j¬þßÀ;ÝE×\ÓqÜìUF§ ¡»)QkQvW¹ö±(eqx9]ïKu eëÉÙàa2ÂóÍÖb¹kW•®?—-p9ª±‚6±®å+gƒ¶ƒ ÚÙp«8,—¼øØÑÐ6µ§êY<ÕtmÕUé y\Oʶ"¾° žžy tdã®Ïw›ŒI)ho6ûZ_H׉R T–V‹B ܿŖÛ#÷~Z_¼®m7„"’p^»wÚ”ˆI<÷Vµ|ó=úîç}Ü_ò“%M‹ò°xC ½,¨2ÊûÛâ8„àìô¶Ž­ÅÅÂäò¢Ì€›·rS¦˜r¼O¢ãz¶Úèºf[äh…ÒGÚ5=è·ŠHÄçyßâe϶þ† ÿĶôÊ\ì¾o°÷Ù÷…¹|é?.š¯Ý55çÕõ`–6t·îVÜH@Á94ÜÓU‡†„¯[zÔ3iôãI›ÀBG°Ò€€þ~„z¢R‡}w¸k8šŽ„—×yêDt'ž•×5Šl³e±SgÞ’¶•ja|ŒXJ‘½[5äNðR¹šHp_Æ+bÃmlŠ ùÔ|¢ÍìÂâÝœ-'¦ûjc K¶–¬Ù˜MÌ]¶);.“çPíöewHÍö¹dS9Y„£#šnÑ׉x¨¨hi~u³ôdô±Wý(q›jí¾>¼|ÞPv‚Óù™Ñ€¡ÖL¾U=~ å 2•úe×¢"ÏmãÎ_ßýN-ªfÄÔc`ðȶQ¶áîáÀ4ºzˆÅwöGœ8N`AÎGo8*B¯ÏgN<ªG4 è¥-HšDv—‚œÃ‹üt´½~¿ÙŒÃuvËšq®“}ˆO›TxÁ‡Ï™³ip@† Ä–+‘#bÈä…û¥­¤äô„iïl~oÇ¢$DEÒþZ†µõr4k%‘ÂAnÖžå@”q¨ß̸¬ë÷˜ÅÝÚ>ºâé޶´4ÑÑÀéI³_¸’œå8‹Ãļ,'êÒÕY_° â§%òŠSýr«BHJ0›ðÊÉ ü]ë¢T=îEE¼œVvcÒØ­“Ztïs«…"ºÚDz‹o)Jö6ÕTø Íü-ñèwç'ÁÁ@ƒV®NJ÷èzz¥ÏM¿«êëhå~ÀÎVYÝ Õ Â7™ðHŽœƒê:×õRÜ5"»/§–X@Ò‰HsØ9ÅIÓIÅÀD†b!q±ãÊSKœ]PzÖv)±¥4dÀ ½‰ø ’«ü±nÚ­ršy{ÒÈ•›ž;Ä5BYâ¶Ãh8Á°M§F úêƒÁ!”?¦âó¸°þêòLZ¹É‰&ìçî|‚m·n™;GêâtcØf ¦2%>5Yùe²KH’o07RǽìÏñ?`‚¬ýó5…œd-p‘«ª¡÷©š¢ØºÍŠ0Á1 n[®…5èˆ þäNv¡lCØ®ü>?Âw2ˆþ¦Óœ Æ%3b‚qo‚ú¬$‰É˜'Ñü¨'?ëË<$ˆ†ƒÏE^NÆÉðVÂÃWÃLð¬ øò°µIZ%YåY[>HVŽŽ,O1ÑT"ž±À+MùÀñE©Ö§“®p¤‹–úJéÑe“®»Á+ÑJh ÂkW˜0™$¸,‹R/ߟ¾¾l>È”€ð?‘ð?E2擾ï~’ó±wõP!³ÏÌ܈ôIó5_3Ó‰ âhëñ—Б›šê8W'¸'U ?øN²š7ĉk*’5t‰ùQ†ÒgQÓ; sg (F¢ØãI’Öí½Ì#«Þ¯`odÖ˜OªãhLãþåN4ȃãSWˆBÌ`¼ƒlÛ!~i-Êü‰*®fUÏxÓRüíKù¤?lþPKÉýUQÁ¹PKk€Ó8 chat/chat.js½WmoÛ6þ\ý †+"ÎÔ ûM– A‡6mdûR#Ñ6Z2Hʉ±ú¿ïŽ¢DJqR·+fŽEÞËsϧhÖT…uE^&òODˆâ¦Q)ë¢YòʤsnÎ%ÇŸ§›?Ë„©¹]×?M²hEÞÂÅw˜H×L6ÜZ3ET]/IN"4s#™6'„Ò#|h4W[òR5Râü}®EuB: îO`µ 3bWHž[òå ÁçTòjny~L&V°'„I®LœiN!W„‘ÎñA ñ¢ØÖ~s©ù@›˜…Ði3ǯ¬Û{™Äˆ5ž¤D¥ß¡@¼eÉ«x,ÄË¡Ø@`µPfÀ®N&ýÞ)_°µ¨•²ÕJn‚ö™=¤šWå%ך͹ƒrdÉö€ƒè¶Ž^ bÍ~=·ðyõŠè{aŠΉ¨V!³Z-Ÿ ù«Áîà¤øƒ¶ÁÄG;ƒ†Ïp=Ç‚É*Š3†?˜a¥á 9p•vxHðÙUÚïãBÛÄGÖîãDÜŒÜ/[­ xxJ±>¹ü©ƒGÑ íBF™ª—¹3†Ò£ÄmcnÅ¡¬^ñB0ù„¸=;y ¥.B–ïê’ã¡OKf˜“l¿‘ÀÎÁAÕðIDx|Ûä`?pLÚEOÓ4¥ÎX&¦Ý²¡þ4§'ú6„~c8+¦€GG'´(Gvæèrø'#$-‡¬BÝ.A…âÌpg4¡¸M}Iâcp6¨å˜öÛ–>Ò2œ Š70ÀœãÞ0ÒÒ…¥y?X| ‰¤ã}QU\½¾¾|kiŸÒÃêV¯2š ]_ã±ù×(ºÆ*£ã}ï·Î)x¸{Æå­êø{Ä3F¹Ÿäµ?Õ;³Öà éBÕR^×+_pní5ó…!?÷Ë…àº]κڵýÃ6%_Þr¥Ÿè!]¥µ5*×W.[õ¶qsq‚ú ƒ”P_Á}´RûŸ «ØÈgŠ{Þ92ùƒþæ¬éÓÍ5›c½%TŠÐ.Üw$AE‘gâ·×ð31ú>ô"W„ÏàÚ‡+Xxê@íá£ø”Î„ÒÆFVÐRÿn'(¯ÓÈQu·dWvÆÛ®æ‚ÁUŸðð"{q/ª²¾Oµa¦Ñ9=¿ºzuB\!:å©¿¦„ÂÿxêÈõx`ŠhÇ.zÓë¡dx FÛ,ŠìÉÊò­Ð†!ÝÙ¶wü *…œÑNÎ=¢ð0±ªI+³‚°ó(Úí‡ m'S$0þ©JHp¤x›E-»¸éƒ»’²ÆÔE½\In8=¢ï/. çd PWw|Óà±÷Æ×Ž{ŸèAí‚B‘Ÿ¯ÿ2Bbí¾á›3(Tólã5eåò_~ÅqØý>Þ]¬–Òíƒ1 ¾è§üƒK¶Ñ ·‚·ŸË^߃,ghêt?Âê úYq7ŒßIzÏtŒ}AõˆÜ4ý£rø-)ü?r‡Õk©éÞ­%|›°oav<ß3³qýñ‰}ýnäû¤ÜµoßwTk1ùZÙÙ>æ_YŸc›RɰÉ`+ˆ¢PK礿`£™PKk€Ó8 chat/chat.css’MŽ„ …÷œ¢×v´§< J)d"€­ÎÜ}ð'£‹ngŠðÞ«¯ª`Rß=Ôä%z…› Ñj#𝠨7cI–5JDOÔ³gRZFÅáVb_Íæ¤ì< Væ J1ó©ÉåYò’Ú‘ƒÁ6V{‘b-¢Pw*=_ œæ;ÝÑ'ÇÈA ‘*xÍÑó™õNH©m—¨Ý´så~M}K×c_£¯ƒ"ÕXÀåüçHµuÃÚù–TST'¨‘ÜÐ%)sÊ‹€‡]?Oö³Îå×<ôVôG{yû=urQZJ´‹UêàŒxp°dq'ì¥õÛ×iÉÆ|ÜvY“‘»Fôq…ø0ÈAGat³¨~PK*Õ£°PKk€Ó8data.txt¤Ø±m9DA£ø! @Ê?±½1¼j¿½cÕßßßß¿úmÿ}ßsʹä|äÜr9¯œ¯œœC ),¤°ÂB ),¤°ÂB ),¥°”ÂR K),¥°”ÂR K),¥°”ÂJ +)¬¤°’ÂJ +)¬¤°’ÂJ +)ìHaG ;RؑŽv¤°#…)ìHaG k)¬¥°–ÂZ k)¬¥°–ÂZ k)¬¥°‘ÂF )l¤°‘ÂF )l¤°‘ÂF [)l¥°•ÂV [)l¥°•ÂV [)l¥°+…])ìJaW »Rؕ®v¥°+…])ìIaO {Rؓžö¤°'…=)ìIa 1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?0ýøÓÿοö/ì;ÿ^Øwþ½°ïü{aßù÷¾óï…}çß ûÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég(,ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿ÅôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÀôóLÿ;ÿ^Øwþ½°ïü{aßù÷¾óï…}çß ûοö/ì;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¡°Ó1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓ¯?0ýïü{aßù÷¾óï…}çß ûοö/ì;ÿ^Øwþ½°ï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw†ÂBL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGL¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[LÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦ÅôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúLÿüéçß ûοö/ì;ÿ^Øwþ½°ïü{aßù÷¾óï…}g) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿3bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?bú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓ`úý¦ÿ/ì;ÿ^Øwþ½°ïü{aßù÷¾óï…}çß ûοö¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎPXˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿéϘþwþ½°ïü{aßù÷¾óï…}çß ûοö/ì;ÿ^Øw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ca!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý¦¿`úßù÷¾óï…}çß ûοö/ì;ÿ^Øwþ½°ïü{aßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï ……˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé‡˜~ˆé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé§˜~Šé—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é—˜~‰é1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜~‹é·˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þˆé˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þŠé¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄô˜þýÓÿοö/ì;ÿ^Øwþ½°ïü{aßù÷¾óï…}çß ûÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég(,ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKLÿÿRì¤0‚€¥Øî“?± †€úÕKOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú ¦¿`ú_üûa_üûa_üûa_üûa_üûa_üûa_üûa_üûa_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é±¦ÿÅr˜þËa`ú_,‡é1vÄô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú!¦bú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú)¦Ÿbú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú%¦_bú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú-¦ßbú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú#¦?bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿bú+¦¿`úÿPKyÝ88dÐN PKk€Ó8 data.txt.gzíœMHaÇ#mÒ5AYd[6Y— ’%†ôà׿ÊiH­ã¥S”Іü $BÝC¶ît²¢:DM-+A 1—ØK±LlìÁÁjmv.i—•çÙÞw?^þ¼ìqøñ^ëTaË4å啯WKöºF ½ßξ(UÅ'ß9‹?×Ì_…ü]NùZuµ³qî^ï²-^Wî„o3ƒ !›XmO´ò-7§lDÁC¼hO´óÝ–œ2~´‰L9×ÓÊ×dÚy»df33Ìy®§¯Í8tðõâSæSÆás‚SZy[Æánø>³ºªOÛm¼×2¼=ã”vÞ!.n;4ñ-c\µºt›$D´iº4Êö§È —´ÇþtYTîOu{ŒIÕçÒ†5’•PØ¥¡¨•|„¢^Š ›Ä ¯Ç˜PY—^'-àOŽ †rÊA"Š$!ýZ“W’âõx¬hmY®Xœ ·qIJ¿ %ó±_?¯ž0û%c>ØÐ '‰7Tá²½Øc¸;ø¾Tì‚%?j,sGüé¡Ù°ù_ÿÉÕJ‹‘†ˆl 0<èÒKȄץ3dÂéÒ‘‰—^N&Ì^)™@dcaYÔG$ôµÓ…þ&Ûì§­íåÕ.‘†ÙÔ©Ü GÇÕ›„bR}H(&Ô9B1¥>'équšP ²1ÀÐüþO’ˆ1õ­Õt£pËsÄÞ²xµ™Î†­t6LgÃf´t6LgÃt6LgÃt6¼—³á€`ºÑޏeˆ9boY¼Z,V#°0! CB÷rp€îåàÝËÁC9è^, C_ÎÀéÕM7ÚuApÝsÄÞ²xõ83ˆÀ„, AhÅPÎ €¡œC9‚†r,†r, A_ÎÁ /¥Ó%Aº$H—ÿB÷r€ÀPÎÁC9 å {9@ °0!|9ƒ1õ]¤K‚tI. Ò%Aº$¸ å 0”s0@`aB¾œZ4è2ôú€ }@†> C¡ÈXÁr"ƒ ¡r{@F_w£Ý7 17ì-›W&X‚…!ÙˆÖL(–´sdBŽh„bIë%毅L`°0a·Çüîˆ7šQp­òó©òþPK¥\„[dPKk€Ó8dat.txt¥Ø±m9DA£ø! @Ê?±½1¼j¿½cÕßßßß¿ümÿ}ßsʹä|äÜr9¯œ¯œœC ),¤°ÂB ),¤°ÂB ),¥°”ÂR K),¥°”ÂR K),¥°”ÂJ +)¬¤°’ÂJ +)¬¤°’ÂJ +)ìHaG ;RؑŽv¤°#…)ìHaG k)¬¥°–ÂZ k)¬¥°–ÂZ k)¬¥°‘ÂF )l¤°‘ÂF )l¤°‘ÂF [)l¥°•ÂV [)l¥°•ÂV [)l¥°+…])ìJaW »Rؕ®v¥°+…])ìIaO {Rؓžö¤°'…=)ìIa 1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?0ýøÓÿοö/ì;ÿ^Øwþ½°ïü{aßù÷¾óï…}çß ûÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég(,ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿ÅôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÀôóLÿ;ÿ^Øwþ½°ïü{aßù÷¾óï…}çß ûοö/ì;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¡°Ó1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓO1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ýÓ/1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓo1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ_1ýÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓ¯?0ýïü{aßù÷¾óï…}çß ûοö/ì;ÿ^Øwþ½°ï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw–ÂÀô¿³¦ÿ¥00ýï,…ég) Lÿ;Ka`úßY ÓÿÎR˜þw†ÂBL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGL¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[LÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦ÅôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúLÿPKSø}ç( ¹PKk€Ó8da.txt¥Ø;a 1ÁüP¾¯$þÄl W“OÖQ}ß÷ýÄÿíßß7äœr.9·œGÎ+ç#ç+ççÂB ),¤°ÂB ),¤°ÂB K),¥°”ÂR K),¥°”ÂR K),¥°’ÂJ +)¬¤°’ÂJ +)¬¤°’ÂJ k)¬¥°–ÂZ k)¬¥°–ÂZ k)¬¥°‘ÂF )l¤°‘ÂF )l¤°‘ÂF [)l¥°•ÂV [)l¥°•ÂV [)l¥°#…)ìHaG ;RؑŽv¤°#…)ìJaW »Rؕ®v¥°+…])ìJaW {Rؓžö¤°'…=)ìIaO {R؃ÂBL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôCL?ÄôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôSL?ÅôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿ÄôKL¿Äô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿Åô[L¿ÅôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôGLÄôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅôWLÅô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿˆé1ý#¦Äô˜þÓ?búGLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦Åô¯˜þÓ¿búWLÿŠé_1ý+¦ÅôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúOLÿ‰é?1ý'¦ÿÄôŸ˜þÓbúLÿPK<Áqó HîPKk€Ó8 da.txt.gz“ïæ`¸<+Øyé ëDC–ƒ$í[¯òïHOødÿkµ÷¿ÿ=òÿíýûæOæéYnŸã~Nû¹òsíçìÏ'rââÖÔY²…á­©³tÔCAhŒI‡¼¸´5×,Aedk®YºaÚ¡(4ÆÄCn\Òš9KPÑš9K7L=†ÆPn•Õ|ã‘èÎetcâ¡>‘²%!¯Äp®ÝA7¦Z'R¶tƒvk,D¨:èÆäCóD¾-Ù Þj«ùÆ3Ñ$Ô|ÈÉÇþÈç‘HûØ™„·Ïþ##“ˆöÙtdî>õGF&îStdý3þ ^¶Oúåîó¿ã¥¼á_åeÀày‚]/ã ÿj/ÈúÿD/ïOú>çÏø'|¹>é—¿ÏÿΗö†Õ—ý?2Òù}þ‹Ûd,ôxÇÀPKuY> PKk€Ó8d.txt3000P0 p±!%š(ÑlL‰fJ4›R¢ÙŒÍæ”h¶ D³%ÙšPK¹Ð¡¿*bPKk€Ó8 favicon.icoTÛNQ£ a‚Ôí0´03½A1r)—ŠÕR¼ ŠV¹ËMáIÃ7È#`yãˆo~‚úè› ÚÎ gG¿`-0§4˜3:­:J/4”^ê°æÃdë(Ž·o ×ß^˜´oNÜÓõ(¬9ÖRÖ¢»_zNüIùæt…Ñfäï)øÝáE>£àì};Jt®0Äéñç P)çðTpÎRÎÀÉpÇC8ˆ]§xål…9â:O×c°—ÃÌ‘»FWâ+ûÛýõ\ÿñ}ù”‡7=Tg¶à/Po9 ö*ùo¢|>Û€œpI-‡¬r c •ŒÑW1Fþ·G*¬å(ŠÏH“W¤Á¦¾7;<ˆû’{F*±¥â22·¶ØðU«øD5 îÉpétãÖû—{èuzßOö¯¼—ÔsØ}¨²¾ÅIŠA¡·ˆ!V>ßCçû†¨Gä<áï¤|̵—"ÔwŒl5-< «V!Ó¹¹ßa¤Û60®ËȪmªr×@5~L4óÝZCÜQq¢…ùkÍÕH9ÈI‡‘êÝsk¢µ Ÿ¬r ÖkÊ¿B:>ÕX‡Â“ >¶ÕºÜvþ¡Ì/û"þÎâÏ…Ýù¤ù5œŒTø|¦kë\>ÁˆûIƒîYhf¯µÑüGh¾Tõ7à­¯évšƒ‡!ìt·¢f‘w;Yý”?k6s6LsÜÂ3ögÀ‡Ínïù|J› /Ÿ7§Ý·Åy©š£ÃVãuב]‹ï¤ÅîH>)Øôc—îøËX€j¹¨fšsÆpïôo0ŸVø}„kÈöãì]Ü}4×öJÄåM»<‘›ù¤¿à^øÇ🟿PK¶bûö»~PKk€Ó8 index.htmlVÁnÛ8½û+fuêb©Å(®“61Ú&h t{ZÐÒØbB‘Z’²ã~}I;Ö&ñ¶@bQ$gæÍãÌ£ÊËù§ãQyy19 çWóã³aË5½ÛÒŒ½ß–EšO{>]Ì'Ôxßò¿½\Ÿe7V¬Z‘Qe´gíÏ2mN+Q5œ³˜†ÕÓ)ö[£^0<ÁÀyc“‡²HËw×çßð˜Ðå—‹÷gYðø¶(îļ5Ö/Ä67v•Ë«OèöËô,‹‹ÿ,„Öló•\b­˜ÀGófü•UeZ&oR–ôWY`zTvãѼ‘Žðç¦9;O^ˆ®£¥±qng@—óù ݲ]³%¡ë8Tì)¤&dˆI4z#Àc’ö­ðÒh Óûäç„:ÅÂ1­¥“žLoG¥ Æòòÿr"ìæ²ã<µ¨MåòÊÔ܈Þ‹¢–®Sb[Ì.æóoEŒüÇWy/á ¿ÁON£©i[¶•Š\ßusNù‚±R‰… `ų ›Í&./kFì6‚ /Ñù¨,ºÿ²+Ènãñ?x+<¹@¦{;*{…ÍJŽaÕ¾FèÕ›:÷>{©·!ÀÉ`E¤%× ¥ž­ù´Ør-ûöùêÎV »â#«ùêûn­¾ËŽë°ï÷²ÜˆyÈ +eŠl|žôÕXõX%ÁèE›ºo»"K6þ‚Ž cê§vŽCm!ÚmýšYe̽dXMãàcicºüÎuO0ÎnoŽÚ`7¢\£lØ;Ëgõ*|ÕdãóÝf?ƒeycÑyã[Å7ºDo*¶ÇXÉÓ…ÔE<¬Ü!äôùÊÊ.†zÕkù@F«íˇ\¡r‹ð³‹;™Mþ¦i(çôM¬]©ûØøÃ|‹Xã¡+b[$bvÝ0l(9ÁŠ;4!ÚTîFÁ%€¡¯jn ™åÃÐm§wºFËÏ>Ÿ_Ñ’…ï-‡4 &þ•3IÄüA‡r µC£§€AvÆü ZèœÇWª¥å š¾ÝãJš‚SöV.ú(ŠAj¸]p]ãöÙiãl2¹=¸jãQh”œ>ÏI6¶¦×J‘f˜BÒ½D§!tu…–Ò:Ÿ(G‚,\{]GÊþ÷ªþgþúÀòx”Ú’ea«UVyDØ,Çà'ÊÞ¼¦-6Dç•í—Aíz[0¶µfÍõo—WmgÃe5w¬k¡+ˆ®¾ƒk$žEç™Ô¸lbs—û+´f'W»©¶3Ré^r,Q\¶â14jRƒ Ln[íÇiÑ/—¨ÌÝvdm6Ž’ü¥%íò ë•ðé ¯9àÔ) —GÒÁw¯Ð+jAŠÂ‰5Þ\òNHqû<œ÷ŽA즑Uf*îÍtM£ýtÅ!™/—²’á¶n««Æmzœ¾ê]B±O¬¬Ã{ÕôúƒüþuÀâDÀ°÷óÕ5½‹H‚6VÝ!PªîG°±DSb-\,e(ÀJè})¦>]€ÉûâW÷jÛ£©Eíbw¢7´wIEv„ÿ,ÎJDÙ‰BéNÝÇVL}=‰ß9 âí¾sÄ ÙaÎäñŸñ–wÀu`â)¤éPSÔGR£ŒvF…¼GDïm¨ò‚õš´h+ WWß ê·Sýj•i†Oo…v"ò˜Z¬µ>P<ìÃ~ggv>ªê*’RvsÀ€ýgÀÁRààˆ éðèñ©)Hˆi`40%9=­9)5µ =ƒ8+Ë j¾—tt¸œ!Êt *ôÜ||¡S ;ùWuÉÅ®{¡5f/š’VlÒä|î^V›¦Wÿ%ô-g횘tÆÞ1ÔÿÏÏî˜Hb±xC.ƒŠ€ÒÕºîK÷Å:«ÿºÉ4yÍÛ¸=_qnR-Û=ßmÖÕ, ÿú¤>‚ʼnør8WiPc=Õ-öÒoÁ¤ñ±œÛ0ÿr^V²P‡P—†)³CºÃꔑ»õpqú¿ÃéŠ/ÁI°& åBÝz9´rJ"áGŠÛà×™×óJ•rßu?ºr,O´L·'åWœ~úúD¾îó.{rb%;Ê/Vžƒ.`Ñ.&6p=»0ȃ̙þퟦ7FÖ®ß%lBcÖ—èMìˆ >ô`Ah_¨c ^OþÖ3÷Ü«ÜI~qmúSük«¯ ë[¢Q¶Ð[ßa2F—y*•^æPÐëhDA ™^y%z­Õ¯L»d. YUz'áß*zï›0 Ín™ ÆvW¾êŒaˆ® ‚ÌÈôQªà[¦2=#öò|šDfb{XëÖpª2}înºvò¹ãG{ó¸ò,Ë·Ð/9Žy]Žyí꬯gÝ8 Ñ&‡cŸeÜœÅÑ…a•yÎý•4É Ü\å*ÌU¬:Éc\™…Î]NÙ6Ñêl”×®'mËÎ |2Ó‰*4†‚p¬Nk¤]=á2Ÿ^™ÊOb+Ø ¥uµ ‡ÂA[Xݶ ;¼³f%š4}»ÆnC­m,ÞÊ"~Ê0Q{ìîÀ³±Š~P1¬¤ LF±¦Bh8¦4ijã‹×j~ݹ£¯wÚuX¿vÚsþÃâï×»SMåÿžÁý(z¼ú<™×C$M#†Ž½¾# 1/øÇØKk/:[›;wópÁßÅ{EtŒœýMdÓäTà´Ž~‚’£¦Èœcnr.’D¯q·­ä7*ûéèíU¨k=»OÜ…Éâ¥×#ò‰ˆÝS‘žÕ£}-¥¿QíjLö#ÅVGCÔàJ ¾¹P§ %?¸€ƒ" š‹U7D%PPÞ«È$h9>j˜°ØºR§Ù3y*’ÝÎǪ“ž¸xArÀ!ˆ8 Ã-öšåcqõˆ]*§ϼåíß 5ôô¬Ö2~\ˆ€N:, ó÷O%u îâL Çr|°¦ÙìlV'ë @W<Òºù(ۄĆ%ÎmRÝZ?7×Óùƒ)F²[‰€­»©ÒÕG²0ÜMïÐ?¨MÓµ±P>NVˆžåŒD°“pÉäu/J­`ÛŽì %ö©ré|>o’26Çš9i“oÈjÌ–0Â^pȬ”9·••Y£u£Ùgã|ùYˆCé­w8F÷§ÛÍÇÓl°îÊIG¦ZO!Ù°òÿÍgêWs‡—ç¼;ÜrÔ0˜{å(™äÔôÇ hTi'cº(|ßR0Ò ø3Zä.X•̃í©.ï[úvO"¸ËHÖ¢Xm|³¥>¹ˆÆ/^½…i\V$ÃNQ ø‚A°œ-ÔÑ<ö$—תÂê×f#û“ßüðtÝ,ÌáØ„Pb34Ú1ÂÇcO-ÅЃúÉ&ç·õP$VÎÿü‚h-ã;ÓOh\ nûr8Ëæ¹Æa±ºJž¡6ÏçŠ+ŒÂyc9$VßI`,üûu;²0sÉ„ÂÊÿÓbå7M* v´I.ŠÐ iDbó&°Cé!üµvÅu/J†ûã´ã0LŒÛæÈO>QØ!vãܦE¬ý#H½¾¨´ã´Ñ×­ï¢8ÌŽ]J9ß!AFˆW)ŽQ›‹¬Ýòœ•!«u¢²ÆÍôá0¼b„À¾!t‡:¼È…Ç9^½Ñ>6Š4bå„ï¤OÌ! k`Ø`ª‰$6’þyÙî,Œî޵Äbä³ ZO÷2ÑŸS}WFAMC~Sx¬¸[µ+Z›ÌbȾØo‚\{a(“¬þŠ& vY7,Si±lm×–&`.7Ú?R1ð±ï+Ý=&„š÷UåE¨½R%Y×Í•-ÞŒ1Þ¢b¶ËØ+¤¾³§g˜þ¦÷Ó[àû^·íª9«×Ú×Ò(MóSk¥§s&ØyŠGÚTŸ®ß_aDðiY«´7÷gˆóÁ¦é ¿|íWËm°_.Œl—Z;ñþùoY¿Šnü«‡ÿõòÄnvžñ1ÞUsì­Å‚­D"ùy"VõzþZóß":ÔUáåÓ,Úä÷½£”ŸŒ;>I'€/õ’³-8*X„JEÞ8úƈV®sC‰žmñ[SäÈ›U\½íWé׎Èuä9¦y ¶ÐñcfŠÙ»eƒ’)ùu1ï¦@™Éò®ôWR ‚_¿DI7©Jʳ´÷ÿ™ž¼³9[5øŽí즄[uç,=¼e,7gÓ‚±iEq(1!y³_¡÷g_T¾}¡d ûp9Âqex£4Ù®þP|ºù°³c¾ªŠÜ¸ `{Ï1ˆÔÏV,Á ‹/òÓÅ*‘̉®ÄgG5¯8ü¹°29‘`r yÓŸ©ºêšË‘|&êö9Ž×ç©Òè(@*Àœ2šÍÄ£·‚p…WÚgQ™!Ä.J·Õœ5 6iyC¤j$ª¬LK‰ð>#3×A˜Ë}°Gˆa ‰²ùó£›HÕáfL¢òí"_Û¢ÑÛÑ>Ë¢¯ƒðMc²)‚n•Þª©7¶©¿‡ÄÆ3Æ>ÅûÅ:dÄr7Æ6‰"S:•kHe<Õâ¾:ÅɈÆäJ*ŽÆ‰éF“GIÙùË ßF(¼…«†/&>Éãôs&JÙ¥1†6dÛNC0f%“ˆ¤9ÕÐɃÄï.ÄS±Ä?·QîÒ”½oŠ’¥F“k("kU#—ÿ Ú3·ÉÂm‘Š aL aúÁ¸uV¹J¹ã’VVI¡¤>íÍa H†–5ÕÉDÿ£Ø!±€!LPD§kÒá˜f8‚ I=MÕÎû©d4‚¨‰Ö ŠS¥ýNË•A•‡Q ÓpñÓw‰¶¤³HɲߥÐ|LßjNÿm`f”b“Dý‡pQ‚ÞF éÆLéTõ]fyVÆ5^¦j9`´V‰s÷/óÕ]¦kUÖÚr–w.¨LÇ–+ë#9ÁÛªl<6üTY!\z®T@ëÀ ,’ ˆ­ŠÌÀo#Fs•!ˆÇ>¾„PG§Ï—]PÒ4t|O^·MBz7sTJšK-êo‡¿PF@qý¥úXøÑÁ¨u –r‰!OŸŽüOf:¬€¼’*fE$žZâ:M-yuwy?3à-fùÊ>ùüèß_só’çùûÕe,‡r‹ F¥ò&ºÔ§  UTŸjWÀÿ¨gÞûãn¤‚®»>ß“b¥^Ué¦4&¥ô}Íšqïg>®`õ(X‘á ê ¸ú5¹)*U’t4LãÑvG0PãØ&rãDfQù¿1À£ýç$’>ä€Vß)yai‰È<|—“pTèi{îÉÄX’e·”¢M rvcí @¼gfˆÁ„½)Qs¨8õ'Én=!L ªkµ<¸;¿"µf(‹-)¿zwYÑ|Yåe™i¹·€‘´² 5¿Yw9îR9÷eùÖ\©Ã*­*èÊ™¦Û—]ÙNaÚÌzW^™ŠS…ÌÔÅAáÇâ„xŒAÓVAqyUùyºÔUm1~™„4ÔÀ’îJ ÿŠQõ[ò¦(2 G?G•ZBŽÊiì2|»¯ÙDÖ½Éý+ßðÖ=¨X¢ÁƶEX}Jò³ãÚ—Në-i³Fs" ®0µvqªâ‰ØIº?—˜VÝï|eEIZ[ìÆ"­ãmÐqÐ/šo;š “m2¬N2ûû¯Ž,ìO{dÏ</-þÞ¦R•bÜ'ÈÚÏýWu÷+¬³V&ï"€k)„ò Æ+MŒgsüΨ 7±†'Ñ·HW̶ǣkÖ£RRÌ×U˜ìa|­š?¨·1µÔ«Gé±ËøzÙJ@ÊlŸEb»—¦±fkðWmñ×ñQ°6¾·„{H¼Hh‡Ã&%C!ŠJÞ"‘.ÌÊÖÅ]ªaê ÞÈå_sŠáF>9|E!¿Ìš¢I'&BîÁŠÓ‚pA¨ö}ºíá×xæ!#J¥#2«¢¡š%˜Z:.Ø!ÁQ!£†dš ´eµ‡£ú#Ö¬¢cìcu±c¬‚¾¼ù…ž#!á#r]#‰†ãÇI°-ˆ›úÆ,IìÚ(󩣨©óJ]Î|]x'A`Êãh^‹Ù“$Û §ü!Q!¿^S‹8)ˆÄsôÄ_Hý¹8¿ IÀ——Òƒ±NkÂå1©1qw0“`8— üY”<Á¾‡³Ó¢ú;ÍÞa³é°A üe°u£@¹ØÌJf6‰˜OÚ§Xðeœâ4Øjúu¿®Žsfàú=©¬ÒŽ(?²v†:Qšî©@1(8;b<ë1.g­ŠÁ=5‹)+)4=Î=7c&"tþ[bb0Óä7ÈG”Í’¯;Ó›$ß«ëÀ—´ë¹h÷õ³ _b˜r¦~A¤¤ pd9‡'ñÎÐ]=qP„ÙßÝâÖVŽ©uôýMNX†SÁO?C|çõŸ|ã3ö*ÉÛfÿ‰ûh’Ra¶r¥êHé—ŠpžÜ e?{°ˆ85 „h~ë&i…^Ía(Ö®>XÝh+]€,a »ªöÖ~eÖøMXÑ ®‰ôü=_˨@ÉIY®ÜQÔ*uѪôWýôÕª—˜$?y—üT§•ºIvìW>õÿ>­h¯|ZY´,ýºnˆZàí/.9Û<£ûUR¤«Íøëºîõ5ß/·:]ßÔ_ç^EO'¿þjgbÊÛa 7Ã~ë¢lñOùPò!xwþ¨¿²½ß4°/xátã¡R?SÐÿ¡ƻ}¡úSPõÁòëÀ¸«‘ Þ[]qI!2LVÖÕ‘ÏàØ(™Û’šÞ¤„é0øÅrDÝÊ­­¯Ðöýñâû®¿ Ï{.ã&:C‘Ѭ£Ùm·¡ø‘¥TÚ¾Eq¾¾½Fº1ò( ·F Dy½Ú÷ŸàÒ'Ø?»HµY…”Ô&[Õ“ˆôðÿÔiû!qöšŸ¶¼«Ù@:³õä%ÚÑáòä‚ã¢z:žyæÅjø‡_ûDãï·ø9Ö¿<ê§7÷o­O^)‘~<xcOÿ¤=Ä.D/b1nÍMêùQwþÙµ§¿$±i‚—y¯þ Ï.îè.E b ?©ÕâÛ©ü[aX:r oê?ÿþù"ý0SÞ_мž¡¹¢,\Z`Ää?N®ëí—®õ¬ÅKE¼ï½¹—ÿ­Ñö÷ÌBè¥qÝÞ¶ÅàWáÚ¹ÀœÉš©ªøÜw~?ÏzYÐÓ(Q7nø 7xÝòµpêãß}ï¿劾—|?¼I Èz%6w?»YìV°¹M§ýô>b:%øùº ÷ZcáÚ ÷&ó3?Ã1Éâë¯?ôg}¿ÐO¨$®Ç;ífdê£(nïnÚýñ:éqüçe“í¦÷(ÉlàH#ÞÅó÷×?nÇt΃ÀŸñ¸èíÀ83r«BÃú–6ñ,ðÙ_åž5â³F¯“>‰ŒK›찵ȼ@ÂT‘ÐLnþV(iSº¼L`Îr•}c¼‚€mN*'q<™Œ!é t~T'ŸÉK…¸UD=I^À0'‡2]°X›[ôPÊ™Z¦ÂÒ¬:€ýO#Ƚp¥¢# â!”BÓJeäBî»DejéìzÕŽ‡évʹ¢^Ûó]gUºE qÔ'Õ¢0ƒRÝR^S#&Å›þ¿<¢R|J4íËh¼.: @Éj¸ —Ä à+ü ¦3÷LJãðR‹8Ñù[bÆ+q“7ØTÊÖ_£[næT†Y‚êáX;Ê+Í$?ƱdÂßBþ,Ô½1k¯Åýý3‚“áè >ìfrøXÍ~²Òâ4Ÿ˜l‚.¢¸Mp÷f›!åÏ>ØVÿ2Õ~Mü›0°ù@fc¸JÓô©jýf54øCJÁe\ŒncÐdÚþã…6 ´xÍÍiü­]@µ0òA™E\FÎÕæÔ÷aŠ J1Jò†$€ËQ1w­2Z/MM˜VL xFÞ$].×Q3á¹§%leK©Ï¹›Nýý8wX“*A}¬†½sÁ¬`ܘB:Fq­¡£€"åøë|}ŽÕ<1ÛÅü5Ðʃ…¡+"‘ƒú¡ü"™¹gbÕ+«˜¡«mÙÛw°XU"æ´ö…®rF=b Ðgóˆ21_«[‰YÌR*ØM(Ðê‘™d@rXX…(Ij~ëƒÎ’"ûã´9œv¶ß™-ÍÞd‹zÇðH/’ÛU¥âv‰‹Ïñ¢Qø}6³®–ÄlG³Î©Ms¬½ ×4hg7QÑÌÑHy@­|øÚ9õ+óõpîÏù~¾ä°ÉÞ8·´F±3 À™¶ìûw)}L’“ƒô§ËÃü™huR… ÷uéiTð »}3Ýi{éÙ“TIñ¢È.®šÙb­F±Dx¼qÓWƒi…1GA¹mÃY‡(¿îˆÕ~ú{L±m!—Ú*t˜ o/—ùð…'£ÇïΊä7”ÇÕÆ$‰3žg¦\p§U(ñ e> ™S«rúIýÛ œðhÿŸ…†Þý ®)‰6‰¤ö´ëU® ÈJ±júÀÛ£YoM`‡ºe›¸®·ÕÖ—™(ŽLÔÇ&j ´>D+ò•~œÔÂUË™r¼ ·Ú’°€0ØÏ`›Ýêa‹ª0ÕQŠZþÄ"IÓØ³_`qBvb£«?ªp*°©¨elGåè‡%Æ­M´Rn3„KqKÚ[™r|‘·¯*V ¥”Z)l·k‘ÛsQ”©¤-¶òfd¹Ë˜ãw^+ ÅyTË[°n,‚ºðÇ_ñ̬áj§5|奌g)LŽW$ õK²™-$9VÿÉ)ÚXp«fÊÃ2F|"#5ÅÆþa & ±•V 3ÅÇŸ)‰®Z(ˆ—Ý6¸²>jê÷9×}6Û³$ é!ï¥)}I"KèX±·ZÍU‹hŠ‘Î|^ÿܶ-ü×Äô¿(‡–b‰ 2•­ØÜ`ZˆÈ:ÿbˆ¥fÊvø|>Ni³Žý}ÛµzzÃz‰´ØV^&B‰1††H„*:ã„9½[-R™MdEEWe;î^Ê ;4nêž5wõ°A€Âi銗ߓϡšr§÷áäabYU“‡e­;¾P þ)×Lñ¯ÇæÎ!ZpgãÊY 0îÈ[€!j±ðú†û±‡ðgÀ¨?èœÁ*pR}ð“ÖÖ?j{ë±>Q®îâ×y¦Í¡jp6 žE'šø>JPJgùç ó¼º×Õøy™‚™G ýÑ›ÞNŒœmâû›ŒŠ‚¡¥´ƒÄijÿ2³9#YcúÜÀ4q\]ë¤çÐpSÍdh]‚î6/›Æ#0´á­ãuº«í­¼œ½µŽû6—©}û`  ìǧ‡DâþžÂ}n&’ºó3Ù>ª2Øüä+#äºévFõ¨6YÏÁ^ú‡ë1‹+ˆÄSK ë“óœËà¬Ä6þ³«—dûÙ,`2',2@›½PTåâðå½zNSËK¿@ÚUÓõº2“Á)¾”¥‰^•MóëYÍ‘à[jS¥óYŸ“!p×>àØð‡á9}'Z'|™*ò-'†L ,òcÓÄÖÙÀÃÍ¿ÍßÍEè‘Þ‘()†‹Á¿kj+õtä¿nW™Çþ¹SìòèþR±µ¾,Àfí I›Þÿ4‹<~wª×ðv ãÛYl÷c}÷¶ƒ‹©¨sßûë¶ÿBEj¨ s_¬üOóá¤Jšó·F"±ŸmNv¾_âÁï|Ÿ„÷úÅÛ¸æÿí2ˆX[¿»§ÜĦÜÉÇŒpx6F+Б0}Ë< Ñ€†¹Âˆ9+³[¸ f•\î}1H†³0qù7‘\JŽ" Åk=#ƒ¨AŽÄ 9ï ÿˆ›|`X¤· êÃm­ ë[Þ®ÈâŽ%Äë'ò„„ŠÀ}àp2R’0W¸rœ%¾?3Î@…Mî‚C_ÔáôÊç>À! UocõHÊÑáí¿LÅ…h`ë!õÝàç{&1Q™q¯´’4<þå ~Ý1É=­šƒ¶2@ÿ:Ç&lj{°eÜ€Eé„^B–ô'jŒ­x¾HWb"uV¨À„œ’8¤ã> g¾e²cäÁ †pFÍ'IæÌ… Í6e¨jˆJj A´C”øÎ‡‚q¿ë"ôAõZß@9¼]Í&‰ßs¾ÏoãV¥wŒ}Ÿ¥)oT²YAU"¨TlŸJðäkÈäñ!ƒŠ“‚„º\dwz/Ëì"Ÿ’‚_ä½ÝÅó÷™œVuD3w‹á{f_P/Ý(GƒAòÀ]ñ»3q¿ð/@´Gˆ”ô]sÿ'33#JÛ å@ÊFÇ23„À"ÄHæ8ðPºõwƒ¡ŸÁ8Ôœ‘±î $w…çQâ:„d‚]bA‹×Êh2­;`ŒH½JmM>Zôã#_€z`BXvâXü%0¯U½ ò‰”¢°wØ·%v :^J9®~¦VŠ7Vöo›KU8l bv&Fò#5 !£ï{ñ!,Édƒâ¨ž²Á.Q€#¸ßPqÀع«º>:q1ñÝQu©9lÙP 7–OL&bôM¶Ï Ñ‹+·b?aÉ 0Ñ«Åù_Š€a‡´¥·ÌÔòPuÈD(5wNQ'OM8ÓY3’6—'ñC3T’Èp3ä . wÀ +:¢DL=ÛNåQÆ-YR­àa¬ÒƯ­g­×Æn8†o>N¡,³·ü«‚‰pwË2’9¡Q€tƒu²’bîœóý:ÜÓ?–ýcWjµÏü h~ârýdR +ÚÉLô%ÑCþ75HÞT«ó8lØPQ©)D`fÖGN`¸†ŸÊP;FÞ¢¢ˆøfF&ÛH÷Îi¼¨ÁŸ‚Äïô ¦Z$Q]‘`A,È×—–ÑÿÔÂ}&²(8£~Çy~´¨<¨ãDõu6–åC[R{‚+õ'â.î ‹•½Ö,€†³›ÚjîÊü‰2%bw *HÓ¥®¥,ÇÓéãå $VjYq‡«ÔzùµYRO¡Â_Ó% ¸Ÿ0Õ³ÅNÒ‚ ÂÓ öjç0g˜¸Ë”¹Ò™Óæx:ù¦ )”ó}œóBʆ"tq$¶Ó²[˜Àƒ0ÆÌ3üYIV‰6+'­¯l°Œ;I†ê™ÿcYã/:FiêõØÈ;áë#Sp£Œ;=1ÌËôbµÜëŒ0¤Ç'#‹À#ØËÄŒÌdš4k8éZŸu¨¸³žÉ==– ,‰ŠçŒB›ÆGmW|ì4ˆ-a» £Ì¡àH,Tõ[Ûf~å’†PK•an^͇!?-IbްX¶„x,šTb,„LJÕQDð­l®EY}ŠŽÊ‰ JÍY~Ñl™ œ] {g…Ãå 5¢|5ðAŒ3 ÇŽEV`bz–/`HÖÊiœò‚³Åšï«µ æµN˜Q¦Ïl´Ë•²NÌèiGè] –c\kÙ0WeS4ƒõS5Q” ŠL#v2ÀÒ²QçÕ"#;'ÊìÊÂÚ4…•s}ðÄ¢R9Å„J~X¸ïµ¹’ŸO4Bæ8-f&ÇTÉŸßœŸ:ŒV2ÊvâT…H”Ém?1s–…ǵrè%N]†úbp˜Òq¸ÆNâ¦ê šãpDE8y×ëS[BêD©¬È‹EÒæ­6(Ü6–’6ÄŽrV˜×¬¢P#ê$¨ ³!Fë'"»F°læÖ|¦ýÊy§®ÃPå%'£Û8lPŸÍ·L#ÓUµœÕå"jë¢$T”„F?§¦+±©8içÑð”pö>‹~uöŠvbŒ¶D¤'Y ò Yvç`6n}4Þ&Šàô-XlìÔ0ª/[T§Hša;°<gú£Ð¹1Zn‰6K>¾ÅzäÃ4O—ÑÈkF0›³=‡ñ’]Ó¬‡ml,ýñ:DAZÜ0’‘Í̾ӫ'rFÞ¥†Ä+ôÅGQÖgö à ¡QÁSm;Z%á:9±0ð"¶·å.íå¾HdrâN’P2síL3uÄ¢rDßãˆÿÈ–Hv¸—¾“‰6•m‡È]ï à:"µF…UY©TÄwTU vE¼4åàH¬J€¶å· ǵMµ23ZCeêjïaÿH³Z"&Çö•´óªŒv–Œ¶E¡¡40v{¢Å&è[Üv°[ª³;ýžÇ^”y=K~ßßx?@g_xÔ©Â ˆq€´!η‘'3B‡e:¡"è £,éA@y€µkJh=òý©’=º½Ôò¾Ñò"fòw³Ä¡ÙÇÛù`™an åÑ1Ö½œåà ‰œ"$®L+´Ÿ¨=æþ*ýÀÉœ‡¥tŽ…S.d2µÒž§ÄŸB’ûyQxáIìqÉào-Ë ©âxqÜn¾nÁLi<n$®nk¥­œink!±y§ù…®Yƒú {nWnEí±”TîúâÒ^ ‡&šŸî·µ‹GåT·¿ÙííC Üùm[ÕóÁÖ4,Ã.ŸP¾îÎ.„>…ΛG`•L¢vq½­ëÔЦ‡§³b:rrñxjÏSÕöB\©–1¸íC^†Z#M?-à0" %íåL½ÌN}2¯úN¾ÚÇxsFÃ1Y±‹4r(*R ‚·v˜šã(ô€u‚±>RoZ0)ª”³?n{c'eƒÝÒ"õK=íèpâûF³äpNYú‹·¯cwÈK¤"¨ö_-$žn–¼[ÀÜwˆ=©çø ¦<[d>—ƒVsz³H{—©y¿6sÌ—?e)å¸v¼c—»ÿqz€ç>éfDbÝÚØâØõ%“ÙK&ë ‘aG£€þÅN¯œ_ûø¾vÝÌr&®Øsp¦1f²#ÇŒêl ø2Á‚š"ñ8.˜—΄+æÐl^Ã'Î>‘X€0òÔ×\H¤Ü6GÊWŠ Híà›[>†£ë­»äTÀíÈ]c„ºÏ;l¥C]²Uãý«y¶ì;òÎúç³)L»’Ÿc ±ñ Bu;Ëißù蓵 åüdż1Å;bÓ"/ËRýøì…ã­J‘MÙ/lâd]Zæ„48ÿ(hýs8ý)ÒT” Ê//“«!ª1þº’ov¤Fü_ê;¼h€E0@S,Ÿ±•¯)ÔlçØ£fC²2÷YŒÏ}Þ2¿òõ/ ô÷ñõ…¤Ðggz ÷;ï ¼ßóŽ&{õl^„$¯Ä²5¹éGaË# }jV8·!èÀL› ×ßo°Š°lÍÀÖoBœ¬Áì´ÚTy=Ý~J{‡ÿƈIÿÜíd’n~ÈÎØå‹Í&Ô–ÁŽ—ÿwÿž¥ªjCô3uãÎ,¡+/nµÉ˜¨ïŸ’ín}ƒÒ‘·¹Rx•µ·jŸz #“ž (Ï‚B°‚ÓLæÒ%Æ3~Å|YÂh{ÇìœSQ+Ã#)ÓyW_´xÏrw>{ß%\\Á‚ƒg£{ƒ'÷y•G¾P¿³w·I4¶8¼Šol3©‚¼(³ú¸²îMcú+)Pžú‡þWçž®Yëׂ7ô•Qã#“#ƒXXè®,~µUÞƒë̓'3ØJþi~)ŠÝ;ŦËjÅjâ›Pg)ô&Æs9jZö³‰£ß²ll¨CIM=‘^ÎülŠ)›W8uS·@Š• ÂKæVnšËS¶s ]Sˆ™)]†¢&Y£…|imvÞ0 Ub8½—û)¡FáКÅ6¢ô¿?ùP¢r€æ×\ŽÄ2‹º’r P² âÍGkä‹ã€ò\+pÈØá†¤@‡ =FAÛÊX¼íõ¢øÀä¾³ý‹ßš8Ä¢¹UnsZ„09‚Q™›¡ßô¿ãn±6¯ýÕFo°AõT^›»~¹Â‚³XÕl9j(ŽC°Ñp2Ün“\ é£ýY§Î¿¦£Îêë{¶ñº¹Jý½»?¨¾pll°Ó¬0,ânÿbEìTD‰Jšó”;YµuÕl™ìѺYžEmðû††Žgoðõi•Ÿx¼FQ¢NŽ P$òZ-Ú°¡uèäo¨bñ¹NMÄ©rügW¢]G¨L®–nG“ØÇ`ÜÄBT|ŠòÊ‘ž1 ($ð÷Ÿ½žHVØêšQ—¥úb¥#íF1fõžlÑÔàGËÅ sª/£lŸiÙÌ>“½N²mù)ûð(2-r$e X•2¤µ˜ÃÏfûõÛ%+Ž»šlÞÁ}ŒÓýº6‹@´!#Y^•°m€“ª±ÅaG‡ÞI©m–“Å•ÍÁ9Ë¿uW*l<9·÷ܯi0æã)á7`¶ øoXÉ VÝ%ÖÚc›¿'!àó¡ý‡¡¼U¡ÿ`(ì0ÕÎ-QFz^¯“YI|»wj×»ýFßÄ÷ÈÝ¢×?}ÐÁÚ$-/>@ÿ›Ó•»[Aëší"K“D'@—|”.Ïšz?y“L·ò³Ýí&¤4ä~Y}5οf‰ÎvÔ“z6ÝüË6ö¾ÞßeŠ×G”D‡SPLP"ŽIsO"Üü‰î.²Ék¸ªtuô'²zÃóT•Ç)lÏ^q0y)×37E0+ØI¥ÈŸÊM ÿè–ËI5!+ÆŸ˜¥¨ª."â@î2ãÞt+qT4dfUl\ XW$ùÈHÉT÷:`€´^П< `0À*Ž–X7$x³<¨’Q"'JŠUê;2Ô¢ ')–d$yïѲ­ÔQ|òL‹g%§LÉ~‘ÍÛü3aó_õ›Ä#*t*Åz>ÞgÑá›…Úô¬Gwã/mÚ¯šC?ö:Þ 5ëé¥ï×$|†‘eºˆ~¼ FG1µÒ¥4X‹57&ÕT¹Óç ÁZ’w¶Ø"›07ìè%gRåEÆXd%læ‚ "d§ÒÏÎ=‡wÈ1ÒÎÜ5=S€PÑéG18sÕ5P‹Œk©PÖ ’2ˆ«uëÜPsm•€§9'Û«®„GF‰O¡ˆŒ€hœäUÆãFã¿ÿ’^\±ÔŠo¶àßYŽÊ•ê¦!DŠ–ÕàFÍ\‘Öùxt. `3µ}¸7롊X!pHJ™1–d­’Ëšj@Wªý¾?žé-—nÈP’ýÃ)ŵ°<[yÕ3 ê!ÊDßýýüèÈúj!ÙÌù£Z26Øðæ\8Ç?ìóäü}eÈ: í7N \ä~Ç$ Ýžl­õP+–tžyYÓïÏðäÇÆ ãö¦¬‚ÄißûUØŠ¸-™Î `Æz¢ìüÅ*µ"à×?¯¤=táî*$ì±_…<a¸DI¼ââKy?ˆ"`fú‹Eœ†Pg±‰•”kñj¯-5“yŒÀ6w/ñK?SŽGÕ¦3OOû¼Þ\9zg¢‰ÊýqþNE#p÷‚^³gµ¾wþ¡õÕ7Šo—lå}‘ä>•éПܜLl¸&ŽžJúúÏ;†Y«º¥WµÍÞöúËA4(ŪôÜå6…ð‡ !µWlÕ>Ciœ.¾u8 Da.1Fe¶¹-0õðÆÎ˜åÓ®µ¸¦D&âHÇ}O9¹|Òf AŽŸ‚buó­ÓÈ ¡É¸ cävjë­ÿ5]"ØN¢íİcË<Ìÿ˜¨ýéOÛj"¾Ç’q!3Cn‚B8V9¤Š#›sÜÀX(Á$QuÃÑl¸­ºIäkéF”o‡Ó‰d‚dëø‚ó LÑýÌ#ö“#ë›á7U=þåùÒ Z~æsž6fˆ.ò¯žÃ"ëh;*MÀk<.9m!ާùš 1´âçûÄ.B?Æüa¸­Ô~¤ÇÂ0.çøq¯RZZ¢R7qn¤äbP3í$bîíB\«²)É&v>¾Æ1lZ#ú—U­ Cn8¥á­2¼ïùHGüAz`ÑúUñd4nwI¥ä°Ýë;¦˜¦ ÚA8ìózno=SÿÍÙªlá›—T+3t-?£>¹¨Êx-w¸=yaîåk×ÍfÞNWtî§ö©pø1¯9×»'œâ=%4åVQBû¿ œ7|ùã‘¢/ñ}´Åí|&¾Šùì±ÇйùU¶%ý/W,<[d1ªçµZÙ,,J´w ¢'9@4ë¢1…ÃTo×î׿RÁj‰`Udäú¯¢›ÞÏ8’ýÄ>gl½ý8𦠤ž€ Z#ŽqcÏêBr`×þä­D/Y²mжìP'5œ¡ñ ¶ß½ÔÏØœzááýn}Gî¦û—ìßwï~=ÓßöS ÏâlBv>_oé^8ý÷H,üß„?úRòt ùá¾þƒì±ƒÀÃJÌÏÀŽÁ§£݈sëµÿ˜nö¿n5Üö Úbœ~xù¸#ð|7÷úú¿—èˆç§ËÿžÑÏ/à"#¼HψÁ^„¡#/ÿáÑÿ/Þy†þÿá_æÄÿï¤0*þ¿xg×´éÿÆ;ê¨bEW†âÜ*t”ÌÞ^ͪº|.†]õôsaP’XüLB®üÅ‘)oD QcÒâ/¦°8Z¬d<#. j?É+P­R¹Ë8eú?_ÑÊÕþÕ•/üÄÛâxL¼Â’ùÞ‰×Ù´{Õ}“%}sbþIÿd»¼öfO¯)4‘V»»õp®\ÈKûc·¡¬÷ž[(çÏZk‡× qJN¥aˆI¨­R¼›yÆÁ\±®æ_j¦fEPü‹Ï–¡ú§ôœ‚èþ‹]/ÝÊ8D¨þgN½ó¢=“Žá2‹}Ï•¿Á½šÎ3¡!:ûuíѸrZ¿ð7›þ VÙîFWVA;™. V.U#…ï0\2Cêû¼Ú·¾Ð|øK‚Ö˾xo;ApøÖžæUÁL Í{Ðku†÷¾ßÉú‰¢‰ ÒÔ ¶†qY‘°´*•k¸MhëÖUØ¿4ì,.¡ Ç}ŠäïÕ^“™†Z«1ªêw(²³¾V¡ïªNš®:µ7ü9®Î(º[šüâ²K©@læ”®)~çøÑÀ8Ø)Ë"ðî·D²Ù^®[½›Q¾÷p×`AÀfî>Õ»ÀC'rô‡n¢ƒ¢¨ÍœdY4eYf2=”+CG‹-S5œi§i”½ÆSÑ9&ÓBœ×RL…Ûa“¾˜P‚qÛN€(µí0°©sl`ð _>Jxl°c <.6œÏç#Ëêár;âª0&-ûÖÑy3k »Ê+s†!ô¢ú~¶ÏDÓµÁdŠ¢2MÌ®xu­†ˆµã¾Õ×G|ÛéüÝôûë{ÎJdþ¶\ËåÿýödŽ×Ø·L¾.Há™l„iÊø~§p9®¥£}G{ÒºŽW7Ø—ÿºkÿKÏ+ïÑÕ’méÌ OïïѯžWDðT™g†|8ÎØ2€h-ïH Ó„G*Ë~^ZODRÈå ”[ÀzÊlÞÖ2JpŸ¾Ö$³O; îãÙàìÛz)Ç|º·«?ë7®×|Zuôi¡6ê¡ïnžÞ ´ðÞ{mM3×KîàËtíQ¼’ÚËS\—ú>£s~Pþ9T`u¹›VâÈ«G'j£ißKaÉ.F}K §©ëÆðào¢›Ây…Ë›Šä_ÓÒ²TgÂ0àilËmx'ÔªÜ8Èڬܛz‡„kZßCØš\´ë!rÓòd¶D‚­²Z~„ù”m°º}¢<ýþä›>¼¾ùv;%¹j|ºpá»^)þÀÿ`s Rëó ‚…=¯ÒöSr6mÃáhÒIãvþÑøè†ˆ}L¦ýå7BĺïáEŸŸÎ\°ŸºD»%äj°l*¯`!OãSØ&Y–£D-–ýÂ'¬ßóOC;¿§³ßU  ‰î7ÜÒNÊMY.‚ƒÜú°3+•Èh…Â}O“DS7Öøû¦¢ˆ,uK©f*UĤÓC…ï`öJƒ¥N³0Ä@Ôà‹ ©ÑJeÌTRM0ýtëZÖŸÕQêÚ…¾I…žœŸ( R>ç9£ šï¼‹}._›Ì2<²Õ\:6ÌŽí—‡tT=½xaM¥8 F‘Ì K™â áƒZ¯*y×øK ²-P¯ã3ÚâK õp¹òhŽVA,iñ›§œ×ÏðG_É«=%—Ýcv¡@òt‹³ûÿ¸éV®àºMsˆ^’O‡iÔ]IW¶Î¦Nfu‹ªÜ¸oÑøQðCÆ“@{¼ sîh¾BýOÕ¶óYl±Z/·ÀXfÊ„䔘Q晹ª¨`N_"®[^T‡ÉÛ®B¿vïÉeÖE+d´?éþÅšwúBb‘,Z}•Zmø¥ù< ‘ÉmÄàlT«¡Yc™”õ•lìŸùÅIÖƒÑÿ-_!ÿ¥?¥…ÍwÓûÙqó,v̈oìâÃËÀùÚ_«+è^&•ÍÛ#Nº8 ¡Ò=·wùhKFÒ¦I åÌdC„+™Z¼`$scÔ¥ƒ›Tå i`;ä3ܵæîe§N›ßO… “Ä’4°žÊçÅãl±e­ÙÑû´èÝì@½çÏOXó\>4#F^ÛL²ø%°[ÉX^»­eåùåu×ÙÖZFóµrµHœq»ÃAÓ$×¹gŒ¿‹Nx-.$FŸ”DF†b•w®óšA%ºöR‚+Ü˜Ž³ý9³‘/»ê½‰‚üÀ:áïÀ—¼0˜óZäo6yÙ[*Á˜òH˜£‚.>/ñÛí÷%’yÏ™6È7‡Û ÿKMìB!§Ë‰ßüefIžäøâvÔÿxƒ‹1³Ñ"ï¾(%Àk‰I–£ë¢¤Ø~Bwp0(IÓ¤dšíè¬Ïì9í\¯zÿÑ’ âE =Oa;ëp(,hÙbU7Dy!ývAÂ@pm]вðîñ‹d È4Ö¥} Nèë»ì†d»Ò1¼C‚Îçå¿,¡oï–úÐ10º0Ç£„»¶hBtŸw$wv–´‡ƒ’»Z{ìã‚_®Y"v š^YâÐwê*4‡U‡ŸII ¦;Ô.!XKæjáKó(¾óýQÖN‹ÝþŸë oíô:ÿÛ“Ëßäü~ï¦Óu¯öðæÿ:›yŠiÅ{6=Ù¹¿Y©œða?ìd³ ÁÐÏ•R‘¹¶të+;¯VÓØƒu;à‡h Úoˆs@¸ŽKMl<~¤ ÏÕ(ŽÙ0cdIêº@¢‚Z*£Ôò÷ ‡`“§×D̈=ñ2)ê¤ûá‚¿–D²Ù¼Ó˜ìþDVX*ªÝ÷å.¾t$I“Xèè›[ÙÒcwmZ¬Æ*k$ÁS;qÚ·ÀâÇ,­w³:ø¤+,Õ(LY¬ïìÊý0>Ï™ÂËìp- 9KÿSXýFƒnÂZOÈW¨î6ÈÞ¼sgú_Í©;Ý!ÔRo–ÂÞlÚNÉ:îš}øô&ì³äÖAAK2Ÿ—ZèB¾Þüa õui¦ÿ„žŽÕáì|b[#^Ò9À/†¹Fx RÕ-“_`Zþ)É|e‘’x#¶qóÜ£W$@kK¡¿(„~G‹Ù-™Ê¤ö³ßÅÈþ½?7]rèÄK~Èúð›Ce}öÃ'E% ó ´ôÿ`ï>ßáà÷~ï+ƒÁ0¢!Ñ[”ÁD7FoCô£FïA„¢Ç0zI”Ñ{Fï½Iщ‰Lîó\×Zëºï}ïcíGû8ö‘?â÷{ôú¾?öa^a:wBAÑ¡˜G ßP뤪>¢1RÉÈPi^cN5­qu‹g_ ôjòº…b*ÎÒ@iø– ™¢^¨Z;¨évGTOâp&…cDq˜¢S½Ñ  ôd#z„çîü† oĸjD¤Cð+Zw(Â?Ås©ÆièpæA#ò"­‡îgH ‡äìÎÑ3¾H`4aéØË3ƒ™!óÈRa)çº ÉQý_ïÙIW—üu\æyѬ=Kž;IS~G÷ q•Ìγы®!ša+Ø"›|®¡ÕNoÑÆÆ ¶¦k1y‚± X2¶´4vê¦ßc±º—gÙ& Ü+–l4ªƒ•93 ‹^?¿%ªnAñ ¾Ïÿ]Ÿ:š¬(B‚T¢HŽu–xóC¬’‚g=Fц—²îïèUfÉ%<åB£$v2´÷2DÎ!GÑVº¤÷¾X$Š7+Ç&ÎEû­2›É«#¥ÌÔ0ÞÎïQN)u™/•™4nöù'YBÒ 0‘Ø>z#;´ •€Omù ¦þ?É£}¾É‘ò›_núÔ¼])í)òá¦+¤ÐUI§·}zªEO¡³Ò¿ ÿšÎJV±[·…gÂ$5ä—N妷촇aº:‚}³)a_SŒ†=±Qadj·‰èÝ»¡V:$÷¾§öÊ(¼Ánù¦°iêÃiqi2é) G¬ìÝLq”ظ¹I ©J$'%™št„¯ÄÒi놖Ö,Œ%ZÔ—Ìï·¹‡[9÷"1Ïh,^½ž‹šm75¼¸ „Ò¨á’|tÇ<÷{¦O–¾lÚÄŒvœšŽ³¹)o/¬ê{–ª©vƒPÄáA¶»´ÅnC6Ól¶3EŽ<£xæÝœœÝL/’,¼LVšiÖDLÖ°=YÚÝ—%Ý_ghž8l ˜O$×-«ôµˆú†%YV[äeШý&îhïå±F¶W`òx§ý8œÔP‡™jûÒ]ôÇîK"á¼ 2aä›gŽTlª3¨,pPzO~ÐÙ•‚%ËŠ-6bý€÷8ŸK—äB§@é€x$ì@’õ.PWJ'—âòÒTž!8PÌÏOÌÑ.Æ‹1ó¡5ÿ n_ò•¿+ê‘‚qPEâ«¶%úçÁ Ï¥éyb Q²dõö± ¢™òâͳbàfÎUÑó»€||~c“”£š”?”Òú›ôºjZWF)¬öA8†{UM<¢ä“sÑ1Ñ ]«/0…ì.¨¾ †®P‹Éž½žgèdR—fç}°M-*°h=785Ô³¨iWwOÛé NéšÙW™ßïZÚ77C’YõP~@¨B&æœ)9Ò“)5_ÏXÑu ëŠ4ž8þ£´=8ÎÚ6,uß;ôîÆ]L©ðåKó¬IU``9Xx¬Óù´GBæ3”Ž“Ë‘PXíýâ«BÊØçÚ¼hÜ7)¦-’‘öªO¿ã¶¶çáM'Q÷þ_RìrÖîr¤ÜÜzP"tc_Å—/Dtenñî{…~Cð0ïKŠŸq‡*©U‰Iɘâ<ÝæÔFÕ}=·q¤*"ÞšP¸LL–r$)y{XÉYØÐ­àÝþ¡;9ýŸ—º°úoq®î: ¶®|Å$#Ûßlp6¼}i¼[…ûvh¥~Héa¿ép ûÝ=M2:…¡ÁË®8äø̽Дò"ŽRKjÅÁ1Þ>b©}ôÐþM¤òL9wCRQŒPDâîgÆ‹)}”¢‚,’ÛÆ´¢J« p)ÍŠê½âcr3¨—0¢IÎÉvµÉvÿÉÍËJ’Ҽ̅G³ H7À ïÄ—Ù¦Ì@ÂÄŒrßZÍ£v|U¤Ž;M•–·“È3•P—¯ÞNÿ6è¾–ù e{Ö#ª‚G²Ý‘ŠêÝ“=´=áñnLFRÜqbÎaJç]{m³•ÕÏ¡•'Ijâ¦È9íŸLãsyÛs¬¤óÃQÄqãùÊ ³^­P/3Ë»?¯T%¡,º zoÂ1Û´÷Ëéýxî5§]Ã(.gÜ6é8}@ôØ>nSf*V ¼áaÚÛv@mÍŠ +Ê cJûÐ-L 41–`<ˆünŽñŽäaÿêôª¹_K-Sª¤¹o!/•¼óïé}ó7.ò )¹wKH&2«8´ž©_ê%|ѸÀè¯<ÓyóäªDë¸g;0*aÉ,HÚr^™¼UÅ#(Œ@îS.dêSÇÝ!&u›MY['ë|­´¼lѯrÕÔkö¦½L7¡¨oC¾…)½˜¢ÞNXáìF®½kFT¼v>£Ñ=¯‚„7ʽûh50‹}â± Þ²Nq 0xÇXgF¿Û»÷ŠîèÝŠãpîWÓ/‡îàÙ”p‘wô£y—[öì#^ÇçšüHƒTïØCÞ…å ;=å^~FiÒYû·9±N¦0±Ñ´×&ßè‚ñп¯`ÉöŒäµxRíÓ~®iÖMh^}Á«Ž;³ e@H E4UŽµÊŸ<Ňkr©“Í%¶ÛœX°»uàG糬ÒyÕb±=„áÞÊf®bê^°ìHåÑžÃ~d¾žLëÿ¢pÔ_f¸³s·†qGCý@—L ¸û•ÒYÉâp˜4džôI &ã"ùvÁ®¡cd´…Ÿ)V¹«yÜ SâK„Õº2ž’·HM:|¥N9eIù:º!’8ñ%-f⛘æì¨úŽ{]ç:Ëi2º)ÎDcŽ^YÌdï ³ñfÖ¬Q–|¤)ЉZ‘ìzÔVüJ3´K„$ò|UÝÍ“ç€É_xÕý`¼`ÐcœVšè^g©‹nüüü¶Æ«®þöwF‚ýw¥Xò 2ÞÊsÓ 'eOˆÙ‘Jô5M^ˆl† %Ê^4nÓ=Y‰#5„1ç^³Ñ~-lkÛŘSfa%Þ*eRßJ~æöþ$RéÎ!Œ%{Û=0.Ô5Í%¶/¡JöЂKuÕ£ÔàÜ€A^8‰-ûÒ3½©°>·¶à (•„-=.‰W#@X‡ÝÅÇa žEjD1¦a­EÁ æ~YåÉë¼ñÞ¼úÞëP²kæõŽã/4²Í-›=Z›‡—¢K9’¸(‚ò“ÓɱÒÞö(úˆmo6hKãþå“LSÖõBí$NMê"Ã}œ ô0*2BÁzä†m¶ ²Û?ñÞõ™ê×…WG:Aß/Æ©- ¶½YWn:!îð9 §ˆ¢»S2&ó4n.Z_œnë*W´QË`V >mÕ_ýú&e‚ý¸ê_{ÎUâ}͆rqvøþ¶›i\Ãão§s]™0ÉFþ¬¶ê-„Ðî)¡ÀvW›W5´ÍÑfsV~)ƒçÄBòÁ6]*kÑ~ï×ÒŸ;Ÿ”i(è ¹IhHT’˜…ÝáœîêªT}BZ)ÐMŒ8“ÈHL‡÷°ýænusœo’ò/"œ‘ʵA„‡asz‚‡×yˆáؾA_æ}„ L£™šàO±«G«Åz¼q4Á§S=I¼’΂­¥§ôñœª§\äãŒ8ïñÎrí§Åš` ™½$#íÏé’>±w ä>Ö3uœŒ¹¨H\øñäø\ £íԠܬMµí%ËfîJðiÏæ|î1æåÂSÈ7M(|ž›‡©ØC sÈ›æ§à¾fÞÓÜkq Ö~“é^L*M }¦ý ¼Éxw]>aêz\3•zR, ™Ã{)„T?áB«äÎÄÄÄæ½bˆîÿVþ­¨é{³fõ÷ùžó¾Ÿ=*æ&¹Þk v2:-ÙFû$gPÅ.6œ›‰?!ÌÒ?ç9Y*·Ù½5t?DÿÝêbæÀqÿ’â6׊8>ƒˆ Ոɳ‹[»YÌ-Ÿ&˜œ<Å)è€"‡0 9<_”¸âÜ1x³ŸMYS¶³Y¢Üg)V…5è]{É\ÊYÏ7Çz¨0”n˜õ.@Û³íЉīîlkåÓk"÷ãž k±~»ŽýšÞçìñÃãÍŠ[ñ «TMõò¢º&k_uðƱðÐë;C^gˆkú'b"8éÆ/æb%-ç̵N0q¦'rD»œ5}>—Ñÿüü÷÷ÐW…ß1ø°õ»dåïβŠd]J‚•uŒ9 =WÛRœÉ¶ÔlêM’I~FQ~R{þ#¾wÁuúkøKÎ`×ÎÏI¯…Þëį^ÃÙ§hûж G æ|€†šb!´F)¡ãmGºeš'}4F í’××=±K†?à”e%¡ú*-<_&Ï–4ŒG%½àuæ¾µjã Âp0—F9\³Ö9áVçvê‹~Ì¥C/ÄÇËÔó:f‘ÌYCø‰QœuÄKõè+ALñòÖ‰¬©hMNTTBûÍu#ÌPD8»í³ô>¨ªÎWµm@î†f¤1Q‹ÌñÌN{œeÆ˜Ž +˺ãà˘Ì룔ÀÜ7è,jÙ‡NQ,ŒRÆ‹šKòÕÜÌëH5†¯V zR|Ý2…£fDÈZéÓü“ŠÆ\¿C¬iUÒS׊Ц'£³¦Åhn'ÍøÌŒÛÜ2qþNNyÃ+nYha ø¾ê0óòWβç¶"í™§†›TÊNë 𹌾í@¼u®Ã'qnƒü¨ÏöAJëÄ)ƒ¶aê9“£-;T,ât¥åÔ1K¨ÔN¸3’¢¡LÊ ®ÃiÔbʽ:¾Ó$±Ã32×UZŸª¢µ¨é Ɔk¼ëêd3M™1î€|Ý^ßõ¦´^»dºáÎ}Êfù^ô¶É`C’º˜Z=±æ4õuù —å Ùj3RÙ¨¼®ÕËf.у¸îÂSR€Ø¨56Ç#‰ù¨T+÷Z‘A–lh€}öî‰-G¢\‰Ä3ëÅP±4HÐâ+¼¾/l4\ájÎDŸïpµ—üš‘©o–b\Õmy¬o žÅÒNþ6-M¤ærmýˆ·MîˉñÌü¾±qIÉ™K†?°öÞíwVô¾nó*™Œ&¶¢n–…› ­‡Õ:.Iz]W—rî7—ƒLô¹ÚçBöpó v „ÆO¯ç<’4xÒkDØÍ²ëX <­äœ†N¾º§0×ç Ù6-D«‘ÝÕÖ"#Ij§ óòYH{÷Õœžîc[Ó“/àõ_žjøŸ¾¨k?Šýuu™«ñ‘÷€¡t^ßž¾囸fÉBð‘ ^}OôiåëÌkÏ‚ôTÀ‡ÈÕrFbVq> YBij½ßmQe^cÚaÄÞgÇUîûT¾fzð"mÊVÖWF^þ§Ò¼¹Ê/~ÝW–òÕ~em ÕGðaàæ°à§¶”_„u•Áăk Áœ3ÕyrÛ)‡žQWV[E•.Þ“}Ø=Óuz´ZyyÏÍÌÙZãépƒ a IYâ8ƒ—bw¨JjWxðÁîÌÒ8ZARÈ·Í#~¡õŽå¤^Ó)‡OÉI‰ýÜ¥H Ú¬|á¾wsÇ—: ‹kVŽ}Kó]úÙb ìYDÏ[›&wøî­úOeñÊ(Â>%ý¥ÂøýOM%=‡‡×/¦¿½ ™„³Xté†Ðwyºbìd“äÈçZ¿aÐè¾·t Y×øŠ¥)˜², &Ih4¦8ÞÉKt!¶‘X³Ð„93\à½ðURJh)UãIœ!ºèÔzW$f¸Â«Âúù;žÄA€Ã]õÇ«|n²m‡\ÃÁW â„/]"•lãŒgé0ã¥4Qa"êô h 7¢·qãW¨ˆ¥òsK´ôhk¦×† ø*3uv‰I „Dˆ|p’qN*jobtjUR4.Êâ5êÇÒ8LJÜÚoÉ1\y5¹õ¤Êc”ðÕ.–>´ï–j_ÑË"dß-Z'Ã[# ¸.Ú§Q^‡â± a$f¯%‘Ó&½©ÔFËÈ¢eQ<ÚhžZâ›t\°åî>àd=àº9À³£é¿ªáß7xΘ+8pC6œñ<üÁ¦† @Ó–WÓ^]ÓÑAóA„¦+NÓ­OÓcSÓKQÓ›Q˪åoªpÐÿ(~0 §åÔ¨å06È·4È·£Å~>Æ>„Zí¿ÿ£É>`§8àP©?਋@»¯Ø÷ ÉL ˆ ú!ºZûøg†•¦Œ”áFÊG*úF*çFª6GªOGj£µŒ£u¼£õ}#aD‘ðG$ü D‘ðG$ü D‘ðG$ü ÿÇDÂq‚w!è%˜ÿ(ÁÄ•¢y ôO{ŽŸãiWŽ©¼úþjga…ºõ’"'^[Xõê1í%|a> £}ÃY̦æ»_¯\ý*Ú{÷¬§˜mí7P0ã,ý'pP…Þ¢OÓŒÈ*òð+½·m3âðÜ>fün±dj™‹.™YPþÇ(dñ”®€§ˆ40¿™Âs€Ø¢jQ¹Êþ=2w?š5ªj> %´Ö/ѹ¬ÜÅ ôòHÕ;a?SÎR"V…­©wT9ìÐ5ûSPåNIåXþUÕùrÙx}Í‚«h[åõkWðIãDy!ù­·ÅXoñ˜=?øBÐÂÒ‰j„Ue9ŠÞ÷‹¬µ(< ¹â@—a…ýÈñ_XA‘0©‘`ªGk„~¬¥Šœ¶chÎ×ÀôRr &"û².€É å[£²ÙΚµÈHQ5½ÄÖH+ÎR샀ûs¾=Úõüzuw/Eyê¿íÔ#Ý(N¿×¡þ_d÷êG*¬ña ÒÉQwC$ÕÏ9.E‘pLŽ”¾º’ ¢um¥mþ©N©.¬ðÀPp®©AҲăwñ ˆ©Ð/Yøq;ê÷œà <øÌ›v¶–*×µ“˜·{o_åÐê·ø •&ê4Ì¡›PWÇo#à¹Ù¿"öe Èß Áç¿@ƒf{p4N¶¼¸N¶~ëżô’wáÊ2Ëá~Õ¯I悆à¦ùD4Rx÷žMQSÝ .hP9á™rPœzm{:u”bÍ œÒïWvO¿†—qïÊ3dùÁ:ÛŸô¥?`@{µÅHq”¤Ûýªz²Àß„¡°õh*iß&öÅX|}Q*wOÒOMc¯YS©ñ:¬ðŒH|û›ÍuR4µÌm!%ÎR6=JëG‹jïÖÒôQnkЕÂÀ½p²¬Â3ï.žÒ‹<Z4t lÔ ù¥'N}-ë ÜIH9¦•¿¦r¢Zë*-N~žÂK´®àí  ]ëVBƒ¾3bleNŸCoôý¿èá/û𪬸OÖ‰¢0ró¾Lš(¨×ò×,ùzHáXЉ¦»Ÿ™»wÓ'o-B\á~¯&‡j;|äKm+| ¡‘¥¢y@ â“EQÑ€F­‡³H‡³¯:S“O‡ŽqÚ ×R;sˆtkÉ) Þúqù_ÅÎH´ÏLÏĮ̀!!÷Ô<èf¸þCdSýÏ1„g®¼O‹Â/¿3¥Dz~eúmÀîø¬v<\½Ö©ð·o€6Pƒiª/ÔŒ?¦ ó$VsÆÕ oP#+ ¬<-IÃ,nž™§4ïÁJþ8@6‹qœ…£ºãDè xÓÎ!A5µec€8ކ„Üv–¸õ¦•¹pÎ%4Ge¨ %IzèT3áT÷s¨îë×{JŽ‘iÖí­ <…¼Ó4ch AY‚¿#äøóˆU òÅo© ϪÆÛßþü-Ìj©ç´¡ñ…[†ï hFˆDD)ãc~Þ[&Ô‚im{œkÓoÉ˨GÇÉyÀ¡CkS ŒØÜãÃJŠñŽêûá€÷F~w&¿ÝÛÉ}wçߨ„ #"Ì}“RÈA(êSŠÝ‡“R1hgoèØÉSã /1Ôû¿ÁÄÇØZQÈ üU* Ú¦µÔ)«Ów”7hG)ƒy§Ù02± °Â‘cÝÂå±/ëjUÒ¸¹ óàÞY¸ŽagKüÒöÊñܯ¦–G¿ÑD}üæÿ/šh\¡Ì®¾Äýšx¦_6õ«æa.|ª!æó¼ði“Kå}¥j寛ûÙàäþóŽöëý•bäÚà‡µ¡CP}–ü1»XÏØ(å·¶˜“Þ•iS+|½Z1<<ƒ@(õëªÍ_;\»ù+„`3Ý1,ÐH¸®‘eºk\¬Ÿ ‹¼ø‚4ÈevÙʉmÐ×@yäʌˊF…i(ËéTä¢:‰{Q&Öz½ïîÔ†z£G†¶}_Ár•Ù6®œ¡x5PŸuû†rÈAçá •¹{žîÔÄ4aãÕíw²Î­$e‡¥S¢Ö­þBØèʼn4ý¡)•¿7=Ô/ï,ÁÉij¥0µ´‹m9cjô9ã¿3!+ÚÝôX*ŠÃjVä¬Ûm%¨îŠÙÀ“ã/µÞ3Úe™‹³UEPÞk”í^øÐ7ÓL-…øÄg•–T¥ÛÑwq!8¹^e/— wÙeTÐÏQ%OR°Q%‰Gkòm6g‰¸Æ½ngÎíü.»¾K=ݘT&"«DÁI«êuTÈ9:*jÊ—ìPªÂ"b½4 ? }ºšcJ_iCÄU¿ï¸]Qf¹¼ÇSW‚½zâ‰AÞ†±ÏËa."é;SU ÎH®Nˆ%ã­Sƒ]•[‚\¡±+ˆå ,vWÜT­ÎhI¤¤Üänñžñë•f‰mLæ«(å–IÖµŒo‘~(eÝ®ü2¡Èú0 ¦œ05T¥Q‚L—ÜN§µË2N•5EûSôŠDÇ ßÄcLQk)XNyt­â™{Ód,òLoŠql³ÙÊ«KéÜgÚ—"[> a£ŸY“ØßLÁ¯ÍMjž¯ÄÆrí´;Û ¸£;—Sk€ ±a2÷uŸVáîM8»â¯T±->÷ühð6kéa:eàGý²w±G¼ïŸœ¥NÚçN1eˆ¢2!,°Œ_™@ll_Y^ÝâûÚðºB„ ý­3þörKB@—ñÝ5šÑXJybë²ß"á%#±Y•Õ4}þŒ±ÛuùZ‡Ÿ8¡?Á‚’]Šba!ËØ£eãþÈi¡m¸)ÇÎç#$Ó»×ÛÆWõ° zŸíF£ {Ð`ZÍÁe¥«ñ¢çåáh¦½¦öp`#E7»Êˆrúºo ‡´TþØOgO/ëÎb÷¼m×íQE ü0¼¸ÒËpås v20¢R›ÜÊVɧA%’AÎLÂ-âÄŸ_åGó^çÞX{Ø“’[Z,,ÛÙ,J­¹E€n ”¼PÈÉ*Ùÿ¾“ý|*èœ!zÿ;™ÓòÆý+„ X`lÈ–ÚË‹Í^˜pK"Ïgûœ0Oåv(øiàômëå®^Ar gµð‡â¶ ˜¨ánŸ3ÕF¬Zà<”•ôÑ»rý¬°‰O½é‹ Ý×~[˜Ê•ÈR£vum%øw<?×ÛZƒ#ÀNÇ,ÿ*•]怒°»ìgð´jú­ ”Z¥îJ lŸOŒ~ˆãö—šÎóþX‹ÍkáKt9Ÿµl݇YnúªIíAøï‚õé¸.¢!Ü™H-á0g/ŽÇó\cÜWè¬ì âŒÂ@Ún=¤6]Dã|­7ŠrE}®Nwuö™ºÛ™€$a€KÞ?Ì×S[>ËÏ­Õ3ÀAùˆÑ[im›ä *(£È4·ž%¹gü+uNÿVÞû¾°8‡”gw— #”/Ö?޵U¦Ø¦8閶ޏµg?¦êqû>ž¼fœÃOg$ÈÔ6åÅ:”51óà)KêXHw<æLN¯ÛÔ°¯yÈÍí0ÄÝnÜÍ-‚ÐPËë§–6è8 ó³HÚБ0rGÎå*ÔS¿)1`v%¿I¥1ÊLá£Üõ§R5ÆVS n¹X»š ÏÅ(°NéOߪ)>ô÷‡½v6|b‘`W_‘+çH4ÿ›’Š¥×9ìÛ»ssßn 繬ŸMúæ£.äNÍc»·«ÈW¢+?‹Ì@ì\4üÔ_o£g©m _ë¶É Ô½xÕÆN.d¶¦3ñ=9Ipφ”*ž*–3/mÇæ}Àícü*uÕÑ;]J{hJýjsΈ840lº–¯ wæ¼û9‘ú#pñPå¼NBr‡›ü›#þ‰ír뤛Ÿx[6ës:Ù·$d ÆHlñ´@ip¦ºP²MÎ/ŸTkúD»_°{޽Ÿ¥éÝ“·ü#©ÐúÁüÅJX¸¾Néo°Ñ)›{‰1st/»!¶Û«¢„ÃÎo_ ãØÈ±Àó4õ^g˜0@æa8âŠ'©F£ËÏ~6œÝãÈE³<[$3„Ñ4ØŠ§êç9¥”¢ÛÕL‹Þ ›åãë{¿Lƒ²ü;‹Üè …’îÛÜœ2ë|ÃgË:£d±+×ÚÏWGcAùTüÓÏkt²±N:ž»é¯I£Ü²E'^dØPÍ{)u tiúnöʼnÜÔPÚ~óaƒ7à P×?_§Pt4lâ»Éhý"'» j÷ùy²„ì¯ìƒªº™ó87·ùð õèxó‚Ž»Á”Ôñ6,ÉþÞ~›*q¶Œ—·,¨%\Љ`2…ï •»D†7®_k˜&Ý»RÛY–J9‡žÀ¸’9úDcñëG~bnî}O͘MX>¶ýå³îåO7ð¾ï³Ûä‚NÉï¯ï¾8Ú?Z|XcÈ øÅ­èùã\´a©’Š:à¨÷6ÉÕ ²î'üƒH6"†PWã©·{ gj›F‘]”Ç>7C˜Þ;ÆØŸ„‡êR袙Rf*)¶ùIjóËæÍàø×ŸM Ÿ¾ÁøºÄ¯%ÙÅR.TQ^hãúhßµ Ãâ‹VW^ã¹è£oiÐjp‚,÷o| â®§“=2¥’ÒMt§êÛÉ^·ä x,ɨÓ¯‚Øå¼•¤Hý¥Pˆ—®…ûÃVàqâ1ù4sô*œÝþÜŒDrÖí\_l»Ÿ˱t/‰™2J ÝØ–î€ánŽÆŒë8p>±*ø@RÚ| ¡j_QÈ`ݽ+Oéß[~…›†èÆëàFIù8UÛ”ƒÑ¸[$Ýê6†?ÖZ’KßÊÖrNÑ ©ÔD­ ztP¢*n†áâî° ™ Ik8B‡%m›åŠ3}HÂí¿'Jò0/n`…,qU—Úeç/úÛùý$R„X“Þ ãµ¥€4{±\tÍd hÞ=ºgøœÔŽÄ4@²Ûˆ`ææ•¸Rå>\Ån=—:ÂÊ¢ƒôÒ‚L!H8Wë=‚ÓMUL-óש`®t`¨Â«WÁ5›Ãµà¤c–!ùŸ oÄä_ˆcø/Ä1‚žžS×ýKqôý»âÔÿ[qÌŒuŒM©óhë/+"–y'úáŒÑc#ŽquD¿b01ŒCŒö!Æ7Sýi^ýYuýùÄ‚¿þRŠþr£þ*bìíÁø!À`ŒÑ`Dd‚Ov‚OÛ€Ýbb+dbGq¬Ïzl dl(gldpt06é8F gLJy'e “«ñão*ÇWÆÆ{æ¦$2ÃhϦÀdÓtLÓWø¦éoM3hL3šM39N3?œ¾9ÍÂ7ýqüAÇÄñqüAÇÄñqüAÇÄñoVbN®æß4Ç"œÒ…ñzTÁ‰×¶B{Š/ÙÎÝß“M[ÊñZ'ï-Åñt´'µàyà3<í Mn+_~É þPKmÎ\â.ey}×óZ,˜÷¨Èäô|f÷Fž[Šÿ €H™YVŠ^Q¸Ÿ'šÕ/ý‘ñ÷ö¡‘6›}ò}2šYÓÀ[9RtÁ¦÷×öa÷pl‡«ãƒBf„R~0ž‚ˆ¿‹¨)ÿ€¯N–§Eø£æ¥ åK4_åËs˜ª‰Êß «sÑÕyÕêdbCóÑÆšf¹š±ØÐI¶ªE\Í|ìoúñ&+wÕ•¢Ïµ’÷Ú•¤ÿÔ„rŽ¿4ÇÔ¿iŽgNäÎú¤d_¡Ã9ËNÂ@ïשÏ!ex:‹βË5j "ÐgÅ KÚ€„”g“’@ʶ T¦yÀf ¾•†¢By–åkC0¶´â`¯~)ªg%È+C2ïâ¶àÛSZ/’]G?ÛÄÃÐðM»AÚMôônýóÿ¤D!ïvþ¯ÅGð{CéðAâHÙ>l>K K ªÝö¥IW„µJ‘é{î·@Ê éÚÊSä8+J¤žÙÎMx£Æ8ÛVÜ®ímç÷Žyá`×|HbÞêïŠÊT0ΩH|¹/kÎü<ñZ׿|Ç­†¿}Ǫ‚xóÿ²J¡FD=7€!)°±àmzÏSh°mÔç£íɺ4z¤b?÷Û<³=‘˜¦är – ~ eB j.hê³wOùúþ|ØÕø ¼6‚ãGÅWj1'&øD@àVW„)D¤àiF&ÍÙeúo”#óà ‚uC¹sÄp‰;”^ê± È›o1‘Õ¶‹þ]™ø›rô§¦Q¤bÛÀEûûœh #íý)²íã~V†1Òf‡ƒ-ã£.Ö R·J9iE¸ÖÍ2ö~Öƒ;¾ƒ¨ÌÁÔ)Ê— ƒbèþô›NÖýAC²û²Ij¿Çb‹™õߎ£í·ãðû‡ã°m;f»»7PñBEÄk&µÿV¨`ÃÛ'¾N¶g ʶ‰¼J¾(w‡”´‹.˜ aGÀµ4C#"O7ÛÕðÑøLHè/Çñ¥Êq’r§HÒ ÞÑ•õQ¥¦#©1}ëßlÄRßÌÞõ´X“jqØ+­›š×•á mÐ7ø§Ø üM6äÄЪÖm„ñÒwø”‰²\¶áCû½š,UrñpÒ`„Ô -ÓÚ‰—éÔñcÕÛx*Á'¢ž—üíœ`¿v=ˆ¾œ£ú¬0rVë‘+À\17ê·Ôè–ÙŸž&ù-5xï©yÀ§™îÕÿ-5¸hþ›ÔP ù«AÿW¶bn¯”•ç¯lE/ æ.å¤|Ž.Þ2UÛ·oèJá]l98x¼õ£ko˜høZí%œ2ê§™BÙ ]–‹R"&7{ïM8@ò~–•¿¨×Ï~fQFaùI•ÄS%@øOqwÀ¢Ç_2C`A€p ð?¡ ÕÓ …'·a‡Éã……$ˆÚ"·‰>Ñ)%ŧ¼„5û%»‰¥\÷•Ãæi‰×pší©ÆBKZD˜V¹GùëÚ þÒwüøwfï’‰Ìú Û&9Þ>…¾Ï5Þ™y¿üóQáÒ¯ «±·«ÿêWõ¦F#×~÷+8þ­_Íû¯ÅöÀ?{S”Gˆ¦×†ðß(G;r¹îADé `+u£C¾üvêÆÄÀ<òcF‡) Y=Tål¡kÛV»I_¬ª#*Ô¾Nå !F»AàäÙ€ÂÞߟs±ítVð¤hŒ_çÍ»,~?ßû”‘bà"8øèVÛ髎‘‹N…­°d†Ùs…Ùݯü.Ô¦ËxC×»M.$=ÉKÉ“³@RµYÉ’ÑZ bi¹&c +Vûòhƶ÷wÏâïœEu§~B'vÊ[½Ÿv¤q$rß{'Ú³òÝib¶ùÛÆµÚú]sí˽=i/S ĬóÑ¡ŽªºeâGȇ“I^:Òz³z€™!ˆüÝxs­Ú‡ëóð†¦t¿'øˆ¬ì¨°¶§m]×ß%ˇ”íâ/6kLÎ;£æ;Ÿ~¤ˆ”­ˆL<¨ä¡G+¦G¿H?ï©<:_dÝèžPÌ™q€®õ§3Î<·M9Þo ã'„ž| /m›o¿–N![Nï¾È|ÿ«t‘YY’¾ÁZh-Bø«tÁ°fÛþ”á™ç—\´`ÚN*8—"’‰«®œ,cc³ Ë5i€tµD‰¥OŸ>>o–/Ò,¯bâ犻±lM͉—!¯/ÝÕ<~“ ¾Ä¼šÀ¾Oú¸_ŠÁä£]ðŠD•ô·ë‡/¼2¹ÆO}wÕ?õ“›>W—³ ºâœÌ!ìqИo7w"¢mH,%„á@¨›»µûõ’XTL©"Ž9±ÜP3[ú¾÷ºi¢w˜qK’SêCc6¢&s$âþÓ3|íª–Q^ûÆ»³éØ·2æ`÷ÇÏo¨ñ»«Íðê&’€™‹¢1TˆXݘS½)ääK•(u9U§ü§vï‘=‘474s,>Û $p(?c¿{â0’J)“ùÆ#/Ž1BºÊÍáÍYÊœ+¥gâ7À3kଠ™ n›XäJ±#ý†mQ¸[¯äg•©mÎ^¡‹è¯nïÇÊüvX¡,Ó8½—¯³†…Ó¾ÝϾåù–¼ê’Àa.Ë´®¤,`óbFîTwFÃü•XÃÄÁ¹Hã»)š[ó~4Í_–³t”ºE kU©Åû j4çÕzÏ%i½ ý‘pk&J ^´°ªÇð¿ñŽ”ö•öÞ¼ETpeQøsŸx/×?‰y ì¸÷IDÒˆ÷CMôeª¦Do3㸴­â Xm²ë¸žÚÙqC@$ösB|¼·Ð¥@;Qå† Ú£Ò©ý<.å›=ÜÖOÌt Î¥C°W5éÆÒ˹ç†Z?çMm~™6ݸ÷P(ÇÅÍcsÁÚçgå|s(M³•]‚Æ×­Ì‡Ì¼tE©)‚®*L©¦潞Dš- q/®6¬5ÚFÝx&«¦AÎ!8qK# 'ëÜ‚mŒ—.*†XAP…(–û§©TŒÝ$Òo9-Z°s\hÁºhÃÓd‡ŒaÓm=_سÂ4¾bÊBè¹’¥ÃÓÓ2vdé5*^¬‘˜ªcZkð÷¼ŒÌÂLÎl“‘Ç„ƒŽn.ÇVËÄÈÊïv¦]XÄè¶m.H/ÌDÿ"Wôî¾4upv~}óâð<þ³?â¸tõÝ…®(†O9³ñŒÏ'~ç!<ŽƒxÃúaOŒ.¼ hV¶£^öÐEÄ:¯÷󋎹þHQ‘¡CLwø³¶-ÉÒ2¯“*Qµº3úZ÷Î&-JzÙm',ÂÊïqøÔh?B±|úùyh»§òd]ê}Žm÷û(åPšð¢fØC ªƒ‰…$iÄò¾rÔäžúœ& 07ù§ˆ@±‚€™g›õ}o†(`΀poò,VÇciÀ®úÓÐY‰ šþP1}í×Å®8 ìUùuâ§öðQ&Gm*‡J´Pɉp²EûΕ×ÔJ=ä`UÕ½pèA'ôQø bšÒëҨ⺾[_srå>E¬Ón®ÖM³¾¼ *¥“2Ôx³ K\¦ËDuŸ—L½4 ß‘¿‡°Ö%WŽ@s¬=âî  ›‡§ò­îbÈS¥ê2Ë鹿KÓã—º)?Š|D¨_>¼‰á=×V!ÉÖ:âÊð³ˆzîV÷e oÜõ,hÆôÔ-Ûùqo\­*^/6ó7?É:Tw ¶‚lš7vð 9ˆ'cÖœšoc³õDÞýø¼¹qBãP熂ͅñÎCA]W‘2E›Tc¡62ã$–ž‰1?3Ø=g7:‹Å› ØS¥V.ˆ+èZÙæ«$…ä¡¶ ¸¿5i‡ºÔÚüÔ§S%Òt³Âh"Ig'¾t£&éVÎÁ½Ñ•ò¶â¶½ìžQÝ=Mtq‘}?5&ïÔó(05ðÉ`ÇqL•âßGî8!ÒXNKq°™’ã‚H›Tõ‡AB†·ž QÒœW¸pŸ# ‹"Æ_cIÜBò&•j4_ù5ŵ…Ì3=ˇeg¬´ÐRe/Ý<~j2<Ø{“¨ÞÑp¬¹¡„ÅM’?œL#û)8&'eÇ\V0rM«"s\»R2ÍQiÿ©ƒ¡õAÆ€ƒ=‘Äù˜^½ÒdÆ|Î N•@F@8‘¾nMÅ"HØæªc"#«*“¤ãíWµoæÔzw8”,vUŸªëp8Úo W¿#ÉVº‚,ûiŽb=Z\VLß½*£;²zú|UCâ‘ñô8ÒvƒLöð(aíõÁã®…ÆÙ'7U&Ôõ³/ÄR'…‰9Ì~z€.Øëé™h¬g_[ÑK¸Ž%ÔPöë,&_ï>”Rs–Ôßô© ·¶`HÞØÝŠPÐøoš+ÝZUþ0>~ˆñ{sÜ!züb@Kñ4«óÍ"×§Ñ!¬Ø+Ο¸]tÛ¨DïRüâÏ:~8n¯(1å  $þd ¯à_¹âÒ¡³¾ê©@â3@ ‡àr•º$m0u?3­ìøâôɯˆÓŠHü¼)ŸpúlòãÓ{ò`ÝÄÄ÷7U”nš·ûš½’U~5–Z2´iô&·s¹ìöu)g­¶•·ßùˆ³)ï k€"ó¹Rk­nVÁ9˜?Tùdæ`ìE‘I±®‹¶•<ïtålÙ¨6·Î{î¼úÐi-K`š•þÑôÕ1ÔqpÒg½hló¥Dîéè­‡qÌoÖOßé¾IußOÛqCïöv!{aGS°_û°ñóNâÍx’¹$ÒÆ—Â--Ûö*ßY9iˆ8²ô²ß½‰ãxœ´Ü®ÜJ„?Ží+¬[©[f(It0F» ûDÍXºú‡ß)ׄZïw³l&ÔÀ ùlN³ 8ã]иëìø8çf—5'O0Ï•„vV=|Üãë‚ûÁMÌ¢#Òp§»çÚ¨r_•xŸî†ƒ'{™¤u7³z^‚ƒ):\¡Àþ=ǵ-¡VPƒ|ášÝ Ðj¨Àš§?Ú]`•Çå èç{!/ò-øšÙ‡ÆÅ0Þù•ZÍœ$-‘\›ïrº›8½ýxƒ>\<‘F%ƒBXƒ½Þ•«bêZ½yÄ5w uíÆ~Ó&ë±¾{¼°ÖŒl€¦ø•iÙ>uÆÁ¨ÇWRŒølˆî'©ÙÒ€IS„㓜õ¨Ñ€AÚóœÄQ>£I$1 ‚\ããÕë,¨JbQCÎ-oúN9­o’‡cE¡¾ƒo3êAZ'nÉl4âkƒ÷2å8p”ü½Ñá"ѨáXí¡ m¿Sú¨í€z7¿ÄÎÚ¡süãôPˆHÛ“Í€nÔÂ+ u«þâ%ñŠêt=¯^Ù_º¢àßu……Þߺ¢¶r¤–1>A»ì_°‚}¤@qg=R2Rz 766Reª;@ײ–ÆeèÆÛÜG_ŶVŽæ5N<Ë ;˜›8Üœ8:ø˜yj:yæ0ù0ù‡WüáxÅ^ñ‡WüáxÅ^ñ‡WüáxÅ^ñ ¯ £ÁÓœ¬=÷ÀY~¿·7†¿aÅ©!í¶Þ¨8€,ùÞX£&Чib¾P½7ü]ÇX…ï Û"à`ÂuøTbë/m±þ{š#ÇL|!ÇT„@«¶ÛQî!{ÿ¶æ±ü{ý3Pä}^”)\Ü7[攕gbYÔ÷Ÿ”26D²ÛÊ*Ë# ´ï÷Š?„i*šPnZVÀ<‡PWÁ)GØï×À×*§‚ôø,–êË~™ˆ.eå®\ ÿA3X«%L•rÿ¢¤›Úk(ëmø;ÿÊá=²ÑØÐ aøù*²X-âÒŠªÉÊþ¶ú+>„ÿßuÕò» ÜàUNP3QõK€äÊZñ%`º\+^<Ŧ7jÁxC@gس&7 †€¡ ÀÐx^Ð(6PòÀXΆ%Á*iI¢àD…•å åÿ¦6z댳­Z"U}y s›Dâ%¸VšP ÞÙš¾n§Ãõ)ÿt3-œ³5R·Œõu ÿÊgše ?¸ßñ¢j¦çi&àÁkŠãâE ü*ç¸&Oóó$Eåi vŸ+žBšÍhé˜tß×·ì«noÊï§—²=ãRܤÍ5%ç7H[~2²#IÒwtøÉLÙ£%ü;yÙ°ÂöŒ¹8Ñ­ç£t¢s.b{’ÁÑ&ò£0s¹iÉ’/vVޱð V±9ÔK :*ÓÚ6i8‹4uÚ/žÆcg‹Û 5ÙðT5 ¬+ζ¿9é>€£‰~5ìÝ^–T õ¬7íY-8.ˆvŠÈ ªÖK—†ÝµÛs„ÖñËÿÓÞ}5¹.üþ§HBHèR¥N€ÐCoBY4‘ÞEAT½)EªÐ{ï%ôÞA)º€€ˆØããZ{ïgíó<ÿ9ç¼<ãÛûõuÍ\÷Ìg¾?ðœ4n¹oô†‹;}‹¿ûÕP¥æfšbdƒ~¿sìOvB™pщ ›C8÷IÝnÿ¿à»]ö§¿‚ø9–ôʨx'*µý¢nDÿ»¢­Pñí£"iú°w0T™µ#‘„2ÞæI >]…µs;û¡‡$³$oCª|¯UyŸBñï2(0z6Z£S¶_Tr>2bãôçȈ'Úc\dÔEctë3ú‡¤q(”Ú>8ûk-„áûùZˆÊ¬…ÀËÎ- Š9]1e¯(nšòŽ:ÐûLÔŽ¬çÌEN21õi£q 4ûNãy4üÆ£70QÈ!S®¯³‡ƒ”‡Š•¯6kh,ŠëÙÓªÞ}EIÐü»F”Tß½ÿóÖ_¦ChˆèñÉT>ÁBÃqzå¥)èÇÄ+ꓯ êæþfàÜôþÚIë•¿vá㈗›¤`?À» &Œ½+R%Áí|.:å;®Î[ý„á“Jâ—KTôçgR|¨=oèŠ!¼…a³½€Å£¢QœB•r“äið'“Ä´…ƒ|²ã…ó’-NµK·$Õ^=GšÎûð]Ⱦè)œSšøKgàþÞÑH þKg\ÿ!Jß¡dü£(Ռ⸢á¸~HTgêØº^‡a`kGà<ÚêAÄóìkÿ¸)õ…œmaÄë}»Òàiô+÷‚Ýu Õ¤"Jæõ΢–TÍ…¾Z>(:%ˆ¯ø7V0L:ÜsmçÌPvk€§yåÀ÷Ê>" Ò²ü³W+«siàÿws¯½‡6§Ÿ›$é"¦.Ý›2ãaÌAÏÌ=“Vûü«ßNS•Außivè×FM½ÙÕ>Se1$Žt×lZØC™_¾?æ•%wé²¢0 (Ž“ˆZÏ3Ч&r¯ƒ.J2Ý?¯iPx­þnMŽÿnþ¸¡Úu™HÞÐf§h^¯ ––y»A¯*•c@­·Ú½‚¡H Æ ÀNŸ¦jÊ%p\Íò΀O×uä~ÑY}ñˆf±½4šasø¨hØüC/ßpO¼¾ô_s$Tõ7«PÌøm¨”×ë݈-ÍÜÏf·~•5fÐÛ¢ÿkY h¿¹6ûÏ98±ˆðDÕ“»Ç!Ž¥®ÖGìxAâ’¬ Gm“«}P"‚æ…_/±ú&µÁB•ùâkÊiv 3ç:½úÎf— %3'Ô6ÖøAutÜPj•û+´‘nnñž*äÁŠÙåÙC¢郃·£Vî_}u(j[³?nû‹vl¯>רWÇ5-­«ÞÎXÞ>”0(›v1:ÔÍÞËeêÛù¦2Û¡ÔÞ„Ðë¦!ÁÍÆ`MÓ)cŽ=Ç¡ªO )²J*þ¡3cr´œtï`Rc `cžhÌ6ý¼Æ ñf?!ú1F®”õ¨· +¦~¤ú\]ðåOF"Îòñ|¬DÞ:›2J-ù×XIŠ×Ï’•k¦#Ø©5“NF—/p Ð@Í)åÚ³ü Ù˜ ÃlÜptzòìÛ´;ÕúAÑ÷.Õ{ŒüÔ Óð†Øž6?#†ÒHbÀ܇°Ì—§m"¹ŽwäßFàßH¾}OŸ²Ë享‰WçUÙNøgSc88øÖSÉÑÈí55HH‹hXè¯GO0k½fP{©‡ö½¾h¬™IALìÆ¾Y©Z’»Ràä7ê ‚´LJø=ÉŠ àqZ_lf²Õ›cî·ëØâißî)\j]2iŸ-kHz]ÐŒ'÷‚4åˆëÍ­¡OT_©Š^ºgò[Irn¦Œ·³9kJÜè#»†eV«Ov‘ŸgD Ë£ÿàgÍ®¶×v·säöM.©–™{—RGh£E g=ŠK9%l 5ܪ7Öû‹lãúû*÷¿NòÌéÀ1Lñ='3öfíX>FK˜Mvà»6®¾·ì€+=€rꬩDóßÍk~ÄY/«noJ*­»¤æÏ”> ¾¹ÎDÉUÕ‚ÂÀK㪲ÊÇ¥ötF¤&•ÉÅ×uDÞ7Ì[|ì–ݬQ‡]HöZš”jä;”ñ d„N!¿y{@J®ôÂ>½UÂ%% ê½îH`DAŨ^ €CL%ý|úµ*6°•äyi£ÿ¡^‹pJ?ýššd“µèî@–SA-½5£ÃÍ¡‹õaöhbÝpû‘‰Øvˆ_`qÅñ¨h3²FŸb×dZ…É Ð§‰Ì©d÷?‹ÑæÚhˆÓhn6˜]¡Hë“5K)Y‰$R ÌîA&]¦õè•,Bf´hæMdøËÏH™"Ê[,_ÌyiÉÿÖ‰,Ahˆuáiˆã3Ó€÷ó.˜k{~Z°ô´×æqöت-ËtÀ^ý#¬½8ê%úyÑ©Ôòó ó³ÄÀe·jNë¶&±Rëh³ /0:ÿº¤HÓEárS<‘L·~þbI .H »»9Z÷è´ 6 opà?åùÜ”òe²ç-mg]µ±’HÑ5¸™ˆ½˜å|ÍU>øF¡ÿqêQ.¥•S²žsù^X•xûV“Ýç`çŽ~•0Ç 7;|»G˜ƒ¬ò}†”ó×o<óíák×1Ⱥф.G³d½Êl;Ζè1K1•rGÉ€#‘º~³¨9î!]¿ÎÑòN‹Ù=³_C)<ÃR9Ù!³ñÎOZæ"þuáw8«ÅLc–K[®‹TE(ÂnûåÆRÁù62w:‚¦óšõOq~þ|™eœi»¼wûÕ7ÎWD~Z n` ‰u¦a8ƒæÉÎM¤]˜fˆf*wèڽ˴ØUòt…“ïÃ8­p€Ú%gÓ$Tf„mݵ;Æ«ñ7Q@/glX .›ÚCÇ~‘ã"P—W¾n â·–úú…vÝ(Gc;š}­Ñ4!v€Hnð5Ÿ´ÉB‹–,=%viv uÍ¢ˆgu€šö%/K\MÙ!ãš%HxƲŽï  Ç#ea4Žád*ˆ§wz¡úœL…™Õ%å–ÇZº0C·Ü:ßC€¯áö~Œv:áæ#$~”K„A‡ûùwT‡1ï…%æÝ Q½”Í ç'Uúë… YÈlþ5â"†M½m£/ôiX;úë U¨Y,÷u+lϲÄýE? …ž´ˆq}¼û íŠYáÃ;u@8VÉè¸J[˜çzÕ43ðÙÁ Rm‡uŒX T«.<®Ë~ ÈmÉðŒ7,/GUþ’þl«aeƒ©Ø{ˆ†r3r*¸®DdâZ²Ê·ÝÎдRndklÀdÚ³¨2;-hÀ¬hMçÓ瞬îL†ºÎC—n¹m|”0ºHÆõªI>ÂsÅT•[¼5-@òÈ<ŽP¡IFy¹ùR@µrí«k„ê°qúµ&x~­Šv¥† uÝü ®‰I+Ó+Ù#&娤)Xý`ºzS&«úšS.9¯ˆµLŒ…æa¡‰'¿•57ËUkISø­[3¦2ô .†i¢…Ï8r›Í¦§›âo.³™gB›ÖÊëÛæùdÃu–¾Ú·à©Ç ½dof*¯Š¼Ky†Ža±ãW3ÿ^›·Ê}©m[ϱæý¼+ÐÜ'Å3Ó¥\5/mJ£í©wtqÖ›2')=6q ±¤Q  ¥Õ!y¶>ç¼ÖU¾ ¦˜[ŽJ+~_šÀmÔÆýîÑȌ窨ñÆÃYD$¿¡`ÅdlAW!M²úì¬Y帥 ÉÆ›d¾1Z]ÖJ3¿áYÍŽ£…w61ÌDŠÈžÏA>bÒkÊæ_½OùT£´ÖÒî°ô¿g÷½%Ëô´ÆJ¤*/>œdƒw8Cï0ŠŸ_]@->UŠrÒ-ûêYqæ´MÖ—ºh^šˆ²ÏÛã6°…,Äx|(1œ^çÈ5åÄ^÷¡WÚýFÒr½‡ZÃ#…éÕÖ#! v¦M9‹cTÂ5&Sd´-ע`3„¿­ï>7ªyûe“«U+`7™ríù‹ëc÷Éé4^íÖ‹ÌrÀÝÑOš5,iÖÚËõ†[µ[-¿äµÐhx³s¬mtÍô†±¸6ŸÜYcx6.u\”ò‚yï<ÕÒô±Ú½ ×]ºøÁ„©Í{½Mo ŸLÃö+6²¨1=?¦K|·¡Äf·ìtØõ¨@ÇéDÄx’Uã¸è[5”<]ê0LÊùªç¾YÛšùš»¹äžé%è§Š×âÂN—·97ƒ'F¨;oì+ÿÜ™ú¹ hdè< th㗘׻Ãdå&ÿc4\)¡ÀSæõS3ªhg:~Mbù{dzÜ×w{SÔ ´î¼m ÖxK•^pK·u52hyïãµÝ3”JwW9O­¥ªàåø:¾©Ò.¿×í¼©–šÃ>·Þ;|×ñ]_fàK/îmæÏöõG¿1Y¨•ƒ>“/H™.ƈïjy­Ø€§ƒ"Úyõ2l ,ÓhÛí2¶xìçüšÀöœPPn&5ý;.¬»=©û)¾;¥æÊÙ#ʤ’è_‚-“ÚP“@ä„‹¦¨\{T¡/!g‰š6äJVL÷¤BEá»>û»š>³Œ…¡ª¶'/[”ÔœÌB¶’R,ŽeþñA냭 (iÖWêÉm¨jôЋH—¼›\¿£ŸcßÔ?¦4£_œ¥¿%K@ŠVñIúH¢û9ô‰®ß€ƒcÌÆc¬±ãÍh¬<µûìèÊ£ˆ<–ŸFO I GÖ`‘1Xäpx .EÊ“±×©ÊcW&‘:ä:‚†ìòd:¸I¹ÕÉ´¡”}u‚Ë+Wƒå·Ä Ö~è'åˆ!!n;nL(“*½Ržú¾9Á¨Cº~Æ Æå3ùjâ drMtr=¹å1ù6gr·bòÝøäÁ¾áÆÙäÇÔ±òÔ‰Ñ룯Óßl&O• ÏlÈ~ØûI0¤ü˜W›o†k|††§!˜Ç“«9ÓH‚ár’ú^8ä†Ñ1ÒèÄÌèsÿ„À§Ç ÐYÁ4®Y¡ÂYáÆY‘YÑ…Y±­YñO³s¦9Iþ9àoò[„ü!¿EÈoò[„ü!¿EÈoò[„ü!¿EÈÿ"äWpCxó\„Dܸá½ó.t+^ñ+Þƒ93‚Ë`Ç´ÐöUybúŽèü*ì½yà óoû5“’_ÄF lÂAÖ0ÿø¢cñËìà ã.i˜ÂíÿLuÜk+L\,Dk•¤.ç8 ›VQ•~’*4Ï*ÿ?Èk|+©Õ£ð¿&s7¸xx¡2ð´|u¶äc‚Õ¤xª¢©/^U^‘¯\¸º›UIÂúwêÑ_ÞµGAˆ»ßw­â…SÕȯªÆÄrÕsly[-ïÿ(=fʬž¯S¼5²Š­€‰RôsuæNF+Ábv0ü—ý ²Å,Ö Âj‰W„ƒš¿ZÔŠPøtD3Zö®ó1­; ¯{) Ò‡T'ÕŸóxÍ©  ai}29÷@Û‚úªÛµ¬wkè¥8•L¹ÞÉ»"ëž«=£·n¦‘&|ñ÷®ö gH™þ yø»Ä3WÜdýN‹ÜÅ–O‹þâ%Z²šG¤‹CÜ©ºŽŠöìR¼û!D ì,M%Q/»BŸí•èNån…*\ÖlM+UmÍ*φ”ˆç-¼£o»ï^å%ÒRñË‚X0? Tú5‘Bü³¡Añ×FJŽâ64*EZúTWʬ¦ýüÚ£ßo’ßeê[¶zµ‰÷ví,H5€Þq0Raw¶‚Ò¡€W{_ëÒöïZÅš¾³¾Üp«©®J¸õ§áø|Wç[{·dƒþO¥ÒevÔdrõ¸ÚGØXQ£EKÊ¢:eÿ[Ã1„óŸ±64²ÁW§fël}î¿•*þ‹^ȪÊû.H?×:‹‡mQR>&Àˆ$;f…ƒwEÀ’~·]reï?²ë5ñÙʦÑâOÓˆ@3͸Saf_ÿv³ÃvŠÏ*Ý/iÖ¡h÷ESÜíKÿå6¾ž» ¾ÿpÒ¥64üË,î#‹üîÿ”)~ßï(4äñi£­ý¶„9÷˜^#uÁÝÁáUØWðƒŽNuÅ?Že…‡®RÄÐf7BÇÎÓ}òÙh$e¡n|ØX}2º2o@{wdîßS'¿–N.ümé$Qã'’)³H²\ïÉ]~¤8Åó¸^E^AÒ@ÄA2å¡DZèÙ¾f•µ:$î™ bÚ“€¨úN WŠÙÿ™Ú ¹w^Ìðà›Á.â¾ ë¾qˆ}½ Øžâý1y$ú×°IòßAÆéÝ¿@$WqÆcšˆxD¯Ef9¨Öõ¤ºêŸ¥ã‡Xm£q@Rk`D Ä$WåÑ©‹…ĵ ;¶2¡\ëa½V†ç#Ñ'ó?C:Ïo2ô£§çù¾Ï‡³—¡ÍÔ1 w ×çÛþ]°ß» ù/t±§ #W°´Ö·Kš}ìHÆf7†æa4•-œÛ½…—œÔÝnƒÑ´$- @ˆ8QIêþ"®ØØº @gáC‘ÖOìöœø+eEᣕO½m–å>ÿ—[ÎËB‘⓾* Ë·?…¼YXzz½ð&Þü‡cû­ŸõÝŒ—ÝHËyCÿw_ 1t]»}«â¯HF±ÆJ›Šèw‚ó§ÙÝí¶s¡%ø(øÁJÄ1…Üàªî¯I3ŽO«h†¨â·Wò·¶¼ªÿñ›>íK¼¯‘yË0±0Ý<»hk¡o‹xòÖþµa¦ÁÎi›ÑMÛ-‹ªòsAá¼üܬI}ºþ\PÈ/°þ3ޱu [ÐV©¼…Àé“IÚ‰*|2ËìªzNs—Ñ¥êu=av†V?ÞUø….¼÷a]$gïÚ£—D÷ûU¤U´‡l=©ï)6ì oCÞET=·}·h«)~gï_jbüú«&þ°¾\“‚¬?/a•ô¾Sà£"4¾8<_I;"Òí ª¡GŠÅ¤ïšÊg’+¾Ã6²|<¯g\0 K=j'kÓâðFLœ|øùÔˆ÷ÊÑóQ;*®»AG°ò÷tß…/–Ê‹‹WYñ6?~ü _ôyÍy¬JÙï|Þô>,ª.HaúY´(é±Aø±bPÈgÞÚ¹oòH,±Kz*âS˜æš„%Íg×Îë”ç‰ w˜œP5ðÏâ¦úŽòeÌ—«Õ¯¾<‰æR}òuyÒaÏÐ;óìå¡£ÞeÒMÀòßš­‹æðÀ4Ef0å‡ ©ñ)ìR;o‹ÓÙß1½zå.õý©'-¢=;[÷P\ 'YNR(¯kÎgž)U1hK´‘µˆŸùƒÜÞXRYz×_Yë>}³tº¸N!söÍ,ØÙ z’»¡ÚÇ©Å‡ÏØXku‹ß´¤žÿ4- Ùr$¡~È)¸ ÑXŒÒ…Л ðêhò0p!Á’öôÉ|šÂK¥—0ÙØ0tÇ“uU%–ÒP!Úq4ýÜY§»Y,˜á’ʤT>oDXå6TRÕ¡`8ŒÂJÀfñȾ?–IÂùåâÇád~#0£«ßê "{ Þ›««pûó+Òy1àyÖ—}õ½m×½!¾¯eØs‘‚)…„Ó\®sò¼,—T]bˆçS@×2êÁÈ’šQZ.Í8€.ëΖ)߃àYÃ'yHhIbk€©¯Òš,X3—$7Ãõ0M Vþ7&U¿1ŸÊ-?AQÝwºõîEíMxÅe†f¯×]ÚT\¶gwŽÃ.â=TZ¥ÒÆFånEi<²KÛ禞1ŒÌŽ5ªT\5M|e/–ÑÕ1†ÌóÝ `O†$œ=ažm¥DR^üÐèŠq>giøêƒìÝôgòá®Æ¢×zQC5,šŽc¤bRä.(TÐ8{ÄÒ/õ¦ä º-3éé5è˜Ô†¬ÆWùz.õãî±ò˜ìÔ9ÑÆõKÀÑØ¥Â^Þ1²¼¡ô–þqž±þ…2d¬ÊEíÈÈä&‡Kç*\,Ô²Šc` ì‡ÍìZÑT+ÚcÍ(ž =… âÃ9ª6ã¸:1…bý7‰R¦´—ägErýGQmƒÅýüpzP›FÝ8ËW”ô{7–@¸@pÔŽœÉ Œ”´AËB®ë(>“ìb&Èyð‡%е"Ê'ïêh&ÌÙpR(RX rRÄ3dÒº]„§L²E©L+zʽ£8‹bHÇ^fòiÐã>ü8RžïAĽX*òj¸UúÆŒ~e¹þð–šRýÁµ ì¼É;¥âN Ü´¦ï4SÊ-è5#ÔžklPÕhüë! ¨ý‚Çt—t¤ †7ôÔ M †õš—’{2±>!²OÖ ¦L²;b¯Òn]ðV”ùÈóðnN)%HáX««;ydÇHP¢% zX*!þÒñ6uÜ^Ë_cåå:KuÎ2Ÿªð'€/—9 Iéøo£0Ow“¥æ8­ÆAå˱û%9rI—9·G\‹ä­tsO’¥µæ Ý»^ùÂ~éz#â±ÔC+= Q§Íq†–ì Uééƒ×mã\As¾{J$\Àžxâü8ŸLÈ¢DÁ‡\£•WzÖ?Žq~•ª•¶w}· _¤ºÚßÄõ"¡H«y}óæ ËèÐGÍ/É:Oô/t$ÕùòRs—Zl$o Þ¬·­{6Ÿö$ækˆ·Þ5fEPç·±.KîŸ)ÉÆoN'm™,þ 8ŒŸÿn#œ|{ã?ž“øhÍy¢¤ÒïØ½ïlöWUž»üG1//+SLYEÄÂNÆ•YŽÈþ †ˆj)<æœé&<ÖE½c@)‡Ç–g§WœF_!¥€x†ËˆWÒ@b¡™l®²t/¹ %{ÒQ=;©‰L//x0±x;P<4SîÐï?ˆí»Âþ¿c<ÐCçfaGëÜ,Ø Éᆂ Úçf7ø—Yèþ…îý‰Bµýø´}†‚”ɂϴ]φ¢ uH½þD ˆ!׊A÷ñAÏýAoȯè¿ÍÐ-¡Û CAÚÞC!/‡îŸ …rè¸!u"#‘CQgZ16d±6dqý¤ñý:‰›:®ZîýZž›ZÞí(eݳ!›d¨vÐÉà“ð >û'Ú¡Œ:؈Á:lj¬Ál¬Ñi¬)`¬9b¬åñXkÁX[ÃX{ÿXÇüXçæX3ä·Yøm~›…ßfá·Yøm~›…ßfá·Yøm~›…ßfáÿÈ,®Â{0îTߢ€ÿ¶pîŠpH¼…¶LIü$Yý\.°¸Q±eYsü)hóázd§®ùšQ¿äBNôs~•³™^æç BéÚè·RroMœ3üȤñŸò%ùšÅ¿oüjNÈé’ÆªýY±øk*¤àŽR†>]ËW+ÀÚM‹žÒ•ø8úoàA>‘ ,þ¾R\è /±]ޱuzè;ÑZ"Y”yUÂ"®°îMU ñ¸ùwN®,¬¾H㯴 ‡Á^” ê s µ©º.²¨‡€_ƒ›Áå¶Iå;Cå]¿ò—¥+nKºäImH4ŽM›S!_d±­<³˜Ó3{®§´7—²kaÓ|³\NÆWõW#¢ê\CЗןÖÐùÊJþ,H+*ü , ïInP8Ÿ8‡>G"^Š¥>!F+‡ÿ;%Át·ð.…]ÉÔŽ¤‚‹]L‡ß=OOèËÛ¥5˜;‰Å[#ôɤÜmÍê«n×/–HÒãká}µ_¾Öû8Š€jþ§‰ÅzЏ26€t›Îˆz¥³ã?'>dŠÕiÿÖp/Xl‚/<&´e÷L-Áú-Qñ-m#ç{ À6ñGíM£õÞÙ*~î­f7¨Öä›Ú~u&,e‹îƘ^¤®ŒBÛA?á`_qÐùi8?ý–ÁÞI¤î1¸y‚jà*„bzÎ Òed-IÐQ%h'-b‰vž:I¢~rG"•„f7öÛ&¡ÇWPŒF Я¨Îák’jÖOíí˜Ë ÔK¿§Øö*„ ÚÃàæHºÔqWÖZŽ~|´î>(‡Nû$ ¥ñ|I’}Øþe'ú5¶‹€˜!ð©^b¨IWòöï} 5´ drÞ…ŠèL^Á* (ç†Í[ÚBÅÈrZMm:9и÷8Ù hÜøêùH­4~†¤ó”ò5ØéãÚ„åP3*áW0ÃÂ’ÒÁ43ñÇÓ3h4ˆÁ߇Úì¤@)!vçò4œÚƒ£óÓ4µ†2~‘¶n˜›Î¦‘ç(þ“LØS÷ã~†ù_„A“$XÏC,1ÖgGÕ´ÚOÄÀصdÊÜüMëÈ‹‰û°êUíj îú&ì]Ã=z ʨoG€æ1¸·GÎ'(ÜWˆ](5é>ì„|_ÿyÛß ¸&±~i€"ÖnGVX3ñ½¬T</ƒß`p+NeÐÏJŠ6£3•P±B*f‚è3aVC½‚†¥¡Òe°ŒÌbø»ÝEÑU3hÿè0¹2oemû7 𱲋ÍapÓ´Š„ÐžŸRÐsÏ0Á+ˆà¦’ÓÜí¹…ðp$“Þƒd2S”A¤Á»vû°qIÍ$E nÜÇ@^!m€Òöœ{©û–3×îxƒB¶/5hc£5L2¯J‚Ë|~;va’ uÅgi0tíò•çôC6/;gƒòÎÅ* ÀØrlåbýµ bÃz¾L×¾Ò*ÊwèÜߨ"Wñ‰÷Ÿœ‚»ïM ¥É±Ñ²¤ñY²¸[ß'(–ß,ô®hV¤¢xº>}žïzä‡×@½w›Kk³å =Ø(ÿ9·°£]˜¦üÎ þbÒ<^ÌÓ‘hÖzî&n½ùšø_ܪ_Î÷ô(‹GeÀ.ªbuB¼k‹ý@w)à5‘„&è¶Ä=^˜\§Èrâ0\œ­«$Ù$ZE*ÛÏeô oO Q,»€É7Šãa(Å)MYq?šö ba€{±J.ìô–žaýÁÍ*+Á®&4f•h—õ´õ/§ñmÄZ móVÙÎ;£|$oÊE¼ny¡ç)ÕDÄV‚ò$4êöB—Ëi;4ΛÍ·.*^”Ì{Eyx¡wÛGh¢ŸFµkï\’éLÅ( qÛïq l¹[ž«ó?ØÅUì €2hÛ¬á—d F¾Öþ"°4 •m¨8RnxR)wÍ<øün}¢æâ»ú=ƒŸ-®$^¶HüîsJ¥ØzÈM¤d³X'zÎE˜@ð¼Éþ84=B“  NâŒ> ð½h©T0ž€´K/.!ÌÔ¥ÕŒ —Œb½‘øq9ÿ•Å1ž‹WѸŸ˜.ÚÎý#í8î7$‹ÄÐy²¾cÈÓì‘ý€ðƒÞ‡U]>j™obi½ÏÇFê] _*hÃ?@”‰°Ñ$/< džä(>F´ƒŒ«“s (: —ã;Ѹ‚£  (R ÿ4à-Òí#㉯™ØãvÖLÚ9I³X¹¾êW¢2ÁZpdàÎ#4ÅqÕ‹ÀjJœI‘Zâ{Ø07Žüey HÉyð„`ûvZ𳺷O¾\ñ¶”hjçE¹åùÏ6ESppEÕÚÈu«Ä›Yú‰%{OÚ‡eu³šÄùc/–j ™íÛñ… [œÛ<¢ýèG}5+Þ&mNB'H+󀂿´>õhµ!œ"͸VÿIWÔ Zk:e‰¢ü*˜¶ë•5\p·¬±­FÑ®px0”Ì òØ…|(¿ƒpbBª™¸¦ú8²‹üL¸¨™e¶kRd«Éf¾gVf^i;Ü@ÄScŸ±ˆôWÑÁ,Jçup¼7·w>¬\òæ@Z§òRF>ÌW¥7#޶7Û±÷Z Hߟ¶PR,G€Èæ Ó)Çö +À,ų£RbøówöKÉ4‡NRN«áMÂ⥻ü ¼Zuc]÷ö3ÍŒÈ ®c7°_sæ—e^èf+=(böØÂÞÐV²o´~¦xc„z}ãtÁëê ­‡“æ3ÛÁŸ^]Z¬^ C…/Û÷öÿãÐS|Q¨uLÑÎÂ.—aã„YðŠcL¤Ã"Bô†ù«m±Ãz*ÏBpyIgX zM©¬ñKƒ›Ô#ŧ@}Áî¼= cŠœÎ,Iõ§¨O ð’ÇŒZµrB^µÞ yH) d¡7ÐH®XO}Ô•n×otñõã˜Õøw ½MR7×ÝüõŽ/¯#¤ Þ¢‰™?ƒˆŽÕ80[·(ßû³ÒhÊg|»uƒl_ðÍÞŒ Wœàºü…mÕjn'Ü!ûG؉3°6‘;C/IY–7@Öéß…4N]! I˜…ÐfŒ™n y/&ÌêíöÍ—“¹;a\&…¼óTJ?§Ì®æŽ/ôLô-.»oí=Ïð{õ £$* Ì’èö°„Á  ƒÞ6¿þ¼ÓwWs¹dWŸ(øN—.àÇÒö|NȺæÙ@GžÏ ¬2œ¨Hl1™Aä8Er†—”Ò­»–89šß¸ŽÐ¼ð±ÑñÍý>}º 9ñÄØpÛ–…/€C,œ89åœw6Ñ’˜øñ|ʪ%Ÿo¬løb[-›ùfñüÉÍŸ¯­ñ ªQô¶ «·öwÞFÃO¿RòjM4Ù4l©#C±ÁP–,&z´»’ÚN Þ‹±Ÿ‹ö.çÉpÑÉM|¹?Å«fl’ÄŒOèn[h³.9:1Lê­.±üêGU=£ÙX¤eó—åö™þðu‡Ë;Ü–vþÍú3©¹œ ôªÞU&Í-…‘¦R:œ:àîÔÏOé¯*¾ní¦ºòÉÌ<"ÀŠI†SnŽz½ø©§€jˆáá»VµÍy'ÕW;Ò:]w0™N/m/fðÊñ¢œ°SàQÕD°1)~HË•‡Œ)ý±¿OUÁ‡åIåúqÈÀEJÁûࢃÝ׷ݼ$˜Ð!;L-€‹c)ȹò•ç‘+ÁˈÖ1’òëÑuÂÄ4¯q3)-´q çìèRê5†|ƒ=8Õ_¿Pœ‰G׆_›çeÄËTª±ÄZ°$£xIÀrš>Ï# &ý "@*@l*¼›‘W•ÝÔáôâ9×8Ÿÿi^ÏÌ"(ñ$¶ƒUÝY¬šèdgo%Óæ6æÈ<*ÑVî}tæÑ€Í:›ðI›)–íN²}Ÿ®@Ð`Œ¥Ÿ@†¼¿„HÐ5r¨y˜?î˜ÝÕ‚vŽó¶Ñçèí Y¯{Q£õ‘¬š¼‚Ѝâ®ói7s‡ B5Y©ûg–‡¹`œ‰”ˆ º@³ç ~¶Ñq ×,Œ;ެO¦'iBÏ—÷5àíÛAyC¥LSøŽYñ}ºÒ³é§t™7“eBxÑϦæ-‘Þ»SY$f8À«¢´l“‘£9a>%œY ¦YÏãUã?<é –Âä™8yj8~?Vc¯µ¾å®Ëm¤™2©ÂÔLÔÃe·}ÝÆ¬Í¹é7yØ(×P—Ü–-¾…›Ví Òvvï+ê#|)\5l¿ÃÏ—ˆS F–™E£ˆæÃ|Œå¦+e?;NŸä¡·«þˆÅý¡7j:^)SÒÂêF·ê6Ð8.Ã§ßØGçÖf5Ù Þ_|ÒAOÅ0]QÉê~i‘dŸ¸sGq‘Ó £Óu¾ê6KãXc0\â– Ø—ëe¦ûx‹ïé².8QÍf1cÜô*‹¾÷ÚÞóR©ýÔãAµÃ¶Bôëõºtðæ°À¸‚ãÐ×P#oÌ×Ï&Ö›mÁ°¹qáÖÌ[YÞ•ö¼úŸ ÛOcîeQZ_²?jçuà —» ­Pz Ì×]É£ž 9†PsõlŽ -þ¤¯Šô&¡ T®§²?°McM]%Þj‹é ÚËäF“† z­È¢d<ì¡wÀxA¨j¾0ÍSy xoÜ“uYBÆŸUk°žÝßåï8¾ß” ñ°ç»Ñ¢™E㓵°ÿ¨æå'\àFý¥¼HÄW÷H—ÖÉ ‘[ä=öc§.}òH2ÊEèx Ó 5©±1ªŽôI‡™¡òÕ^M´IÓ¬'С 5™uöŸÆoÚˆ—i!žßÜaŽôºae‰f»\¥­<›XÒ ½+ê<ù´i*02å-÷~ëTe@ÙL‡³³´’‘˜ät‰À‹9°•‰Š\®s‰\¾e™––×§0ÐòôðÖ¼N]´8h¼I-Sœx•NÝðH5ÌK›Bò6ŲÞÓ&—»™oDŒ§#–á4m—çU^¿Ü|×jz¨•N?èJ¤¢a|Ï8Øþº^˜¶K›BÀ=œbåg³©º—à˜Wà(©2~ëCrˆu’¥À“7m4Š2W¼Áñ$ŒY’¼i¼ïùv³* ’IUºœ„½=ahX:=ÙK¤9ŠG¿v²ë¯.Ánµ}3ÐzÊ>ü¶o|ã8ê¾¾Y𕤵¢ËÁj@É•í@ÓhF¦Š×Ç$Η·_ßð„ç¤þè1”Wš^0d}\þòƒLe¿­÷‚w‘úÞ³òþØ„¦|êÊ¡èpÈÕOþ¼]æÄC¥°˜´Á^9¯ÏŠÔ&y…ÛOŸñ$X‡æ‡´âÙ.Ž»_´/”Ë SyÐ:MeøžNîÕ.M6ïË:•˜À;÷Ø$»¾P9Îì|Dßu·+ÙÈ1çjúÅpw ñë‡ï7®˜2h5ðÔ66Iå¦Gö~iþ0J/ÍÚ)DiýF™‡}°o¤è Ú¥•X#ó2²—2 |¯tÅvÔaßçXÎVª¤Ž[wºõH ™´ y¿$ …"‡²"#ïás9ÄÁQ”ßMÝѽ•O ­( &üt'Iˆ=±îæ9ᥧmþ Ó¬¡®]|¤ÙÚ ÓÏì–PþH{ C̿ъÏ5…§d°¢Vzu8/¨Ç§p– ÀjÞâ»x…Ô°[&¿h3"aº ª ¥SžQ$oU‹ËbŒ U,³ö>ñ§™Îdãæ•ÖPÏÊÈtVP“3S«qï•êUäk³jeûQ«æÂÀ/vÖ—â¢Ì˨Ù§!‰'#¬.ë-1RôÙµ³¥È«‹œ‰Çî2ë´°‚Ét…ïgv3S¬mÌJD,+W‰ ˜$‰€2Uì–sÛ ýðÌ•5aáM%³ åuÍï%—ùÉ™é´hæ™èÔXœøHMçËn [Þ¬Èb¯vôaâA—+4=Bèò©Œ7‡‚óx˜ˆ1a·*"t@ÜÍz40û*&HlÛ5š ÚýœåðKÿ>¿1<wÕ?--¬RW%ħþI’-)§ýþ‡+)Œ:XôHx‚pº‡x©s2|Ø3Ä·V÷ÅâÐý†Q…%ÆÌâ1_²ÚEFßr½¹ô6OððX\(—ÉŒš©o âÙýRFVU¤ ky=cþ veMR‰€§S`:\eÛÕƒ°–`ôy?ÄÖh7TЕùÅ’”u„aõãt/»ž¸yÚqŒU;c]££Pö ='£½±Ô81`ùÑ$iÐFXTn$ µ¼`BágÓäÈàí¯M“µ_›&;!áûý†¿6M^þ×M“¯†nšì¡'7•'wú'áÆÇÇS/ÑaŒÀÉ?7M¶ú þk€bËÉp'Âp·Àð]¿á‡áá‰áã¯ÅøÄ')ŠH£ÍÇFëSü-SüÃF‹Sij)’Ή—/'^ŸM¬rL®'QzN¾=1„ïuL®LËÕLŸ@¦>ˆN}DO-›ÍÊg† Üš½9+˜Æþ?T, gCIH”þ?PK•Ä^RªºhÿPK k€Ó8js/PKk€Ó8js/behaviour.jsíÛrÚHö¾âÄq„ÁÂŽ“Ý*³¬Ëv2;N%™©àL ®j¤ÉÓ-3òísNw«%aì8Ù¤öa—„ºÏýÞMw§ 'H.Á—$¹Ÿ¥BB–›Ï‘ë»a ±Õ6OØ8æ ?OÒq&rÝð*|”@˜ÍbR?W2y–åɦüÐK³qÃÌ–"QŽ>ü»Ùh8cO¦3îÇLJa’'>Ií¢„D«E@ ó⥉Gþ5âZ8 Ð`1™›…‘ô¢$áâ—ó·oZ=ÚZáתC¬ž§(€ü1Œfi.yzÃÅfu6°uòæø—'[%¿fc…/͆Oði$3.\£Kíw»pÊ⸌OyÃm‘åßÕ¾¡pÐFs£ ,Ó\!æó€e\mé¬<ó÷ßD>O$WžW®8GaÅð‰úE‚ídðb ”.{› K&©˜±µø ³l~Øí¢ÓýTžŸzÉŸ]-]Ån§KßMòtþÊ×¼>á 8‚-;d€Â,UÈsíÒ,„ìÍsš]´ÞJY{ ‘Á›”¯nPmwÍ‘w¬N\•´µõ×i£eÀ û{=%I¿.ãE8ê…í¶¦¯ ‹\£4)5khsômÒxSž½ÒÑ'O–ƒd±u,7ÔÆ€û„Ð ¥†Ÿ¢K“œk˜US=óÅ41ÝWâE£^Tˆ×h(y. #› ¡J8kƒTŒYµ ýP4Éíi¤IŒ`¨Ý"J‚táéw¢ÚÔâgË9ÇÂVÛ†'}p ’NK•‡FB§¢òðXòûa´»ô~ÃJäÍÂmÕÒµ‰f+]©¢Š š]UÉÏ1É&iŒ6J¦X{•I§é|)¢i˜{ÚZ¯ÒXÚŸët|¬‹ v³>ËE"%À(M¨¿@:¾BPLe‘ÎTâû¹´Q° ˜¸~H‚Èé``ë½[ù}d@Ã0. ú ›qÙMEÕd½„ÂúIˆcŽyŒyxð3Æ¿e³y¬ t(¨Ê/D¹ëÑÍÓÉ1æñ[, ‹V•™Õ˜¦f*žsJ^‹( Á±D(ëÐ ‘¨)ŲLDã\UO–!5^˜ûp”ÈýëÌ+T-˜¡²L†&5, ,ÂÈ!díÖß"í¶T0¼Ãò‡2ac‘¢°ç=?„A>Ÿ§XÅ(eÑ]Ï”™ñÇAEPÛ²•‘8˜j¼X,¼Å—Ši÷ü}»ûÁ®…í>µÊE%Æï%Œ¹zèvà-(ü³hJ 㘻ð'IÂÿ¦<‰nù¦"ƒ}ι`ð÷œ%äžÁ«ÛyŒEÀß6-¾Å—òW.†LXKê'Íf‘ЀÑsǧaö.§À^ø¾H ßlWÇS²3‘æhXÁÿȱÊÜg¯^t >LCêƒ&̸GÔŽÌóŸµà=gÓw˜®³ã`ÀêñpšWë’ÍøBüã,ã3œ¤°é“Ú0Ìç“<ÆîƒæÆÆ/ÑVcB¢ÛEu€ÍüŒXš´ÕÅ6]ªi+Ív0£ ª ÈÒkœ€j¹~AÙm‘„ã:à(BcjÐ)æ¦Â–Ì ¬jH„!Ì^ÿ0ô½˜'Ó,Ä%lMFpµƒ€ûNPóÍâv/‡²Ýí8N«\•mµÔë)lÕcÇ´€ßþ:q§ØRþ »ûesÅ%RÕöì¥ÕÒ°ãH0MÌ(ÿT+_€dÚäEÀ{£êfëûµõ¢Nl¬'˳ÀËE©c¸üô“êû­yYú&]pqŠçlzØG³zmqU×GUÎPß$¥¢ƒIÑ)e°­ZœÍÑCŸUiÃ&ôZ `­å*Ç1‡æBjƒø@Ô”SØj«ÆÅí:šýDóA¯4Ky6¸Ý»ßíFDt¾i t¿÷îW„«Ûe¨$Þ਒–– öþÚÛ6¦²Õ³i‡F|š¥±ÍTºÝ«–rzÕè½õÍSüÊT¢š›¾¡NßÓ·îD›Æa™Æká.{vµÓ}¥k‡>•ùa­ð×ùâÌÝ*éÚÉðRwp7—õÂ1Âö—5Å•6Åš¢à`pU7h³^”Æm·Gˆ^à]\î²Z}1Yj±Vƒ:£ ØèÀk-õ5J­¤±"_×E&i¡¯G^ÈX€î®z*]’ë=Ÿbwápì´-@[½·Zu›¬9cƒÚJÃLôè"Agnàq?à,ÖqàµVQ´‚ÝKw¸Øi /ðÑn¹ýÏÃOÃËáöpgtÔêm¹—ÃÑÖh§µu4mw+úÖk…¶’·½_õ I±¶ÿl}_ÍGz (`Öa~gq^%òü?®9‚Õp…3ͺ|mìÆj_œG|íÁÿWœÿ銣@Bî_ÿl&_•œú2ªét°ÃãdNW 4ÿÚf5Ô$ÆžJÜjTõõqú§ï“Wä ›õ²Zkª’TÇqÊ„bÔqÕ”\T·ÈÈEŒM­VV½ é±à캷&Ég-É[ªxÌá”;rŽã*–%>*¼Hžª¿›÷Ua+¸­ÂQàSU}Ϧjåª.ú:uãA\Ý4c- —óÐÛ¤ÏeM›Ý£Ç*syGYÑæûI\ že¬Päì=JÆíªŒ< ªâ)]ŸˆÕÒÖG&û¶èÐfNÌßOìÙ:™ïèq?ŠªA(¤…7KR|çŨkÔÉàa >ayœÁae}­Î5\ê[~K·Ø‰¯’ÜÎ_+ú}’WüïO„5Mì|øÃæ:4µþoDZ†±—˜‡à´M×l;  Cí¥hvÁTﯞí,ødM³½QKëÝÐ>ì­#!å³ ,8 rÁ;æj›àëƒsºy(î\:‡Qºœ*o$ôeh9¦)šÙÓÕ}³Õ·NVÕ¹êÛ›of=ʬ*¸“$ ¿¸3IWR7yÝRX†7iœÑéZði“ò·sÁ¥º9ÅŸ±¾nªCAûñ‡d>ÜÝÝíš}•úÿ Š%õŸ|Òª}²éUþ2ï_£0ÊzZýÜùÔ¹ìlwv(äúv»L7ZB_ÒUì_PKßJ€¾† ØPKk€Ó8 js/index.htm³É0´ I-.QH,-ÉHÍ+ÉLN,IMQ(OÍIÎÏMUHËÌIµÑªPKŸ¬å*)(PKk€Ó8 js/ajax.jsµXëoÓHÿœüÓHÔ¶’šÀq÷!Á‡T*®Í*trãMêâØ©½NPþ÷›Ù‡½ë¸¯;DmïÎã7ÏM·ûô)LÞO¾\„i”°¼»s/àû£ °Ê’d\³׿e:ãq–º‚ƃ[A¡#HÙ5Lò<ܸíÐæ’E¸`Åh80>ÿ,YÉFà8bñоŽ5!Ìä`ŠŸ¶o.rC÷’ñ‹,”y<8Ï¢Í@i÷’¬éy9» Ò2IÆ´€ÿâ9¸×qe×þ—ãGœ¯NªVºèc–¼;„ó<».ÐÁƒ¼(ÝDfÙ\®7îv¶ÝC¤¦ì b\³/ŸÎ/ÙL‹~w¸+Í¢s{Çñ,ÏŠlθéôsOÉœÈægiÎÂhS𳚼`AåOPý;†ù)‘Á 䦢éð|£ÞÔŠø£´_ÈTJ=kÓ Úi+få å´©( ÆUDÐ_h»ó&K9&ûÁt³bÎÀ W«$FãÑÏOo®¯¯æY¾<(ó„¥³,b‘C‘ª¤¥‘@¤”H¸”# [çÀP”0«µmÔÔ‘Œ—Q¹Îé®öUÃÕ2 z÷í:“r[6B#wužh¯ªä"*Þð|8ôAå~eX¬²+$Í¥—0Ïý㇠[¢·‹×›i¸øˆñw{„è@“õj¯(åJâÖzö÷+->†dÁ/Ñ3¯âªÙ˜ J¾Ÿ ¿ÞÆÄÑ0da€+$Æ(ic|¾¬¥k0¸ÜïƒgršˆlL €¬8‹¿Êü‹ «&K“ ¬òl†aƒS±€lÓ3NÈñéŸÅF.ljó‰—²|ú <‹`†õ§”;°ã_‚yèÉ çy|^ræ:±¨“uGŽê;(Jf£>OÎâ¨2¾£á«M³æÛ«BD .)Bc|¼Ü;»ˆ“è#yOE Éú}¢š¢%pÁÜâZèÙå×N²BPÔž)ÛÔÙ¦µ:Å¥„†géß¶{×·ùU¿ë7Ý^é¯ÕðU»oïôvt×ék6ýJ«ƒ¶5©«¥¤¨N‚½*jrY!¿ís‚ÂH»J>s@ÑpwwÇiÝ,‚¡^·¶ñ4tÏŸN§x¤øŽ\äWÊsžÅju|ƒêÎvßÒ ÷¬3^æ©¥èqG€eîQ=1 ¶OªÉÑ•ßrj´iÄZ &¾ñÊ>Ã3?!ónu¸r|#‚FªU$¹î\- òŠÖ"ÛWÒć3 žwkÞìLÈ𾳋®ÿ•ûOz3ÛÃ(úlDÕ¼wà‹ô¥e™hÀ|3G›jÉš÷ËO(ɵ3”È­%$&Ò‡¸ÀQbfò”%€GÏVñ̇ªUò,8œ3¤Ò€‡ßât+Êwæ‹RÒ~)Ú6>ެ»Žæ™¨± 7gËlÍ =ϳeî.(Òv÷)×÷.­™&YU6¦ <q®ƒõ@W^Y‰ê‰Sã* g8M<ÁTzòüW=RÜJ·/è~»—. º_ÞjººŠ­j·ë¸¥Š‚ÝÚåˆÂrFªÂ¯o˜Œu§19ýF‹²EõûwVwk¥)Õ÷)´õò¶û¶ÜœSIRÎ1¬ÖÚÛÞÙöy¼dYɃá=N S]Ó&Å)Nšé«0Ç¿pîÖ~’çž±çß,:Ë4bó8e¼ªg#©~WÍ»C·–àÁè~Žãì{œ$¡É¦,!Ƕi0L1u)CÄØ)Y{Z¯§ò¦ýBb¼3êV—cÎ$þù[ùÄe¤"¥˜§Ö ûÂkެÔ>ÞØõßaRV`ͤâçKDSF­bUŒê¡"\3Üég—û OY‡Iü]\QÔoAõš«Ï‹ŸšÇÄæ–àÐ1ðæíd:ÆÆMá!±².»ÑjȰ|çúušÉ¸©qyH0©ú·x%G®ÿâqAWÀÿÁ6o¨è˜²uãW!áÃol3³VP£%£9Á¾Sm`nûߤšZ@Õ“-¶Þ¥TVÕú·Âœ×ì"\ÇY™ûtògadÍfïõÆè€î¿PK¬IeÓPK k€Ó8jsp/PKk€Ó8 jsp/bean1.jsp•QÍN„0¾ó“&½´a›Ò==mÖø¥Œ (vŠ oï]M<é©Óo¾ŸÉŒnãЛLçw0Ù !QçÇJÄ0£È¹Sûfáç¦ãLxv„®© çç1b(€œŸ°*’°×[¢µ?Hë”Wb\˜'~ã”É2Ý–æùåTʬ t„R+Ʋ,ÑÀ:Ç ØÀ6Éã)pnˆ ŒvØ|“Ý”ð e v’ÔuਫOLë徫”mw¿MF–Á§ígî뼂€3R”zÞË×óÓÍmnĶ mÀ·JÔ¼ƒäa}ôðý×Ê®<•.¤öS~PK\ýÜçõÒPKk€Ó8jsp/tagfile.jspµ“MkÃ0 †ïý£ÇÕnw)# Û …î0 -ììØNjpìàšÑýûYI?’°Ò¶›üÊÑûHŽ’ñ ^CíU¡)á¢RE©}Jèçâíqõ±¤QØg£d*“’â² è9ÊüƳÓì}³†Ù„Á–—°ÔFÁâÀ«Ú¨øÁôt˃:[s« ƒðŠ%¡ð®,Rx^VÊ(°Š¶Ð¥ Ú…¹ƒlέK&² Èf²ÎÊ+hÿšþ³¾±ó~ߢQz}? úÞî´¿~íéûF8ÞŽÑÊZå6¯­ þ¬üè×·úu ·o/ƧM Í*´Ú.f\¼fyPKÂA,O÷PKk€Ó8jsp/index.html}ÐM‚0à=§h8µ]—¸pe‚˜¦Ã_(mÜÞA£ì¦Ó÷%“§ªÑµ:RÆÛIG‘ª„>Á$§žÀª‹4¶w’f±¾äW&Éд-kàŠƒV¦çz¡kr¤³èüøåW˜ºA¹‘— ÉŽåµ -n“¢nq­æü™¶ÿ>C?‹ý!k•ÑCí»…QcüÓ$ø.öPKãahL¥`PKk€Ó8 jsp/dump.jspuRMk„0½û+AЋ‹×6†º‡-´,»ôDœ‹FÇmKéïŒîR»T‘ä}„7/ÊRÛheÑ”:PÑô¦B¨Û¾ó”‡¯ædÒ‘ê&ݺ±Eo¨î\S7“D]ùÉ;›é‡ãîǶg$ÓA È BÑù}f!³ÈkEVðmÄàù°»Q>PÄNQ~Ò éÌaJœð}L+eñ¿.Gô§ioÈ®º,8k6‚íÜK·êq!\ð´X ò?BoZ$ôOüâäVèï¶n0ÆÔšá±ó¸m°EGŒ&‚~É"ß‘|í*p¬„ây›`êðƒÎ1Œæ¬’(Ë;ãPbLúH‡Én¢ý“ï"öõ”"ø–º¹ï©O)~ªœ[–‡üPK»ˆê"@PKk€Ó8 jsp/tag2.jsp…ÐÁ ƒ0 à{Ÿ"”yÔ€G©²7Ø3T­¶`é2œ ß}v<ò“eÙOP-õk#„Ê®Àzœ\ èji™ç qY–BwÞy<楄9šÁ=k™&²´žbÕk6% ½æZNFÙ€[€Ë«×ë4ìÉS`» ÀÖÀjtÜ›©lBáé$µø¿[ŠüÑ¿t~Êù?£?xPK»¬‘%ž PKk€Ó8 jsp/bean2.jsp•QÍN„0¾ó“&½´a›Ò==mÖø¥Œ (vŠ oï]M<é©Óo¾ŸÉŒnãЛLçw0Ù !QçÇJÄ0£È¹Sûfáç¦ãLxv„®© çç1b(€œŸ°*’°×[¢µ?Hë”Wb\˜'~ã”É2Ý–æùåTʬ t„ƒVŒeY¢uްm’ ÆSàÜí°ù&»)á Ê@ì$©ëÀQW?ž2þ˜ÖË?|W)Ûî~›Œþ,ƒOÛÏÜ×y?f¤(9ô¼—¯ç§›Û܈m%Ú€o•¨y!¥äa}ôðý×Ê®<•.¤öS~PK*ÃõÒPKk€Ó8 jsp/tag.jsp¥‘1 ƒ0…÷üŠЩõö˜„.¡.™ÚÉ-«B‚¢)Öþú„–ÒÖ¥·Ü»÷ñŽcwV Vtf±è€½®m[àëÐrÒxßS€iš]º*);«Np?T—öÆIŽ‚{tÚZ[Ÿ†!5ÚWØß99ª3‰kŸJ)wØPJÁ¼Î2êGœçy°ÁÓÖç¡1X¹ˆ}RÅ&’½xáÆÄïŒòô–q¿÷ÿg T±‰ü’1XÿÁ`}ÏPKuNÞθ¦PKk€Ó8 jsp/expr.jsp}‘= Â0†÷üŠ#ˆƒ¢5]=.N¢cuHi0B¿HRÄÿnÒ*õ#6C¸»÷½‡ã•-rNP1¾=ìâù6×ZKc.Ui0reBЊ4—V:“zEå­æhïí¹Ô—öÒ4¹íÒÈÙ }Ïâc´?ŽnµÐ¢HèšžîΘõÚ‡4.SS/_†–ø RR¸Ñª*c°?ò ª1RÏÄY–CÀ )ˆeSöCy¯›ú%Àâµr`OÄýþv>èýPKŽúŸÀðPKk€Ó8logonError.html³ññõ±ã²ñ0´s,-ÉHÍ+ÉLN,ÉÌÏSp ò²ÑJp…§å%æ¦ê($—ç¥(ä)åç¤*dæ%ç¥&—èq)¨å%XiŠ èaP€PK-2=[PKk€Ó8 logon.html•QANÃ0¼ç+ ‰ r"qA=´jå\9ö’;²×ÐòzÖIŠÔC\ì{fg´+ׇí¦.äzU?ï^¶ð”¨CGV+²ÞÁÁË’? ùîÃRçM%ö»×ƒ¥3©Lj:Kç£îP ¦“jz„ƃ¡w4ö}•¶®­ÄýŒGeÌ„W“$Ô€$S¿E N ø(KFË£´nLÑþ ¸Ã—ê—25§H‹LÀ N=º–:¶z@ç‘ „'õÜ’Ïpe¹W1~sÚZŽ‹ì†åß÷ [Ð>ÅMQ½m¹Ò< "3˜3'˜íbjK—Þ´dÚøÖºIueUN‹ÈE^`¾§ÿPKw¦bp øPKk€Ó8 rewrite.html’ÁN„0†ï<Å„£qwâÕT.^Œñ`Œ/Pa°`iI;öí¥…•u³·væï÷ÿ3i&ÔMñÔ˜lÉ3°"x¡Á5LÒTšœÀI”½ZpÁͧ¤ô×p°¼²AWàY:†Gb>ÀаºÑ;*²V~JصÒÍŠ}<—ØFå~ìôzÛ¹Ù6V3éy&‚.2¡›BHPŽê»½í­®°´†idlLmób [‚8aŽ19V¡ëÑÐð£/P'§3»$ž-žõdª³×þaõ\&ü•xCq9°w–©äïœéö'ø¨¼ºˆþN#¾I‡µ=É›Êëi Ó! ÿßâï^ÉÆ@¿,uúl ÙMþ„ñ|PKÜâÖ9«PKk€Ó8 snoop.jspÅWÛnÚ@}†¯ØX%2i‹±JšHPAC¹´ªª<8aÀ›,¶»^çÒ*ÿÞÙ]sc%}1föøÌÌ™ÙYÛn:m§h7/N±`Zƒö¥ó¥ß%‘! Ý ØUmÅåÒ'e!t\Ô;÷Á}²"à „å ZM¼ eщ\´b¼µ.ýx Ü4ð RBwUíÏ>¿ºøéÑýçÜ4ÂH×ý%׸"×ÏœüŽ!„úã€O®žÉÕAã\†gz*…&qøuN'ž˜=#2ìµ?b.MºpìR̃µ& $ÂL®o+,>!#­JòTd  Fë.*é £f>Öa¯•B9¹•“6än–ÂÝM ™ûº °nÂKaM`]De$–PUö´XÓBHJÁ]?b.¶ÆâÁ˜‘þ[ ü™D‚S²ÊMèØ\bWÀ¾Â™•£º3V!A,¬GNìDZBæÞBƒ1Ó°b”™¨«vÇ81Êi®Ô2Eý9ðø‚0ð'©%L€m…Ë(ÉŒ\<‡°Ÿz€¨eâô®N|wšF«Q_”‹U¹½¬]ecíÁ4@bœ—©[Z¢†ÊÅêŽF¢h/qq¹ˆ½ JA£šÊÆÚˆqrúGMpÝzZ9 ßÚ ÕdêíR±°tÀ +MpGºô‘Y© ¸Õ‰Ük¤\&`ynÔ 8\2ŒÄˆª¿EyJ-:žb‰öœ8 ÆÂÑ)­,~wY %É» ·q4Úß[‹§dvUb¢ŽêC·øPKÁõVñPK k€Ó8WEB-INF/PK k€Ó8WEB-INF/classes/PK k€Ó8WEB-INF/classes/com/PK k€Ó8WEB-INF/classes/com/acme/PKk€Ó8)WEB-INF/classes/com/acme/CookieDump.classWi{Õ~GÛŒ•±”8©šEiÇ’­Bh½(g3u#'%I×òiF‚éFKiK÷m¡¥@K©[–äº<ðôà˜®pd¤>!Ìû®‡×¥¤¯"ÜÀý)kÁV°màP7—c”»PàYÝhþºÂ„›}ÏÙM§$N™ò|nîÇa©¡ã(îÒqîÔ1Š1šžð¸Tñs¿À ¤oƧïb@ßDEèx¿TüÔP%ê¯TüZÇoð[/áw*^Öñ{¼¢c÷*Øq£·÷6ÍjY8:ÂÃ:^Åk´t¼0.‡ÐñGÌëx/èøÞPÐã2g´W«êø3ÞбŒ¿ð¢Œ-ÉûöS2¾T@ÑÈXŽ*þªãM)üÞ&øX1¯ãÌ3²±\1OKó'E'Ç»ß7¶À ”òÖxZÇß%[Ò©špíòxºÎÓ“¦`ž@’¡‰ÂÊQoº)÷‰ºOK'Ó)yøÆÓR"òNàxZ.¥sùÀÒ…z××ð^HWXîyiÆÆüùõšÅg­èÞTÈ·vYfy¯ËY•§%^‘°A­ß3phýj¯RÚ/žGAýìñƒòƒáò„K¯‹MWÜúP+^aÐî­´O&_ ìåGÔ~˜)ü±³U9f]g{Œ³Ï#äíÅW  †ßCèÎB¸[®±ö!‚ý”t__Àˆ‡È7%Ï^ÊÆ3+߈AYa»/ ÈÑ8uç8Âþ¶|ßþÙÆÞÈ$"«ˆ†0“IļÁH$“PýQ4“ÐüQ,ùw'#-ô¼„ÜûˆÏ'#Éè 6¨ÉØGèOƼÞ$§ÿ€ÞBo6I¾:ÒeIT©ÚJšv“¨ƒÜ9J—'èô ƒ~a_¦Û2 œÀí˜Ä KWÛ¡8‰SaNã ñ{¨9…û&ò ¾ÈQ„ø'0ÍQ”VFp–£ufHOìË܉J‚3Ù6¿-ó+¸M²œhakb›Áùwz(r™©k¡¿…í3Ù¡Uì$e“äí3×Ç·ÝC;I+§˜’ÓŒî S0åÅrÔ·ÔŽ ߎ DEç¼îb4³^ǽ4†˜ºû)[Xó\%ZŒ{˾çÙDrŸ%Ä*v2À¡Ä®vgV±G¡ŸácQ™»ýì>|cCAœ‰Û_2Ò½£…”Œwogž–ó}l1¡žŽ*¯ÿâ縑õhZÅþ¤ì¶ìPâ ×xí!¯dÛ¡i}lg@£ èÇEìdúöñäN<‚öU\ÂsLî‹(ò#¦„×PæÇ‚GežšHÞ¥%©ËmR—Û¤.¤öóSê¸Cì¥n8‘y»ílÌ[ºrÝ æBò‹)P-qfŸÌ$˜ƒ¡þ…á³Ùgr Îf;€ zÔ v•¸ì@ÃOùíX’A,:zÉÉ}^%ù’‡òèÿPK:쉑ûPKk€Ó8&WEB-INF/classes/com/acme/Counter.classm’ËJÃ@†ÿinmíÅÖûwmƒ;Aí¦ EÁibJš@šøT.,‚ À‡ÏLc-Õ„œ™sæ?ßü3äóëýÀöLhØ,AÅ–Ûv ì2^œE)O؃ºã”¡Þº®º‘ïôÓ$ˆüý4ˆ‚´Ã ´Ú7$íÆ÷œ¡Ò "~™<¹v!ͱç†7nˆ6´†õõÒ€#Ó0ð{|ÈP$òD^vFt|dàc|bàSüÁÀgø#Øù™°åíÐ|š?ás*¼šÚ9óêl’¿t½,â²*?Ù¨ ÐNMmÓ<6ðaã üUÇß üÿ`˜ $R‘ˆ?”­g)£ãŸþ…/©þ…¸`«¬ô;6BY#’7Ç»fòîßøä>b²š“²š ˜øJÇ×Ñ騴ÐGƱSh%Ö¡@Ÿ9Ä>ÊÒF.FgZþ¤iúÅUª3ŒQ ˜"¼+Î9Sñ‰“k;“u‘ˆÙŒ4[AË̲1Œ-p”©ìd,c9‘ôò–ih1r -¦}Æ\”mæ6˜Î¸ÁŠ˜‡n‰@N $S1ü@”ÒC6s vš!¡ÙIïvª3³K²NØÆdœnœ2{˜ØÌ„ο¢©Þß™JZþVÓk§¨™Â‘Î*¿]MËšŽ&£z ZœO¥9C™MW>KC@€$ÊäÞ¨¬vî6›¹&àØÉøì\T³uBÒ6øÒÁ¡ç$ña]\TCt©. &È : ‡–ö¿Q ^²åÃmŸ¢-V »¿ n¼çåmHm¥tUÙÀÂ’©Ún NÇX&û‹[Ü­Q:5•ÃrȹX«û4[·b6«…½´¦,sèX5¶®5ÛD+î°•Ù]Ë“´‚ +ÙÚK éXEº‡/›tòñUnŸû”ôÊy%†n>wgª R© ©æ2‰9ýÿÆ\ÞsEÌT•ý`Oè°OòÙU-'𠾇°òÁ@6è9™\ d{7Bå=wÕÝÊZÂ_#ñï*èCã÷i*ɈxTóÈÍçJc¾T*}sõ`䌛ºOßMàtǯn,Èsƒûx7\ÂâÂBqáÛF-’íÊ©&ã˜\|-¼©|@ÅÆ)CÙ9ìFYÿš?zš_jû%œÉÔIAÇduÔfu䜒:yJ^!@ÇJ@]CƒÏE «fT¶L­ŠBHìªÀò<©üß%ÞJ!TŸY—Y4d™Å²¬âûÀ”„²IÙDw¨¼‡Ù.Äè^­F1ŽÂ8jc!J±ˆ.û%t±×a-ŽÅé¨Çf4à<4â"«¨ ]Gè6êA÷Rÿy–îáwéßO·÷§8‰qœÂJ°šMDMC+›“ÍE«Á6aV‡SÙñˆ°Uèd!DÙFÄÙH°­H²ëa±Ç±Ž=õìEú$߇ÓÙ‡ØÈ>Ç™ìKlb°YqãleÎQ|8W9ç+µ¸@Y •U¸XiÅ%J[”.Sºp9yz¥r¶*çb›²×([q­ò ¶+=¸^y7(»q£²7)ûp³ònU9ºÕ ¸];Ô9¸S­ÁÝêBÜ£‡ÔxP=©ç ­^ˆ‡ÕKУ^ê xT½©÷c—ú$žTŸÃSêkxZ}»ÕxV+Âm$žÓ&âmöj ð’V‹—µF¼¢5áUí$¼®™xC‹aŸvÞÔ.Â[Ú¥x[ÛŽwµ[ðžvÞ×ö`¿¶h/á#íM|¬íÇ'®éôÍ/zçø°žúçZʇFYX…S‹r0ˆÂM‘m£<ljö<*mE8 賩´›$ÚVL—²nŠgHò¹ÈãJIã—,²á¢È¬D ëà¦ø4H>¼lÛ%3«ZêÞöªKm»äcƒü\bÛ oÚ|¢gfZ93­ì`µö4yº‚|ݬÝäøÛw.Ø€.gªt¦!Õ{ü½y³ÐW9³ê˜›Jež¤*œ!+ˆbjŽ ËQ?\?üPK›áš´½ ©PKk€Ó8+WEB-INF/classes/com/acme/TestListener.class•–[WÛFÇÿÂã0ô’¦„$`Aé=-iZ°MšK,.…´Mey¢¶äH² =§/}éSŸÒ—~Œò6=§ýýP=•²Áö’—Õj5óûÏÎάýïýàm%1„…$>ÇbK2–“ø…>¬`UÆZë Ø|pP“á¦PG#…ïq(a¤íEÒ¢¹V:`:Uòx÷Î }•'zÜxøÜ"r³[¥‡fw.Ô"lP["ìÙ í¯ / *=æ¶~0š™ÝýáIe+t§RqhU«R5îÍÅC.W»!%ôjåòI….fÎ.¾Rwв¢Õ¼ö=£š Ê–~ðŽjk,_,®Ï_˜­vün]X+nÏs4[ZÍ6syšó7óêe1ΛõªÊhC=Ö ›Í;áŸf_ö}²pŽíýôd‹6Zóºs­MÒ]h©Âîä®#MÿLd c—q¯â5¼NYF ñÛ…Æ7éM¡§DÏØÔ~§I®Ñ÷'ñ)ߣ„ÍÇp#p~ß³ÇyÇÏñ²ÿ1pä³›¸åé‹ï bÄ="C >鈘ò·ÅˆybwįH BÏåÛÏѳ2ŽHCˆ>GLzx ôÿòN$Pw¢é^u'–NªQ©O=Fê¯ãÒ1úÿÄ@ôãcI#Jãã"UÀ2–°îÅ5ê+žÆµLgÇk"†<îÒßÛš¿saÇMnvØäLP`ctžÄnÄ{äâ׌ñX€˜#ÊÄøP„0: îá#ñ±a c˜!œˆûTÓ~:…ˆCbBŒøQ€x ýó©ñ³ñ™øD~逘 Nd^Œx&@dň߈œgŸÿPKÚe6ÅrPKk€Ó8*WEB-INF/classes/com/acme/SessionDump.class•W |ÕþÞž“Íp¸$Àz®k…ƒU² B “€@-ºÙ$+»;qv‚G+õªÖ³ZÅZ©¶UZ¯j«¡ÑÖÚÚ¢¥§½´§=Õ¶ÕÚ»j¿÷fv` )ù1ï½ÿûßçÛýo>ö€“E$„¸² gáýrwU5®Æ4\#×k5\§áz 7„°7jø »7áf ’ë-n•W»4Ü&Ï‘ÏíA|$„Z\)wÈÝn •ëòsW5>†ËÏ'4Ü-×{4ì‘\>)Y|*ˆ{%ð> ÷‡ðÔðiy~HÃÃ>£á³‘ˆjÖ°W²üœ†‘ “ÐÇC˜‡ÏKà4É[ Z§$Å †µ-kØÄRk›™ïËô7K¹”Ú 3.ª@hÅPÊ´)£Ä/yHæÓYc¥iåº4`ÛƒñUü¸lºŒó‹FÁn>,Za ¥ZÐrˆfO;½n¹¯’+‹’ Ž÷è±·'R2pÉ”­p}ùdŽrüÛ’Ù"×@Ú\gJmƒycÈ^oeé##ŸbXÓ<ñ+¢¦Í3 ™D?~LR´g³F2Ûm'm£ìfƭƆy†ƒZ´3ÙøŠ|1gXIÁkɮֹϘñuL.û,+co'÷¶kl{¾Ï¨©›S1‰·¾‹9Û<Ñ0Vdã-ZÚÜm­”±2#ót꘴œ+It¼lÂfiAüZÇoð[ê°TyUÇ‹x‰†w:®ÝึºÓØuYéx¿“@=‚ø½Ž?à”Úžg2i:PÇ+ØBmº [ÇŸðgòî2ræ6^ü¯ê8[éÒƒõ_VÌdÓ†¥ã}¸TÇkø+9,éj‘Û×uü ;ƒø»Žà%ÿÄ«U6ƒLÿä²:þ%Þ¼±]Ç¿ñÿÅÇ&¼:ÞÄ[Ç&NnuM‹J7E]W/NÄyÐ…ü''úXjQ'ùZbºðHGMEs†=`¦[bƒL¾ûɴĪSZ;Í’¿qNc»,ÚQ›©%V(öæ2v,*3¸%æ¸>U‰ÜãìXœ¤Õ‰ÞÖöåÔ§·5ª /v20‰^K^é¼"º{‡×„*Öf´5íÀ©ûhþ.—~`&ˆ $ÑØ?IÒ‘,Ø%U"À¬&pMr(Úž—6o3J—!R%ÄÌË ”àÕB×Å$19(¦èb*ÞÐÅ"L̃#-@—N5 ™0;JZΓÆÐ!ê|€»¤˜’³$F,ou=0ŸD*KǧR(cÈNšx8˜Ç* §LœÄÉ÷˜£ßÿAÕÇî9 È'­¼XÙ<=—ÙêuQ+ ¢9±®µ§hå£f__4eš[3F!šÉGw°_D{-s;›NÔ6£¶µ#Z´²QÕ;¯Ä².²˜.Y´”YäÇÁ¹>€ ‹6‘ŒXFŸ,Ÿ2}KÎo9‰s4ÖºÂéÔQÎß­‰x²Õ‘:Sv’šJåÉ®Zå\·UÎ¥½Û“Vz®;´ÎQͰ¦Ò|fÑßeApáåÞÁ"/uüöµc 'N¨{³[ªÁàŽ¼ê6Ï9üÔÓI².i18[fÕ:*ÏÊLf9ÄjÇR¬í=¯¥æ9›Çó…«Ÿ^0ì¥6ùõm΂Ù$WàÌ÷C(SÎLê‘5òýö€znqÒM±T‰Œá[[É"ù@Jù´@Ó„Lvç-?º®}¼kÍ6KýhÖÄ*G8ï‰.÷µ¹¾«C¹'Ÿ.AØj êÍfyÛy|3ù´1´¶ïm,¤/ü™{¸ò ãQÅ@;/NÉÒ{á§Å´ `Ê”§,ƒVåhª4ô“c{Z:dóx™B457õžŒÿTh5k´nµŒCS¥ü‡Ý4²“3ei*ÅL2ÒËé„r¨”fJ;e1IèÚÑ·’;WäóùàÂ8£Ù!+'‘ ÌôHÉklµ/hü@²°Æ´ŒY#ÇБKµ|EºÇƒ_n®ùNUŽÉáÃUe™îØLÁmFÚ-´öôJË̵©¶)pÔÛ!¨ˆNê/7õnœ¢âÎ÷Mjk•L8ž? 7òw§‡ÿùÖƒü÷.œÍoB>ù=‡§ÓˆÁyŒPý^ˆzï£ð<¬¨Î•0Eƒ'"Éî`¢)®B>‰!¹´r•¸ú†½ðÌ¡ ~ÌU¦;X.¹ëC?9 pïãšá—¯CG7±^j ìjðŽÀçAgCØ?‚€‹} á ³ó7„5gˆøöÁŒøÂUÃ݆™ >‡¨)\ÖG0É‹=X×´D™¬Pô¦L/"hªñïÃ̈GìÆÔ¦ˆ?pIk‰V8Õ`š£v.ÃT~çCÄq*ŽÆBÌÂ"4 ™þµb5NG'17¢¾XŽ!¬ÀåX‰ëqnå­ôÏ*ÇÞ²v!‹œòú.äaRš†0ˆóé™0®€Åˆú(í"¸óS¦›»iŠô£;yã—QªohFÍã¨Ý´Óe¨f cf8ÂOý¦GàÙì;—ñÆ‘Ã8ª³‘Î9Zºº1BG3ÖÚéŠÛ™”Ò…FtÓÂZ¸^Y0ß‘T¶ µlA«kA#5ßF½¤«ÂveÁ€Êã?DÜ%ͽ7ªQì&GóÆð±#8΃¥{8:Œãw#èÛŸ› oˆzÇÎÚƒàbŸèlÁ;­`ôNƬˆÏµ><›V7*>#¨ó@:b?4hMO£†õŠ"ÜÀexn”–ºÌ¤˜&¡Èæ–ÉF1âFLbœTãdÂǼMÄ:E`/æcAEÄSGŽ‹xš#s‘”ydEŒÅF³Ä˃°ä—yÝ"p6ÈŸkObÉâ@‰útI-ëa©t×’.Žò^ÆÛH@ú£Mî‚zfÏ[÷БË®p–•Îr†³¬r–vgYÍ¥aï”Ê„xîpÎkJçÎìZ+c鈵Ή˙Žôrx»FµAH;Œî‡™h³1©x.ótzÎäê$ù½¨çW–ÒL&d6º-o“tÛÖB&í"&êR&ø*¦¸É¿ ó–àeLã{˜ÆÏðô*.Gâ"‘ÀÅb .}|õâRq.»p…xWЧp•ثų¸F€xP1: Êm'âÚ¢c£q¶r—+.WüPK´à\Ĥ ‘PKk€Ó8)WEB-INF/classes/com/acme/TestFilter.class¥V[S[Uþvr ɑKJ[S°¥ÖÖ„@c-^j)E*´±”‹TŠHCrH†$œœÐ ¿D}ë /¾tFà 3Š/vÆgŸý þ/ß> B:N&{í³ÖÚßþöZk¯s~ùëû\ÃtaЋÛjF'î¨ö@ÁûnŒxq¨õÀ19Ü“šû*¢^høÐŒã¡Š Ú0©bÊݸ.å´þHÎfäðÈ‹qß‹YW”Š•2ò§£ñìJ8_ÑÃÓzÞºk¤-Ý$¶"¡.jH”ÈaÉHÈ]µ¥®Fþž‘b\ÏYF6“Wñ)›È–=æj·ªœwR_-ÙÀqÖ|Ž`z­¹²o*fdlš®µXºÀcŸ²ýÂéX&c “öiÕÕ)Ë42I«}{Y'Íf™Ã±9ÙãÈ™BŒÝ ŒI*.ù t6 /МM'*ô…©b„ÜÍÌ®3 SÙ‚×¹B¦~?…W%¢†n\TñDC ‹Îã‚À¥FxdÆr9ÝÔG‚ØVN…®a Pû‘øÉ]R ,kø iˇ·HYV.<Êáð^VÀ³+O¹§Š¬†VzÿÕÚ*Ïn°rÎÖ¦ìNÁH'¤9nSÄòXÓðEëúð9‹¡Ní ´íÃ/.ëq¦½£^~X ucY-qn`CÙðØøí¹ã¯ã›Ô­Ã7] ;<©x’Õà4ð߯ӮFvÞj Y æbÁba] ½ÁhmœdÛŒÉÛæ62ÖL¹bٛƈ—?„÷z¼£p©…D& º¹¾wA;ÁzW´­VÇKbdzq|‰M®}²ê©m9Ç”›Í¤I–\†×¢ï„`ªAÙR±|ªÜ›»žFžVv|ýüT+ÂløýÿipùÞë‚À+ü;dÛà‹QáœÝ„ã«| S JWÏ&ÄsN¸Ä±ÉV¾ÆøB´pW(™sè%S:(½=¡-8¾ƒsÂc›®R†m˜3e× ŒœÑC¸P…S/ÿ}ô·¡Å êš)"¢„".¿ë'(_¢ÍïÚR‚+âÚøû¯i ª;pG¿ò-ÛpÏ*›hÞ@»œúéêQžPi¢³Ÿî^'B;жð’@Dõ«?ÃïW}-%´~Öm´ÍJë&Ú£=ß¹ ßì&Nù:J8íw•p¦„³%¼,qüNô…z·pŽxDVläFk{Íú#îÿ²Àïþñ9CÒ‰gØe vñ›-Ë!¾Ç¯à]8qƒ‹ ôd~†0ÊìLbóü°Ió©Hï¯%ÎC|ƒ üJë.ç¿cB80e§h’_B£xÌ„½A¼y®¾†7¡Ê4쥳ëè—ÁÙ[x[&•³wlNªop­ÂÕ’O?«&dW“ƒÌd‚oV /d׎ÝÜ¢Õ¢{ÏöºõPKmí€Ý PKk€Ó8#WEB-INF/classes/com/acme/Dump.class¥| `”Åõø{ov³“Ý/›ÍÀ†Ã%†PCH á †ÃÀˆ K²$+I6în8<ª(Öû>ñ>P<+(&DPð J½…ªÔR¯ªµj­VÛÚVþo¾ïK²›lýý|s½kÞ¼yóæ{~úY'ر÷«ÏïìX‡ï:ð=|ßñ€Äß«ôþÁRÁÔáAþ?TÅ$~¬ÒOø)þIâg ñs‰_¨ôϪòKõù‹Ä¯ìø5~cãÙa$þU5}kÿÙð;~o‡aøw‰?ØñGü‡ÿ‰ÿRD~’x¡ ÿmÃÿØab<õA‰lÄtòñ$a' YYJc$²I¼($¥«‚]},2Ù%náÎf§ r2wÊ”¸U⟔¸ÍÎ.U›%É­R¼äSŸê3P}Ùa(ù%e+Bƒ•$CÔg¨*³ÓQ°Ópʱщm’޶ÓH%éI¹ŠähõÉ“¸ÝFùÛ%بPÕ‘Td‡+ŸVå±w(ý|.iœ¤ñ6:VÑ`§‰4Iµg‡Z:^âÍ’N°Q±VÑdI%*"©T¥¿Pp¿”4UÉ6MR™J§Kš¡Ò™’fÙa( £Ù’Ê%ͱÃ:QR…æJšg‡óTi¾¤*{’*%-´ÃEª¶JÒ"I‹%î²Ñl‡+©ZÉŠ–Úá:UÒiª|º¤e’–K JZ!©F F-…$­”T'©^U…Õœ!i•*4HjTi“¤ˆJ›íX‰ŸH:Sć’¢ª2&).©EeWKZ£Òµ’Ö)8KÒÙª|ޤsUú+Iç©ô|IëUz¤ UºAÒE*ýµ¤‹Uz‰¤KUz™¤ËUz…¤+Uz•¤«Uz¤kUz¤ëUzƒ¤Uz“¤›Uz‹¤*½UÒm’nWÙ;$ݩһ”\w«Ü=º—î“´I¥÷Kz@Un¶Ñƒ*}HÒÃ’‘ô¨*=¦>¿‘ô¸¤-’¶JzBÒ“ªn›Þ§Ô§U[ÙvIlJO«¦vÚIϨ~–‡Sim—¤Ýªå9IÏ+Å¿ éEI/©l‡úì‘ô²šêÃ…WTúœúØ$í•ô[I¯JzMͰו ¾!éM•¾¥¬ oKzGAsvŸ¤ý’~§ZŸ’ô®Þ³£Þ·û—ô¾¤ßKú@Ò$”ôGI<–IúXI¡<}*éO’>“ÄVÿ…¤?KúRÒ_$}%ékIßHú«¤o%ýMÒw’¾—ôwI?HúQÒ?$ýSÒ¿$ý$éß’þ#é¿’~–tˆ *S$ñy)ØeB ‹ì0®iRØT*¥H—Â.…C MŠ )œRdJáâÞˆ,›p+#ܯ õñÚðU)|\)¨Ï@)Ù…_d«Ï`V~ž‚õ/†H1TŠavq”H1\Š)FHq´MŒ´‰Qi%á¦p¼AäŽ^Œ`)‹Ô†2+ÂM¡y-+BѪàŠ®qWDj‚ ‹ƒÑ°*›•–x}8¦ k"EÁšÆPÑô–ÆæÉÜ ˆ"r+ή®-Š…¢«Bñ¢…FZiZ®›¬¦Õèy„¡ý‚"Øg¬­ 5ÇÑ&æ˜VY‰1‡Êžêãñæ¢Ùü1ñ+Cg¶„bñɇ‹53å.“-j !s„ÔdÔ¤€px‘L^ÖÚȬóAîÎáFèèE Á¦º¢ò¦x(miއj»ºÏh¾Äz•7µUáèŠH´®¨1¯®+j‰‡Š‚g°`e PŒ•Æ¢·42gÉÃØÌrÖk‰5‡šjY¤0ÿ”óʯ`;YѲ–Nãl¤…e`ŽÍo‰7·ÄÆ£¡`#Ó¥x}²¨UõÑÈe9Ý]`¬òù‰] Ðx„á‰*hhÕƃñP" £AdhYS°Q7Ïn  ܤLYPBC4´²!T/š5ÔNÖm/²*ÌØƒSX™Þ¨Dª_­>,×@ƒ˜®ÉM¬³h§-†i«ƒ lž¥©¢0Š««ç•¡`m(Êõ65n¡¦¸Òkëµ!Äp6£ƒÊ2êu%—†,íWZͤµ,¾®™% Ӌ*<Š®A–z–uÛ126p‡Øp‡X”:5Ž–Ú`œIYW°T«XœÚhx…î¬+Zb €§èÓ~e„«˜Ÿ²jžµá(kœ«ØŒ#Q¦ÇÖ³2Uý©Fu(ªiR¥ãf¶5i@„ØÜ,ͺu›ÊÖc|I4×µfU"rÇœu¡¸Ùr¿7wt*íÛj¹‹ÑÈ:–‚1U²QO>R÷‘’ h‰*ã£aTnØügp×ScZƒÑhp]31X1žgƒzáMÓ£Æ(’lð]ˆÖ¦H<ØS“iJ9ì #-ÑšÐ̰Étå¼Ç(('ý6㙞«mâMä⋚/²öb5Ñps\y"ŸçDo1à lÖš(…61FE s¬ÇìŠj™E‘² _Ámb¼&ŽXòEU3 ×ÄD½jlޝÓÄ$|[Ç ®>ÏàêXC(ÔlÅš˜,J4üJLÑD©8ž­ºÉzNá/M´^s¡ €µ ~¡{EÝ]†lâ—š˜*¦ÙD™†‰éš˜!fò|Nrp<¥yALZæžOÌò¦¦P´¬!‹…bŠö,õ™­‰rÕ¹(ìl,*cs4q¢¨P œ«‰yb¾M,ÐÄI¢R E•’cІ[D…M,ÒÄb‘¯‰%Ja'‹jMœ"–²Î㡵ñ¢æ†`¸I§Š 6qš&NW0§‹eê³\Ãm<Ú"¨ÄHïî½X¡hÔˆZM„ÄJMÔ‰z›kâ ±Ê&4Ñ(’ÛåÝÙv«f—/ ,œ=QÅôÀ¼ùUi3 g̘7Ü&"šhVcl7Z—q+ÏL³]gЍ†mJOŠõá(}ÈÆ˜C6F÷*cb¼6´Ä–Õè¡ËQ‡Y:4ìTìóæW”˜Ã‡k¢EQº®¨úx#{?›턊:GW÷øF&V‹56±VëÄYš8[œ£‰sůº<4û1ŸþY¸r~«Cј.ËyŠó £1°2i ¨0Q5q¾˜ ‰õâv6E!æy¡¨FQR4{\iÇ^%s Vii¨ ¬tÇ«·jbƒ¸ˆˆ±Æjâ×âb卨“T™¥¸Äh×]=NUO0ªÙür’;±¨‰‹á5¾ ÃщËðVF;¶¨»êXEîR„ìîñ¨lá‰Ô˜ˆo‰ëa–%mQKIMCDPvPšØ£%LÝdçßIµGÌa4*¾—©Ïå›t‚M3•n+xá(Q£]j/Y©]WjW“û? ¤~\©š{Ó!”q…%)‰«îÖ„kãõSrN˜82‡ãfkI<ªZ)‰×‚ Ầ)9Ñp]}<§”W™¹¡x}¤¶xTÓŠXóä’¢x=cXJâµ<>W²[Ä·ðmE¢ˆk¸ßœFKMzcRÒ+3÷ }UN$«‰«ØKà+‚—â‚þP«8,HF¼Z9õü”8æòÇke2Ê5G€R‘Œr­¸®_ÉÖÆ“»Ô¸9,=Á5q½’jtJ¬‚ƒdúE}ÂVEƒM±öµÉ,nP,R‹uRK(ºÎX“qnT8)Ì#+ç]R8Ø >VÜÔxOŽˆ’ÁoVkPJðJ=¬ïÑ[x …c ˆ¿'ÂÆ>”¢¢‘x¤&ÒCþ[û讹šúPcë»­oSRŠÎ öD¹ýp( xË“Œr‡¨@ÈK‰¢»õÞLîTLúÁ˜Z[MƸë0½¥º[IÕ×4jŒÄC‹Øý&£ÜÓßÌS(½åº÷p(³y+ŒrßáPz÷e“ê˱ý¹„PíÂPL-{å=Lì~Å-7¥M†jZ¢¡ÜÑÉð(“— ^髼©2ÒÊ Ö6†›F'Ïw«^©‰ÍjMm¢Æ"ŸÌïAñ+5-ÒÄÃâ›xT) RHÜE –Lá7*Vš‘ßZÏ ð܉5¹8>§´dE¸Ž?Ñ¢ÒùñúP40»ªjA`¶¾CŒ—é­±ÇÅ#IQ§ás4±Elå}Ao¡8ôLVÑ bŽ[`A0ÊÓ#ÞK'Ä#šxRlã¥1°Xßø&óqª…nÞ¢ŠŠáæ‡fœ– T|„Â1R ž­šhSû‹íʆ†››Â5ú¦¼hmáš5k WF¢…-QÞÆªðcsOcKC<܌Ƌô6c_;«—«ÍR<ÒÜ·HúŠš(‡‘ªÓ%ÍÑ‹×.ž¶‰šØ)žQ!dzŽ’"Õdê㈩qê-ñžjØ¥,â¨^#ŸÔ‡RµãÚ«üt ʹ¹ÜÔbÕ—%ìV–ðœŠeŽ”ª¹æ÷CõÈÕÓI+µzŒ³9}Ÿ‹0éIÎâWšXÅžB9I$K{O3u:FE3j‡—;zŒîø ¹cÆŒéáÞ/hâEñÂü#"¥g+"Ê–v‡X‰pZo²Æöt »Ô¨ õ’IÝÐà‘3A˜Ö_lfÒ;,§ñ鵊z³KêÇw™û’(Ïg¶ ÀÇ«F*¨`YaGtpc’ÐÄñ2oœú;ü2AU°Ãìôs„&Ý“eõl¢5ÊB¹úIÅh]&¦X1µª|^ bFUÕŒÊÀ¹S+*eS”WM­L¡‹Ê‚š®ƒ5¬ ´4…¦+Ê=µe\íØq£‹m[ov*ovÕÜ ÞÅ©½JSM(;*ØØ 7Ö²¢1Ü…=UçÝ…ºÐhdÞ¶}màܨ”][0aϾ›Ü7¡:§vº…æQ甜–øÊÂã»ûÌ!ÄÂ:‘VàgÆâÄ›LCB£9Gud`IDß4—ê+íÔ’"³ˆHj™6®ÀHÇ'€$#—%´ð 4Xwæqÿ»ÂLÌÜ”ºZ´ bþÔé=´uR*m±ÅLS¬ÐG Ë™ÿ7ƒ©‰4* O0™±ê840®••\ÙIEåÇåz¢Œ? ÊøD”Á‰ÚâŒÇTÐÔæÔÙ×qÆYS?5ŽÓ;|X”Õ‰8ÜbÊëë<ÕŠkN &14Ù*º—U³§£]ËlŸ’u‚$Šö?Øi¤„³¨#6MìUg`i1ýäa^‰ŠJ§Ô¥B ²2PÓåòǦ5ë+’>cœD"ê<ÈLy") &DÕYÒoÅ«*ØÒëX!³Y2½Æá;ƒé‡N%EÆ”F‹Ô©§:|›Ð}ˆfÇMì®™hÔLê®á¬–x\Åapò!)Äš`´vŒy«¹¬%ÖÄëj3 õƒ&ÞPÑÉ› íjëó–ú(Ï|Ú›xGûÄ~uþù;uñÕÒÐÀ`£xeÖ—!›xWï‰÷¹®„›G5è·JJí£êT6#é »×!|ÏuœW—#Zè9´N8æáR%ï9ŠÒE)]I:ø”›òžX>ü%ö–æf@È4õÝ}¾ìz Ðãæîˆ®Ïsetùîr×™Ÿþà‚kŠs{<ž˜s¤7’¬š‰Z«lijêRš5*…¸zöŠýF}0Vo<ó`Øô‡ðÀöcyÊ$ºvV‡¿[캌Ìê®›‰4„‚J U•‹fð¼¢WÛdÝr“‚QŠAZœÄI…íuÊ0¥n‡åêNÝëqnάôÖ.±Rê)†9%^0°3êË%ôxûàŒ%¸ó|KuaÁã¤Öœæ.¦?=á´\Ÿg™Í꾃'_ͪ*ž¥êyO—Ø’°’?#i×óÆÛ¨U,RníüIà M“Õ¬lY3ï³}©,CÑM‰Ì¸ œÑk”¦ú·Œieö¨bÓZSÞÄܤzܵ.ë~ØQ`eê*lh2ü˜q–vX»Jð‘鬾Π§bôz†Á´ w¸0|–&ÆÒCÌÃ;ùžRöÑÄ3µN-…‡{_Ð¥Õ_ã ²Û¸î0õÞÙ™äôÐÊ Û ZN„b¦³Ø¸«4 eF´Ì‚µµeæó™a)}¬ù"Eg¥{#Óv•~¦­‹‡ô%e´zG”Æ.-Øë1;ûÇó0¯ÿ!K^/¤ÖgT~nê—J©ßÓ mµ¾löª-ï´ãªÝMÏkº„0 Ód$Ý­õ(W d§xÁÒõü#ὋTdõº´2€n¤”—?¥?/ŸÞu½¤çÍ»#žŒ CfŒeÞú½6®tŒtß×$–è+³–xÓ’PT× E8#é$±l€w—g믻˾/奛^çsL¼,0ºÒ9a èO·êìݧþ ®5Å#1_Êv¼"ÏDC3Bjr.pmÜ,cix/¥¼˜ÁѼè6ëN&… Y‰žIÎX·Ø|Á–ÊMŽNùªÍ^×¹õ‹)_0ºÿ÷i6†6l@9›¡þJÓ?g'xÚÎkû®—rÎä·sìBŒ×Ï2ËðúYf¬ŸY‰a‹ÙQeIÎf½«g½!œ¹yz¯–“©PÙu®œÓ÷ 4©×•æÄMZ/íu û—>wÝóÒ£CÝEˆ†H¾ÍQQüTã9™ò§e¦2T0Ž™ †Ojä-B— â‰ÍëošÃ«¹Tp„ÛÓ N2š­)–1S}š™N1¥³/ïaxf}yÊUnp¯ÈÛdgõW¼Í zà4çˆVü#z2ñëõß"ITÏäø»ŠKEÀ»\N­ym€[Õ/™`ÓôʱØÈ_ÍÀ&ŒpŠêyC)äR þËÐyùm@ÝØv½v"Xa’Na€eRP¹(ƘRœó¦>Œó-¸Ú¤Z‚ÿØòò ZAô$;™…+ÑÉ °.²6\ƒkuam¸Ïb¬¸ÞbK˜ÅÙ,Žª C|ÓóÛÁ‚ÐÇ™V°ºÓZÁFwÁÈ‚ «Û =¯ìíàPš;ƒ?­àl‡L‚­ùnW;dä»Ýíà!&ã)È‚—ÛÁKPÐ>T ̦IÙí0pÚp/ jÜÙ®•í0˜ ³¼2çm·†U¶ÁQ»òÝ;7·Ãðy…5L¤r,Ù  ðí0a#ŒÉwm"ŽèÌ*¶;`dõU7œÇë˜6Èm…Ñ 8yÝ8y=pò œÇT»ÕÁúÓ EºVÆì©ùîq]N ùŒo‡ctB*FùÃÛa‚P*+ÌÓ•âõüD8IœWØ^¦uÜQP¸Žo‡Ôë­Å–|÷d#gÍw—¹´|÷Sœ¬Îìv(Ý 1Éæ·tÀ—~‹Nðc¿… N’~+¤ßª×9üV®Û V×øIé¾ô²Ø.&9|_ú½ë·û®±üco^~m•žºÒï»^o¯ÚàÀ͇ÞõÛ…+RÅæð Þ4; Ü¿l‡©>y'ÔùÒ-wÃP¿Ã'] šoé²+F¬¢iä¡Í듾ô{Àëwøí­P¦Jµ“äfp© á“­0]°´i‡¶ù­0߯jTFthS±æg3¹„϶¤Þ¼Õ0ñbé—Pä—îY­0{#ŒÜå­0Ç/Y '¶BE+ÌÝ óv§+«ò§f8ßPeº?½FùÓuÕ 3úä^Ð '¸+Ý Û¡J(»_Äk»{±ÁºPÌì:Æ1‰~»>‰ª¸óÅþ“ T‡ßÑ•JtF“ï®6ÍëITº îA(»XãòR.ŸÚ §)Âê£1õÓ ê¬  ´ÄÔ~M§³LÙÒr"ß±lnWqF?£‚̽B<¥@V˜»†=ÅmðK¿4ó.ÛrÖa±Óµ~g+„Š3 ü™Ø +wCm;ÔlO±S5Í,ØõzU¾;l°sæ»Ï0r™~güŸÙÅ;`UµßéÏlƒ†bW¾»±ÓÍø» ,v+4ù]îH+4øÙ!ÉD‘vù]p)·E[!¶Î30˟厷B Û”{µßÕ k6‚W¶{í˜Ç³u]œµË}¶Ù”±–T»Ïiƒsw¹Õ]w^µûü6X¿‹É_ “ ×]èw±ažÈbµÁ†];à¢j÷¯Ûàâ]îKòÝ—ê Ü—©r•šÚ—ýÎÂb·1jÅîÍ0´Ø³®`×seµ!·?£ ®jƒ«‹Ýþ¬È6¯©ösQçv­Ñæv_× ×srƒ‘Üh$7ÉÍzÒé”nQN‰•µ¡ nUþý6ÿÀ·É½påNdÕßÕÊÝ)ÙÜÓ/›{SâÜ×/Φ”8÷«µê~Ð6§êÑƒÆ — þ¡”lîW´GRâXúÅy4%Îcýâü&%ÎãýâlIÕÿªÿ[SÂ?‘ þɾᷥ‚ªoøÖTðm}ÃoOßÞ÷ø= ~Gßð;Sêô™~uúl*»ú%»S¡<×·Xϧ‚¡oøSÁ¿Ô¯H©PöôÍâåTð¯ô ¿7üoû†5ük ¾(%üë©àßè›þ›©àßêÛòÞî ï~§öQŸûSqøâðn<×½Ç~ßã÷´Ãû*=®›Â^Ôï{’Ø|è¥nœ š`š^¿×¤y¾Ê1Þn8XìË÷ûÚá¼ì ð0ÛOS9³}`­Nƪià÷™Sࣄ®&MÿÀ^“dó¡»6:§[¸ á>I}‰Âý_™ëâµ´—zçFo÷À¤ÃÐÿSâ8~¦z1ÿ€g-› ALèÈù{!x"ŸóÇ7Pê}êj€oàø^²nÈqó›þ¼[c64ö%klKàÐá.1‘âA}H3¨þrØ!c ¯R‹q‹±l³9 ì€sýÝ_s¬s+kc û=îò¯Ivÿ-'Y.Øi-Ä4þÆ4²ýÙŠÓwÕ“ü·Á`¿;o¬ö>|¯³gK9È[@†tû³[á勒èþh¨âLpi¹5*×§ñüSM__*øVMIecU4ù/öSOûÝØÍÿßœðÎì? ÜOí—û‡ýr7€›ÿkòNd{w7ÛŸ ¶¼i8”Ôóàÿ/o¦ÉGèê|¢·uQô vJ€”$ÁÊÿOÝwJ úVÿMù´A²ßïïÀ¿_í[ðèžìåóùª-µ“|wBa‚ ÓÕjëÓ­xF‚|~o+ÎÜ|è %Ù,½¦g«c –››yŸÚû{pNÂæßƒ'šNµû÷`…Úþ{pnwíy\;Ol'¬‚«á:¢§7ÀPxžƒa(½Jûè]*„ð ?ÌëÅâjX"öŠýâ=8E_˜å¯a‰eº¥Ér& µ^c½Åzœâ 9¯sÞK²nÊz&k7׿å]ì­fúúypÚø(L…ÁP%0¦À,˜å°N„j¨€e0–siTÁXçÁb¸–°ŒËYÚj¸–²´§Á y'Ô°Ôuð8Ô³ì,ýð4ÀëÐ C¾\„àbÌKplÂåðž›ñrÞ;_áõð(ÞÎÛÕa+n…'p'lÃØŽoòÞì<ŸÂØIð,yaÂn:ž£)ð"/Ñ"è S¹¼^¦zx…ša/­…ßÒ¹ð]oÐÍð&ÝoÓ&Ž·ýô¼O»à= =˾ Ó>ø‚5þ)½ŸÑAøœ>‚¯é3ø†þßÒWðý~~âÑø ?‹‘(DZD ¦‰Yh'¡K0CÑ)šÐ%Öa–X^qúÅÕ8@\‹Ùâ:&nÇ£Ä6.vaŽØ‹#Å~,ïá1âæ‹?a¡ø’Ëűâ[œ ~‰N²¸ñxË<Á2‹-#q²¥K,±Ô2§Ya™eòøãË™8ÓÃÙ–µXnYs-—ã<Ë8ßrždy+-m¸Ð²«,¯ã"ËïðdËA¬¶|K-?à©–Cxš5O·fã2ëѸÜ:ƒÖãq…uÖX+°Öº CÖ0Ö[×aØz!®²^‰ÖkðLë-¸ÚzƬw`‹õ)\c}×ZßÂs¬ïá¹Ö?⯬ŸáyÖ¯ñ|ëßq}Z6^6/LËÅ isñ¢´*üuÚR¼8m=^’v ^šv5^–ö^ž¶¯H{¯Lû ¯Jû¯Nû ¯± Ákm#ð:[^o[€7Ø–à¶Óñ&Û¼Ùv9Þb»7Ú¶ã­¶]x›­o·}…wؾǻl?áÝrÞ#Gà½2I.Äûå)ø€<7Ë ñAy>$Ň哸¨|“àoä'ø¸ü·¤k¸•½ÄéÙødú/q[ú,|*}¶¦Ç°-ý,Üž¾ÛÓïçÓÆé[qgú;øLú|6ý#ÜeOÃÝö |ÎîÅçí“ðû|Ñ>_²¯Ä{#î±ÇñeûMøŠýÜkß„¿µwà«ö×ð5û>|Ýþ#¾aÿ/¾é°à[ŽQøŽ£÷9&à~ÇÉø®c¾çX‰ï;.Áß;®Á·âAÇ=øGǃø¡ãuüر?u|€r|ŠŸ;¾Á?;~¿hüJsâ7Z6þUŽßjeø7-„ßiõø½¶ Тø£¶ÿ¡­Çj—ãOÚÍøoíNü¶ÿ«}?kßá!í„ÚÏDydÍG¶ŒJÏ(#{F„7pùVrfÜA®ŒM”•ñ¹3ž$OÆ äËØK3Þ¢A?’ß9˜<Îá4Ä9š†:§Ñpg9å8Ðç:Úy:t†(×ÙHyγ(ßyuÞH…Λ©Èyw>H“œÓqÎV:Þù,à|™&;÷Q‰ó÷4Åù/*ÍÌ¥i™ET–9‰¦g–Ќ̙4+³’fgVSyæš“yÍÍ|€æe>Fó3·Ó‚Ìç©2óuZ˜¹Ÿª2¿§E®ì:†ª]EtŠ«˜–º¦Ói®tºk -sµÐr×fªu=A!×.ªsuP½ë3:Ãõ5­rý@ YÙÔ”5œ"Y£©9ë$ŠfL±¬åϺ˜Vg]Ek²n¢µYÏк¬霬/輬oéü¬ïi}ÖtAÖ¿iƒ{4]äG¿v—ÒÅî™t‰{!]殦+ÝAºÊ¦«ÝgÒ5îut­{=]ç¾”®w_K7¸7Òî{è&÷^ºÙý6Ýâ>@ÝÓmî/é÷wt§g0ÝåAw{òéϱt¯g2Ýç)£Mžé~ÏBzÀ³”6{jè!Ï*zØs=â¹õl¢Ç<Òo<ÛèqÏNÚêy‘žð|MOz~ mžÿÒS^+µz3h»×GíÞRzÚ;“vxçÑNïbzÁ[M»½Kéyo˜:¼-ô²÷,zÅ»žözo¤×¼wÓëÞûéMïcô–÷YzÇ{öy¿ ÷¼ßÒïô÷':è³Ò}éC_}ä+¤}ÇÓ'¾2ú\Ý[²?žÃëÑ <ÏÁ«â¯x¼¥sî|Î=n\pºoÀ‹* ^¼¸AÏ]/R9šøk¼ìù¥Ž¡ñó^Âu’Wš]x)çÒy½iÇËÏΫË9x^ ^ìx^ éâZƽ†ë¾äܵœËÀÅu×&þj¶j–EàÇëñpZ–A&Þˆ7A¦%N¯Óò(äáÍx ¸,?@\ç‘e½ƒû«¨x´l872î@͵x+Þ?Á™x;×ù2&ÀJ½µïxU½ï„<‡ÓÌÖ½p’Nyï-VpÎF‰wáÝí¼™û¡äËv†  ïÁ{as ŒÃûÎïÜU•ÌJ˜kæ^‡J#çZKŒ\Öó0LïG¶ãÙ›X>ãSÅû9çÍx2í>|7Ãçè´B|PõÃù,¯që ×b>Ìu~ž5øÇ'Ù<+–ãc,Á`ïRSCïzA5¾ï6˜€¿áVŸ÷1˜Œ³Ì^u/Ýy§Í9óN›sÆöVÏõ¸…y|ÓÇ­œ³à쿍¿©g9>ɹ4Ït܆Oþî^€­\'E‘Û‡mœKÁ¬Op;çìâö¬±sñSÖ|šsšeHV.îà\†årW;îÔGúF×ãø ç2-]+ñYι¬Wf¶á.ÎeY¯É܆»ñ9p{ïæÈèy®óô¸}_4ߌ1ßX<8Kò“ú*áÉÅÔÂp|©ë½B¾z‚ ~z¼U ïÑD$õËY&b- ¢ž dst½@?ìà ûÜ‚=`7nYæt‹â gÿôOÈ¢Á ú)áÁAv׃ƒlsp2 _æ.à+¸×àˆ¯24Óy{x`¶{æ“6Âó;°²šc˜ £¦ªÝ Õy»q1ÿ›+J‡<{/Lz'8XÔ%­xò’ü‚NH^t®'C[±ZmN1`†ŽWçœÝ pó¡¼G{`KÞv\:…I¹f&QÌ;ŠyC·ã©‰4w4[ñ´-ù­xúîaœû8$?›Ce•¾ï詡ɳxð•Ò,!MXÁ%l0HH)ìP(0QdÀ  SE&,.Þ dÁi !áfn_-|p6«ç‹l¸X ËÅP¸^ ƒ{ÅQðÀãb8´‰x‘Û÷Š£á ‘ ûDìúˆÍÁ,ÝU(„yø[‚ `¶Yw>Ìçét1× ‚6| _çñÜÏã¥&ª²¥øðÊ2Þ·M[Š1žzŠ’Ÿ¿l\¶…U¶ÜƒÁí¸¢‚³5¬5³!®Ô³ÝÆ•Í*1žUr,ÏÈ àa˜˜£Åq eò»Œ,Ÿ×‰XÂwtûðgÝD F™ÿ/l¾‘ü?PK£é ÄË'˜VPKk€Ó8*WEB-INF/classes/com/acme/TagListener.class•”]SÓ@†Oh!ZJEê·( *‚Ì`ÑÁ™ú1-7ÞlÓÓ¤&›ê•Wþ¯œñÂàr±—€˜†{!¢@#ÞˆÌP–€˜…û*$âÈÓˆbŽnðÑàó4Â' tE¾& U‘Eñ@,шïâA¨øPK£ä¦ìË÷ PKk€Ó81WEB-INF/classes/com/acme/ChatFilter$Message.classRÛnÓ@=ë8qbLSÒ;m „R÷bÊ-\Ò@ˆ„„Tà¡U%òRmÜ%u娕ã òO<€D[ÀG!fm‹¢¶ªx™™Û93³¿~ÿ `-£0 (¢&…%Å¢†%Y˜y,K½’‡-õsgÿzöäO×ðÀÂY,¤ñ&Þ3pÝÄ¢…÷ñ‰M|daE i,èÉ ›X²`ã¦E—OLÜÒ“Û–qÇDÉÄŠ^ÿÔÂgX5p×Àç£èå*LyÇÝuß šNUE^Ð,r÷†xjI`$›ÛH.‡ )p¼ìr­Ûڒц»åKíÖ]Ó<=,&Õ¶×/×ÖãÖ[Ò¹ã*¹°áêÈéŽT+ƒÔ§³/çÖéR»®ße T#¤}ú\•l  œï;v•ç7ÂG2ð~–sõ0Pr.Ƹ=§#£]_*g§ÓvîvÚËý}B͇‘ÛlÉ€ØËC°Êm§]V8úX¥½ºl+/ :Ê*\ª†Ý¨.W<]ÿØa¹Wu@çqÁÆÎ œ‹YëÔNÕkµ}©‘‡j$ý0hX³±Ž/N•J¥Éµ-g&…J¥RxÌkÓÚ:ì%cG:èX:Ï—¯TG@´ëW6ªØ œ —¡¾Æ¦{6¾Aª·¨Î6ù<–ndã>¾5ðïñƒÀÉ—ŽT ÷JÙú5Tí¶Ûa¤Ïcèq<דM3÷Bguý«'^lv¨ü©ëúšh}kGÖU1w_`*[þ·6ÅܰNŸ҃ûr¬)ÕQïLfs¯ë®tÀw¬=Ï3;4ÿ…ÿ !`óºÜRou•|-ÛÃòÉÖê³½6Ø4Ù¡T‡6÷ÔÿÁQ~/Øe]<°#Ù½ÈS¼¹M¼ÃÏÍY~Éÿl|Ž#´y8¾Å™Ã·ÞKå÷!~£‘ÀEŽ£ñâÞæh÷˜d0è]\8/ÐèüìHy[ñj†>ãq„3}Ô ‚¶¦HE'ž&‘Dë)’Ä?`¤–IæG¢‡Ô/03£¿"•1öa ]Û‡ÕÃåصÙÌØ>ŽUò=_›Ëœ¸ÒÃÉ2s™ñçÖ©EÈéBr")z8sÄò2?ÛšÛ4…™'ŸEÊr“|VɧJÞ5ò}@ƺ‚ë}nƒ ¦Q¤·®`žÏ ²Œ¸ˆYä§¼5´¯°ž¹¸Ö®Æ2ÏÇ™¯ý PKÚr8Ge[PKk€Ó8%WEB-INF/classes/com/acme/Dump$2.classT]sÛT=7v"ÇVëÔÁ@iiSHZdžª …Ƥ ŽÛ&8u‰MxVä;±Š, é*þ 3| <òÜRH^úÂb8WÓ4¥$Öxï½»gwÏjW÷¯¿þ`£„+ZÌi1ŸÇ$ÞÈãM¼eàí<Æpµ€wð®k9,0Žºïå°˜ÇuÜÐÆ%ïç1«– 4ÌmÛ›v‚AèI%Ī@A«"ùi"c%p©uÏÞ¶w¬XFÛÄX}¥Bë6Eg¨XÆTß§¯[ hÙÎ@ZËÉ Ô¦ºë»jQàZåmõ˜ág7² 'ux×—w’Á¦Œºö¦GM©8¶·aG®>ï+³šŽXãŠï˨áÙq,©9õ$…éyÌD‰OYÑi§RZ–gû[ÖŠ¯d%¡’½æŽ#Cå>]r‘ŒÃÀ‰®YÄI¯ò0°X+íƒÑò ‰yÓÕÔÇ5¯ËÈj›¾ã±ëo­IÕznš¸…Û&Nã%exu‰Ì3=ðm_Óú% øŠˆoXÏ·$ò,|OüOôøuüˆø9%]E–Ø,.âÉžåSÁ,wõTWMKZÚ/)ƒZZøkxk—õîòD•þþPK9nlZ?PKk€Ó8%WEB-INF/classes/com/acme/Dump$1.classS[oQþ,lY¶BQªT¬¨ÔRЮx·}¨UKP }_–“²u9‹{!5ÆË¿ñ¹‰x{ðø£Œs’Ú>(›ìÌ9s¾™ùÎÌœ_¿üPÇF )”¥X‘â² «*XSQÕD-+¸ªb]…¡âƒ62²ÇýpÀXƒ!=1¼¹0¬6÷Ì‘¹oøÜ9<0úA04ž‘hO ­ ð>C2èÛ~™"fš–;0LkÀÇá`(ØÂ2lTŽ5f ¿¶Ã lº=.ÃÛ‚¿]îuÌ®C–\ÓµLgÇôl¹ŸI‡ ú¶ÜÛtLßçdY8J¡\'‚q/$+2 #çRDËpL±kl‹€{^8 xokßâÃÀv¹hm7ô,þÄ–ÉR2Òºô!~[Âr\ß»ÏyÐw{*ê:®ã†Ž,tè˜×q9UÜÔq ·–ÿPlj¾«ãŠ”ãØ²‡þ/»{Ü¢ÖåM­PˆIYæx2$zîSNàVeÆNüæ]áó¨c‘êô=nö(ŸïpNy•JC"2CÏA;0­WÏ´ˆàÊL4h¦&3‹¹F]N#žÍÊꤩÀ‘¦’Ó»ˆÑŸÃIB¢Õ#Ä‘ ¯ÖÆ`ÕÒ±jA#^ý å ‚çI& „X$©GëäÞ³çž=ç9Ï9çnþú÷ç_ìÃ7ÍØ†Éº‘Sq!†0rB3%–‹bùH,—ZpWZpׄt=Fºi±|¬Âˆ¡9±Ì4!/öB ŸÃYsM0cˆ å)Ì é†8±TU”š¦]Mbb|ÞX0u—; ÷ô9Ï+ë§h™ô-†"Ó%£ÈÚ¥©n¥Y}ÒsÌÒ,6OÉИå.C›oPñLK7]oHDrøÍ w=†5‘&ýý¼N¶QoÎt“†øxÞ.êF¾ÈõÑ9Ã;aZw„ÁQ³dzà §Su-^–ÊFü½S ʨ] ì6›%>Q)Îp'gÌX2_;oXS†cŠç@©%Ë…%ƒ6V*qgÔ2\WPÐ]XÒ7¦ Ô*ïŠÏ©:˽ )mNõÖã—Þ â©úøcäbò™ÛÝ—†>ÏٖŰ+Õ¸(’Ÿ²4…BÖ/5y¨J‰º¥HçÒA„/ð5Àö†– -s†›­6S8Õ{™xv¸OT2µ®¹²FùEÅtl»(Šù¼1!¶­‚Ï£æòÒ³L\eҌ̋ç¹[¶K.ìOÛά^´oÆXòd¡ ³õú7†PfÒoŒw<ÂÏHÙäTê¯è“Ÿ´+NžÓ¡èÎ5ÆöŠÔ4¼‰·4ôà&CÇZ®#Žc,‰ÑÓ° »5lÇ ;‘аIŽžŠŠ†ÜÔð)5ìÇ ñ6ÃÖZJWL«Àé­%Ü¢LP3œ—~U Ï&ןညÛîஆÏqa[ƒBSò¤Ôð¾ÔðF4ÜYt½xpèfYCvvfžç)‡¯^‰RÙRÔ"­Ï_R¤¦Î®/?ˆ,lw£‘ êVD[)®yË!» \¦.#ˆõ†vƒ*àYÜ—ží«¨¬uc˜Ï‘ÉL†.Ê©÷àºIip%mDwYp¦;EP2Ö»‘bЖÒ±=u²¬?ŸªéŽˆ¡[!oqƒJ¼¬ˆHÐ7¯›>œ„DC“=-wêr¹S{mmb*è¹™~=H¡—¤"}`Úw¦û–ÁÒJÿ‚ð¥ÇP–I÷/#šX†úH:JÓº…BíE3Kc3ÓÑÉ2ØÁö¡ÎäŒ\¡: %:£÷„´Ož21QAhv& §„úC5@T(ÙéPó ‡LLbðò0Y ÇQ{¼˜Ð²ãˆ°Qéa‹oU…•@DàC8\H´È™º@ÞÁ‘z@šjäÈ…¤²ˆÀCx7ðe¾’‚‘?¡<¢=Ò·Šæ.’ØôšØVcX‹ÔE¾èF…Ê® ‰]E»†.v{ØôºÈÉjä$a~OF>†‘ òh@A§ˆøb[E ÃwP•PÂkh)¬£¥³JËqéH8ü–È}•I¯@›H÷¯àµ§21ÖGÖJ¶i`mí¯ÓB§m+hW~BGm£Í7(_ ­¬•dܴﻚRïã‰%#ë¢wûp"h¹“8 ú‡žUÚséKÙ?ÂÃáCJ\©¦ú=ú…WV±9„ߌôµo錬`ë ÞØ.„Î{Ã÷öà¿¿ý—ºè»Ýÿäá`´ÿIgô7Šª`YòŸÅ‡r÷3IS3€¹PXQ¶€­l=l ûÙ- Òó1vcì²ì®Ìî ¡ïA‡,S„æõ0Î_…˜?I^'ä媹çpç(¿ÅÏc¯lŠ0Ý ¤‰Ó~âï®14ÿPKkýÚ%ek PKk€Ó8+WEB-INF/classes/com/acme/CometServlet.classµV_SUÿ]²É&›U 1*”V(”¬TEJ¶ ´©)ÔP¢µÝ,×°L²7»Lý~}ó©Ïõ¡;cûàŒ¥ÂñÜͲ % Îh2sÿžs~çüÎ97ùãÏŸ0ƒ]C˜‹ãJóÈ%±€ۨà*®%qKbXVð>’±¢@ÁœØ¬ÆqCÞ”‘Âÿ<¿¯ ·„üÇB¤ ¶·e¬ÉXgˆ-˜–é.2DÒ“[ Ò²½Ãz ¦Å×¼z…;z¥F'ýÛÐk[ºcŠ}p(¹»f“a¨`ØuM7ê\[¶ëÜ-qg¿ÆÝC´Â«¦ÅPLöô}ýÖl_i»®ÛÐnÒÈù×oº¹Åš ÛjòœðUvÚJ §´Îw '»`1(+ ÞpMÚʸ#㢋[; ªa[®iyº¸c+ØNU«ÛŽ[Ñ¿Ñ<׬iúA,wH V¸ãØÑçp}çÿ §Lä)Ó 8e׬sÛ#š|ZM·ªZÞry•;9ŸÆ¦Wçä#=¥ÉÝC…ÒíY^äå ¦d{ŽÁWMQF}U“¦T¼ŽÑ™Õº±Ë³®]7t7kQE%lÈØT±…OU|†meŸã wU|‰{*î#¥"Q*oZM¯Ñ ñõwüœ„éUqNˆŸûÜl@¥ òû* ì¨àøJE£"Œ*Ã`×ö`ùgÖ(a>€ikùõÐÅcjt‡@‡_K¶]ã:IÅÍ•£%ÜQ ŒŸ*ËTîT×]×1+žKy›HwX+ѱUÍuœ¬Wö¸áú­Úëðº½Ï;t»è ÉÉ“;¨ÔÎY­rwùHÞûW{ÔÍÓõî…“¥fó½“ÿ®R[ÅÚMFVPx± Ç£‡Ë´Ü-½æqßb^4¸×lø”¾% ¤4uÎÓ ?ä¿û2˜è"ß F3£9:uöˆ=x“Ƙ8€·hTÛÆÍL´I å5DèK™þžiAŠà… …fh’à„Ѷl`G¬Îã‚o[ÅÛ#éq¹1Açéçšcâ÷/³½öaµíA&óbóRJjAføŠXŦŸ=„2~–Š>}DŠ™›$åILûsÛ¹âä–D+•€È™argŒ\y‡FáðÝ ´ÄJüüº>º>ÓÕõLèz> HžÊ\zŒÄËì¤Ii²ƒ9„C¹+Ä% § ±J³Ð?²}€äÓ—²8Ýa?Ú‡öã]ìKȆ!<'Í8ÍeŸý#¬„À+-¼Úƒ_Ñ;MI©èïHœÅ™‡H¤¢Ñÿm ÌÆc‡gÛi’)Mr¦u ¥Hw1Œ`Šx.Óí,ÕÑq…ÎsÄÛ–°ˆô¿ç6®a›þň()‚$Ý´S–¦˜4Jg”N’”ªË~•CÊ!宿‹÷î’ Q}èôn`°k¹¯â 9uX=¤‚õ…`}˜XixŸè÷Óña’™õ­~ðPKàëö~÷ PKk€Ó8)WEB-INF/classes/com/acme/HelloWorld.classUÙVÓPÝ·)%Z­8-e(Ž­qÀ´‚Žoµ½Ò¸Ò¦&©âùì .]~”Ë}ocQD ]=79ÙgŸ}Ï97ýñóËW“xžF?&•9“ÆœMaªçp^™ )\Lã.§PL¡¤.¯$Ñù|OÃÆU×TÔõnôa7 Ü2pÛÀž’ÓtB[ ž~,˜öjR Svšr®Ýx!ý¥Ê —žlÙ«VÜÇßQ÷‘3Ö@`o¹ê5¬Jµ!­éºÞÏwkE>VÔ¹|ùUåMeÅ ¤ÿÆ•¡µØY§½æKg¹¨ÒöTõµÀÑM¡é[+UÙ ¯˜a`Í{àL²°>I= [Ö MD± _·e·„-’K-Ëð;A§·É.ò#­%E¹ Ì $kÞÉT‚‘9i¹•æ²5Û ¥ï·[¡¬u7ÏB|àE i{´s‡h͇q„«PCN” ¶¹Æº0ò±µè´öždÌfØ×AE êj92 FrŽów‚øë,âüFadtñõ´†hÚ\Ö¥5˜î”kà4òDêd1&¦¿ÐMñ‘êínfŸ‘Œaô3zæÆ²Æ*RcÙ^mÓÊ®¢¯æ'ì|ìåDa»²»2(ÇrQË82‘ÂqôÑN Å› ΰÞg©nŠ:Îy‰X›˜"Wø½ªw1E%ØÁg£,†*êïýØÝýØÑ~2ì×âëvféMüPK®øXoSêPKk€Ó8&WEB-INF/classes/com/acme/DateTag.classTksÛD=뇔È"1n4ióhCëØm•„¶RJë4iSÜR°iIx*òƨؒG–ƒá×ðúf¨ÃøÎb¸»Rá()öhµ{÷ÞsÏÞ{VÿóÇŸ–Q×0;C¸;Œq”İ.†{*64lâ¾4lᡘ}$le4è¸#,5|Œ'*>Ñŧ**â]Õß©xÊ ´L;>ÃLù¹¹ov6÷öÜ7ž·[†oÖy×7ªf}!µëÖ~d¸t²_‰Ö]Ç'<òOø?1䤷Ñ0ºQñ=ÛHÊ-Û±ýÛ Éü"QH­»5Î0Z¶þ¸ÓÜå^ÕÜmpìZfã©éÙbSþwv[ìYnÓ0­&7î™>(·¹ÿ$<Ï|þô‰ÌÃõ#ÿ¹üâë*0Bð‘32,ž’#Z ‘Kµ^EH–u.w»d¸ññ™V4dö5 iÊR¥Œç·@à¥÷ÍF‡ê©ÕÜŠoz>Q6d‹L]‹·|ÛuÚ*ž1 ÕÜ §&È{‹zW’RÈÔÜ»{>÷‚•²çzM“¸  FÅn¶\thSî ]ð.±Šêg£MÕã n¶¯ŠÛñ,¾i‹¦ëa¯‰(ç1C\ï?ªê˜Æ9“xKÇYL1LœZÅç:¶±#—T|¡ãK|¥ãk|£ã[˜ÔÛñ톔”ŽU쪰tÔ°Äp&†°.˜ÌïÅÃv‹èF÷°ÃÔ,ÃåSD.•N«åzâ‚Æfé§`Xø?Z Dè€a,ýÀÍU¢j7ùŽëP2w´ÊÇɪ|<ŽÐ2íhàd>ÎK(2G 6«á¶ ì™g“²Hè±×’8üBPÔu-öLÓ§ ÐmøALè#Ô"w*i}_õL‹,C¾``ž>½ô]NÒCŠƒø‘èä›dHcLh“ÆYZ­"A3²À ¹ÄK$¥es4jôF¢ñ<ÍôÀp‘Þt*¼¼OžÂW)_"u„ Èˆ1=x„Ñb&2ú_ÂåÇk ]ø ©_`Æ#$Ò}y,Æ‘H’˜8Dª#’q%Ĺ!# {b2Áú WqMBXŠ£’Ä9{•ejÀYÁ;´'p®„õH¤_ `LGŠ‘1®Ó“"Ë znö1®†ɬ2r>’Œy—t€åAcj2`1ïõyüL6qâÒ!”mêoºõCå"Í“¿c¸-°fŠ‡Ð·ðF#=Œ&_”‹=¼yˆÜ6½Ï`ì/™m‰ê• ¹Ì@¥q£¤È)Ò“AŠZ&a¬P{oyÁqŽŽ8J W©;¢ÆY¬á–D*Åðþ E®‡WD)°ÿÈ*¸Ë$Å•H ”¾0oKÏÿPKÜà) PKk€Ó8)WEB-INF/classes/com/acme/ChatFilter.class½Y xe~ÿdwgv3=Ø&¥Ó3½Óli–¤¶–RIjhKJ (“ì$ÙºÙ »›¶©AEñAEÁ ))¡¶Å¢­â}£^ ‚"x+õýþÙLŽn¯ÇGáÉüÿüóýßñ~çÂo<ºÀ©j^çâîÎÃ=òøŒî¸'ÌãÏÊɽ%û |®a|^Nî7±]^0ñùø Y¿hâ¡vâaaÙkb—¬˜è“õQ»eý’pØS‚½Ø'´™ø²ýLÁãòøŠ‰¯ Ùåýk&¾nâ aÿ ô?/^bâ›| ß.ßM¾+¤ß“Ç÷åõ²û¡E0?–»?)Á“øi ~†§äñs!xÚÄ3ÂáòòK¿2ðë ‹ñ!{VvÏÉã·&ž7ð»–ã/Èú¢‰ß‹¦0ñ’‰—M¼"§ŒàR¼jàO^S­rۛ܌‚ÕJ¹™eI'›u³ Æ*7›uZ]…ps›“ˤÓí<µr³³Å‰uæÉØ*§£Ž÷%R‰Üb…âŠ9 eé¸+t‰”»ºS8¯wš’<‰®L7;ÉF'“÷üa ×– ײ•Íéö˜ÓÜîÆ–QÖ[Éœ›!V˜R¡¥n‹eÝÌ–¤›‹yËÒ©–DkHµZ(L<½Bdù¶f·#—H§²^§©q7K»ÌxÚ£U¸p¸ÐuÞºÖ½´“äuGúší [wøç¼mN"¥62…ÉGC2yžâB‚Í"BaÂQäS:=œ¥ù åÃèÚr¹ŽX=ë<Š:¦ÛœT<éø ¡^ºÙÙ¶ÖWé]L±¤“j­Ëe©Öº#œ”2Ót¦5ÖžÎäšœ./Æ ‹‰DÏ€ƒ…k Cín®-—ø:L* mïâÙÇ©‚Bìµ19V;íвe„ÅÓ+Ò‰”³ÂöŠaIóÿÄ'Òz%â+/Õ'Ê·^! =%ñôJ×Ùâzê‡âioȹۼ÷sÓɤB[A»þ'V„s‰v7Ý™[µNA­ †Y7÷ ÔÒÃ9Šy‡ƒ¿I$(ò™:è[C2é¶:Éu9'çú储¨v)KºB”’ÚÀ'—ôT‚ LE'éfˆ—ÚĽ»ÅMq?éšiC$’©-N2×5q€ûÒLÆéZ™Ðá™7]lÉ2ýÄÁ-nêlQw0gu¶´èxˆ8ÍÍTqÆÜ¹s+ ëÿÞEÛæÊãTyÌ“Ç|yœFñëÒ™f—L¤± ð;EøXx®µ°XxÞ®pÒ€"õN¶ÊX8âBòW\ 0ó¸âÔÂßðw .Z,üÿ¤#çZøþ­0bˆ­ÞÀ!Åf&¼Áú¨”*²ðN\Æ3霮Òû&…«q Ã!)éeáJ\f¡YC[* ‚– )²­v·6%hìø#£H“•i©°Š(Œis²å"Þ—çÚÜrOê͸…’–'·$²–*QA†”Ð%Ý–œ¦jêL$ãDŸ 9×·•%†ù´3ÔKT£,5Zd©¨<ƨRK•Én¬:ÙRã”Í®s”è…Ç[j‚šh¨I–š¬¦ªÜRS…Ã45h«L'ÕÅ™ Õj©™j–¥f« ¶½c¤%(+–šCGÐ ,U© úNU)Øb«˜/§aåéßf…±…3€(.êL.ŽXªZÕБ‹’‰Å–:EB"´(Æ—ˆÞ‰î8:5-ÎUŒç1`aë=V¦r6(Øî³;‘Ž5¬tZsB5@†Æ#ÅEZÝܺþÉ`zŦ9Çí¼r®“aÑ Ï*0 Ì)Ô˜‹yoùš¦Ínsnyþˆä$_X€ü8Œ®]Æ4w’Ri i±é0ô‡[OÜhDûjiEACI7ÕškÓ“1ûÁŠ£Σ`\ÐF=Á弉£¬äBÑÚOʸíé-ÜŒ \™ÂN&ëzû‚|Øjƒ‰,Ë‘6‚˜„ÙÎä 'ééàMS1+‹>%L¼|)_ÙÎlÓ©b…žàut~ŸWq¢ŒÊU×,ª›Mˆm¶Së÷±ŒæÐý^l—:—ïõ,C.š¢‡ŸÒf"°ZP”^†Æ«Ó*Ž3ñ–æhQSgÎ=vâùÌ#N|`p*/’þ<¢‡ÒSálb»Žµ†‚LCN‡çÌêãÊÿÁÂM5óçâz†™K÷§æ(7é¶s`(Q³Ëµs1•?wÏã/pÎÒö¹³¸çxÀçF¾Í窸+w¡¨‡›"lâ3˜‰€š… ó—H„‹p±fÆÑ‚Â`Š5íI•U»P\¹»|¡f#IÌåõSù»~žf8Ö»”g(»Kàq÷®Íü‹ûZ6ZC-ÊõÁT¨TCÄDy¨å³#°ˆïo¤û_wN0yÝS¤•ÿBQZõÂ>DŠP¨¬ª®Ù…’áê/#Ÿ³Ée¹æyšwÏW¿­hÓrJ‘Àfm\)Þ$ïZ0Ñ®e‰q!~Kkó8èxæ©«É-Ìo{k<%6ÔD­>Œ 6A;xFtdmPÕ†*7ÖûÅz;؇QEx £kCvè ÆçQ'‰þjŸ“бÁ6ïFI­ÉÕ6÷E£U½s+FWÚ¡ê;° ¥ÝX-~:¶ ¢'{§£xªÇucZÔN:¾–à%û =´l:Ö2ÌÀ¿MzõlD™Žkè•sq2Cr)'coœÏ lÄB:{)ÑXC|/æ¿-Œ±,£ì2Ƶ ˆÞ'‰[7Ãb'¿î!ââ‰z‚œï‰½È¡S{b/¶pW¤w­Øª½¸—ÞÙFODñytñk:Üí”/~áš÷ÈB~‰~GÞ#âˆ>LT¨ U@¤º“nC(:y•ª5ª6Öšû«sí“)µ†mÄôݘ²±ÒVïB9iò×mÃóL7¶A.S+«l#:ð)î¸L·Mí³0W;¼O0­ E[©ËVj·ÕÇt1Fñ™dÜ´Óš&1ªÊSÓ‘Ñ7N§uµ¤?‡ön¢e—àrÆå•¸”ã÷x·Æn-=B}ìvh$”Þ½+Ý»yìÂ|—xj¹—“.D©“ëú¢H¦ø<ŠgæQì:Å#âfÐðžè ÛèÅÌ|´ D³¢nŒÐ/³åE߬(’(Wr(ny0{¨øxĨ¸ÔŸ½&¨tbŒ×Ò¨÷Óœë¨äc6>‚j\Ï[7°Œ|+pÖãc4ófá-„ñ6‚ññA0vù0vù0vù0vù0vù0vø0¶æa,cp÷ÃxU?Œx=cý‰Â(`U«áA塲D£²H¯KXÜ–ø¨TjywRÇ»¨ÝÝÔëÞè&*÷•ûxës8“)tî„@½@½@=CÍC ÞG ÞG`‰À>ó}øÛ0H·“¦„7÷T÷Wi;à!,Åœ¡êh•®—0ºûª„„Š?QnE(²€X™Ä*¼¿Ê/ŸSX̓(÷R5 $UͪÀÜ«c>\GhÃ俆.ýA¾ƒç×i¸¯A+ÔGtãëñÙã;²G»¥Hï$ûŠõîzV²u¿“áq#4†¡x+š4¾›YÑ<÷UZ7…ÝXN”ß²º&zN/ê7Ðu!®Ó5H»n¡ìò® Ò3"Ô}è×5ѹY£Á ý}«,݇¾b´« ®¶±¯&ºRΫ£«˜@«{±F_)ƒ»…º´pjñ½pmþA-ÿÉÚý/R½Á)÷ª”¢>EX¢Šq–  AѨB¸X¸D™H©0:UW¨øbZ¾³4¦!rX¢q±!JJQê6š|ŠG›L±Oä+ôE¼'7#2 I¼«ñ1¤ïÏ46Fp{ž„>ðøG˜¬žÏ"ô´ç³}%>+bnŸæ¸ÖábLáµ–'󹮇üÿ«óØöÃÿPKü˹: "PK k€Ó8WEB-INF/classes/com/playplus3/PK k€Ó8#WEB-INF/classes/com/playplus3/pbhk/PKk€Ó8=WEB-INF/classes/com/playplus3/pbhk/PBHKFilter$ProxyData.classRMOÛ@}“„˜&Ъ´¥_AÂDôªÔU F)ˆ+Ú$+08Þhí 8ó‹z@HúøQUg«\*\[Þ™Ùy3~³oŸ?ýPǺ>•xY´1†Š…e +„©s-û*–_{=-£ˆPn^‰á"¼ðÚ±öË=ÂDŠj)Šç­nïîÈi¨0”ÝØW!çâK?ªî›]Õ÷¸Ãh×t.¯½Ö·Ãßý –š›÷ýп–72°›g„BCõ$aºé‡òxØïH}*:4„UWgBû&N7 †¡Ô2üD,γÔ@D‘äÔæëÿ¬þ­Ü³P%€ÐÈ¢™Ñ±žÌ‘»Ý1K°”‰'Øm5Ô]É;fö—ä¶ÉÁ$¦LÀ1Þª…5ÂúNÅâ½è|Ò¹býX³ B„ü†™aáU*|ËÆøÖ™¯ æOm)µ¶±®kÈs”ã—gáCžæès3¦¶õ€\íùŸ ÆMú±¸Ç ¯NâÛ(ã LrïÒŒÎtmëôïêÊ1ªN¼ù´cïñ!áð1©\ÀÛ2{,a–í[¶pÇÿPKR#í²^PKk€Ó85WEB-INF/classes/com/playplus3/pbhk/PBHKFilter$1.class;õo×>Cvvv.F®àüÒ¢äT·ÌœTFþ'o ³$µH/+±,(âš—œ“_œ™—î›Z’‘ŸÂÎÀÍÈ ŸœŸ«_“XYSZl¬_”‘­Ð©bÈÈÀÀÈÀã™——Z䜓X\œZÌÈ 2O?'1/]ß?)+5¹„‘A¯1 @C˜ €€<V ÍÂÀ$9˜ ¨†ÄàPK¾ô@£§ÛPKk€Ó83WEB-INF/classes/com/playplus3/pbhk/PBHKFilter.class¥V[wÕþŽ,i$kÇJœ Ä„8$±%_Ôj°œÄjCŒ †Z3–&²y$fF©“BiJ z£Úô^z¡Zš6v"ÒRè%]«¿¡?¡/}ëSW¿33’eEY«³Ï9{öÙûÛ—söùÇß}Àü½A6Œ$CÈÉñ´$gBÈËq)CŽ…Šr|6SŽV¶K ζb³«á“!,Gpç[ñ)<'gÏ+øt+¶# rüŒ$$ùl/⢂—"Ø…—[ñ9|^Á+­èÆ«’óZ˜³/HòEI¾$É—#ø ^à«øšùº$ßá ÉþfßÂ%ßVðßUð=¨)ÃÐ͉¼fYº%ž6 Ëçî×lM m~¡ddòú”ndíE‘ðOO>,:­Õ’yÍÈ&gm3gdG)?Q0,[3ì9-_ÒŽ. Ïåä˜nkRñ´&•m7õ¥‚­ÍdLݲ&u-£›{º`Úžêî¯,·¹K3ô´+•­îŒ¾ÝEX²sùä1­HxáÙ\ÖÐì’IhSëÿºÙ©ta)YÌkçŠù’u0Y\X<“”¾?˜ËÛº¹·¦Ñ1ªÊ9{L ¥7>Ç M2º„3ôGJK ºù˜¶×eØ i-?§™9¹ö˜~{1ÇÈßÑÜ"­ø¥ ö:h—“–nžÍëvÒ`ä’?à I¥¥oZÿJà%Yó> "·ãmý›€­ëðt¿XâŽ{@oàÌͬÂ;S¹ùUK·Ú ÕBÉæõÜÓ Î U#_ñ²ví:É7óÑBn]Í7Û°_ ùÿz|Ž/Í$ßÄ‚ã0ü²åð¡Ü!û y#œûÐÂõ躵_vÎý²s8ã˜7öÆ#ÞÈ‹œû&œ}÷s-dg#ý9¯Sß­8œ¸ ‘PVàKD[Vàwh  ®@IDC+'¢­+ˆ$¢ê ÚÑM+hO\ÇæWѱ‚èeGù$é "¤qšé§3ƒh§k¸ ;éV7Á÷æ$”1>ÈS”V]xC¾¡§pŒÚ$¼—¯…ã=}Ñ-elõáXÿ ‚迆NBí+c›à•½(n‹ÆV±#q¾Uì\EW·û°k¤“„”B uÒÈÍHó»]žy9{Ç CŸf }xÔ‰£À ¿Y<æ‚óÝM^˜xÇûÞÇ®Ì_Æ„ ¬b÷%¶Ãî‘P,tݱÐìå~ûª†¸Øï˜h Mæå|E¥Vɾþ2[jòt;HEqÞŽ9ìÁ,ž'Y0'ý“XÀS°ð4lÌãžÁEhx\‚Žw¸ûΰc/áŸ0ð/ñoJÿ¶ð¡$ÚqN$q^ ã9qÏ;¹/²\÷Póã´ஃ´7 …{ïtx!™ßJepö$qgv’H|Îìi|œ‡ð ¢ò×D6L}ùŽÐXOAÚÝBìR³¬¥ w¦jÊTObŸSúüÖ‚tjΈð øè®¤§p7Ç(gwñœasȹJ> ßÿPKm¦‚„=nPK k€Ó8WEB-INF/classes/org/PK k€Ó8WEB-INF/classes/org/mortbay/PK k€Ó8"WEB-INF/classes/org/mortbay/jetty/PK k€Ó8(WEB-INF/classes/org/mortbay/jetty/build/PK k€Ó82WEB-INF/classes/org/mortbay/jetty/build/resources/PKk€Ó8=WEB-INF/classes/org/mortbay/jetty/build/resources/javadoc.cssµTMÓ0½çW ê­êçBËnr‚…já€Ð²çI3n¬uâÊv¥êÇvâ&év‘„Oí̼7oÞØ™á3V˜É5h³:'20œFÑtˆñ’`-…TzL–F–H““jhŒâéÎ$0dEJñÌþÎ 2b¸X¿â† ÅõãFÉ%óô.™Êl‡NjìS1 VþÀ1Š0¼|Æ×ÜP‡jŠxðæúírµJ¢º׆WäJs'hAÌØRhs/ê²1¶\Îf͵hLë´! j‹¼âÅV*ƒ¥© &Ækm§³•Y–%-nºåó®žÝÜ$‘K\=“°¶>`*®œ›¸#Ìx¹¹õ»sè+¨Mú”p„þm—öþ _Úcµø{ù£m}¡=óÇÖÛ¾çÖÐpIVö®ÁNÛýòܒƹ»xLaA ¸6õŒ+÷ÿAàøÝ-kþ‹b(¥*P$uˆaÁÅ>†wŠ»XßCëzÍÕLëÙ^Êuš¾áúd¨hdý—sããO,¶v»’¶Hán³ÆR5)Î<óɻ㱘s =óÙÖœõ¿#Q‘ákÕRzŽa/_°â4\–v‘ªóIè\<[óÕ- 1¯Gï?ãäé /÷ØßSuésvv*vóÍ;&_˜¨åäp#¦ÏR·ü–®ò«‹ ë~:ì¹LÇÿúðG¿PKHÐÉ PKk€Ó8WEB-INF/acme-taglib2.tld­TM›0½çWXÜÁYz©"âU¥Õª]©R¶R{ZM`Mmáßwb'MZ5•–̼yf »ß75ëÑX©Õ:ºK–C•ëBªr}yŒ?Gì^,™ƒ²–[Fpe×Qå\»â|=$¶SI®N-®,ߥˆÑ‚Ñ屫½•gü0 Éð)ѦäéryÇ8é¨_lc„”o-Œ#ò†eYh]Ù²0Õœwþ$½{ÇFµ‰üõöûé$b~‹óÁäF=(ÈéF-.É\•·ᤳ Öx»¸¤š«©½5õtKT±ø÷ÎlskŽãðhGá\ß2¿ú&™gNî PK´°ÎrPK k€Ó8 WEB-INF/lib/PKk€Ó8'WEB-INF/lib/jetty-util-7.0-SNAPSHOT.jar”»l%Á’vif·™©ÍÌÌmffff¾f»m_·ÛÌÌÌÌÔfff¼ffîÿÍÎìÎÌÛ™§ÝTF©J:_JŠÊŠ e*ËAB!€ý[“ \àû/ þ¦ ¡.Â(£(ɬü˜ä?°0iB90°zh00ÌÿŠ)ˆ(ÊHJ¨©3)HF«OĬ³`nI kWéF„j©¨ F“%£)sLÖUËû³Ç(8ÀŽîÌp"‘²”‡®Æ½ó<¿lŽ„Êö@˜…@[$GI“W½o'Æpû¡¼ÙæÀó”õ {¸g0Öåå¶gyjÿݰNtºWO€mfK¯ÃeKpyÙz~£ÅyÂì\®ÊBfX^¯ØïŒ)þ€˜W”ù,~™©#ž,Uj|½®íI¥A3©ƒÍ÷dZöä(µk¢ëþ†Q|™`Ù“j‹ÝÜY¦¹ñ³ymË4­ð{zñ¤YÌÝèÀª*ÔfbeDãÆâpaŸ3 Œõ,Í©:KçâÖ¼  æÁ0¨zÛ/ì[ëÙ/¼ú·úK[Ù¢«àøëøœõö^õï$c?Y9= p\ŒËäçΚ6K—Î^¶ozM7«¨àÜ9*µªMˆÍ5ؽ—0‘¦çÚÅï´Nµ?ïö¯Éœ‹}R`"A¨RpèôIr¦¥ãy¨#ñ½µoßÚk岨Mò1¸—XÓF.‡e\&ÆOÕè ¾~”‘N—Ó“nÍWó–ßx¸£/¿ý½{•gFÈTƒûÓn Wœï*ûš„°K“Ì?Œž½·—}8Ñû§7ÉÎxÀÌO7>Ó­ºhãî—·ËçîáœZÆ.AŽºÄ!2¼ÛDß!xïŸÁŒ\®‹ýii†²>ǸäùãM»¶ß;†Ã(›QÐÒ%îâT'äþñÁ TX)v“‡÷MGÝÖG5Þ) XÄ)ìkeù@þ×´]FWtmÄ\[Ð7Ý(ÊÿOŒŠýSŒBýÜ\­˜ÿ“ÿ'é?'WwSoæÿ},ô"m-ÜÝÿû?ò¦6öæÿBEö/T®nN®fnÿâ}ÐþIïáncÿ/pìÿ 7±5üÿИ998;9Z8ºÿ Æ?iÜ­]-LÌÿ…õŸöNVÿe’ù7¯aHÏŽýc’A‚cüÿä5[Os'3&37·fu…ØÔîc-¤³ê³cÑ Gןa¶{A³ èÇ2ìŽUûãžÅg#žûT§žñØ¡J—“]ÜNÛ«éßöØ5ÓÆ8­q ø¨ÙX²$çÜáH~Ý&3†©û@ɧHB¦àI'&Ú¢ZGíŸNÇÁP° ›KÈÞN~Mó™¶a`ãj÷î¿=HŽeSÞ?0¥Û£„+Ú^¨±"i~ýaýÍ‚ÝåG>Œµ²© gûpsôvéÚ,[кÔ:”u£¶†‚™\UµvËŽc>k`mÑŸ¶ žjζF—G;oB!…E²Å‰„îÚÒ¤ ).‡§‚¶s(mLÖI¡dtÄîÝ×|#ÈÙÚ¤ˆ—ÓL¬k2¦ë¯ÉÊÄ i#Ÿ´·?wºÐ—e+¼%9‡Â|9¤>á}!­›a5¿ø¾:øç Þ,o€÷/Ï:Ëh>Õô)n|Þ¡o& ·wäMD¾·q=FÑ?ÿ &!Þ}Ùb$²ûŠ4¥)¦S¦ðøeÒ7$ôúÝ©½#vî3µ$¾f8î‘ѳ÷f^fmþ ™êvp ÄÐâÙ™Ü"½çØ8¬ËI;-{?Öy]Ÿæ†,}¿¶œõØK®¿gG¸¤êCcÂlT·OÀ¡Ÿâ_q/s¢/ wO¼ÄÏZ+u-|pxŠˆÂü¼ ¹£æqê†êéIçy?ÅOe”VF:t&/™Qmý H©¹«Ä‰„?à»h—ùûx#Õ þßãì!Áo’ @Fò?}.êÞÎÿ¸a2³7qs«ÖAôS%ÿÍå¯å€Â£P ‘^ߤ¤–£þ€€ÿa &ÃFAž(Ÿ%xù#¥R®Îø[ƒX³Ö¶¨Œ±þ+VhVסÕNÏáÜÓËá|¹eÃÑ«ÓÁë=ïïõ6b¦yÙÕukÂæõæ}¶ïôë×±ß1¿‘ßA­Qüùס¬û}¡½6‘Aò ÀàžK9N«”ñœÿÍï•H†[oó$ÇÛ÷—„b É÷Ý$V!øQíX(Á„ËxbøWÃa_óŸ±dKf èÓ*±ú±‡¯q̯g >úyÄjª»bù˜Ó:i¯ÂÎX5"ŒŠ&88… Ö˜ï¤ëñåühU%’iÉAÄå7&TÓ·¤Ég¬äìþi•æw)Z–„GéÞg.õJGÍ¡agï Ë ô\õ1j?×r•åÔ ©æØ\&µ.ÐY½¨ “Zlò8 š©Ò¯A×Ö_›šÝ½\m’“X§r‚O°楘Xç:ÑÇæf ŠðØ}mWBÕá3ºCÿtèÛíé|Ù„†á…æ!³£ò%s÷1 9̹k82s©mˆ^o w¹X&ÕÒ@×=â¤A!UÓ`Ý=â̵Zªåý^º“‰¨cPp¾|ƒXæd¾XN5Õ1öbÖ¢”©Ó}­zâ±c3o"ºc³h‚ØÀq„mà¸4Wû£c*浈É+£µr„¨có4Þ¢Ú§û‡­ôb±¨Gèyc…Ù^ “ˆçeóÑÞø•9‡f;Ûæ’&Ε¾x¼%'¿24tád*òž6÷N—Á˜xS¡‡Lê¦y¢W“&>Âkµðz|Õ7îV‰³Â©Éi; “:¨ƒ‹ÜÅ4µë(J\yxË èsä̤…B¢-;~2›™pÚñßCüºGݧ^}Úãëmù³™ªÚôpQYžÌ1žâ‰R*·0Á|Û¢f¶…Dñœ[— ñâbm´’Šu\Û„1pÔg[¦|‰*¢YzJMš-#c%7ާÀ­ìxzé2,¹Á …–o0!ÿ7[B.ÒFä…ŸZz °>nm[P¥¦c+‡2O †qã¨ëtêxmî0Yg¡ãî*Ygw`ÒŒÊYÎ97ê õË“ ÝQeéw¶m •š•WBŒxÿe y Ê"<ûÒØÐ<©¨·ÐÕ(‡çp?ZŠ{b7åBe·÷J¯%E¡ã=ô¦py¢8»27°FºQú„ âŒ!jL;Ì4Ó$}ZéĘŠÇRÑ0iT k=½9 ¸±ºÍ3ºJøŒºgÑþÀ¡4L£`‰yå ìÆÏ¼D¼i\“§Ka5æ“áÉ¥ç=üUýp•þ†îèM†¦ôr+àóq2b#³ŸG‚rà&À.™DݼL@8à"L¬æ{ô³öW•ú S bßnazƲèrË˸?zÄÄ1.³l3ëžRÂÔ±4 ±#¬ÂÛý­mhÓÇŸ®úÄ…>ÞYí|è‹âv^¾E%„NcÄÞóÌÔ‡´%¯lŽ3ajI ¥Kx±~ÛÌ3óM~"9÷b åe¡%iµv¤ ^ãIi·ýÛ¯Þ½£nļ§©†Þ«±°˜Ï÷¤¥‡‘ÞÁ§‰½YT>w”Tõ~:0Ömý«ÄÞsÌV‡”t  ^[tyï,3óýEÍEfÄwlõ7Æëxœ»<ó¹ÑãÄÊáyùèZ¦ÐrP @c­ñ.£b‹¡…0#}ò¡ˆrÛá£ÆA ±„¼BÖj’'TßÀáÂñ¥ƒœØávôœÁ{üG›Qý¢ºÞÜl›c;(•SÛkÿ;w·wUùìî"Ûl¤°c\¯h»y½°:‹ÐF›rOšñÑ™<ŒÛYÛëâ—ò¤ÍöI¾a¸¼¤'ðQ÷q¨g‘”’zŸÝ~O̳r"ŒÔ0½z ÍÄŽ¤`t0éš‘ãëðÕ¡ÆÔÎИÓÄZjÓoQîâ¥#•ÏïAµ¾œQÑ·Çýq§ ÀHc2 oÂ9‰E'G?ïÑ3왩LÔc´ÔúqǨÁ^’û·q=¿õ§Ìñ娿T¶¿ƒÄâ\_¦ù{KTu¿«Ïr±n’‘¾D0ÜgGÃ÷?%±6C6GÅz—s”’8jjúÕ@Û%ü¨’‰&]–NëCÿj±Lþ¦Çé¿©Q5D‚SúÓ±ç~qWÈüþêvV©Örƒ^‹dng0Ã)!.D•*^sW%5î‰9Ž IåÜù±kâ]Ãùùɉvïá6wlF°,8âÊ»Ùßô|së;éñö4FÑd(.>—ødQž´@$.à„WʯREίH–ðâ¥>‘Úxì«Â9.ƒŸì[º@6Eõ¦¬_e÷&ÎÌÈOñQù¶²´Öî½S·Šž(ñ4Uƒ-'ä<9,·ë×".·²³7'ã±ÉYÛ:³~OÜ%þÂÅAW"›ÇC¬| 4RÏ&ÔŸ EÃ"mÎQÑŸy“Nó@8òËÊ¼Ñ ÷1"y–"[kf­¨‘ÀcO0ô- bŒ78ëÉVù‰—ìð̆­õ™DW1· c»hàjóŽBû7Pd”>òlÎ69“æ8È:‹bžÚ½©ä<í…Œ:åpcÛìê&5—‚<…,¦9 šˆ,—¼˜a!8“ø5ìj\bÓÖžuó•éýd2š+}s7°}U/µ‹ºPŽï®f²œjà”li$[¤ ±zÑSáé}#¥–±~Èu áÅš¹;冾°jÚx0/m–ZSú;wAXͰ`1¯ªGõË<àÓ)îE’k´Éc]íÑìC?àÑ­ždÒ™¹*Þ é$ {‘„ïÒ]ž†9VÜ/'g­²¹ä×Ωèî„«Rvߨݰ4¼È¤ÜʃéDÇE]àR¢ž ¬r‚BŒ }Ïó‚z_?²Õµ–ÃákM÷I£4éÓFsS‹aÁÆGK$†µ£ðÍôÃì¢T¦¸Í²Xk%9ÿ½ïüŽûχÞlõ{ÛïùzfÚ>‰*‘ ;ÃP®·D²½Ñr7‚²½!€TâOT½[9Ý/V]ž–}ÿ&—ÍÔ™ú­p½[zr¨ó|µY?x£’äÇÉ5ð.8Ø^Øé]Ê;]¤3 U˜G„r\¡-VqÍÌG¬£Ÿ¸ÁɈ©Ê’2ÞrŠfª§6‡H3¡Â¸ŽQÜae+Ê …Ê7üÇòŽœ×Šž´\7(ÐÙ3Õ3³Õ²\™ Øk4ïg𾋝k“ÔÞé´ íWhìæÆû[ah³‡<lIbñ¾d1À¾—Īùß°õcUn&¹UŽÚ…XÞ?Íõ½¯æD¢ïÐßݲJ)¯ÎÅU˜©Š{M0qÄä¬o`¼ÐF°¼Ý„x 7*¾>FÄ'1ÚÞ¤&j"ÝøÞšV𠸇v]›"µÂjl[“0Š™6zÃk@z e6mƒ¹D€‰åU×&UÌÌý?6šXN“d“Æ´ B&ÁuŸló`Ó2¹ó§ºLÇŒ-:èîÇÍÅÄwª\I™î1Ùà|B•‹½˜Éïß Øó±Â±)}:áMÆ¿rIa¹ìbe ›ù[òA¾ÞgyKí™5ÓL9´²Î`¹‚ˆF<(ÛIW4SB¼¯âøY -r¨yþM $쉣Þå–ƒvsÖ ¦©!1[Å’N˜‡W+É[>ã˹ºÝ—5t‘`1‡g½:Î,{Ow3ñº\mÇݯ=tT°¿ªCÅ4ûÈ+YuÏXD– ~0IÅWˆÚüak‡H€±O ¯WÀ¯«éŸJê4à*mµGìkíÉ 3%oý+²Ï‰-CNÃÔìšé{9 œ@ óÈE;•×#7ÞØêHd¾Ú#U“¨j³ÓꜥP0òIã3&Ç…é5Ä 9ºæ{õþœ­(È|ˆ:Íû³Œd@ž¿©H³oû1G‘F'S"Ë=¦Èj ÍÜY¯ãø£ró×–+†cá¦P;/²©]¼+>#͈±þøgUÉ5¾ò•’X»02è‹#éíÇ+¤¦±›Ó¦)‘¹ŽA=Î#Ÿ”FOA¬™ŸN½fÂõ¸`4,þ_Æq€!WÖ0=ó¡'ôíjŒ_§èÊXgÕêÅH4»Pû}_HÙ—ïBhTálD28µZ~­³ý‘>ï“ ™¶¶«dg&á¤+ym|žtƒ± Íj¯ßœ®¦[†Ž%G…KL›C¿iŽÓÂvÝZ _#@®E_?7¾ˆ¹gÈfo«ð0ùþü#Õ-2âÙ¤bsfÞõ®O—+-ðËãµ&Eì—²c'!«¦Äu>ö_ó]A,9\a,z’~ ¾hÉ¥ßãWzTÅ9¡þä®Sé‰ÀöÆ`§<ÔƒA¢oõ«â4vvÑcúÇ•àr[•‰Å@Ú³qL±2îäÁ,Üì 7=gΞ×Ù–ä܉Ô_°#®†ÌÜg׊¨2{Z‹yÆ1·æ[©l;Pð}} ©—»çº¢²´^-¾¶yQ%P'íŽYAIûÝ7¦$’º‰R­·oJyÏó &AŸ8G¡’R±Ž~:Žv ò×´y”[ĉkŸJzŽß¶Î"$Øó§¡](‘2®ø!© s¶+ãïUÂ&aïå3˜¨²÷º7¤¾Z ?2-ò~ÂüÌU~›6­˜Z-ˆfÔñßߌ…­Nç|¾9¾ ’¾@úÝI™å¦?îý¥¿ß#¤²Ã—å„¥ãÀ©ààN±æcZðÓ.Ž 9Ávàh±3›«†®WCÜ#v€¸Z¡Úã‚i"ÈÐ:°å,1ýAÔñI­ÚOÞNc­8|Ý=gbykë±Ç{Ì¥Á<»¿!è³¶.8r€€U{!aFR³^v¢Ð½šUPËuÕKå¯ÀÜRtRÝ WzRbÈQz’b(®úÐbØTrÒb(®öÐÌ¥·áÐbÊ¥wÉ¥GÄ¥ç’Y­˜Y}n߂Υg°&]rre!=ǽÑ%s=>|…éïÏå(=ÇmI.,±“ÝÙMMÀ]z¢gÿæÔ|Ú;Uò7‘ëÓ×áÍ©õ´w äï´È§©Þ¸Ð6Õ'-ªD)äÙ™†pt½ü|fHæ|“0À#c½‹J!›7àî£ Ÿ0À,ƒ i;©ÄéÛU½u½Ž+ì5~ƒæ–7Ì´$,õ™Ö³èqC2÷»N½C€Ø²%hQy4£¬©ÝΙ´TÕE0þ›†:¼A7¹Ö[÷ ê¶}¨Ê)Ûy/”ŸnÁ»‚fÍôJÛB~G˜®Þ™B!j£ìpÏ´òZ³³o¬¯˜LpÄpú Yó‘´VÊè³kÄ.“çƒ~µ4Oôÿ‘Ûàƒu¢D*}uvœó„Ød[ÂqÖ0j#<§ç{VÈ ŒsÄLÖLê+§q7ïØvÜÜ£ ±.€pLØIYׯ!QjÝL©Õ'|N–œöuÊoŒ%tcöø_m´RÞ6y¦!Ùò!:C-9D[oœÊƒn{äkv»µ×ÚD)ïGìÇ .‚Ãʪža˜W´š„ÜúûÆš=ðf‰{Sz”,”d*Í-KpÝ&Ð/ëÔBN|]L•j‚ÛÖ» ÖKÔõfêÙülñR® ó¦€µ?ìŠÝõžä%÷êÁ¬s$yè¡Äê¹v(?¡]Ý ÚQ1wD'‘׾ሠ¡³ø3¿adLëmÞ¤€<& @paŒÑAÚ`ót(qú»"Ûm’~Žçôðqv¤7„vàâü6 ý_´ £ôä\ð?FQ䯵ÿ½àz¥¦ìXƒ¦€÷¿\åM|¼åmÜÜÿ½à­eP_ ˜™T°dà å1G_þÃÂNНžTm„+#úþ‹ ÐüÄœjRÞÜÅÞãüJUDB"©B›ÜV´NÒþªEW¯óÃ6÷«RØö½é“Ú¿××É‘*‘¼é{ŻûópžþÜ#À±‹þ1¢»yÔÉä7IíH ¹“2â…àû g¿³MØË›Æ¿õ×&y¬/èV0þ½Gà*Ù,à{!ÉïÍX„³¢ Âwý6£Ô`XÁZbW“DX)gu!â”f)}Àb‚Ø3+ï +7±×<ÊÑwÌÄ»Œw–ó­·0MB¸ÄÂßißÌM”5@S1@QQÔwÿÒŽÈÜÆ²ÛÉ”¥I³Ölg ¦'÷^³Ü2…<õعl¿ÝUb`23ÜO@Îy+]ÐY™ø›²C‹æ°6ŠÒ4} aúÏ~5‚®A}K3kÊ/®çgOq5‡ø«ß‰Ùñ/ËÒtT;GE)§ÅXã‰åWÛæt h¼Ú ¹Cvøäá߸†çñl%;:0kàÌmvVë¹×ÓuX],oi¡±´Ò,p­Žm]z Ó¦°S"žèôm ›ö š†Ð æ ·óXÂ0Ïny´LÇBûÇeÆNÀFÄ/cŸÜ-³9ȱFNÆ«†€òXcjú®3êt®³9û1ˆÅ¸¬Ói&Á4…îtëøüâJÌ E—ù1[az°¶o“ñ»¦ùâú èÜŠÓJ¾‰Ü®y 5WÖ%*^ça‘Ô0"ÉÑ«ž¼NÂÄF¹òÕç—qõ능– ’Øi)M…m«\Vê¡Òì2n; µ1Šì–ÖÀq#õ4!‘Ò¬å)5Ûðߤ§EŸpÙcâTèrE—{ö”·]Ó¶¾BEÇý[ž­Â”·7Á”èMVv},£ƒñª?O²ŠÜÚü8¨P:‚>+øàêXiÈ äú¶ ˜Nœ}à $W \š µ³Ã>¡ò ɲZ%J_ÿ fùÜÏÛ«äl—F€¯nâgùôÉ[š:ˆ¶pÈ+ÂþίF™_)KÆ)1ß°jXî°¦Õ%m:FÊPóFa}{8žÝV‡/ÍF²–aÎÊl,c™Æ×ZÀs4­eʉêt2È pÏGQ±õUFµ°ÏP©¥D±E(7·!ÔlÿYHaœùW7O„C­Iä7¶¯R–Å&NZè¶ëã¤çKZ€ñá¢S¼|KsÜw™³¹©ùÚÖÞÚa"Ì,9…¤´À×Ü):]1,âä (·!ã~´ÌM®tÙ'?…–ˆì(3ä³VRÄλ jw9¾J!„°ºL¼A‘³ø[ohÑߊYi)8Â3ÍŸ}QëpTI·xäÐ º§ Bq‚Ó<…«`gŠÉ<Ã~˜Ç*Ú³Þ†,îâÒ Ÿ‚ÍÁ‹!Ž˜DÁÝÊg8bó9­™‡s;mNò‰×Å’ÈÍ"Àšºr¨»º¯ŸDlø9Á3ð6’Nÿª1кÏÏÌõHûá˜Ý(W¿/0hõlÕ~纜öWYþ×mL?‚{Q§~ÌšÙ ¬é'Rk…½Y–;Â6&T|8×W¸è ,äoÚ®"jÓ ­Aú1´~5!@y È9£ÈµÕŽSi± pÉ]ë£'|ýë’åžöæD»"Wt!°Z&ÈJäòúÑ|?HªAÒ.RõítMËéMBä´Ñ׌EÍu*˜aȶ{¬¶SK =“C~AÔéËiÝÅŒJ[³;ÞÅ'e Kcæñ[Õß…ð ¦X†?9öÌ¥-„ûˆ¿Ÿ†PøJ—zÒ~ª8ªb Ø×—9ôùà‹œ’“žîÕÓjÙY‹†.x¹Y»¥ŠbìµcŠ) ¸ªç­î (æüà¶js›´½:ã_‰S^Í×O²N×£NæGr)G" qÈp;²g›žl‰ÙÄ?ók…MçO’àó*f“VÓt äÿcˆ¨ìgV˜k)øÆ› â…àH@@÷•noñV,vGªLÈTSJþ=ãBþ£{™–€šP¨¨Kæ=ÜÑ‚ÃtÉÍ÷.u1®cÍÑfÒyEuD= Qˆ–œñVâ/ÜìWRbêSj¼lê“ñRÔá…$^/ÁCï´§, Ѫ$5/ hX3fá;ÞG²‰Ç5«:êzn‘ߴÉ–DËEOõXEž5Vá¬nD „a½üÅÚ²Ë,BšËŒþecù1QÄ"‰27n˜H‰Á„“;OEªØR.©"Þ¨–f;¾:¤€HXL–Wÿ0 ?觤H{$~Ã݉úÅžíP¢ÀÝŠ‰~üB–„ËÍËÐÂæÿʼn=ˆ/h EæÄG5IK~š@âž#r›fYõÅY u”yµ>åŒýSm"–%Y‘ì/‡ešú–¨ ©Cj…yØ_Š>æ4¿¦}oÜf/ÂOFèoFš@‹…Õ¸<:zO“VøSŒœä/ÒvÅÂÁÐÕ< »]/pžÊ¬©£Àà\×éKyˆÅ=áha:ŸEoFeÙçîc§h#[äuù“¹ü\Ö i<½8_”¯Û˜ð0 £û‘}gÜM7ÈY1Šà_î‡N7¹dÐß­ÆôžLÏÅ Óâî›;þ ¥Ï©7M@¼ÔàÆïÃén³@ gÀmuR ßxïZ­Î.[X•q ªPêò²®â´b$Iäž&îÇ G”Ô±KÏ1¬0J¡í%ýP+N+W.ñ»©ÔI«ýÐ. «SÕØ×íÑ[´·×tCSÓ®;ÑŠtW«²7èw¤‚™Å=E”îŒ)¹i´Ž¾ ˜8}Ÿ £Qˆ3oþuÖ4Ô´áîS¹6âŸ`=­¤-ùEë.ZÚ¤†}‘n*èo²BfÄ8„éA›o”‚u"4q&¨IE²ëŽYò³_K¥ïJóµ#¿DúÚ¯ƒñ*åʪ*6ÖÕË£&Xkɨ;!­ë]AŒ¨Rã[âÒ#ÁcOiµ5þcΤ l²DÇÜÎ’ßY¶Ö­]Ÿ[Õ ±Ý‘jES¿¨Åü´²éA##õ'ÄÓ^[¹Òïí"Î…d?ìl±´DƒJ$‹µ5EºÎàqϾRO+¼–M6{æÌ®|2Ëe’òï¯Cn Da®Bì1%YRjÓ̆,¿èJvû÷%‘Èâ*Sžá–¦îBȰ䛹墋¹"„&$ÿ@Q7#›Õ÷ÿik›£žþnåúð¨²#¤*Ïz¾ð`A%gôg¾¥\æ1Ìõ1ŒÁ??âí›ÊŽÂ¢ûã–¨ëú™Ü}ùɆµO  FpXU@¹Pɺ:ä›’@F[Æ´íw5ìî¡´¼‡õ&úíz$úh/=!)»ýåN÷¤1<5Zéˆ`§yi]ã Ô­„=i:aØS¸A²mÚZ¾se²ì/nŸŽpû[ó–Èö«%ïÍ×.ÜŽArƒ›ŒóoKŠÚMÙ±J…áû¯å¥õšÝƒžwl\åZ³50:Zá¨ZVÕOªHGvxø0÷´öq…©C¡!¡6ÜŽ-hSsmÙö¾Ìùâ˜åU}lBNs.Ûoÿ=ÕßæuÚ=kƒüïáù¿R}Qow WWo%wgw5wW ¶ÿHüUT””q½èÏ5éC¦ÀUK¾¡i+Ø?¨DG³’2½±|W1´žÀªq¬>uä¼7zÁñ{ÁˆÄ Ùj¡5_ʺޮÝá=濬ÝžÛ‚­`ê׿ÿ$@àƒé«ˆÉä[Æ¥C‘ø~H¼³ôŠÙ@@áëf†øb öXwé&õÀÿœõ ÷u¤X´³½ÓŽÂëødás•4¡ôÚTEÊÞ¿Q9T̹s`€eÛ¿:Ù†,°w¤2» †Zårp´`(6ôxöEÒèp sùž˜mÇ7MÀ I®¨ãOñS¤€ã]=áæ‹õyçF,á 7JWJ(l±AóVÑ˰óZCcsQa³¿#Bb2S[4Úä@¸‘µ)9¼\ö <©ø“˜ïÖ½L Vm9f‹°"ê,Êá)ù¥>YÅT% ü”;X*«œFü9Þ«Bêb“CvÇ”¡â*â©ø°f)ï$u 2Ç_Ý}‚q£óª~Êš<ËBJñZcˆðŠy ÔÖÉûLSŒiWÖ¦ÜuŸž9†ÒáŸU9y~LA’«¤ú”휲õ}ÉzM' ¥ØíCjy%²Û"&F¶°MM.Ç›¤%íÙ:üEÚÒ¹OÝJúéáK?aÿ{ÈÀ‰ >\b€)ÁÀHÿ§Ñpµ—p4s2·0ÿ÷0IÖFüÇú°ùk%}$]«ŸÂB B<Ç„Š‚R3ô{’qêxë±P$ ó}ó~¹ÊEÕÊí7°nÍAWZ›%ÍA.¨zë¹ zÛê垪êGÃæê§übæÓÞg^v<ãÛ»)¡÷‹î§u»êÏÚæ>¥À—0 óŸ(/-¶Ä7ƹ(÷7y¶O•G¤K~#ƒ^þ7»à ç#à¯.¨(•Gqׯñ±B¿Gԯ߅ûl·0lçPÔÝÔ£OäŠ IÔºI|nš |$»*µÿJ?æ°»L†ï 9•ÊX—ºò2pü_X ïö¨kƒôÄ‹áõ€¥Á—v´þAfÿ²Áû˜J¥,ž|ICÍÚ^Õèí{Næ€è•¥š^•)'…®½^ÛZ·þ¥®òŒ¿SÓ!­þi@­¥y/ùCÁ¿Æû±B“ªÛC¾¯‰ø_¶_½#Ö¿w ®î×ùÖU -@ærKëâlK˜ÚKÙ¶vµºö¹[õts„NB^›Ç žÐg|ûˆ+\C‰r¦ —„´UJU¿›0åZʽ|gÓmÎÑ‘>¥[ ¤¼²Ú׿«êØTU.Ï©6ó$ÛŸ[ÏÈ¥®4Ñö­"º6²h5'Übr:ÆÔÎû´1]ÇPs»~ß6AFb IµKdm/zk›g˜‘ÑÁííâ_Þæ¤Ž×ŸÝRhöróÕa*›rA¸ïÜPs¸7Ëæå˜˜ÚšK–m0À±^³GÌdЬ•ÿ±þRY½ODk¾bŽWv~ò‹Úªy¤£cŸÃ{T×휰¸ó/§ :ÿÆF‡µâȺviÞ!ù`IXâ-S|i„ÞÆÖò6¡RÂèZÊoµ‹`ÌeŠÙ2X[9ôuÉR’7êú ¦yåK¦ÄãŠì®>\ ©:ƒý,Ÿj£™C/G³Ïotñ×ß뱫êNsƒFŒÍNg†Ýºå\láôq&먿¥u¸·ûª‰ÆV}‚ëE«•ª H[·çl±üÆ[~èTÔ6òK|»]]eÍFµvÔ@æ|.E/×öížš¶>%|¢e€Þn®G¶ݹ@®ÜÏ.o—J8øÙ¥A¥Nߨ¶¾¨$ì"ˆÕ½Ì„ qûÑ×ò'K©jûÔª Ë“³µ¹É&Uk†Ébü*)ÅyótÒ–»dŸ=qlu8,cxݽÂRk£(¢ð „Y·ÒÚ…tO!ÕÓÝÃËS5Ðø-†bR;“^_3†!¨„ÒÅk-›–„ÿ}tkn¹¨°%·°ÕƒÂrCd®¹BpÎE×y2}g_ÜËUÃO1SW O¸!V« |rdGãåN§Ã\”¦™GäX…¸«ÊQTä9AR! Ü7¢ú"úÎc¢ê‚Æ ±ÿÇ¿„Z‚·_퇾í2*F.â/©nd›œøEßvÐ e^FWÐáDXM¢ñ„"å °`68mB08¼Lý2zÖãß·*Ug›0•ÃÌ&j@¨"qY<ü8tL¤k­ÚšnÁmt;£¬ßÅûéX‡÷TÚz)²ãëfc)mûÒ/À™ ‹iø¥¢¤½Ÿû›=E‡´ˆ£:lýIñàxaàúaç«ÀsoyåeD:ߤQëòïf‹Þ1< åéc)WÍQ):>¯8ªž<È£Ú´8PJXå,Š,gõfÇCÇ=ünOÞÝêOAÛ<Ϻ8fsü¸ãz:ÎÏñ˜ÁÊ÷-ã\nþÞCZ|Oa ?ýí3Á+ÁxP\NÀ#¿##¤”îY‘rþ¶_ŒijEøX¯@pþ8 ÊfùþÎC…|¥mUÚS@'¬i¸Ø—š2óVf#Ù0·Jع ŠàKy°«-Çß0={zp˜¸x\AÑ.ofùVÒwqp“àÜg´mwjÆg;NQð{ó·ÜýQ75HÏ Øqö -—h^+;÷rU¼A#·jƒw+á l¿´3ª¡UÙJS4šܲmL¸½ÆsÚØ k·78Þö'«•Èçt¸B̉#NʺWRŒ5 É„êU6×УÄ•'´Ä$³ƒ0»i|GžÄå4üë“Èy–é l/N­ô­í3Ù(P-WŠŒ_q:-ÑO'Ždüv°…•%P±ÐW™7Üq?`7ãOÀGC.ð^ôr‰³Áp¨LÑ|‡°±„"‡2" äV1¦ìʧìØlÙ¢ ¶`³Æ/™2 Ò¡Ø2ÓM]â§L‰ 3¸vLÑ"°ù|ö.Ž“f¼ëîÜÔn²r)u$›üô£,Z¬‘¹v†ôK5Š_5}ÁצKœÝ86ØìD€9Sš)¥îñh~@Æ6j|Z÷‡>Š;Õ­7A¼b}ÓÈN2rÇlƼhõCãiñÞ8K`º »ZwS\ê¾×FD‘¦ñ¸tgdzÅKÇ#@lùÀVêF«¹~>ÓœÌA>§?a¦ófÙ¤éž2îk/Ù¸ð&QPìÏ¢dÑt„ÔÁ8s‚-†¡ÐÀ¶¨çøYôÍù ð Ó†Hô¾kCóçò†é×C¿j@IÍtÝý÷DZûÖ¥ à¾Öª*$T7Ür›FoP‘åê…˜I3õa;Fq²‰WŠD7.ÀåÔSß/k9rvHðÄSÝWl;îØ± ÞÛ«_ °ªßrt#|ßh¹£îš†*Üß%pu'R„ŸuõH ï©´Ü'nÙ/¹a§P|<耇<Ÿù˜UVu1´@`(§’^‚qn]ŽL3H…4„…9c†^S²b?¬ï¬ùN–ý"'°eg3ÄlÆø…xîB^3¨ÕŽgÔÇøBÇ^ÒéLpÕx Ôs9Bı– €à¿A²Ê1;{!óÜרñGî¼Å¾ö-úBtSôf¨žó§x…y§¥+#ö)fjæìRø¡8X[åñ’ ¨-ÿèûA±Ó8vÐÏ&‚2£Cð([ã•q»ð& þQþ 4Vñ­oqp'ñÏ‘®hX»OÆr1ðq*–»à-9J5Ÿ*Ã*d!u8‰‹æ†.õm—zù S¾úÆô²~H\î¨ñáƒoˆæÄu®­é_"¾^…–:K£Œ‹ybŠ‹:Z™J13š<Ì9™é x?L›«J L×Uâˆù²ð\ðý&{ z)4ÑÚCÑ+xÊÓTéôU.àll> —:í6qŸˆü)×åÞ`$¥©J›T×%³ûenqQÏóö¨Ç \j{ ËBwÕk©PE„±K@êU[ámW¤Wy øq~ |I‘¦¿‚îÒ­tZÊJ£·»qGžÀuýHf…UÇ×AW¼¨°,pþ¸á6ŸbƒLrþ¶ïP[ÆÓ\¾€³ÞSôD“¸±óü²º… ¯0¿¼Ïò¿Fm¼Þya7ì¤Óø„A¯T2´¼ FEàô¦ ¦‡œÌ±èÝn€ ƒ™óa­‡]äFÃלü´QÄu9p*$ \è^b7-’­áúU°¯ š…c'®xŸ¦xhÂʺ'©ÕâßmJv8UÌL“:äÁcÃs‚ô¾:Ãúf ÃîþbÑ÷£¤HNu¢*Ça¤Ã½*‚e­¸íœ…Äòˆ?-|LUGÏmÕ!¤úkàˆŠ¯¬ÝÄ{]*©ÖºÜå KÚb ‹>E±í2²e9k%øáå„ÍØ£åR'wË+QÌÝ–†A—늠rÿ_ÑE/ “HÀG\™`°ÜàêÊÇëĶ[Ê”½Ápþ0Ê–C“ÔÃbÚ?ÜEp(¨¨ß_=I»´´Cìl„Ì2x_täKR`Ø_ ý”_Hñ4ˆÛOÃâØþ «†4‰ß4ĉ¤ä,ÕŸó1{ÍìzÔ÷ð‡]qXµLF–ƒÙ gÄÓ-óL½+B¬,aõâëÌ_²g8ÜÞO™ïd ¿X_Ž„—¯ÞV>fgõ‘•”§]¤žŸ*™<ô QºbǦҾ·gØ鯕D³¬ “1 ù¶¼\èì¿ëLlŽNôØÒ½—/1ý8$o™lŠM`XízwÐÖl=ÙqlùÔéƒæÔ]0‡Â¾-s&^‰oøÉ>¦QJˆ½³¼öõ[?ù>†¨xX™w%ÛT©\º©¿£ìâ[Ë*üQɶê¼Q„_ešÌlÝ Þ"¬÷!hA©EõamæcN²ê â&Ü]æ|‹º ÇSå—Ý÷cæá?æ}Êw`_O"Â&9%z+×+Ñ)kípNšÜ÷mcÕ¢£á½³;Q©´P¶ôfXTxgòüž õ>ØÜGàC?Äžý^bþ¶Õ_±§üÖÂu5¯-„±G½ê¤}êEßœ³ û§îà<'žgÉÃ]z€®PJ£͘ý4”ÀßÄ_T3l W4µl3y—œ‘^´Ëhd—Ÿa‚Àk‹6!W¶þC^„Ã& 3­5wÞÅHîvè¥á4fuè Ãt-Ýø¡²<Ú9Oh*ÿÒ¨O¯òoмã^ci±74˜‚3 .â×$Ô¶³ ‰<–¡Ÿø†;ÊÃŒ‚¥`‹×XÕdÇU˜ö=À6M.‘¨+›õlk¨^„›>z«Lå*`^ªVQš5ë’àæ ­XO¨8¾G¾´-kÀÅ€ŠÅ«DLêuºÅ&¬ŠîÊ]¡Û‡t[r.O¥íç·€PJòç58iìŽC×?MÍZ´¸ôö«tV%²_QÔBrÔàRµÏ2Rî§…œÏ ø©Ôu¿ike|ð ÖÔΚµyߪ# ­“ó‚ Ü]‡-ÒpF«¦¯KJ{u;(½=}9+7βæ4~Ä9¹ÏIs£Ò3Ì“È3ÀC­²ê‡ø†?»™ ‘s;mrX¥ ¨×Ó *gæ³¶2™L^¾Þ:ä£Ã0iH&]ý¤oˆ’¥u<íK[û@ª_¼*Ìœëd:¸¨ëDqcK„½9õGÝ_™@N³xŸÀUJEçA†,Ù šq&›q.\½É›¼)˜¿Ù#$:•²Ä™dGpŽWùþÑ„;¤mêÍ ÕŠK¹j“´`FCÌ<ø¥<Žj¼A4ƒÚfOûÂ+,šÅ%·lâ"Cg-PuP—Žf5,ÁÓ¸³9°O·’ ×ql+žKcp9 lßL#3VoŸOcâÆe?¤—¬Þ´œL¸†ÆÛYq¯œاÞâïwŸ:3p=tŸS¡âìø`ñ® ¤r4T«‹Å除A54/¦Š¾ì´Û†—hMq›Cè_ºo¢9öV§55ß™#_¨óàÓüÎø@Ñõ'E×¾F+ ßË ‹àKeò‹Zއ|kæ£éëz¡…Å©Zîý:=_Á©rúÕ8ÞGÂJ¸ôDõj|†0²ãu—ñ¥OBª?ûõ=¿É¦í”ë9iAßV˜ÛE_ÔI3/ìÌ99ш.¯äv›JOT’Ô¢cKº¬÷ŒVWŸ ûPÆnP¥ÐØOF*ÄxÒgOè[$@!þÚј±æÒ6¦iJ[Q–þ"·1cûϼžÐ¼LÃB4Ȩ%Ž eóAÖUk‰ˆ9`ü°®YU#>¼<+ÓÈ«$Žm4&6þyÝÜj¨²åÃðRÛÒª|P ¸wMŸˆbGO¨Ùp3`í…mÛ²&0K@ˆÃ3Ü%±-ÊAÕ|“Šô 2ÝI@"4"#$ß×N¹d—• «Jó»<ÚìoÅ¥vr{¿²œGÁzd¡µ¤±(Qè£øªÊšÅ ÂÙ ˆCž¢óæ*/æ«Æ|Þ±¯ŽSÁPoäxȶuç«iˆÒ•¯*ëÝ€­D»<¡Z„ÈN)çôw’ÿ¬þÛR€H¨( X+Éÿ²“DÁÃÞÝFÁÄùÿ>ºï®Âú2´”³$ý1( &C5VćŠEø¡Dƒ¡f?˜ ­vt°¡_ö§Ý7Œ,ÑÜ(H¦>Ÿ¯Ð¶Ã9_öw©4¨ÒK]Xp³í}ßžÞ €~=Ïü½ ¼öêýûõ¼íu÷HìKøgì%§±n&佋¦¯‡-j䓸ÁûFƒyð# Pa[àû@HCËLxøsO°Óx0\bŒœØo"!¾âO!a\¾PJÜö‡ç7ŸrWåâ‡}V„µVЗ9`3œú¦VéõÆÀO X*hÈ>³àŒ,gËD^_!ñ ãöÂ!@RlÚ_â@‹—rXfoVƒ›Î›¤ÚÑ› ¤ZïväidÁ¾Pà] c_u_y÷©´ûÙ¾±i °¡8^¡Þ¸ƒoY9÷½Åa­`íH–wƒÃCæ9Å™FÐ÷w;W(’GbWè~½²^Lqé´–ÚÂð…É/,î#ÇÈA²S^|Âè/¬ó?3mˆÁþìnÁ­½Ãc¯$úBþý|cw ¼øåönÞ„yå4%ÇŒu ¥’Î~XßÂÓ_µt^Ç1ƒ³W·C­ð†"ܬ±ª}',«.\-±óÊ,hHóüÖ— ’šÝxdm=@ØzÚ,C´¨' ¼—ª)Ö?Q¼zFKv½qì ˜¥ú[ù¬qaõ–S«LäMàâ`GvÔ +Ío3ÖyÞ5yµ«êØ%ht«'É‚´¨DR]žGèÉø“â‚[:gÎvç›UŽ‚d}žVx (ÙQ`l#¦•æê{{œæ,„÷§\š+Ø9A—ÛöPx<*ø ³¨ÀÊ1´Í¶9¡û_æA©âlƒQŒý\aãeî¿6ÇHS}+ì#"‡MîÄçÎLsî³™ñ®"œIöîV_ú«Šwޝ8ÏuÑ0§Fj ™ïê =>i3de‘ —¨ŠŠY8 ¥›KUŸÎ±Pøòe!•¸æë &$áZœ¶Žt™³µ™Õæý– ¬šÃ4×7¯ÎÁwàÚisf‘AHËšï“fh¦‘JölM"æeJh%š3öË"?§Œ?NsNSf¤eö.[;ÕÛ/†Ü u÷ѤÓmÉïZrÛÛ>Š«"ú 'X¿êÑPÿ€”ÖV¡÷íœj<Š––ð‚> G UÖ£Í0hï*¦zl_›—8ÓçŠxðÛ‰HÔ}Ê«_l(Üý²sÑb #ýU6‰þ“k•pÍŒ¶Íà~ƒ™^”Û™Ha8’E¿bpéÒÕÄ5GðÒFfià„‰J 5Ķæ. %¤ÿcï¥i´l‰¦•¶*mÛ¶mÛüÓ¶mÛ¨´mÛ¶mTÖ­sÎîÛ½w÷ÁÇxŒ9VÌ5cD¬X< ×\|œLÚGý³›>pü/¡Qú{j¼ÖƒÕ†¡Qû;møQŒ M.ß0À~Ýä]h,fÌÔÅÞã®%–ÏËÄnξöy/Žë;˜ŸyÕ–ˆç-*Öͱ1¶÷€WO*++ÿЧ«Ì¸Ž üB|"ìMb4%½Ì˜½vÁ±nuÒ!¨«[’e'Ð×-cˆÕš:ªÔVÌN')ñmD¿†CnRxèºŒÝ ê617]œè7À3›íúÃÌíæŒÁ*:,d'{ýø••M7ƶcÿšoÂn*(¦/œ;ÖVÊþ„$]"ؘF½9æ–”9G"¾ WÐlRõäÄÚ‚Ûi|b‚àEWPlilR0ÛȺ>ÄÆ4'$áBŠXMwlÖSóÙÈeŸ !r½‰¹‹—Ö¶ä~ŒT3ÀõQ ¦¡Ï)nü÷L× Ú¢½²5c€¾t£€è×BÀ–³Z [lWóūޔU"GîxŠ©ƒD´¶ÿŠ iäÐé Ž³ßh‚7­‘¿“L¿æWI–×/ Øwnóc\¾a¡NÓ}fôJôú¹/T/GoÚvuv„¾Æ )ËZ„ãPGº”cº»w ÀCÖT˜²²œ0³&E¥L7:LF޵{nÿbbˆyBˆ9(`¼æØq¨‹.O®_­ƒ…{R#„I-àÍ £Z‚iõ"“k…iµ`ôò•hÊù;÷Ä}BKu–ïìþK;EÉveÕi\2x °ô\ h‰  'B^S>Í)ݺúÎEö4dAZg8ÒgŠdk}3ó¤H;“bl \Š ÊñÄSõ/™«:ò¼C&2.kû |Ì¡±Í½…H+HÅÜzŽx½É Þ<ôUCšœ•,Ú‰ŽÉŽ)µÄgäŽUÑ{Ó?±ËkF°Q\±Iyt6s›ÚB,ð6P…ÒÿTÆøÄ´ô Fç ÞYøÜ}0Zý!T©®íCÅܾp™rPíîæh/Y]WskþÔŒ®r}9lëÜ«rµ:MOYž±bg-r:¦K[y½‡%RHqìI1„9—BÀNÈ_””ŽlPßΰ-t%_‰°Óõ£C(!§9n…Î,BHžÎÕº¦­%ƒ²ú9óG†»ÍãgÅØöñ" ¨´L>K䨩&ŠmÚŠcvx¿W f (·vq ÈËÖîö©<½áy{b1ëN§{ñ>YÄ>O4aiB8ü=R¦ØíÁÑ­œ05e¬ƒ½¾£?ù×n™®bÙMSš©¶Ä‹«3Ô(3”pTõà] Ù4_è‹Åæ+p^´mlùãMµÕ[¦ÚZ±Óœÿö­Çc´±¯·ÙŽIä¾h’…3/i<¾÷bäšS:Ï–CçrãÄŠ¼ece®­bŸ²y¤`ÅÍ· ¥ÉcÅd@Ìp£“’p‘Ä]¢¬ÀXãÕ뙥ÝGŸX[Ö*—_:)¼:  o uÏ éæ¥p8ÙÕÌ4?ò]’Tå@¤P?>-FG›§ËåšÂpF»Ë–‰…´êí×´Î,‹Ó£@ìÌcEq:›Ö©]:Ç“sJú ‘ÃÁ¾KÝ1Õô Õ!¿[‹‹Ú‰ ÿ íZèYÚ1'|=%¬Ã¢{[…>„‡˜Ìú VÝÓ¦æÞo˜.ý€WmÃãZ¶~õ ÿWê»oÜ»MŽÍ™b‹@¿°NÒÓ r+3²ñ9·I [€7BãJ–yª©~®ò²Œ1µ®Ûà Ñ• O±wµ8ÖèkÄ héBÄ1Y{/óПþ ò¬?ÆåïÍ;ØÑ÷­ï¥‚–¾’û,¾8C¯–E‰ ¬ÛÎäW]οÈFiåç€Ëåù<¤cbè°MíȬaCF¾!=º“RÙ¾¤Œ · eÈÜÑ™Ÿé-½Úñ™ ÔÇFÚIŸ‘³úêÓ}o_‡Ž…Üe:f:¥Ii"¥¿Îñ¥Ô8† ä²)á⋼Q¶UÚ¸ÛÈ”W:Å‚++1ÅNz™ÖLðr¢âðRUh7dVó»GVvàŽê\«U¡¬ÐµZ>'ᘬÝô’´ªÎ*¦ NñA·ämÌö#lIÛlÁZÿq7úaýbºeÍÓ8£°øÆû‚HçœöãŸSˆ‹Ü l0 H òÿg»‹‡²‹“¥¹ÀÌÌÔé?R‰U}eSÔ?>×¶öê0—ßL+õœäkh:¦!Ð Y®L9oæLL¥¶nº¸×]ÄSC”‚û`>Ä`eŒšFîs"-"1GAö=o{‹;²É(FPoÜ»´º‹¨¶N³¼»ï9Ü~7ï ú7>Ÿ þ>èb¼/Yˆ¡Ÿ—¿àA yÑJ]bÃŽÞš,ÂDq‘‚ˆBexŒ4Á©:Ógµc…6Ï2¦Úeœè”Ó%cÛcuÓ%­~ \ØÌ×£.…ŸinêÆ L:Fþ`hºÑ­Ýäòïp×Àa”ëó[aT£D™7¦>j‘q‹KZ0¦eàÌr´dK‹ æ4/2k¹˜%N™1K‹®æJçºý¼§Ñ)½”†…qÔÙh|š*6*O:gä=#ã¥RÁ ÆU¾üégwb)êßÇDÚš"Z:æ+pŠC¢ꑬ9T՘ݎÂë.Óº¡+⣵);-?‹‡+‚BÖq §{A_gš¹Ý×3ÄÎ`ŸŸCOÌÕ:WVfY®­*»ñ¥gón,¨–¢ßU·?©ê«uòx. rÏÍË6d . -|Uo±ÚêKâ’5*ŒPùšOµM袟™ï1§+ä¦6—ÎÀŠúO”à%rSkÀ…´¾OHNÜX«e*e¸¯úD µ"tj<_pü:Ì×Os¾ØZ¼Z.„ß2Ú1PÆ11¸XôÅÔ„pZò‡Ä)LjâŽo윴ÕÄ£7¢í~jÑîï¨3D©3 V{ðew@QÖGß%Ë3ÜWŸ:`_[ö3À÷;´ý…|­Ï—ÉV߬/vÝÇ[ŽscOS*Á¯†hÆ¿é¥!¥w³¤ü|Æ‚’Ô·^sjÜRTؤWÙJSˆ4”ÿî–²ïß Ùé •æ¡X¾ôN !0¢æ;¸îJéÑéßU;Ù¬:¾'—~þSUyP«9ÑïÃU.æ¬]uÈ_±¾•ôôt)}? /¼Ö‰[Z?¡V è¬jŸZ®ëVúòÏô2tKŽñ—^àÿ“n¦o~S˜LÿƒXºÕ6•QÔq¿ÙZCÁKЈܭ…*ZÀòó+¬‚(ÜH5¬$˜ÆG¯…í]¹l¯…'£R[6\Ké]GfÂ]&Tv?Å9Û¦ígÂ\p§ܧ_=»·Ÿ¾§6ßß§³æ@?öB h9¨‰µ¢l9È3磣Nðæ³Óîíà|— â`Ó“çãü9œ%G’ à9¨3ϱuУÍë<£™è$1« ]Gg*a,5å¦Íysz ·—<'»4˜{ß„b¯ÊKÜM/‹úˆ¢"m“¤Nœ!w1{\·Pø’eLv±W›¤´•Òß ä¥®<Cß(œƒÍ:õëÂ+ÒÖÄ¢¡Ÿ,m3¥–PfFPWH’–E´›>­²†"G›9ç†ÈÈå)§zÂt¤^`M'—<‚7ç3•Û–˜§5àœºu_ìEç¾5d¶á5²£2Ê#u£%¬#BÚ‘&ÄÿbU‘T8eÁCã|:i¤Œ9’ T=sa†xÀ\L´¥?j›Æ(”lK eGn æªÊyåŠYÜ™úêÊ4Æ×Tí¦ì¡åç:Gýè¾O®tÐ\y †ÕL€LÉ÷‹«À WYÈQ$(s%¦Ê•Gɣ܋ʬIìŽÝOLƒ–Ž{ÒÕ&·á/?tH¶׋€øÑ( /+ʆ¯($[ô®@ºJYÐŒÂì©Ú äãÙ_!Ê*°ÔX$ÍémáH–,'FžGÖÆÒŒ,Wך.Lù6ÅKAÏFF·äçã Ÿ0Õ }}„Wø®Ù…÷» äL .Dt«K;ªËÌZž)J“.éQ¶A| S`õâçWÒ–(¬;¹òŠ+¢'YäÙ\0´'./@¨åïeRk•F¨È¥Þ’mÔd“ª[´(Ç“"oªÐ'¥_VϰUônV4¯ŽˆWA ëú`Óro ¥ËmŸ«v Ÿ¯ÅôgWãµtrt uùJ»Ã+µÝ/é;Ô àÙ]i„œºml¯M·@ã·¶p»÷àM?ý Kõ÷@÷ºÇþ\•¦!|©X’B'õÆ’¨A¯‚™±kñ:³¤g[¬ë[7Ëmr¢˜Ò!4J­Ÿ’yL1"ßdà Õo \1Ès!v‹0nŒ&TÁ¼È]‰#¨‡Óæ ÖÏ:cæ€ÖØ&Éåœ>Ö•éFq‰‘^ŸI{N{,aLžò/Ð÷ªmÆá5rËܦ6‚ÇÀON“ˆ=¨ËlvVc¨§)3¯ôkœAë+*Y§`ñ‹]ܼè£õø?o.™R¹éØ @@µ+ó:èQðïKÌÒÆÅÔ‰äß~•Lìíœÿ±Ý”¨hÊ£(¢~ÛUäD+E…¨QS5õÝ4h oS‰ÁŒÛ98¤W,R4Òóµ‘ÓÍë"²Þ/˜~ÝȀɖgŽg;ß´Ÿú¾rON½äõ‚œj g’%ˆé×ø’B¸˜d9@…pçX ñ|¸b)}tF¡ñÈS8Ó‡CÑ´ùïz¢© AÚÖ;Z “ yn&;Љ Fx/Bˆ¶2±)Ñ."gª·7%Áß…SòˆÁÈ»¿*—>À•Ý}±û† ù‚›ÔÓ© @ÒÛÿá¿—þ Þ›vôù¥—´‹óà%í{{q˜rÈ]õ5‚‰W¶âô~cÞLë(tR&¯»œj±¥L«¨†¿ U@>t6lwÁR3]ÜÃ!“üòÏ¡¶—í—Zü×ÚÿûPüOBñyb´,ÌbÈ®E³¬g0Q-ô¶•´ÌOIѺ“Pw ÇHØ´~ûô×î8r\Ëh1!‰Ø@ÉÆŠRi•ØŽ;ü-ŽGŠ÷zº’¶~–UÝÀz®‘ ”ó%•c=ê݆‚5á:¹ï‰¨á6VÑ––ôm ùWñÜ‚ÊK%\ð4–³ç›XJ5œ»¦3é—pNf ß?{Z_” „€ Dö?ðô<¢þÛOYëO.Ùt·$=l2­‚X¿¢ð¸At}ªe€bµS‘ë³ië¸-J*ûM·¡¨A³² ÊÒy6оÂ=¸K±«ê,–Üéf©ÜéÉçÁÆÒm»ä"¶ÒŸïGû)Ïiöé5Ïì+üÇ@o'¤Ú÷ù 'îÓ!âÍ}!Úk%æÝ!ßVQÉ08ÇU$ÏQB•»ÈÌ­ú]9Bã]zœÁp?¤ª·„¾¢ãRÂazd\ù[9_éA[dœô å騪·ÔL^ê ŠÓ[4‚üAc¢çDÜì~pàìç\xUÏÏSúÊ·ÄȤ……4UoQ;¼„Þª\¤auo‘öåo¥‹|[ÑÌN¯Ú‰-¸¹©ƒšœ¸Š …{Ü0bà?ófL¡ë ´“¿Ú¶ÚÄ vL5ÚmF˜À’5ØŒq[úžu½ž|>†˜¦|(c]0Nc<¢üËX3$7lAjç¶Anbm²a̤Ì#/Þž} ^O¨n ºëé¹5Y’ít¶×"‰+i.¦Ó\Ö ß;r¥D\¿#$ÊZH”[ âµ74P+ïÊÇ ’„iÀmb~§¼{g…‹ÍÈ=Àäî{–{s„Î=œßÔ4ŠÆ€üN©MIwÃòz 5m•hE{;ŽÏçNq¬"Kúæ°Xdˆú€LR‰ ·äDÙ+jôIÜ©yz´«ŒŽlMœXšç#Išo·dLÁ=gŽÉéÌ8ê¾»“Ë_?T¨ç ¨˜l î2`.´ð`”ŸÛ“ãOªç‚Ä¡°«’ÓuXdúÃ.˜¸ƒ£ë¾»oüBYoëËþ>Uö4+G…Á§¶lx"îÇô@ñ$£+ð¡pá¼Eå^$¿“… UX^æhÎXÿÜžq_òÂÁ`_}pù`õ@4RD0O÷æ  ú.pIgl;‹ðƒ ñ`þh6•ŸÔ@!óÖ©$e±M ÓSµïu¶2 3cùÆ7KÓ]Ù7÷\5ØÐ·e…h&U% þñ Ú±I´Å[Æ?{Àpž[q†Í4fõ†D5e£Réƒ=¼éÕÂR§|g O¿G¶ §L u æB¶‰»h ]ùA©‡š>Oˆ1Ý’±žÜwà²ÓPa——+5ØÔ`œ¡‡žœÉDýÊ@UaC8Md©Ú?} éknð ]¬H…èYdºzŽ…Åö8eù‚¡·tÇêU»Ãï¦Æö%Ozö‚çuOYH+ãɈœ gkÖâä]DLª1ý<ÈÒx’Ør½j•ƴ 6²bZo‹9• ýí¿^ q3nV°@T—²¡2´ùÇ`ý‚ö[¹ÃøJ-`$%hït”kŽñäõÐ|¯="û î–°9Hþøc`˜G!³¼€ê®; `šb𙉎T¥ÑV¹Rèô˜<4ƒ—äz*¿ÝVkX÷±:äêVò1Ö ÓQÑXŒubÇ›’¶í§Ùüªß¼2 bíS15©Uttt(9¿Ýa•9†”Õs.s‘RcòñÐ:Q ¯µíAmnr ¶õ.è™—CûÑÿR‰Þ¼žâ…j”¼ñºÉÄöX9RªÛ¢2¸cuö㤠ü—çÏ.O>:Ö l¶ûáØºªŒ ²3­0ó«Üßœèë(8ºbfcrw’Á\¤—4ž=Äö§lh˜ž™).•» I똡ËL÷ýÛ´(œK»7`Þ )­ÈëdˆÙ 0]Ï>mIb<ž²eh©ïT›«”¦›ÆÓÍãð2ÏàsU(Ãáü =Lx·,0Œ'ìN[@·fe¢§ž ffÆWÜ¿’GÔÂJ¹ªNŒ*dkÛ&pRÖ0‚¹Jy†¾ýr{ï6ßÙTca,_´b[(æj›, Ž¡"ð-NOŽÃÛîˆ9ÅMD(-û¶ñ˜\ö¯ÿf¹ŠZ‡wYEåH°ê%™¦Ù±™¢+‰Ø’¶£?*7%7¦ßñ¾\ :´‹¯6r訟9²ØÕž« [1~#ÿ9¨é–Þ÷÷Bmf ï–O¨„ï ß3šó¹‘äÁáC ½ÐtÄ·RÁ jµë)ç‚ðÓWÀ @†èÀŸÂ¬îÉ'?C#NÇ{n_ù¸üJæ)ÍïœéåÒ †”ŸSïcÔ‚†âùñš1èëøÀ_§0Œ[ U >¿„Æ@@` ºCt2þ^Tî6²£¨s›ºT¨È²õ1cT_,VŒ0©ß§MâÔ'ù–5H-V¿‘~Ûïkõ¨Í€Ñj„¤õ+™ ÜúW€NÆo×P+”i+úA€"d»¯¿¡wò8ïÌßðV¶‘ë ÷izFÔÔÔäÔtU²7^ç=„g*áÍSž´b÷ü(Iˆ#¶[~ž»¶°ønˆÛcÞ&¼;Èm*=€'»`qòðɈq‚IÓÔDG74iKs(>(KZâ'4†©Þ!í-‘ÑÉi±Ä2ÔC<õµA8½¦g¸y3²´`+¦0ñb' "•Gº~~„°³›®"h»Ý‰BßQ âͨ”ž ž›¬¢îú<”î8g¬Ø™ÔÌ~ìÜ;U… ž’—ýûx aÜÑ+KUܱÜÅ*¹á¦rÃQtU¹`p…¢§£ŒKûÊê#:{n_AéˆZsD¹×>%‡ÚžûÜY"P²¯íW*¤šø69#³CRvr_f¹vOxéÝc9Áà´’±­˜uç€,]ew‰? {?¿Ó_ÛKÞHì ¤k?\Ä aq÷Õ¹†)—¶,‹ ÿÜujßÂu,ŠÑàä³·af ëÜ#¸Þ/ ž¥¾=g}½¿º)ÚlƒŒÛ×Ã=¶âyžX?rSÜÔ=šaDµ;P+”½Å¼9É}: h¾6ï³*—¯E@|Í÷†¿fÆlT:ØúqëüÏú¦ú¶SˆüÿÆÿ¿õ”²¼ÜÿÒp%*ºöÈ‚¨¼ƒµ4›t ô5Í-è”!-ÔVÍb‹8¬ØZø Ïþtš®c ˆ¿5ÉHž€¿)sBV¤ˆI‚¹_gx_§Ö½Ì_OënùPïyb)Z’Ç©•%úú\‘¡¯0×X pÜÇOíJɺ{î@Ïq܇ùy°¦ÜrÉ¿„ÓÜ: 'ãi%{-[KTÞÍ;18j§µ¿’~÷(ñÍè$wHPhiÚFhõÅÓ5»çmÒ½fºrn‹°p:°”~1(ïëqå¢à2xOɂȑ_UÆ× @üVXRuâqܲVù ®[<‰í&ßv[îÞTA½g ‘ãb‘Ð4ŠÝcS^î4Ø(¼„t )>ËmCªêULÅr—þåDö•š³8…ˆ†l­ÔÏ^*°XNÕpº:„#Ϋ£sìš‚‰ü¼QÕÞpé>MŒ”=Ñ@Nör·$Ã.;Ähl„žÁ’›¡1Ì7í¤$Œ©tx]&Þák'·ör¤¯h–éÈ\­¿ zìg\ÎÙµˆ¤çƒ©â”v#OzWÁ\çz÷çòÅ’ÓôÕY½QÇúÉÇÇxN‰’Í_ [¦m¡üÌ8ž?†Sh:ÉÍÊEëô1XÃ×Ë_Â׈öÚÆFœA€ êE"½A‚·ò»Jg𦻖›˜ŽaîËìéÀÀ°¡“JyÚ©4=Š8ª½d®æ;3²DÍ<;Ë¡L9‹öM' b©ãg³ŽH)!Ê @ª^ÖX‚“‚y¬,IÑ7Ç×v‘{ÌfͰÅû?¯E…º¥!0 AØÿv-þãLtNª­2¶:êèõx´-–P,ãj„pŠ‘R2«BU¢Âü7DVÉξHk‡´=#™^!~ÁÏBfùs™]VeÆÅ©¦ÛÏ.^77Q%ü‹1¸×ÞÓ-gß×çÙ›Ý?_÷äþî§C™{³LvýνþhM lÆÃ0](ÃZèÇ.„Î;8X:‘_cE ©:m‘¦v˜Î„±häj {ÓØi5°kˆ¿(÷8…’¯%Y®À°t¾5×¶SáØ‹>PǤ¬Èâç#33XY’à~øÈs^až…[½Ëì L^JžëæçS¯û7ÑãAE¬1µz–Gò 3ÜÔ˜·¡T£Yõã/-0 K«(*ÍÔIŽÓHnjIMØIx„ðk q‹µåW:ñ¥§ü@0MtY!<Ã"ÕÈJ–cÖyM­Jüt’b§°ÑrÊ «V`b™!†öz·6£ôK#nY!îm5ºNZ†¾ªtùék°žU¦ñ³¤,²1oJh9I«¢v‹-y3º&^~üf×|·ÞÐN&Œ©¬´aƒ‹~ü#7ý­dˆË^mxVéÛMøÙ;Üë 1I£“Ø™‹dÚi¬²“œ:‹êPk<‰‡<åúRÎAÖoÞx3°ê•ó¾5Äkûl¼Z>ê^}Ñ|˜9‘£;1½!B$ðÜ}ZR»n“·©*¸×Ë©p´'\ó ÍæKö9µÅ/Á>Fag帣®ZLhÜj¨K¦%é=& ³OKbF¸eW-ÖUžåËÝ.îþ€~}Ò¨‹ôÖ¯S>(,M}¶‡®mm΄Ò'U›)ÁÅã&Ë_¥Ý©ªÇÜro¡“ômOÌ*ZxöÝàÝ#äéÖÉypãô±hm´("z9Ð `U_œå%¸AVûâì`؈üg¦*KMM¥+[€O,™µKÛÔ¬Jq·S¼>ØÇ|YíÖGå{§±G9Юÿôõ +P~î„ÿ¼²a¾z¶À¹-â*:lÙ`׋MŸ r¾?ÐØÞÂä¿Þå ÿÄÁ·É×€vÕÖeáéç#t­½Z¿+{対rcÛ ø‰<’³Øå Üc@cþ¶ … ]hñ½Ù¶Wû…Ï¡I¯¥IpÓàûÄP‡4eÌÕx?äkˆèK}õª¶vneh«£!²HFÐÊå`›ÚÏ’wßöÛT Ç;.=Ï?Ê"ÝäÌœÓaXl²¯TÚ`sàðJœ?ø JÀz9Âoúµ=ñð.7yTǰ³:©Õ²Bâq‘×ô³‘ùI2Dƒ¤t“'Ÿ\ì`]³+dC(â'Áèy [£ þ’áæÆÙ aéßeÚ[J­H‡U¡\Â#M¡ÈNáñ§Pø4ÑP^j¡]Bz4„ôȰïÔ°ï¼ÀÎGw¤ |…Í?ì’Ò Ü2Œƒqȷиþ¨N5Š`ÙµãÐí‡B»M ø˜ì[™ %¶áñ÷½ÛööݯFºZ;Ø#¿:ìÝØìÞ`@5¦…׫›nÝ#»u á‘ߌM‡:^‚‘U´.†]*wxæKÁÛÅ»LîÁ^èseÿk…Löš}ö¯…üŸàÿ7*ÿû=/ÿA„¹N»ÄlðQ nÄŸ¤ºÅ¨sGÉúPÈJùùAVõ+ÆWg3±cu%{ oÉÌq‰´®/ŒÌ™‡ç·@{ ô0¶!t‚5ër¦úÈ™Aû{Ç­¦G©ö ´¶Äƒ¦MßÕÑܡү𧢦DXöL„`Iï6¹ÔOPu!’Oµ Ç‘~U;¦iÊ[€¬gçÔ·­…Ïq{ºâÈJ$©‹5FŽcîÙ:UÊØðùnë#t0ÄÅn.ÂÝlyí[x#6Ôìoh¼0B+[ØYß;„Æä"rûü¯FqÿOÆfü˜ü{kÂÿ‰LL’´2Š âèŸ$WIüPq°< )d($ŠùŸ„èèîŽI4ãFk Y1!ªÞÀÏ{‡ÃQøK 5DR´ujï4^lYaˆ´ÜÌÛÌ¿?Ý^§¾¿ž¹ý §Þç"鵑ã³Ñª ë¹È»˜ B«éØ E0Ó‚5GаŒ™F°Š»L/Ä2ûù{Kù”Š4—%Ä[ì£û‹p(m“†1¼TjLBû~¡ £áV2,® Obai8o²´L­S€°6E59Ëcm昕ešJ£te즣uÑ)V2ÓÏ\êtÉ*ÆÁ¹©ŒêÌYë&œÌÙŒó3Ï™&ä‹C‹þ…FE€ìvôÌ0ÆÇ1%@ìô8:SŽ¡IˆHl8ä-´”×Ä¢Áɱ ¯_¡ˆŒ…;DCM5 $ˆpH_ÓJ ãÜKF˜HC( æÇ@]>S-U[(%xΙ|$ÜZÝÙz²U[,Œ™c’ÓÖÆò -¸ù}]þþ(s‹*h²•&’å­Ï:r™JšrAi?*¼Ä†Ì„¦è )3ç dÚˆˆTÏÇ‘c^¸q}èuòR ü´£6o¶]»ñA+ÄËW7ËÓýç¦; ‹Cúùqýu")Î-$CŽ>H^à¸îUº_û¦uw¢mÒñVŠ„o—\*^h€ŽHlÇ›%9á‘,®P%Ó9Xæk9P=Æ;Œ‡†,È1]céÛ¤Eù>Zƒ”Åw“ø‘mŽD1²ÈRû5Ɇ,ê,BSHNªï£{HÍîš×Ø(×Û(—C+¨+¡M(‡™¾”‘˜#ªž'sQz|Wï¿èúí= p\P  œÿ>f”L MLþ)f”tåQþJüÆ×s×÷R4ApÔô’rªB¡%ìp‰%ȆdpôÉT›ÖH¿Aó]BE" 0b1cý§aHc¾r¿wó]*ÅÃÁ™ívæ×-癜˜¼*y`—Bua0XÄiÌç,¹\ÊãëÕ‡±8­I«$1XÆ|îùÍM‰áÌ (37ñe´*¨r8íÀ”sè½b9ס,õ,>¨ïÙ–;ùÊ¥—»¤²Ñ¢>õ¿ƒ0NO²­Mm­4nÚ³ò²Q}ܵuÚŠÑ0u›‚'~l^–Œzc¥TÎ)ÄCb}Œ´c°ÑÌ]žöhÖ?Âøàà™²¯*Žv\k4ùQÓOU²Í×þäñͱïCŒšO±HÚ¾‹;ÖÓ¨|U¼ù8ÝÏâB,ÙæNô³G![Ë^¤ÔÍjÈ,k¡È{¼G™Û W†õ°²ÈôVÛ×>š¥é¢b“djt?V; ¡éW9£,úÔ‹$Ý q[ß`7·þœÑ[K"áâè²át°ßÿÂÙŽRØ­€¿ Qý@²ÿ_ý—r²òåŸOPÛ¦‘èÑÙô˜ MW“„P å“À´šr‡I'éÛ*ÇÛ_ŒFtï XÎpÍôôvFqù^nrçŽÛNÚªòNÏ£‹´6em¡ç‹iR°Ð*UD1ùÈÚ·¤Çœ(hÔaqÈ7h†µp²ÆÙ7U MèÜÌŸåÿ„ vaw¿ìïSSäNÈnýÉ‘²˜Ø¢[uQ¡>ͨ;n!{ú¹Äº´«ŽXêì:œšƒïïÎB»²þRòE’m@[ðˆž5‡= έ— (Htšg=¹(y¾þ&p÷Õµ 5RAÔÆÆXß"Æ0 ™mgï_ª8 ®[L™H6Kº¤z̨Ý*€¼Úî  a ýù£&PÞÿƒ ÀBUYð¾þ£ëÂóW¬ÿe›ý?û®Ð¶)CøW ¿þWµ×÷]ÆÒå¯ïÿ¸©/DyÓnQ‘7ë ¹³”ÒRIj²†4YGjúiˆ˜*Þ’ P«V‹|so¬™xSðŽò \B‡ ÿ ˆ†ñRÃ6Ÿ2Åôöjf*ƒÙ|¥×÷ÏôúMúœãü©›#85Kuf[de¬5׊‹Ž¹Â.܃'èwì&‡+yDW¾_š`ç)¸žS^÷Mí-Åõ/rÌÈXŒðšùê´­ç`ØÎ­Ýýò×õ‚Ä®g#ˆí{d$Ǽ~Ot0"«OžXpÎJ9Ìçëß R:ßýø¤¹öÀ~öü·6öª$F%ÑX‰SÁ:UòEuzò'L4§»Ø×××BÎÊY†÷Å(±…µîãbp„Æ´SùµE†¤Ýªçr–KÙÉMK²rȽ Ð}fçnÐrN-jXz‚ð~¾"…œ?tÆœ¨Sä' Òø`äƒ\€R\§_£.£OXá /¥üx°J©@,*êqÄâÞF9„M–û•ɣ®ŒißÏ=h”º5Á‘)›ñþâ‰QÙS2ôÃ(0ÚCbdȃ¦d›¾ŒC¡°Y$UŒÿYs¡XÀZ–ùû_{—.Ï èJèç¹Ìþqš” Úuù}÷uÇÆµ1#~:4ø/AC‰7Œ;E  þ†ý Öï`Ÿ(«!ÓàØ˜ j¿é‰Þˆ¡eQmŽ OC%ÚdÕÜÒ²â¹ÔØ‚ÿ|¢ðæ·;µ¹.ÛP\Oûev2uëóú¼sÂ.N°Žt8¬AžlÜŽgÎ)hàAìÀ¶+·¿‰K¾MuÅ‘–WÆÕ“9ZD…?}ºi骳Œª3F¿ìªsÆž{34Ül>ã`O¯a5júÕ³KýÖ¾[uÕ–ÆwR°аçŸeY«Oȳ¾ÂÜ;ÕêÉo% ­i0nDáÁl2®B‰¼¯&ŠÝÄÅ” ´±1k̸è ë–lf'Û'㠳Ϻv·C–yÌnŸ=—ŒÂÉq'ÔjʉKã¸S‚Ô‘ð½ NxCáþNÖìʶWgè§¾vOÁ«s×KS}c.mN±_ݸç‚è̵ç—ÔI·cçpı;™Ú“õḭ̂o½»Vë¹– Yh½¿v…üÜwÛpLÃó;VÕ¸éûá»ÓߪÏy'ç»sÜ×ùî°;FE½ŽH]Ÿ]¿}Ù÷ù¶>ÞúùþâêÆ}'ÈÍw4D·5¨ìuýö eãÉw}ôÿ"Øùޱçú´ÔÕ;[âý%4ÏúGƒ‘ïõðê nKÀûìy_YF’Ô&ãsÜn®aßîÚ½&¹N,,Þ[6hžÛž=ÞHÕ‹(ä÷LýýÝ«÷g¨¾ëÞ¹˜ìÌ;L`7âK˜·,”§¨t¿ÊÊ‘µõc+!IîA™º>f¡£æ¯c¿1Lò Çü–qûQ~b’){„Ö–0è~¡Þº‚Ê-a_OZx?Àµ°§Õ¹{¤âä#ªÔ–?q¼¯e›¨Ê˜0­p7qáB¬}pFZÂ@e}¬}.GgjrõYSÆj*£æÈJ•¨V?f^2½kžxªY‚ff^ ó?lHž4›äþ’þÀ"¢‰à¾X ÆíésºŸª—s Ó˜8ÈÏ6ê @Oép‚ÿîr1ºÊO+˘oýUpü]Yóðg)š «º}®’ð÷ˆN—X )x)‡lOêH}èAÙKA4ÒÊD…Ìà<"KŒh›W!Úªèyô9´>ãT|à@ì¡MT¾ÖÆ/ÃÀfÛ~ôn\–g1ïá þ^ך^:žf³‰`b)hÁCbíªU-ë3,ÂÆU­E°$ý¹Açƒ,Ý_Õy¸ëÞñö í‚ÙàOÍËV¯ˆ 5´Ñ­@›“胊·ë%ŽŠÅ ³ÍJ4 Q¬ìŸÚºm¨†ÁˆP±¬‡Ì|D-ŽÏ`¤Ä³Zú§öð´¶®_°czgʘ!UO]Ÿ>Ó÷–e£à¤Çß+ñ½3/«ÄîÄÑò¼„¸&½‡ÐàYÓ†BY|ï>!A…˜!uÍË»BÁÝݲù[T±uñyÜÓ!ª×²É*nŽpåãúÏ÷çOÔÞ‡ÎÊ/»Ǹö&(± = Ý›B½\NÕ¦¦PÌßÄtÕ0&s˜´>fMgLZ&VéD|‚£Ì&,숬8à á [l“Þ¥naX†2(À´¦S§‘¿DùÆIøeÐ?4UDD‹›wHä<ÇÆ#ĶÙ@opìµÉ~§ŽÜa›$½Mü¿-Z6þ8ƒÙÈiNÞ;ð.ÚÀ¿w¬-þ ‡„²&=WˆÞáå×/^)Ò/žHMl¯ Ë ›š¢ª‚[–Ï¢ðl$÷u w*AKqµ¬ÍqVĤ öÒV¡gÍ<á.±ÖËÇéD=ìè+˜·œ"sa_ºSøs`ˆ~ð~R+Y\LðäIÛÎÆ»•‰;(˜½ÉÉ~qªcÎçù™Ñ6RNWpê2yGæ‰Tªõobݶ@{lè”ç!Zrü¶ŽO9H²š!·!X‰ê!ÆÝEHy+þ›Ã/Qqæ´ _ÄúžEjs½§ÔÕóÇ-¥´j¼ÍÎŽÒ®l7í´4Ã*7|ñ„fS)P˜½M"cÊB“Ót(^–’+Ñþ}ÐpC @“²§Ü]ëòûÚÓK ׄÀšèøoB|¯íhcý£©)©Ý‘NH-óK­˜PÖ®YçëY`Ã÷Ü^b&ߢtí·ÁO?Çx:í¬¯+Ü?”èvò•ÖJŸpeœ¼Ü}8á"¸ƒ€6È›’'dÖ+\ýMlU<_p· Œ­aÈ­‚C÷ô™/•²A;÷xEÀù[WÑ  ·l˜ü>3^lwq{ÏZÌz(Œ·nØ)cÝ-k=7§Þc(Þ®I¡ßq3ñz^E'¡ÚmåðokHw¾|×&þ,CþÒô›ÔÍò±‘*ßê€?‹÷¶Þ£±·oø=ò>6òöKŠùÑ„-©ç¨±mƒJéQ°¦Ëô ö©É]‹¬ ÈÝC$ÿæ'û>2†)H®®¿²½Í¦ "ãÆØ?þ¯.îiöö‡a\¾Á›÷(x"ò6î™ñøG_O{*‡,?¹|#ô×î©ñzÍ\ãî`)õßbbwܸ|g/ægTZ ô•³òÎqMå:¢lÍØuýt¡¾„ÂØC¢¯õèŠa7µÌzŸ`c06]~†—Ù‡ÙWi? bD TD‘x‹ctH´DwH Ñ!ë“\rÀˆ_hLµÞsŽJ¾ãÉœwHˆ¬ÅH(Šk®î pyêCcØJy«Å÷²|dV¶ãI0qXB xMfÐöh=ÖÞ]óÅlŒñöç&óà<?SÐOÀµÞLãc%Ë[÷M+8bìÉÏÓ#í2©É´7/¦¦=_îU 12:Æ×¹~ˆ%½ÞÂDÑA vs‘SR‰]¤ I Á! \úìðUQt" IܸU‹ÕÚzùⳎx F Ýi ?1u! 4Åö…>£r_À’9õ¤˜]«œŽ¾mô¶™rðêÙK4“Ö¼Žä˜{%Ô¥ïÖm·ˆÖ½íâJ=qp::¼šwØi±ÅhKÅQZ‘‚ØVÖ%€‡H#¥>y°=í^Ù•=ExhjêgÝ*ú°±•¶Ã p7ž û8jêg2µD/wÕœõdåWTlWfBo®GÛí1~Š»Ýj˜ÇÔÕLœ‘wz©<=ɸVú w-tåóJ2õP¸—ö†¸Ò/¸¢ÏfèÙ¼43f0Ùïq«a¥°ìK5ÊĹ« †Ú› ‰¾k!¥™v¯TFº;öÊAÐNoNçàçu%^67ƒck¿ýts¥X›’ºèÖ',“)œÖ…½FÐâ0ÚîžÄx„`2;.d-ØãÒ?(ž}‘¦²4‰w >׿íïå&lJ’ÜEkÚ…c}»x{Êå!Þ!‹ê¯ÜÔþM¨ݤVWÊ@{©v9Y~ò~Ï;×bßn¥]U7ñOg|m…žËõeö=q¡)6”‰ ºßÖùÜ–Åò‡ó^˜êƒs‚ïc}Sž?¢á 1E0Oñ%Ë"ÿaµøÐ¶1Ž<9Fû…T_;#J(´£ØqB‘þÇ9‹Gù@õÏC—-a(I¬ Žz‰)5îÎŒ‹tâ]ŠÃÇßo£Äj*¦ÏJ+…ð5ß‹–¹nf¹‡úupuhS4ÙãY›iÀW¨€ÁÖRä‘ä7~>ºÝï/ˆÇ2Ôo¼°Í:,ÃÇn¸PA¨ `À$7Yä®8¦Ü¦”ÂSL§ùß|žYâñK9ƒ?gñfùY½øÀ2ÉÑö mÛÓ\wâ°t¤-þ6‘8nôï½8qrïûÚ… \>ºÔ»Îƒxm«ÈÈIoV?­õ…èR1¼¥ÅÐdîÀΖ=r…ÕT:Òo(D dz!¬”Ø9 ç®±Ÿ)ÈĤr\[{Å;ÿÞ Ïx†¼´fž/,¾ÏºíË‘?wŒ)j\»hÀMµ¢蛫O®½Í!™R³ÝtWL(L„¬O †á¬öYî³WNè¤ß™"Êú˜[ÜJ$A’Àãyß?Sy´¼ ïq*° uh©4ôÁšŸósE­º¬ÇHýUÿhN÷Û›lï;æè[[tùWúO_)o9ýº³‘ÑÆ;¾Ü°]*>©pØ–Œ¨ò› dlü´«À¥|=_ŸhÝ;.‹µW·œÁ}Ï=,\ÈÙXÌ"w÷'ä/=ÇÈ•,fvc™¨ÑõºÇ¦¯„\?£²Ò u¸h?5ÌÎG £èÑÃ;žLÌ"×ÑßTëÿaßœé÷eÛIǶ“ŽmÛ¶m¿±:¶óÆvÒ±mÛ¶mÛéäþfæÖÔÿÜ;·j9UOÕ©ÚÖZ»öyÖŠwL¥¶[ ¾¿ Q:2a‚+A~ïq1yeC¯š¸€y¢^”8~¹À /òžµIíÁÓð3_J‘¬þâ+昦©.óœW‘õMS•í>å[ÕÊ÷@4\FÓK´åÊl§l àïùÚ[Ò¹¤Ê¸¤Wðæ ¾V}²÷‡«œs'ÀàôÞŽ@Í_ÑRZóOˆæ @3ËNèæ7˜NUh©’‚õYu©A¾¤¢¾lÝGDc£ ¡z†Â¨v·°õ-¥ /i|A™[„€%¥¯Ž£—´å<¬Éøéã×}øørG¢ÅN”F.½à¬É¸éãWDøH¤®a®BÛì³€”þ¶Ÿ)¨‹µP‹µôXÛ è¬É¿ÒÇo‘ñ#ŠÅÅ‹Å]ûJF_ÒFÅ5Ø‘=1þ<•Õ” -Ƽ •FD^¶ãB©ó6peÆýÌÎÀ%3Ç fS¦ƒì·ˆ"D´"ÛCáN'àsi•x;{¶¾Z'"КWÿ^æf€QÜ_CÞÅv½/‡uù‘sÊæ§E¼—®›PÒ‚¿!ò!¬#œuÔ…!ïò€éãH-×±3pèí•ç3ˆ‘¬Ÿó5.ʦþ­ÎØ™ÞÇÈ™IzêIM,x®‡‹JÓµ4Q 0j´j“›0æ[º8+[—0ª7ü©›Ù¾L6„8 Zx|(L­Öÿ±°5x4Àl[ÎIãÄ6¾cÜ7‚:">äÜ3ÀE;R:Y¹³x!oH D¬ìöS‡i*Ó—•æM¦ø»ŠÙÉÄ…–—‰òÅ^Yçså£"^gµŒérE%‘&»köŽ9Ò»•G "\A_n´cJvÞ¤¿ A ¯èb;+‡” ßà¯tfÉ&Œ)œMA‰«G41Ñ†Õ ®ˆüí¬™ÖöûŠ1É pÖiÃÙ'¼êx©:ùG­ä‰pÉñÁ~qŸ¬ ‰‹P”¾u ‹6T¸ U”_ƒDrˆ$O9*Г g9\؃`•¸§»×¤*®¼‡„'ØüN&”•բɽ–ïBlyóFÝŠj]šãwÅÖDòšå¯ ÿª/?±fgþ(_®¤i\pm’ZÖ¨E2R®nþI^L± .ç¿WAÐ úËç‡i$`qnµ¸Èì4nÁ&±a5§â*øÌ ]BÐE/F›ƒ6`9Ä Õµ÷‡T¤-Oo®ÙEãÜ!Lwv¼jTá¨ÚŘV™bÝд•°g¿~é6BÎ#ØŠ&qÍÜ&Ž—åäë–VóÀ&j¢7YsŒ ‰T©Ô¢¹v À:„5K²˜ eÔ©m,ŽXº—®8!]zLv!Op2؉ Ö\CC.i!e!³–¨Áàâ7…Ûá2ð×EÏæH8ED4^¼…Q ÐåÙ+y#ŒÛ¿Ѱ_Á¾BƱ߇„ &4Bµ1L(µ€jšù€ÄJÏûß…9šb{¼è'CÔ®9ŠËãJŒ¨èp¥xýk¶­®}íòˆkÎz|ôk —Ùú±-°ì³6˜6—²-¶‘õ&÷Fí#Ú¦6‘Ži,¥Ë'º¤<­£}ìØüÂl6ÉOý>F«ºGf/\nR‚¡xhnïiÙc3§ÍÄïžXЄ΄RÇÂx0g̈cFI»¡"Õx ‡”X$‰öž´1„*ð~ZL8š~Ý™~A›~E˜~™~Q9tÐè9Q·õJ9äòb?žÝÓȬƒiݳàkƸn«+ýt_¥s`vƤÑîY@ea™Dèûh_õq“méxþŠ®ëü>HT̪ÜÄu™5›¤øX|õþB¥˜#q,¦&Ä1EM8MñМ1ÒHW2¯5.²as¯°d¶wNi{|x¡Å-„XL¡©’¿  Z„èsùçGÅ¡Æ0âÏÐ\NÎzUd£QœšÊiÕèŸ}dã5K"‰ÈÄæs¥EÖAÔ(©¥ÄuÉÕH·RZ´×JCûÈK/m¡¹Û nbú) tñ©uNr‡CB ˜bú.žZ˜Žóë£2Ì]•á¤ó€bÒ•ËXÝ÷÷4Ì‘÷¥9¯Ë‰ó\¹z´3Wáx<©?˜vQ)Î&ªëŽ 8ˆ%²gJµ,÷§MÛu¹Ü¯KÜ—U÷ËI«9QX¤ åv¯óʨ7VE7âE7èÒ;T>öÊïÝšgÔE7¶Ò;=·í¡¸üM+M›xzû¿£Ù$NÜõœÑîÛ]œ‡/œ2 ’õ5ê¹´“e´}§ëw¹:w-dæÆÜ³¾§—)QcÅßH”Z¬!¸¦pžæq 2ÕjtRlSÌøx*°`îê>K·ú¬ÆÁ›’`Ï©0_Jm‚‘™icQdÖÛ„hÝÓ¦1ˆÔ*6(·!¨Ã×jÛC™¯2̵î3ùñªëK:ú!ŠéƒÞŒÉìý|3yÕý 6þvâ$¯ù³Ú4þ¶’(hÝrÝsëR¶ì9µákŒeÖJmmïÙmR[<ÛPgñ_M<(ì’Ýöžîõ7éo²ëQy¶ê¸îé·aæÆÅî²Ü+yë_`‚0 óS…˜Ä P(ÆKMß9µøIÌÇ-ÄB¼åUÇw€Voš´~꣩ƒVos”ÖG¹ƒZ÷èÈ)5@ž#Ü}ß·bwÅn²ç ·!¢·nNÚor_’oz_Šo¢/B¿ø_‘‡C÷*$~lþ¨˜ÊüÜõ)ø)ûhÉ=âæÎ5¢øJåoè¹Bn¤JJêkÑâÔJ¹,s–yDßNÄF”O¢8'£~.–ǬRÙ 7…á=óƒésW¨Íâøß“a—ßbæyª[îžK-öïnØï^~„Ÿßï÷¸P˜à”¢ÃK—™ØW3¡dú2G+”1©Ž‹ÒUö‰­®mϽE›JJžR8P©ð°.þì•°¾õ¤ÃJê-ƒ —vy<Áoî!\ƒ¶a®¢V-uN•t°¸—L+¾èœþíñ¥üç¦@{Ï2ú>Å-ÜÝ{œk½²b}ä-w]Á­_£5‚£5B‰½ôßàôot¦ã7Ž{´‰1,åiç!vÝéÀK¬èi—”ët¨Ö uKÍò &úÍépÖ uKàû¢µ ì–CÀµùí–Ä÷ä´A®a†ªD7óäÐ_‰C"ëpu™€+W–ºe8µM)"TèuõY  Å P– XyŽ`t¿A ÞeØ€f¿DÒ§[ëùáúÓ‡¾u•ü F¦×Öf`‡À §2eÌV·öZ·žXPok„Õ…:—ê*~Çag\Н„cÞâ±`>;¦îzY\µšp¨:xÛºwZU6ÄC#¸C†º­m¡®"Κ¤PÅRC‹1ÕT“ÅpLY^E¹»¸N¢°RY#žT Ù¦Íí…ìLÝÙOWcþÃ8U²>¬Ð"®PFjÞ,®¬Ê߯– nÁ›Q£"\Ÿvþ“)aº–^'!´n‘åˆKEù ¶;¹ð†RŠC«“‘#Œ;õÂ.,=>:;Œç“¾õkù üÃÇ]37_8N =ãs•mcß{Gd·‰°‘…HΚÜHÇ0 #øM›†vQ¸VÕ:(Z{…W¾lÛ4Zܯ0+ƒ{ñ&Š#€¥²Ç|\#“Ø*WdpÞõÉ‚£Î/OEÚvDÖfb×Ü“>„´5^»*3¼ËÆs;!Jí±39'ýqShfãÔƒ‡oëñ¼¯hÖ™‚Ïmî!•U ýÙÐ`váçqñÃÝ÷]ZëÆJÔ+Cüø± ÷ãÃÿ¸´V0¶23qù—g4Ñêg¨hßrÍDFqrq‚[ŠÖ¬ôUjµÍá¸)bàM’å@ Ó]Ìç—í´;6ôBè››Sì~s±•>Z Üåù } 9¯×Ù[zíÈ@€>9¸;Ÿt}ø¾lïè1÷üuþ@ð~í Rvi¯ƒ[sTBÌM…Dp‰ä<—/vîD‚wB=½ÛŒ#)'ÑÁèxŠ=ÖYø¨"B8(‹NÁ¸úýpl¶¼T³P”šAë½SS ¢'OB.Ízþƒ!âŽ1á®? ºÉ×J°³3·M.xj~3~&I‹­– Ô8âJj\Ô,©Ãkm®È°ºB2|y‹…r`=S 9+˘O‰ C/PA±,©‹­#©Ï«™,8×éÃØ:…ú=3!pðäÇ7æo ƒL _*´Ah¹¼¶§R_Ûc‹ð#Ç´ J˜U«jhä:ôs$Äz© äE«œòûr ’›å´Ÿ[³Ò°yUŠvé²=÷É6Õ‰ÐqlrLÆõj´MõÝAð}½ìнmV®é²‰ƒV$LÅlgCÊ.¦@„&jõ3ê¿ ~¢‚€b·¨é!ÎRDëºpÕCJ—gÜwªþáH‚´³V3îã%Qé¨2œ™yµ¥bçŸÓ{üe–àzþ%" 8ÈÂfEêÉ%iË,PÐB‹R·$„FtÞ¢Ë.)/cæÉmá©d ²OYþM )ˆÖæÌñn“,½„™Le–š¶JH¤¡Qô‡< kö~#ÛKº£ÚG¸ëôó´îëAßìù@ÿÚþÅÔë¨/8vÉH¦;HžìùRl¥Ø6cna¡-†.ÒOñªÚoÑJºç¬kTc ùš°ÕòB¶ó³áp (¸âUº¥UüÄC™î«g †Êû¡fÁ\jMF2ªÒN8Vò-]7ênÏMÆ]—ÿ,š´zb¨RL罟µ5PÑwÕë)¹C†]G5qzùõ^qoàT,~t6•,組3”IÀ(J{CI<}2³`îÄš¡¤y™é9CLP {6 ð«5°ºÂ^k²ÍÒaâEBQåwöÙTÎÃb8SîŸõ䈇õp‡Nº}D4 +Ìq²ë²9°xŸyp­b-—•ÙÐúõ½œxz¿9öð‚"ŸK®ÔT& ùÖ`ã…ŒËb6ôâÅ'׫¦VÍæVû±×£$˜ Íûià?á>aFˆ\£óvínK*ûÄð~ú°Ø²id°)«V‡ƒ*FbXãQÁ]رeû¶R†ÊMZv렩Жy.u²Ðåk¦Õ¢<ðѧåžèkhÀÏÈâ!‘×Q»Ä¨@ ‡>™q%Ox‹tMuÏ¡ú{4 ÄŽ§îyî3S)5*÷.â±%ÒBE†bÑsD‡§âÊv™I%LçÅŸúL£•´øâbÙíý5š)ý÷:šF#\%Œï7ÛJhMÑÍÖ[Xê[]ÓÝaTø€çuEù öýü€r¦– à¡£ôºü~uÿÄKä”bÝ/Ì[0úðǨœá;R7íPWŒ_ÄS=sSkò7}HÎ)ÉJ¬(‘(Ÿ°D×Ä:òŸBSµaÌ-xnu©6œP}r®Ï6òæ,Rì:­+‰ªp¶‡MA],ÆI&wÊN)}š¡“j%n1Ô7Aç˜`ÂþŽØd·rŽC_úÐXe|P;œ®58FxØR¼!œötfÛ .bÛ¸µ•íÍ슥~üWzúÁÊ:ýõÏ)äzº÷)¹ì~¹ìíþƒ—ÌbyÑBb‰l×o­òB²©´jÓ°=àÂS Uhœ’¸ãMD^­á>ø¢í¯‹‚@úhœlzý½{{FØÅ‚d:fzÆÞ_nŠ^” ¥ìšÌÁ o¶#Ã^^¸Œ7TD”wÅ3äI×YÝPº ?ú„Óñßà˜Òvé%1—<ÒNUKßѺ“¹ôõTP˜üh{‰gšêM$ ¬,œ<ò¨µí=µ­+QÕ—ÞG%ÆÈqIœþ~¬£y«áv Õlj©9*c¾c˜d¿¦ñ˜+ûrIóoˆAÃÂý<È!‰ú™˜ƒËÇáegÄã™Ø[Fñ´ÿB`îÛû/¥H˜=–à?~äÂþO¯aø§‡ÿ½•Ñj:ö¨h_ìÍn+à ûH’­àýSuøºë dºÒqY`’PðŠýäÛœ¸Y[£ú‰³ÏEU‹ÄÉeûàÔOUÒ¿Ü@˪Š[P?I¨ý5ïÜÆ2AŠwš^ca9ù˜6þþz91øÐcHó>°¨‚…´Ÿ…t2¾$DŒµì@ÙJº,Î%>å ŸJ¢æ‹o"l€Ì#€ºÜSÁ]}ÖZ}àŒÏl/< *~>¨;Ɔ‰>ÈÜ0lK’Íq©ëéî´œåK=KŽ †’_==*õÉ7Äq6WO{(ÎnºÌbœò¨ ì&Ÿê/eJç/d1;‰ $ëæ³˜Í®Â$`—ÄÉÌp»Í·&Ò·©óÛNâDžÑ„¡Ü4š¨$í8ÙÜÛDöLë †u.˜p[¦ÉR˜¢‡‰ò›ŽF5—Q¢y~f9Pn¶ú_e„¶Ù|"UŽ;!iޱ嫏¨æ”§© t†`—êg»U«0®º­¢û¹ðŸ­:ˆ¶·J_÷öÏ1šÖ!³O h¤Î†Ô~‹o‚y³iMÆ#—¨¦1Ïhç_Á—·àžÅêPõ”.QŒ[¼‚Wc¦)‹­š‰±,>6h ¸xæù«òàÙl,‡ºl¯`Ø—PÔêïµz+qù±CBÖ(íˆ*¹\ÈÂÐh%­~3ªTdÜ›³8 þ|d[Èö½¿#PZy.9—_µ.?â'讎;2ëXÏgërÄUXÙ”r«ò̰€[m"p-”3¤/å¼^Dûv½èCs¾G)e•mŠÅüõ¬º à¸9A²Ù#É7ÄUíV¶ÜAPp-Ü>:ÛÊÙ&yÒÎ9 U~û*׈Er*MüŠ'Ñë  ƒ,Mš#â3Ž/w𢙑$ÔH… ¾¥^ xfg–t`ÓŽ'Uö½¸›…‰šíz‰¶óûC–‚$Ë.¸µôã7GÃ:‰‡:±Wiÿº‚|ç“äÇÚ´ƒ‚ ùܹû±½á%sãá8Êcß¡´Õ•ÀÒÄåÖ/r9ÿòØ*A«x4/LëÆ>íÉ‹ÿ“Àª¨êlò)¿VE_cÝôÛ=÷^d_!~ÁÈé5ÜRÂÊ}Ї²µ§Ÿ„®$bõq±\úä.c€èû,!,™ àä¦[ÖX’|Žô³äêƒ{Ñ·O~\²º°!/d§Ç8úõš–„¶™¦ú¸'x ‹™tù]Ä®BÇîFí"ÿÜI§Öâȱf¹a>.Ñ6Æ ¹ÌVo˜­ÌvR¦jÏk³¨;ÒKYc>'ɇoh‰E¶#¶Rsç!«އ{t0 Ë>‹§:?™¥uz4õõȤ[l±R ØÚϘºÙøüJØÙÙ‡ˆ'7•B¥Ý«çÕÁº¢ýXû%s6sîó|~)_³S5±½Ø¨^rŒm?4nÂEä$˜á?øÛ.¾=aQÛƒtb °Þ–‘ÓüÎÇ÷ÎÞË#|ØfµàŠ#Œç…+zŠO¤[½]Ü5‹´Ï)ÏŠuqšØ^÷U¾§éwÙ#Iщ)%w;QÝ͉|ö7â»ÌCOµÇ„ZÞ³f‚>¢ôI´ÛZò0IôY*bâ *S,jÐ><¢Y`0#Õ’À/ iÂÞÐÄé/á”Þþ/ìïœuª\×q?´7’ ¢ïë&KÎAîýÊØ¦$h=qkl\°¼°Y[¨!ö”ФÇÕb AÎuk<¢½ÓRîñÕ,]å+Ï8dxùr¥•§Ü¶wÿí0¶§Œç‹% ·Ü¿ÿ’LÃÉÅìÎ÷h;ÃþÿþF5r1ûoSàŸ© Ë×+!JGSW ¹‚(b¸PUµ·œP|>Ã?„ÞÔJŽùÌ4гã¦ùäQçò]Í+É’¯Äó¼å«4§ûFN–œTq7Ëë¦sâÿƉáóá&×$|×Á¨<Ñ6Üã–{ÛpŒ ÑY#î6Î|\.À¯w² cΫ8±¯Å¯g±¥³ýl¹m4ÖsÌ{*Ø ã‘GTf˜s ã‚hGXdŸ=g1 ëž› ǠΈ¶éÌ!KâEF‰†ÔšÓ>5/Ñø&¦g¸ÓjTܯ5И°^å0'mÑ_ÀÐ:¾ ?0i…K˜Ð^רtàÍž²piÆMÔf¶Á—>™_Ö)é±×îe3¦Ezo¾s‘Ï¥5OlOŸMÀNxŽö c©J|UCé-·ήŒŠéÌ«÷Ëê%0;M´°É‡œß,¸äuèšü{& Ž”÷ZÍŠËúêE‰Éæµ|–GÏ‚ækžÄ´»Å)@{äBAñ§6ÁCÙqGÉ“´.‚˜]Äs*ò®<ô{ä¸óŽ ?lúŒÇÈ|r*èF»Š[[™kNªãI²Y*ŽÚîŸÑV˜[aJç«êò“”ßÏtå9$˜µóþ$~&õ0­CÈq醯¸¢•}¸*l²!ÂηÀ’s,ÍYíЦ<|h§Bέ°üðÄÄ”Ð1ä•ÃeP¡ÁÅÐ'ZÇî}õ…A½–síš5•Ñ|Ñ[t†d8….Ú€ü`«"]l BŸêìS›{d†_°xUÉ&ԔǢbáG¿U\Õ>Ègë+Í€í ª›}% +ÓiÀ™Û6A¯ÄjšWá¡ÔWiC몋I™!šWí!ŽWõ!·Wý!Ä×øÔŽA›D·ª©¶"_ÎN!Ûi»¶?H¬.NW_+^&ŒvG~!Ô%÷°Nª­rŸ·LÝÑîc·–†t*¹šCÈÍ3ûã)W Žîfëí3{úØêÈYïŒÂ…”ö Ùù7X<€“N&?æv§9Æãý NË»ÓRGÓÆG2“r’8ÐîTnªÐcËLBŠ6cXÎw‚lcày‘+ûõœfC\j45Œøí Cyb½_xèÏÀΟÔX-›Å¤öqÙ@Üö«¬**ß#f;fz–Ã- ÈWž…Èõ#é캴§§½%Ÿ¸Á_S M‡Âë…±€ƒFOKÈö¹À¿P Rt:{`A"ª£úÈl[ ¾üN¼ÁV¶Q´—‰ñû1Œ‡%õÌ.`PrõÉs„Ÿ5ýˆd1¯æ#Òø˜Qió®ˆ6 ÂÔ÷ ]‚SѨišy wk“Ñ6¬_zp M1z²©k#ïoŠa•² ŽftA(Õè•<ƒäÇe °z©ÆX©ß¸ÈzÐ}{P]a¯Ø|;ôÈlì§o¡]'k×5„? TDÁ¼EÍÁù>ÎÜÂ)CÌ L{©—öþ£`Ôø³û÷ àÔ$w(àKxÁ:{ú>ÀðYÈ\øÍøYPý0ó ËCæ­P»†åìdÂñ <»?By ñ9]çÁ¡‰%=vÄw(ÂíâÔ·'Îð„q«J¨ÊXL™dõk†¸ê[%"^ÓdÏ‘HçŒÓÒï?—!F²²"Z5óüZ„úÑøºÕ\œ¨{Pv©Ÿ†A …»«Mbg¥èîƒO«¦½,ý*X',GH£E¢†‰äJlÊæÃ‘ædꇑ;C'‚ûý-ªW!Ý=UtÒAhR_4ãKQJA¤º"ì«ËI¯{‹žï×Wì^¾F—Ê=;ä ²KCœÐŒÞg™Ñ¼ê¼¼=ÿ<e>ÃÑŒeh‘kNo:¬q>ìpŠ»Uô9çëw´²Ç~¢wÒÄ'Þ4•§ñÙëø“¨ɶÏþˆäG|þý“iG,Jì”3#Ö`"4™ ôª•cØ^òî uðtsœKÍjŸ—œ% <'‚£.­Ü.ãø•÷6«äZNmE; ƒ³É2´wV7H$“Ì© ÿ…IÄôyYÑ”‡ØÏ‰”`F¶·Žàu6”ˆÈŠ{Æ›'€.¢¿[Ч]p°Ü…’ }ÿÆ5¬M¡èÚMHèÚ,„\ðÈU“Y·X}U¡ H£ÐP£K¥ºXp2cºüRä¼=mNÕ*n3¥µLŠTÉ{C7þ%æ 3– "3Hf=;N43z¢“jøkþÊÚP ü]?L bfg0ð[õxÈ>¾èW­vò$z=¶·PõÎ[è=Å¡A3ƒÒiÏ€çÍ£üŒ6DöKT¹(È%Ê$Aßr­þ²¢jtR#ûÏaøMÙŽæÚª+;¾¡l´ª÷qþtKKû£öãôÿÉÅì~Ûþ7&ÿPÁUCû¢‡^«¥­£þÕió Ù'"Lh+'ˆ UÛ$… Ýjµqÿ¤zGtùìKw-¦ŠYÎý[€×ÓMÄ ’>¹9Òvâ}Âs²ÙÀñýù1bðÃn_pÈlSi.‚ŠKöÃQc³õ䟙†}²\‘qE´¨mSã¶76ŒšÕ›N \ ý*íÞ¤öU¼¯Å—W9¾?8¢i5LÙØº3±T§ŽVIý*ô`»ÕÜü«ã|èïg«1ƒò;`{0¥»b䡽 ¹%ú©3Þq_j`­±´{,+ݹŒ7ï6ÁßmxÔ6" 0‰Ù²ÚUZò†¢.>Ãpæ*=!\Ó¾ EAëEÒm»&¯-Ž™­Ë_möá8f¾Lk7£y\mÄ“"ç·= |$±ÜR²&¯¹¹¼m­fïÈe‚‘Ÿf¦zÉå@£>kõMð4"Ö5kˆÛ6vgEÂm¬Â4¥-YÂn0‘¢·Öe@ËžCž%H+6êà…f%(㣘ÜC™ Žš2)j1í?¯½×œ_š÷[LRkdÖ•7oï O%AÑ ìwš¿Eu P§Â——(ll …«•>ânìJýðŒ*5^ç| ñó物Ri» õ¬ ÿì°9º\dÇÿ±‹Äùœºz“sÎÏæ ÂÞ&´J&“ú`8Š´ÈPEA§d4y^\í°KÇ7´Ê2&”Øõ¨Vb³3æ!Ê23{¤¯EkÖ®Àw8Û±–Ù”Ÿtu"Ý‘]Â°ÐøbÎ齄ŸxIÏùè>¼'gèƒX“ᆠõîì¬*“š"½_†É9ôewÕ|®Æò`É›:O¨nv®„›è€ñtB¬†ÕåÿeÃ\S’.õ—˜Ž?U³\·7\HÇ›6Ã/2=ƒ^>q”h}ª:‹Ø#¨´H*£ÌHÄ&þ†•¼yá(¢2KÇÐ-ãwA9—å’°[ʩԒS*Y4ìt¹h“’ §f5ž”©ËžšÃ%³Q$­Po·E=YÖvµß™x7ö–Ñìóu-ŸÀ|/ÙMEñXHbÉ»±‚õä¦ K7áPp•g‰–ò5EíÛ ìx‡”ö%Ê­™äH ý¹™²¡?®²Ù6†’ÛúÝM]}[¤)¯{Dr‹¡ fY¸©æj'ž}‰~ĽF¯ã6µÆ%¹¹õx¤{çXjE róCøY­Qzÿ º2Œ\®c… t!ú”c²È¶Ãšš!²ØhìÅß2Ð=ÐdäÿcÅ×Ý1rÞ«uÀ ×¶uWïõ‡Îþm]8ÈøÒ&ä›ÃuV`÷}kì‡Aþ¹¹gDhʰëšpÉ­ÒôPŸ=D—»ª*VõÇ ´wÔ#/¡ÏÁ$k_VbëDªÒÂâôjõЦ|Õ:D¸ô*:D«L ŽÖ BkS³S7­l4ªø­ ó~/Ï.ýYø—…;™I$ œníªðSz(\AÎŒ”gòŸ‚ÉñÙ °.!jö·±õ~‚¹÷ÖJ¥9å‚|ã“6ñ-*6êKÖòЄ†‚¹þÿaéœÚ´õ:½a% ðr{gQ ××.¦ÚööwîªS4üpûºoEà 5d‡ÄøÔNû`¬ßß/ré‘ÙA6B¤p)igÚyâ"å÷¤g‹B—ØB?)áh7D€·ØÅÊ¢·IÐ3ª|¸_wÇ«ÿ,T¥ès·Hsÿ Ä¤‡t䋤—ãû»í¯?{?ªf]ýŸ1OÝíÒiç­_jS܃2þè}žîüWðZ‰‚S™ýGžçü^¤ÿ׈'€ño3çÿLòN¶UAý7DhÚµ.,”(Ä&Ð*u‘@ñ*5JjPan-,Ñý§›! ~†]þü õµ9дˆ=Ò}•;43û¼¹õ»Úº˜¡u“Ïkú†wó{»óïÉÌÊzáS¬ÁàP†ß¤Œñ¡1R?Wôè8™‹R2¹‹™ ŒÔèð!Èáð†³<¼‹RÀÍ>´¹| v¬J-5M%«V†èEŠëIr€N lÖGbu¦‡£?IØò.RC³;Åï«Þená§]X¢I›¶Ê)wX/ß°„jJû¿Ž¶ë×M7À$ÉÉ:SŒ–«—(cäSÊ9L/þ`Ï1´­ˆù½­b¦ÙÎi6âsi$þ´Áß\kx§|ŽÁGeÏžHØ9xìÂ_®PóGPIøÚ?Ã…üòØä¼”Ñ«FÎR7[‚wdšwè(/Äo<Ê= t±–|¢½T…8ØÞ¡¨ƒ±¼£ îBA·yÅÈN{®ï¤™ •ˆÑË€ Üû^¤M¸ä¸>ÖXyç>ÇUþc‘=Djë  tå×]YÕÈĈx¹ÊO@÷Œò—rµ|+l‚Ü5¨'.æí…U~ÏÄ9R.jœG“„þßë J]¦$üä²ìx¤*,œ2spàVk <è¬Æ`TM`¾Ð*žF°ñQHÖÁ|³-ؽ՞3‚=W±{ˆ…<ŽnÄ#K¿vç±Ú~ܳxT ˜ý„üBûöqO•6i°H¡ô©® râÂ÷°ë­„±C1±4}¾n:”uމ,«çÞýƒïâÈïÂÍï°Ì*sDÙƒLÕ¸C`'^@–Ü#T¦®œ(çïþ¨mÙ³MÌz|’ÿnB=SC,’ÂTlCS|G;wÊn¨'¹ó1úT›±þü—­!¦Æ×ÃÚÿ¶…ù¿‡fý'"üØÆtý›`°ôêÞJ«$rä‚¡RI¾?µ4ŒÌÙÌòx½ÙGáAÔ`…Ò!Ƚ"¥n@¢{$.à&3ýowVÏ›Ýu›Iè˜}]Š&é~e–½1/™!¥×tJcÆ b_=rÈe:›µ€&ö_FãñvQw ù4ß=‰»Í>7Ä'?÷Ö:ò‹ä™ý4’¸hòPµ°¶#˜1΃4žbAµÊÃ_¤Ì׳?¾Ûaˆ;%Ñ?ÚT¹ÑJÈ›ñ™¾½ÒħþØSÏBF!.YÔ-‰7Å01‘Ym˜ÿK_Òê…ö áüÁùx )ý¶w13ýK@U{k3;€çŠ= wÕ¥ôï.7~–ôQ$YBh"" y„&è‰4(:£ÿ¨„$41=Ó”qrpL.<…˜Z­¥èTY‰:\:iÆTX£Ò%²]§e£iCÛÖíãt¹½ck«äw®kÝõͦ3ôXãįLÞïNçé7¯çéLÌ™NÐ]αñ°‹Ù“!|­´ß%•)ץͲ üò66·Šcçòµ³“º‰ /ÞÕ«°Í‹!Ÿò6/ïVPo!:ÏÞ0^ÞÒgÞC“‡೘ØGBÆõÓî?Ú¾ØZA†ð³3öõsµ†Ü@éP¢‹óÏûH§ûfd¾÷R$E'çáѯœAdÄœû]@@I›±«D ŒnKð»0K‡HÝtºub„e¥sa Á…\¨ñ|ÞuRYÊ‹¶ôæÀ‡“6ª9srx•ÔP¢y 6*›m„6Š\F„~vÏTtqªjîù)#*ZêÒ:ú¹ž‹vi³î®õÂù ¹HD¡2!ŠB“ÛF¹CN¦¸ÉœiöŸzãNø*:ºd\°éP÷`/ Vq“ãòÅeW–:zÓ»)Û¨0‘-\áˆÒ ë|–5ô"xôè;ѓɪ;Ñz¾F[sjì«@:~–N†D‹N1ç)e€ ãö¯/™-uGvš¥ ë2íôT£¢ü“Ù)šèå´~|ô䨌à76E€8oÙ§Õs¨žéÐäW!ÂD2zrº?qT´=ÀoõRJüxÄ–.j±Î%tQ߸±i5œ°™Q5xv¦P±Ñ’¶GÚbvP¦é”" ¼p=’íëœpVçY£ÚL¹³ã”¥w[*üžmIA™àQO7ŒŠ[Àð…©)KSŸYB–{œg.égëÚ§Z*Z<ÅDe£«7’3hUÌU§ÀÅn Píêà*õ[ä[)§!'®Pgƒßš0©+­ÑÄürfœˆÕž|2ɱÂ(5'ÂxS*ɸXz„Xš¦E̹; „ÀªC¾H%Gqì÷¾wë 1óTW\G&SȨt™—nÏ+ÚH³adþº#Œ|¾âXÚûšç~Üñ²Óø¼,¤Õˆ?ùzÿd(íù«I5ºn}tTþº®Ú*S@ /+ O q‘LXP9”èÛžúi)&Ê„Cê¡’Ž_6G¾TªÝH•—QhÅ­ºpÝG% `ú÷^:ð¡h›cø0Ž\§¨ rƒßï0Ð~§;ã,í>>sÚällªŸB¦^‰wFË×v,Ëé—õ\49{ÕŠÆŽó9 ?ÐÔXM÷Yu ¡{ŧ çGË!î¡BÇqü[Ê"ó®® Cè9Jû­ž´ž“°a3aS¾Q÷Ëä»: u9—m/˜VœwCêøYâuÍŸ"\Åé‚.h.˜²KŽóî4(²øb€ù §ƒ@ ïàÌÌñ%Ÿœåh6¾ƒ{N_Ö½soÔœqhþ%½'wXcÿQDÿõS"¨Í Fœq… Ê".Z†ÍnÉ]õ@MN}– *ת>H-èVÃ/ìѪ)O³jʹܖ¡›ò—ð´lí°ž@Ì™…£Øƒ–¬%ˆàõ ÑaùÎ*¼Ñ<•®½;†Çé[XœÀ\DI<Û\ïÏŒÃsþ± 4§þzè ôQ3H»IC®6T¥oÕ|(¡¤|à¢UŒÕé’ö»=½[ìö+ëUN¬Ù£"n—3ß=œO]R–ù†~¯…‰atŠ–’bÁö²%8WåœûzŽ©p‡$H¶ªšÞ%gH ²™Ïò³ÙmB2 F#fqˆYÑ¿ÀHzPšnŸè`‰#K¬®28•®ìµ—‹”‡U3…™XgÄ’µ’x騽lGk¢t4c~2['ÀèóÓ+ÑéÌ?rQqä)üS2:pŠ´‰sªmÿ`[Ãð›ŠøvE153£ÚKǪ̃6š÷ÑKA±>TJujC¤›Ë€ôKºl ’1$ûœÔ+Úz¯—‚'ò§Ù3ŒA(º]õ*/B‹[ª} 'Z’¡¶dDy»1ªn/æ[æu(·Èâ'¦Ÿ¡T¶çTºøDƒºÁ¨ 9>~5¼Õ¤³±Ÿ˜/Qûµ$,& óô$è~Yw“JxÕ8­šVÆX ö ¨¼­É³êPÍõ7V¨ê´ÉYùÊŒ¯ùh„A¤¿_(­R¼þhÇ—J,-`ݨA«,«Þ©1zî¨wz›±7&ˆ¾ýø¿v…>yúkîÄ@}knûˆA.yy‰ÍV’_“ý̘±ðœ”𜴷…¬ûTZC˜R°1Ò¸ ðÙîòž²Êîú׃¦˜úqŽºÏûb\þ©‡„ò‰¼~¹}ZؽGbÄ jè; ·!ö¯1‘°÷ ú©±·+÷4ŸÑŸ˜Û ;û^gÊŠ4'µ-”¥¿\Œåüú´Õiõÿa>NëÒ˜x k˜Ù‡ôÉŒå àòÀwAëgòÓÐ]×¹Øð…¥ ÎñE(›ÎÝ—î\Ô1ë@ n$&OÝáÌ‘}RCº”´ô ’Ó‡1“p¹TÌjV•‹µhP—Ç“JUúÊœø&äÃ×TßÃ_½+Ö»gžîæFçª!JDÐKa¦¡TèëQ·›µ.ÖvGª-éŽ#Fç¸Å>‹†fífáÀsÉТ3%ö_œÇsÜ›À)í0«©aÆaêÛ%^¸)3ÁÌí7þ6*…´>X‡1Çòøo¬Í6³üÈâò1dVˆ’ò„ÑEž`Àä”ÈdƒàÑ!Fî°Z,QÇ8½8ÙòÛ>ˆ=nìøÛ4¨Å-k5ý.²Ž“w ÑÏʈéÀòB~N2\;õ%¼1!*eÊ6Êd)ÍIU­FÛ„±ÖäÇZ´"Ä1¶MÜ}¢óCäÉöT jò9Æ ˜¬²Ÿ%pvË%­ UåxÖ·EïêTWI÷€¢’:_AêR²då3jj½ ”6 ‰I¥Õ²Eê¤Û[åòujQô¨Ø2Ð>‹À)Øò )¥Ä‚êÖq§Ä$Xëlé*Tý#‰2ÞÏ^¯n ¾¦Áb”:5ºÖ.ažïßÏñ×%&MÌJ§¸µ¨bÃk6J{Áo¨¢þb—(EjÛñR=¡Leá²zª•hÅrÛñFdéh¹;ÄÞº¾V í|ó¾å…¸Ê*>ϲ¦fÛçëÅgWk/+¯Æ®«õm²õm5OjÉU¿íJV#ß?‡â’§Ü¬ež°É ¼¹sûEär~;ÞOo +m¨Qõ*úq‰QûRØÊ]ã Kð©nÚ%‹D™M|çZ©†å´b¸ÖÞ©´ºê„}Ú=zêû•/G漤ַµ›ý Fø9qOîâìµ_ö¦UöÃT9¦¨oUî"ì ¾-{¶Ð{z€…¡ÁÊ‘³~?I´žd»ÏXô°Á! >'–[¹„$Œ³Ä¸Í>·Gö6¹fYWIéëß7¼o·qú/?¡ëø°C}ÍëÄ¿Y>jq‡¿U»I R»îëyäûË^ihž²d÷ÿ>‡74'(f[¤yŸËý7ÊÆ?ƒ[a‹ª},ƒc<ǃùÁNˆ Juƒ¹Ü~¯‹ƒürzêõ;©Áåf¡Ëà…«aÉ'ýÚâ´[úe9õ¤W¾SÛ-§ãªNý¨JkεûÅoÉÕ ŠŸnçü(±èó®üûæWÈvGcµRÕ…g•uÍr“ÚE«æ…ËÂ7¦§ÞÀ©Z‡A >âÜ‘'~Ô² JÁ¢P~ß]\í1;0wWÂ)xÎ'#ùšÒéH+åød–!¨U%´VFþ@h›õ¹A`êWBÏ rµ—z÷Pæ¸GV’}âøÆ}h'•ï[µlB ©A7Åн›2µÃÑ}3ØÑ¯C•{‘tº›QзºÅ1¯zU_â‰Ã_fMŸ‰›Ä72 Þ„™‡a(ÉHM¿´(;Cô»1=œu­´G3S…ó"ùLóf#8Üí%޲ ›(â©Ã–8>€(ñ0D\ _§‘Q¡=îþ w÷8 `ˆ˜ƒ8§®*ë#9ZY"S‡dv”.‹wZ+1¯ŒúëŒ[÷qéo.ôåK R˽ªåÄ‘‰ËžûÞ¦¢Ižöú¢×­’“¦‡ºc¦ú-Š×«*èWÓË èÃÕ>¶Z/7¹^ûØ6¾ueôtØÅû‰G[Céï¢A¿"°,á þÌ¹Ç ÞX¾Œ¬%WZ‹ªH÷EÓd;Lb˜¬“Ø™—zºÛÿEØ;‰Ö,šmÛ¶mÛ¶mÛ¶mÛ¶mÛvï¶»w»{Þ3÷܉øÎÜ3±VDeÄú±*3 ™…'Åž„æF0”&ìŒOGv«bNŸ9ÿJÏøûäIŠ[÷»ùÄ=ƒ¶_œ·¾‰}Š\cٳذ`Öaˆe眉Çc÷þÐ>ÖÆgb{ ÕcâÀטÈÏNfˆ>–ú!_ŒÏÏXfì.¨s"¬XF ‹Ù$W‘NV,´CéÈ·c¹Cí(Ì÷™Þø²=R#áÉ E+ÁÙ8t¦¡nž”Ì—qÂü}oÈU(–ý€-æ’{¼‹¦ÝÝ=ìŠ4ßÚØÎ}¬'f}ºÖgp#ûê¹u—+Ä~&yë {»ßÕڱܾǮÏÿV7U¯Z"*&j'o3Ѧ1ª¦´èÚ7¢(’V¢žµüã‚j8´^@>a¸0þKü¿â<ÕŠÿNŠ©[ª¤¬cúÑ?ÍN¬'&b‚Фib0FDDMˆK‰„&ÆT0Ìø 07wŒ’Fkv‘Êfù2FJJme©G±‘1Êz¥çüœ×çý\p~'þe!×]ê·=w¾c‡aP„Ÿw¿û¾}ì¹ûì¹ûþÓ®ß÷ćȺPOsRdŒÆ´àèž]'±&Iœ‹4¿ t‹èPŸxÛœz‹žË\ôNûŒÀK£µß´Ð~ÁMöQ—Øg^(jtDä%2Læ¥RóÑ—ˆ×¬@Ék7ÈÈp‚á·$$¿¸Læ5&2¯uÎé¥×à1(B5§‰ÜKBÖkS¤>òÆIÜkU²ŽAù³›«±É%..ܧAÁw}%G^üpèõéA…Uþb„¹*RÏ|ôý‹ËÍöên¿×iùZ–W·Sóý»«û=;[½þ—éùÜ«…™iJL89ÒobIG1ùPAJ–qêêÉxïÂ'Ëδ¤ºv›Øƒ„ˆªxhÎBg7[%™·p0ƒ*ƒt¨p#O‰êcS”iTlnNÄiƒ=M¢ \xÜ'Ó…%_ì^ 'ö/ ×è¡Î\E—[]©ëf>ºÞhÄ»(°cÎØÐ[ôQ}°"âW’L¹WñEbÜ¡Q¥U÷úLó'ÏÙÍ(™¸AVüÌ&=*0`FñC„—‹4£Û4vp&’TP-ceܸáuÇMÚÚ^‘¶Kå Á—?HÍ"æ #U.s=/r¬è I6óƒp¦ LáƒãÆ´Å©×òÓÞÆ"áHa24ldaaJ–qÙXøè»´}Ÿj·ÎÄ@jkð]ÁŸmÁzâ&*$ܸ²CŠqŸlXCøÎÑ£ìÞÐ/;¿«ò#n&Æ¥¼©#Ž—<çwCRCYr‘?Åmõ¸ô ƒ ” Z|ì€@–„gÙïM„^·øCèäMÇÆEbmâ‘gv|XjâÊ‹#;|ñ¿L¥ÈË,;HbµU£äÇ(²–¦|ûB‚[ÿ8²,oºÄ…Ý3Ô—E ±¤ ¬žË™$ºJ«ÈPåHÞx5§fYĦþ] IÝ+À׬LTÓ¾F>ùŽ%ê<«}&ûV˜ÇHÝ!q0:¥Ö-i¯i §Ó¤”³Ç¾8SƒR¨ÆÈdY2}èŠÀPõ)~ÝÑ' <„¶oÞøÂSmG‚¤ÖE]Ã%²a”!VóJOóš—º[fƒ> oå+ O*t2@#ö5(Õ_ W{L¯Ë®œ4êPÅ~ˆB´&xD H¼ ¤-jª§,×°Z?¨ÀKy‚¢he¨+”TsB!^ ëQ±â¾TàZ†ìÇ$1È­øùØâë—AÔ<î kÙÔÐå‰×9~Àƒž©à¯¬a‰¶¶OÂßÓ¦zdV­ªpÛ³­:ë0N¯0E´’?*ÀŠÇC·<¯xñßý;ú¤ŽðæýãºÙÂjj_Å>)ØCâ¹’  ÿ—Ä´÷L«1Ó·’&K“ʪ|ôaÍ j€4_ŽÌhhØ/1£9ùLƒªöèï$¾Ú2wr¤#k¦D¶ý ]Ö|1)ƒ sÐ> 4æ½î1¼Ót´Þj1ló^zA¿•Ú/›`!\í0H&/~ž„æR7r7Ey]êx¤ y+@툖øÕË2˜Õ,ݺ؋\£Ü:É©­HêDXó‰#'™äúåI¹>é™v v6J¹®g$‡Ù÷.\7RÁðÈ ~4Z7nlÏ ~;ðò¢%ŒŒŒïeŸœØ:È©>©ð‚of ºÓµV%ÂF°^@Œ º—÷¤œ¯ŠØgeœ-ìÀ5D²ªn[Ô’Öh£¥*q†úѱ#ñ…†®\ö¤u….K<ÑɸDÜÇ…ÛV "³m!wÓš\_C¾ÈË”çúx‹€Ç`l¿sÉzƒÅMlÿPs^EÚ£ôYËêâ¤øxL7ÔÕüIcd¥õÔ{ÎæÍH åÂ,€¸ÀÅ‘§ « Rhóm çëPʧÀ³ße3Ã;àåhÏ÷³ÃÜ3V…sÔrŽ1+³¡ÊdQ«êå„ îrY3T ó‘.‘õ‡ë º”€ÆÎ¥ƒ8G¶ÑNIN)m³§ò W».¢|°®={]7Ÿyo_#¤qg]¡£[vFVÎiÔ® ˆH ~(5^p~¸\~Aè3 êò²Â³Â³D.ºÁm´Â­æÈ£é–X½Á 'ÔRõ¸5‹P½02òÂö«¶¡ñ’p‡X¼êË+XűÜ–(F®³,ÑUVèÂÛE‡Ñu.-îÎj$k–ÒÑ9´iª0e$RûÊIfy¯0ô‹þ“Ù5uÚTD÷žÐ'­˜7e/-gšq=Ó‰jÞ±²wSáeQîfs?€9p^q—Zú6§¤bJOzâ=z])ŹÇ=»Cæ£ös©Wº²È8—$ho©W¼Ç*âràõ¥2šü÷de¦!2´s»IÚÌÉÕHÈ9ïó^8é:Á>¼‚_ ÕÆè%×Û7ÖÞ7ì×3wÄ?Êö]ih-ÖqŽnq‹ô©V÷âÔð/âˆòÛfÎ:‘rèε˜êÂð@Ø,Jµ ‡°,µƒÿ—Tàróñt {÷2ŽÁPó,ª"Ÿ xÖ3œRø©[°Ã 5…‰Ê‰Ó6,S^Ïk `ã—så#¢”z4â¼Òqkt“ KÑ%ÒÏÚtùX1Öâ7¬ý/œ2_p ¸Ão ÂòËsÇÅ~Â:g;Ê€Œa`³µÂ›ta‹ä°dÛVsU0 k`K!UÒN0Q¥¦®o£ÓºP÷ê”:.ãø[¸þ'–#ž±iˆ6†ófêx¨¥Ñûlf§°Nij¾Â7>Ñ/©Ô*Šj`f8£•‰gKÜ…µ²ùòÙĩ̦è§BS† nBF‚ö÷JÌËtE6â¯ÂZE LQ§¸œ:fûÈÛà½Ö5×ñr.f[âÒŒ˜Y©hMÀ”f!‰r-Sp’Lè3Wòxhÿß'ßYŽẕ”ƒÎìøËŽƒIù‰«&i¶¢,Û6èzLzÄ㕤áôäD•YåVŽrkT´ìöy¥Í5/‘snS×¥ˆ‚bkzÄ´gÁ"©t‹4eÂSy³Ô’â{f´ÌŒ,ÚŸ@L½*“ˆÚp™thS@]&ÞN•¿#«I™äåòòrùoóN>ȃhÔ¾pz~qhú¥¢‚ã¦T[‡®©…[½É*>‚>ÖÔ2Ñô× Hn‚v ú¥ÀV'Êź”H™µgëJ„Ö…FmqSÔ«MlUÆ7'¦?8/BôQZÅëÁ(É«Ûà¼q’Ä>I\ɵ½›wAvÀ±ÉÄ;ÚÇß4{Ô*i4ž 8Ë0½AÑJU)˜'† ûå”u‰¦ð·ÅÞm¸75ÐiM» Rì´½œP¦AeÞ*ÈÄkþõHË´Œê~™M)íD°¥íšR{æÖ´!Q ¾Ó`¦B*¹0¦‰&Ýd“’wïÈLP¦.ŸrÚÐY´D̤u«:ºü¹åÿ›|Eë7sD&Xˆ’¾§¿£ßÉhÂibÁ$QÉàcM$U|"ìÏ-)F—£™ù~j.£Èf2Iû&ñ8aSŠª¿ðf2å÷x‰¬›QjÝ@Ûœª_%­b©íZÕüË„Hxª«¬0íeCM§ìZo;ú’Ém˪­›NñF¨ëL×W¡•aå X0˜ X0™á,Ýé¹32‘™˜vhæì]€ºÚÐP€æ$Tà ˜î:͘î(:@´ÂâÌÍ€‘,íéÀ¨CcJ:Pú É“˜«øüDî@©¥#†8íÉÉ´@íQêÀ©Gc´:€ú Ê€µlíË€¶tí« º;ÀîÌ«üüTÏ€·ü£¾#©„í쀪Ê»vc;°úÝÊÙ¨îÐ:`¶³#­´í퀫®#¯Üî; ¶µ#Ѥíí€ ¨íI° ?<°ý ÂY=Pû áŽfgJ<—jgLþc;Tãvïà?"0ñÿ)r’”'Qþ't²1uùNÉ)ÙÊ# "øµétþåÕ¾‡¥"((¥@G–U‰Ð ‹E¯¢$dô#ؾú£ÑÔKêî Ô?1oA$‚ìÀ?Åá …l4CÊÌÝ<Ïó4³÷õõr0Áã‘áÈxU’IUe±±¬‹îŒ÷§ñàM—¦»cž¡¯Û» ÕHÎ 87 nFʃß#=Zç¹=ú€vp­Ò@˜l©Çúîš#»‹ƒL(3¢Ögù‚íŽrjE×±uXÙò8ºÄø¯É˜Â͉ÚÐyÈ =y¤;ê<“ º³ÿäD¬Š`w3ËHrÀ”X  CQÜë»8EÞÈ`u±†æ@OÝܲDOZ[ýömfF|uÇXÃ~ñGÐþ8pt½þÒèò8”š/Ï1º5L¬”yÆ—ðÊÅMôC ó°òãË¢Ré1Á #ï¡|å­š³‰ÔRüwÝ6>ƒÐ&ï\ †B"GÒÈ9Ë6šB¿r­`j7y®ÔóⱂYPQ±¾]nP.Êz²Éxô ²ùU>°Â0Ë;”L4?ÂÖk_ñóбþOØê©üý~ËÜ—yEÂñWb^òúA‚¯Ô¦9 ÿ8 ¶¬bpvÉ*T§îw °¡evƒÍÞÐ$~q8çV´@pÿ‹sHÙý/·HUÑU^@á•ÔbŒx§ð+T¡µµAE½GŒ¥2½g¤mY Œœ ?ÊÄÇ÷¼ßí/Γå†ÁŸ¹îí~Ýë=Ëëî~¸ÚvÎPZŒsÁž# Q‹À:1êÇ·ÂeÅPc(:B³«îVDug¬:È ú„#™H#.ìn0òar™^}šÓ:H÷™g±:F"²;>ç¼Gþmà–ê%9¼ôϳ^.&o;ÔìóÜxé6r¢ù- Ñ©¢´rn(’í’žÙÔkÀq¦«H•µ¤ØnqAÛ‰2¤ÇÊ#]ƒ5^Ño[“4£•^xŒ3öJnkì³[Ê èÐS­ïÌÓgc{h·áÕ—aJz-‹[æœ\AzúK›„伉ù4t´rÕùG»nØIZQÚî@uÆRz¥ô$š±Š0°$ ÎÅê\HG˜Ý‹å¹H~°# ’!ÈöÒ*I}6þAdP6Y‚ʃ¬ðDŽ'”!Ô–CµWC‘šgy®¿ì}Àñ’öÊ*)0¶¦Ã:éù—³s1ý„Ÿ3 W°u·JÏ¡º‡LmÕ‘mu}i­«áº»hãáh¶Áóª­{.×<®È0à®×¼ÈGĆgd|/<ëžU>€i(Q€¿xÞ± ªÓNÒ?4eîZ@ÎÜARš; q»LyÌsʯEAùˆsë>(ÁSh†áBZ§À¼ ñƒˆ.Ü!²2'RéÄÁ­”²$€0q`“l $Ø!q >ãž5ðL-æj ¨yæ ö †øHú‚>á=ŠI|O«}aP4… k«-Ö䯃Tȵ0ªzÖýºz£nΞЕMã6á¸5FP7³´n9ÃXQ`»Â}h¯¹L¬"~‚Xf¢ô—o¦2¾çqõ޹s¹hS5É9ŽBŽñ¡z§òŸ:”:g2Š4¬Ó­#šˆié!þÒ–ÿdð¬_ñIõþÓYæÿìÅ?íAÎÕÆF^ùßTÅi¹mÞãŒ0¥¡âSLŠ‚© *4Bͨ ¢Xjr×âlŒ÷Ácm„?!õÔ®QGv°©…FÓÆ˜os˜™_ùx½A"[yœ*N ‹ŒŒ7ÇЇÜQèÕuùÉ2>áój¢ëü3\´üûž‹&Ì}êðBÊåÈ!ŽÓÜIâ¶5.PïjÚ`ˆÔý¦H¸ŒýQ£4NW“yY¡[!Æ&ñÍ\YI6tØ&g«a65”g¯[;‹5Æ^؇ž€„ú0I ·ù¬H·mmr¼ÓõÑÂljšžH!«Ö—%Ž¢IìÆ ï\!’3{!NapPýP/› +Úzâg3‡óÒƒU?¡áÁÁÂÞëãÛß ÕxÄ ë k䪜Û~#Ýë#VÈÑöÉ÷Ì‘¤ß2Ú]|Á‘˽Â)E)®`¥3$Huؘ¥ÒÓ*^àö%*,šö ²ŠsÒ¾Ÿ÷LúÁåØ@©*£seIÛ6±/´{;}I_Lif õ–Ñ\¾‰öq5¶.Ò†\ó7‹Y¾þ½‰ˆ_ fõéÀþ ~øÓ ÛØ;›šHþÛø¾Š³rC9¶Ð£QATƒÀXƧ zd²8 ;èçYKI?>Äð:<™÷€>Çí °ŒÉ7¯7×3××·ãgÛÜ`Vh.)4™ÌІúòbé0^ßã-_…­¥ävGŠú í=wHJŸÀ·=VycÏõÂ`2Ó®ÂÎ]0›âÎ" NPZ”l?syƒ+æó¯9’ên\àú/d @ðçØÜ1jª'bˆ/¼ #}‘UÁR®¤e±dSÕ³s¯¿ ÆëðÁiUµ–/røîÅóD¡,‘ÁaR—m¨Úh}·ÆWb)®,o¾NL)èb®I9¬žaÀVÊ…•-Ï3Èfmª\ÌJâô {Š …ý[aþÆ ^6;ÑÔîÎq9(%‹ÔX.ëO])I§xbb{ž¶¥‚p”W‘n<l; wJµ1ß-‰ rášÖ Õ  ¾ÏüÇcöhþ±T8ÈŸÑü«‘þßÛ»ÿÝN•tåWþºÚ·•4Ô5ƒð£SX‚ßš"%“ay îËoµÒ …³e´òO“# ßÞOâ™ö2Ù`»í’·3?çxÝÍü~ß@ ÀwɰÎY ‹"£i‡f¨£¯Y mñ‘®õùˆhžEqnN˃%zaÁ“ˆ£¿M0¦† oÒ¹¹Ñ( íèÓs‘0õqīȇYb9ZåW&øeUØ ø?<ÉJð¯Ý«>tƒ˜S$§΂g–õ桉ƹ/-EY4Äyƒ¦  Ch ’i™ Mëý‘òBû`Žý(ãÝd-«JãK!ªYfo‡ˆþ¬Rí3Ö¬:›e(Xà‘tb‰Ù‡ð³oø—q·Œ²~÷‹ e°‰aë?8´ÆBH³:òP·ösjt‘Ã7=M%^ø…½D²£™½×/HÓi‰fu@ú‚=¡¾U>lþ€êé+êdÀ}iAÛ«Aú^ZìÃ8”J¤ ôj$e6Än“Š˜­+ú°£ìqŠºO««î±ÂÜäZNùɨ´)QusÇD±îPSÞÊcß®‡BEen}L±Km¥÷hRc÷õ”ÍUVàú9ÁÃ^'VúÏ´Cám9oÀÖiŸ¡ÞlöÿO7ÉZTÐÊùGêÿçÅþ/nòo¨½mŒ Ԃ诫4ÚH/ôzXž JW –°m$$IåÁªŽFvDÜ}¶£ÎHŠ’}å³§ 7K‰Ïßÿ žûøF @´¢`þŸ+õïÉš¤‡Ž*êωÙÞÌôô‰íV‹l—S2™nŠR¤Å»RóBYt¡U ýEÊd “0r[T •J ("`%4-id Š"%D”(¢ ‰² ¨{àý>{½}š T˾ûï]ž÷Üû¯w»çI®w<€”JÍà Ôßj‡ƒl½–#mª¾Ø»‰qnõÑÜŽiVÃoåF,÷éZ`'×…éĨ»C/¼¯Ê üÊŒøq”/Q!2ý¡>N2üøÉq}ª·T¨þ‘{kÔèûœ¼îþÄzü„jòÒ±})ñxJ)¡Ü rÕœ°íÓû˜çŸ 'oNêpþ‰CNÐùjhz EÑÞ}¥EŠ3~ª·ä tP‚ÖÐa¯F œpОÚF gŒUPžXBc…;K+t‡éu[“ZÖ.”¯Ì ›A}‰x,C@óã?¬@¡³Û@è`VÂú¶Þ,Cß\9bÄ<°!ÅÙ@…·ƒú *”{› †¬¨\m,÷²ê5íêñ-àôEš‹"õ\ÜÃ-´^ú5›Ï«±-Ô :ØÐ`ì²·ÐF|‹bwææì–W™¦ðÕͯØÅ@þÈUî§¾Np`ð&ƒ¨¨Ù&EÄâue­ãÀ\Õ6þÐñ6. .‘‚‹¹´P"@N™_•2w±JØE3kÚµnc`ì5¤Ö½B¬¨ŒiÂ`µÊj°ÀUÎùm¢E“íI©7µaê•b"Þ7UèŸ/¹Ù©Á»^/ þÉ#Æhc_–QjEŒ†J1i“ÕX²ï²¿"{‡|]GŽÇ“ôÀ#ß~æä×¥xO%%Wø¬Ð ~ñê+ö*F„^¶mLkG‹§&‚¼é<àÍenåhca"Aj²"ì¥{™Œ ܋Ԙ–Ý=|¨ ,°›ƒ[jaÆ9OWÄEqxQ "9µ•ä?NOÙ4-›ÒÑÊ«Œ¶LO)1Q"ã†Ñš¼X.®•,µ3]UyO_Kébç•ä`uŠ«æÕ{€J&¹ù|¨¹†Ó4•³e7J´ãÅK’RÖŽEY»wtYšB)³{µz£ÖS¼¯ [¿ï ëŸ^fZÁõ_¿Û[1  ’·K¯6„ÍnÐägùBþUº·‡ýôGý’çûÕÔ~|·…½3–Ó©1Dgk‚ ô„¤–-LØC‡Xÿ0úöâ°Â^u(E`!ÃÉš(‚:D¡“í5ð[£Z ÷ðDdeµAœd$¯XŒ†ôúJaÚìi¨TRÁ#ç]/J¶;° ,’±BÈdb'‘õ.Á”½$2Ô@?epÌ9Z!XÛCÉðÊX©›X¾Gt±à€×fñAÁ_nÄÖ´-³ëZŠôù{ŠÜª©Åg¨^ºŒùwéuc­UöÎLÕ\©Å XŸ,'Õµ¨Ùy€AZÙËdŦ£õÊÈKæ.Ò}ß™rŒ%ã—o$ƒ†wp0P Å»Z¦»ä£… nºÍ>­°F‚&'ŒÙäy• »&}7P‚C1kf˜Åà:"/ŧ2Râ ó-0|1п(@D8Ÿ]îë´êŒRœ†W±$ÂÅ+Í“©bs ¢qÛDæIÇY2rë$NPJ“” Í<©9C&NI#I yòægŽ? ½~I×<¢nydÜó ¹æ“sÎ&gžMOD›ž‘×=Blz¦)½b1õÈwØ’×0›ƒŒ& á:¸ææÜ¥ôL›¦&gFÔdìNi…jרƒ-½ßÇFžœ‡^„ð@÷ŠŽÚÃ!Qµˆä¢5èXu)Í4;XhåÜ·Æô¦]z×ùƒ’z)Ylñ£Æ{ƒ§1‹)zóŸffŸMÕ¤_k¦¸œÝ^µмþ.!¦äÞÒäè^â æøRÐçX×ý•ê*wôÆ9Å5ñEA5Îh§–¾Î÷à8üv:ÉЊ8‚7‹²™9}]JŒ–JŒ-B aa‰&j‰4ò[ý#ŒÎlÓ¤~`’Öå*rrLª+ÇeêzѪøªU~ÅImÁŠùK‡ýKÊCîIƒ?þ‡öJ{¬±1øá¢dýRĘ3³¤Òi¢ 9o>µ€Ú|ˆê¬@ñǨ‹bœFQðîl³4âÃF~ŠV¾'cî~C–6”Fåû …–üÓ…ÔÚz§|4Çô¼Ãצ¯ÛvÚî]í-‰+z[j\…W]ÛËí1÷y”Μ¢Jû žÐ'šd.ë{a†´p­ÎèTW¦Bilæiú±¼@ˆf\ò¨…ÄïîíÁ²9ß‹?Ðܳ+¨ô ËÇ©g^Û®UëA×¢s•Ø»‘Ô«®G®1jí*‘+ ¨{aоV»2pÞ¥úPGØi£“ôó`ª‹8O•))»yî_T23?1çŽ^›+¬4Û£°ÞÁ}· ûɬ(TqkêÓN¸O#ܨ1/¤…Yj½X̆E—º¼òâ‹þxa0†šÕXnoÉg2˜{oºÀ²tÀ 6oèÄŽ |ú¸w>ØÆH®ÎOÁ%9ºv‹eQ\<ˆuõ¢½6g» ï„ɪ† ÿHƒÿÜ­llhggêD"céìò/„ð‚»íÜÀØÜÀäÄÀê¾–ŠNTÚgrTÄÀòNFzzVˆzÿðv£ý*rùÞù*J*‘ú^JšÁñ­@BÍŸ9JR!N Ã^¥nGÛE.wùYž÷­ ßÞàs£zHPV©Í冀îhZ˜0aVtƒë„û·Ášö› K#ž—#ÉÎÞBÏ<¤\„+b.#ËöfË\† æ›rx¡ Ô|g:29†&r:Âð³í4®v`Â'ŠŠ‰3ý4%£C-ƒ „¥‰›åˤ_o”í¦"þ‡£7ºÔcŠ«ƒñ®¦ÉñN³.?ÊÞõTäŸÑdclnÐ ,˜8] 7î°(”OAq#Br({L+MÒ“!ç[Æê›¸÷pÙÂ!8”.4®P'Í"ñú0¢Üh¹MÆÒ"÷×üÁ®ú ^²Ó(Ð#€üϤ+ AÍ*CT±*‘ê¯2×ü½„ßz=é«§ ’Öšåª~eQÊEò}‰¼ÿXà©ùtv¯„ !Àûÿ0Ï¿ÏÅiBú¤œfþòO’0g¾ Ip$€t I@P!ÀqJs!Ká$ÑO0 ›“áìEmX¹nï*u/¤ê¹-ïÞØ’"8ж§¹9vkowÑmí.uÕÚêª{ÛÔ·6ýž}÷ͤBÞÖÓöï÷œ=ñ½¾$>Ýñ~Ól>àê<yûáï_‰žù{=óC9*²ó¯Ââú• Ç»¾EÂÙp~¥×íAô?´ÁÝy<(ó¾gÚùÕô/ú½‘úŽÖcDï{=ôëõ\‰“Ò}Üsçî/³§w ø©HàÍ“è«ã颾•*ôˆñáF¹Ü£|Mÿ&>O‘R’¹b¢% aÖ Wâ›*•µ÷0)н3Š‹]YÉŒM1Ô§€3èS¹(_$;Nxôë"÷(•“S]§B1GR%Oòe+¿ð¯«/û(Õ’/§>³è®R¬br­\* 'd*ÕWkrÍüRõ³IªF}ÀáíÓW»´ªS¯{™ä)å×å³\ð,TGmFó6T꘣–ví— ?ÕÓD  ¥N嘢ª÷0 ½‚¼ÓC"¿ŽÀ=ncòôäÀˆßv¼G-ôО‘ÛFÐÓ¤½/=®­}h+è³´A—(.ØÀaCr³±gqn Óµm·Sw°oè#G„Z§NT´vŸÙÛžaJj¹z´ÛÓªµåmÌÀ•äØ[‹Sà( ç*(´ø®R؈yݨž‰¬À© Ô·®!G‚åšÜaC²ˆÝÜ]Ô0:õCb/­\ÀÕÈónÆCT´&ÂØ§ÅHõmχ¥Òž!óXÐËÎ@ #*1ô{y¦š´è®% %rSžÏËý°0Ï 7½*²¼O3 )ñ~]H>‡JÜr]Ô0ÿÆsê`ö(\¿®H_‘â²-K±“ŒÄ¢4Ï÷®ÂN¥žF¢Ãav¬fFÙ(¸¿ñb¦y ºSÛ`QÔf0\ù™c!®.7W¡˜¸´ Æ^mÉž0ç²Ø¨s9kˆ°U–Í»´ý製R3abNÔ,Ó† ªÄÕä8P/Í ÎW3‰Ì<´E†‰¾+%x€Mü#Âv~Q&ÔìK‡`c/º°rIËç 0uM¾/óáÏÃò*òºE©êx)½ñ™äGƒ‘\øáþ PE H)ÐS;mwÇH‡#/ÒíÊ”¨U’¼/IÁ#ã½/q ê)…Rç¥ÂÅe#æ•Ý—¡‘› ÙÔVdº8Gë©B6câ\CãÖA¶¼ÀLphPÒÜljXÌèq·k‹oÁÆä,˲s[ÄIœîþúˆæ0¿¾~”IY½)ÇAåH‚®b ª GÉgŽÆlgäÛ»‚¸D‘ÌúJ¡^<˜t³éHæ¦d„Çf§ÑÙ?{+R„Ø{µÀÁÒ¸HJ¨´‰£˜ºj µÑàœ¾›fQ“Ô’<«ÛxÎ7«¶Þ4XêYGB®iŸT×ßÒË[ÒƒØàÅÀ+šG ›²ôü¤1ÃÃŽÊÁ^lmלÓk\R"O+Ý®½€o¡©±æÖÜÚϹ…lÝŒ¬i‡2«R…v;,Èå7e!mÜxK^Ï¢Õ²¨͈ k eâʰ'šª-Q0>¤‡k7|ƒv»pøOÔ>@áuŠKzM:™Û„ø¢\{sˆïºýÄkï(dˆ?2XoÓD²ÙÆL ‹ x- gö9»&´ƼÚ_Sžb§ŽïÕ7—TÛ¤:”âýäRLZË$ûhÛîPnÇtRvjz·cœšýêOF(øCBhÿp:¢¿ô¡Ix(_NSIjS4HoÓr[T÷FšËy1ýq¨`–1ˆæ¥®É$ÝÅãÔ- 2 ñv6Â*žeÑ–Š®êL•Ûg•)×Qjé®G&+•¶ôþØtÕ6m$eTG†™B ¦¹"‰‡j ›Ã鉒³k ºl¼ÖR1Ñͨ¡ôßI¶ú-ð6i;õÐÜdî76Q_]Ë}rw-§ôÛIÞ¿zö=3 h1Ì?z¦[ÔMº­ô :Ú¦JA¡þ‰Á\;òÕ\A<ÖõQbUe2¥y|%î&î.i8KàÄN#ùGcÈ¥B Ià*ìø+æÊa%É{êZ„”b>çXíæÉ]O‘ç„͸à˜Y>Šq‘”7Èh³ A„©D^;}ÌšÆ0éÚVœÅhìîm._n‰LMKYWkæý4ÚßB†IFµ§ès’wúB ;’«¤&Û+hãžÛ›öM¾;»u]}ÚbanøžÙ\7y#,6æ`¤ƒÃùÚÛÄXá ¼yDz=Ž=} òL¿“¤#·$@9k^W¼ùjáuã–ÓrSWIö·qSƒ÷4ýˆ(Õ²ž¬cçLÜåüsO“\¹EC^ EhaølmrJ-Ï ÈÜÎȤ Î|íbžîÏ„Ïø4Ý’ÈøÆ½±²1[3bÞ·žnq<ôàww'̧6Л¥”˜Å<ö æÉeš!Ë­VˆµVïÔ™oµ†Ç çˆf§£Éy©+øC‰âÏÙ±€¶Œ‡ÞO~4ì±áÛµà™óÍšJ®¨³nH¹¦(a€¾#†8¶l¾5ZR-^agz ¸G9gÖ§\Áʼnô¨ÆTŒ?üÔÀš-Ô2k±E*j “4€áƒâ/õìoæØ mÆiŽZ­ãèªw1ê û絘~¾ð:’Fw'¹,Ú)}`+þXQ8Z7em†`ŸÒìûÏ3BëƒVq¨¤ô$WŠÕѼ#I¸¥TÓ¦'E¸%ˆøÃ¤`ŒŠ™GÌð„øÛŸba†Gôg Ò/Œ¸Sƒ‘©¿‰Ãœ˜ï(|¹ÒÄÄM˜ž1öq°ƒæVRoÍo:pbb&Ö'ôÎLv± M˜œsìäa'ObÄÈ’…룮½ÑÕ.cꇜrvP`æ˜ÁHYǘE~`ï–çÒÉçÒ _©‚¿ëéâüLà^zÇÖ"¿ñ"þ?¾ ¿²L¿;·?6Fñ¡ðféå B”ñÅ^ŒHÊyÔWâ='bn+c,²ï´eé‹1ê H>Ÿ¤|Б[ßø”—®,É2sY ûÅuÄêÜ 1cl ™hæÛ.°-!¢’ ÞT‰,œÉòE§1U˜ôc¨±÷Ã©å „¢ÏÒÈ áU}3Î9C©›ûsü^‘%i_”z­[Z2—KœÅd“?2—SœgÆs>\©[™o0ÌVêø"%¹äù#)¡jˆ É—áB“¢ùVÊZ4…ÉAüm’,oÔ1Bõqü„Ûü¢1=Ò½>p±îñìP$»H3ãËSÑÆ[œqÊ®r§5çDßO(§»ŽLÕh‚Hýb¨F†D(Ç\0Ã2•‚ªKYbÓ9%Aó$‘\j¹gß’¸’¸Tð/].É‘L84¢¾,¼XLhx”â•*GT0ÓÅì´’v’%ô 8k!ªsbìŽÊ,d$ù/A¯0ÄšC ݘпH̳ôõ½áˆ­>V5X[?NPên{]§9˜2§2€òe„+UŠ•ÊŒ›f¹fÒ35È^4(›aÂUOŒÈ‚©ãÇŽ¨Ò×¥²)sX(cðàÖ=¥!f±èØ»Wë.`þ´¬ü=Æ"œØÅcòª-À†š‚ÖùÑ_JE4ø r’÷4äG£PÆ“8 Иp¨ÿhˆ0tÀŠ¶Þ >køç_ª¥ûVNV£{['ƒK=^˜|»¿(Öà tü$ÔËš£4š-SLw_õ²o/ÆÁ[¼jWS£´*ÄV<»˜Šè4p ŒZ™Oö½¡b]OõÒÇJÑ/?Å?¬.å m§2³—„é†04eˆé Ó“²M5¨©(©‰«ïjÆÊMaó[9è¯׎ɛû¯êX¤ m‘6©N—ˆ”M²iRnšdì’ZšY&i{ Ú—9FdcÊ@9¢—kÀB]Š*k ær¥BXI–gù:½Òdc3V5ë'®`SøäÄ1…çòÆù.äÓÞÇ2¡<~M{8’mÈê„j'™ÏÄ1rÖq¡hÓÏB™E]F½~²> ó¥öæ^ÆÈàÖõ¯*k¹ƒei‹3™²?9õeÛØÙqYµ~ã¹|‘¾¤ñôåNV×ʾ:óóºÌù£›²ºóª­0…_½K^—´{ïÙS[WrÇÚŽÉ0z®qíK†ù-ÌÆÉª5J­J²›Æˆ ±|èÿLñѤ|kЃ7(ÚÛu"ï:¡Û%w;&<;AÀOûzˆÜŽ\T³!¾ê´ùê†=5&dÌgaš+½cyËÂûŸÒ¤Ÿy~B¸¾ýL’ÄOybè³Ó×ýlžóËÿNÊ2)Þ¶ÜËHlëÚ—€¡¥îŠ˜×à:Ld7w©xFt^wá±É¬qP$‘3¸÷šHÈ1Ô%š«í›X®ª½mÓÔÃ=àßçþ<´(r%/¬­Ã‰HÖB&•u5CD]å ÃiU°Æ«Ö–—źA ê¡”ÛÒùŠÚ* ¶° ·gtrë¶5 à Óã›ÿýiþU4û•7 ã™óðŒáåðÅ}ĤIšg|÷Å«µDS®o¶G¨7ñHÔìJUzc‡ªú°“Ú·Yã'¤gÄ«ýè»ÿŒÞù õEõ"Ê'˜(¯tÂå“F”O¶XNù¨õ#ê—FÄ/ž˜ÿKùuyGïô‰OñèõE$úÃ%ú&êIÔ/•Ø/ZD¯|¢NùHò$êKäOòh=Y_Æ®›Èƒæé(e²¸Y6K唚ØŸ[·2Ìüš>gÝÇ!}òåòå õ# õêô›Q²_²pgÐØzub›–_$é—Fæ1€úÅÕì’Ÿ‹â#¬tû÷Þðd\JÝÿ›w­9–]qö*ŧ½z\V(ÉZÁ ù…O–蓾¿ÅeP Ý Ýìœñ„7‡8÷´Éù×Ïzáð÷?Ò'Kñ`†0¤ÿýp¤¬¡‰œ½‰éÿFaì;#¯£þüµ*MÝB‚bDäGR"’NÃÅ9ˆ“`€HÙs¨)m¥Mh5jeã )#•Lf¹§÷4 –)ƒ7Ë–Yú³˜{¡üÈçò±’Éçêa÷™›Š0ÆF²tÍy–ç=×ùêwÖÝíÿ}÷Ê´¹/Þ€j/‘,a 1Ò#Nô/4©‘ÊÈ6ØœÆÀcNª‚ôˆ²1¾ `[äƒl”ý”cZdüAŽÆÙ0Edš"Úaˆbb´aX˜ Èø£rZµ`¬kÈX·Z½'Ö3`¹5Ãç´éölZÕj•ÕYG²îrÜU¬¶³.³^ã ëyçèã‰cõcŒÉ³•…Ñ®QåÁ–)¬|üO ˆïuo9a·ù¬–.i5füEªï¬V)æçà&òñÙuy3=ê´¨}~˜@“oFhÓOþ4êôߙ玛¼–1i¿¦äv©á4íÇÝJoeQ¢Çü $#¶wPeHœVY¼žÁŸàw¦Í€ˆØMçL @cHNñ5éÙ+IOz)ô¢µfwÚm·) -e,0"íÙ–'MKį,#S´?±bȈҋí ‘ñâáµAÚ'uÆ`l_¬évýêçvfÝB÷ÐøºV¬lAÌ™è`­:x£Î0škÆ®7Ê΄¾º˜£Æi¢òøz€Û(ù’Õà !}URGY¸£.ì¡k°Ç ™}…Ò§X¬±`o,‰+Ö¿‚ù-žëÊÝEöNlþ¶©ü+o÷…»tãÁ¿Yx¾ÉüêAÞä;Ïvdß1rbB˜£ç2 aB›ºNÒ/Öºèp•5Y[ }M†/èÇëQQ œD()¾|éZs| «MßX›¶ÎQ/YgÎO‚¿´Ôâ‰[¥ž{ ±í/°Öä¸]j_ðørô†G¿W´ŠŠòµâìeNÿÔqkÍ•a_D\3Z¿þcaµ³o„gSz¨Ëu¤hK,DòoЗ”ç-'dm`_Èüö…,4âFi²:J½ÿÒboS‚3I9ñÏÛXm´’ñrSí¡[­R jÓ¥ÅéW2¤]éˆ5ÎUY‘¥Æ”§ô7m.¯R¼NOÈFißälÒ·ŸêS˜I€ÓÔ– h!ÕF]Ïó’½R³…j3GÝFWHòUœÉ8}êtÆÚ=bÃýqTWÔü ø{R_ü#êÄ>5üãøK.»jy_å’²÷Ï„µ,Ñ{¬X ¯¬þöõÆaû@¢·òè)Û{l«ÿ¸ÜÍð„. €êÿgDsµ±µsqòü÷°¦b-¿¬€á'ǾUçÆ%gR1sÌæa “ZéX6‚aÌea&i)¹ŽùŽ.VÜ/ŒŒIö¯­Þ]Iæi/§½í§ž³Þœ¿ëwwü€)…‚ã:Aqž°’4$ CEAMa„4Gdüiª;GmAÜP·T† ßìjÔí šî½f /_aŽ:VŸiº[¼Ó–v˜â¨CµZq§õŒ&ÐÁÌÝ0YÝöL1+´ã;vøl2w‹ “ÉuÝÞa½Öhí¡ÌsÐ6í¶Ÿ‰ÇÞã0eÇz³lZ´ÉBï€è„°ê-?äe¤ô2*ñ1ìc“l9f—–Ç;Ï”uJßê Û/ÔZQ«Þ‡4mô¹œ=¡}×÷ÊSú¶i©½ü×µ¦Â.á.[qbÔ½Ú'♆W ‚ÛŽÛzyŸGÁyqÆÐáUîÑêkM¥±㟼‹^¹;fÜ,Û~Ëî)ÒM’ âI$­¥A=Š"ªÂd$»H3-@¡~Åñû²ô'ï ’ºF›jßµ¶q¸ÌËåÊ-ê5 5Ó½Ÿ±ôÔ$R$( ÊšîÂÙ}‚Š2*—¦(hYAF4I˜CžhúÝPólvG–DvIuG¦F5–þ Û¦WC€Mq J¬¢5¤Ð0ÎŒÃí»}€+ÆSJ¢P§hø#¢sßÿ ¶¨YñUðÏj èßÌ™ÿßÔþß™Ûÿ3åNÏ ÛÆñW°'¢ûfßLN‘X¨é²Ì—œNÒæ"À:HøÝµúyOldÇL<#o#Û^™B&çâ`£‡?ä¶žE4ÕÒ¡6âÆy>{2ÄDL]ý6¬eÎëàWývk—‚,$õ¢-Û©<À}ey(sI%‘šËô3ÛÇ‚äý¦!Õ/ŽŒo„uÂåŠÇ²Ôîúô/$ŠÄªóSw  ¼ þ÷ÿkÚ>¾jËÍß/£ãrd| †TÐ ¡ÒÆl$ÍÂ&Ä¡(²"²TXs#Ò,Ð…ÿá¾ ò6P F¸¶òÑÖB.F.c ðQDV½’º¢aCøbdðºbáàsû÷y'Õß'Õ"”éÏÏÖîßëÆYþ—mŸķ7l Ó}Án.ÂMþ²aPwÏ}&Áš°ç5ò°m‚§ þ‡CbF‚Rç–ÕÉ€K|¬¥{K‚Ç O²{ý«ÑU7ßAXÐ8ÙbƉû`¼Üd¸Ag.¢0ärW5ÈãSUg®¢Ã:41„Ý)qÁÜÔF‹¢?ÇwÙx¹iƒ°<±ÞÈ}­ÎNp&ÎX³Ã­÷øÜ]Tú‰ƒn]U‡><=µ‡m@`¾òó–T;HÐ(ùÁ¿K‹Q¬¢)Wa¸tŒõˆ¾BÅ«c®åé«cè«i³4ØaÂÙA¼àë-I°£)4ÁIÿCæPQUuû¬_Wf1èµ'_f’ù5üîôm£mWè[&ˆN9ž4¾ÏÍÜÑâ[Gîj)ÄŽ]j¢8Ü·Tt©shQëT"jåßB…﫾k‘\Læ'õ±Þ@KcQ6œh¨ º bO0l*5÷]Ο!ÓôÜu¶³ ×gǤò’ Šp#£áýðÁ½fǶ™ú¹‰˜wlÐïSfv@ï^1ô¶páXŸß^C kBð’ÈøU±Jé½Û!猻utÁáÀX ãPod#igRH»j¦eƒå±š)¡)Y¬šâ玭“Æù¦GOkh Vk«³ÝúZN£ ÅS“'£ìÄGÚÞßdÂ'#U²µŠ&ÅÚ+µÒQoäØîö·ú(EmÆOO ` é'Ìfz<-ùë/`G"8×½ÉÒ]m™*Ñÿy]ФERà -Áh’›ú–«òlk«dˆûª.v-2u˜loC[õð¢D¾HÍEÒ®pdûw·¤ö<(o(‘'àE)Îî_èb¦Ú/¯0˜‡>Ap24¢µæï¬yó°Sæ°'Ñžä$¢Îˆ½ñÔ, FŒìô=»Œre¾EÃ’fí®Ju'(1Íhí !RŠÆà&å{²a!ßé\2Ûž …—@¿L¹r®v¡ÊjùIs­.µi]¼¨ú`”Ýç gÏ•ÀNÒ%,/3ü&r¯cM™ø,X ñô/Jì÷–Tø¦>ß–ÿ%#âSÌú÷EGf¥8Ù«Û¸AjÂSÀÖRÖ³|7à`)K]¡0»”U}{žÜ¿0îÄÝkOžƒOǃ …&G€Á"¹)Ì%¹Ã%±‡Ž|æ<¶O¨˜õIÔE:†@ôJý&ÿÜp¦Šwº`¿g’ €gœ1jÕ"ÉŽÊèÂ:Ù™9¾Áxø)mŸ°¸†išhIã¨n²Õ±ÂÙÕß`£V’C]À¡æŒZªáßjMV³¬i!_·H>-šROâ¨IÈ~o™‚~ÍÄà !† Ô;$ž$S)¾cIšÆÈu€Nk\:ürÞ|b×¥¡.ðÐ…Œ í"¥²Ìby'*áã5¢-ù§PÃ-IXŒkÆÞ¤n`ǸïmÏa×5º(WÞ%ÜÛqˆr¥=PÇþv[ÿîÑÔžzNýµ½ðÓýÙúA7É(|“c¨šƒýÆ5nžg!m9¾©)}uAg¡S☫C½0­ o˜=ë÷»w‡ ¨³—w±³í&œ+ÓFH¦›s µ¸^ ‰$ÿò©Ê+0ME~17} ö,䟸Â`#»&ð!a´ ! -Ùª’Ú‚D¦KØì‚ò‹­XðŽüÅl1¿â~òopîPÕ͘õe7{':G Ô'§3c¤wgk)|m;Ùg¬ )*–ìǘl=ªä6»A¼ÄHt+Î/4¦=´P4å§)û.™æ .{®V·œ¨¥ÄÔ~Ô°JÐP´âJÈ'TëþCb6W$B«ûΑ½ÇÎ I%–ðÚ·m“µÚ‡¿öVS‹†*§´™fzn•lƒÌ~twcqÌtIæZlƒ°˜x¹÷h¥nH.*G<µ»²¨Øwz§ø|÷=»6™ÌÜ}­6H¹À<'„³ ˜ê¡.”Ϊ>ùnÞnÇP“rÂÍ`}µˆ®x]…›#ý½Lâæº["ML°:Z6ö&në‘°Ž” C§í°Ñ€÷³è­Y¶O˜A;\RÞÁ[`Ý(½6dŸ:PD—( Ÿz OƒQa¸}¦Ü>X¬á¨/olÅ}.„}t¾Á–Kî/àÙCþï¿´=!½‡éw†rr£mé1Q!žÊtý²Æà=”5}¯â˜±QTþD‰Wœ{êN ú¨œûöõà‚¨{ð÷â_*[qQøo1žH‘ÝoÕžx½¨Š*QÑÀGNµ¤CéîJp®^å—ªgFÞu"j&øcý$NÔ¯(»'7ìGsfS¥ÎÁb¦±Žæ'càMÅixmñ©âã—C"NôÆEíJŒ+¬!¸j,¿œh­:«/˜£ÚÉ)-ʼ’‚•Þñ&$™'匸ëh‹Øöìd~…aôF|ÌÆ½²VLÑñ&Y2èÜ(èr '|[Ý hðY%4\–¹tË.Ìa‹Ô1æm÷zÇÞvÕÞ95Ö~ò¿Óžz-ÐâuìÚ³­\=C$08&J€]#‚ $è@]Õ±/²7@(º7Ónú…Ì"ö{dVÀ¶ë)’y1Ú¾:ñÐÊÚó³žÿÌœ{ÄæK/D­úŠî†œ›K§Ó[ G¶à.Bê(©˜ŠSå·£áÔä8&j«œâñÝ'cá8Fõ£r® š¢<8¬·½g¸OàxãÀ–Ž…HÈ  1ƒãœ0…Ò†ž†“°EÄÝa(ŦsÁ:lÄ#pDµ°¬Ü ²·åññŠÑ œšHM&€/¡».àP*[Øï”(ƒ0óz“¡‡dë•"(qwæ²BÆ-uÓäðáªÜŸ©0mö×õ½=1m¦ÿü€” ÂÎ !á@ :b k…69O¡æI ÃŽQÑСڡÛÌ.õêëFd‰CÚco‘zC ™­1ÔŒàøŠŠA‰Õ°‰lë…±Z„±( 8iBíþ#Z„=ç ŒPí„Ö†Ù¦yݽ‘nT‰²Å…ˆ\c+ÝŸF“®:ÞgÙ?œ~ô¡¼juˆj(é8‘Råƒ)2êlÌÚñëÑ—µ&2»E¶BfÃóå·Âf#)êá[ïß=^#·ƒ‰ùèúõn1㌵øBO‡ºˆzJˆ:t#ÇùFq VlsM¨ëzlƒÜ¦ .±ú;ÿùâ%W'aWjWDZ¹ìÝ®^]ŠB§(m¬PÁ7›1gx?æiD@É2ñ ¶^îØÉ¦™<ðzV5(½k4اî3AüêˆÈìäñó+S X¨ZnTdÉ®ˆéRiú¯Q‘./ì¡Ù/ßg *j·†K‹WRãÙu¼4”S‰$7ã,ç³JÁ†emú–£Wÿ¤¶Àçy@uØ7ÎÕ¶XÐ Y!.œr%½pDcå€.ŸCÖ0u¶6Ä 7dÔq–[ªL”+± I9….©L<‚…Å0,Ë'l Ä5#õNÌ€ZûG´+Ôþ^Uc.ïPãv‹|Çð¡gœêÿ%\EE@àž’âN‡‹dgdñ@ýv¿óÀÏá—ùê&o=iÑÌ Ä 3‹µn—¦š2i-jíæïnûåuëv¶—‹Oµ`.Ç¥ Ä£m‡ßàKúŒÝnË“Q½f×ÇÍŒ ÍUPí…\>z¿û“OfëߨPßh):vcy龩8II[Rëµ Cóg^ÖÎ×j¶…n°‚Wáü×¹Ö`f@§!KSÃÆ7Š¢ùÊš·µmNû5>Qº3}j¦*]>Vª8ØýfU¶ã͉4iÅ8ðC9‚ž'óêûU|‚<Ò–“ãÝ4B¸õ)Ó),°ù2¢äyÖð¨7©šûóîÆ-°âS5®«ª¶·%év˜å#¢±wäλðeuma³Ým³*¹G:¡šÒÇÄPméµ8ý\s(TØÃíÀî—§ò[{úg8>¿®•Ѭãòµ6Ké ÒmaeîjmgChür+ëéNhtð&08©_ëè¬m÷Š¿ìÞʬQrlŸmñ–ŽÓV?µ}£ÓÖü¿€.·sý û[•gD¢ ˆáÿÛ³þ·DÊŒû’©J»š9ýg»””Ýÿt`éå4Œ7 E£éà"#³G ÿ^+^€ÏB‰°£±»bä\×Ñ¢¼2,þ%³ ù¹ÍègiAã:!çuK¸|¿5ÝÀ÷[Ëê|Í~äÞõ¹YÏúùþ95Z|ã JòTìg2¾êˆÆeÙÑœ [g;º•gö% õGH¾WÆiE+3îøCzãŠ!Çn5ÛJ¸‡e=+g*ÚrÌH7ƪÔ~ÑölØ.yQ]w‰qo·O·±»Ñ6_vÜâ~è¶JåuìqÌvqJÖnr‰¯Æ¡0¸çÈÜú±i±"×lÖÖöQo„¿' “-Ñwj¯nOþ£!—´e7íÄ•!3J–%*}9TB+b¢²èÊ ³,¹Q¢aos¢Ý¾â;¤³Ï$Îoj¿ÊnâÐF…FÈô´øÉŸå€“*)B¾È É9 e3¼ôžJ(oœú¹ØGlöo“ô™+R3]µD?k¿j0ÚÙA‚Rá‰êPÎSI#á9SI9xºÂ×ú2xœÑÑØ´|€¿Z'ªÊ_ÛaƒêÖϺÁS$…Mb-'žiG÷E•í®û,9tãQs®Yå9  Ç•v|ø£Fã—/s:ú Ùd¼Ü½ò¡’åà¸j¶¤¶5hG ¼½%±¯ÎdDåO|M´Ã¿›¼rcʲA´}0…ŽHþ\À:ƒI#™±X³¬É)ý;ÖíÈ_Äú÷|!§Lw~³öV>£wdϹÍè¯Ò0^4×Y¸ 6"aM$v$&62íÈsî˜ÖñÌÒuø$õ…c Ãb|2™q ©oiYèì|fñX!üB¶Šo¾¨F,Hß©w GR=éhæwƒ„YE¦Øòú¨žn¯,ŒÖ„õІ ïn•o¡ ä €Ï1CtnßißJË·rIßV£ ì_šÐ2‚°á^‰D]Éze1[}¯Æ›žHFÔIJýâº$¼ìÄ‘À6+¿ !d~¿ÃšžSÝ2o­&TÀqu‰Œ¹1Q-80æû¢æÃ…&OzRþ¡[l ¾Îþóý­gZž.êSúG %1ào ꯡ¾]‰¾S‘;²°=çºQàØÊ”-Lˆ4Qõe¡å¶ÞÖQ'ÀǤ™!q\ØQ¹ÒŠ«û:奓"é¾3–€|Î|/Ô¥»ð ¸Þq(©t¯k‚uI袯ÝâŠ(õŽó]¸ˆÓÿyâ»ÍBÛA€€Â þÓÒÿ8ñÿ™ê(¢ £}—¼ÖD© ![ë§FEª×HË“"²“uµÛv˜®“wêˆÿDüôCÊ¡¡H?mšñ5v6m·¨z›ÏLqï¾Ïp²nîþòÿ«ûØž/ÄÙ%6#‚¥L'N„9Ø€Eó(•>Š2 q ̇nÎÉêÙné¢ZŸ$ÌpÁÃÉÉ>ÜÐ6Üš¿ð ?n©?{­à¹¬o^UÞa‰%±°½™Á:W¢|D®~Z‹†nߣAƒƒé(¡>ÿ‚¦ŠÞÓŠÕ°[®fßašþ¼•o´~lRcT©]Suᳪ¯B¯Ì•ÿˆØÃz¬öA ~¹…ñ•¡Ï’â/nl^žnÈ”C,¹BÕL¾â¹!ëv'kço òºS.Ÿ¬L(£]¤V¹Õ òî»cÕ (É¿ …§Z£Æcžr[ûÝSå•@zÈj½‡=¸t¬.¶D5(W©¦\{¸Úýé>hyÆnóÙ6g»<‡=¢­l¶I–Z±ÌõŒ§,¾Ò ’ û(2ÂÃöF!úá S~â†~¯3`›I½J›jG£¾ÙïêìŠO:1¼jçr6lv¬:#™ –}·7sn×& 7x~Ó· é¬5ý$¨)óCcþ☕ë(íºs@e…QˆƒVÐ*ªÿ[‚Ú'TÈý…wMó¤Mø…愊8„ëæ€Â«Ðžm$,;C¨˜œ‚é܈A™ Ù?vO`?T!3Ù‚ôRhÜ>^2êÓÞ È¡¬ˆ*IÆd‰{àó4ü*˜WœÏ æMs†èg”÷üOV鸈¶ma–õ‚¼Q&YþkïRºÎuÀ!ªÌ™,äl G.0bP0%u>RŒþµmÓžM¸ã,(•gŒ ‚Ð\P”ÎÒß‚˜O©ÆŒ´mSfÓ36ÝßÙ¥¢kŒ•Y|ë©x#Uƒ¤B мaÄa¨…?1D5Äwÿ“j¦Šxª€ù7úPrF¦ÿÍÈѰQÄSÇòÍ¥›,nFƒ¨$ÑÓJ£§d°6¾tʶÆK¥¦ÓsÏÜ^‡©§Àag¶\I_+#ÄÁ}3\èÃ$óŸsˆ·<¼£|Ã:¢[Ô³áJ{íZ=õšÅþ~{]ÝrÝ« \>{:wÈߌüOÄ*ðÚkÒʹ/„±¾0ƒïùŠ$<+ÝWgÎ[«5 ôæÉPذ  ¬.D9°YHVB—-™ö´w˜ŠÆB¥–A­ NÀag‘®Ÿ…5óáÉHù3Z5¥fº2±†:âKfA©šn&—™A}¬ZÂoj^­K!4ch;Òf&¦"áM³ÆÒ°ž Ò_—#]Rê=¢£Øh"M 3vUI-à•ÔÈÇ'H—ÜHwsÞÚ—!b¶£°‡ÃÁfµ[Ôű(o—“9~¡²žÖ¹~AÒgÿ~t~,ÉiZp]v‹7Öönýüù£dJ]?1rýÐföªÓþT”†‹.;ÅmM ¥ ü}ZFf‰Ë£ä«™l‘´•¥ÓÌU`œ½¦æèÉœ1½0šª`d x{£yš]Œð|þ y@äýü.š£ó·ÂüÆ0‚¯¿ãa»ƒ0Æa€P óJ2gú͉ k(%u1Oj 'ÂöΦ ¯jDª¿P=SsMÆg zÑD?3Õ=ÁÒ”Ç' …¥=úl«úo‚¡‘N› ‰ŠhêgU“ÝÌ:8üdöÖ¼¸>ãê•wßA »SŒ©Ð«Â}ýÚI¸¦l‘Ꙫëþï ‡aø´Ï(õ…×uGJïk§}m®ããºvÜõ§EãuÀdÿŽÑìg[_£oJ%±?šT·@¿^p#Y‘]¯ö~˜$WEl8;h HlAª v§vi*ÓwXãÀzâ  „‘&Œs®jòÒrîxŽæˆëU}ô¦@7M3ŸN8µàaád×w®ˆÜÒ®R ÑZÔÊÊ^›¯ëªØ+qxÖ3”ðZîŒQrT!ûÒh;üQ•m|vŽmÆ£[A:Ç~cÉo¡h€™ï8ÙjߊOôù’‘µÀû|ø)QaÄ)KóX>Á´’w™êÀö}E©£ ~˜rOYs¶ì£ÓÖIO¦•Û†|PÅX]0‰ËUL{i¹Š~ &¡†^1$¾¼ÜÆå¦¬Ú¢¤šÊñC#òq¯ åŸÀ¸[Ó=ÐGøQ²†Ö&­ÄÛ068Äa@Á\³ßëT dùŽÞ&ÕjéOÜ5ý vg˜N›ÒR0‚ÍÏWfƒITó”üUjÚoËu®K¢)3|Î ,â!¹õcE™ñRX>æ­P̉WÂêÕ–.y¯9n‹Ù›÷ÞÛOÆS¼¿g½š§À¶ƒ˜mè…êž¼* ÑÒ&²¬ ÓÁlIFEN|Só… ¦4N"¶XÜrÒúV0FKÌJUÒÙ0…‹,¬¤…£E^y| ÓçL;q¬¹Lw¦XÊÑ  ¿”2øÐ%Àqßâ,ØÎ ‡àÑEñqCžLZ ªuF Û lçIÒ<$’XéÅ)s¬ÎÓ®üÞ}KZÏäÐs((·ºu‚˜}iòܯºB-gïÆMeyVž² /èáàãJK¯™Iðs]9®›l †Zâ•,ì£ñ4^‹_ò"”ywóð¦Kj(ÓdÌ!ß›ø:“:X3¶²Í< ncñ7=¼÷¼»tiTÇËMi®§”l|ËDK@&ÐG‚¯‘.”á/tdyXƯÄdoÏœxÃÓ¤ÒüµÕÓeN®f5Ô*¯¯‚Y¥Ý°+ ›˜+G[#ãà ¾³Ccœ (¯5ä’oq¿çn2ÖUxÒŠ_þ4På44‘¤$;º£ ”&–îXZ ¸lU?…9Më¤j_“¢½Óê[iÝ6þ1ÝRËîh I4Bˆµˆ'Q;µ!pK"KŸ8‚!³^§Ì+|\ÙXavx¥÷(O-v:+w£;W2ocÔœ*½úk%þkè-’BÛ1-¢ºNŽlÎöaËê€Ã–ùÞˆÏæÀ}ÞwhØwihÐ’Õ - :‰Þœ……×pÏ„‚`Huv?;"î°+tógvéŽ>k§‹ ŽÏá•‹ÄÀa¨4øã>>Z€¾îsÎh5¯?êi1°üFŸ+öÁÐm1ƒùþ Ç|¯-Ça"§éñ0c«\OžBÜJÀæÀå­ èu[mž%Ϻ `XÇ”o¡6¾ôŽ>Å#xLƒÉ+s®¢3“ ÈÈ”;yå.v6CÑämWÈp:œ5>05ß]x Åc± ÷Ö²DtXŒ÷Lò~Tüø#£n*×5£Ë|IgÁ­êh+S&“§f™]õ&s½- Z|!« ¿HÁ÷o5žˆ!óÃ.æµèX§÷t|¿9Ρç3´?F 9”DOü[aáU–‹^àý a©ÂoÛzoþˆó™Î9½PóG$ó7zȶ¶jÄeŠ&’¯:}oÖ5EðÅÔ–È>v0=ÙGeœ_»éä&–Ãî/ K' Å–ù~CˆT°‹Ú9v0%ù¦! óüKUÔ}ø {N˜uóˆLÂ\²§–ÈÈ›zféõÀ>T–·([ˆ­È¼ç.ýÛÃŒ²môÈõ=1s´¹ïñ™WZÅN‹ùÙzëÚmïw‡_=£n1ÃÚ¸¸ z>æ—‰Ü:[½;³ —­›÷âR²Î Œ 6Xj1ÝW‰iÁG l­_°¤éLÆ\L n]GíæGQû9cß¼ P_ïi]yÊhá™ÁUáéµTÔÌ>9bµCä aL;KOÌQžO¨_s×Ú¿2ÓÇeóÄÕ@pH›-ôG ú "Üäó¿ÇÞ¿eËk!!AH!«O~ „9zÅZXц-§ kI!¼g«eg†ÏOew"R¹Wtj<ííÁ¸‡éº”Šçø¥¥¤Sv÷íX“¸ST_3«Ä¼+Ç@/kÓö+š˜zA«[Ð6É:liu†ˆó),”žç²v ôWüJŒ·ÈøPd~)=ÿ¶@s‹»Ò·„Pÿº1óK£,…¦ÅtZC¿7‰Dz}ÒfžŸ+Y½¬:“»|NXi1ô»ɼ"13ÉHþøc °)W4yþÄËqÖgL{Ä3šQžñ2ï{\›bõŒ;eè¢9=›OKÎvW±Ú£I@-Êþ+ûÖ¶š´x9‘0ß©WßÝe4tþûåS7¢·´šèS…ÓPÛm¸¤ìÝÚ£òE[y› J¨ _‰ôC¼þ¦RK3ÂÜéüB‹­…ˆK¨WmkIJGŠÀÅøx>=O^5ªÙã—’µ½*uÉ2î„fÐtJ8Òš ª-ýÄуy¶6&r©> µãÒGº…«dˆ¿}÷ǹÏy´æ*¯=áÚc”F·à©ÚdóOòGðkóØ–&öÎåÖEÀ´KÖ·è3èE›LŠàÓ@g ÆÀçoÌE½ÞJ Øýkä˜v󞟣Ô}6vµ­>ŒKkÈ úqÂ3œ ˆãiÎzw„KO=­\ åY†øð^x–ÌaïÊ'cпê8vpT£sŒ7Y«uÒíã~x€–Oí­›¢¸/°ç7ê¼_ ¡½†Ë߉׵e«[0¿‚Tߪ5»®­ò^T|6®“6½Ò"ƒ7bßuÈ”7Zµšî®tùùÌé¬]ä skâýú#ûsæ‰ïcs&ø)‚ø.d3YCB~Ö‹ôQÛ3÷å±/ñÕàC'eHBzõ寢¶7|z »+ôlÏØ-¦Ñ3Ë›?ª°Å6½«—€l’ܮ凜£=}±•8ÇÁh¢ÖQöãõ×cä‘ÐôAqäÞ`ªë«äÏ!>~WÏØ³Ø¢ç<žañÈäËö«g©}^‡T ·äÙe ¤”q€”ñ=^²Êîoa‡%›DU×nX³?ƒ7×–bղ߈ÿ³ÑZÞÿ§»ù7ƒÞÿim/îibæèjõÔœÕõTqÍÐüSÁQ@ì´{òCdˆÉ„Š6`DzËš󉔨šüéŒB†ã÷¬ŠWÏbðk«xZfÆÄç…%êYUþ¢êŸÝ*åyxtBOnÀ4ZÌæ¾òŸzÍŒ~ž¼öþzGâLÖ…ÊGÃÅ¢ ˆ–%î &f€uçÅ‚1äúÝ "üÇìw%q² [8ó½¿N¸1E`:Ú~Mˆ‰uI0y“U¾¼,•‚Me #q¶–ŠCù}r¦~xÜ ½•tc\å_omÎYéxÒkUF³vhthþj½i†Y«‘"ž´…`Šò’5QÌÝØú9Ý%Mr6J–_n“t— m>›‹ò7)³‹ BÊftÕÙ¢ÒÊÇ"%ÔñC¦vKSû(!?ÀÂ;œ4•–¹a„bñ­F`Í…[£G½eI§;Tçµy½ÔY%‰$ù¯$"æ¥oÂzÄs¶"zÞ÷ô(‘š¬åùÃõ¦rØ”ôJ8”@só¶§§ÀàÂ_ÛM™½Htš“àr Ál¶¥¢Tڔ܈¸u›ÐâDVÀbuœÅß?‡MùY™FÜ5LÝr+RÖinʹ¤Ÿ>«äº¹Mí¤“TaÒY®ïÀÚ2IQ VãtuGPNô¦=|ðÛ~ˆ—s°Ë„F‰‘µÖÙº| ·ŽxÈÍð¤«ÔÖ P?{-¶ñ{º|Ï$ñ.ù˜‡×x/¢z87¸ÅNØ_pÎt-ÄXèyZ1ÁIî5çùØ ÐÙ2•¡9oßìEý:YËGÀ6çÒÍûÍýú9êú,»U–\aFÐi•–`~ï$Çš‰;æìñê5¿é—`¦—SêÏñ>Z¡¸|þŒ» ÁéªÕyè|]SP aÆŸ–!Î;”Hî_Ó±¸­û`v$º° <Ä=âÄ?kñ·…¼/há¾5õ‡”h7gÈ8ÊN˜ÃP_Ñn€·Ó8x5-æÍtQÁ"3Þ{c±!zj^G½¢/†‡WáºH”öl]íù1ôÒ#ÊtD.¹•¿.*ìÊÁ}߉ˆ@嬣’(]ÛõÙ£c{b¸î ^¶Ä} ½Ú°ø–kBk$›¿¡9è\ …9èš$»—Vd_ |ÚšÒ±Š ’¦öq*YCä’öÝtûéBq$ñ+Q›ïBñWjï¨‹Š“g+. ×™û9âžã/wNë4lõÖ}@Ì(Z‚Xd#`ÈÓÄ“áè” ( á5LQqé!ýtâ&m1ØUÇf(n¬Ϧ(.ÓG]¬ðf ˆJÉÎ0U‹ç¨-·‹]óTÁ)ïw'®¡¦#ÜYvök#”TyëÂâos¼…­1w±¶!qö^@‚¤{z¹1³@›[€+§ÚßäÞÚ€F™ö^«-SøSŽŠr‚õ^g+õüðX”Þ°Á·Äú›{…·‰jfú—ªHê‰ýž¶Ö6É»h±õfëwÛ X]Ò&\®–˜Ìg’ŸsñïÌâO±¡°¡÷{ã) b! €øVjÿåU«©ÓÙë¡Ò'‚Û7ª}â ÇÐÙÁëOÐ j›váý_Â|*v”`€X±€€¨þ¿ ™ö®Î.Žf&ÿqEþ_ðM+OµelDÖ¤ 8L(T <)"[âŒq2Cè°xx`øC;ïŒ-2LJV§ˆa " ÛK öp+t%°þ?Ë+7•-+Å-Í-~¹+¥“ˆ›¯Ù>,¸¹Ù>©·¾“Ÿv ]?CL¿ßß £êãfBU|8'Öíßu}磲üÚ† íS²Zß;¿n^öeý“÷ožLˆ!ŽŒãðn'»õ·®%‘xýÚ$ýoŸ÷¼Údn^€i+ R³ î…}Õ­t^¥! ÷/øŽF¾ë=ÁvﳸˆÂ$ïÒ·|¶âö7M˜ÃƒT6G—‰ÇoœÆÏ㳯}Çöë0%»ˆ•3å/GãÚýíÖ‰>‚ð“æ XS‹³[J*ÑåͲ¯•ƒž²—'ëÄõA•¶‰êé®ße1‰©<Ô`I¸`-HÍ7Ê¡ˆÏÐ.tXLÃööõ*he4¿pªÜ®£#¥V,v¤XÄ0óïl§³uw­·­Ôy£äÈ7g•›×fÂÊqsçüîŒö¨q£Úl0Ä—«©®Ht¦°n˧aÌÙîèòfB=84ÿ¦ÄY¬íÑ64­0¢Ý,y¥Ùƒ Fáâ_—ß 9Ÿ(à—xzX¾' µÒöæ“!„zSíÂkÖ^¯¥h,O‹…{×8ML•qÕÈ”ˆÞÓuäÙ˦àˆ$ñê°ÝÉW¶«.Ÿàqmz•ôY²’P/oÿ 7)1°]Û±05¬Ã<œRáD{l¨Ö®•d\íŒ))xÓ8¾!ÍòJˆ¢¹ Û/P`&®éŽPHj¡Œ¸×:îzöV¹=®()™ë'Q¸Èw#Oìö¦óS],ÔøkjÉ|³3sÎ,wY´wu«”îÄŒIä/–Ìtˆvÿ%¨Ö¬¥M$Ù¡JRðSz·˜”ÃÑÕdfîs&ìS ˆ]ŒjŠ—£<§€C& zªgÃYÚå©=èQ'3Èê™zMg¦¥ï«9ÈŒ·z‡—‹™žkànûÉêfo#«&^<“ø Ï(¥0wG¢‚5+Ê+Yq ¦9øzÇòH4« ¯ìjý&àÿg?ÌSf°ù­¨ïÈ79õ9«^ ˆ·‰ì(ؼ!ûË=V¢8é ß|‰U0Û=ŒK)ÀIvçXèé2aôÕ²ù¬2/°˜jfjÄT'>L5ñ}äÓÌ«›ÍÃËdivyªÖÞã2ê/ÞétÕìÃswQ‡µ’Ýõ.Þqøß²}!ßZ2Õ«æÝÕ„Æí±Àûµ‰ž”çAÑ“rÔl6,ǃßN%…ÐÛ«¶Í‡o«ê«ê ù¸nŽ­ŒÛÜÀg­äÍVÍ>¥Is¿²ðwÐýRd'ä·*f p¤Ã`i5½Q$;|æVŽ Z¹ˆjˆ¯eRððDÓjAªz¹r°È¨ý.ÐÀrÕaÑcUy VçýÈ:?]ê1Œ½&ÍQ4ÞÜÙµ S—SBï® Gíþ0¦Á´åÞ—— M¨¥“Õ)ÉŽÔñoN÷M$ÝÌqǪCl.Ri¬ƒ¬–£ð&ÿß“}»ˆê牤7™÷'²Dëu?ÂîeÛ Wœãe‘«¾ÝEa]Ûb¯,æ1iO’Ó"cµT*×ÍØt¬ˆý kåWáXHÔI”öëtV‘q·àæ¾ÕlÈz{ÛÂ÷uÂ1”>ǪïhàCŽZoÏŒxÀ³Pñ¿kÌ ÃþZ¯‡zȃ ¦åÖe˜¤U|#*ÌŽFEi憗͆%ëó²an#p=¹ùmDî“â±æW›Ýñj¬–„Ík?UÒgý­dMÍM³ä¤Åާ\@@¯U’¬‹~$B.F©þèt •‚åÕ#°tGƒ7¿zÊ3!¢¡ø² Ü¡h`°-on—=2 ¢÷"àìǨß֦̚Ä/5nÎ0Ðç¢LNg]1¹#rŽò[󨇬˜¿ rWŒFtöëfÑsq „¤%<ÜXÑÝ Îgĉ:ãùix(mКTWšÈ÷€³ñ£Ã}{l/½læ O#Æ÷ ýµÉÏÊdÌó®:Ì4Æ"äZ¢ƒ«#… ~1kéæ%…öp~‘˜>/tÑ2üߣÝyIŽÞ(ëA†é`n Câij «R †öÀ„¥UŠsi«}³é‰µ)Î#Ëh¾™‚¢Qî†&¶Ðî(ŸÉÅê-C%¢€æd¨ó¥†l@GÈ[tþŽo ·w¯¢5g¯Ó…M³û­f£I^ã+n,Ü®â -S3Ë^5¢&C¸ƒÆÔÚ¾ñAwáKй„²•¹`ïJ“2ãžùÈ-}ÓÆÇ ‡ÜÀu“=§Ë‚¶eå,FNçÜïNfÄ×¹Ý×ùØÏ JÄ… ¿¦c#ï/ä“]ࡵ–päù ¤pVíƒÃèß2¹’MÞcƒâto .umq”'íëÉäÎPÏ6¤/­ô¶˜$­â¨ˆùFp~šJ*ûD~œb“óaVëÈÚr°¹æG‚IÅ×ímºêJÜQN#/S›²1£wà¤Ü5MÇóó/”8‘´‡òåjæÑ³3j]ľ½.<Çz…2UVdžͦŽ\ºCkŸÒ­…Æ“!VÚÕaæ! çU´Î<Ø|R—>ªþ\±’¸¯pn×tÄVr“\vm6Ï¡>oE§”§ø0qã9CòÆ2)¬w †{:‹í25ƒå]Ùwé›v…"ì,Þó4{&%îÔÔ¢v¶¦ÌL/Q°§-kœ¼Ã”JޝsH~¢Û¦¨|"Ù\ªÓÌ–²˜š¹-\·mÔŸY‰Û4Ðeæ9ÌÚF™ÏȘÍÍ<hôÜ»µ W;“ß07ž57ž9/=¬®? _ó–>ù­¿né:+XÝ«•Ùá­S[läGjÞ«ˆZôWl¨Äÿ¾9ˆ5/zH8{»nßwõà_NÒ702J¿ó˜mnÕi#îÛj„ºÆÕ0®¤çÉqšGýL\^\—d÷›(óš:u9’ñ•!éËa L!sIF‡0Œ†=¶Q‰Ê€ÕɃ±êµ„®u^ÍÈ‘o•Ót+±®;Œ–e\µ2°7v^¹J4m›ÖÙŸxž}æ%œ;l%ÉJ'WŽ]×¥r.öã%‰YËõŸ5¬n¹AÅ…ÒÝ„òs eúP8 `zžµ—9i]‡ÔÔ„Ói ÙØ@‡äè0sÓƒšV"6ª(°Ü3÷:ª(Ö€ËIAU ³¢áU u¦iÀU$…QÑl…ìVþHÖ¼v‘ÿgé‹öo8AbF®f¢F&–ÿ›^¬iãúòõö¬.ÎY£ñÒRY™ Y%ôé"R0~"%)%Mdçd.”˜Ò2¦²Ð$kŃ¢ ©tñÔŒ ¤ˆ ½®zÍE&æðrbøã÷"¾B‡lôçÆÇJù à ;îJrö¨z8±tÕh„Ií?g"ðÞÖ–z\rä"õÞlj9· ýRl¦Vc p _°IÙ DØKù-žc[Á÷¿_¶*–IpÌ\u Üv®|áO"‡ÄÇfÔÓ¢k&:% =ìiuºêë+rõ{­UÕÈŸàB)üLäÙMèÚ’Ṳ̈5¼¦º>ºêðœÜ$¥\G6"–gBt¼ Ýß}xQ‚Æõ]ÌÄ.:¸tz¸@1ó§…8 z‚ÿÉ„ÈM§*ã[CR Ü5²#Wœ3”¿Š{, i‡If"rƒKãü,u&Å»}<¾[}à ºŒö¶ÌLDw¢··’þÑ«p]±œÁ]V{”m!nüÒà¿ÐZÇ”Yï0üg<§Çƒ¿ú6ÛÆû–צ°+]±±ð쇔Íâ…æL $è:>ÓjdýŽ©#Už$ê6ðpuŸÓñjt…:\“ ž¼ž«B„5œu0•ØËI—Ru_2G«8gHšœPí`vö]{«ži˜“‘è´Ö›››6¢ùQ ֱÙô•î––eî¸?pU ª¥ þ¯H{m°—Þ-éÝt´»åð“WÉ©Yû:´.·5ß?»Ø4Ô ¾u0svL–½ªú &WjÊl&u¿?¾|ƒ¤V!kq:‰t•YwÒ.,ÆÊsÐ𰘧DŽº¥*.ÓüÚ¸³êseLÿ¶:H-›T‚­Ñs0«lV%ëS]âËQL·-ØÇ‰"G`Ó¾—ƒ%÷“òSîB¨ðZ뎀XQ°×4K¾Dâ0¶¬^^»…uïÆ¥­J|fË¿Œ…ª›¤Ñ[lV$äTÆ[.ì פ&Õ:=#ˆâŠ Á*£•ìó½†CÃ]1vL2çˆþ“>¼Qwx¸ùS$KŒJZ­_yZQ”ýŸÄZ¢CÖ(6éZŸß´+Šó”ýi$Aê彌LhfaÌÇ€)x¼ Ú¤ÇESþÈä·Q-t€Æ1°î”¸S¬ÿ=•Âìül]™Aš:žø²ysÕÑ”`Øðd½JŒû 2^œ kŽÒ;,wŽÖv^åš¿Îù«Å[—Æê!ÆSóZÀedÞ ¾óÈ¥‡È'Ò©•ŠƒïÒƒš¦’•zóÊ×5*Žô,‡ ˦”l½_·$óuQ‘wÊž†ý&3p,%쨨™øƒÄ¦Ï J|‰wŽ£Œï²•œC5ÁˆIƒ³#»IõT…^Öb™ƒé•uVö¨e=½ô!iñÎtá›ecåÄrüÈ”¼:Ã.6ËGÎ UsŠÊÏ”<¤Ò…GIf¶.çØÆíÓt$Gûß›…TË$†A¡¤ÑÚ4ï×üpžGñÒ‰ãÕŲݣףþo s=uªõ6ó¸½&Ð+à€j2&‚L2Zܶ˜šóØ0'ûQ¹­~Ücïí®»—˜ÍÑÉg÷mÿРÏ[“kÿ“o`f¾pÜ;$ûá«âh§àİwÆIæÈC®ÈÓ{(ÁŒØ}vg2p#m¾A)HlOHú›á”lô…¦ÙkÓâf–Cú˜u½iv±Ü¬Äæ76 žký±ÌKÓ‹ô[ƒÖˉ(L@LNIÍŒþNíBâ×ÑU¢ÿ3䢎Œ^õb(ó1Ö‰ûŽó-4¹5ZB£úI¬•{b–Fθ›Ð_ä{¢Ö. º5úIäî;õB)3øì1W¬•'†Å÷Ô¬–Ppµg–Æ=oÐÔËÐ$åÎÄ›hଞ˜WPãµe³q~5Ï»wC·M3!ÊÊ/ØE.ÚÖ€ô¢—Z“B닲Ëë_Q¼`ß™ÎÙø:Ú’¯Ý¼aÊä…§9éå\aóhGXn+ÑÙæí_ê3l3üT9>j¬¸£ìóx:G$«ªûí¸² è í•Ç *¼’s^Q2ÂI7¶*aj£‘›*R ^}È0IµðÊÝÌ^õ`?2jQ*«U~Œo"¯¯H:õ\ÿ3ÄœœJ”]S„E÷§!¢i<°b_ÓÛw ou¿€eï%WvóÖÐퟔûÞžì¦çõ²þýDÔî¬UZ­Õ¢Usßi„Ÿ²SêÏëzªºÚÉÞ²!~Wa¯ÇZý̲â+䪔ÒXÕÀ¥ŠóÆJ®Á[2Ï‘‡á³¹ÃÍz»_U^n0Ç\êRËÖÅøF¡ÅD|è±^Wå‹ÄŠÃàhD‹‘œ®,Ñì-ÓPò¹ˆ Ä9À2ìJ‘!O¿ÜL ·- N/ìÆ©ÅíF‚;·2º'†ä½8ÒŽìs3<§×§‰IKK†ß1“S|•ÿ^ œ›Å¾BÉþ9)š¹‹(ÁÊç€ßÐM¶GõͱÎÓ«i¼k£ø†¡ôFê<ôÑ{AÞ¼ö.ªbëu¬ò­¥DîõÁ´¹Sñ„U¹Sñû#E'êï'Ú·v… ǺÕë÷„ÿ³5ÚâÂòûçݿєŒœ]Ý\Ý\U]ÍŒìþ«,mÖØuAUGûæÎb³µÊZxЉ‘óo"‘§æˆO\0À¨±k(ÂåXo[…*¸Šv`9¬dì‚‘:?ƒCxÛûµ'XèïÁ)­ÚÀÓÕÓ}ºå3Û}š}ë{ZÒûóþh$yOþWÊÕáÉŠ1XÚ‹;­$Ä]Ü’UxÊXAî4äYR`ÄIÓI^.mè.Kþ€µ(䥽MÚûwtº¨RHÃotÁ&¢"F†Þý°Ia~¤.¢þF´4$¹ÒÙ¸i…HE‘Õ%_gf~Ö´\:…ì4$™“”,9ÍÈöµ*3ëá­ðà\ó¨X#oscnbâ:[µHÀp•ÌYUå}Eqê¹­m ¹pÇÈx™ÆRUcÝUÛ\´V…q Æv™Œ‘©¥p ÃÖXm9úòdÊ@ƒõ õdÍ KdÏŸôÌôU ¿•H Îý"£cðÁ¦Ôë*c+oÛŠ‚ÿEÙ;Gy²tYÃU]¶mÛ6ºlÛ¶Ý¥.üʶ»lÛ¶mÛ¶Þ{gžyqgæ[ó­•¹ÎÊüç2Î>±·vúMçh hµ¢!çç0bFØb¤Vk¾ÆS>e.]>Ž)÷@ÔAÛ© Íž´Ž÷\•'J©o4úÍ·<#ºnp×â­¯²yeŠYlV)bI§q¨^Mú ‚,J_8ÀOTµ®LÒÛK—V³y6R¯>Y<÷…ÎNšýà0ÅÜ—yìæÌÖð¾›ÔEbÓàÜ,»BdM— €Ò,,olL‚Ï™túv–1†w®EH־̻Kñ•w*¾ ƒF@êâr¢‘åÞñxô;3íùâÆsçã 6tq·sX§ß«°ØïsЇesh ­Ø2Jk¬š§`*ÖÖ‡—繑ïFS"0â=ÌÁk–Øw‹;”Êto»s_ˆ™Ù;È/†*Âò¬ûãT)ž—û…±‚¿vûƒçg{&®ÞІöª'þ`oª:@g—kÇc¤ø@· ÈGue«#B¬ÈT~Œýï{#¦]ì !žüN€l_Œ $ù7ø?Øé£¼¶ €€~âü7ìôªJ’ÿç]’ŒKâ߸qy¸c¨öUK~úM£¬OYÞ×ô0š‡3Æòr)9upn>¯C)M‚ʆëÛ&)I«ÒE-weO[Ö—Çë%g¥cq®p4½@«ƒ¥ueú6¬T ½N’ûAä`ˆ8Œ2š*•÷Ï^Ã’©ÿŠuþWOÛJeƒ©ñZAb‰-H«ñYiCLK4-R\Zà¤ùÏà#'©iÌ`(Ÿ ã;û;ÍC°(•å6u$Õ¶ÌIŒNZºáÁ3*GUlP¦GFÚº[ƒÉ·Â+Z‹„È` €Š ¹O±*®aƒ¸è±X»Â÷Ó‡Ôu¸-x#öë„öWqQ–%ÌEZSÔÂó èj F‡7ÎbF¨X¹ÍBFVWbÖ&în„Jü–-dÑ(f¼{@Û§ëß5ÝÄÅw´ S9›z; p°ð.9ž¿/dOÃ*Ú®Róym Z› eˆÈäºç‘]6LÆ5ÍÆÓìÆ5MÆ©b<¼âjëpXˆ¹ÒÐUG±Ì÷‰¹ô"°ÑFGëJ*B·W#¤%¸¸qUN§F‡Ûã4­äøñ·ÃfԽêGÞi>ª¯èΛˆž´Ö,™è…МñK¡i‡©§*£,Ñò§7HùZàþÄaÈDþÍùo€ãðÇSss¬Ý 应_ Æ7býâêFé%ò×7N†#¶vãóØiŠŽ˜8Ú!—Dµ0[²R±í‚Ä$×è¹/ß±Â×|Wpú)âdÏcKïÓU•Û½1Å&cõ6°ò;ÞÎø:ĵ‰iÎßßvð˜Þu¡®†ÏDî“ïj‰®YØ)‡-y‘3ùÞ¸òR4ì0V÷j׿1,Á%žâ6ƒæê.é0L#„Nð0ý8Ì-¨›Â4ž‡Ôs2DVûŽf–G(¾¨/ïXªG&Ó3èü3‘Ø;|ÑGë•ÓÊ`êjàâIAçó\×»ÂÓ>ð”d%ʼÑcßW8ÐTãU#Y'Š˜Ï|.æ!s¬rªÁURsIuY üR'aJ7 Ãbym3®¦t˜J·Ø,µ<¯¸w×þqäË‹sÛž8»áÛÌP ãüI_/7©?øÊ“®jûˆ²­ºs2x#ÜžOÖ:­iN­}Ô`_}逵YBÇkzˆ‰þžõ‹éR¬‚Úå%«š°áKIžÃIŠe.ÁSõ Êø(:×ÉÛC"Áµ¾ÔD(ÔæãêþÍ M•è‚2¹ð¸Æ…*ùª—V8…dÛàtŽv1ü‡x Bþ/—~‘æ¨_/p¾Å¹’­núÅeœŽ¡r`øR ]bôuiü¾Þ)»ä{py÷ÚAþ3‹Ã'éû.SiziZÅ©Ðöùi§‹áùp×Êk!‰ÏPd¾‚¯©SohÙÃʼnwÖNßtÑñ×LE[’80cJåÝJÕßyf9ŽOÎJ~ýß»0ŽÈÈ*-6ùb1(‚ÖiX¸†oòÅM(·ðbû`xôôWÍK­£ŽyzÅ@ìëØ–ÚøØÞ;!òF)Ëê’íþ›qt0ê“;rÓ3 öA9¶§ÐYÃCKŒµ33Õ»th4yOßùŠ} qØî&‹m½½3F,VMn‹Ô@Jb6ú狞gc‘Üm¼ÛöÑê¦þI‰—‰pþîò¦þÑ"ð~ÃÈÓÚ}á¸Ï׶Ȱ½Ôß,?zÉx·$ðÙcÄ»µxSIÒJ»¤‚8â_²vÀ±~³ÅG`¾k›¢*m4ËýÑ ð^ƒ÷xЊ$Þ£/tŸ£ä@²ÖÍ´],â`sR™‹QItÎ+õ²5Y·eÉP]›À¸[o‘ŒVmêæq¸7K˜¨QÊýSì?v õ—!ú'ïì@iWöjH,ËÒIˤÄ:†7|ÕæQ)\4KSܦ’^%B Õ ùÞŽH5BD®ß“_1:þ ~…9þËÚÊp¤ˆ¼(ÅôQþ=^ˆa¨ÎիꦂØÏM´ß„YL‚èC)H‘lß”š>Å’2ö”2‹29qLÕeL†ûЪ"V3T+½×}DÇeÄ›—í%™vÀW32°.H~̪£w…—ŠmMi¾ÊD¦ÑT›–d’ÿ™öéŒÖ÷¹íæºWc4Ita–¢ŠU-©¥%·quN˜ƒ0QèÚýRh©ÇÌH,tÁn/(Žëör$®šˆÐeüêg®7žê]"DØa !Õú,ùvOgÊ󸲇‚ÛíÞZTVD{JV†î\pþ^ÝôÉÚÉó®Üøý^bŠI^-éà]¸Uõ¬§l²DµŠtë˜á*¥8)•ø¡›§òUbóák—M Š“‚ÜÝ9½@üöèúÅk؇èVÊô!È«°/¹þØôáõ]nQ7cÝ! i6Êáòîk“þ—Áá·]Eœ¶âkB­Ü—ÍÀaµXýGÈ,}ÞǾÐkŸ‡Fkvì7“Û¸ú§;ÊýÊÔî>“Ú õ:ÈÐ'­ ê,3{ýž:Û|¿WWíüˆIp™]•. £9•š€Žâ·Â¦–7ÚŠƒæ5«·ºçØÃd_xöòçÅ×u©¤[ú½{é§´¨·H€†¼sâéÜ—Hì`±Ü—·ÏÏGC¥R–HÎÆ:¥[=Ã[³ØõiˆÛ)ùû£d ÛS1½X#7ㆤ4°³ÏCJi„†™@ê:r„K>Lp¼ y\—ŸER\ƒâÌo%ûòaW\ Ø$-û 2‹˜a)R³1l2Q{_Ëh ¬£1­VÔŠÍAîfK{Vy$d6 ù¾i>b5޲ÃBj8Êk&sÑ>^~Á·*#¾ò…ºO§I'˜…ûzý*­àzƒ¹³¦yƒ¹ø]”y'þ^ǵc{ »q„Oùƒc”ðXžioècW4âÄä*‘¾%†Ìq‘þƒ¥I÷:¼×‡ü|9aŽÔkÑÉí"£ˆ‚܈zOˆÚˆzKŒÿ³ÜÂûÚ­Q7Ñð¹Bf„Œ1¿·œœŒE5¶%ýæâ[qiâ´¯AÙÞˆ—AYÀ©¿kåXÇ'GÔÚfOMf_f^?¥/Zkȃ³óR“»ÛÕ‡ßÿ Î[g;¯ qþWà\ÉÞÆÆÞÍÔIÌÒÆôÿN•’þý@ÅÐÙú_°]eÜn^‘o?ˆ“É.¾ˆuW‘0Ì2Sem¥ÀÿR’Å\9޳ª Ï]>µþ@²Â@ÂN>¢s–ŠM¸Šý‘«ùTfÚùù¶Ÿï×FÁmA¤g)Ú+ÊÝß¿Ññ©o%†AÀ\]\\ ‚_òqß@­qƒBžh!÷K_l(jÏW¯LÃD›¾Ì=è!O'xÀ¦^:¬*/»ïéñüÔ=ö%' ÍevóyeO“5åDRŽ!itܼ ªºKéíȧ¤ †<y6å|A•ä_íò~_₼Ÿ›®«ÄDzÖ$ðCîsùÕð¼7w¿÷‡‡ô¬ ˜´ˆµá9¥a"´1+#Ã|BæVÊBbÿJYSÎOc¬5êëQ5]tåeª-%æ«@\¢OÝ Šâ6¤y÷¾»ãQV¯ÈSœBfI›ßíPZÁ½}úM%;QßÏJ¦ÁÆo3Dγ—@6Q¿70‘„«µ“#e!!í”–Ô&Ô¼ñÜš¶µ²5hu3Ú5§a—zë‚lixBºÏ-‰M•FeÔäKVcSâEŠ)Š dŒT}B‡¥ÈÏP/Ž4ÚQê8í¾7{²d9Îw½ÃáAWHm»róïsùÙÿ×wwÿ7Ub8  7¬ÿFªõ¿óý_SJÆ[E=í;gbjC‡ðÚÅ_Pê'³àÑ?¿Õ„…Ç zIÁ@,:ÒZ¡š³Ä3ÅaTÛ¯Þš´—6éÚÜt#´’–˜sŤmé.Ú®ªªß|Ü7+¯/¿ºQ$2_ÆÈù¾N¹ON=ûf¾·vûÞᨈˆÃðÓï˜=Ÿ{å Þü¹Èœ‹Ž4(ã-Ø7}1ªö–.¾­°p£ïÇêû’û‹ƒxÈÌLísOíeúû-ÞØ{ˉ×K¿^ÿàgØ`ý(®ø.Ü…áî e8Õc°~ VõÞòV^¾qޱ~Tl/8bu‘í8o£ßàÈþ¾žû‰¾¸=_‹$oõÒUùòÛŸú%ΟÀú% sÖòCì†Eó[»çÒCiX7o÷˜Ûm‡Šè;^ã.èK}©ìC©â#É =`òŨå´;%äf¡îK±?Çåb0Åõk:tÿ‹xÝ/)™ÒªS‘ X•TXï–-L*§è#}õH¼$Í& M>"¦Üà~¾Ùx&ü=‘k~’Z ^ËVÇìÅ„é¥ÇqIVÍܺãÐöËÎŽ‡~Žp–4"G‚rÉjCV&ñ`Þ– s[ª¯9(^4ý»,H郊9qÒ”\ª¸îP?˜ã§Ûö˜i±³¦SÝ„Èz¦’‰&ÿh3Ïä \ëé— ·¡Zr{]ýRœÍqhVj´¶Ù’ÓöÝòñÈGò $‹P–7|UÍŠ©Q1·(oŒåþÑCCR$U ôâ¾%õÚ(ÿ=åf1ô×¥ÛÜ”^áÌJ×ÌÛ;jGg)&VMÂR¶ŽQŸTL: q™!ÛþûDÝt°¬ýSìÔ.Œ;Œ+ìÄzî57rcQ=;_ÕŒŠP!H^‚ßTÑ‘*Ѭ4œ:)4¤´àPË›…) u O]nÃ"UæÈb¨Z.0**0'4ŽZ0j/ Ú;k`KÊ;N +ðª åŠ »/÷{Âèܘé*RÊ[Ž•@¦e—o Õî'Ë~h¨6œ³ÀJɸ§½•4ޤ"Q“é®Cüµùð0`“l(FDs4¹!« e6¢°ÇðÊ5h„:kZFž Òr#§ð„Dœ¶Qhq»°àŸ• þA£yÔNe ƒ£ÿÞ›=Nát ëê@ãD³WIÁ6*‹ KaÈš=&ÁŸ>[’4Ú`{r¦¤±ýõcN‹S ï4ݼVQㄤT‡ÛªuÊÚ³ªÿ|äÛßÛb«Ôaöf¦§g¦K·ÿ3î·î~»Ø/â_Cï^Cb¬hŒ* §€²![pæQe@.zéàÝp5‰‚ô˜çÃcäö56þV¡šøk>f„eÙBc™œá©s3‰¡´HŪ§ûÓƒÞ¯Í-âý«Í0rff£ž¡G@™:\º« Š› ‹²A•¯lÚmöƒ ½!Yý ZOd©=ë¾[…k•2fh a°%H5¨³Õ$˜øPhž…i¾ 2µH£Åz9{×M½¯ž•t[ㄸjD_Ý1•æÏJšC…ò\zµrX×0+–+×Òß ñ€6Øæºhé÷ÖܵA{kP—’šÜ¥2FeßhRf•½º£;æ•´ú}&º'¦üäÇôQêõ3T1šñâ¤BKÑúÒ‡Y5jÅsÐ sÅlý2ÀjåF$i*#àL ¶QQ×®DöL4À=¿ ÓªÜb¹A0v –\ÿ÷:ÜbeÁË2ŽU{[<•–•Mi ›kÒoZˆG£Æ~>«â\/Õœ‘-ÓßÕöô¯žwÇ?¦»¸Î† ý%©§…–HûzÉy“¥ôøó ©# o‹jF âBÛ&A*¾Mú-²3ô)¸û6Ë£½9¥c/×WBèFu»¦9+)®ôQ-(÷²ÅE•.O%}KÐkj©rI^–lßUÎ(»˜•T4Í ²ªߥ»­Ø.™í8íLû2Ù «]þÚ+àâ­mÁýK®Š­g¢•NÃ)š£Ò¿DÄ ÿð ˜û¦Ö¦Fb>KÒ"ù),yFBƒTó£ðÙ :9–‡$<„¢á¸ m¤;ÙeÁ¿ÞZ‹f¤ß—ÃÚ%kR[Þ‹5-£.ƒ“m˜¥Û&º­¦uµî¹‰±Ûü.IÛ¸†tM²ó…i‚¾4ÖÆúœx4ùèxX\]<#×›–M+IÏŠÔçìI¦€³´†ÉôÖ‘ßšÒ>È£Û±Û^n•Jl¯è¥M“Ý«l¤ÒèÏ~,!mÑ|%Ä[Go{™NEšÉ¤:{p\ʔ΢∧yn*”:HbO’!¿ñà7oÂ`Tóoµ8·ZÚè+ßz峘ϯNøjëÏVBPoe¡²kx­öªLd7Бט ÒÂø©@EG¼î>1ûŠƒ¿ò ÍJ^ÜÖ[Ç{ ½½LçïàÞMyý4¥² í¯‹P¤¦;wœ×tOO‘î®Ò>´%V½ tüÐt”äxdý`ýKÔSL1[1–be{ïšòÞ{´Ú™LÝ2QgRÞAÂôŒh› ÓuÑuÈ’öìÉuÂèV#^Ï š¨»£¬²wÆís3Õ?ZäN9 ʘ щJÑ÷eËÀÝK´pÕ][ä÷»x&| z'a¯ð4záSF8£Í6FåÌk†£¸ª[ß¹¿0u×&|) oÿD™“ÒêE®{HµM™¹å¶{ôMÛ%ýj-f’Ì»BçY'úêDø&͊ʲ¯‚¹™¯a¤ýÕ2 #ÀÌ2B(~8ó¦AÅ9 Rø÷p² i§J×d'ÁV`¤¦ôÝc(FÖ•*J'ÞâÅo?…Î÷Žwÿ@æs ••b-Þëý†…¥G€U3êÆÂÔrtàÆÏÄÃä]„Ñ+jæeñõ÷òÀJëa¯³Å ÅWB¸Dݶ7&Š]ï7xÀôP%‡òMK´f½L¶3uþºúåÑ!ˆ´•òŒ’Ió ZùAr§O’Ô¡íëÿQE:އ›%³?dQô³®¸+ Ì„ì5´¾Ïs˜é7SX'ò  —×:kËî—PíV—ôÁ!|'òáÒ/šfe–±¤³ :Çênêä?S!z|*pÕbBIŒ2%fu7z‚"˜¬àõrsáõó>U/«ÄÏ…Vè¡Õ»AZ®ÎfµwŪ1¥” Ãxn”à{Ã2=Ó£ðÂú5p.'vÊþ¹ñíÇFùŽ[Ã~Šæ»´ìÔÌ„+ùÁI/îßÀD«‹f²¸¹ƒ!˜1ûKÿ8ÀeË‚h^ð—µõW¡ø´ä¿rtÁÿ·vÕ8õßÒU¢½Á-7 –°d²¤QÿGºÊðÚ˜öo:fRØH"òñ_®J¶4•óØ ÔùmèB©¶‘ M•2­ê_6ò°(}smñK¯Â­ “ƒØ¦¼ßŸUÌ? G§@G-´‘ç¦FÉP㳿Iúˆ-þV¯býñïêUN¸äð ŠÜoÿSýl:eØü›ñ?sìüŽþ»›•êÖΨªØ¾^v|H bBàB dL¡ŠôBìÀ"¤˜‡Ä+£ †ÂæäS2y"H j•íªÚÉ4Ö£v¹¦]‰ÉØcòT ‡ãÒaZ_?üüo=åݹûMJ@#œ§Ö‹·ï»¦ïõ¦N_/žÈX÷ƒ‰Oþ:›†1vXø±ý:ë$ýzXO£5ú€\ÄÊ@fÞŠþP¤§qÁ,ü‡³‘ ÅÀ*B™4‚¸\†ÐŸB&¢…ýÜŒUýþ6ã`q)ž ÃùÜÐØˆÖâÆÓ‚ÝÆ)Ñ'óæMÌ­}í2㔦÷­{¹7B㞢éS¾Æ+u‘:úó|Ÿfö–ù€ž"zíµŠ^íí™ÊÞåìéT쪋‰£ ¼Ÿ |f†Í³Æiu\ÛÖ›bD4ÓSyÕ.”ÒýåÜ÷Á]E¿½sŒq-Ï&`œÍª²§“`±©g¦HVÙ'5+Nß^Ÿ*Ó·(W’ÛÙjo²°“Q'~Ôhîò1²¦2I‘:ºn´èìI©—ÆN>RÅþÊÉhf¾ ©S ì^ÎΆ‰WfYL̪{ ˜.ÚQ}àÖôàžU˜ºí…¤OÅÌ4âYItM HfÏ©/Z"¯Ð*sºáï&Òbð\ú*LÃ"¦ë[\Är'Y)Ë€y¶¼è‚/¥jU;7 ? òi9}5’„÷;µ¶çÁ(Lw«>r—7²“ì´Î8ÂÛ)ÏfeKæ#óP )ÝÆƒ ã®âØàÝóI»Çjàmm¤nyÃùœHp0¶4xò"·¤ÑV-mñ^ëˆýôxèn̓ùÐÃ&éŽQû¼Ü{bqãÓ;«”ÙýŽp¥Òaqß7¿ô. ÷ûRöƃ¡žqË´Žö9’@®ª[n*Í™€¤k볉çÚкÁJ³i…í¦LÜ],׫y÷L\Vg,WÊéÊC.i¹hµõ\ýRÚÃK28éócj¥þ$o4GÊó²ü{=¿»žÌf錤ï£×êJ˜µÖ\œòCÄßø§êRHc6úÑPü›}i<a,3[¹;BñÆ©,%;ój$¢TV4DQbSå3Ax ë;ªmê¤È×½ ¸!Ï>Ôp›2 “c3ÌÚ«L¤J,Ks ÔÄ­%’úh Ís&ã¼äËŠãì¯ÄÞ"¬䵤IøßÝ¡¤ñ¥ZÛX s:ÒÅfKsuEÓmÚEì_ÁWk5¨—‘ÇjCöNSìgmv„Üheàb£ùëTžI ø8"þ¶.þY‡ÎþÎ4¿+üÍü?(e5cÕ9Ÿ¨U:÷n!¿C6E¸ç'ç,ï µ­g^æï®@˜­×Ât-‚mŸØ»ö6s äèÏ®\Ì0ZH 1‘‘_cö%A{·ÐZ!-;¸âöâ­ä5D¾ r*¡7²¯g±3nËZâþ‚˜C! vÌ9ýå†þIÊíM'ÞÈÅ6‹lÂä‚\>Ïäsyð`Ï\h”ÛyvªOe©»•¼sòÐ\»%b ¤ËÚ&V¼]¦­tèf/³J>’Ø'“]ä'9B¢ÌÆý)kk€L§·ªŒ“Ê\°¢=+u”õXPWLšÔ»ßÆÎýùh3âôoí/ÐcÄmH–=dÅ;-}é‘Íq3ñq2$à€ø}€ñÑ}©' Åà¼Ü]zKÐåõavÝ“&àú&¡« Y\àÑæ”4c19”#NÙŽ¸xCD®5,Ó‰Æb¬”8Ëgß—œ³ñÁý ¥RìôK’ÕC;%‚5ú„ŠÒò•³ê3­ Áܱb˜/róuuE·üìΈgß#î^1‹|ìU>ÛJg~‘j—lž-<ÌÀÖ%u~P$ÁbÒ5H|lHU=ú|YG¤qEèÑùÉ)Ùwi1¤%ÎZQg·¥w0Îɱÿõ“ÇNß ö°*E,oH:ŸyMÙ)¦Ñ(mykº°T5åMjhT®Û†gØã±Ã&¾¥Ò%l²ý§öÓwðlÔ«-vcW½†¾ïÝ‹cò0\dÝ—DL}¨w.š#˜ #¼´L„}šg—U¹ä¾Qù(¯‹žNêêäñ)§óA¥ãHqI%2'à Æýs‚ý$ ã<$où ØÛ˜çìH?âý{“qS#Ö%êNh /èœÞ2Ïq}Òû•ó¾¼Ýý l™FhÅXµ+t™k¤NEUT˜·—‹Z/Î%ÐIî Ç#Äj°Ó²¡D+‹$ sf*€oý¢Ô.xiµ$åG3ƒ»9£W‘­A[ÀÙÀB¾“Ÿ%' ªùû ŠFÝá!³¾Â¼vZàey4ØÃÛj®hGžt8%¾¾Ë¦Q¶½A7¿ Kwë Ñ/É?ºwŜی—¯süÇÍO{ã… ¬ÚÊÉDCŠG•¥XM-K¾öŠõ¢†q¹êz;tP¯üäNôÕŠÂk‘¹%³­1,. æljΦl·¼#gc#Š,6ÔäZäh;ž½¥)–$שQ–ÍI4ÁsU„\,IF¬­ŸM¶«ž0g=´´¶‡Nfv²ª"ž Ábõäe+m,5þêHÁÕXEßzÆÊ MWBCÛUKãµÄÅ&ürs…#$a†¾æÑnLAðÞ¨}Ã-ˆÂ)¨)…-ÔƒlT^-ô1à0… í¾/Šý ˆÙ{4¿“©a:ŸÉq3JV˜ë±úÉk§U§t‰¼£ì 4àv±Ru¡-Ù ‰`SìÕDïÍ~_}¯ˆþž:‹« EwYÒŠ¡«ÓÉ`RÒ^Øä›ÍwÄósÂ÷ឯEQ~ÀwNZÅäAöƒôêØ®•¢ÿ]Ï7 rd{Î΃ÈÏ÷|Ðfk;¾ÜûЙòr`ýÂ9ý3ÿˆóæ–m<ìÏužwêIÁæaÃl×E]õL×Y@®Ï¤©û>—„Îòì°PÁE~ÒïÆ‘:+µ’ˆ› ëðŸè Sô¥¯QÔÂPÉ÷æ‚jÂ7©0¥.«$j¢=Da…:÷#÷iìõÊÓ8ç öö›/Tž‹¾>ü®—È5UŸ}lá§/Z<ÑdãÄÇûMõM…ÈwôB—pÖÂÖòÍ#ÞÅhÈ®hÆyŸ=b<*¨ÿ7:iiíëzËfGLò' ÌC÷{Ûv/ýGmWào÷_ö#uù+ð¤d7ÜãDºÆ¡0‡TSˆ.åµÞ¦¹ÂôãþϨM[’{¼ k šŽ>è_XL¡ë"x¤ŽËL㪑åœb5¡ÔìŽ0èüýðC¨öº™Á†NœòžýyZ›á´ª»N }‡QÌ)<ôô>Õˆ‰oÇÈI]ÈI•“¶áRÓßB¦4ㆠRÒ¿~£JýR\þ‘ÀÓ1Ö¡°&{È'&{³Aš_¤ñÅš³æ#).’E¬¨uÿ1Š}le-AAê¤1$Í[¥À¥’Ë|•çtŒ™`Û¢ëý¼hdÁÇ“7Í >ôYj½¡=ÞÇ'Ò®*f­`A‘ËëœËª¢0T–Ÿ™¡ˆv(犺-I‰£ªÈ_ý'Ri¼ómÎF¢V‡ð-¶}Q¹”‹ ­ØŠúYeáóŸŒq mÉ‚Ãuàÿ¯ˆÿ_2Ó˜N¹¿°ay?™û°îöú¼”° –„ãEÅ á(9:×ì .±îƒPuFíðÙ˜pÇSe †@âÿY`E¶2Vóª1\‘Z¹­ÿEY9œ÷^ï¥&ÿÄᓜ´·Ÿ} °\áêÝ [À;ð_«$}ׯf‘éäááýSü‹ SØtBj@bßòçÒ«lsÈÍø-.¢Ð9£,ßfv¸93÷96Æ^[Pcûœf‚åLØpS<:ƒLD½hÖ‡aó3Zayã 7Ñùè&Ê[¨­F‘§'$vZ\K&± Ä6Ýð^ß¶±é<”O ‘|Ã^÷Ïòeluƒ€ÙÅL Ô#6öÌÉ $œ±‡RÈ-Áà0«7nÎÌdæÝž2vSÄcñm"`>ï—Öˆù&\Ê)QÎ0«·¢LWƒõ töã^9öÔŽ5v=¸ù-Ô%fÊ G°7Ì´§£^ÿ½‡P³£P„‘ÒöìEKP ¤õ—_tÇK6àz›~Ÿ N ‘ÐmW<¨QôX‰Ê‡1û¬v¿‰ß]¡?¦6P¡»ÅšLÕÁ¼™(ðš"[â$Mfòhh(8…ù9‚!½}ï­fpðß©Ša±³^˜êç¥4ŽÚZÍ0hÅÏo1±³Fˆ,#Ó˜$wu^óú—&ÁÑÆ6÷’ìšuhAmP »ÚV‹[‹&†™Aãk~g³Z-ìftì Ù ¶`ÏÓØ‹I|:±Õ6ÈÄŸñ«ë …¦Šžkbe¹â)¤É“ë;í˜ògSŸ£lÔ•µ‡¨zç{|C‘‘-´9ÝÊ ¬ÓQÊ„dPã û€ÑgÑ›+êXT6¥i¡¥¨qäU-ŽK=ckf%*¬±‰,Ñmtå;ï#…æö=ŠÃÇý?fG†tWÜ`hòS9@­Ã»9¡8}YsŠãÀÊK?'ö¶î0‹’Ž¤ÛŠ9‰.ú¸™8úù,¯î;)ÅŠ1¾†gRRJ-W‡PŒ5†·±ˆ?àú ²/bð¯Eƒ'>:а´=ü )¿ ¬„wËÿÌŒ+µA«¸¢])x@K“ï"]e‰Œ¢5)[z1ð}Bó¿‘ÊÒë£uFÁ=ÀkiV3qѬ¥&tp;}épìˆaõ# Ëö¹Gƒ÷5×ôÝb^åi`…ñt#}¢J½·ëMJ®y6Ôuá2L×ÊÖf*Ämw}ý`EÒUÖXÂhår<¦EIt·³KŸJS9R\5òį8ÃVCtºØM(«ÞÍ^Ýì}ضýu-Úr7”k­Q؃À¼ˆpŸýŽË^5~º•œí>©l>•¯tબñnqpD©ƒ4ïXAûg£xÉ%ô*†>l–6 þ0À­P˜«Y# ÙEs´¡5µÒ?”}–£Ge“šŠÕtÅ‹ó¨@±“¦èšÙïô@¤—r²æ 1%Œýí¶„Ü9Eò“4§Á¦+«w»ÜíxxxÞæÒ Ÿ~¡ˆã[J_¨æÛtAv\Å1˜‰šuíxÄká®Vë X‘'å…í¦îr£ FZ•£lQ¯Bí½뉤ž³·Ú¥HÕƒ>Ñ^aks§AñÈw ê>&ÑöÏ÷?²ŠXÚ±ÖÅ8 ÿ9ýß-¡2öÆÿÚB¥$+ß'ˆè,\©tûŽƒF’< ¼·fl$,Bâ´Ý^(+eý`îÉHŠÿüE¹o³kÂËjk¶e³ÑµºùoA‡+®¥BMRqM%Q Ú/ê'¬ºÝ™´DkX :L cHÛ/³à~Á›®GÄ0‰GÇëw»@Дèã uØ$)âAÍ!Ë7Ÿ^ ®ì–ˆ¡&Hî 7Ë•»_—w=qÞŠqÉ”³ÍæàŸK÷"3.¯&Ä‹2wóu‰ì*¸Œþ¹YyCÙ Ö²î~Ka´À§q!ù N§ÆîÄ{$¿]n§‘óᤒ‚½X7®ÓXÀ…aëކí/R/"<+bwØÓpÜsN`²6a¬6¥ Æea*¯Î˱EQtÍOÁ±LâO|gtJ³°À—¾¶ à×£ækÙ‹“ŒEª•ï³¹H&åa‹¤ŽÌJC¾§$Å?:¤Ò‰)Tý#Ÿÿ…ÌçÀï.ý˺ü«Ðü»íïN•†þ«ÏDÊÙ°£€7[0*NBÓ‹ˆ20J¦{cšÄCêMCÜ(ì•ð¨»Ín¢ªtß»A =ì¾CBöβ²ïºæ¦2ò³n8xÑ»ØGj%ÞCõ'É%–BgÙ¶NÉž ¦âd„Õ׺ÒVç}© Øû¡# BrhÕëRkªê ‰Ù—)(™a¤d.0Êà–_7díd†D¿ã·]=m‚Óÿ´ç8ëüÇ@Í*Z'L€Ò$¢úŸyü”‡Ê²ëWŒ™gþlB,8舆°–4ÉoÒ'UžAdL$Ñ!£O‰˜H³‰ÐÁ謵0I¼æ0G+”a)\(ÆZIY”fÉôÂòyÖM%÷Ñ9v¹968¾ã.{±| ÷ï¶qÏgÚgãì_W˾gç@Z¥õ˜º/,–_:éͯU¬~D“ϯҖ] “ú’÷ËsQ¬~4“Û’÷ –_ü¡v•»%=Ї9¼=#'9…¯¹0&{ˆãS?⿸Ùn©{{æOËØŒæBOñôœ¤ã—`Öïª]©›œQ o´¿}¿€’~†àC?¶êÐrP3Bh%$O“ƒÇÞ·ðÚ`oá;ë0JÄhjxFA2ìS¡ ÓòRÖÐǼ–Œ1 ¸Iê\§²Xò‚Y›8Fñt©¨#p |Á{Qe4m¡e¨þ Ýé%…F«ÍÅJ±V­ŠY8ìE$Áž=G’V:tÉÂHÔÞõ4Loí.ž¸ÐK<9ì8Êù·wÙ«’Àóq1Xá’{…‰.ô0¶ç‚3o ¢™µÿÅØ;ùýl‚}·mÛ¶mÛ¶mÛ¶ýkÛv÷mÛ¶m»{ÿ³õÎnÍ;S[[•/9u>¥êäÉ“œ$84fiϾ4¶#YÞ1O÷YŠOhfß,K«åÑ@¦T<Íã–xï=LÌ(:5¼Äj¦a¼"Y/ùyÌb01E‰G$ˆfÌ^y&ö6ñ¬¥;Èn±8L`¢.ŒLS[ò52q³­uf÷нÃ<ÓyŠpCÇà̶¬ã0t)5Bz2§§b¸™k~-H0ÙSx†Ãõ¶ø³X%™}sÏåcÅâFÜIii¯»YŘíJ7=èŸa?×À7‘…XÅ^ׯ·¨ÏÆZ‘‚×z%R:dŸJÃeÕ͉8—x’$JÁ‰F³i²ìÕ#4Í"Ò1Áì}ÃÏ NìˆX×KŸö õz²õ±0Ì뎕ëŽùõ­XÌÏ•œ73Oe×åV”Cí68v P¤#þcÔoÌ#Lb89%27S‚í9§ºÊ¸ªV‰9¤V€K€{DžòîÚ¡ Þ^5œ)y®þ…ŒÊæã-c5+ïû l‰NDSé°À?Û¶¢,÷1ôLœäølQzÙQü«ñq=ªÅ’‰‰!;ˆqpþ Ê)åži= vâ:¡èš%‡¦Û3:áUûV».$Sï Q·þk& ‡Ö޶l^sñ÷Ic˜C?Oz›îÃ’äÓÆ¯ @=ëþŽ#ANƒ¤¿`&%¤;Yz"L¢T¹ò@Þ1ÁYx ·j]ã"åfæãÔ†! ÃêN¦ÑMo{¬ ôb¶E€Iuä«\ØzêAes'G„t©Xk3ð¼æÖžÀõ`¢é²ó6¡²%ÈLú–pw†àvès.ÒxªB;»ßq ¤‹v_’† ²æ^öǼ|r/ü`çy‡½ýUwȨöÌ'µW9ƒüQ*Ý ‘e²üK<ÃrCôŽ;ügÂcss΂güÌsj.élK帇).éÙï¦ê+=»7*©tDr)þªŽVuÂkVð/#`&)“õi¼¹ !VÈçs’–ð æ…ºóŒïkàÒ7Ó’¡sCÿœͧîÁ“ê}Žâ0m]ù¸ê)š‚P½áUZÄC¡µ¸)é"Gù4…sg–Åöe=Ø-“ß:F'ù†X¸ß7‘oÈæ;¼<1±uÒ"ô©µLnOÌîµ(^•¿XÓ'‚êmÂ?ã/Mö›Ë}ÁÚ x~zð]\Å'Ë8€gàÞÿ—/DÔØ#à²üžˆ/ ý^°; þÛÃ~Ñ¿_þNñ Ÿ˜¯„€O®éczÜ’OòÙ#Gí’΃OÔÖCJtÊvn-ŒÖƒ42žôÚ÷›Ç+úðåOé;©ÓýP¸&}ß`Eª+ÿÐgU¾Y+õDƒ„Íø Û–#8*b/{ç*@M%×1à¾Jtö'Hêçº542ùô„¹/eðÊ9ƒÿ`B'sö«’úQ\7óû}JßÑô'ƒº‰<ï}³vª/P\7ú7côKWý$ž;K}cJð4á¤êW0.$ŸxŸQ}sò!Óÿªò‡]7óÙçÄ]'Ó2u={öKZýDžã¼qZ.ýçxfw]…ê}Ÿ˜–\ö#—å|”üšåå5›Pžc ۣŧªy|ë4ßst:¤r Qeâe×ET*‡Qò‘Zcìjg†½:G—ªI’·ïCŽø´T@ý0µtòËr]òÌyÎçOÍ¡º¿[š&«N¸•YXÍí2« 8m€Ø2EÖTY¨zQ Ý?§ÊIFËPÛÉŸW&Sì_þHù®~^jü²0ïsþaLá=ßmWçGÓ#Í*ó× ·mû®ÉÊ©ô–TSÛlÁæÖjs\Ío˜¾j­±;:þÈ 0§,ù¢'$µ§05ÀhådáPž*’Q¾€nQ—¢h—‚p—s ­Ë¤öd1®1]ÓÙ8¾¤ÚªŸ2%Bè×¹u`3¯TÉ~{eàÒÉÞ¸•Ž}ém¹-›„£3»–¦‡¦¹ôíVýbƒ{Õ߆ìÖíáÀú<|mŠ mK„6e–ÑÞ¸oï;ÌM?¿Y^G©@“?øÆ{âf@?ž½O"+í]È“¦± ÕÄÌc9“ѳÜegž›‘Þ Òg𩨼ò›õµŠõzZt¯+²wß~—ží†Aò}õ‘ýªAæÆ#ïÀ·à‘#u?,Ö«Ht¯Ä"·£ÏO@v…àï ¾@Ùg„#÷ƒkãß×OÆfq)è)%š*Ì£Wîí¼É €¿í§Öôˆí‰±ñ€]Ì_êQ{"úž6#HB<2ºÅV™B߯‹x’¿A—=²ê•ÝéôUÈ”ò³¨ØÐØ~`ݺVⳜÐr†‰º@Ü$µ¾Â›'ÀoÀv3Å$©Ñv–*^>±ê•>8¶|S#XtÁ%vʾð}ô7' NAð–€<³º·¹Ë“çüÑýò|dt«'˸‘²úÀW¨›×ßÍsÍ«Òų‚SGr_¸ïî•|fz§‚G$¹9MYúÃǧ(!Î) 5c¾t)}ƒßIëREÃõ[‚ß èó\÷tšÕ8ìƒ=!]zîý:Áâs";ê\YÍ+Œ,pv¥áÕ+¸Ë†È\Ùä3•ñήy¾ø¬KÏæ¤G0¹™ºÂ:Ã?¾›g¬q«œ~tÜ÷Ê3oZ¤l~Ý9‚z ¶}©Þœ>:öm§øyuÌs» …V5¢3÷÷ sÎ/=/«e¢ÇdꥥoJ<ô@™ÁthŠËÌýPÓu2¤¡‰ÜOè;¬j‰íÌ}' ujýÔKÒ%³Ø¹î˜Ä‡®:nŒùÅ —}Wv ¡ªõ ~«¨î¦3Xwk9–cRùZî‚z1]µ=5šÖ–Ï^bòëÚ¹Ú0z£Øuk PìDU4ï?ß@Щ›ªß²¨ 7Sú§æË.fú†Y¿sªÍk¹ïÙµS‹xÄ7S»âRac†t^ '·{ñ8mï*QóЯòSC7'­N›ø]áQðü‘—(wy÷„Ö‚7ß#iWTúÒû–ñæ~ÿ[™‡ás¦èü?šÄ âÿ3³ýïœV6~Zn!Ä\z#È6„œ£ f&G0J¥ÜNΨ$.—Ž¿n$üL˜°õë•¡øY3–}/Î>ËÍ£¡ÎYi¡>òÌɤT¯”a1í°¯uÍTL§rá„¥ôZ6=b|Ú»ö"?×Ö(ç®Keßñ:•&‹. ‰,fa pfv¾£öâwK_ûÜѹ,†XÚw’ë|â´ìpãC©—Ÿù…Pà,ŠO4õÑYU­äI óDÑ"è¹»"ˆÚ5B lp Cla€k4Äc†Õ—yE|žÌÏ;„Øõ…¸"ãÿßr¼cWA @@ àÿ{AìZÊÒÖÔÞÕ…äÿmóŽU•µÇVEáÕ?ŒLæ ¥%¬ÁuÈ2!’!e!U‚úÓFƒÖ’maÄÏ©Læv„©~ók0O±='JR­B )¥{G®Ñ_h:v°Ã¾Øp)$D´û¹“ë}Ã{ÛÍýïïÿÉ jSÌm³#E}ŒR³cæ9 •=i³#iŒzkåAË’æé,:ø‰µzÀ »~j¤öÙÐ;o1¶’eÜQëVJ5­ÖÓ¼kãÙµ’›Ô¶š¤VÓlz;i¶IÍdJÓ|dxwÊÁóW,bHN–k÷Ï}ƒ€V¿ÎìÿV£³A›I,`»xhÒmðE ¬°ÉysȱF3xµ‹°®íÕÝÔzrÕ"©Š¥*­É¶Åf¼?£Í|ñ©ó©Õ ·‰UVáN*7 ´A¶;n;кö©–š5ª‰Oñ!Å‚2aŽQ±Kõ\aÎm5/74kÁ’©µKs;¹¥u‘–Çr£R­ämò¸Q XùF³Ñ)ýW”mA³x"{Ú­Šªn£:ïˆf«ÑN›kÆXl”…̵{àFîÒ™k$a‘qêEoá.0ÎUuŒ¹úH#ÖËrÐÑdÛ‰w2ù2·’çîÊLx4ü-bAŽ€œaúéü†V““ü{)ùx2™_€Ú{e~.£ÇÇ×Ã$a ¦ülzî*=.ô xRðÃ)KåGöHеùTBâæ–1ÀÀª 3kŽn7Ä`ï’p)À]„˜©prl”‡¸cVz Ýà/Yè#’Wܦ *¨£ÐƒÅJ˜ž=a؆&U¹kãsàíC º\¢ò û7õŽáùøG©‚¾wˆ#ýpA܃ø¶ÌëØÔ¯¬ÐÎð·øÏ‡t Öë$XÍÁR¹„Ñ<ÆC˜ìµRr¥Õ!*Ò•‡tÐS1£º$©º|1d/¢yÈ¿öˆ|‚ 4F ¢w5f„ý{¸ 7KtÒ_̼gÆ™¬ ÓuÇ#j‹ŠL÷Äw¸slñ1¡ÕµŒ©¹+ªÖ Ÿ=Ø<¶ºä¡&ñ{žm<,e#g¢h0Ƙh#Pj£”^oç7‘Cí%h¾’º:3KÒúÎÙŠ.V¡c‰“/Ë_07øüÝò¯=ùD¢“"o =füi~’; ÁYþ> ‹#\Q¡—œ¡Ðœj¤Q^Øâ~wF|¸lÈ ÚïÇ»!2ó/—M]øÞ±R“TKלÑ+B4œãG¥É tÁßÒÅS ö%p>És½=9&Ø€ûEç­É?ˆèÀw¤'㥌^®/æüûEËV’Û¦ öå_ìç\üÃA½ZjŒAKüÿ«Ó˜¶ºEÿú „÷¿oxø_Æù 5[gäUL^ëºæ¤nH˜H Õ¿2ÆÍj6ù’ØÂ9ÆÀq´Iû´¤ZZ4Å®jÔõIÍG%×.I’L& 2Éò¸~Ê‚p°¹sý‹ÅÉn\ßßKyŠ^€e¯ÌpÌ›ïÛG§™ŽYçãºß×wt —=uE—Ãrãµ8eÆœ‘h,?aˆ2“O™”ªt“Ô´åI¦ '.Úª˜êF¬jˆ™†`˜0ÏuòÑSSŠ1sF—Õß²a&ÛpÚªu½ÄõÄþ…•=*…²©O°y¥q'1(³›TÔÅá(ëiJ |~s=†Oh3ËÒßµ'NêÃuYsê¸ó“ë$`ÓÆÒÏ .óLM°ÍQ[óÒ> î›fÍkwg8÷ϲÑÉÚvÞ¤8Âð‡’nîâü÷WG1Œ†¦´ ×Ã÷¤ÔJ”2Zó‰:¤Ý™ŒÐÃÒät{eWgÏ -·<™† wR·qÔ‡Š–i›‚pÇIíGùk\äð1¦M†YåVžCz-Þ‹ÊìY…a4öÑnXË2§8_Eäx³ééÜhàÐÕÔÄÉ̜Ԉ2À«êcˆSÏåFKk ¸îqèC’°f•“>‹q“Ú¾AÇûƒ…ãJ×’<µG@ É¿”ÜÆ“³¢·Î£¢ZÞs®÷…˜ ¸mØ«‹®â.]Î*‚Þ‹ö$zÚp4Fæä†‰c@TçM¸_ß–ðäÖ¿ÆY¾{Ìö>ù&¦XÙ TrcÜ™èÞNûrŒ‹³~:Ü‘ð@>XT\ô;ŒÄš‚ʸm‰³ö^®^êçÍÔåxÆêCò·Š¸²¹2ãd"‚âùdâ¢YY\Þ´‹•;fܺV\pG‰ÑÙù²Ct¤³¤\{  T^×c¡ÑlèòdáÆ¯’ Úª`õú½ÀÞVMÚ.5Åþ0™aÇê$uäw!Á š$·ô ¯¨OmÓUš:ýÅe\•ŽÂ5ˆ ƒÙ§øÍj¢çÂóúL¤jë Ë[ ÒðËjùdý©‚§jc]™>ñ‡øÚmŒÝÊÙ“«jU¢häjoƒŽ¹äi½\Õëw6÷GþüB]«¤*4Jû›gó4œÓg…b5N²wÖXµÚÀ¹…ìVˆ–°ôšPŸpû_ÚÄrAÉ­½Â°1Wú‰"œ6‚©yƒVñ¹‘·lL{êÃë#K~ù'/˜;th½Þ?¾ôw-Ž×š¤Ù·¨A•C>ÏW–£íÉœOŒ_o½éç5?=Íë"4Bÿ ñYYl>4£Ï“ו-žE>ÔÜíçŒpÈ.ÕJd-Váä?#½Å; $¸€{!4yÐþiü{Óvö¦¹µ¼I¢?€þR­ÒGe&yò&¢oÈÐ)¿¼©@R¦(À–¬\@DãÊ¢TT““•B1º'cf­AÙ¯+ˆ­n:¿`øo¦ÔN ~hyس6ŒcT¸-YßÈÙéüŒ0¾Êæêèröƒÿëâ¥ÈŽ`<Ã)¢ŒÇ#Ê}o„+_4am³‰±R°¥–yä/ÍûìžäCŒ³Üé¹éâlÉ)u3Ý¢Ušj¼gPõÌÀ„%UQîAVÎ#ëØ‡ÕÈRþÓ Çdª³Q~^‹Å˜W}ί®¹N©r«xØ’5†AwPƒ¶"Ö<=;Â'Ò•‰´V€­ÞQÒð¦E”Þt;?J¬9Œ­(U k›ÕÉt›ìõBɾ°¹àC×eDØÅ|GİÞýøÞõŽaÕänØ}w})Ò•Êï ZX‘$ʺçŠÍÑ+8¾; ö•¥ÖgøÙ7æ޳cšÝ;ÚèWMg ƒo€„`ú…†éBä'¾Î¿BxfìS-Öy++ÝËÕÈ%3_ò’ùqÎó}dåæYã­Úöôë›mi‚œÉ€öÉC…ÕZ §»¶?íJu ò(SÛ™JÁÇú°PŸwX’Ï))#Ù™OX£•/¨ð™ÖŠæ÷²ü®Îm¾9ŠÞÆ4ñ‹vH-ó?¸i ‹áŠ1ÜÔ'K4kÖ±ÇcB«“B¦kË¢5À½ŠÓûÁÐJIè´d*ÇŠv|fS¶.æ ÐîQJ?Á|91wTco€ô/]>uFó‡¬ô@<߈ìô“Ž}}„© Ž–h‡Þ×ì1Ùß ë]ÿlÊyàÝ€Þ ô°à³mp/<úŸŠ(ÉÜþ´Å£c`«|‚²]ö]bñM¹a›® 9pöëÜÜ-ë˜ØþĪé+Þõ5õ‘ø+Lø']öyDþ¾p¸(ƒu$ öõ+ó…C•:ÀL|@äEŸöMwu=bßÞÀ“Âä’¿/ÐpR69ÙÚšúöbG=©ì!~ÍWp#~þÛ@ú¦*˜Òÿ ç, ëÿ9…ì]íLþ?ÿWåª{Ûh£þæ^.É]Y>%.aÊê‡u¬ÒÉAûN•ÐÚÒöCÒRÒBÆ8ë/hçx7]^¶¯»»ÀÿEúRl®±lƒ¢D %ÛbÅŽ¨ –L~E€€,íY/µÍb+nt®Í]ÓOZøžyŸùž¹ýšyͽÕyß E×®‡‹g7dmG…-¼†0"wÓìjˆlÉéÒ´Á‡' ’X¡V‡h# vâ5êP Û&¼TkÞ49K5´Gh3γø4m㻿‚?ÛBýGÜŽ >äß¾K ýô7H#ÛD–.ÀèoÁþ?Bï€zo þê2èNÖŒÞÍþ5¡».ði£î`×·¿‹Â­‡pgÄ–¯ùÆgïOr]&DZ_zö­›­ÐŽ=–™7lYC[:+WÆH]W<Ζ3YióÊXX 9=Bõ Ö§O|ÛŒ¦z¬l”B [Ô -‹0æê‚ôh°~mvr ‡¬ f½®q!¿«r’H|öľrãŒû%ÇžÙäi¾!º_ Ÿ¨®?¹iÖr–k¬ì¸Ó˜ƒµ–ÚSÅŒöhá®ìî sYoõýz]GG1Ù²ëIiÒzÄvT|Q!Q¬kùT:¸ÿz¨þ:*„F SÝ #Р²…©êWñ‰‹"Ú‘¢†;Š +ÆÜqêH ¿5GÍî5ýñ‘ñP>ݯ|ƃً¦ê WñÁUñuè WõuÐ^½‡úý O_vìÎq9È£;€©7Ò‚{ ¹cù´j?ìšô¯ô—8PO"„žiÉ€}ê2Û:{ØÑ¬Q’Ìu•[É%–pµ#é#­k‡©sZH°çVC}Úù±û ÉØeΡë¹(×ó¤U=š5zâ™!?{zÙ5ü–ÇÔO ¦Í3º[)$Þþæzáuè.°Uuì!F=Ú\JMêÔ½¡¨ÞÓ†FßÁ2YÕë8oºªöÉhiÆÆõkˆúNØ $jZ U-Ç’Fê –’šZwó j‘õÎåÁõ0¸4ÁÖê“_(˹ÿžgrÊ_!ÍùèáQýÿ¾ÿB;MH•eÔŸ[2{&OÂqÁVa ²¡Yà12Ðd ²(PÇŒ©nxrfG4‰f­­Î65Ûš5)ê…R-QI Ëá$­Ýêm›–š«Ë…µ.ë’Ó-ÏG3&Ï7°ãÉž[€÷ìKžó,ïãûQ"žÜÝü®›!ˆ†#!>yæC.Î^ î×3üîñ¾#˜|ûÞIðîá»$yïì#<ÊWÂ)~ÇŠßÕТϹÌ;¥ÿ÷”èàìã=4Ïà =ê×D(OvüéÌí÷Fä.Ã¥½ç§'Û¾»Œ_à‘?zÚᫌ—b¿´\÷•ïÏÞ~®‡hA²žó¾@ßÝQ®QØßÖfTÿî/¼¿ê{Ú¼=å[ò¯é¯‰õϰyžûÁ®Í½ƃ>ÞŽÚ]\Ð/¥‡ú¿J$È–WV[¨ð–³‹~´E#`·†þulZòÚ9!®ÉÝTHZÁ.9}ža… Cë쑊Þí h)m¢.ÙyÏÞÞr¼È‹û?IKåáÏoNNÝ'H¦®$å 4¼Õ-d^Ü-]}Ì$Ó _Ò_й«çñnç%wªO$š»zÙ‘bÝ?À/’ÿ.×E‘ Òf¨L$çò®œÆƒ{ÎTÎÜ]ŠpL!¥¯(€:ŠÄI_M¹¤Hób¶åä&Ê*Q£¢„ÙÑÒ% ë”ñP89ÿ•m¶ÃÄ­ "ç!ZÅdT¶Ø¦*RÓÒ5FeGÇeïZŒ–5ãQ!²;Yk=Wwôy^Ã"æ—2Â#&f/uÝà<”xØø XA_%6„s‰.[»ZÆÅYÛRIB벬³;ðU7 Bé¤v‚5Ì+´31kÚ™íLÈØ¦WT{ш1AÆNÅkîÊ”Õ"Å4ÏsèÒéöS¾$B$ò͵£±ÒÛ‹ +~ÝK¤H´’ ;+g¼Fö¶£±uᬸ•UŽr]ÚøâCV Àæä61›b}[Cîãy'0<ƒkѰ5æ—zù¨'0­ì&œ&·¤G&mU”’NЇÍÉ(›jK¦ì3È÷pËr⊅¯ ×bDocLÆe"5=ÄÊÙJ0gmÇÜOŒî1#·Æ=þFØ$äØ&аäëæ;ÓæpœÌq^±æj=‹¶ä=è «¹”¯ÅÉRm86DM¾MÆË¡þÑ)6_¤ëGCÍö\µ£BZÏ?PâkˆÕ æ±X åûŒª“:+ ПͶ9Ì¢?µ阌ñìbTVMy„·?|˜ùC‰¯st\=îù”†åeî‚’ã ã/pÒç];^7ˆù[sÏUC¨  £,Ìàu#Üàñ†0=œ¨Îbxt¿´ˆ””W,Óû€a†ªŸägä¨(〵u[ÙòPPfÓj÷¡¶(§5\ÁQ"«r‘ž*¶ÊpTeÁ m@¸×ÜñÄ€RÛ²%¦wÄz>º>™c©¤˜0 Ì QŽK<”¼C¤kÇc¦†–¼g°| ºäÅ‘‚ÓY ‰õ£œ€–~7ÜI/u3x”a;L\±eˆo];3˜#Þ g”!ïu°þ6ü‚ôc]ûï~ëMnÆ¿Œ£NsÏx#6Å” ãòVÃÉœDÁö4Ž“·œz|i””ÄÔ"WI@µ‰Î Ÿª)XÔ¹"»2eãŸÑŒÉI„%Jžœ¡Ý©Ý¡B^œ`Œ†Kçú9<»ÂzÌXzö„ž¸‚ø¾ž©$ŒáŠ uF!‰3!‰ÔGXÆ8ù‚N,`s‚‹S:žåü oLÈoº¥õ^ÂÁ$(¦ÌúéýW ™îÚLèfÌþ I»Ië€iŸpÒÇÒ&Úìw<é“*‡0çaÍ)pÚL~+=†®)I5þÂ~S©ö‘…—›ä´‹:ÖLî3–²1OÅ,y'¬É«q86¸™ÎA/¨R“H\ÊBšFyïxEÛ£‘"aÉR¼’S+ýæXml÷ŒÉ SLN¦- ùúŠÁ5g1L@).ýH*Ns¬/˜k>é¥S&—W=ù× 2ד³y.(²j°n,±é½ vëó4›P­¨¢rlžçBË”doNÝ!§Å¨Bú¹7¢ÌG$Âg¦Ì7(«;ªÔžU&™,û ïõÈÆ¤;’¢¤rO¶°YnWÏs¡‹¤%vÈ¡¶âêÈqå“çÙáð3Ó=  ü†$ÕÚKÛ¤çKß” èÉŒ–êÍHð–›•F>»±ÊIñ»Ç © ×œŠì ug~¨¸"¿ª®}ˆ€éK3û°‹ehQJ²h&…6€šš%UU±R’Ê ¥2f*÷‰˜·ÒúQÅgÂ,Ô58L裔í9z(œÜ¤¡Í—Ä»PŽW"þóËœÄNä8Ö%àæ ª/3NrÚÚ dš—ü­}'ÅP*FÖ›z³"É¥|Yf v^‹Ñé0ð%ñøÀ^·¥Í¬?WŽ4ùr†ûËá‡é|è°„á|è‹§žÂOd¬Xûô2À>EÁe;ÚlО&ëXíÃZ2È— ÚÕ£<ó!¦BÕÈ´²6,5z‚±ë× +,µU/œX·ëô\–'r|VÉi ˜¢ýßí4© LoKr­+¸ÂEÿôÚÏ3óéŒÞÔ`^¼ëPk¨õyQÓ6ÈÁ) ¢ý€ìv³;D¼\xkáçb¯&IåŽNu…rµ1$—ó&“Š“´£„¤Kœ´„Ué 4žvEhNTDm‡Ñkò—ßoQ9Ég-Nšè›è›PøÇEy ÈM"@ТÔ¢è+v6H¼!F›"|\U‘µ(Œ[4HíºW#º…ø¯Qš°)Ë€ÛÒ}¦m/NïÁ"KfE~ø ÎÝ;CGÏh~á£Ù@®Ë7.jxƒXk` ÿô¤yÕt²H¡†Ä~cukÃë†ûŽ"¬fOV×a‹)oç$‚ÇhŒAMëržÙ'ç0S5·£E­9â’.>}ÀjÐÛ‰4µKvž†GUЊQ‹ewÙŠy›’gô™´7Ä™ñçï8оèv¦2ôM£dù}¿QuÅ¢3JùæÕŒI"v™óÌV¸/9{€!=¦Sgæ®G±>l6LM¼eÜ–g¦c ÜË]çϬoÜ™¨*&]=\ZY$æ·ï@¾U¿qõ2äæ³ÞÿHÿ:”½'”œ0Ú–²>{Œ™´fNü82â$Dv “eÔlñ¹p¹Qq›|ÀM>Š;¨,h›þ@yõIÍßÿ·)êiv_'ÿÑÒÿáü7ŽccoN/conþ?§Èø&ôØ 0 „ΖÞ©çã~ÀHª2©mP"¨‚³ë°S´ ø²þŎW]–C R ÷Hœ5÷ûʼnk‡g„p?3Í®h{мgA§E¡‡øŽ­O÷D =`—é±àZñÕœI5q¶f"%÷OÒìD“ÖNôõ=½Œ[…/zý¹/D¹êP ICa›W‚ö¨<dKòµ2Vþv¢Õôô²˜}^¡–Nƒ*‹ ×ð(§CüûË?G€`uW…ÙnH„si3O³&ô9ô°ÅÙ4ÕÕîú—Ý·muîì¿5ßÖ\² ýB€ÿßWÀýû(Û˜±XýÇHÿµ^M[EågC×-Ì5dšT‘ØEÁ(ˆ ©¨0‘&¡ÞCÐ;ÍPS×mêjôõ“—ñÄy¼JÉsNd>*Uå!EêGRïYé½ÓÜÍÀUõÞðÓ%Ïù#çöé?'¿_§eú@6m\ Š,ÆDQ4œ2bŠ¡1q…‡åa:(‹c“ýi#Æ\p2ÁE¨v¤ÄSg)íaÈJ€¥ù e.8©÷vÀÜ}qŠü¹„Ø= 1Ú¼¨|ÈÙé¥; ½P#µ»xß¶NäžJ/¹^oõ> ô£4¬ ”h|Ÿ×ûCô`œøÄ±‰Ùü„9—ruü„Ùšæ²éluªësz+f¸å´§«ÍÞÅÃDF˯ØÝD^*ÿä®û{ðP¼ºyò[‹ß²,, ë$ךIÜû4ÿXnÙe‘¼ú>3æa±û¼< ÀìÛÓ™Ç\vÎaÀåa‚´ÐìiŽf´—3úèJfÄIª BAÄ«ñ½ºK–`i¡SŸ`Ë\¾>í„ÍvZ&^{¦|Š}Ó’¹m×¥ÑéšzðF¥•à~S®ÔyÃmËñQ…|ѵÔ)YW<©•§Ôâw¼Ùujú¡ÔJ-¯X†£Ú @¹6´ßÍ)ë,*8‚Òn ÐÖŸ¡A1Aœ`£TÈlØ*Ö· å"¬ùÏ›à‹ÆŠ¤fÑ5©?7±{" z>Œ•ã|ôä¡ú‡ä^ÙÜÈÙ$ ÚZ_UÕOx’8”ŸPƒbAïn ·E­µ0ÜÂKxL[sì¡­[¿µÐ¼Ÿ&ŒTe†ŠDñp™)c1å°´vW{ñÑlhÃebD” ‡/ V€Ù öã´a¾c“Ãö75Zv­ ®Ü×¹Ý÷ ÌFÏr˶\u“»ßI! ƒ‡ñ‰ˆ‡ñ‰aþË—ˆX‰Ît޶¢[ø€e³§ìc¶点S›ä"˜c“øÂ}ìŽÓ*5 åÚãR$=xúwæĽhô_zã•l{.Ontëb«sZ&ûªÇ¬sXbfwvnkДÔy:'èEk‹íA/£D8Ø …µñŽvÓâ¨ÓJsª{ ä97‰‚:€óн.Îß‹•tˆR¯±²Pxü(5z›9×zë?ï#çÍr%Ýôå`¨!©Wƒ ²“†÷ƒ¦ª®¤³,•‚Ä${9F´Vvc&ÁKõ(xŸ·˜{b³BþòïòÃzýMÌôqôºh%èuÌßz‡@k²gey4bB¶Ãìã¬Ü¸sãuìØ?Äj¢9½^«ö^  ¿ ãm€«7Çý!»±Ö>»m¥ƒ¬a9Ç]l|ºwë`’Û×3¾í£q3½›(å¯ñƒçž·z6%XIZDô¤†“ çÍF è òØß§Í³°Ü³¢­aýŒ,)Ôê]h²ŸÒž 'ó&!#R3D€¨(´m}û\Wøõö>uÄŒÑù­V¼N #œ*`À9ù‚T¬…wOíSÕ¸K¥ld€5¢d„êˆ#:›ŽPÎ{Úõj²¤§pHïRó¢ƒS$ZkÙ¹å€Ë«¸Ç&'µ¹šÊZ³‡ÑOšƒAaW®ºÒȸ€jEGè P×Âó+Õ‡/\¾¿6¡,_OnÛì–Ÿv¤1‰VKΚ%­kÓ,‰Å#å3ý¢ozùk°ù+±×€µ)Jî¡÷T °3.6û¸Á1Ýýº™Xï‰òAœîÁHEÙnoB ^"—ÙGBƒA*PHñŠUf!§{ȧ/dDöó«ÿ†ÒB:]†Ëíˆ^?¬ì]íðKöñʦ«šŠÝÂî ‘'G3‰{¯ Høuüòi«b%ž\0Ÿ÷â{3IùôÔ‡æ58>ªmëK§0I›á!¢Ù@ósâ;mmú3~Žñ¯‚ä_þ°È§³Û!– Qù~:î;¢]¥““ãG6ÕðKÿÅ¿ÖM—ÅX  -$ Ìÿs|ð_ÿeÔ-µ±OQyƒA‰ Ñn‡ÖlØô²ÖÖdcŽC2†ÅR@mÒa4  a1a£“Éär‹57F4³†íÒØ¤·ÉäŒ † Vá,µÊdû\?çØ|tòy?Q­§¸±Ãá½V¹O·¼o>w0}ïw¡ÓÿØ  ò·ÊŒ4øíòã°!6|•[Ä}6 Æ¿•“ÝÝ›Ž"3Rîiù¡Ȧòÿò\ŸžaâPÑvÑ’o#æÝCûù®’“ =ÅXf£OÀ^ -ôÖv“ïñëöT1ëÆ9ŽGe1÷›Ïúè³V}=„Ÿì¡î’™vöÁù¾æÂÛ|=ÄGºøºOã¿8‚ñ?ï ŸzcàIÞ¼½“µ&– !‡Áµÿ.!¶ð?.Fs“¼Yîš)!Ë—†dI9òó»ø+[ø›;{cÃnÙY,$S*ËféZi$°ïn¯ì nfò^lonœjB†Ú^çöL×|j Õ´ÎÌááó5ûÈœ1FÇÙôôgÍ—•AÁ\td‡ð‘z-äbç4D°™½”(F̽ˆÏ=Òº(²Ò¦ÐÇ.&†‰g¼« Zï+'*‡gb­|…²¤ÀõÍû â£æhÚqšü{'7uêt24'ÃûQí×]«›_a-™më°ÞG‡vRF]Û½ »·m IΑû=yÒ%+Aš®cnñâÈ‹ˆ¶ÿ°UÑ© %»œ OE(›Øôýk)¼"÷¬Îœ£.ˆ{ƒ>Aƒ&¯gò×—ávÙ¶Q •¥ž¢ïöB©ŸA«^YO-âñæÍáh4 èœx“é§¿§VÛ¨U½yaHݤ—QlåqFõàv–IÛ…¯É˜y‚; ¶‚¢*³ÅoS¥£0¶s76¬xdôÂ.j_˜&÷vÐ-n¤š[®šÕˆeÓ¾M‡8Öf„'QÖ6YhÖ\µï<ÁUå Äd[›—F•8(-³ÏáÖµûP7\n¹qx7ò.Ô!*ÒRköuç\¬E<©΢ n©UµL4î%žÜ %ÜÜ1¿PŸíz„Â94Å4a+ßðÆ_€yÌÙ¬ÓÕB¶·;BŸ`ó {oÒqŽS‹Ìžñ#uËGDrsÊ 6šqç<9Îñ_fìK~ìÂyÜ1lNÐô­ö«ÛnÂj¤/ ½$ßôÍYnJ_;ý;+ŒÕF µv¢jaZU ;æöò~P¹ÿ «·"i©ÏèD¶—æ¾ êT—qò¤œ oŒË½Kó@ž8y«ž6-pÿàmë }šWTŠöIW˜ÿɵ C®àåôŒ’ŸÌ®t}n¾±yý…fŠRu¬=ÛC5Ñš«wSÌÓE‰pˆ'5/ˆI„3L9@pˆŒ˜ö0®›räælè¢Õà«ëVÍ,4ßÅYð•N!2ÊÓpÓÔ<3ú}ÖúgEƒ; ]1טž3ä¦Ðn#íµß¸¦¶¥x*Ol¥ûP(ñ`FÍ!Gl<º¤.ñƒõ+^‚~Ï¡½)­+œÖÝ«=̲tÒ¨nMi7^jFª'#n"bA–)ÎÏùZrù|˜ï¿0ØMñHík8ï”zÈ8'ÀÔ‘!œZŒÊ¢‚ˆMРÏJ²¬Â¡”A(pò£at>Ñwy0bDâˆ"\EœÉƒÃÖÌà Œê:eJO 3<õ¢'G°Ó¥Å߯•ÓœŽÔüE.'¹ž1œ\ý8¼3Ê$výÊ_,­{šáõÚÌïQ´™ô¦†[³‰$€Ó/°UŸá´©tè«ÉßÐú:§Ÿ ¤ÿû zЪäÝ_È£¯šËô¾j›JÙXm;Åc¯™Æ¼~*HsæÕšÀ>á"·Aþ˜ïoÿ’ êôÎÎ?A߀ã/aõPð4•50·œzäÜ£¯CR< %Cô K¤©„=àSô:mC¿Ô Þf4¸T®Šjbýk¥$>ÂMšu¾a'?¥´=fq‰Ì¥Ëú2áN¯G¸5ö:›¸ÑJ_赬3g¤ï,‘>C }‡ë¶¸”Ó$þ Û7:>Ú—»FŠ1Á.tÄiY¸Sǯ8œ>óŽ_Ù9üñGrðQ¬•º'jõÙ;ó0~”?Xêò×Çmó3èZxáUØdõvP—ÚÖA 4T¥‡4lÍËzýÓ-ý¯õ?DvÑw'ÿh•ÛSå·ÐÊ  T[!mÏ’\}ñCÙõ F®f;!‚@_¡Sþ%«úN¯·ÕÌ¿°?ã•ô?Ù·ÍôçÇþ4¿msV¼X !à‘ ƒ^& ´ð¶ÿ„ÖúY3Ï(ÓO µ¥ñ'Ï—íÕRÂ} —·²í›Øå°î§/¶=?îHV¼è IVÀØÀ°J<‘ÿÐ"ƒ©z`F˜# Þ¿B-mpg·6\Ÿ€×–ŸìA*ÏÍaw/[¾ˆ, D¦yŒL­Ÿ~ÿ׆í1‹8è?~ ÿÿÄá]LDœþŸH¦E]ÓyQ å'E¢ÁŽ–V:â¤Y _A‹à0a¤0Š‚Í0¢‡p$](ËîkÚÀS³ç9ˆô¥Ë„ ¾áF&ß³û½Ë‡®$…›F©ð·C±÷mǩϮæMêïÛéê.Põè3–K„+†¢c5 øP(á „@m¿¡ìÂË ¨H”‘HDGT(´ÀH&&‰jD5c`“‘[Ê5“ q¬‚£lŠ^;"á4t#Ä£‹@„1 ]UGå^*@æ 9\5ð8¤mDëô§ï6RPR§íÕÂáaXˆ©¯&õzæŒÖK¹ÞÍšYeÓçÏ…¤Ô- ©Ä(É&ï4nA/ó‡gs‰yR®p«©YÒRÕ¦™™ŒwWÈÆŠkxE'uv¾•p^&ãô¹â ÖŠ¸ò̉Ž<î ­rLä:û#Ršš€¤iè»H¼é³ih¸Ãe°_h•§Y¯¶ÁÕ8„1$øŸ~¶#Ø.'=;^²'0~C³‘F¤VF6f¯‘ˆMU³† @¢+õº*&†ü¨®öìÛ¼¾lI‰¤-ü+)9¨Ø¨h,¯Üƒjº¥¯PSÌÆŠÔekˆïoªtKÎJ†®‚¯ïB}fh±¡¤E]Z88Ó©Õb„•¹.)$´VU§bÛ°²Þ½„é2Ú‘Ø<{f9Hx=•Ý-»Ðèä=už°™µuߌ›{¶€ ±ÁªÓŸÆ~¯doí~+¥Á<2”)…‘özÇgè’à>¾êæâÙÏN¼ aÿ{¨!ö}¶xGôäMaP|­ËÛ oÙrÏ6‚Âêj,®ßïbqKÔí¨ ‹oðTȧ`_Ú‡TÆŸv§wþ޶VJƒÇ„aTxp›78ØFr4>ìÖAv i½K]H9±ï,d^¤ÐôvGƒ w² 8»rH]èp*+aN‡·FšŒ[P€’׌vUÛР<£-–fòÙÊŒži‰ ÄîÌÒÑä¬#'ÑP_¤Jm‰†ò`Ä´¦^Û®ò Î6¹H¥4¨oWŠ‡Þ©¶ŸÛæÜ±()A½ÿs2LÌ´#Ô´ê‰÷°o/CÖëËÿÕÙ™ÀCµý|¬Y‹Hv‰ Y²•ÊÃØ½ŠWcŒÐ0š[ŠHÒ¢¢xTy…EZH/’é)²´Ø—P¤þgx½1×½C>ã3çcÎ÷l¿íÞ9÷ü ¿8árýÌݽk=3;¼b„Rtë–9„p×Lrm¬ÃËåßÖ/½}jéú­ßtWí΋mz±qØÄXMCÁ_ŠTvÕÃ`Ë~¹ý?úú­ªöé½y´^¹÷Mš²ù™bÁºÉ*k¥–;©§dÔˆOîâã¿dÀÏÑ(úãM÷<ÕrT23)BzBb$ÿ~'gfµô1Û¢aÐê§—P/ËÅÊ6¿“©?G2œ :uÕx+s¬ž||×õRá?ú[Ž-"ôx+i'zwÅwUïUÚ"pLÊ¥°9£ãâ×$õ¾ñFRJNÄ6+ÿäÞÕÄz‡VèiÓ?õai~îsñal ›ND掴}ÄñêêY®Ò‰ü8š=°†§ÕÖ¼hû›kXÎݼüh›Rá¹ü*hQ²!Æýþí>aã¾~Eí&˜¢ÇÖÇO×Þ$q`™BK«©eôfé`ÃwÑàÍ»BɦÚ•Ý¿›¶¬j:pþÆ}S®û§/:[`’-²Wvž÷*9µ-˜—ÿF¥ÚóþkýxÙmâSz•hI…šhkG•Ë5‘_pi°ÇŽXs¸Ó¢ßôö™ÝV|hÄÍ«_G^~k(ÒÝ$l`Òµý·ÏÛõeå³ß… –]¾tÞ]zŒ¬%•=9aupâý¢§?vÇž’MQ´É˲¾s•ZE{æ;ù-¶¨+.íûøÉ4…eïÄÙOS8ÊåDÖøFŽÕ}}ª'eP8Ì®÷1΋ƒ»Ø>[¸MQ6£D_lËɘ†Î¥ñÄØÒ?N¯Õšˆàvê»R½bzÅ—¶ÆyltçØhЙ©µ<û¾Zœ›ïÒ»Ñ/â»×ï†11yLS5;Ý»NÜ´}ãÓbXmÑT¯cõÏ£{-ÎO´œÕ7¥ï˜Ìušü‡kë·Í›Šúˆ)ËãªzŒö*^—¹·£"îöZ·”}¿TÛÎ(ßè9¢›²æÏ=â–Û?¾pªž|¿Ø):ÂÉWë݈1jms2êÃôÖí“Þ5>”S”Oñ_öacNV‡L+º[¸m]î“°(ò^ÑâMãg¾ñÿt_(Ôvà¾P³~–€ÆÔÁPÍÂÚLÃçOðÑ@þ°üÜ×§þ¯ëS÷"P©A,ª«.¤úô_µéœ §ûYàž-‡Ö:Nêè²ö/’|IÞêÞÄÚ­¤æõB¡õ{R$‚µThÞXaQ6‰^"o§NÔß©$.5Úz—“æUyšïCÛb ‰MÕb{È–Mv¶y†O°È[÷å®ò»^×Üç¥.t v°Õù­ ;gIýáy²î¨Ý:I½ÊON4ôמåÀƒ¤o£ÍH´¦žQl?6Gç£&›šé³ª¥$ÓӺ˾EÔ/o'Õ•D?ŠÏFsÓ»ŽIÄGìå?õ§h’É Ù4£^ý·\ûS?«›¬ªæuÍèa&É“aN6»p+ªEH"•»º’Ý1¬¦ñWÅ•V—·õßÇÇÄSc{ÝqBm‘-øâ“á(ÂJAÔ¡ñò=›¤Ÿ¼Œ8¬,ðºÝ¸15©À¥ eüþõ¬>÷ŠèT©ÒÊñCÚQ¶˜|1ñηӼ|“bÏ5r»g¦"¯¯£}ÿä帤åÚY¢vȯÊS^‹j{^¾½ôV„ªoÝØûŠ—ìx³”Õñç”cª” }lÑáy¦«D3Ï=4¯W9BÎ/—ø¢b¦fT3’¶þ•¢ÙÝpç2=“RÔbC³4Ž Ñš´Ê­¹q §›ë²§ «›a.„t³5¥ÉrÖó‹nyªÐ½Èú‡cø"É׃ŸRVHÊ©w¡-Ó'pÛ+½~¸Èc'wy}vÄzüÄÒª{j_ä€{}n¶’˜§™DÌ#‘ÂÅ7Åø]­vvu)8Ž[?.”ê3bå”ç¼tàÕÓP…†b÷”‡ùE[äyj j&> UÄ—Ý}ãRbxKÚE{óÔa—Ïq„µYæ•~§î>^*áõ7Ÿ§‘Ô-IsÁ§²I¥éË2‡Š]ˆ}®&"¤0e‘ËæÊïŸîe+ïPß½íºwÛÖgÝÒSßvˆáÖõªÁ¨åDu]]ý—÷Ž†ê®°ã}R Bd*òñµiEQÄÂò‘½î™!S?ª£L™»·ðNêÓØâ×ÔÞŠËà¶K 9rIÁZSZçZs]ž|üpòhDŒœŒ?æÞmkÃ}+Ê«OwÆû¦QíkzØ¿~ uÜz=‚ ûÏ¡µ¯JôyÜRÕÅ£‡j¥–slÀœ7ðøö-±´ø¢ÕÝÅa¼m¶Ê^‘Å—îœ IMð>™’Éù[ htÈ;%¶ûÆõ’Ò î¾ê<4u3Q,¡`Ã#!½ÒþÚu&2SGå‰~ê:Þ¬€uÝ ´Ø8ô=±h¤Ã·>ª“¼µçܶÐC=ÑgEḑà;ÒS ½JÔº_GžÊ»\‘L£ŽöìisIéùÐúù…Ûq«[í;òi½ªÅ6«âÈgc½Bޝ]§°Y~óõn1™Ayì“(™ÁéwߪZ§.qK¿zí¼yóµ¡ïüõ&e(íÛ5ŠïjŒ^´¡è¬voɆ[Ù>qK~O¢9Êi‰\­¨/i†÷Ž9Æ©7J{ÝÆ0@fÀ”¥^‘/£‚Rxmü? /™äK S= ¬¿M­¥ZÕcgžé0ŒQµ¬}g¿¸RÉqX¥».ßaNVA®–޽¯àb»uZërÛU,ÕTêjêïè6i7~¡ð|^ÒÖ¨ÒP¶Ê«Õ@7U×j¨X ³«ÑjÊïѪ*•V–Vêlèp.ª¥¥åÊÖ’]”Þ0óþ÷N5`ˆš=6Fµ™IHF™K[²£Py\(”è,DZØšÙÕ0†Öf¦XuŒÙì†! s25œÆ>s)5»† ¤†Srvæ‹/Vm-eª9 ©ùÓw!×gª¿‚®¾«Ÿ'Ñ%e%ʼn…L üÈx…å|3ñâ9`R+³ª.ÆTý)\uœ.ðHJ³bˆ01Ô8a÷F³1~çœ{Q>[’é«"bÞP)¤@€{æ\ÿŸ?ia§9²*^8œ ¯Ž§P è±ØC5:ËP¨Àµ3÷è1n˜vò%8‚73w  °A¬­O?Ð- (Œ ³Â ¢gu‚‡½Õ'µw³¡P÷8 ƒ¶U‚Q †d2.hvJn-x4¡ÐØXÇÈU3"}TíH&šúàIn·¹8úâFqm/”ƒûÖÆHõÄà|áa½É'~“«´h&™6‚†ëÕ]ŒÕÓgŸ‘Ÿ»ûÏÝ*PhÙ<—,XÏ Aè€íl` Óó8}”$<î":9A,Ë¢E3ñ-—㈤–†à™'‘J +ÒßÚ(@×( ´_§g´ê/%¦$v. MxjªàÍ£—yÀ…°¯«™¨»æ§Â33x‡ZÕÔåšm0éÌw®HL4ÖÆ©V¶·ËÀòòCy$KŒ¨Óy˜‘µêAI‚ *N/–<ì´í€‡ŽrŸl탦rAUóø~ÖÐiIe…nmWâ’¢•4ýЇ%Ú˜]™úJ8Íà(]›3+É,Ñ3A]÷߈j%W¶™‹FMa 5&ùøÓC,W"Bw(¡%;A)Œmæ œY’@]™„ ±ûù(ù 4†‚rýXr·Ó³ïá¹¶÷š­äPŒs@u6Ο%×ÊhƥЩmk®È¢PýF3GW0¨ßYQáiÎg·ß¶vð°ÖL´¼?XÑl\½xê<‹ÒÑ©£'4<ÃÛd$8=W§ßtFSxªPéò  Wø¡]¾p‰ºç ¨ûæ‡ëék8…ªm²š•0Ïlt^ ÞôÌÄ ´ß´Ì…ÌÖÏ×|pu'°’¢¼Ð~‹d³ê·©Ÿ÷<ý~<ÒÐ4¨“(ÌCræ¶82uÙÑI4À6€yHLE&&õ.œû¥3éêG%P£„å;¾¾þ×80;ôÈ,‰ð¸„Û†i 68& µbÉapv~$*ÁmƘ;ö|<" ]o×gÎI mÅ¡=] CžaÂG˜Ó[r4›‹[À˜Q3…1på/ap6ŠXÀ#¨HðCZ¿î°Z»€È0ß½‚¢I®«Ü·] úv…jªF›áQÖ~D¢ ž&,wÕÉ Ð"Ù¡À`+<͘H¢Ü,xå{IbžŒyæÚ{7-ÕA Ív×eP*/)&`I<!äé>t8J ‚å3Û¬  ° xÌycGÜ9Pú uïÍp’†ÇùÌM+ …Ù~"i ”2Ø V,wÔÄ“‚'¨Öðüßéž;¬e‚b7ò#îg æzâ:ŒPv¨$®úÄŒ°>Y“”€Œ%À0¬œÙΠ• ÓàY–ïÛŸŸ'0s|ƒ•ÁΆd€T´—_ðH?¶÷êçÁ@ïpAã™`^ÖH ߦ>TrB¨pÆ®ƒAO»~Ó@<Á9ÀRÎ|k l›¶84&¼« ƒ´âH¢ø‚X‘½àŽA6 ‰BEÉʆ:­áð „kÑ“4Ês˜êü›,‘†MxfßhA°ÑÛpÀrKA-‡« ÙÑÞyÌ÷iŃ|@(]Áé1±~ì…aÙ“ˆDˆóÀµ;avGéÿ`œŒ mEw×¥ ‚D±ë©ÉÔÊü¯´‚`Ž|u\ ⬯Pw²ÛíððpÁK„åÀ$$íÐb‚W`†Ã%·'§ãnЇ'‚É&lgðKýæç³öXÐæ ¶`Àül„Ù†¦ g@¿Ì…GB3¬2b¡HH„|«P44Õ!Ý} =šä=ÆŒ\hª@h ÐÜIŒ¬N/¬F&%(šà‡Áæ8³06‚\@óè0ÀŸ†ÇB1f`ë“`±ó¡gý2€ÉðÀ9'ÿB‘Г@Hõk¬ð4èéh šG&,mþ³Ò M@Ï¡a4Ë[Xð\賟 ®é#f.ôIÐ9z yJ’A"”Ì%1?39çòòÄÉ,V9l¯à1ÐMŸ Œr=L—˜·€²úöuÉïè_]u¿`›»!¹²3¥á“ÊuÉExÚHÀŸ¦D¸S>pwôE6„„£±DÔzÖLâ««“až» çÿ:A¯4yXužJ©fÊÄXÁâþLä‘o'>%3M x0|ø­F›™²©ðÿî÷¿íØ?ÕÖÁ”ñ"xþ ÷?Ö¶N†îŒÿõ³Pþ iprúïðXÿ[¼¡³¹•ñcEòßX9mŒŽÿÍzÐþÍÞààbpúo,pþ ‹]Ôÿ=SÔß³cø ÿìýÿÑL- \ ŒmŒ›Tdc˜ºNÔáΫÎO„'l‚-öüfëQN$Ym*÷Ç]@‹Î}G\ö)Î\â0‚ä¯&;9m·WÓöXÕRÇØÍ0Áx(Y˜2Å眠ÃîâõéƒU<Àd’ÅA“±'$X ™EíŸMÿ…À%cB1“º›üž†f1lEÅÀÒèÙ!z:Ë"xdH·B •³¸Tf†SûîeŽ`ÂèôÂF_ÙT€…²ˆp»=~¿rh’ÊoGZ Q?”r¤4š\U2sÌúËx^Ïܬ3mâ?Õ”e†"ƒ|шH g Þ¹?¤FXTM5li]Ò¤™LNoƒÑ~ôP€›½µI'­ÃŸPÛ, OÓ_™JØJ:éÖÖöDÐáxJ[š%ûžhñmòŒý ÷gݽéÕó­ÀÚ;ÿady¸ûdyÖNRí¹ºOnãëe3~¸­ÃMÆ@ˆ¨•ã)ŠöåÇWˆ`÷u‹ßò;ÒªˆFÌ9Ì oH Ä5¢CcGäÂcjIæbMoÜ9½{ïݸÔÌø 4Åñà@ž®Ù¥#Þ¿ù÷žMðR,;õ4_ìÃXÇAt]ª#í‚%zhæ‰ÁƒÃ3XDÆ—UÐeç3G$—‡)^Š?©¥øG‡v¤Å3J-Ÿ¸ÉÕ÷˜‘Ð><—m2#?ï¾·=Àÿ“gÿÁOßµ5P@@êÈ@@¤ÿ?m•ÅÍ­œ FVŽŽEê–N*êèßrÇö¬¬œ‡Àyä|V²@JJp÷ðGg St-dL’·q¥ñn¶†775)ƒTi™Y*VF¯kÁsä™VTUÍh]ú¶aH§üèH§|ÛÑŸ»^ó¡P êThÒ¾d6¼¸>_\vͤ½T÷ø€÷:xŽÀ¡á=… k8ÈHåÓ›R¿qèráý„8¼Œ ~×Ù¼uSèK!¿#GüP¤óë#õ™ìC–<z¯éFŠ•ê¯¢¹S}ã¾0rÓ!‘UˆNˆÊÌŠoXð ˜Sˆ¢<:¡ÿ“pX#ýɉÆwEy[Y˜™h â†1Cýj4qÛðüª´3 ¾£xp3-ÊÁÑÂfm{ee¾Žn~ÕäÄã ö÷×kvcSk—Hd‘&ü3lbÔ™-LhÆHÑAa–,±Œ´U×/ƒÂ¨ úÚÜ'?—ß5ÒçËy©6+Á !l¾Ñ~(Ü•ØÏÉdª¶ÉAÉ2ç:ôËEV¤jæ[Ôó¾9ɧìôYÚ]qÔüE°‰WY@Ûæ‡ïýâò: ÊÀO @–%Í"%£…]Åq ŸqÆ4i³ŠüRèæÀÌôÛʘÍô¤Û¤ð–ƒðнªª]"½]}QJšöÈ+-ÅïíNÊ’ZS6ôÍ" pmÓH[.5B‚˜Íéjòº9ækºë¿¦3­MZ‡ÂÖÚÅèmÊ‚zËù€ÄzæÄÏ1¡ÀÊ{?Óž‘¶Jž$P’ ´BøùÖ÷¹N°îq‹O=Bøw½­?€pàs¦é3œ½]Faw¥#ËkÛÈfPk‚7šl*ì%¤ñï/g˜È¬ìƒÁò§#Pz5Tªô/L}myôsÈ@+W6ºIµ°4“¦­aË·°éî.cæÿ®Ò¶ˆàŸ,ÉÜ/ ÀD‡ƒópêà?YÚÏlMo*ånÉÿ2`8_¨H&˜¡˜¤¡å‘€©-пqwóï¹¾¸?·hºCo*^õâRT?‘jJ_ñ8¨_ã"~ñ0€N&UVÑ0ìSÂè©2G!›xéÙ—­úEGMNº´Ê&Á[IcV%¦ÜEa·è[¤ è*Í=MÎ; (Üiξ®0•ï;GQ¿–EL´æïÃë¨Þ±nVìËvíŸ8<ÃZ©ÝªtF»ª|¢ÜÔs˜À4G¼&ÿcJ–“bBïI¶ð%ì2ïQ®ƒíÁ,íT4©±¦<ç¸KH¦Ù!¬—“Ïȹ¤å£',}%ý&S`6*Ñ$À\Yvþuc¢6“F#¨ÉŠ0Ït!lÚHŸÊB„ ¤GO\!§o¾tè¢Áž8Æ¡ Ý¥UϹ…¿F“6üP!̺oÍ*›©šà/:™Ñ]s׫¡Æ©ÇfÍͪ#F¾‰aXc½BW%ï ¢úæËÝ~‚'±FʉIÁF[æH­ „7ܧŒ¾NŠ›;ó[j*ÑdÐ&o>•"c´:±jgóï£ÿÂßjز…Ó…Þ•°vòÅuN[³væÌ+ç…ý#v3mPÙ-HåÎß¶ë^ ðó.òÒÊ–­iíñœ¯v#h2.}m’¼¼ÍŽ=ñæQáÑÇb̰%®ýQC÷Êä˜ÈŒ¼žåò®éü‘ê.nM´º#Ó #á>¡ybï8™Í-°›_wÕ"'£ •kõ2&GµFí1‰Òê“Æ+“xCÓz|t°T†¼8«ýzKÃäsi¹àvÌÀ5†žÎ;ŸÒ¡/š>ë¯xgTŸ5M_œÅ9\÷Óñu`{:i_Ÿþk‡îx¶®ƒ`šöö§K#±Q­zCW³¼@ñ±“ÞÆüÂÚcò‰ù«ö6x…s)NÏ jáÁÛœ]ð‹·¹H,]åˆüÊJöªÔ+ TaÿºvqL~©ßW¯7|ÃòÒ¤ëŽ+öЕ=»ÚbgD<-&“z ºU‘,`”ùunGê3º Ð0B>9-eVxçè¢Þʘç…åx²›œt½^¯¡‘ž…âæTÔaRí‰õ0ìm± ”ÓM/|޽ßaÇ‹hŒhŒ[lD º=¼D@0âC opcºKh°:Ãt+ÏzÉBýø&7)‰()Ð0cBBjjàÄÂ!憷1FOÄ„PMY› ´yxÓos%´ò¡iVhÇÞŠ=  ž-$I_°;ô ÒÈš9A5ÕLgf—Ò1cÐØ\ qØO´=^‰Ék9þF–ÐàÖÂîfì7ÁÿT¸¥ç—åàX€úaÛæÚ»¾ëM„0¬-!­#vdA^ÚŸËÁ Vä )ø® ÅPžg¿PïÑDyŠ-4Å]ÙÞGp^ŽÎÿXL~ ñB„qôÁ–oßÝh¹<¿N^ AóE­ç€>!5ä+®¨4֑ܼ¦|ÇáYÏá9lý Ñ5orcœy·oòkí>×í‰áPÚ÷ÑHr§±ÝNXÃûH€z0}sñ½éǘ¸¯Ÿ3$U…áó#U+Ð0›uü kAªš;Â;{dš-wÕÃthÜ )•§ÅLhFË y¦†l¤úu¤z|Ø'ÞTµŽØÇ÷Øç BÌKò…*sÅ.4šŠ#õ¡›yY9ßå¡åä0rùùûÿìUüµÛ«M fF”ÆCuÝo5ë7ʧÄÈD»â"ïç’E$@Cæ#3tÓxDýª“GòÌ^Å ó_UÃ'q‰úäûñû´<üÉúôýû#ÿ½p)!Ï]ä LÞØšJÞŽ CGç1+ý³~ë>Í÷¨úÕŠI°ž8ì.€8Éãòp#4=qÜ$å¾n‚›bÜžšõªgk8šJ¯¶3Ñ=M¶Žo 2: Ö1 òÔ˜î òcÅâlñ:3y·•XÓ€Õa<™ž¾h\6Åß9.nk3Qú;G1›rqÔ$zü£ö€ÊÓ4ê|ÞÈòù¯ñxÓÙ 8ô?r„ú¿ˆwTÿ¹2Ø8ýKÔ£féˆ @ói^sZ0–6? vè&7Ó ŽÓϘo,:"!Z´®/Ô^°Zµ’RSA¶ åò9UÏŒ ï)§íI”ÍtH.hk¥Þ‰Lw{n;ºoŸðŸXé}?¬ìqìûcZÎånD¢8%°#ÀÚ‹†ã=(už ØgÞî‘m¿ì&"–ÌôAê™>‹áµ°y•ŠæÜ2ý…ÂÄ÷›õF¢ÉÏ gªê»×aé ÕóÐê@sQþ x€a zýPBYµÖlSD¶Øôd¨Åe‰;V[Dù˜ggjS!P#!}JÝ¡ùt†BC¡)ÞÄöBKq劋iF*Fææ‰ÕËâÑÀþ©¬$MÞ¿µXŒòH»e^癦þõ^€rhÂz=È©äáé’«Þ‚`Ù%9²e>V{éTjþˆŠ â\—¡E&`¢ïPç%œ>]ÖWjh]¥eÂgŠçs¤¶ç7Ò>v'à±9nD‘[æ­ ñÙj3Mñá~(^sa5gMš+±=Éçx1/—Ì,!«`®IŠ$7XÛlƒš‡L®ýDO#o5"‰ rôÛÅ¿$Œ83ßÈMˆ„aˆãìãf•ôØž“ÉbFAðzš$‹"w\{^€Ë²gø#{ê²Bfå>v™4¼þž¶žr0IÓ&üjÐ P«³ˆ9n>Ý«g_÷蘪D_p‡!©NWcÄ j‰€‡B-LM‹ÐGšì÷׋M<ÖÁ«,uEÐà )Õa\¨4åï¡çìÖÈ«Z ¡C‚»nÓ"*ÌŠxc~õÐTïñ8×Ý…(Ù‰ a¾Æ $ lÈ…jS;Œ„£gúÑt WøÍ—ïGÔÜE½-¤© уFóÒ\ïó¢CÞu­Ÿ%Ô‹³TkÓøôÆÒøôóü¾«¶{Ã6@¹‹ Zª™KV¶sz|¾`&©¡Q3AÁàJÁŽqB³HçWm¬§À¦K«xÔ(ÇÞÚæe.ZF/ko>CÊ:.Íhº »|óU úÃæYÇö¬$»Y¦¹îw]«Ì;qk"?8éߨ|˜·¦]~ºX“YSheÃKY¥‰ÍO²ÞÞ®ÁóÅ’o9×ÔÊĘs_¤ao«eëÈ£Lnð`,oé ¡ÌÜuþÝ'æäEsx"2ü¶›©ŸÀÕP°6ñ €Ž\†ÏZ¤ÅSU²ïXÏÕ 9¨Ð2•‘¤ûÇ+`(¾]Ü©Ú)™ 'ò“ùA%°˜ñ÷Éîëa sR&%dÂáÕ~C¢K¦M¢í==¦ú/ë]èÂ^ÖD<_£Q)ìØ½ïûÍßܱ!¿HQÙò@xëÂm-¦Ñ3ê‚å¡mÑû!²\¿)@y"¾ðŠÔ¬ ’ì:ÇØl@ýyBм¨ŒJ¡Á$v׈!ƒ›åÄÒ`óô¨:dŒKíù ‚Öý-œâ“Xf¯Œ7û»,Ž­É ëÃrfèÕ6êúPwç\X’5º¢uEë7útøW¥#½Í¦ :gø‘ÚD§/ÑÂôÄêEB¾m QQ}˜fnî±y`_è1õüd‰y%©‚ÁKª· ÙdµÊA®8ΧÄVÑ@î’Ì(¨®»g0¹-{øJcé€ P¾øÖC‡é=‚ÆI~à4¼Ïh¼âèV!ß[nš¯oE:¢ù_Påè³nY¸¢ 7ƺqTÆO'eJ’R ªÆfS€¿. í‰jˆŒ»Éw击TåÒ·xìs!˜­Ä×ñ/8}ýž\ƒ[5«”¶I€ºoü ‘¥{(Œ+»•¶‘Úlž&‹læ è>†*Gå(}ÍÇr:øŸ¬£Gü^,tl‰:aÌëÜãmuž›úÒdU<ËT.ZD°LRM0`ÕÖ àO½šAÀó4:ƃªÚ ûö»3Á„Sw‰F^`«XìÆâf^g$ä'L» ³+ã!Q™½r¾µXÚC=Í> !ƨשÂè\¯­“Dö¤äFÞпz 0¬&D  ÂÿZ+8ÿ‹ŸhÒ„öB;qþéY²0EΞØÃBãf ì3q†‰(qÁCL²ÅcT¹¤l!Kd²UÉ"´8{‘ùá—ÈjO4m²ý%ë“ÓÆãIOà’”Öî°à´Nà‘À¥üálЪ zéìöÞyêvýÜa>nsÍùDñ»8ŒaZ¿‹ò¯ Ú`%nÜÓ V¼”íÆé{xMWb»{‚êöïa¾"Òƒl xm¾î)üØa¾ÝbÊMFØ5ÖCØÿ0¸þüÕâ‹5¸#~ëÚúOy‡(ôi„U³»Dô-éûvÿ‰hjŠè{­Wb;FŸâ[,”0ø®æµé_ã6©üVé'¯çæôÖKphæqw&é‡1qË÷¼á°›BB;ÛÁó1‚/ ™ƒ ò: !ŽúÛ‹spNåež·ÑD†–jLGnLJêäZˆPàT ²’öKü‚iøo=Ó9ÀJcxÌ ßÐ õi‘Œ_pí/µÁe®û!N—‚Ü—q¹ÒÂcø™‡]1k m”7[ýäòŒnŽ2Ü‹üÜ…P™ t9\šåï&â°!YÙhÞfØü DÐÊô $«Šµcãý±fò€ø¥2ãåºøi9Ú9l€¬¬å²^‡wÑìbc‘e¸‚²²ÈÁs{È»uÀoekS:ÊiË€8‚ ÊìÒ5ÞCÌu [i-9õÎbÄm]³ ÷3‹Ø–ÆUɾ¨€‡©2cGu #ʬô%w‡È¤ãà蛽U&[øÚp:¼0ÒÔýl.¥„&ÖP”f‘¸­¥ínO—ž¤&W«*eÖÆÕð¤pÑóÚ-’¿üËón,×t˜hª“kÔ·5rM«¹nóÕ7ç›¶¦ÍÚ¨ÍÄKVä.Zi­ÓŽ‘>%ürŽz ÜIæg2€Ì¯å¹N¼hÝév·þ:V´¾šØ[ý!$Í.P´&öíæAï?bèQ·1%A²þ&/QúóI\ E_QaMéW"£•S.ç¯ßå*4ÚN«ÎêhJ3yYŸ’ è„ã{UäGº(›,‰ÚÓÀÚWº.Ëšm[Vé ë"-ŽùÚw…–ý¼É²ÍŒ÷*àõGI*ÍÃKøbØ»€»YÆÏIçõ¤£üê)š`ý}tQc¯66-'߯iÑ.o¸3fuöìÙ´‡-ˆúq,Üã|‹àÒ_ôS€ÿ@\]KÝ;'½­ ~B91?¶¡ÒÈÒûk-‘ã\¨ïÚÄ‹A3„`j·AIU“êØ4l7Ÿôœ¶¸Á¦T”²h ¯Nj9J_19Xà`­Qd@{¤U¾*Ùf}VšYùµn¹[ØÙÁæ8T{“w>Ÿ¦T™œL\ããàxWš‡—êâR/«jt!MÜÿ™=ʵ¦k¯‹Ã¬?§lù@USÍI R´Ý÷FŽù‘Hzrß€îŽ Zƒêz®ÒÈUIŠ7šî#šGaTÇšÒÜïüå°D‡E[ hÄ'j¾qL/,ÂvŒ]QˆþÁê£~=…ಅLŠ¢CNW6pþP,­JÇ@je;Sˆ`‰ìÀR¿h`M‘_üÁ£¡Ûü†VùºÓ´=î³¾$8îp}Þ5fâ£4Œ'’…OoEAÕZÀÝéTÈ>—dýgii½‹QÊR°Ù KtQ:%ÌÓ&r…ÿ0°{ñ[d~£°;Ôü¦€2§í-ɣ͋©Õ;J Τ["ší¥u…}VhªŒmJ‘Õ®àïÒ-ü©8€ó¦ÇQ„1 ÛFBP…ú+ªñÐcõ×ðµï‚æÀ/ªâôYK§}Mª8þîø;Š3Ÿ>®+X¡ÙÒ—#…oÇ^Úý'c€Bú9Ò¤œGÛÁyžŠ£!¡_F w8Œ4 !7Ð Ä•û†.U~ŸO“)gÒ½\Ÿà`#á!Šw¦¿FÖØÇ'Ìñ9®ðkýµ­ÇêôwÛ¥ Opp -„BíY˜f¦¯¥SÌt—RS†ÅbØâ[A€Ì­AŠ´ü伫nºJ-ÿZ䣖œµOPòAô‚Y2ÍbD´FЕÎVßͰõªÈÃŽpÃõQ—ö=Ûžr­¯ŠÒJ4ÛuVëDÓ|x¦X"OLì,‹ªÓ­Ä ¡Àq»ˆÛNI•Ë4ú‹Cñ³–:û »¸÷8]^¿2Á0üÒœ¥‡‚LCE²®¡”³Sºt¢ªDIG&~–Ð>œ/秘üaÓÂOL#ÉïÛ'éqõûûª‰±’Å›Ö{pó¸ò¢ÙVÈœÛϳÜ!Q cÕ%åTÍ‹œ4“%Œ‘OïTúRx*E¡þ0pÃaÍÉ2øùå¢ºÜø¼·r’ìcñ²ÙN0D »*½ƒ!k ~Ô‚’“Z&% îpÆßUذFü­ßdâ*ßuû›³Ñˆ´ Ó}×¥˜°žua#“tzJjñ­³ívÔ¯ò }¢)B‹ÚˆçrÖœÉöFóä¸Òí̸ ŒkëÑ£Üt 3®éë(C€ÊBHZCro Í û²ÏBÄ /«S•á€. o”§§ïM ɦú‹t’LÙH‚^#’¨‚‘»ê‹·s£A¬W`ˆŽ±[#.y»³S[Šg¦ÜÖÄ ¬AÈSÅÐìÎ@Åh𹬯7®8—Íï,O¬bÅgœ®„¯7!Ì›>¢‚;É´(T¥HA|°›†Ú.k=JÏáéX#ãí^4t+âKAÐÍ78Á®vñ~¡d¡À˜R B¯RÉ-QÚß"7¨ŠgoðâôñBœ‰Lp&1“Û!,°Q¯d¤Ú·ŸJNO´ zñ6æD"ùþ°‚#ß¾8²`ºƒba²J§Ä)I`¸i"h’ÁwXźƆÉuçÆáIƒQRÆüëË#†<Ú¡À؉€¬G[ŽG²Ý™ÆdÍ,]uLˆgí5™Z"zN?ž®Ž/ éIò¸7Ÿñ˦ßF(¼Óëڼ˄Gµ`v< ?x©¼½7²VzÍʰû°9²ü~ÁÕào6–|žcéþæS~‡†×_}¸¡ß›îÑ[P‡tÛ˜*Ú'Éè9¢a±Î¤LP?ý¿4wÑLÚ¤n£¾m6–¢ëµàD@{í@{“*7ÒÔ;ì_Š>ÜU$àRÅgœnÒwÈŒ!“ÏÇõÙ>žROêç€6{߮Ŷ‹ìž£MàñG¬àVO(OfHy‡¼ä¿8|Söþx9€ÂÔ+ôçCÔN ³Ú}Ÿ,·/£ƒ ÑïHѧ–±=r/佫ÈÄ[ôl¯$^[‡'v/LÛ]çÎ`BÔ—›]ÏWìnF¡Ï_RöŠÃûèiêØŒ¶J‘+XM¶£ÑnÒË»ÖRÞŠçm= žm;ƒÞ‘m¾>‰±§&—¤7ùrs~‚}9,ë1†üßp¾Óf Ÿ¥eL³3‚ÿÔ¥×½aªEì4m:H) ñ>κ¾×üyë” )¡.Ë,.tH¿gïÜYóù2Fm nsí¤i¯@äühmÊnJÅG!ïIÈ4è¡oð‡Å©G³³ì&pëåE¢]ž÷&5 ±‘;룷QH:.·ï¶€pTM*tv»©&>Æûí|a†ò;5\0 4Q??ª—,À.DÔ¾+ªO‰z€[4z„'Ü€VùE - Ø#•ü(UfH윹åËNu2ãÒmÛxä‚7›sí.sLjµáÙ¾ ‹jrK©.Þ!ËQzH ™å´X„õ¦;é!÷o‹CƸwˆTÈxÕí=ÇÕ^KÆôiD¹s¥3)­ë¬qiœé.Éõnþþ;s/î‘xÅT— Œ·Šü–§¾{ƒßÓïPÅébÓ,6ט§‹Ñ$d§M‘ꃈìÒˆõàÐîOs™\#-1/kÿœˆì[D´æ7òn±z ² åd‚–íD]º7íÅíT=ƃhF¥˜Gëøö.Ii•„ÞZL§6ŽiéÝú]Ê%Õ'8Ò1CÒ^Í¿}'궈⇢ü/T¿ˆ­‘“òöþSùG«i+k«¢}»ØP’…Zæ±kIÓ‚ÿ*XRõ¨r0WaüuI9fÕzä(‡å6‰Oø±ŸÃ:݈è}ŸÇ°/2Râ2|·åkôåâ ¥Œã?iügyûBÛÒÛ²*ëóé†0¸–2 µO‚k#€À oÏN®Jú`ixɇ$@R†zïm—õu¼° 5l¦´ôጊa¯>^G±¢BqR_m 3ÄäÝP¯z<_•z¬ž–Ⱥ‘~$«ùþXWù˜ºƒ IoR ^}77Y_gQIŽo^ƒQ”‘Y5sðôÀì?‹Ý`Õn þy—çîßÛš”r…Ý@Ǩ*­i>ƒ½FB®‹MkŠv¿¡â)e—"#‘Ëh´lo9ŠèÝ` p¿è,Äeý`¯?a/éW8L5”o *úK‡s$ì°Ü4åà¯ý¿ ŒË½­Ucàù3s“ÀÞMØY9´GúZáVðU/%NûýáϱÁ‹ÜÕÖA„ŸI²ãP¹‡ÞÌÕåÉÖN¦zÞAͨÐ÷ýë EÈ{5»)mjŒ(¯=ňÑUr:À‘éw”Á‹kœY•òô Ö Ö;|»¸¾¦Ø« â‘Â'Ôô[ÔÕÞÐ9Ew¢?Ãlí×!¸&ºbÞÛzɬF`¸ÞŒhÏÉЈР¿|IØž2Vøä7`ú­0 áèŸ|›Ø&Äe[ÏT ö °P¬áßü@wìî0—}·Zà Ñb¿)¿·…3cÅ;Ö9çâ`ÂTf}iQ#À vF4µà†AøóPµO‰‹†)O#ÁsHP”úB¹Ð`‡±<'ba¤>uBß9È>X1¼NÓµ3êýBàøEà†P6Ò¸Gïô¡¸ðuA$‹ÂH×΃n´që)Õ;„Ìߣ]é ÓÕ ç½öUmgªû}y;­7+‰¥;Ÿ« _-ÒnyV®öç«[N®ZX\-¸*øcAc‡"‹Ã×ÌIáHêwˆÕûe…°èÞü5l—i…æÄ ŠjÏ—8øÎ,ȰV>(¢š×¼!=iºÄE~ Ïë[è¡AËé^8Ä®ýnpjæÛ&6xÏTBz?„†#vÕ3€*ûÕ¹X8.Scc”ü×ì#HÝÔÈÙò:ã†j‰Ú|ŒmÀ‹ ¹4ªy Á9Õ°¨­‰ÜxMðp+^«ôÃ_@îù¡:§ €ÙÈ<âÃm5^®ït7Ö,=mþ,¹z*Ooó–$(0»ãsA´Ô³ÄÂiZö¾éý¨ŒYÂ+þp"@$>;ÏísÚŠ¨]j|Âûc{óªãê²ýy“"¹A!ðìYÅÔ‡Ø8dËF¨€äOܵ÷ëbÙÿ.¾-UÈLãžáMH>¼Œp;ö«¤"ýPr¯Gjc¶MPí FÖ Nu}Ãâþ+©á[õÚªþ!µÔ?¤–üÿCêÿTvrXÿ'Ÿ«Tt•~¡ñk /„€X¿) !×IM¨GÀ”ŠÙƒjŸG©xIoI&¤[aïnùD"æþÃç#7Î2 ´7;¯µÍ޶“mÇ™­-Û/p¦ØûA;m¼œúÑ1MÈ– Û¤¡œ˜Þ~Héjó§L6ñ~eÛÖìRœö™.Ý XïPغš”Ìô­r\Õ AîÚô‹dúVu¢Ëú# Ãà=ÝçüÝû˜:ËK|1عŜy%hN½ûúëȆÏâ‹×ÎZEš#ìÄ|í¸/ÀÄÞŒv4Í‹ÞX;ÜY½6ë¥ì@CáζŠñ\à´ZÐH4„Hþ!×&ízÈc„V‡~hZB}¼I9fó0“»<–¡^‡|È¥;ºÁiU[Ìn •ãÚœU PEsss«z&-ó#å.楙¥'û6@Á>Ö`õ$ËDÓÑÂfËA{r6iª+Ï®|÷6=Ê4•‹B*ŠL/‚XNkÈÚ]E±).Á)#á‹<7Ò C…Ž¢6蚯W$Ä8cêRž‡M,¡–šî †'z臉½®-ň76rù n”ÂibIš1 àæý|û}¶›CΗeŸ±vÏ_íÈ›0•ejAý >ç¹áÜŽxà‚ †Ë%˜•g"½ €¶Å§LùeV,èjœáˆ‰K;°zv0ïA|ð¨Qo¬”ÍYO’ë«÷þ×›Dâ÷¸ø(Q[–¶f â)ô>AÚ·$l7[š‹æSz¼¤ÓRÉ%±„@c¬’nÅ#šÇêC§òwF/°d¯W‰Š«BJ¸hŒA•ƨuçJ#}ÂÖ=:¡:»vzD*¿ÿædÓ&ó¥&BÅk£ZܳQ‡b¾Æ€˜G¶P-a$•<¶Ç¼û·ƒ¾'€Àm (ãŸè•íÿó;ñ?诬-ªˆôm¢Ý®Q>ª |”O–(­±8‚ó'JǨ”z®e%Ž|cëè’:"–ì“Лdnp7–eZOx­vØ;Õvš›uÇËÔt:6çO¨[ÀˆœÁôp _#³­Qß0‰AýqK×u·…{ç×<®xÃ9’ûŽ©î“ š½hê™Ø•„Ï §V0±¥ð^ÛEÇ18±ºž5Êý’~tóʉú–\äSW4“âú¸%Í?BÌŠÕAgo§ò½kºÑ¼ •ÒÐû²Îa-õ¤¾7¥ÚTCjAÀwÕGÝó+”W:(\2¨ÁáK¿"ór8h:&U¼½nBB7Fæh¸6±µ~]ÝYþÈ;sÙ¿ü ÜETˆÝ=‹{!éé9G$N÷â@öàTjE‰8oà“þÛxZØ2äéäŸ^è%_µ×+AüNË …û\Ò÷žÐªpòÃ#ô‘ðOŠf² Ó2®F„÷x¼ \Ag}­øe{‰N%œ ÅMôI#¸l!YÇÒý.]í.‰ëpYbÉ i*Œ…Ú(’çâB òmþÍ8XVÉcºpSòn¢"«ð:0[èé:èYÆ¥u(#â?]~ ®ÿ‚ÿËñ(¡%©ð¿õöMæn*KØ>ò,c2&6õ¶¿ ER'Áò[‰ ƒ@¤DÐAbérñcCc2™mËZÖ´Uº§âœf–Ò°ÅURyýpXàÂhWÅËÍj–UÍMÞÙ ò"Þ¦6×›AáЂã“m¦Þ;¶‚”™¾ß @ ;·›{ƒ,^,'ø„òÞòŸ¦x«ƒ¦wÜ63 F”¼˜?nÉ!»'þØïW¼¦Ã~Ø÷JâvOŸt÷Mqf5>ÉAv ¶ØÏúßܲû¤`"Þí2½\®Sxzí~tÞ‚b^ówz0ÎàïÑ î!ëñ÷wlâKt¾1q¾¬ÙgŠñöÉ´P\qõRSš{ö€tžgûÎÆ,ȸÇ„fjø>ì{ ÆH¸hòNß¹ ÆŒ\ºéôΡ«ÚÆT0ëê7ûjë{ê›JËDÛ –yH÷T#6Wó³×14ÙçùuÑâiÖiã¢!e¸7’–ŸY¨äÊ4šÅ%7)ÒWºŽ›¯ç¬ onUK,õúù% Æ  ýáª×ñ׉†vûŠ3«¡,u€vÈp¿ö:Ћ*ÀŸ5iÍ.¡B_Xh¼TìånË÷W¢Œ.}4i 8'è#ÿº&¡¯<“Ë¿ãŸcK°‰„ïgv6X€Ö¶,TG§z´4pvöÊÕŽvkaS¾Œ}ÆQŒ.Œ~B¡Ò¬[kqA+fÅÁÂ3îøÃ\¶ÅÀ7dæ{† r]vþ !¬ÌÃr¿âÌJóÜNš ¡ùoN£ByúRAƒf%ôᣨpSÛ´„¢°Ý•ǯ؄ì#›0…:*+By´¢`¬èÀÍ¿sƒI¹)Öl¼ViÔV{½@Ô üH êÄHV©güHÁퟂ÷ë¾wÝÛÉWÇܦÓÎ +£ú`¿ÅÕÆÞð·~³„xnäÏAâ„“´ºf­Wˆ©6gŠîõ"¡Ñ ©þA]h@)µ’Ú®!åTõåo–š¹d² WtåRî`ŠÚäÐ4ùb+éÑbÏzg¥gkì,*¿%™¤vàü(AÊûGÖRõã»É‡« _sx<cø:…ú) îQÑ;JïùœgFC¿*0„¢¿(µ.‰‹°Z=ÕÞ»Ëö»”$™PޏD½cËùuͬ5. Ùt4š÷ŒÔº7($3 ËÆôĦ-Aæ¿JM[.:ß5µ*\`Kx/€óð]E`‹âb[Gêß9ÔäÚ6U-Û{ö‚zwÿæˆ7u¬,'ñ •¸b  ©`*“%Ò4÷-:G-3ѼÊVžÌÛäš°ûò«¯‹ªå‚*Ü#3HJmÕ‚¦ýF3|Bì )~wcV!wD!w\y!STrŠÏi:Ý<ÿm×íÞÐ|ÓÀa”j(°tÐÖ IR#X/¹¾Å9¢v†hó·Q³IQ EøüØ€Pš€\lFªû~Ñ=¡f~Õ©)¶Þ)^fÞ4;ÿÒ÷ "XÝ… Wþž‹Ú™àÍ- 7§ñ¯Æ@îQÞǷ媴=w‡ƒ`[ýL7Ç÷,c(V(SO+KÓÄ‘¹\®TôÐRt„z½7¼ùO 1« ââãù€iRÈ‚_înûOæóïØlûš³F¦ÙìnÙJÇàR1Í&Ð*j4:†TŒamâ÷z»þîá{ŒbÑl–⫚‡”pX÷F0ÃÄ…5IÊÈGjг¾ª¢Ü±£í;×ïášõfÜîÒGRé)£ÕPG¤ˆJŠQteœNäƒ5ùSdÚ#È}“1-Ä+B/ÂÇ)£– Kƒ ÃÞ#J%ûæýcG§½"n¾Ö ‰JãlÊâNÑv­ÂI‹³z£ÜHÆñ(ÂØ\ GOˆ ’æSz…®6ÀÞt‚éNo@₵â¢= µ‘Dn¥çˆvH¬e(ï‡ÃGGÎhïõQåHœó„ƒÞD5ô‰ÓmPæD™îáCzt‡ÖêÁZjÁ;ɨDD¡3ó÷ERÎDRÒ.\šS’±ºfmqÏÓhŠ(²î4á%0îùëñ¾r #æ·sgèYÈYRu¦|ïpÂ9’§Î¨¹7ãÌÄJNÚü}Â>Çp\`ÅkYÐíõ„žÒºX,ƒ 2-0¸ÎïfUb ûñ¦“Ts2ÞÉì¨Ûl ŠÊJ§ ‡'äöoØ‚<Íó‘«b¤åCVla¯Á˜WùiÙ·Žô6WÓHÃQœÆ¾áƦº/,;P6œóózÄæ”JÇãe4"êoüÛÈ2¸ÃŸ²2—D¨Næ˜0F±Æ<4Fó¤ —¬ í¹ËÜÉaUKÑÔè`üˆ9"ÅNQ"íC5,xª"çDÄçV=ý÷uzÄ•©l6žpOÌÚ}ÈkÍ Þ|š$›'™Ý9“‘>÷™›{0¸óá#nóD+ÅÛZc”Î=Ã›Š™ÐÉ>Cí+Њ·£Š6&a–ÍUjÏÒhRãfœôÈó­ê²­ê€ù ,nF!pr–V=ðí£KŸ|TxÃó²ÛÇïõ™õ›dÕ’¸¼)BƒÑ(vátqÁÅ‹Á÷i¤Æ¶ •‚›X]Íõ€—ñn¼µ ‘.H(Í×VãW°jÐMo ðoÄUo«ÀŸËœg‰ÓQºAm!1þ™ÿ¦¼“Ô,íTL±}¶2ºŽj3 @à÷RŒE@šJÍ%¡þ²ÅKùI™ul]f[!X=m5lJå5åV-ZÐ6Ç+Ñ4§ê©ÒI†q9‰ã—å}—úòðÄœ"ŽžŸžrÝy÷8ÖwAÝøì¸vo|ðݽ=ÅúØa÷ÒD…ÔBxhDG±ÎÕbÃÙ7¨‹s›ßϯΣÑÔ!~€r} ­9SIØqùIÐÚƒIŽí ˜ù0úIø,sRÚ(dÒ潈ýÇáåßïT ê$ž½ÆbQYÞñ¾êuîeÀ†æ*ÔkÆ?ÕA^- fö¹»1„ñ,z%» zˆ+a}¼Dä²âMFc|:E¡‡·âZ iy\)ŸÉïÅmþ ×}5ócmLʶ°Ö-­µÆ м ÑfpB=qò]m·ªêó6,…§šµÃ<ë÷]7;Šú­ÐîwéÖçå-ŒªM_ËâE¡[±¢Zr›á^8¶ öÝ“V¼E1f "Ð;بv ¦ÖÉò_½È¶ïÊ›TvÆ‘( æ±lkŸ^°:l ]ñ è›pÞ˜ÒàÉkinŒ®g‰sX¿º•q.I’1v!s(öêHÐëØ™D†iÚc[oÐ$]I—<|€¨a×;˜‚ÆrÐ/H«‹ÞœŸ×¼SdÆ)šI= Sh;¡©±×*½ú5Õ(+0*ílÐR:&ßu[±Ÿ¶lYó°ì:Áxà£þ€q?SmuË‹õ®¦x>‘ÑÖX¡UWd”_º±ˆ«k®î{=‹]Z¡ß}S«_M–Õ¢fÍÀè„A:ñgpçô%6 Õg٭ْ½”Â8këÌë›JjHùXÆ·ž› ¸à· ò\÷jáW­æT®Ì‘ÈæTrØàç –8yá\8m†w|rnƒUê7(rÏ^)¦ÏuîÌסn@GªÂ°·ÕY²4ŒÉØÚò"0Š kNÝÐOœ¼px\Â×Ìßïrc 3)d¶RLPxô.‚‚Ë-X­x–³Ç°ÎD‹7äVÅ™#x”@û¢#¥GpÝ”½î’cZîðñyo‰0gÁ8)g}¼ÔG^ì²™Œ´}§×Û*>„ƒ8]Ñ™í¢´x;Ú78‚]5J‹©ë³ÂÿôÖ’ÒÑ.TBÇbº¶5iùð¼=ÂdLôN¶h‚[G>ƒqãsâ†'&ÂHˆâ©ßváý8¯ÌüžI—b…ž(.ª„6г}pî§Î=R^µ¦Ê8?ß²&;5/Ë^V[êÇÁÆ þºö œ^V½_QHùa©é-r"»5Îq²,ÿõ«´ÿ¹()7 ‚í÷X¨ô0o•U:òFr p®3›bLü½Ÿ­,Ù‹Õyüð±a¦z~óîpZàÐ'_Í^ TÍoàØÎ|ˆò“vuþ”îó¶wÕ™ü\e˜¥–V~X¨Ö_™¸y¨¾Y>׸ùF¹fP§ãÈnù‘»ÑË*Q¹$Z¸þ5Ü`¾Nhßš&6)¬T zõH…BAæŒ&JM‰#Âõu‰0¥%Þf']S·áÈN»¬÷#Ú©peŠ˜ s‹§§Š3,‡0ìë㤄íèÀû?8AÖ«ÓU~;#G1ÙÈ`ùl¹ly§à*zBø®Ùö§AÄ¢Æ:üÃÈÏ¿žU’Ýè g‰UfI¡æ DOéòHÍò 4Db©?ÛF†äé„_:°Ò±õŸÅ0ë'¤ZB‚Pñ´c+pMhcºó!½^ñŽRÄVáÅ…ìÁ–YÖwчHÀ¥Û ä³ûð°og\?ÍõðÄŒWÃíÅTÇ^uì9ù‡ˆ¹û Üp¢á é®sOÆO+ûy[J ŽA1eblWÊm±%šBhÇ/' ñÍ,ñÌJÖzX˜#4G$Ðǘ,ÁŽ™úùÁyöÁ$‡,WЃ×!ë °‘ïøÜ€ÙÙ‚Üp&NÉ+óYÍŠSæÄMç$kr3¦÷|<àç.> ;ýáºÂ»]°W6Ñt\ÑÛ²íÚš™£z‘®ß~¾þˆùBƒÀýð}>" î1E²ë2éôë>ŠXåN6ŠýFg*`ë=Çríy‹ÿ‚]ˆÛ[Ž©iÔÿõ|{6šÌÍI<ÒiMu4à\M Ô…}iÇ ™ž¨V\”ã¸S~=5Å‹{™  ±Úß»!ÓAE|ÈLù(?ý„†}8Ž5¼6Æ4ÅéÙþ,ªGvžF³Viã0^œbc—ºU6Y¡õeÜ$Ù:„«"]rŽA(µŸ\¸].lÿòó~­¨_]Ä í©Ie3Ò1®7‘ÚÜ)§â,Qp‡~p1èëÈć•·×c4˜“30D@7Ò˜`!‹/ª·Js Îuß44œ¡âwœ§SºWJ48|g—¾¶U茽ã_ï‘~#ÎÆå æå|ëˆ÷g’ôÍ‹ñ¶³ÛMŽ£ßk1ˆ¡ 80DaÖIA4Ô&N&WNœ$hTh¨6—xËèŠ~í¼•¯ã"10ëN­ ùûy½â/ìhöüôõÊ«ùùæE~Oýðþ Èö#·GP²Ñy]ò §Z;c-°ø’¹ËL“³1=;Wnjzo`¥o;ƒYZ®)+ñöyÐpc%JŒ¼”¿wIÿÞ5ú¿y§àL€®m7¶mÛ¶mÛ¶žØÛ¶m=™Øv2ÑÄv²¿×·Þ¿ê­]ÕÕU}Ò]Õk­»û^ž÷¯Ü#B³Ä’‘;‘ wç<ýÓWë´‹òå ç&4¹:°À™DýV­r V&¡XÀ>=ˆ=LßV»Ë«ƒ .|ñM‚ܧ1È:,ì¶îf5"æô ž•µêp -–W‰º&ÀÛÈbæû?‹VÍøÞ(UDŠÿß"æMµ?¼Ð%1¾©{¶,bidP@WÊë0%–C+EbÃÉŽMcõ:&( eë}¥f@)Ni„Ô®º©öƒžŸ{‰m€êe€¿É¾¸¿Å¾y.k#>‚@„xA¥Šæ``ùŸSÚÆÃ=jeÐȆùxNH¬4´õ¡èÄ­L/w$o„“ŒÞø±ü±Ó¡¹ÊcŽ/¥ýÙ¾@~Š Úó¶lgNCvò€ŒôUÅ«ø§²MËž†<]ZKAûnÞ‰²ÁZ5Ï×÷å´}åãÇJ'ç.þúGzöSa¹KÓ´v‚[ÿtGCÙµêzˆ**´—[äG»v{$¢6)Vb*‚x[–ÔE¬“Ûˆ­»š*Ž¥ò@™X(F,·¶œ“ÜP!OçŽ4{6Ü©‡e|B+ûÔ]¾üÛ±vBMŠ\Š·Ê“wÈíîs¢ýŸèëQÇÏpõñ=}ÑÀuÃOÜ a&bBí×OW˜•]™›;r°\PÎ&Ó(1-OPËÓ LÛ°êÁÐÒ )úêðh¿?¬p1Ø/ŒjYµP©1(¢b÷þNòuZbQIüûOP¼9›¨3õLKĤI27ÉK2±ã ªæN|®åH§­üJõ\׳àÿh>)X“µ}ã_Vé‹uŒuú~ñ×Þµ[*ò›R?ܦPD¦—„™±Œ:aJ`½i¿Ì{ uB ܨ­{æGžÛ±{û²’ÌJ´žö衟5z²±†™â}ªÀ&\V¼1å"’I×öÕÈÆt¢º‡%ª¨®Á‘±TÎW›þkÏð9E™XšòpDoFá%¨ÞÄ ÖÊuoÜýÉ’¡?3ä™è"ò’­‡pý1ZÅâ™SLDŒ‰Ûl!> Ýnz¢ž±f û(NŽ ËlÕñ& §*’N­½¶8ð³-¤  !5îmó=iBò‘]ª«CŽ!'Õ%›(NÚ $é5€;’útÎ$ej “ò¡,À9sÙN ¼Ïü§q0Y Ù%*q‚í8†©=J ¢¤öèÌ6P÷#\«3ÞIâòeT9‚ÓKˆó)ÿ5åûã€x­DöDê[DŸ½”t/¦;Óïøž—Wëp7¤ SF½ «¯V·t‹3Äs¸{³ô†æb®ÚîÉî¥v혉Íxt·ô5±¶l·ìí-ÀÉó7¯Ö–t¿‹O‰3]dѧ҄Uqþ2 Êpf3Y¯Ú"Žü@ž®µ¿46ÖhL}Ø×H˜°z$äëù§×‡$ÖAm¾%±8å9£8ùèÞ¦¯Cçypèÿî^Ó¶t0wv´üþfÍ-5tQÁ­¡(lQ ŠdÈIIVU”®‰ß i—À²[ÚÀ`e!2›´ã­7ÕtÁÖm0cq_§€ÙÜóÝÏ÷¯cü RHT  È ©žã ­ü~w >éò‘HGHg¼)&¹(+‚X&?éö˜ Ì Öp@\M¦ÊȘ8”G<6›g{˜:=P_œGK©Àƒpi’çßMfúyÛ+ù×ÂdXå0ÕöκfŒÃë$Î]j ·„Å™§\G› “Û9×W­=e)¶ý¨<±o:¯òú<Ñu©®K—¸L ˆÙYŒ Þ…¦ðœép{úŒ˜Ë|º×‹;ÁñÊŸÍ]¤‘‹¯*ë¾;È_-“SN‡K®í“þ?HjçÌôÒ2>#¼ˆÙÓ¨õ Ù5A¨Ô"&rœÍÄAê'¹ˆk!ƒ¹Ûd{µÚYÌÄ(ítB¿P$ë+Mjr lävéŸÎ?uEÖš«,áÔxÙ€3ú©µ#Ÿ“³)’›nÊ/Ö¬>ìåß1ÁçtùvÞ¶-ôöþ+ ]%¦Psœ½"rcµ¼½¬ ¦ ±tF¶g@2ñ—¦±‘ùÖ”_|}Ãì03mËf<Œ‚ŠúÙõr’ÌZ¨ž¼­„FæaùGט7q8’L¦ïdÐ9UZ¿òJ×á¶ãü‡NdÊ¿ü4$·'Ó±PÝ˱¶Ñ<Té’°G…ïªzc*U־ᗬè{wƒ ê˜V÷bAø‘`×¥|(Rƒ†ã*‚Ì[³ÙóeÀï†É¥v¢Mu ÿŠ3}yLqá¨wzŽ "R¿-¾ø8`÷Öºtöë¼\»‘“Ô¼”ÖÁ|îlI Z/„ð¸ã‚ÎzârA‘„°è[t„Mg?îÂ(mŽ’;”­³Œ•ó›Fs¬.6“ŒÚN§Œ5Ø)øÁòBf\€ô—F*ìøš^š‹ :âÍ<ñGÌ~ c˜^š¢Íaj„bî:P–ØL»}álÜ/ j´u"‘ÐŒ‘í‰E ‡6nio=NÎuMp®‹Â×Ev2I‚ù≂)E%0†X\˜¶–„’BÀt/¸z••–éŸ@»¼µÖ /SߣðÞG_È ÝU$ß Tÿ­‡ÔÕÙÛç?ͤÚðþÇi?ü)Û9Y9k£ ت!Qa£¤ûäÿnoQEŠAÃ@à„\d˜&ö-¨¦C#WµÍ Û´æ7ìåÛ®œVð ôºµ:Úô/œzÚ<êÞt.<Û¶V¾ ü¨Sdeæß®ßf½úò^x.¡÷~a tQ†Õy³íŸW‰ýXB“BÜ•:å7»¨p+ëw. ³cÚèÂÿ8ð 7ßö¢õ¡öÇá¾FGc©íŒGxÀ„á‹0™Ã£~ºœŒW÷>ý`ÔoK™o忾#£Ïè»?õ2öÂXô^•ãö=Æ>™ÂöŽ©¾qÄØ¿K§ð±v—áÏõ/î±vU§ F¼±ꦌ>éîò‰œ|?&ÿ9c}Ï Cc µB¤ÃÌn5ÀÒ!i[J TË™Òé1àÎÑ¢Óà4³ÔeÃSõb(P ÿ¹ó’ÅùVuX€µýŽ–ãŸ@Ožˆ^L¦á“Ë(Ád_I†úRjù‹#_®®Ç«•ÛM`=9ý›c²ÅÀ–­Lw`ü ±HÛJ±ØëôŒm-ƒWÖR`!9Žý¯…ºž"ïXª:$'¾ë›Æ¤b½Òc×¹¿“®ÉUÈ&bìbÕ¶OÖã3¡üŽwGi½¹›¿}/e<…~:°¥/ÏÉ)¿°—>o3õ •à˜ÐÙy¢;«N–{mñü×V¯9Z6Åt×–[HÉxÙ²Û1¯p’Ü_,8°ø–U¸Çs'm•$™®©‡üé¯@ Ö¤wm.®|Ù³þ „_ôÔçÌ÷òŠ2æ¼ Ç¸¡c[ ïDdÈ'BQñ#SKm\±Ø¯®¯. ¾4ÎcŽÍºñ™øB4ÇÜ'UªùP ìpó\lí.ý{'.nçÞ%aHÁh0ý#YÎàÓT •¥Å¬) µw¥Â~ñãäïH÷ÖñQ´F¥ãmƒ6Ò¶$Ø_GÝe‚+sIiø7GEcì7ñŸYþTu©%“²ªëœ5|Þ8Å=êNÉpTñ<Žôù•ð¾n]C©¦1eqåÕ'íiÕÛýyXsî=;4'¾ýëøs¾¬©ÅòàNÕÊ c=¾;ˆx>Ye­ï+?ø&Ø‹ò›q=–Û•÷QÒRüJ_0kóS¸?1&'4zš+ê7(»Zå.Æ,|lH}Þ©8œ—ñÝ)NC:!šÄÓ0ø/˜ÌË:¸è1¤ÍdôñI÷Ýlm#J—*ÿöË »yë°’˜D3msù[zr謥yúób5¸L^hŽø¬æo¦b¨þiV%uöT¯Rð…)dÏ›sï’GÓC°“Glßm`Ö·7RÔ –nth³ôôñD#Aç1>XùŸt-x³5iúœ²Ýix¦äDwÓB¡›0{›Ü5°3\ø Ýù×sçɽ´²ÅYÖRuî–ùÿRŽH[R»”ÑÂ;èÒTl½RQfÞ5Ðñ\½¥&¶Õéôû¶ìôgKÚsi­7:‰‘×Ë·$½SŸÌZ“æ&©“ ÚÒ)Ýÿž·çÖ¹{ÚZm5kà¶^¸&äÊëËCÌ¥@ú:gÑN9ê’žn4«ie-ÚNÙé’g ^o5kMÌi7«Ð¾ƒéZOùœ‰=)èj³åy8vÉ0q£ésý)kµ$àÕCÍåÙKwbtôÌ0f)î"üêí“õÞ¤¯µ¥€á©ˆ¶ê8uÁÖ*Žâþq³žs´Ù¾™¸Á’–£sòˆ‘¸ pèê Œnº–¯.ˆS ú~Ê1€U¬5bRù"«j†4Á±MVš=ÆŽÚ';ÓHE¨77^êx„±#¤•bñóéòÈw*|¸_õ?…ÄŽSGä/§>Ž!àÄcQñwëE™Ï¬zür‹¤=ÄR‹´‘쌔rå~@Vâ¹%GʔٿEÏ«µì¦—èX[ ”Y Îú⬛o®TF<°\õk^vÍ’Òˆ]>®Zúf\ØÊMeO÷tüI¤SµÎn¿\¬µ_uêK¼ ºÉûff^YÕ¯#“ˆ1„˜ŸpQg'˜#¤<™±Üðæ2š 0)±!©Ñ‘ÎÀ T؃¹º»1ó$•jòåËXö-ßxv4¬s$ÈãwR8¿°†%²àµ¬fμØyÓ§³ˆéqVd“L©_Ôk™óÜÚHš~G=ëA@"zh®f¶ûËäÎCMG–ßH/Yï*ز³ ä¨9öÄ­Ý=kè3óe7µ½G–;<' !M>UÓõE¼­ç·Zú;9²ÎK{öXª‡cY |ì·£hÁÒÕz;ìã¯Âðä”™–ýj*Á¾)ÖxÈúV×U³ï•óµÎÖ.¥Mq&4 †Hbç¶Gs™@'†­µïÔû“êÕ îCm ÖÓïÃ`ügîà=äJïuåeªRëÊ+6nJðï$èT Øn~èÔ.Õê~ïÖ'O‚NàçQe"$9zqh& Î`i_¥C ß(Ï85:V_OÜ9$4`z$S ™ð8qÿìÓ7l0(Çè$°Õc”`$]0ê|×—!G~t:ªJùî…|ü.B]((«—+J ¼; “%ˆ*Z7á "ûåPfÜŸ`f[OŒèF‡"ZмzÁŒDë@ƒ`”#•MÚñwׇŠì„˜Ÿ*SSŒˆ=Í<U$zUÜÕz(l#öžÚ™ÅБM¼&_Úd‘ø˜émîp·°¿lÖf ïÒ˜&¯"÷$LºÒ1‰YjñfË•Få`+°Š7j‰p©ÊÇïA‘ÅQ¥JË P%ÞYtã©è˜`¶»¦½ÍOäËåK™¹”Rb.kû…øM®®Œá¬šýt¬Ô¦?¿Jp¨»‚¥ªd_ TeÃsXý­C÷(ëùR‹3­£Š&ñn,òʵ¯B«Ñp×ûÕzb”ux÷× ;ú̲¦j=ŸŽ¶Í& \{Ó±êÇ–äJ“€¶¨\‘ªÀMzJ¼ÁìâÄš| {€…c­p®NüËô›ÒÿL(§&ÁpGùÈB’ž„0lÊŸZ›ôˆ;i°vÇHdËDëUe?Ïä4M|;Ê+)ùÜg3$æ«Ñ‡‡I!FÅ!«X„¨´€ÑY<ÞÇ/âër÷Èñ‰*¾(;=ž(D°Í[!œûrÖ!—Æéu;[ƒpË@ÏI)ƒAƒ¹Ü^Sè >®b\CØ3‹àóq++;´Žbäδöý‹?‡[@ä¯È•[z…ÆïoÉàG/j‘¼pg>8³¯í0±6êW»ä-ùfEàÿÕÙ¦¡>¤²›q…rJâÚ¦›º…ä%6NeÚfê[§Öw‰ÜNà?vÚ¦ü¸³ìÂ6Nƒ¾åôñšR-ï òûëõÚÞýql(@ók$HÔ=TŠ‘ˆ•j_Öî3@‘Ï‚w^‚«Œïv`Ëç<9â-AfÓ:ô1‡tp‹¦½ò2>¨á}NwÂ2ãv`µoåŒzÍü¡¸ nñX{í>Qp™:€úÞ;¯ôÄ™ÂP c`ª½¨6c9ÁK·Z&¨»°­GsÁœ¯±ZBU¦¢ÿ†³:aýTÄå/ÇfÂèlõ_; 5—…”ñµÕ'^ÁœÄ1)F±üEö:„˜ÕSØ~Üÿæ lÈ  îðGÔ‚ôã©]¨-åâðÆ’uΣÚ2ÚÁÜqFŸ„ý“ÀûöƒCû°aï¹N¯C}£ß†ôelÙe°{·™äìßuåý„©&AšïzzG\Ê%QZ×E\¢gDÛ5iùó8”P“`ôw„Ÿ‚ú <.Lß {–ëWOP¡Š…w¡?•Hu3­o¸ý,}lõ ªÛú(°ÉžÑ<ü¢Š øúSS7ƒ¹6>¿Ã ›L8TæÀv éÝ&íôd\°k¦P.S¹;/¢à…¡çÑÙs¾Ô,oÊ”jMë—Ï[>€`Á§Á¥._"¤¹ÇÙßM“¼ÃHXI+ÝþƒÐ½óŠÖÖ\ ;¬8$u¸ûKlKËwAy¡rÑ Þ’Òž;‹‘M Ê!‹/Å«„;Öv*cO m—„ ­=ia@¯ž)&ÍJY~¨j;È®Ðuzþ'㘧—Žý®œãP°Û»‚›1,«YÛÔz!\×?1TRüJMë³»˜´÷¦KU@fdže~÷.„%(ëÖ~†¨»wÎ|~}#`®Ö:k=:ò.±”8›hù*qaø…Q9XÆiù’„:m)øðòV`cÿüü9à¼<I‰]æ}Hüý³øT7Mæ @@:`A@Xÿ‹2Vôpp·U1uý_ÆÅx‘Ó´ ½Ð51v¨—ÊÉ¿ Aéc`Ê—ÂhHÀ@—WIVJIh!`–‘JSX²4öeu…Þþ­…@gÀg꽫ƒ,”ÉûßJW}(‰ÉØ»¬pdu¹]óZ´¼tÉþ|^Tƒ D«>ª@]J -fd”àŒtk#X”°¸¬Ö¨ºFµ+KÜá­Õ`ßg.g”@í²¸ÌåšùÌzž@tÅ®&§1éÎúwïwµZB IÖ­§Ò÷<œ5_Ìèi/qÎ1•=´%[ŸÖÁA;Œ?#Á6„ÇÒÜ5»ä)˰’…†å‹œxê™Ö4V¦>¥»“lEmz* vx·TSÚÆt•t[(Ëä°ë[7ß»L|à=5MrÝëä$»À܆©üFÍÕšcñËp­ÐeoAã küÇH\Å «5 M„¢s½÷À©„ æŠ\çàé1i*xî(3F:å .Œî ò+ol,&¦Õæ¬>5 Ì9&þmd^ÙŒ{¹„Y# IC/z'#ûu|g•·ç´ ǧì¿ñ•àôŸÍJŽª]Zàm +¿6éVÜ]zò­6¹,ÄÕJ%€z"®íÊÅ °«ˆ— É»`ØÑ9ŽJµ„l§Ôа$rü51^ hÖ¶‹‹w)ê¥}ó»“¡ã³PÂdòånÚ#_(>’[í‡EÛæb@XuÞì=cÊ:T'Gm{mÍ ¬r9ï°f³x§k£ÉÚÿµºAéÌýdªŠº*ºm¸?Ò·L£+µiU¡HΚ4éV“4­ÕðyÿE¥ú!HÑlÙÅ™Nòléfb_5ús —a4Ô“QNÓ¯Œy•$ÿÏNÔ¼–À.;“éyžÅˆ)-ªHZd¾Œh¶™„p®íaJÀ÷•c%4‹Øßݹ½Ï©,|¼ÝÎx©‚Oh!=ÚÑ>Ìá;ù ا‹D‘q®š"Œ4€¼!ñÁ6‚Ht×½ä…$º}‚&àùõ€T¤5] û/…ï_ŒüÂyA”œÆ 彨 [ô_eE`¡uˆ…7¾Ì(ŸåY¼ÅŒ®»sV«^øë”PøI/Ñsp¿e?ƒæÏ Ã&öP»‚…Gxò>Qû»0{#&–ï-þ1w,(Añu:3L±©?±x~o¯¡G¡IUXˆ#µËân³E”Æ„yËL yNm­SkÞ{’O'ƒM7æ;"7’"|@XdCX œ2Yƒð³ŠA(Vîu:‘ïÔné õ0„å”6– ~ú“wÊCïI®%²hWxPJj³KâÍ­ªË$B9®ás¥+ƒ²û_@p/ ~†K¬tf#\ÃŽ‰=ëó¤Ç…_—ð}7Î}¹Ða->"‡ißwÆÏ|ƒ£‡^É#*¼Û —ÜÉ8ý|yÈÕ$áæÚW³Jy«Ä#7‰ S½eÚù‡º‚CS5ßÓÎþ9å¡.JÖïlc4Þoö¶ô“î¿ïFbD«l‹Þ'ùiE2ýçóƒvõ8~æ«Þp¡ØWo†¹ú/Ÿrů²fò²L2åW”W@Y´j~B$4yuÝ=!2ðEè=¢[›ýÄÇççGÒ]þÁ7¨ð;IþýÑ“ÑHJÔ7øFÇ_ëÀH$>üÿN*ý¿¢ãÿÇg‡÷&Xñøž›–kÙ$œ¨IÒZ|¥x œ°²Ä×O@`K¶üÝHž³jd«ý|¸R¿Nx -FCYîc‚ï ~Æ3D¯Ĩ'³4j VF¡ÔJKšÈKJ©#híÙ&s?ùüò´Táw³íwí³÷“p>Ü ¢#ÁÝÕˆ˜ØuÇÓ2Šî$]Á‘ûgHË'Ú™ ‘ïiʤ4i%Š8×™+JŸ–BÊ?ò€gär„¡Ôc²Ÿƒ7Û¹?f®ä/òËå°Viê¶8Öç³ÄáGÉhxªùÅñçRŒ–Èí€ÿqÏãЯù—ÒÈKÞ«66Ö>ôý—8®QÒ&î·bÄZÑÚ-9uàå°&óˆ²Åkº3Ï]9º3ï;õ÷H8ÃgEDAJâšãVÑÀï+¯Ü×²ËÆ·×"QÛÁÎO`¸ÔËíÓ'r ýÈÅkA/ýËOá ¶Þ­4ëå¯ãݧOXâ?.¢Þ‰6Ô¨9 p=™Z9J“‹4úäŠäÔ¢[h/ÏPæ}´h°ÀÕð¯;o¥?z{ËÛëR,ÙÎw{' ˆäüö[µ:4Í-ù¿{˜ð¢õ¿£Ú6ˆ¯áÙ°é×—ðaX3z)|hôz„0تúQ ë ýÙô7'ùob¤j÷bY–¨öôñ‘NæÕ›í{™|f×Z´#ÈHí9Eé÷\jc¡tvSOT(:›*Øqì_¼"B‹­Z§ˆw/Ãÿò·7z†ëœ|žØ8X;*sXy¼¿”I¶=†×ÍSýš6›©5‰³ä•À0ÕÚ€(K†¨U÷²±î³)òJÜ UÀZéì _·_·Ä;n| ¶Iit,®Lýâ†r¾‚Ö½O(õM3ðÜñPzec4­hxA¿HœåQݯÑ?cp¢^l»ÞkU:=NöÖbb/ªRly&±Œµºuô)·ÿœ'}Û¡?Ó uvÂlͯ©ÙK»ùq`¯”ù8oL¡”PÓ ª„´Šhòhê´œ ƸC¿‰ºHRºÜ (7i·ð¼™§ï¬¨rsÓÃâTL*TF7‰`šØI̧¦ ç²èöËMÓôé÷dПlNV–Ý£U%åVÏ<-qc̹"S;ö Gd‚üäWqý××& 861qOÑBvum ÚŸó¸W±Ÿ¬ õLNv2¿¬^ÞÍ¿ó;mø¸N¯Ö×a÷o,¯ήϖÍ*®Ñ!çME$yKÏ=M)]. Dw {1r` 4=8¢“ìÁ“²‰@ýÏo8-šQRÄF¸&𭻨ç±n‡2Ýõ°S}rK1ò %§ÅšvMNÚ;µBõ”aºxWÉÚË‘¦ße%è†`„Mý…JDk´„ ·ªÜ¯]sÅóÿ4DÂs+‹©¥ÇªÓ"Õ‘¥©™1m5jKåx42¢ú¤Ê•Ômñô¥–`ÇÐwVç±á Gßä<Ú”Øm¨„çþê”-1ЭØrÍ,4i#dɇãÍ,Ù yžµa¡M˶H”°åMV…ìgѤî(^]ÔhG©¥9V~+Ö×’L;ÂŽ)ÐâÝGÊ;J§ÆPËIsb@i[¶Ùè–¨3bþsOCˆµ¹‹LìõÝ&/àšä=ªâ¥Å­ÄŽRò1–Yò­Èú».ªšÖP€jOÁÕXäͲƒ¹ë)ÑÃPš?X2øÂ¾ÔxÜ7èÉ^þ¬ì#0Y¯•úç*£Ïs†CTj—8-J›7”ÐïžxZ#°ì[µ* ô¨G¤Ýí$d*žÜëX:T| 5]Œª Qä³Ý ÆXó¸æŸð8/–É”¶dêø‹-Kª ÁÅ; aSõ)€©rz»…KñËTIN§4Ó—`†@K#ûSÆ!¦QS*«Î9óÇl>Ÿh«2/¨º»<è¢ÖÚO×¾‰Gù<öZ–µ6¬Së‚Ôù©“E1«‹?ÅO.ØThLJæP.6ˆ Cÿ’\ýêÞ<Ú!Ôš&ÔpK\ÖÕ±'«±Ž°ZCôÌx»VΧ06,Þáìãq²2Š–-'Æ<Ÿö·óQªé´#{ YÝî¨A”èä¥$¢÷;U8¬ ¬ˆ?ýê;L/uÞ»þYo8Ì>KEܼëÖâ’AÞ+²^ÅüíQùó´î¶6'ã&³•-ì;Ág ñfxºI #¾’XPƒÃ‹qÆáy/¥ŠYT¬1Ë-<6—=è…ÞÍÕe öDî„Y}>iBîV —ô‹ËõkṲ̀•Ê­Ïx€±Qf° «çó.݆Á†Üg»N7ý@ÛÊ0ëÞī՘Gï×,hÓIvrô«&Uùó<Ù˜+XDïçµS:—\ʸ’ã¨oñ©þÏm û¼u¤`tE]°ïž^ò š§ˆíƒN鲌WÉÏŒtaq(z‚ΆàŒÊ/m3AN†GäÜŽÌÂSˆ¡—0KñH‚%³v¦O‚Î?·H£‡†V3¿+žƒi×2–‡kÓä"j}É{]þƒ‰ÿ¼ä÷Ð:¨¢ôÛŠ–ßäUÙ‚à}ì—TîNØÆgŽ?> ÷HpÕzaï3¸JcÄO×XëÚ¶Æ&ûKš€5;"w£Àî°±¼÷I>¸.&x!:׆‘¡xÍ~áêIZ>…2™zñ™%œéüTqøsṳ(Í¥¨ dE’Úf„–-tR èšl§ºuÑ/š)¤A(ŒCßiiv»³)¹{ʼnԕº¨¦KžBýϽȭd_›´Ú‘/ÝcÛ¿ïåæ(>a¦8Ui¬” s¤g+iš¡´f0RÐöê"8"EÌô’'SD!æ ’R0JL«ö,ÇLXE“Mò-0v½à²÷Õßs+°ÿYÒÔû ㄬ'„“Wƒò I›åÄ^Òé+C`/èôK—â ‹«b‡‹ ¡Ø5 –;<´Š§\ÝÑ*ÓZ ±Úw¦K\Žâ|äïÄvX!Îàûnç]TÎjnæà:ôÊ{EÖ]q¤¥<×µSÖ N†{Ž¥£©+bÞâÕã¬.ærŽJLÄÍÈ,{¼A³=Œ{Ÿ?ÎÍé£RYpÄ#bÁ¶8Së ÐIG•SÒáº&Ë{>˜åCH>ïÇ3ÇÏåümY{Â÷©ÜÊ—¸¬Šs·2E禘W7÷¸£þ‘¨Ü>/0žøôq5ôùRÏì·op*{¦X&es•‚VC$ZU,nÞË5,y$«Ù°ê¶µ¸£zcPÆEº¯d1óƒMº§ôÉ[X|ÚTl„›ËˆßQðÞÜûæn *é5.b–»ÍÚêGõϺ\0”œM…s­´ÀÖ<—}ÒJ: £z”¯U;½] C¿<@s*&:|å‘̳;FÝûoaàz–Îu]x½ÒU~þ˜ï‡ºdEPs_ôŽM´Å®ÙI “:þœFšòi2Sk§¨i›á1¿$nÛl8´€!Wh% ².dó8í&Gþ>z¢gÙéÿ…°‘À—çh)¾9ÚÈ¡ d²­89‹ í£Æ"_ÖTÍ.gÌœ ?$3à¿¿éf?Or(gA .ñÄ!êO12^Y/N¾‘sWÄmÎY­fA¸¨ ì$AôŽß5ü,•=B‚Ïk}|3‰?MŸH³‰¾JñÆêƼ°Lâ0&ð%»Ò¬± ®¤G–¸ßS¸Œk,BP¯7æq‰/,QûøÆVg¼An1E'â3ºY¯^W/Ä GÌ.D¿¢½n×¼3œûSð ³:S&]°5œªÇ[q J;3V—ZQ¡Ï ü#6Ä;qsjÜBÒ‚¯WCØgž"^G$;‘â$HK·$G£ª¾ÈK)¯d‚‘Gîp‰‹¸þ᳇¾Hê3üÒŽ;Œ/$ê3°þ"‹ƒÒC11Z`a褿@Íò!¯%o¾¶ÿky3ÒžZý˜®%xDVo­ÃpGšákÐ+í‹§b;ø†¾`˜~’Ü[Ó£Þx$1µâÎÜå4mé5š-®€ŽùñÚ[ÝÓ™ÖyÿtòÃ[2°ÈÎ[zåN¾ d@MñS//v¯þVß5°Á(Þk%í5´é¦ ÿ–º “¸2 ºÚ¦þŽAöĤ¶ì'«‰ü[¼¯ ÷xj ÑÉO×JƒZý;ÇqÕ\Š´ "ä?^:-ã"´'Îü=2u8ˆºA†ç‡Ëƒnîð’ßã€MPäñr¤#ŸË«‚B–õÓ)^W~•Á|º±«Wz ºDiWa¹Tûª¬£®‚0Ñ® M.ôëýi5=A¡Ù3½éþwˆ†{›´±¼ÎØãÝÁþOü$ù+9¯º‚ÙùWýYÚÐÙE¿WŠS]P¤JÄWŒëãÅwË6¸_ãîN¹ª‚¯~'GµÙ±ÊFõ© Éã5à¯q©FF;‘e$÷ÿZ^ 4,jNï|üƒå\Ÿ`‚B @Ö*ÇQ]ä…»Á#½‹·¬œQкõ)Æf¼a¤›gÌ;œ´µè'ííU9í+ÐßX"¸·k –TÑ+â×@À›r}¶eÔËf©æû¼scó5‰Xs9T“ VLqV«$í•gļn!c©nÆqÏW ¦ÔAV"§·>•FÙñYØÇ­ mÑcŸéj›¯Çr¼f:¦ãñO"Ó”)USþuPæÕÃØW´äÀVûõd×¢Ùð0Ã>ž|6ï(^™—=ÝsÝ´AiBþÎy·`ûªûå‡Ó¸ÒûÕjÖ.OUl|—dZ*Ç•÷Ó¦[“–Súiîdçêç'å!GˆRÈŒŸº1¶­n•Hi¹}O­hˆ­p¶œz<Ø#\}uJz_ZRçÿ:³Nc:Á³*i^ÄŠ/€4Oýˆ&Á\ß}ŠïÆ_%úÆMã l(r ÒÛDZ‚¡§_ÿ©fÙBþ§èÿŸ%<ÝQ³6®Îîî¶NÖÿi­ös'ÐÄý™bË™áplW´%™§|LºtB«R#aÄÔÓÃW€ç(k+L—õLVÚØmi)*Òðo+$£#Y$+Ò`Õ¬¦ Õ°qü--*y E‚ì&ð þ}7a‘Òj;›”›ò±3ν÷ò‘ÿr]ôrí28áMCÒžaéYÙ)7_£éOÓØóv ÓFÙ'ÅÐ7ÔÈÒÿû±kœÙìBIMWkÆ×.íÒWÈuƒºMsÖAÖI’gÖM“swŶr# ï¯9ô£sŠÝ†¹ŽÚÿPÍâ×¼Ôº/úŒ4ë”G¦G÷%_WðymZ‹^ïÒŸ~N?¨xÍÊÜ!b}Ì0y‘bщxëTfxŽ>8¥»Nܽ;lBb&ã¡)7{‚ Ä·ôÆIŒš‘Ö$P»Ë ù¬í›Æj†Kµjr`^oOrÃPØð¶¢Á±Ÿ©5ÅìÔšUEñxÑ›™B„<ˆÇ­ùBƒlJŸñíØÍ\pË‹?mwäÚÌ“„“3P‚\Ú^ 1·ÂÓŸîÐw8Q°Ž1qÜáƒ,²ÔÊŽSןÎmêþíÈ~Ùæ«D ©ólQêPlz查bo01еôâ²bܲ]òÃ{ˆØÉcͶå8Lجêݳ9“bb!mhãX+–:VÇ|Ó³’`«ª­%…¾d¾foéž%S¬uC 7¹'¹æîxÏ>ÝuÖˆ®t:,E“dm|\¨Ìvõæ ÙÞf Y¿1ÓóVËXè¥9Kn¢‹(mKÄ™-r=|¥$H¶¯e6]Qi:mZµ2êYq8g2oL›öq‚Ï—›¥9¼ç²+žc4<¦fœ£~l¸E%4e¤Wbá!GTó ‡È¦G×Üz`U»›ÀÖ_„|aY¸¤é-ûׄ,ú3²C¸“89o]¥w+9=­QJ‚êŽX ÖE…2xÝQÛ­z¦ú;v¹Æü¸¬Ãå´í¤r>3.4kþóB˜rd†Z‘µÛ\lùÜþáêòŸœ9ˆ‹úwÜ=·2Ê@ÁQÖ4Ê Y!9ÅE¦ »ìéö•¬%;ÌKÏÐ ©GGD±¬N›¤uÞòø«a<­#Hö˜çk4rÆîƈ¡4Ÿ㑊&Õ9RêmªÍîˆÄ’pøs'ÄšÑÃ̦>+Û¡éRIá¬\muùTˆà c·ø@Ì ´ãtWÆp.VñÛWÆ|»Ôˆ½ƒºïƒDo½±Páj‚2Ôæ‚ÕSIÕòq[Qý?üw\äõãnj&½Ïl‚s)‹YSüùõèBZC۲ǘÌÅ”éH:xB±s¶`­¼ê*7ÑÑÎ;XΡ %Ö‡g€¾T¥±±ÒÎOHe»3 %^>6à¡^ã.åKQ¾Ä´f½Ÿ Žî»ü@²w4¡eµùPWp }¶t+ª¥îo˜@q ?VÙ©eöç'!³ýk$È ™‘ªŠÛ£¿&K,V36³“6‡äˆ0dºö]vHŠEüøŒoÉï ]ŒŽ€\‚!N_u>É‘Û䈵»÷Ì ¥“ež>ÂtA¹ÙÖ¢¡–"Ó–AÄá¨3rÞªÆOý‘-Ë’¼é‘aúš&m°06sÅš¦·íb †…žî8?×€«Wø§ítmíK¨•¶tâöÀhÓ6ãpáœLÂùЪvˆ;}к E"øÅb3.ü ¼‰Z ¼LÚºÔ¼²à“l(óI¹G ÕŽ»ôqf$žyîÚ`Í­NŽLØ Ò³ßpðÎKióM¥ZŰ"E³4¥{¿1sß~Ë Âî˜-Êc-êœÌÎLOïŸigÐï]·Úm>¦7OFô˳ߎ7˜*¤£pÓ$ÉÝõ5R¼5NcóµêþÙZUg3ÿÝÉEd¨lñ%c÷a]ò²æ]ÞÕr‰+‰\Gq:ms~8]€ûvP¿eM%!a"ûþ„‹ŠUTÛ•L®Oæ bâ’õ‰NR:ðê…æ­?þ'F E UHCñLÚ+ƃ覷íÑê :ž…2ð,"®¶ÆÞˆÚ`]h»Yš ‰V›€C—æ‡~Ò‰læÉP˜'Ù.€¦>“ÒaYb.5œØùs4åªõ^0M¡¿ˆäWq_’!hü6%.GŸ‹Ó±¶ºçØL47kÙîZM¬^oºî5˜N<ê%^‰qeN ý¦‘Õ7lçN‹€A‚ÔYŒÉbR›ƒcí‰z¦kÅnÍàñžÅ²Þئ'5ÌV@< ÉÓ,ŠDêï sg¶zá 9E´‡¡ûY—%¨3ãã êú õ㫾.Ô’ó<;›à*wÜ»ã[ÈE»ÃÎY“ŠÞ\°ÑÉLË N›­FxÚ.¨•f‘ŠÊñçÙd ´Ë ó Æ2ý5ŠjHò©Ï4ÞKÜD%–*k%|<ÐD“>~öÈ0Gï«þ³aõÎEbkQ¥oƒÁ›óà®W¯d kõçR†Ze Ž ~$íÀPGOBmHiÔ¼ê/É¿ ‹³í#tÍ"Pލ)ÈVò$…è<ä+‰óÛq~U#f07×ßegã`Mô÷_#Ÿ?œ4¸Ò¢òšòª“¿ü¢éä£i”÷N¶ÖXö‚í£žô\ Æ£ æ¢vþÀuÂÒ‚êÄéëdu4;Qÿ¶¾)MvÇ—a?«lú{<Þ‹6Co5­%–Þž7"{ýî‘wð®:¬EÒ•8«ËEÁÔ›xbà|˜ @–Œ×ܬD;›3À§ÕóS=Éž7$y§«SÍG²=–€Kr¢<Ü–Jµsß¹ÞßS̤½6Si}ZóŒ`³åí tùF©‡âäð3Àn3?Âöçãí]ãÍ]Ì»ö:®÷½È.°à{¸jùhþ(¡óª%ãmÒ§‰æ ‚r´•Fx’7óqj ·Óоƒ‚2a¡ô×Jäµzå—zÄ™å%¶C¡nôhD{G$š I‚#`DHz÷þѤ?i¤2t†E_ß–r^µ3ƒw´áÍ\wA+âàwRÔO#›èU¯²-OÕ¥¬Š¥ ª ©Pf“R>àù†À9ï\É? òfô{º9—G¼(á[`w¯y7«F¢Œô•^†ö+“¶2¯Sˆ/uS¥·HûfÌ¡,µ,ðX#{Á(OŽHwd06ø,¦¢ÚÃùò‹y.4;wfM´ŒÎ ›hÚTr?«z•aðo\@¨Ð3¥{TW1¨êàn°w~¡XC6 µ»KˆÈà “6¦idºÊj7Óh¿)2§þú†GôMbxÇç:ïkôNX½a1OwlH홚ûwT.d6gÿŸ‘”Íö8Ä 9aÌf¤3û§&LGÚ­$•™ï$—Ltˆ6¯ò|OzŽÑ 37›ÕV• uN ö|…pZÑóU†õHª“{± ƒ—ä~>g6Je\“L°ú!³º‘-gžÁûý±Á™yv’;Ù^7€¬É5ýÏ‘r'M¢ì˜¾ÖݤÿoÀ crqw‹$µ°¢ÛlNÈF¯R ¥‹r¾c\¯\61yvÔÌ7ûœJ‰ÍÝ×u™èˆbò/àž¬ñ³sJ!Úê   Tbýq”_î,]ÍŸÇl¥ñêžèZéd5™u9ÔÐþ½#²•±„í6–¤VirÉÁè-:T4P¹M±í­#‹ó“µmrƼÙ/Ž‘ï¬=„c¢÷ÖóËTe©9 0øþCÒ觸 ËQ/I\ÉVC÷5õ7¬Lb(’Nhx<·‰¨Š'‰íŸfb‰þ˜8Oå!ú§ìXåö4¬ƒ^´4ì§:fÁ¦±Œkÿ¨6\¿Ö¶?yŽ毑\Ž'Æ%ÿ'=ÒÆz¿å Öˆî~ $øK:"W; ÛÉ äàwÉå…|²óçä— Ó‡IiþÉÕÝÍÎk[‡î¾JîŒê‡àÚ)…EM¹–Ånþ]•I¸wF´Ð:åß©„Š3e5"Jâït+u÷4ÐR~-kFQI+ä»ÝÁZ:£]Æ"5Ÿz,ªþè{B,sª5zp®3e Êwþ–Wöo43D÷~ý¡_^ôÇ%Xºbeï§ 7éel-¥\œÚïzÛÜe€O2-½j}0L[ò®ŸÔ({²0Ó¥rna¤ÕÛå¤c1Ñ¦àž $·ö¸¦%D7×S+èæ‚+Á4Ö§-ÉÄn¯íyv.‘EgÑbõ»€ÊÞÕ÷ºÈÞ Ð®ßŒ=yz˳’Û­¬)Á„£{^/í æhÆ­8вް„>tæ|mŒÆ}*mú“~&g3Ë2ú†9WíÚ‘]°¬˜×3:¶ƒ2½–Ÿ›ë\ÂüîØÛ«k‚Öçòi Ôå¸T€Â&òò·xCÝÍ ½Dð_ðßéó`“ EÅ&®äŠ ‘ž·>8¤‹ÒÑOQGf‘öT§b VDÔÕ @›Šeù‰P‚¸Óù‚BNäî¢\›7¤|:È] Þ:eÐo d§Â÷Ë…'¾zîn¨ûz¯#lïuÒc"À†ÐpÍþ¦Æ­„Õ>|@b¶neÝ ÖÅ$ qo¸H·;<§ã1â.ƒÝKmOÂ;n­½ã-W*¿žOkgû®.|럶‹u–H?,m.&Ý.s¤HpHº—$,\ЍØí`R‡#ó'„“£8ˆœ m;liÒp‹ÿì”7rwÒߣ¼âgÓÈDZ"…QSói·0VçХ惲cõ¨Cšs'¯×‡}VwÕYg‹„’”\Zƒ'ØÝÁòëÕ ›Ì!*ÏœnokUÂjLì–õáOEÁ_ð­Í^æ˜jyí¦‚È6Cã·ˆ{첸âîÞÀоëÜ R:·õØu¶¸‰jsP^Ü„]‹"æÂÊa$Ãu97u˜™UÖ!qÄó]VŠ'˺%1Cf’ަèVyÊœ¦È3.ïEÄç5 t²k±iH‚¿ÔÊ)/=qG¹DßÊÛâ_¥Ðü –xŸÑÀ#óš‚øéó|iDáÁÕ‹Ýë™7ÄoîÛiëoeè§oÔ!ç£ù (á8I‚Û Ù©¡Å½1Y×Ç ¯ŸíH°[Æ™<ÓBü:åF¨b~"o¥ÆkbÍïÓBTMá’ æ?CÚÓÕ YšÓAÎCœF@Ô=÷ÃÍ‹÷éqâ‘`„—S³u`Í%И t°á’ælcÛÈß “8‰Yˆš .Eì?ó©À…G1Èÿ±tÿ7l¾´,ëÿš·þ—3Šd¨S«—j?U&F;⩪.jWM!â½—žr•|•ßí‡E*ôÁíÿ”5Jw7ôÿ‚F7¸¢Êã›ff§³¾¬NøÙ[„?Lç>PÆCÐx)±ÒþŒåÛîô,µ@X_ýqBB/ms%î oÊëæÉÁ„/ŵvf;¿OÆ—óu¾&éLɢɀs·šö]8Ì"È-Sœ®°«ˆ{ºzi­<’žI-´~ÇÕ0æ©Õ,\—ŸÑãE†^ºùˆ#^×Sêµÿ9[ùÒ€1q¨:’ž‘‰»×œF­“ï`MÏ v4Ì)ÁVé<}%Å ÃÚ3ŸmæN-—{w²TCòCVáG™ QàÏÙêõªmøZ¹ÀðØ‹ä™ök{‰Ý“ÚcÌ0jcÃaÌàÝåšÖXRÂÑ~Q0EÂãQw0(Âö`a°©…»Û-΂€héFyq‚"¸ò]\÷n’ 8YŒ;ã—×Ôx/Y÷€¡_Ñ)§_ʿߡÝ@eŸð¡9C#ýFÎTxÄ0¦µÇ\#(í²Ú~Šç¤ÍÖßÐ÷{…L½AÒŠF–˜rãeP(%1•¬™]?ëéÚt;*=ÿOkgG¶­aœàîiÜ]Cpw×0w§q Bšà…à4Á­qwm:Ááå¾ûî0áÎÌ›;ïu¯êUµVýß®sºNÕ9UûìýsÁ^ôªÒ¾¢j(¾ÊÎ0O ÞF9dÜt"5Ir¨»ÁT—1d³}FÎ,™nMnGîP`7xñEãI¿íõ“Út†¬ž¢Õ<¯¸rG¬¾J N¾<8a¶N´Ä™8(â–o;F?C·÷Öñ~xIÎñÏ!SÏíüýš6/‡ÝGÚžÝÜœ!çR±ËäD^ cF0ËHL#‘à­Dá:‡¹étq`B»5œ-R£ð84>}åßÈešX‹‰¦ˆæÓ«󥬦S3aQÛ]™w×Ö/³³N ,”VU/ãFÒÙhî¿æ—Ép®|7_S”Àþˆ/òCž¹ÉåçÜÚw³˜Ÿߨ84tR«Q„Ûzt7èÍÙªdLÉ»Ï×e X Ú•ê«?ɲ´wo^PÐD؇¾Så)Ò‰lPæ©èâ5›;Ò“Tø…Gq8ó„×ìë4³u`ìNúÎÅØÝdõìV)` zY2[¤è-_ך, ŽVŸ¥î¼óáî®éc59&<yE·±AC2OéÕ},‚Ü”¥b…Ð0y~ž­"Bÿ„ª‹Lp5wiuYQeiršª6¢p½ê*8 IyPQÑBÿÓà ö%<™‚×RhQæÅlcÄð˜o ýB<ƒœT†^³°’èŽh°ìí–Ñx…ÈyÐd¨’@Nœ0&…sÇ4•©^©¶ÊxÒ ¥·d±3ˆ¥âœ²’q6ÐGªé¦‹8zФ¯]4ÒšÕ±Óí^kŒNe—dѰ­ËÖ?.’(®i5¤õB£ê~¦þ 6×µµ [=‘3Œâ·´R˜#m‹¾¡Ëº|àA™··-òµãÃkŽàúÒ>Ä=†="ûþ5(wc0qǺ÷sb\ú‡¸"+»è qPüL—ˆŽ‘”Ú·Ï£òäCüœ«‘#”öÂd[[°ñò_Tˆ…åÑ7·Ë´‹éRJ²v&¬úÐnZŽ}o¬6KÎ7p«Ëï,gQÏÁ†1=¨¡òülŒè$º_B*Z˜¾Ìd‹¶$h¿}yÎl8ÓÓj]þ‘´=Uü8ø)%îF€ñŠÄúr'¥8¾« ”ZqûÒÂÜÍ=ESáåbÁ€úÜåǃ3ø1§òªýø$³×ˆ¶€OôÞ“¹€˜Iþ.ÔË!Yú¶aÁúíu¦%·s÷:TûJb'@½U‚ÎÞ¶+Úþr(£ô¹y¼­`J¤ÔŒö D ª’JÂ=týÚÄm­º§õZ¨ˆVèºÈ§èýPùQÎÛy|þ5§hF$mÊ`´,kç$ÉùÎÄâ‡qàÎç'·K„¢è#óPÈüÔ9clíÕžQÕ(ÔýÃfÆü’b˜Ôs4æ Os8€âØYdؤÉWjÚY5w7ÝõhAnYï…<ÁU¢"&öŒµË£ºV1ýgÏè£ @€æ±OÞ_z¡ þøcð-ݳ’~ ×H9ê̈®ž®Ä<³‰]dsAÌÄ9Ó§¡=’ö¾É Nh¥=ªŒ)±ÎƹyOC½fÜ¿ó»yh”‡z}/‚Ù¶ÎFŸ¾B~.>޽ºÄ€)÷’­“¿’÷­ÌÆ:´!~tðòK㘪b4%k#7ù®~ð‚«äKÔ-d¡*¤êÍ5,¿LÜ_øÄ©ëIaÌû¨¶ã‹^| 5 :(1£Ü5 &u"䨙•ìQôÇDtoÎìnXUßC§1o„%ºuùÂXWô‘/ÐË*R·×]H‚s>Î9w*}^²9ÏP$Q˜a׊mŽ®¨J¿7†‡cÜÜAÍYuQ:q m2Ö´ø’WÜ‚$~˜„´Uv‘1ÔÏ@üNÏß‘­zèÍ•ømGn`"Ð^Î"3>o¯lúŸàg&Ða‘ã{ûÍí|ŠAiùz‰Eˆ¾–âÊâæ•TÜÊm¢ :‚y#ôl|)åÌŠ0D¦ I ‹Ã¡óYÿ˜ëü Êmú3ºª™äº¡ màMùÇöÕ¯ˆWúîà®¶ž3œÇ–7t85k®*¥'çìå8NÓ5­žÆ/¥LÀ ­WL¡·ƒÏŽ¡&X7‡ëíW8¿\k¸¶wÅ­W`|)c¢¨x`v[‰qûÕ}S"+r…YÏX":ã“Jœ‘)Æ_&: «»¿{yƽ¼‚ňÖfwô¬KÈåx¥½ó02ãÆáÈßü‹d— C,£`Æ\^îá*0 ¿Í‘…21>)Ÿr«°G_a!ÝÕâIcí!ðùÊìÊÅT²«ŒJciØÊªq¬´5dÌ„“ó‰ÉrM’çr¸§g–±ši}eq©KÇXGxz7‰Ì{IÔ2¢òªI²—ó»†ÂéÕÖB°¬¦"p[m)ݗʼnˆ&r^eU›™§C#¸Ôùê%s^£S0“!²N˜òà—ìw-sv nŽuÞ wµØu—! |ÛWsZ®Hnžä.£{:V.”(Íl0?zp„¥·Çé¦äT¾f„Öα )ø>åêèP V–ã•9°5Æ>™ÆF¶Z1”h·-vïcñYv}šf| ”ËXÄO§?Ó)çè=*gÓ'µ¯A§,_ù$?Qã™ÐÒŸÔz,* “Ž.3¤»p*žÝ!•Òaé½ÛðÕKo”"¯æ±·*Å£@ŽÞðn› ]ÚÛ“—„g㮃°ü^.ÊÙF¾Â×;$·㨓2J%Ñ\Õ{èŠ^ ŽÕSÁô|Øn]¼zÎ^²NõʉtG¶¾C“ íS×AÆŒyw)?ArD˧ò¢¤àtµÔ'Õxr=Jrˆh¥\xÛ ÌÅ…+4·è‚\³5{xd²õ³¥ê<ïÌOí´y }ˆV½ä4•Í•â^ø»Æ¥Š š´ð™V‡`%ãXzLc§™†á©b!lãÍqÏ…T©ÕF.|Xv\8+œðöê ߉¶ön”µXdL=ö ,-ΜÎ<ɰCcÏøÐ%™ó¥•–ç4\;»í4uòɸ£úW|¥Ž3IN·'ÞÊÆ¦Õoo¨ÈH¹×íu¯Á^¼ŒI™¾ÎRÃ×=çû ÓÐ’„Œ7ö_-9Sk‘ªqŽª’îй±QvÏw¶¥'ZóG‹%•¸Ï|å„•qhW˜l•à;¾œšÄ¯×iEÒU[&èídù«¨ßf¯ç>?—¯H†Šö§f®bôöIÒÎ*U$ò]âIj“¢bCÆeiâHMŸçÞ„e‘½&¤GmI°ëAeÍp÷[$Ù~3¿³'EÌxzþÜ¥w/«,³WÅê!¼íà¾"¶ƒ÷•$gY¦À ÂÊn£°U¨¨)£#;{]¹µFöPì@Ûð|©ç*^f\jÎÉ2%Ç Qðš7U¸ã”>È6ƒ/ýHÀ¹1r á:µ ëõ¶XáÜäNdÑݧÏW­OMMdŒ4gww†šOr¿¡S ¡e§eùGÝL-ãÕ_ùi¡ۧȼpúÌ•½EÑ6ÝdÔêeŽýXIn·æ~AÐ6ö†DbÍ©ôyw"W¹6dÂ,4rìPx®¥gTi@Y‡Îhœm(¥k%è§›±+(œÏôgÏæ LÛ->ªïÙèÃøP‡ºTÝ9öÞ;ÖV¼|#æR·ëÙpˆÏ«†;™,jëÛñô ÁܨÝtª œo˜´è®i²“4]Œ€ ¦ó Ë£©S—Iå #Iz!·&û*éÛ7¡¥8F‘ÁìaWãµ,ñŵ µåT›©ß?6<jÊé¹9Ë úTŒ/—›eiW¾µf^jÆÎ Ò¤^¿ªžv_}ùT”ò¸IHä•Ì—YXúp[*=kÖoaÓ>žÆh£—+<‚š1Õ[Z2YõÅÞ&‡;¨}?¤pšY }UÕ »l®ì!ŸInRâ¼Ö‘t§—'#UVɸ‰+aÔ‹UP ¨kÝBîõM’¯~&ïÔ²ý!ô…n%øj#Î B}&NWÂÈÈ&j(!¤,ç4·_ÚÎl+@®óë¾nSÖ ëLë4ÌÄ0êí#|*é¾Rùå®-lÛÅOWÐÉšV‚m.„ ™µrèq¢©?ÔÙK¼¦|ó¶¤?'%ï*p­ºKÊ?ò,¼H÷Ò_Bx~õ‚. µfãJ®S·Õ["Éc˜*2‰¡­ÛU´Ç$Kºd*`†ƒtªáó`2Ù¸…¾t{kéö6vSßLÔ‰Jí«Ì¸!/-ßgÙ’—ï̹¢s¶I%JwðÒ=ƒ•Ç|¯èåjK¯ztÏ7ƒsòš.‹ñEÒ¦µÅ¤õTEìÐPNÈnžâB‘ÄP‹i·ŽŸ¼µ]VOg¡t‰´/ ¡´ù¶'†šC°ÃÍå¢[íç%\©„o?öv«ïVª¡Ù å0gŠö$wlE,@=ù®™}K_ÝW'íïÆz:ŠÜ­µÍwE«6Vz1¡/Z4ÆZ’;ÉŸbh+^A›ˆ%Àß® ß±£ÞVθ°EtÊã¬a–ÎÉunQmÆžyî‡óm•B) áŠ3׆YjB}üh<ªîìsi~½XeçÆc<8¾”Mâ7G§Œ÷øoBˆ!I4ûK*[†¨û2›–(j,6©Kn\ÛO6<ýýäE£H.vìê«@?lþ"¾Æä/p5Ï.ˆF¡N-‘×GÁ§¢7)R>ï•KºÃ{ˆ"y‡{i…ðÂ’Yç2Pº¯ð„ÓÀ0BSÄU> Ó«Tõy¥¾-¡…¤b ÷ÙÎ:öÎï_˜6M9¨&ýIKá SÄç´>£§ðìV±Ë[E’Ë×S3'nº ¯«¨¾j0]Ä̓¢œ\½`1¬B2õªcÑjfæÎ™íÔ"õ§ô áxæñû1üšƒ«~±~i?â^g_PR)ñ‚ènãù¯CÞ+'çñyk¡µúG­.ˆén>vqû õ2à y¹W'Ó{žY†îz~B‚©åÃ.Ál—Ñ«’S Ýü¢ë‘06 ižHð†ˆ]ðAÀC𨙢ï`fp%×,â­Üº |µ.4`ÇutÎ=ò¶Ò5‚rY‡¹ëFêf:óó‹?,|{.eªÆÝü½Êš3*bYÊŽ°ë%,ÄR):(ìE8VBYÞ•?àœ ¦ƒúžKfGî#oÙç5f~À ”ðú¡ä‘°mRØM+A'—ÔÜG‡¾³)]ÚýãsW{fœýtMñøQà6Óó‡S_ØÖ“`ä0ám‚ÐvìÓ*Ønš} ü׬ÄÊÉ‹dÔ`„‚µ c$£0tú@?²¼aM³ªÑgÄú™é654KE /ÇM¦V¤TÇ Ü®ÁWÐë%}/.W_±< J›™µ¾cWßl˜?ŸN _)ãuš’‘&-"[qK(|WoA*=ƒü8ñ\*ŽujF7€®®;-´šh‘;D^Øfº9«.ª$TŽ® ȆMlÝá®f–#IÒOñ*ÜÊçdíVGùŠsM:%—tÐ.Ë -„ζjjU)ªŒYÖzéXUõ¶|¯°…Yó¿­Ú•ÃÛ ½Óž-F¥¿I~VõÞ F«)®š‚±ªQ°)¶F•¡2jDÆ.õÄ,Á|m ®lP ŸU ßž»ö0Þ jþP˪IÌŽ–Œ=†%ãaé¼ò:GfÖd+­çú 7°†O÷àáÎwÓ¦[bÂcTŒä”pmØ»9IjWÁoÈõpìJcåàW¡’'x‰ÓÔ _‰e rš”C²— ðšWÚ§ÚùÔ²È2éýç‰Òf–DT½'PÞ¸„Ðy¼í%²’ýÅ3EÞEŒÎCÐk GýyKKw¯FeBæû(ýþ5¾zxÒš i²Û bJ‚ñÍv…‡©)JŒÝy;@ùò¿X]5ßžÐÕ)äçš —HÈ~ÄÈ;Âð/Ó=¸¥…hp9|p>dà_wuwíOðg1ñ´Û­îß®,ºÌº"yµ[‹\OÎŨ?«lPðœ=`þIŽ‹·¦V” 1UÚS¾*ÆS²"Šñ£ÏÆRÐ*HR¤š#éœk2ºS!tQòoïÆ:òV´lþ„ú›ÍÝ52òe%Œò:¦ æ-y»4 ÓªÞ®_ ŽQ|‘º]æô‹Ê‡=Â_ hë9u—è¥{½Â8{¿§ÓžÞÉ`O“R²Ú¤šÕµn/„:R¡klTÞì Ž„VÛ³Q½m•Ï}d*¦8§÷$y9qݪ»¿ª31~A<ýŽÄ'Í/mw’­Õ¨­?fÇX¸¸FÓ¨w➡ߵ?‡„í ãó(aÚnÀ§mj0kÎ/Ö~óÈ×P0§2íáøðjãÔȦ-±?E«Ó’1æ¢Õ’1üâä—ü}S¼Vçï1Z[:.Ù}NC¾ÃÙúKù#ÕõÌÄÓv0A0ÏòQ²E´>ë¤g$£Ú\¯s‚%4ô¹VýŽ)2U5äv—¾™¥¼eTpŽŸ{Nph„wbÍ ©íPô§xüÆŒõ‰ÖÅ5ü&¯T­&ã¯nÅ~Ç–ž_LáKelùgÒê60›2½aÅþ×јËîXËÑ…k¤sÀÍD PݼëF'³JÃQ›ajáœWbž™°ÒXñ6XO<ÒÞì‚ ˆóâKãEÊR•¦¬yï¡M EÕ Š×‡×.¹‚f ´ákÖ œ6¹ÂÇ×nx—ðIË{#Ýõû>L @ô;vÛn²`3©X…‡nRìâ$³«ÉŽ(Ñô"t»ðÃBcŽZ»œ ðýæRi1{Âk %yÛƒ³¬%}È9mztˆH—ºgR)Ï*[ô Æå‘_W=TL8b²»Qo¼¦ÜÜwƒYV•ÿtù0´Ž$»qqLúö×y½ppbÁãá~óÁù±¨ÉéJq(©Ës9™yY9sýñÎ4ÿ¾³‹» çÿ<åüg^¿?–sýùÿrü–ð×g±©Ø%;S°ëÓààÖÑààýç0W'N'ÇI=/ܸ+«ò€/C&ì×±vÀÅrš¯‰5]z3Q¸b³ÃâºÇ_E|j2±K’Ü{²{ù²yDŒmâÙ?€'»DÐ¥ã‚#=iu…]†¯FíøÍ›Æ0"RNVL‹¡ óTH4—²èæ1"Ò\ìb'>Él»ò°²|ƾR¿ÔÔÓh;³“îâjNvú¢&¶”t´?²º¼zòÆO€ÔW=áj½/Ї Å!Ãg,7„ØŸÔÎìºÚ•Ùsào%ÌBo@55ì*ïÏTooïñ&?,;T•Bp5Ã~؉Ô)ξ»(sì-5ì­Ä#vãî¹<ä97SRâ5cÁzçö£¹Â_^À8R ‘Þk$°dKyK^WZQZŠ2¾WW|ÞQ×PV–‰¶Í —Ÿ$g—Ó;§0J•£D:73Üë›åõ5ÆÍæõz€¶ûÃDß¹»­ÿIàJšôyýJÕM^ g¿Oâ¥+•œ½ûó|Á7{€uœ/Òþ†-èï6 æXä4j{¾çï¤qfª J›1:_^M¸]>ŽÐ@,Ų~1=f½24&4Ük¤˜ê#%¹«IÖͦ"qeοÅzºæm ºÍÁþ¤ä»f°ë£óŒ¡\ú¼U»ÍíW…Áõ]~3YpÄëí†öMÔ5Ë»öQ@ºËÁ«N1G캋¶æIÄ–…×}N O+«÷;V‡¤Î<ØªŠØÖ~›<蓇Í?ÍðZ1EÊ o] êò1ºü¾Ú&»T2]§¤çüf¦âM÷x‡C¡ï+á…Îú<¯FìÃÆ‰ÑYÏ:â™DJ³ZQkžé&gåâi¶Q µºý¾0ù5ÊÝÉ.ú£åìB¸»½lùý£%ý½“ÝÕÝÅÕÊÝÃÎ ¤ã¥1¤Â¡Ì®¤¦¥X¢{¤Æ®2´ªÝǬwÄ:¤Ã]§ËÍ_ËË]Ç+ ãŠ…­ÅÍË]µÄªÂÁ:<8R+0Í7Šõ„ùàûβ2W?Ç‘jõ—òôÀ«’rÙÄ€2Ë»5evÖ>UUNxåd(¨~wm•F8MxBÄß¿ ýº† ·/÷ÛÞÉþYí>¹E=?¶á,¿AQ\b®9ý£øöó!ùkÙ½÷f¿ûõŒ„*äF>÷:û/·á3òºcÊZ»Gì¡}þz³û¥}³ 5v›ÓooDûùîç¯o¿´Ÿ½µÚÏþ°Õ>ÉøòÜN~=ƒ‰m„ì!¸_ž”$Ñ[lñ|‰9"Û«@¡‡Ê”iåÊsV÷ªäSMc¾*Ñ+þÉ…p%e …0Á5Ý%Ì9ã€gÖÇ|ì¾ì@+›gkLÞÔæŽMo0¸Ø>›ÕN‹ÖËýM=) S>DØÕ/u ³ú—½lÌ1+ã((­Ž$¡Ü‹9‘°²PHŽH˜eªzw̱`1÷0ÌRнÌÌò¼Þ†nø`|ª3_žË´–»"˲"\ÒMdPÖAÙ•‘:ÊþÒêTg8kÛùn0µY¢¥r§„¬m³È1EÓ (ÔzMˆÌÁ-9]>#ZA}[0,'ÌwÏzðt””Þõº'%¨ÊÝy"F»ªã7L=Ò¯M«~\(oÝx0)¡úšÚQ8Éøÿ*OßÇáÌ… ytìÍsr ,ÛOHÎpx¾-BЪÞ9›>’¨,§` õÉÇpCZÁUyùþ´Ò{ÕïBœeˆÔï*Ë«h̾¶Q6&¡šº%ãün¤çÿ÷î°œ&o¡$pŒhûÔ8PcHû¹X;/šÏ¾<Õ8=éŸé—9[òÚt­§—ƒ‹î–ñÀ\ö±0¥¯m! ÕeHtãu(Á²c/âŠr÷~b §+¬,5'vi|«¶H=Ù˜’hLÉhž¬zhBfÍ‚4rßËõs¤ú–à2-{Y-³”oq’ûº÷»Ùj+cf³$õ53±^ÆcãÞßZàûëD®þ.n@Röô›“â¶dBIÌbé¾rìEQZŠÊ;Nöêuè¿PK‘1c_-\!PKk€Ó8WEB-INF/acme-taglib.tld]R]OÂ0}v¿¢îÙí ‰ šR¢l1æƒO¤Û*”lÝl;½í:q°§îžÓóqS<ù. ôŤâ•ûƒðÖGLdUÎÅvìÏÖË`4º»>š_GËiò¾Š‘¦Û‚§ê¾ÕÛÓ|6E~°nz噬ÔQiVª4Y%zY¯PB·hÎSIå Â!@¼ð½+§uý°§_4T³ª„ý1Èu–{U;S{s3Ø CƒøÄó°›BX›Sе!¦ †³‰¥¡cˆ¡?°µ«¤-¡YÉ0ôo$']ÜÃáZN×åÀ`qËË™Ê$¯µÕubß´¬ #ÙÇ,·àfY‚IÒ®ôôdUŠugc–7ï $+ÿ:í6è¶lÃçTë¿¿tˆ Ǹ`øÇ7­òcUÂÈk’<>Gñ*^Dñ"Áp9v¿_ÄU]Ð#ŠZû‹æ†Kµ–&J4¬Ytwý8€×ó©\<þVL”c°¸˜HˆÖÖ¹¿XAí<è¾SóïÐW,õ¨ «DÐÀþ×auú§³Å—@# Œ±™I.ú'Ÿµ£@ÿn‘RŽû)- wnÃS‰”qIç×(­a"¾Â¸YG/ +´µßé¬kÒ{×èu‡QáfhDžÝù&Ç–C\æø’á±o¦âe¦"ñ€æÇƒìéˆ(GÛ¥¦VäªÛÏ™â‘bÖžªäÉPKÓNc…›PKrÓ8 META-INF/þÊPKrÓ8 6²OGG=META-INF/MANIFEST.MFPK k€Ó8Æauth/PKk€Ó8¹Ð¡¿*béauth/relax.txtPKk€Ó8¹Ð¡¿*b Oauth/file.txtPK k€Ó8´cgi-bin/PKk€Ó8K‘+BJÚcgi-bin/hello.shPK k€Ó8Zchat/PKk€Ó8ÉýUQÁ¹}chat/chat.htmlPKk€Ó8礿`£™ z chat/chat.jsPKk€Ó8*Õ£° Wchat/chat.cssPKk€Ó8yÝ88dÐN ¦data.txtPKk€Ó8¥\„[d tdata.txt.gzPKk€Ó8Sø}ç( ¹Ñwdat.txtPKk€Ó8<Áqó Hî da.txtPKk€Ó8uY> >ªda.txt.gzPKk€Ó8¹Ð¡¿*b³«d.txtPKk€Ó8¶bûö»~ ¬favicon.icoPKk€Ó8+®¡ó$ ¯index.htmlPKk€Ó8•Ä^Rªºhÿ/´jetty_banner.gifPK k€Ó8ojs/PKk€Ó8ßJ€¾† Ø8ojs/behaviour.jsPKk€Ó8Ÿ¬å*)( ûxjs/index.htmPKk€Ó8¬IeÓ ^yjs/ajax.jsPK k€Ó8ûjsp/PKk€Ó8\ýÜçõÒ €jsp/bean1.jspPKk€Ó8ÂA,O÷Mjsp/tagfile.jspPKk€Ó8ãahL¥`Ù‚jsp/index.htmlPKk€Ó8»ˆê"@ ºƒjsp/dump.jspPKk€Ó8»¬‘%ž  …jsp/tag2.jspPKk€Ó8*ÃõÒ î…jsp/bean2.jspPKk€Ó8uNÞθ¦ ‡jsp/tag.jspPKk€Ó8ŽúŸÀð ˆjsp/expr.jspPKk€Ó8-2=[ ‰logonError.htmlPKk€Ó8w¦bp ø ¡‰logon.htmlPKk€Ó8ÜâÖ9« âŠrewrite.htmlPKk€Ó8ÁõVñ ,Œsnoop.jspPK k€Ó8¹WEB-INF/PK k€Ó8ßWEB-INF/classes/PK k€Ó8 WEB-INF/classes/com/PK k€Ó8?WEB-INF/classes/com/acme/PKk€Ó8:쉑û)vWEB-INF/classes/com/acme/CookieDump.classPKk€Ó8í׌x&È—WEB-INF/classes/com/acme/Counter.classPKk€Ó8›áš´½ ©.”™WEB-INF/classes/com/acme/DispatchServlet.classPKk€Ó8Úe6År+­¤WEB-INF/classes/com/acme/TestListener.classPKk€Ó8´à\Ĥ ‘*x©WEB-INF/classes/com/acme/SessionDump.classPKk€Ó8mí€Ý )t´WEB-INF/classes/com/acme/TestFilter.classPKk€Ó8£é ÄË'˜V#K¹WEB-INF/classes/com/acme/Dump.classPKk€Ó8£ä¦ìË÷ *gáWEB-INF/classes/com/acme/TagListener.classPKk€Ó8?¤!¦b[1ŠäWEB-INF/classes/com/acme/ChatFilter$Message.classPKk€Ó8Úr8Ge['KçWEB-INF/classes/com/acme/Date2Tag.classPKk€Ó89nlZ?%ëWEB-INF/classes/com/acme/Dump$2.classPKk€Ó8^!ƒˆI%—îWEB-INF/classes/com/acme/Dump$1.classPKk€Ó8kýÚ%ek 03ñWEB-INF/classes/com/acme/ChatFilter$Member.classPKk€Ó8àëö~÷ +ööWEB-INF/classes/com/acme/CometServlet.classPKk€Ó8®øXoSê)ÍûWEB-INF/classes/com/acme/HelloWorld.classPKk€Ó8Üà) &wÿWEB-INF/classes/com/acme/DateTag.classPKk€Ó8ü˹: ")ÓWEB-INF/classes/com/acme/ChatFilter.classPK k€Ó8dWEB-INF/classes/com/playplus3/PK k€Ó8# WEB-INF/classes/com/playplus3/pbhk/PKk€Ó8R#í²^=áWEB-INF/classes/com/playplus3/pbhk/PBHKFilter$ProxyData.classPKk€Ó8¾ô@£§Û5þWEB-INF/classes/com/playplus3/pbhk/PBHKFilter$1.classPKk€Ó8m¦‚„=n3WEB-INF/classes/com/playplus3/pbhk/PBHKFilter.classPK k€Ó8¦WEB-INF/classes/org/PK k€Ó8ØWEB-INF/classes/org/mortbay/PK k€Ó8"WEB-INF/classes/org/mortbay/jetty/PK k€Ó8(RWEB-INF/classes/org/mortbay/jetty/build/PK k€Ó82˜WEB-INF/classes/org/mortbay/jetty/build/resources/PKk€Ó8HÐÉ =èWEB-INF/classes/org/mortbay/jetty/build/resources/javadoc.cssPKk€Ó8ÓŸR¹¦p WEB-INF/acme-taglib2.tldPK k€Ó8 o"WEB-INF/tags/PKk€Ó8´°Îrš"WEB-INF/tags/panel.tagPK k€Ó8 ¬#WEB-INF/lib/PKk€Ó8e)Ö.û'Ö#WEB-INF/lib/jetty-util-7.0-SNAPSHOT.jarPKk€Ó83á°äR è­*TúWEB-INF/lib/jetty-servlet-7.0-SNAPSHOT.jarPKk€Ó8‘1c_-\!þšWEB-INF/web.xmlPKk€Ó8®ˆ˜:‹óh¡WEB-INF/acme-taglib.tldPKk€Ó8ÓNc…›8£WEB-INF/jetty-web.xmlPKNN@¥jetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/assembly/assembly.xml0000644000175000017500000000244611026410510025551 0ustar moonmoon assemble-pu jar dir false target/classes keep / **/** src/main/assembly keep / test.war false true lib com.acme:common false true true shared-lib com.acme:common jetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/java/0000755000175000017500000000000011745736516022335 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/java/org/0000755000175000017500000000000011745736516023124 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/java/org/openspaces/0000755000175000017500000000000011745736516025264 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/java/org/openspaces/webapp/0000755000175000017500000000000011745736516026542 5ustar moonmoon././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/java/org/openspaces/webapp/GigaServerConfiguration.javajetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/java/org/openspaces/webapp/GigaServerConfigura0000644000175000017500000000152111030537230032333 0ustar moonmoonpackage org.openspaces.webapp; import org.mortbay.jetty.Server; import org.openspaces.core.cluster.ClusterInfo; public class GigaServerConfiguration { private int _instanceId; private int _backupId; private String _schema; private int _serverPort; public GigaServerConfiguration( ) { } public GigaServerConfiguration( ClusterInfo info, Server server ) { _instanceId = info.getInstanceId(); if ( info.getBackupId() != null ) { _backupId = info.getBackupId(); } _schema =info.getSchema(); if ( server.getConnectors() != null ) { _serverPort = server.getConnectors()[0].getPort(); } } public int getServerPort() { return _serverPort; } public int getInstanceId() { return _instanceId; } public int getBackupId() { return _backupId; } public String getSchema() { return _schema; } } jetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/java/org/openspaces/webapp/GigaWebApp.java0000644000175000017500000001407411030514433031334 0ustar moonmoonpackage org.openspaces.webapp; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.net.URL; import java.net.URLEncoder; import java.util.Arrays; import org.mortbay.jetty.Handler; import org.mortbay.jetty.HandlerContainer; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.HandlerWrapper; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.util.IO; import org.mortbay.util.URIUtil; import org.mortbay.util.UrlEncoded; import org.openspaces.core.GigaSpace; import org.openspaces.core.context.GigaSpaceContext; /** */ public class GigaWebApp { public final String GIGASPACE_ATTR = "org.openspaces.core.GigaSpace"; @GigaSpaceContext private GigaSpace gigaSpace; private Server _server; private File _tmp; private WebAppContext _webAppContext; private HandlerContainer _container; private String _contextPath="/"; private String _webapp="webapp/"; public GigaSpace getGigaSpace() { return gigaSpace; } public void setGigaSpace(GigaSpace gigaSpace) { this.gigaSpace = gigaSpace; } public Server getServer() { return _server; } public void setServer(Server server) { this._server = server; } public String getWebapp() { return _webapp; } public void setWebapp(String webapp) { _webapp = webapp; } public WebAppContext getWebAppContext() { return _webAppContext; } public void setWebAppContext(WebAppContext appContext) { _webAppContext = appContext; } public String getContextPath() { return _contextPath; } public void setContextPath(String path) { _contextPath = path; } public void deploy() throws Exception { //gigaSpace. if (_server==null) throw new IllegalStateException("No Server"); System.out.println("--- Deploy " + this+ " to "+_server.getConnectors()[0].getLocalPort()); org.jini.rio.boot.ServiceClassLoader loader = (org.jini.rio.boot.ServiceClassLoader)Thread.currentThread().getContextClassLoader(); System.out.println("\nloader="+loader); System.out.println("isA="+loader.getClass()); System.out.println("search="+Arrays.asList(loader.getSearchPath())); URL url = loader.getSearchPath()[0]; System.out.println("URL="+url); _tmp = File.createTempFile("gigawebapp",".tmp"); _tmp.delete(); _tmp.mkdir(); String docroot = URIUtil.addPaths(url.toString(),_webapp); System.out.println("docroot="+docroot); System.out.println("tmp="+_tmp); copy(docroot,_tmp); System.out.println("\n"); if (_webAppContext==null) _webAppContext=new WebAppContext(); _webAppContext.setContextPath("/"); File tmp = new File(_tmp,"ctx"); tmp.mkdir(); _webAppContext.setTempDirectory(tmp); _webAppContext.setWar(URIUtil.addPaths(_tmp.toURL().toString(),_webapp)); _webAppContext.setExtractWAR(true); _webAppContext.setCopyWebDir(false); _webAppContext.setAttribute(GIGASPACE_ATTR,getGigaSpace()); // Look for a place to add the webappcontext _container=_server; Handler[] contexts = _container.getChildHandlersByClass(ContextHandlerCollection.class); if (contexts!=null && contexts.length>0) _container=(HandlerContainer)contexts[0]; else { while (_container!=null) { if (_container instanceof HandlerWrapper) { HandlerWrapper wrapper = (HandlerWrapper)_container; Handler handler=wrapper.getHandler(); if (handler==null) break; if (handler instanceof HandlerContainer) _container=(HandlerContainer)handler; else throw new IllegalStateException("No container"); } throw new IllegalStateException("No container"); } } _container.addHandler(_webAppContext); if (_container.isStarted() || _container.isStarting()) _webAppContext.start(); } private void copy(String url, File toDir) throws IOException { System.err.println("url="+url+" dir="+toDir); if (url.endsWith("/")) { String basename=url.substring(url.lastIndexOf("/",url.length()-2)+1); File directory=new File(toDir,basename); directory.mkdir(); LineNumberReader reader = new LineNumberReader(new InputStreamReader(new URL(url).openStream(),"utf-8")); String line; while ((line=reader.readLine())!=null) { System.err.println(line.replace('\t','|')); int tab=line.lastIndexOf('\t',line.lastIndexOf('\t',line.lastIndexOf('\t')-1)-1); System.err.println(tab); char type=line.charAt(tab+1); String file=line.substring(0,tab); copy(url+URIUtil.encodePath(file)+(type=='d'?"/":""),directory); } } else { String basename=url.substring(url.lastIndexOf("/")+1); File file = new File(toDir,basename); System.err.println("copy "+url+" --> "+file); IO.copy(new URL(url).openStream(),new FileOutputStream(file)); } } public void undeploy() throws Exception { System.out.println("--- Undeploy " + this); if (!_webAppContext.isRunning()) return; _webAppContext.stop(); if (_container!=null) _server.removeHandler(_webAppContext); IO.delete(_tmp); } } jetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/java/org/openspaces/webapp/GigaServer.java0000644000175000017500000000402711030537230031421 0ustar moonmoonpackage org.openspaces.webapp; import org.mortbay.jetty.Server; import org.mortbay.log.Log; import org.openspaces.core.GigaSpace; import org.openspaces.core.cluster.ClusterInfo; import org.openspaces.core.cluster.ClusterInfoAware; import org.openspaces.core.context.GigaSpaceContext; import org.springframework.beans.factory.InitializingBean; public class GigaServer extends Server implements InitializingBean, ClusterInfoAware { public final String GIGASPACE_ATTR = "org.openspaces.core.GigaSpace"; @GigaSpaceContext private GigaSpace gigaSpace; private ClusterInfo _clusterInfo; public void setGigaSpace(GigaSpace gigaSpace) { this.gigaSpace = gigaSpace; } public void afterPropertiesSet() throws Exception { // not the right place to write out a full on configuration object, server not initialized, but this does appear // to write out an object. Need to work out the reading and writing bit, maybe try a consolidated configuration object with a // a map of configurations keys by a unique key based on clusterInfo and then read/write that. would want to ensure its // unique though, so maybe instance Id 1 would be the only one allowed to create it, others would block? // of course this is dependent on the space setting, currently configured with in jvm space only, is this the default // way we want to do it? gigaSpace.write( new GigaServerConfiguration( _clusterInfo, this ) ); GigaServerConfiguration gsc = gigaSpace.read( new GigaServerConfiguration() ); if ( gsc == null ) { Log.info( "GSC is null :(" ); } else { Log.info( "GSC is not null and server port is " + gsc.getServerPort() ); // currently 0, need another place for doing this } } public void setClusterInfo( ClusterInfo clusterInfo ) { if ( clusterInfo == null ) { Log.info( "\n\n\nGIGASERVER: cluster info not set\n\n\n" ); return; } Log.info( "\n\n\nGIGASERVER: My instanceId is: " + clusterInfo.getInstanceId() + "\n\n\n" ); _clusterInfo = clusterInfo; } } jetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/resources/0000755000175000017500000000000011745736516023426 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/resources/META-INF/0000755000175000017500000000000011745736516024566 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/resources/META-INF/spring/0000755000175000017500000000000011745736516026070 5ustar moonmoonjetty-6.1.26/contrib/jetty-openspaces/webapp/src/main/resources/META-INF/spring/pu.xml0000644000175000017500000000765611030514433027227 0ustar moonmoon jetty-6.1.26/contrib/jetty-openspaces/webapp/pom.xml0000644000175000017500000000444111466510475021213 0ustar moonmoon org.mortbay.jetty jetty-openspaces 6.1.26 4.0.0 org.mortbay.jetty jetty-openspaces-webapp jar Jetty Contrib :: Openspaces :: WebApp PU org.openspaces openspaces provided junit junit 4.4 test org.springframework spring-test test org.mortbay.jetty jetty package gigaweb-server maven-assembly-plugin false false true src/main/assembly/assembly.xml assembly package single jetty-6.1.26/contrib/jetty-openspaces/webapp/README.TXT0000644000175000017500000000072611027027037021224 0ustar moonmoon To build: download and unpack gigaspace release (6.5rc2). Run gigaspace script to populate your local repository mvn clean compile package To run: you need to start (from $GIGA_HOME/bin): gsm.sh (the space manager) gs-ui.sh (the space user interface) gsc.sh * 2 (two space containers) then run mvn os:deploy it will find the gsm and deploy two instances of the webapp (currently controlled by sla bean in pu.xml) The server is also defined in pu.xml jetty-6.1.26/contrib/start-daemon/0000755000175000017500000000000011745736516015524 5ustar moonmoonjetty-6.1.26/contrib/start-daemon/src/0000755000175000017500000000000011745736516016313 5ustar moonmoonjetty-6.1.26/contrib/start-daemon/src/main/0000755000175000017500000000000011745736516017237 5ustar moonmoonjetty-6.1.26/contrib/start-daemon/src/main/java/0000755000175000017500000000000011745736516020160 5ustar moonmoonjetty-6.1.26/contrib/start-daemon/src/main/java/org/0000755000175000017500000000000011745736516020747 5ustar moonmoonjetty-6.1.26/contrib/start-daemon/src/main/java/org/mortbay/0000755000175000017500000000000011745736516022424 5ustar moonmoonjetty-6.1.26/contrib/start-daemon/src/main/java/org/mortbay/jetty/0000755000175000017500000000000011745736516023563 5ustar moonmoonjetty-6.1.26/contrib/start-daemon/src/main/java/org/mortbay/jetty/start/0000755000175000017500000000000011745736516024720 5ustar moonmoonjetty-6.1.26/contrib/start-daemon/src/main/java/org/mortbay/jetty/start/daemon/0000755000175000017500000000000011745736516026163 5ustar moonmoonjetty-6.1.26/contrib/start-daemon/src/main/java/org/mortbay/jetty/start/daemon/Bootstrap.java0000644000175000017500000000241411222520053030755 0ustar moonmoonpackage org.mortbay.jetty.start.daemon; //======================================================================== //Copyright 2003-2005 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== import org.apache.commons.daemon.Daemon; import org.apache.commons.daemon.DaemonContext; import org.mortbay.start.Main; public class Bootstrap implements Daemon { private Main main = new Main(); public void init(DaemonContext context) { main.init(context.getArguments()); } public void start() { main.start(); } public void stop() { System.exit(0); } public void destroy() { System.exit(0); } } jetty-6.1.26/contrib/start-daemon/pom.xml0000644000175000017500000000277011466510475017041 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty start-daemon Jetty Start Daemon http://jetty.mortbay.org install maven-compiler-plugin 1.5 1.5 maven-jar-plugin org.mortbay.jetty.start.daemon.Bootstrap org.mortbay.jetty start ${project.version} commons-daemon commons-daemon 1.0.1 jetty-6.1.26/contrib/jetty-ant-demo/0000755000175000017500000000000011745736516015767 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp2/0000755000175000017500000000000011745736516017327 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp2/scan-test/0000755000175000017500000000000011745736516021230 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp2/scan-test/test.txt0000644000175000017500000000000010573262641022725 0ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp2/index.jsp0000755000175000017500000000107710573262641021153 0ustar moonmoon<%@ taglib prefix="c" uri="/WEB-INF/tlds/c.tld" %> <%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> Loop Example

    Even numbers from 1 to 100:

    ${i} <%= "testProperty=" + System.getProperty("testProperty") %> jetty-6.1.26/contrib/jetty-ant-demo/webapp2/WEB-INF/0000755000175000017500000000000011745736516020356 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp2/WEB-INF/tlds/0000755000175000017500000000000011745736516021324 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp2/WEB-INF/tlds/c.tld0000755000175000017500000003717710573262641022264 0ustar moonmoon JSTL 1.1 core library JSTL core 1.1 c http://java.sun.com/jsp/jstl/core Provides core validation features for JSTL tags. org.apache.taglibs.standard.tlv.JstlCoreTLV Catches any Throwable that occurs in its body and optionally exposes it. catch org.apache.taglibs.standard.tag.common.core.CatchTag JSP Name of the exported scoped variable for the exception thrown from a nested action. The type of the scoped variable is the type of the exception thrown. var false false Simple conditional tag that establishes a context for mutually exclusive conditional operations, marked by <when> and <otherwise> choose org.apache.taglibs.standard.tag.common.core.ChooseTag JSP Simple conditional tag, which evalutes its body if the supplied condition is true and optionally exposes a Boolean scripting variable representing the evaluation of this condition if org.apache.taglibs.standard.tag.rt.core.IfTag JSP The test condition that determines whether or not the body content should be processed. test true true boolean Name of the exported scoped variable for the resulting value of the test condition. The type of the scoped variable is Boolean. var false false Scope for var. scope false false Retrieves an absolute or relative URL and exposes its contents to either the page, a String in 'var', or a Reader in 'varReader'. import org.apache.taglibs.standard.tag.rt.core.ImportTag org.apache.taglibs.standard.tei.ImportTEI JSP The URL of the resource to import. url true true Name of the exported scoped variable for the resource's content. The type of the scoped variable is String. var false false Scope for var. scope false false Name of the exported scoped variable for the resource's content. The type of the scoped variable is Reader. varReader false false Name of the context when accessing a relative URL resource that belongs to a foreign context. context false true Character encoding of the content at the input resource. charEncoding false true The basic iteration tag, accepting many different collection types and supporting subsetting and other functionality forEach org.apache.taglibs.standard.tag.rt.core.ForEachTag org.apache.taglibs.standard.tei.ForEachTEI JSP Collection of items to iterate over. items false true java.lang.Object If items specified: Iteration begins at the item located at the specified index. First item of the collection has index 0. If items not specified: Iteration begins with index set at the value specified. begin false true int If items specified: Iteration ends at the item located at the specified index (inclusive). If items not specified: Iteration ends when index reaches the value specified. end false true int Iteration will only process every step items of the collection, starting with the first one. step false true int Name of the exported scoped variable for the current item of the iteration. This scoped variable has nested visibility. Its type depends on the object of the underlying collection. var false false Name of the exported scoped variable for the status of the iteration. Object exported is of type javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested visibility. varStatus false false Iterates over tokens, separated by the supplied delimeters forTokens org.apache.taglibs.standard.tag.rt.core.ForTokensTag JSP String of tokens to iterate over. items true true java.lang.String The set of delimiters (the characters that separate the tokens in the string). delims true true java.lang.String Iteration begins at the token located at the specified index. First token has index 0. begin false true int Iteration ends at the token located at the specified index (inclusive). end false true int Iteration will only process every step tokens of the string, starting with the first one. step false true int Name of the exported scoped variable for the current item of the iteration. This scoped variable has nested visibility. var false false Name of the exported scoped variable for the status of the iteration. Object exported is of type javax.servlet.jsp.jstl.core.LoopTag Status. This scoped variable has nested visibility. varStatus false false Like <%= ... >, but for expressions. out org.apache.taglibs.standard.tag.rt.core.OutTag JSP Expression to be evaluated. value true true Default value if the resulting value is null. default false true Determines whether characters <,>,&,'," in the resulting string should be converted to their corresponding character entity codes. Default value is true. escapeXml false true Subtag of <choose> that follows <when> tags and runs only if all of the prior conditions evaluated to 'false' otherwise org.apache.taglibs.standard.tag.common.core.OtherwiseTag JSP Adds a parameter to a containing 'import' tag's URL. param org.apache.taglibs.standard.tag.rt.core.ParamTag JSP Name of the query string parameter. name true true Value of the parameter. value false true Redirects to a new URL. redirect org.apache.taglibs.standard.tag.rt.core.RedirectTag JSP The URL of the resource to redirect to. url false true Name of the context when redirecting to a relative URL resource that belongs to a foreign context. context false true Removes a scoped variable (from a particular scope, if specified). remove org.apache.taglibs.standard.tag.common.core.RemoveTag empty Name of the scoped variable to be removed. var true false Scope for var. scope false false Sets the result of an expression evaluation in a 'scope' set org.apache.taglibs.standard.tag.rt.core.SetTag JSP Name of the exported scoped variable to hold the value specified in the action. The type of the scoped variable is whatever type the value expression evaluates to. var false false Expression to be evaluated. value false true Target object whose property will be set. Must evaluate to a JavaBeans object with setter property property, or to a java.util.Map object. target false true Name of the property to be set in the target object. property false true Scope for var. scope false false Creates a URL with optional query parameters. url org.apache.taglibs.standard.tag.rt.core.UrlTag JSP Name of the exported scoped variable for the processed url. The type of the scoped variable is String. var false false Scope for var. scope false false URL to be processed. value false true Name of the context when specifying a relative URL resource that belongs to a foreign context. context false true Subtag of <choose> that includes its body if its condition evalutes to 'true' when org.apache.taglibs.standard.tag.rt.core.WhenTag JSP The test condition that determines whether or not the body content should be processed. test true true boolean jetty-6.1.26/contrib/jetty-ant-demo/webapp2/WEB-INF/web.xml0000755000175000017500000000042210573262641021645 0ustar moonmoon jetty-6.1.26/contrib/jetty-ant-demo/webapp2/WEB-INF/tags/0000755000175000017500000000000011745736516021314 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp2/WEB-INF/tags/a.tag0000755000175000017500000000013110573262641022216 0ustar moonmoon<%@ taglib prefix="c" uri="/WEB-INF/tlds/c.tld" %>

    ${a}

    jetty-6.1.26/contrib/jetty-ant-demo/webapp.war0000755000175000017500000001001510573262641017747 0ustar moonmoonPK®­K5 index.jspUX ¥­DEØI-EõõeQMOÃ0 ½ó+;¶nÙuBÛŠ˜4BEƒcÖ¦[¤¶)©÷%Ä'Bâäøù=ûÙöîÀr]éZ«J}HD.°µ:´LÇÁlqO\å¡ ½ÑÅð¿Ä¥ð`¡í_á ö’ËéÓ${N±áºÂóëx>›@DËþ„hšMñö=·2+›N³6¬ˆÒ…€Ø0·¢ý~îû¡±kÊ^èà{Å^|~üG\7ÙW|P²p5Wj47¦Ezu[©!ý`ÃZ±„Ÿ¨­Þ¹C˜†UÃ[%pÎܲêÀäÛÞ"ßHÛ)N¶\7äºÐyÒÊG?7¥;Õ ÙÖ+e;”ÖÔˆÁq ;v¤|P›Ê|ƒt÷Ó+µÖM"bÕ.F‘ÛpL]‚Uçl\}jôp$Aôuªûò4ò¢ãc%‡ šgöåÑĹüy¿Åg<¶E'zÚ‡WýÌö¯ž q1øCmŸ_[ÚÏçóxþc¬Í¸ÿìääiÿ¯wçÉDLù±Ì¬ãYRõ´ò¹¥ç:áŽæÖ0$kxߟ‹áñ•ͽ†›ÅßÏþ>‰¯mê‡ < Néü3H…MŒÌq §o/.ÏÙÓø)K´¬”2è×›PisÅÇŸ ßÛC»úslè@Äq9î)ÈôWž`;ÑÆùÉ _û _FžnÒ´„¿Nõý¸Ø,Âö3®dÊ6^½ÁÚÄýŸFÏ$¼ñJ–]  î /FÚ0R  ´±µB}´ãDqk—#ÀêÇ<ç°¼±_ ãڧܤ±S³ø-Lý ~yþG)|ƒ¨ÚC¯ˆÚ¦Ö+î`@Ëx¶`—£ç|¨sî˜N’ÂX&3&eC. UÊ4IàJ-‚qk B¤»Ym¿V8Ú _­”Ÿ^9ù­êó1®àTãBÓ¬/ù˜ú{y8ÍãDgNdHöaÐ_yâqçŒN,qXEçw˜ Ó#ÀArƉ”ÙDçðߌI ázCƒH\'‚úÁo 0Âè)ã,»ñßÅ€.àºÈ+¹Ñº8ii¸Z¶.9^N÷K„—(ƒÈ:Æôˆ iDz:âÊùÃïµ&T5@ŸB„VµGåÊ®`GøoåYçBNsÐ •ž8hža¨.-Ñ];Ä5êL W ÇUX9[Ð2?ÛcSn>ÃEÔy¤Ü‹ùDdÆî‘h€ÒÌ¥ø´Ÿ­QïÝ J‚îÈÐ;£Úcó‰L&LàŠ92ÈÒp¥ç\Çy®$ zïL!Öl;Ø4g¿j­Ï ³Ÿ@6^’Öˆ\ÌŸeqhï‰ÄÒ.‡Ú޽Ýwã<æg£{ôd½À×pDáT8a¦l°È4ðãQ¦¡AØ—#1ˆR…ž –kEÚÒ qà›-W¯Ñ ËFu{î ÐלýòpøÛ&+ß»Çʪ$L¥ê·ŠïÒcFåû ³äf\MêÐdè.P-ÂæÕ’ÅÁ8ùJúGÝÄŒÒ Æ‡V£{7¡À'€ÿôñœÍ2c°•}Ø Æi&$™®zÎÇ¢nèdc éNÝÊå0$O¡aùÔÿÖmÈBÀw?wõ6$d£ÇqB¶&d%äõ öí¶óÒ‚Àðta{Zò­0jÿèŽör[WCwϾÈÄʾQݯx²\¾õ-¸“CYbï+Ú/±o  U¹3&¿Pq`vÎ’Ï¡Xš?¦.C¡t6¶è 8‚)ä8‹JA-a)[ï Êþ|ë 7PpAD¨vkV‚,ŒûÌLfyáuÚª Ò_—rFç¥R}È­L ˜–E‘¯>]ŸbuŸÊÑH€ Ì'ÑJ‰Äw[±™±B{Ãn¶ZáèG*0$‡Î£"K|± Ýb{¼n½æw®û«€ûÆKÙ1âVRî/ä¾Z¢ Ôƒ5™’‰ùŃmq:2AÁN\-Ìê´ÌñiLqˆhï‡W0¹“ý³J/›‹DŽ ž|ò ÅXf64d w+q/Äù­ª˜a*®cöFHý©i0×€â„ÛˆÚ±“x94–XÛ†ŸCéÅ3 q5‚e9~ÓB¬}.„Ìî{‘¥·Až=–Y¹½ò¤ ¶$žbŒïn§ÝÃ;@ ¢ Ø å\*Åt¦U¡Î ¦1 fÈK„ô(ZeiÞrï6‰yøvD¬ÖÙÍá¥Ä·JÀ’Â`\Y±ß‹0ƒlk=£®6HgÒÊ¡Ä0³3¨)oKEŽd‹hŸ¦Bn«^ùŒZ ØËh¹–¥·Çøkå´@&WØ `zÿ½ }#Ü%A'[afJ¸øÊæ1vøày®u‘ó‚Ä®, Û°$QmIšQõBï Û)7]ðC\!Ø~¸/lEÎ 9¿áÂÕæg*”œâÆmL\.IØî©‹—s”åö’†ÚWα^Üß>åð3ÛÑ!a–‹qô£ÕCÕ,{LN¸Êù-Õ5Qµî~Oу!½±4•'MXÐ ÆM¹)Û2ÙòmÑæCnõßË…6æ=mPXM|¾ÍLÅS?lžñþOSö‘¦|¿™FÔ6Óˆ¾ÍT£šá¹ü,èpù‡—,Žc†GË=rWwàt¶ñ«¥ºØõ â}±ùb?iÅë  &ÃpÀÛúì’Ð>˜³ƒßĈÊ•çŽ2œŠ¬Ga³B©– ¦^äáìþöå‘t-EBÒöˆ®ø4ÑëöŽÊì¨v,ëƒEíÄXݰÚJù CŽÇµX‡Õ6^3ô€IÅl p¡ž-‘…7<M·=ÝÇ^k ó¿(†x‰œ&ÂéoÐÚXAMªçêp/……þ¸j HÜ(v 9ÆqÏÆÜHp!áÜ.-°º¤yw{ýn¾ìáFËûJÖ½]j©Tû%Å\ŽaOEš? @Q\fȵ®?ºì"¦]‹ç› ¾$jG7ûe<Е³ ŸÄ‘ZZ þs0þöúýŽÛjÒ:öœ¥þQ¤0ZâÊs³LÌ[Дvä`5ö=ßsºáÂ@¥ü¼[o<.­ô¢+lºvfŠ@DÍg¦ì€ÏLoÃ멦›;_$ëËû¬9ŽI¡¸ñMz¸B]ý¤ÑPþ‘Ÿh³ ˆiî»ûâu4|ìµiŸo¹7ÐÊ#G÷Ce“0ál-ÇãY­öªßE… —³.©Ñ3Y±«—†y}í«é@Ò‰†Ì}ù\µzõô —,£9x>A;ëØ.ÈÜ5¶ ‡ukê¾ë܇Žv—ÜŒq»ÜoâÌ'P àaEÜÂoiC=fï ë‚¶Xbpö–Ïø¯‚c}RöǽB¼ $Rªè&&DÚŠ 'UüŽçeß¶Wœi¾‡ƒ_Ý̂ƞx Q‘«£ÜRÓJÚáèúŸ‰Í_3ANˆSK¬­>i(‹ªPƒlùBkSîz‡8ðɨ¯ªMÞðÁµZùüÿ/À~U¾ÞÛÜö[‘‹C7V]>!Y¬ÞRý.*®ÎöÝC:˜L×>Þ‚Ÿ£ÎòÓ£ð ÒÅy5$µˆøŽÞìOq(ßW±òûªèÛø¾ª¢ ý+pý PKø»|zÒ >PKN¬K5WEB-INF/web.xmlUX ¥­DECG-Eõõ…=‚0„w~EÓ*ƒ!|lN8©‰©¥‘yKx‘òóEPVÖ»çrwI>µ/2ê…”†, Dƒ²•gJoד¤yæ%N?|Ùud¦SZCsÞÈQ2|S¶å³Åy#´¦YÉxB³ÑÎ9æÌöO.‚ ä÷sqQµn¥o jÍ¡‰q‘ «ä°ÌÚ©#;>ÿ­/E± «oÍvY°ˆÎÿLöPKïd·e¥PK®­K5ˆëÊÃU @¤index.jspUX¥­DEØI-EPK µ­K5 @íAœWEB-INF/UX‚­DEæI-EPK µ­K5 @íAÒWEB-INF/tags/UX‚­DEæI-EPK!¤H5ÏÏjWY @¤ WEB-INF/tags/a.tagUX¥­DE^D)EPK µ­K5 @íA´WEB-INF/tlds/UX‚­DEæI-EPK pH5ø»|zÒ > @¤ïWEB-INF/tlds/c.tldUX¥­DElé(EPKN¬K5ïd·e¥ @¤ WEB-INF/web.xmlUX¥­DECG-EPKôjetty-6.1.26/contrib/jetty-ant-demo/build.xml0000755000175000017500000000177411157664675017627 0ustar moonmoon jetty-6.1.26/contrib/jetty-ant-demo/webapp/0000755000175000017500000000000011745736516017245 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp/scan-test/0000755000175000017500000000000011745736516021146 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp/scan-test/test.txt0000644000175000017500000000000010573262641022643 0ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp/index.jsp0000755000175000017500000000107710573262641021071 0ustar moonmoon<%@ taglib prefix="c" uri="/WEB-INF/tlds/c.tld" %> <%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> Loop Example

    Even numbers from 1 to 100:

    ${i} <%= "testProperty=" + System.getProperty("testProperty") %> jetty-6.1.26/contrib/jetty-ant-demo/webapp/WEB-INF/0000755000175000017500000000000011745736516020274 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp/WEB-INF/tlds/0000755000175000017500000000000011745736516021242 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp/WEB-INF/tlds/c.tld0000755000175000017500000003717710573262641022202 0ustar moonmoon JSTL 1.1 core library JSTL core 1.1 c http://java.sun.com/jsp/jstl/core Provides core validation features for JSTL tags. org.apache.taglibs.standard.tlv.JstlCoreTLV Catches any Throwable that occurs in its body and optionally exposes it. catch org.apache.taglibs.standard.tag.common.core.CatchTag JSP Name of the exported scoped variable for the exception thrown from a nested action. The type of the scoped variable is the type of the exception thrown. var false false Simple conditional tag that establishes a context for mutually exclusive conditional operations, marked by <when> and <otherwise> choose org.apache.taglibs.standard.tag.common.core.ChooseTag JSP Simple conditional tag, which evalutes its body if the supplied condition is true and optionally exposes a Boolean scripting variable representing the evaluation of this condition if org.apache.taglibs.standard.tag.rt.core.IfTag JSP The test condition that determines whether or not the body content should be processed. test true true boolean Name of the exported scoped variable for the resulting value of the test condition. The type of the scoped variable is Boolean. var false false Scope for var. scope false false Retrieves an absolute or relative URL and exposes its contents to either the page, a String in 'var', or a Reader in 'varReader'. import org.apache.taglibs.standard.tag.rt.core.ImportTag org.apache.taglibs.standard.tei.ImportTEI JSP The URL of the resource to import. url true true Name of the exported scoped variable for the resource's content. The type of the scoped variable is String. var false false Scope for var. scope false false Name of the exported scoped variable for the resource's content. The type of the scoped variable is Reader. varReader false false Name of the context when accessing a relative URL resource that belongs to a foreign context. context false true Character encoding of the content at the input resource. charEncoding false true The basic iteration tag, accepting many different collection types and supporting subsetting and other functionality forEach org.apache.taglibs.standard.tag.rt.core.ForEachTag org.apache.taglibs.standard.tei.ForEachTEI JSP Collection of items to iterate over. items false true java.lang.Object If items specified: Iteration begins at the item located at the specified index. First item of the collection has index 0. If items not specified: Iteration begins with index set at the value specified. begin false true int If items specified: Iteration ends at the item located at the specified index (inclusive). If items not specified: Iteration ends when index reaches the value specified. end false true int Iteration will only process every step items of the collection, starting with the first one. step false true int Name of the exported scoped variable for the current item of the iteration. This scoped variable has nested visibility. Its type depends on the object of the underlying collection. var false false Name of the exported scoped variable for the status of the iteration. Object exported is of type javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested visibility. varStatus false false Iterates over tokens, separated by the supplied delimeters forTokens org.apache.taglibs.standard.tag.rt.core.ForTokensTag JSP String of tokens to iterate over. items true true java.lang.String The set of delimiters (the characters that separate the tokens in the string). delims true true java.lang.String Iteration begins at the token located at the specified index. First token has index 0. begin false true int Iteration ends at the token located at the specified index (inclusive). end false true int Iteration will only process every step tokens of the string, starting with the first one. step false true int Name of the exported scoped variable for the current item of the iteration. This scoped variable has nested visibility. var false false Name of the exported scoped variable for the status of the iteration. Object exported is of type javax.servlet.jsp.jstl.core.LoopTag Status. This scoped variable has nested visibility. varStatus false false Like <%= ... >, but for expressions. out org.apache.taglibs.standard.tag.rt.core.OutTag JSP Expression to be evaluated. value true true Default value if the resulting value is null. default false true Determines whether characters <,>,&,'," in the resulting string should be converted to their corresponding character entity codes. Default value is true. escapeXml false true Subtag of <choose> that follows <when> tags and runs only if all of the prior conditions evaluated to 'false' otherwise org.apache.taglibs.standard.tag.common.core.OtherwiseTag JSP Adds a parameter to a containing 'import' tag's URL. param org.apache.taglibs.standard.tag.rt.core.ParamTag JSP Name of the query string parameter. name true true Value of the parameter. value false true Redirects to a new URL. redirect org.apache.taglibs.standard.tag.rt.core.RedirectTag JSP The URL of the resource to redirect to. url false true Name of the context when redirecting to a relative URL resource that belongs to a foreign context. context false true Removes a scoped variable (from a particular scope, if specified). remove org.apache.taglibs.standard.tag.common.core.RemoveTag empty Name of the scoped variable to be removed. var true false Scope for var. scope false false Sets the result of an expression evaluation in a 'scope' set org.apache.taglibs.standard.tag.rt.core.SetTag JSP Name of the exported scoped variable to hold the value specified in the action. The type of the scoped variable is whatever type the value expression evaluates to. var false false Expression to be evaluated. value false true Target object whose property will be set. Must evaluate to a JavaBeans object with setter property property, or to a java.util.Map object. target false true Name of the property to be set in the target object. property false true Scope for var. scope false false Creates a URL with optional query parameters. url org.apache.taglibs.standard.tag.rt.core.UrlTag JSP Name of the exported scoped variable for the processed url. The type of the scoped variable is String. var false false Scope for var. scope false false URL to be processed. value false true Name of the context when specifying a relative URL resource that belongs to a foreign context. context false true Subtag of <choose> that includes its body if its condition evalutes to 'true' when org.apache.taglibs.standard.tag.rt.core.WhenTag JSP The test condition that determines whether or not the body content should be processed. test true true boolean jetty-6.1.26/contrib/jetty-ant-demo/webapp/WEB-INF/web.xml0000755000175000017500000000042210573262641021563 0ustar moonmoon jetty-6.1.26/contrib/jetty-ant-demo/webapp/WEB-INF/tags/0000755000175000017500000000000011745736516021232 5ustar moonmoonjetty-6.1.26/contrib/jetty-ant-demo/webapp/WEB-INF/tags/a.tag0000755000175000017500000000013110573262641022134 0ustar moonmoon<%@ taglib prefix="c" uri="/WEB-INF/tlds/c.tld" %>

    ${a}

    jetty-6.1.26/contrib/eclipse-generic-wst-plugin/0000755000175000017500000000000011745736516020273 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/0000755000175000017500000000000011745736516021237 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/plugins/0000755000175000017500000000000011745736516022720 5ustar moonmoon././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootjetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/plugins/org.mortbay.jetty.serveradaptor_1.0.0.jarjetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/plugins/org.mortbay.jetty.serveradaptor_1.0.0.j0000644000175000017500000001373510705551046032065 0ustar moonmoonPK Áj7 META-INF/þÊPK Àj7ïŸ%QÃMETA-INF/MANIFEST.MF…PMKÃ0¾úrT0iˆXñ°Í!“uˆ¯’¥ïº”6©Ijé¿7igèPæ!—÷ùNJ߃6ø”æR$èšÄa0“˼¡ìÈÞ,xçà¥j Ç‹ÞñoIüßã]|ƒ.²V ”3%u¯ Ô­#—a°hE^NqÞ{æ¡-­!A/`L2P_ Ð<§‘ ½Vm¹ðÔ¬¯w²âl”HUZ*³£=)œèANGõƒæ¢¨ÀØ´G£Zð.ÓÅn”?‹\ª¥Ö-h–Rè¶2ÖÅsž@3Å3ÈŸA€âì§ô1ííÖxÕ†3Ú6>Ó$QÔu¡Ãß»!ªFXG›õrµÍVxæZ½ÁgËàÑc\ ¬âÒiC˜¬k)H£d Ì=eàŽ ®¦Ì0@Ž<~Ìox‚µü)O#¬Ï™”òLÄ+@8ûgÿÑÎ|×0ƒoPK Àj7 buildfiles/PK Àj7icons/PK Àj7servers/PK Àj7?W¨£, .classpath•Ë Â0E×ö+Bö¦ºsÑ"tQ¥ÔµÔdh£qóý{-Rt£ànîåp.“ä·³"W°NjLé”M(äZHlSº«—ãͳ(áªqÎ4¾Ë¢Ñ;z{''‰"¥ÎrJúòuÆ_A®qµmp%vž©& ïžÓl]ûŦ¬ç«²¨þ—Œk ÌÂ%H b«B+Ñý0éàMðƒì ±g“øãñPK Àj7w«äî.project½’ÏJÄ0ÆÏîS”ÞMôæ!ÛÅ?x¡ú1k–f’é¢oï´Íª]ÁÛ÷Í|3?ÈDm^}_í ep]ŸŠ“º4Á:ìÖõãÃõñY½iV*¦°CWMr‘8ܬŽjÍ ½U-$ÞR[)$%§GLð%÷Š‹e[µüjž×Û6‚aSÜ%i´c¡Cê˜ÞÅ bkI˜Xèžòð çºa¤æÙÊ…Wòðd´ n5ºgÈtñoÄÖ¼€×æ•BybFÑ`ŽÎúø¾:‡wSsäN¡ò‹kàáÈ^2îãê‹õPK Àj75~=AÆbuild.properties•RÁ ½óû…/ðàAzòèecU1„–eŸ/Á™ÌÀ–CúÚ¾öµhƒ—Àyµ«ÐKÁl (ýe‹†+#uh£ï|¸î·§ËQln¬ú?1Ž)~{œÊ$8m`TyEæPK Àj7॥ólÃbuildfiles/build.xmlUMoâ0=³¿ÂqB‘z•P·»­´ UÅj{C† 4Ô±-Û)dÿ}Çù „–%\ˆgæÍ›73N ´ÜÀÒÁby!(.SØY&’Â#$„K¸-Mts@·°@Ó‚#=ò¨wû¥ ’mÓJ±ÄÍ£<òÎx‚‡7žÖ5]Ο¶?BZf‘à«h}ŒzMc©í‚!Q°6¥•«¡¹s¢³×sØBŠñåðŠ'Æ©Á”:…ÇB-ÓkhŠ[)ˆJô‚ Ó¨±±«ˆ£K_ôƒn¥~‹Äš¢À¿¿e˜p è@·L{·£{ÁßH¹HƒI²V=]œË@ЧDbÉ“ 2ƒ? ƒ¬v'F—%7~•&#í#ë\¾L¯Ã!Áû  #9C–RXœ%¢¥´$ZÇr8¬¢C9¹HÙ…‘W=1ûz¾¿/NŸÉ•EŽO{ï<Ëg~þ1ÙUê hÀa©¿_NÉ‘jwstêJåçi&tmª?ª‰6µ’Úkt"¬Õ Tî&Q ‡¿†u¸Nೄ:v¯É)§µbÜ\Í §7–ï@þw߈•Å‚e›ÿ Ñàç›oé–R¥º…XqfîbîÊœ5„b4L;eþ4²Â«G´„rc¶‘ J æ{1òÆ“Ét6ž=N'ó»éäûãšàÍNšÃÙ…³û—Ùüi<{8]N·1Ÿcüš~ûýó~þgü\C8Õ´«-èÀïÐÀµ[¥î#ãç—/þu¿æU\~kZ—ql5÷‰E\ ÐZâ€dÓ™_œà}På9¸fA_Lîí?PK Àj7h"Š%mbuildfiles/template.xml’Ko‚@…÷þŠéìeꢉmA -‚©íÊŒ8"†W†‹ß‹mS[›.'ósî3jw—Äd#dei‡¶”[JˆHƒl¥a‡:#¯ÙnßÝ7[´«5ÔË3ý·¡MÌ,]Fa)Ž{}Ç$´ÉØ “@z|_Ýe èÀ˜å[gš1Û¥„®òÆÖ`¯$¨šó½’É5¨,`A1ðœļ(:©“âC¿sžçÊDÌW>O%ˆW1ÛZR×ZJ×ZZWHg¾°Q»°Q‡¨i‡¨Y‡€úËHeëHëHUkA­—BÚ¯„H÷•¸ÕBq«EÂú¯Ä­IØ.5z-i·XÔøµ¤ýb1Ó7R΋¥]—”j9IX½)Õq’õXZªç$iûVÖs©”ý;÷}Rïä|–J;¾“õÜ'åôNˆœßI»¼“q}/ëy]Hº½—8 ëùa‚¡‹œ÷yï þ7ä}>L0v‘÷ý8ÁÄEÁÿGÅà›Šþ‚>*Ð'¥àOÊ!Ÿ”B?)…}R¡ÏÊ៕#>«D|VŽü¬ùy™½JÔg•¨/ªQŸ×˜Û«DV‰þ²ÆÂ^9æ‹JÌ՘Ϫ@FìÕØ/*q_Ô€Œ¸/ªñ_Ô⿪ÇQMøª–ðE-á«jâWõ„¯ê‰_T“€äW5 ™ôE#éëq3ä¯ÉßÔS¾ª§|ÓHù¦žúU„¾i¦~UOû¦™öU3í›Fú7M Êø¦™ùM+ó›föwÍœï:Ùß´r¾kç|ÓÎùþÐRE·èÇS>½âÌøþ˜óý±àûcÉ÷ÇŠï5ß¾?¶|/Þüø? pÅ¢ÎE©‰%©) å™% !© îž¾ Š?Y¹þ3耲(³0pücp|¹£QÑ}©GÐNÏËl¾Òö lj<.ìèÕJa9ùø™·´S×F¡ÃL¼Ò*13&«qÏrèPxûó¢cÿü„‡Ä$–^Ëü –›˜„ŒR8æÜhl‘2 ž¡3“áÀäP†”5yìüšžr9/®tò„-a ø˜âê+ÄêaQXô°á ﬒-m\R ‰f¹M Íl«²\Žró1Ì2 dº º©MP y©¹y–gÑ&›.åüR:ád7-fé÷NŸ×°+8­w¦N܇ŒN¦eÇ8­3XY¬PK Àj7gü \à›plugin.properties]PÑjÃ0 |÷Wþˆ‚²†±V ý+Aó¬–åïçD¬ÓƒÑw'Y%ÞJÿ…Î(²Â ù CðE2›ÂùAy—|dxõ+sª÷(”Sö„ëÄT„rrWµTX0!ÓU#Δh“T˜3?Í3æÜSuW3°O5zuºeT7„ÀX«¬6‡Î_ÛÊÎnoc$Å·Ö’Ÿ)’çËxú%·ÕÞsû².iO©ŠFbœÚ]Ö®i‡˜ié*`ß(âÁL9 ~Ëœ=*€KÌ+¨"ì EºNÛ?ñæPK Àj7´mIqå» plugin.xmlÍVÝOÛ0…åÇ \(í!-H &MBÐi“›\RW‰mÙNi÷×ÏŽ&éK)ëCÔÜ—ï~¿»s¢›e‘£(Íá rŽðX$Œg#üsröߌO¢ˆs&54¦—ÖÔid^fŒO>E°4ÀIÁ¸a¡2üÈ«6Dƒ²î$ ˆ*¹aLV4¶ÞE-r„âœjÝ3oâdÀA±ØÇ³‚â4'ß¼ô¥²yö!±—€Ž“¦Êÿ;³B×d‰¼i°a‰?¯ÊLéŠÌY8‘&T¡ê܃§¬Ãáùx"Tw…ö„yW ½&d‰Ç•Ы,*…HÊ܃bXÖÙBð S¼ö´²!ž¢!¹t/îq…ã:N4hAëÂ[²k¶,ø‡’çÿ·¹k$¨?Žþ­†!ä8ÂF•[~­Ôá¦öߤ§–ïh†ºj“£Û¯ 5…]0Qª»ccÞÖ‘šà3ªïOYV*êëIi®¡U,ãÌ0š¿j,Ú)!iésZòxæƒÔ(ÿ+½¶O8Ø‘„7‚þ‰kZËËiÓ2;•J¤,og§ UæRõ©œæLÏBl˜L,±¢´½y1<·?ÜÒ Ù(¯ººRJÛ/ú aàAh£k|ÆÁ(4íëeñðcÔ{BJF^Ùª’{E³¸©g$ ïëÙxá­66Uÿëw @¿.¶Y¿¹BuJ²Ë¥ÆîªôÆTô¯jËÓW…Þ]Öîz¶y¯¤oR?ß}³Uƒ.©™=)±`‰ÝÔM¿í3A·zmª20”'y¾n¹­$÷¬æ$~þ ˜;å{YiµãoPÞÔp3©ï†:„[\#Ö…´]­FGÔ×Ý þßcA3hõ sï}­2lÑ»KÁ=Cο ã+’±ôˆ3ø¿Ò b=ÑEQNìý4‡Ø”Æ`ª²“…Ùõ’‚ÛræR}Ç~v³µ…]ÅDƒðÅýPK Àj7*É¢S~™ servers/jetty.serverdefÍWMoÛ8½çWD¯&,°Í’Š Þ"ØmQ£Îí© ¥±Í¬D $åùï;$e}XºÉæ°öEœ73ïq8Ùñ»}YD[ÐF(™K:%ÈLåB®ò×ý‡É5y—^ÄVš›htüRK+J¸ˆšÆ#†xB6ÖV7ŒAVˆÊUzÍŒeÆÇ±5HÐ"c!Íý¡‚¬„™ÉIº½mºÝnGw¿ølWÓé%ûúéã"Û@É'BËe½h#nŒ?ªŒ[¿§—«ŠÎ7Ý›<êx%/!!€µ‡_éžtݺeêýâJ« ´=´Q"Oȃ‹¹Seo_BÑd‹tÓaµ$$2«ô¡2%-ìmBt8ŸÉaÅëvPµþöý]+e™''û©À÷J®Äz$1˜£¢3i¬Æ&"GãXiPrFè›mUØ,è¤ØäTª—Ýæ¹cF"ï”±O‰{†¨Ë«·tŠßËq½¼ˆJi;➣ñ¸¯§×Ó'¶nU5?Ǽ@ "/gûÛyöªBfBèg‰fÇF}…" ºbK^U扢ԕ;[)•õC`Ü-‚÷HáR©¸|ŽÄ/ 8M(L›¶^±Té›Îö3|î8=Ò;Shw‚Û²*SEºñh» ùY ‹RåuÑu»HqÒQ¬UÌüª—¸^Âlð|PS{Œ(¬Œ¼qøÃ 4¾ Å1J#Õ‘„šÐfœR.mÔ&íÇ7;è«&郪•\È÷7ÆS–¸ã%?PïE?!†9Z.j§ôߨ_mÿ¥ýî‰Ù”|­yy«×u Òšcd˜uþ†]ì¶œs„ÀâøO'³0¶6H™ôé£#âŽ/iZ"êÜ3fšC÷Ÿçtþù˽›[ßÚÿüý[b Ó`c6ÑiË\…*n7ÝB_ʘÁCpÌš#i–Žüÿt>“‰SôÂsL2(3éÕ™¼J¡7µÍÕNþ¤Ömu/N.ŸŸmϸw¤ÕåȹåÖ(vk?s–µ(rºÂ7yÌZã‰ã–5¤Ì»:OÝ‹9‡–•¥}JL§{g –6~´ac]=YaˆÑ‡+€Î{ è¿ê©åóÕò¥šzÖa/´Óý4 WD]Ù¹Î6b ‘ó;ym†kùÀuû#&êuã¿àjZøUéðåtúï"½øPK Áj7 íAMETA-INF/þÊPK Àj7ïŸ%Qä+META-INF/MANIFEST.MFPK Àj7 íA®buildfiles/PK Àj7íA×icons/PK Àj7íAûservers/PK Àj7?W¨£, ¤!.classpathPK Àj7w«äî¤ì.projectPK Àj75~=AƤbuild.propertiesPK Àj7॥óläôbuildfiles/build.xmlPK Àj7h"Š%m¤’buildfiles/template.xmlPK Àj7í¦rnAX¤4 icons/jetty_tiny.gifPK Àj7gü \à›¤§ plugin.propertiesPK Àj7´mIqå» ¤¶ plugin.xmlPK Àj7*É¢S~™ ¤Ãservers/jetty.serverdefPKQvjetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/site.xml0000644000175000017500000000157510720012705022710 0ustar moonmoon Eclipse Update Site for Jetty Server Adaptor Plugin jetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/index.html0000644000175000017500000000374310656761336023241 0ustar moonmoon Jetty Eclipse Download Site
    jetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/web/0000755000175000017500000000000011745736516022014 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/web/site.xsl0000644000175000017500000001576110656761336023520 0ustar moonmoon Jetty Eclipse Download Site

    Jetty Eclipse Download Site

    dark-row light-row dark-row light-row dark-row light-row

    ( - )
    -

    Operating Systems:
    Windows Systems:
    Languages:
    Architecture:


    Uncategorized

    ( - )
    -


    Operating Systems:
    Windows Systems:
    Languages:
    Architecture:

    ( - )
    -


    Operating Systems:
    Windows Systems:
    Languages:
    Architecture:
    jetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/web/site.css0000644000175000017500000000131710652567221023463 0ustar moonmoon jetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/features/0000755000175000017500000000000011745736516023055 5ustar moonmoon././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/features/org.mortbay.jetty.serveradaptor_1.0.0.jarjetty-6.1.26/contrib/eclipse-generic-wst-plugin/site/features/org.mortbay.jetty.serveradaptor_1.0.0.0000644000175000017500000001360310705551046032042 0ustar moonmoonPK Áj7 META-INF/þÊPK Àj7Oôüq\jMETA-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àårÌCq,HLÎHUŠ%ÍAÒÎE©‰%©)ºN• õ¦zñ–ºIÆ Á¥y ¾™ÉEùÅ•Å%©¹Å žyÉzš¼\¼\PK Àj7C5sÌŠ.projectuÍ‚0„Ïò†;­Þ@iWRC²-FßÞˆ‰·™Íì|ݲê©ÛåÐ+k¶ùš¬ò%a¥2Í6¿^ŽÅ&¯ÊŒ9´wá^ r!†ËlÁ ×PZlˆ¶jþ"wáE<`lä’»`±¸£}:n «5˜P2úQq8|ÒôÛÔjåÙˆftû¸ÆLƒ¯7€h•ó@œr˜»”œÐ1αéÓ–Î<£?ýã`ÄGVj¢ƒþG>M7÷©Ô4-O÷Í~ó PK Àj78ÓoRÊbuild.propertiesKÊÌÓËÌKÎ)MI-V°UHKM,)-JÕ«ÈÍщáR@I¥™9)zEù©E%™©Å˜*@’Y©É%˜2Y©%%•zé™i\ÅEÉÈ66¯›æPK Àj7: ²Áx feature.xml•TMsÓ0½ûWìøÀÀLã„^`h’Nš¦`( S§dz”í£Ž,©’\7üzVþ  í|±­}zzûvWãó§RÀ#Ë•œ„ï£Q(3•sYLÂÛõÕàcx> Æ[d®2@óð|*SD¥2.eûèÛG ±œi§LØAKQL¯ŸQ¢á$ fÇÐC¤£[ÕF=òÍ@²'áw:.ØæJÚJ8ÒÙ#yÉ B´b ¾ §Œs´™áÚ÷´ƒ®wÜB—S‚­L^j%JÇüØ*n‡°IÖò`[ÉÌǘà„w ˜ª†LIg”µýÃÕš\ZÇd†ÀlP£ô†µP{Žß°ÈסƔiíEÝcæ¬'ç.jeÒ,eJï /v®ÏlÞ/Àéhô^± ~¬k—·”Í‚àJ’QªÚÎ9ýi8¬ë:bše;Œ¨êÃb‡×ñ|±LƒSªVþuÌ¡’T´Æ·Y³µœÀ϶Î@Ûà­¼a¥>{¨”;ë0Ï ïÎ`¯*()©T¤Ì5µãŸ2ÔŽ¼%ã©d¼1¸æn×ÛqEpרÔ1Â2ð9{ËPÀÿžnp+Z *n(ÛtT5‚²”„ V5 + RÌWPBm¸wÿ¬ÚºšQßåÜ:ÃÓÊ¹Õ ¢$ä“N͈“ç_¸˜%qr›xýeu»†Íìæf¶\Ç‹V70_-/ãu¼ZÒßÌ–wð-^^ž’Wt,>iã³!ɾõ9æQ Éé‡ÀjÌø–fX0YT4pP(jpéK£)¹õµ¥Y’9‘ñv„ìËüºŽîÌíšš®ï£q¥sæ°¿?6˜:šÑðE_Öm ¢b;BápÚ’7tͧUÁeGý=¹ª¥P,Xþ‹.˜ÑA¨™k!^‰üu›‘¦`<쮜iðPK Àj7 ÍùÐÕ jetty.gif”y<ÓãÇ·ÙiÛ{÷ìpŒ1Œ1D³¢9C9–úhÓ瓊jtQú¶¹’sJåó !iŠÒ=G‘®u|„ä3JE‡)Ÿ’äóûüþx=Ï¿žÿ=_«ýîÒèÝ¿ $f„Ášbx"ŽL šâlÃÁb-pd@6%Ò¨F3 Þ”BaQM¨ <™I7¶'Ql)tk#Š ‰dK5c3BΊnffÂúo¶ ŠÉJ²‘?‘D|¨d¶¥…­9‡Ç²ò¤›q,­m,ÙÆŒµd#ÛÒÕÌ*؈αáÄÈîææ¾Æ¦«L-b)èÉÛÄÚÕŠ-bÙDÓ™v<®£÷7Å—å¸ÜÆNÈqp°w\Æå®±°Œ03_gÆñà:Ç›¶2qYŒ4£­Lj¬™­»££“ ?™NZîâ’À²9¹¦SÂyöRg—#ÕŒ¸ÊÍ] \¾ÆÙ9ÂÑeÛ&e¼Jèî±je›q€c§d‘òØÔÕž"‘W†™—è =;F¸bßýÛt³›0Î]PlM>Ê¥UX0üVûîpùûU[Öúú•ÙÐ#}ü×lôñ©²ê8fUbíÀ&·©âÌèÙ¾šÃû.¯”b̹gG?^BÕþ&ÂÆýì\§°]ê(x›)÷J×Ì÷F³.½N:+¥¬Åµéâï.ý³‹ƒãKƒìûF,>µ?Bã•›{ì—LœºÒ9ÿ±°CçÔ¶BÊßä=‘ÏkÃEÖw#^³ê  =êÊ[A}¾‚ç³'šÆNRS!ΣâgPÚëYpϨ’TYA½h¹çv1Mã $Hþ_¦ùïõ8g£üŒÏ9Ü›K³km³,¶p¸§uÖ§ëEtAN–ØsBöœ EÙ0³– ÒJÚy‘¬g¯„Äö{3O‰Ö9ê`b.j0l3vùŠZKच¿óæ蓌‘¿ß&Ý·>ó|GÇ•ÔJ¢f‰V&‰w½—Ú÷ô»®,8ãžMç5_ìÏàwæÂqRî¿9þú鎕wf¯ôïc_¡ã‹Nˆw¥ß)ܬv>…=ä¿IÁºÆ‡9™9˜w†>\6Úx¦:Šþõ†–º»h¼ ß×.|oq_Vâƒ<¶½ ’5 ²ä'"ÁF%ݨUóª^ƒÓ¥ÒŒ UÒýѶî¸ß=QǾöˆóÒ9:zZ‹Zz5í ê v®ÔlïÔøB»s @éÝâ?á®uámC¹„#Œø]îo¬, Ð÷ÐÛIm9czH¡©‹Ê£ð3™ÈNfG™"X”’úÅ9ËŠà­ák(K.z°1²íèF¾à:c‡—cFýt¤Å?ãte¾‘,žÚÖßvË»£SŠy¶ áÆ]ßV/¡ *á®ý߀KR{VìeSWïRUئ4²;”JAÉ2èû zä9+ßœjí?w‘®Fø·@èÕwÍD¼*Þò^îž÷>úÌbß»†þ©ùÌ\ÅÁÇ«‚È¥ ðAÜ™¬GUI½ F‡`ÕÖü AÊŒI B=ÖY²G¢>‹ÈæI |øJXOàõpmúÄoÍò-Ìeê<ȱâI»Ÿ’•ã‘ ¡'Îù“0^W·Yeœ>œZ7ä¬9šÄ]—»¤ˆ'eÓöT8?Á¡Zݹq3½_ìÇ+0NƵ™B ”^CaD¾ (fºÜ%þ¾Ç+v¸=›+(‘ƒS#”ì:v‡Ä<Ó*©\†L@\¹rd•ñæBɈ\ï~Õ!WÚý Š~át •¦†°•㙞´¨Ø2¤Æ”ë´»´‡¹aCN•©Uâ0,ƒ;W7È£2Y}Âk™ä¢/>f!ò,çúmùû!*rsÿ¹€(B~Ø|¥Vçkzi¸ÝB„9âþ¯1Ï¢ŒUíè{dE·Bqu:Šb¦÷ZiÛDo5/°Ï†ôª¿(ö´nÕj°Ol‹Ý’ Gç—2†l¨Öœ¾‰·ý`aBKø~æ!äªÏÉòˆ÷Ôº`–ñžBµaP%dT€®#cð$Y´-ꘛ#à ?¶ûóKßÙ¸xq³ëƒqÀÉÒâÂÓH˜ÿ8jN{½Yî‡?¯1ô8貂ØéTA¨Íª,ˆenÂÞ;¶J¬†¶ÕF_&>s^Ä÷aCÏG¦JÀ±’VÞ²p9WV Iî8E§D%uÊÅÙù©’[. µÉÅ«h-vôB¾©þ¡ 1áâÇ“£j³ûZ!î•ÚŠǾSÚlülóèÐ!¹ñýN…o^–ÇÏ8‡ÿ~ž[¦F$Ο,Ìj*”Å<Ï䵓Á|0ãšÝÓP2 ÂÐÊQé¢­Þ ,H¼îÒ+GÌ?:AB¦jÈó âé׸# ¦‚‰‚iܲäõQÏãáP|;„ªØ%ÊÉ@+üéèîxè­¦eõ¨Íã5¸Ü´ Vç„m+a›¼*¹$Û­—Ì[ÐpP“ߨ!ä zÍñOI»®c=ÕþnÎ]PíÛòèÎ^ó¸qHJÒŸêM§ÌO>ňD˜jû½¶— ‘!¬Kƒ?²3½ ð|ßïgøvêt£ˆ`+ƒÙKžÈ’Ÿ0ßme{ž„ÒTÔ†êÎÞ¥r¹ª"tÐvóœ’#ëF)¬#Wí6&Dœ‘#µ½v„£Å*È[=ÏõÔÀ”:NòjÜÓ]»ÀÛÓu”PÚó¯×RÄVN·Š`Ü]¦1ßëÃÁz7¢[m†ÿâiI©sqÐ"Ïyu%ž‰¸8“2/¬¥ÞÔ\¿ŸžÁÄã‰[ žŸ ï6Š#Ù±$Â!¯BC]­‘û«ã„pØÞö×4{eïc¬ÙÞ sæ˜i¼Ÿ!¾+mC)„|Ð:ݶ1(£å=ؼñ”e‚ÓŒJ|÷ØÖ‘ÄÆ&}SÑE“‹ÅÒ•¦3á30Ž6àw$c¬î„jƒ©¯[C–€è%õѼÀo&*Ÿ¹óƒÇÊj(“¢ÕBUx6:òïŧ}K†'Ëvg"^þ ênü¼M0 Clîc®TCZcÐaû|ì>ô˜}Soh‚ ö¦Õ¦{_õÀ5š(ÆÜQîOA–·c†ùÀ„,ìšY CV”¢û5­s_„…ùïU¦%%À° Ó¢Feb:0°?þóDÀ Ó¢GhNû0÷ñØaðNtd`ݲlð š8„Þª1ÈÒ¡–ŸÀó±¡ý†™,˜…}c5V«BGè ï°ŽìQb‰¥ØI‰WOñ‹žÁʰB/Ýѣ׫a³s˜[@Œö±ÌÛŠíÝ‚-¸å½fe¸Y=à›€Õ²Ö¸Ðo:[¬<À|±nÙ·þ@ìR·¨àÛùùbLŒ‡‰Uˆ#óh‹yt \|N„ÞòmY1eAÃxó1Oõ˜-|ÔÃ2èíÒè~¦±~}8üŽ“c“¡ÂCwj}ìd˜Åg90¡±•c‡5Ø/4`Nì$˜Í}/ÆYÅ0«â‰0 p˜Åã>Ê€vo'Ø x/üPâéÝ|!ÙÍ!YXöÅÍÚâp9|“'AH/a¶àizX°1ŒwÖÄõ´/BÌq”·´ãו°=¢EI²dzÞñK½Óû)`Pn¹ ÇUÏÕ›Ò€÷ʬ©˵ÃÀIé[Ñž<fù¶ãdT‘4íx—¶âª¡g¹©G7ð^¼ÂcSèØÛ û—òT{ –r)ºÁü8ã5ì«ÿ®c,d„V†~:žUR fѲkM§ ¸l)-~¼Ìãbù,‹YN ]¯,Fåkн’І´Šæ@Ì9[t‰¶„(P¡ß÷Ui•ǧÄpÉ( ˜Æ3gt@ŸØ)æj23ÿ<Òaî* ›Â'XÙ•ÐtƋҚ)“¡òªú%s*e‚?N/œ2 M+ßÜUr´j> ÷„ü8\½ „œ¡çïâ×´5Â÷é+xköVe™3Kš€·ò¬DX锈´ >¼ž°¨+ †AØ>V¦ç6'Æ{‚LZ¯0¢Uq¥Yrídy­ ƒÂ¨šúLkЇåØ2¬ÔûTbݯDW« ý³ŠŒz¸ôk¸yPég¹åw­IMcåô¸?YZ»†›QÚcñ>¢ÄŽpçYâ —úèõâ‘Ú]õ¸ï꺷Úâ™\숖_ÖŸw_Ö@ªPD à„Œ:1ªb¬ÄòªÌ©«aãBÍ[ðF³b¾ºJ^¬PÜ^ghäa˜7©Ê0 ,þǦxT…îV²ÔÖ¤•çh:ܬÚ7Ý0£>騝ÖÓ9ÒF¯…¦ ÆÒiei`àßT±ï² 1FªÒº¸IÉ«u^yf;üš9ãU¡S K¶ý\\Õ°ÉH'Gq ž6Käl¯6消»Î̓«ëkÏO *Œ·“V€]“Ow××_Y Ž˜ p?Ž´2*Î]«h5WÔin/œŽ½€'\X¸váñ@á›  ZñPK Áj7 íAMETA-INF/þÊPK Àj7Oôüq\j¤+META-INF/MANIFEST.MFPK Àj7C5sÌŠ¤¹.projectPK Àj78ÓoRʤ«build.propertiesPK Àj7: ²Áx ¤+feature.xmlPK Àj7 ÍùÐÕ ¤jetty.gifPKa jetty-6.1.26/contrib/eclipse-generic-wst-plugin/feature/0000755000175000017500000000000011745736516021726 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/feature/build.properties0000644000175000017500000000031210705551046025123 0ustar moonmoonbin.includes = feature.xml,\ build.properties,\ .project,\ jetty.gif src.includes = build.properties,\ feature.xml,\ jetty.gif jetty-6.1.26/contrib/eclipse-generic-wst-plugin/feature/feature.xml0000644000175000017500000000257010720012705024062 0ustar moonmoon This feature provides a Jetty implementation for the WST Server functionality to allow control of a Jetty server instance as well as deployment of Eclipse webapp projects to it. Copyright 2007 Mort Bay Consulting Pty Ltd Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and imitations under the License. jetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/0000755000175000017500000000000011745736516021571 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/META-INF/0000755000175000017500000000000011745736516022731 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/META-INF/MANIFEST.MF0000644000175000017500000000115410720012705024337 0ustar moonmoonManifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Jetty Server Adaptor Plug-in Bundle-SymbolicName: org.mortbay.jetty.serveradaptor;singleton:=true Bundle-Version: 1.0.2 Bundle-Vendor: Mort Bay Consulting Bundle-Description: Generic Server adaptor for Jetty Bundle-License: http://www.apache.org/licenses/LICENSE-2.0 Require-Bundle: org.eclipse.wst.common.project.facet.core, org.eclipse.wst.server.core, org.eclipse.wst.server.ui, org.eclipse.jst.common.project.facet.core, org.eclipse.jst.server.core, org.eclipse.jst.server.generic.core, org.eclipse.jst.server.generic.ui, org.eclipse.jst.server.ui jetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/schema/0000755000175000017500000000000011745736516023031 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/buildfiles/0000755000175000017500000000000011745736516023713 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/buildfiles/template.xml0000644000175000017500000000142010720012705026220 0ustar moonmoon org.mortbay.jetty.webapp.WebInfConfiguration org.mortbay.jetty.plus.webapp.EnvConfiguration @ANNOTATION_CONFIG@ org.mortbay.jetty.webapp.JettyWebXmlConfiguration org.mortbay.jetty.webapp.TagLibConfiguration @CONTEXT_PATH@ @MODULE_WAR@ true false jetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/buildfiles/build.xml0000644000175000017500000000511510720012705025511 0ustar moonmoon context Root = ${contextRoot} context Path = ${contextPath} After just name test, contextPath=${contextPath} After double slash test, contextPath=${contextPath} after third test, contextPath=${contextPath} and module name=${module.name} jetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/src/0000755000175000017500000000000011745736516022360 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/bin/0000755000175000017500000000000011745736516022341 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/plugin.properties0000644000175000017500000000063310652567221025176 0ustar moonmoonpluginName= Jetty Server Adaptor providerName=Mort Bay Consulting pluginDescription=Provides generic server definitions for Jetty Server # ============== serverdef translations ================ serverAddress=A&ddress: serverPort=&Port: stopPort=&Stop Port: jndiPort=&JNDI Port: jettyHome=Jetty &Install Directory: jettyConfig=Jetty Config &File: contextFile=&Context Deploy File: deployDir=Deploy &Directory: jetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/servers/0000755000175000017500000000000011745736516023262 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/servers/jetty.serverdef0000644000175000017500000000623110656040340026311 0ustar moonmoon ${port} Http http jst.web ${deployDir} org.eclipse.jst.server.generic.antpublisher org.mortbay.start.Main ${jettyHome} ${jettyConfig} -Djetty.home=${jettyHome} -Djetty.port=${port} -Djetty.host=${serverAddress} -DSTOP.PORT=${stopPort} -DSTOP.KEY=secret jetty.start org.mortbay.start.Main ${jettyHome} --stop -Djetty.home="${jettyHome}" -DSTOP.PORT="${stopPort}" -DSTOP.KEY=secret jetty.shutdown build.file /buildfiles/build.xml target.publish.jst.web deploy.j2ee.web target.unpublish.jst.web undeploy.j2ee.web jetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/build.properties0000644000175000017500000000142710705551046024776 0ustar moonmoonsource.. = src/ output.. = bin/ bin.includes = META-INF/,\ .,\ plugin.properties,\ buildfiles/template.xml,\ icons/,\ plugin.xml,\ build.properties,\ buildfiles/,\ servers/,\ .classpath,\ .project src.includes = build.properties,\ buildfiles/template.xml,\ servers/,\ plugin.xml,\ plugin.properties,\ icons/,\ META-INF/,\ .project,\ .classpath,\ buildfiles/ bin.excludes = META-INF/.svn/,\ icons/.svn/,\ servers/.svn/ src.excludes = icons/.svn/,\ servers/.svn/ jetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/icons/0000755000175000017500000000000011745736516022704 5ustar moonmoonjetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/icons/jetty_tiny.gif0000644000175000017500000000213010652567221025560 0ustar moonmoonGIF89aç¡ 6O P P Q j Q Q Q Q$R !k;-;-;-,Ÿ2‡2ˆ5ˆ6ˆ'éY#;Y$;Y%;*é+ê+ê-ê:¡:¢/ê;¢=£2ë>£3ë?£5ìC£E¤u*B:ìu,BH¥u.B=íI¥?îG¾@îL¥AîI¾BîBîCîDîEïI×EïFïPÀIð1DKðKð OØLð3DMñ4D Nñ Oñ!SÙ!Oñ Rñ"Rñ"Rò"Sò#Tò"Uò"Vò#Vò#Vó#Wó#Xó$Xó#Yó%Yó¬6?$Zó$Zô%Zó¬7?$[ó$[ô¬8?#\ô$\ô%\ó%\ô$]ô%]ô$^ô&]ô%^ô%_ô&_õ'_ô%`õ&`ô&`õ%aõ'`õ'aô%bõ'aõ&bõ'bô(bõÇ64(cõ(cö'dõ'dö(dö'eõ(eõ(eö)eõ'fö)fõ)fö(gö)gö)hö)iö*iö)k÷)l÷,kö*l÷+lö+l÷á9$-røü5.søü6ü7ü8ü9ü:ü;ü<ü=èìøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù ÿ,þAé¸!G¥HŒ¹IÓM? <|HÑÁˆ*dÉãæKBŠà@à $\˜“& š@ˆ íùÑ"ŒOŸ`P@ab9o¸€9²€2dœÜ„4S˜,™À“Ud¬n0Q)IlèÔ‰ V¤PôQdEMH8qrá€Á šà„† a6m‚ @ƒ(ªjDÅ š4QÐ%²†Xª¨„L™ºÒ¥‹Tˆ0YÄ L˜2 0` À‡¨ˆ‰d€%K|„Ðd†ˆB’ôlqD€sÀp)ÒƒƒšIr²<Š#è,Wð°qr£Kgž€ºSf™,^ðh‰¦Æ ;h@;jetty-6.1.26/contrib/eclipse-generic-wst-plugin/plugin/plugin.xml0000644000175000017500000000567310656040340023603 0ustar moonmoon jetty-6.1.26/contrib/terracotta/0000755000175000017500000000000011745736517015277 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/0000755000175000017500000000000011745736516016065 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/test/0000755000175000017500000000000011745736516017044 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/test/java/0000755000175000017500000000000011745736516017765 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/test/java/org/0000755000175000017500000000000011745736516020554 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/0000755000175000017500000000000011745736516022231 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/0000755000175000017500000000000011745736516024401 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/0000755000175000017500000000000011745736516026065 5ustar moonmoon././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/ReentrantRequestSessionTest.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/ReentrantRequestSession0000644000175000017500000001126611107137212032651 0ustar moonmoon// ======================================================================== // Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.testng.annotations.Test; /** * @version $Revision: 1319 $ $Date: 2008-11-14 00:55:54 +0100 (Fri, 14 Nov 2008) $ */ public class ReentrantRequestSessionTest { @Test public void testReentrantRequestSession() throws Exception { Random random = new Random(System.nanoTime()); String contextPath = ""; String servletMapping = "/server"; int port = random.nextInt(50000) + 10000; TerracottaJettyServer server = new TerracottaJettyServer(port); server.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { ContentExchange exchange = new ContentExchange(true); exchange.setMethod(HttpMethods.GET); exchange.setURL("http://localhost:" + port + contextPath + servletMapping + "?action=reenter&port=" + port + "&path=" + contextPath + servletMapping); client.send(exchange); exchange.waitForDone(); assert exchange.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } finally { server.stop(); } } public static class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session == null) session = request.getSession(true); String action = request.getParameter("action"); if ("reenter".equals(action)) { int port = Integer.parseInt(request.getParameter("port")); String path = request.getParameter("path"); // We want to make another request with a different session // while this request is still pending, to see if the locking is // fine grained (per session at least). try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { ContentExchange exchange = new ContentExchange(true); exchange.setMethod(HttpMethods.GET); exchange.setURL("http://localhost:" + port + path + "?action=none"); client.send(exchange); exchange.waitForDone(); assert exchange.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } catch (Exception x) { throw new ServletException(x); } } else { // Reentrancy was successful, just return } } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/TerracottaJettyServer.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/TerracottaJettyServer.j0000644000175000017500000001045011107137212032533 0ustar moonmoon// ======================================================================== // Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.util.concurrent.TimeUnit; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.SessionIdManager; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.SessionHandler; import org.mortbay.jetty.webapp.WebAppContext; /** * @version $Revision: 1319 $ $Date: 2008-11-14 00:55:54 +0100 (Fri, 14 Nov 2008) $ */ public class TerracottaJettyServer { private final Server server; private final int maxInactivePeriod; private final int scavengePeriod; private final ContextHandlerCollection contexts; private SessionIdManager sessionIdManager; public TerracottaJettyServer(int port) { this(port, 30, 10); } public TerracottaJettyServer(int port, int maxInactivePeriod, int scavengePeriod) { this.server = new Server(port); this.maxInactivePeriod = maxInactivePeriod; this.scavengePeriod = scavengePeriod; this.contexts = new ContextHandlerCollection(); this.sessionIdManager = new TerracottaSessionIdManager(server); } public void start() throws Exception { // server -> contexts collection -> context handler -> session handler -> servlet handler server.setHandler(contexts); server.start(); } public Context addContext(String contextPath) { Context context = new Context(contexts, contextPath); TerracottaSessionManager sessionManager = new TestTerracottaSessionManager(); sessionManager.setIdManager(sessionIdManager); sessionManager.setMaxInactiveInterval(maxInactivePeriod); sessionManager.setScavengePeriodMs(TimeUnit.SECONDS.toMillis(scavengePeriod)); SessionHandler sessionHandler = new TerracottaSessionHandler(sessionManager); sessionManager.setSessionHandler(sessionHandler); context.setSessionHandler(sessionHandler); return context; } public void stop() throws Exception { server.stop(); } public WebAppContext addWebAppContext(String warPath, String contextPath) { WebAppContext context = new WebAppContext(contexts, warPath, contextPath); TerracottaSessionManager sessionManager = new TestTerracottaSessionManager(); sessionManager.setIdManager(sessionIdManager); sessionManager.setMaxInactiveInterval(maxInactivePeriod); sessionManager.setScavengePeriodMs(TimeUnit.SECONDS.toMillis(scavengePeriod)); SessionHandler sessionHandler = new TerracottaSessionHandler(sessionManager); sessionManager.setSessionHandler(sessionHandler); context.setSessionHandler(sessionHandler); return context; } public static class TestTerracottaSessionManager extends TerracottaSessionManager { private static final ThreadLocal depth = new ThreadLocal() { @Override protected Integer initialValue() { return 0; } }; @Override public void enter(Request request) { depth.set(depth.get() + 1); super.enter(request); } @Override public void exit(Request request) { super.exit(request); depth.set(depth.get() - 1); if (depth.get() == 0) { assert Lock.getLocks().size() == 0 : Lock.getLocks(); } } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/WebAppObjectInSessionTest.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/WebAppObjectInSessionTe0000644000175000017500000001642111253666353032440 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.util.Random; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; /** * Target of this test is to check that when a webapp on nodeA puts in the session * an object of a class loaded from the war (and hence with a WebAppClassLoader), * the same webapp on nodeB is able to load that object from the session. * This is only possible if the NamedClassLoader mechanism in Terracotta is setup * appropriately and it is working correctly, which the scope of this test. * * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class WebAppObjectInSessionTest { private void copy(File source, File target) throws Exception { FileInputStream input = new FileInputStream(source); FileOutputStream output = new FileOutputStream(target); int read = -1; byte[] bytes = new byte[64]; while ((read = input.read(bytes)) >= 0) output.write(bytes, 0, read); input.close(); output.close(); } // TODO: Restore this test once the new Terracotta TIM module has been updated to work with our implementation // TODO: The Terracotta TIM module must be referenced from the tc-config.xml file. // @Test public void testWebappObjectInSession() throws Exception { String contextName = "webappObjectInSessionTest"; String contextPath = "/" + contextName; String servletMapping = "/server"; File targetDir = new File(System.getProperty("basedir"), "target"); File warDir = new File(targetDir, contextName); warDir.mkdir(); File webInfDir = new File(warDir, "WEB-INF"); webInfDir.mkdir(); // Write web.xml File webXml = new File(webInfDir, "web.xml"); String xml = "\n" + "\n" + "\n" + ""; FileWriter w = new FileWriter(webXml); w.write(xml); w.close(); File classesDir = new File(webInfDir, "classes"); classesDir.mkdir(); String packageName = WebAppObjectInSessionServlet.class.getPackage().getName(); File packageDirs = new File(classesDir, packageName.replace('.', File.separatorChar)); packageDirs.mkdirs(); String resourceName = WebAppObjectInSessionServlet.class.getName().replace('.', File.separatorChar) + ".class"; File sourceFile = new File(getClass().getClassLoader().getResource(resourceName).toURI()); File targetFile = new File(packageDirs, resourceName.substring(packageName.length())); copy(sourceFile, targetFile); resourceName = WebAppObjectInSessionServlet.TestSharedNonStatic.class.getName().replace('.', File.separatorChar) + ".class"; sourceFile = new File(getClass().getClassLoader().getResource(resourceName).toURI()); targetFile = new File(packageDirs, resourceName.substring(packageName.length())); copy(sourceFile, targetFile); resourceName = WebAppObjectInSessionServlet.TestSharedStatic.class.getName().replace('.', File.separatorChar) + ".class"; sourceFile = new File(getClass().getClassLoader().getResource(resourceName).toURI()); targetFile = new File(packageDirs, resourceName.substring(packageName.length())); copy(sourceFile, targetFile); Random random = new Random(System.nanoTime()); int port1 = random.nextInt(50000) + 10000; TerracottaJettyServer server1 = new TerracottaJettyServer(port1); server1.addWebAppContext(warDir.getCanonicalPath(), contextPath).addServlet(WebAppObjectInSessionServlet.class.getName(), servletMapping); server1.start(); try { int port2 = random.nextInt(50000) + 10000; TerracottaJettyServer server2 = new TerracottaJettyServer(port2); server2.addWebAppContext(warDir.getCanonicalPath(), contextPath).addServlet(WebAppObjectInSessionServlet.class.getName(), servletMapping); server2.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { // Perform one request to server1 to create a session ContentExchange exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.GET); exchange1.setURL("http://localhost:" + port1 + contextPath + servletMapping + "?action=set"); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK : exchange1.getResponseStatus(); String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); // Perform a request to server2 using the session cookie from the previous request ContentExchange exchange2 = new ContentExchange(true); exchange2.setMethod(HttpMethods.GET); exchange2.setURL("http://localhost:" + port2 + contextPath + servletMapping + "?action=get"); exchange2.getRequestFields().add("Cookie", sessionCookie); client.send(exchange2); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } finally { server2.stop(); } } finally { server1.stop(); } } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/ClientCrossContextSessionTest.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/ClientCrossContextSessi0000644000175000017500000001220211253666353032604 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.util.Collections; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.mortbay.jetty.servlet.Context; import org.testng.annotations.Test; /** * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class ClientCrossContextSessionTest { @Test public void testCrossContextDispatch() throws Exception { Random random = new Random(System.nanoTime()); String contextA = "/contextA"; String contextB = "/contextB"; String servletMapping = "/server"; int port = random.nextInt(50000) + 10000; TerracottaJettyServer server = new TerracottaJettyServer(port); Context ctxA = server.addContext(contextA); ctxA.addServlet(TestServletA.class, servletMapping); Context ctxB = server.addContext(contextB); ctxB.addServlet(TestServletB.class, servletMapping); server.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { // Perform a request to contextA ContentExchange exchangeA = new ContentExchange(true); exchangeA.setMethod(HttpMethods.GET); exchangeA.setURL("http://localhost:" + port + contextA + servletMapping); client.send(exchangeA); exchangeA.waitForDone(); assert exchangeA.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchangeA.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); // Perform a request to contextB with the same session cookie ContentExchange exchangeB = new ContentExchange(true); exchangeB.setMethod(HttpMethods.GET); exchangeB.setURL("http://localhost:" + port + contextB + servletMapping); exchangeB.getRequestFields().add("Cookie", sessionCookie); client.send(exchangeB); exchangeB.waitForDone(); assert exchangeB.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } finally { server.stop(); } } public static class TestServletA extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session == null) session = request.getSession(true); // Add something to the session session.setAttribute("A", "A"); // Check that we don't see things put in session by contextB Object objectB = session.getAttribute("B"); assert objectB == null; System.out.println("A: session.getAttributeNames() = " + Collections.list(session.getAttributeNames())); } } public static class TestServletB extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session == null) session = request.getSession(true); // Add something to the session session.setAttribute("B", "B"); // Check that we don't see things put in session by contextA Object objectA = session.getAttribute("A"); assert objectA == null; System.out.println("B: session.getAttributeNames() = " + Collections.list(session.getAttributeNames())); } } }jetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/TIMLightLoadTest.java0000644000175000017500000002371111253666353032010 0ustar moonmoon// ======================================================================== // Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Random; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.Server; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.mortbay.jetty.servlet.SessionHandler; import org.mortbay.jetty.webapp.WebAppContext; import org.testng.annotations.Test; /** * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class TIMLightLoadTest { @Test public void testLightLoad() throws Exception { File warDir = new File(System.getProperty("java.io.tmpdir"), "lightLoad"); warDir.deleteOnExit(); warDir.mkdir(); File webInfDir = new File(warDir, "WEB-INF"); webInfDir.deleteOnExit(); webInfDir.mkdir(); File webXml = new File(webInfDir, "web.xml"); webXml.deleteOnExit(); String xml = "\n" + "\n" + "\n" + ""; FileWriter w = new FileWriter(webXml); w.write(xml); w.close(); Random random = new Random(System.nanoTime()); String contextPath = "/lightLoad"; String servletMapping = "/server"; int port1 = random.nextInt(50000) + 10000; Server server1 = new Server(port1); WebAppContext context1 = new WebAppContext(warDir.getCanonicalPath(), contextPath); context1.setSessionHandler(new SessionHandler()); context1.addServlet(TestServlet.class, servletMapping); server1.setHandler(context1); server1.start(); try { int port2 = random.nextInt(50000) + 10000; Server server2 = new Server(port2); WebAppContext context2 = new WebAppContext(warDir.getCanonicalPath(), contextPath); context2.setSessionHandler(new SessionHandler()); context2.addServlet(TestServlet.class, servletMapping); server2.setHandler(context2); server2.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { String[] urls = new String[2]; urls[0] = "http://localhost:" + port1 + contextPath + servletMapping; urls[1] = "http://localhost:" + port2 + contextPath + servletMapping; ContentExchange exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.GET); exchange1.setURL(urls[0] + "?action=init"); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; System.out.println("sessionCookie = " + sessionCookie); // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); ExecutorService executor = Executors.newCachedThreadPool(); int clientsCount = 50; CyclicBarrier barrier = new CyclicBarrier(clientsCount + 1); int requestsCount = 100; Worker[] workers = new Worker[clientsCount]; for (int i = 0; i < clientsCount; ++i) { workers[i] = new Worker(barrier, requestsCount, sessionCookie, urls); workers[i].start(); executor.execute(workers[i]); } // Wait for all workers to be ready barrier.await(); long start = System.nanoTime(); // Wait for all workers to be done barrier.await(); long end = System.nanoTime(); long elapsed = TimeUnit.NANOSECONDS.toMillis(end - start); System.out.println("elapsed ms: " + elapsed); for (Worker worker : workers) worker.stop(); executor.shutdownNow(); // Perform one request to get the result ContentExchange exchange2 = new ContentExchange(true); exchange2.setMethod(HttpMethods.GET); exchange2.setURL(urls[0] + "?action=result"); exchange2.getRequestFields().add("Cookie", sessionCookie); client.send(exchange2); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; String response = exchange2.getResponseContent(); System.out.println("get = " + response); assert response.trim().equals(String.valueOf(clientsCount * requestsCount)); } finally { client.stop(); } } finally { server2.stop(); } } finally { server1.stop(); } } public static class Worker implements Runnable { private final HttpClient client; private final CyclicBarrier barrier; private final int requestsCount; private final String sessionCookie; private final String[] urls; public Worker(CyclicBarrier barrier, int requestsCount, String sessionCookie, String[] urls) { this.client = new HttpClient(); this.client.setConnectorType(HttpClient.CONNECTOR_SOCKET); this.barrier = barrier; this.requestsCount = requestsCount; this.sessionCookie = sessionCookie; this.urls = urls; } public void start() throws Exception { client.start(); } public void stop() throws Exception { client.stop(); } public void run() { try { // Wait for all workers to be ready barrier.await(); Random random = new Random(System.nanoTime()); for (int i = 0; i < requestsCount; ++i) { int urlIndex = random.nextInt(urls.length); ContentExchange exchange = new ContentExchange(true); exchange.setMethod(HttpMethods.GET); exchange.setURL(urls[urlIndex] + "?action=increment"); exchange.getRequestFields().add("Cookie", sessionCookie); client.send(exchange); exchange.waitForDone(); assert exchange.getResponseStatus() == HttpServletResponse.SC_OK; } // Wait for all workers to be done barrier.await(); } catch (Exception x) { throw new RuntimeException(x); } } } public static class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("init".equals(action)) { HttpSession session = request.getSession(true); session.setAttribute("value", 0); } else if ("increment".equals(action)) { // Without synchronization, because it is taken care by Jetty/Terracotta HttpSession session = request.getSession(false); int value = (Integer)session.getAttribute("value"); session.setAttribute("value", value + 1); } else if ("result".equals(action)) { HttpSession session = request.getSession(false); int value = (Integer)session.getAttribute("value"); PrintWriter writer = response.getWriter(); writer.println(value); writer.flush(); } } } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/LocalSessionScavengingTest.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/LocalSessionScavengingT0000644000175000017500000001510311253666353032532 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.Request; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.testng.annotations.Test; /** * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class LocalSessionScavengingTest { @Test public void testLocalSessionsScavenging() throws Exception { Random random = new Random(System.nanoTime()); String contextPath = ""; String servletMapping = "/server"; int port1 = random.nextInt(50000) + 10000; int inactivePeriod = 1; int scavengePeriod = 2; TerracottaJettyServer server1 = new TerracottaJettyServer(port1, inactivePeriod, scavengePeriod); server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server1.start(); try { int port2 = random.nextInt(50000) + 10000; TerracottaJettyServer server2 = new TerracottaJettyServer(port2, inactivePeriod, scavengePeriod * 3); server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server2.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { String[] urls = new String[2]; urls[0] = "http://localhost:" + port1 + contextPath + servletMapping; urls[1] = "http://localhost:" + port2 + contextPath + servletMapping; // Create the session on node1 ContentExchange exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.GET); exchange1.setURL(urls[0] + "?action=init"); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); // Be sure the session is also present in node2 ContentExchange exchange2 = new ContentExchange(true); exchange2.setMethod(HttpMethods.GET); exchange2.setURL(urls[1] + "?action=test"); exchange2.getRequestFields().add("Cookie", sessionCookie); client.send(exchange2); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; // Wait for the scavenger to run on node1, waiting 2.5 times the scavenger period Thread.sleep(scavengePeriod * 2500L); // Check that node1 does not have any local session cached exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.GET); exchange1.setURL(urls[0] + "?action=check"); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; // Wait for the scavenger to run on node2, waiting 2 times the scavenger period // This ensures that the scavenger on node2 runs at least once. Thread.sleep(scavengePeriod * 2000L); // Check that node1 does not have any local session cached exchange2 = new ContentExchange(true); exchange2.setMethod(HttpMethods.GET); exchange2.setURL(urls[1] + "?action=check"); client.send(exchange2); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } finally { server2.stop(); } } finally { server1.stop(); } } public static class TestServlet extends HttpServlet { private TerracottaSessionManager sessionManager; @Override protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException { String action = request.getParameter("action"); if ("init".equals(action)) { HttpSession session = request.getSession(true); session.setAttribute("test", "test"); this.sessionManager = (TerracottaSessionManager)((Request)request).getSessionManager(); } else if ("test".equals(action)) { HttpSession session = request.getSession(false); session.setAttribute("test", "test"); this.sessionManager = (TerracottaSessionManager)((Request)request).getSessionManager(); } else if ("check".equals(action)) { int size = sessionManager.getSessions(); assert size == 0; } } } } jetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/LastAccessTimeTest.java0000644000175000017500000001375311253666353032440 0ustar moonmoon/* * Copyright 2008-2008 the original author or authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mortbay.terracotta.servlet; import java.io.IOException; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.testng.annotations.Test; /** * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class LastAccessTimeTest { @Test public void testLastAccessTime() throws Exception { Random random = new Random(System.nanoTime()); String contextPath = ""; String servletMapping = "/server"; int port1 = random.nextInt(50000) + 10000; int maxInactivePeriod = 8; int scavengePeriod = 2; TerracottaJettyServer server1 = new TerracottaJettyServer(port1, maxInactivePeriod, scavengePeriod); server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server1.start(); try { int port2 = random.nextInt(50000) + 10000; TerracottaJettyServer server2 = new TerracottaJettyServer(port2, maxInactivePeriod, scavengePeriod); server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server2.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { // Perform one request to server1 to create a session ContentExchange exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.GET); exchange1.setURL("http://localhost:" + port1 + contextPath + servletMapping + "?action=init"); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); // Perform some request to server2 using the session cookie from the previous request // This should migrate the session from server1 to server2, and leave server1's // session in a very stale state, while server2 has a very fresh session. // We want to test that optimizations done to the saving of the shared lastAccessTime // do not break the correct working int requestInterval = 500; for (int i = 0; i < maxInactivePeriod * (1000 / requestInterval); ++i) { ContentExchange exchange2 = new ContentExchange(true); exchange2.setMethod(HttpMethods.GET); exchange2.setURL("http://localhost:" + port2 + contextPath + servletMapping); exchange2.getRequestFields().add("Cookie", sessionCookie); client.send(exchange2); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; Thread.sleep(requestInterval); } System.out.println("Waiting for scavenging on node1..."); // At this point, session1 should be eligible for expiration. // Let's wait for the scavenger to run, waiting 2.5 times the scavenger period Thread.sleep(scavengePeriod * 2500L); // Access again server1, and be sure we can exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.GET); exchange1.setURL("http://localhost:" + port1 + contextPath + servletMapping); exchange1.getRequestFields().add("Cookie", sessionCookie); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } finally { server2.stop(); } } finally { server1.stop(); } } public static class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException { String action = request.getParameter("action"); if ("init".equals(action)) { HttpSession session = request.getSession(true); session.setAttribute("test", "test"); } else { HttpSession session = request.getSession(false); session.setAttribute("test", "test"); } } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/OrphanedSessionTest.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/OrphanedSessionTest.jav0000644000175000017500000001310211253666353032523 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.util.Random; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.testng.annotations.Test; /** * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class OrphanedSessionTest { /** * If nodeA creates a session, and just afterwards crashes, it is the only node that knows about the session. * Its session data will remain forever in the Terracotta server, but it will never be expired because * other nodes are not aware of that session if they never get hit by its session id. * We want to test that the session data is gone after scavenging. */ @Test public void testOrphanedSession() throws Exception { Random random = new Random(System.nanoTime()); // Disable scavenging for the first server, so that we simulate its "crash". String contextPath = ""; String servletMapping = "/server"; int port1 = random.nextInt(50000) + 10000; int inactivePeriod = 5; TerracottaJettyServer server1 = new TerracottaJettyServer(port1, inactivePeriod, -1); server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server1.start(); try { int port2 = random.nextInt(50000) + 10000; int scavengePeriod = 2; TerracottaJettyServer server2 = new TerracottaJettyServer(port2, inactivePeriod, scavengePeriod); server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server2.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { // Connect to server1 to create a session and get its session cookie ContentExchange exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.GET); exchange1.setURL("http://localhost:" + port1 + contextPath + servletMapping + "?action=init"); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); // Wait for the session to expire. // The first node does not do any scavenging, but the session // must be removed by scavenging done in the other node. Thread.sleep(TimeUnit.SECONDS.toMillis(inactivePeriod + 2L * scavengePeriod)); // Perform one request to server2 to be sure that the session has been expired ContentExchange exchange2 = new ContentExchange(true); exchange2.setMethod(HttpMethods.GET); exchange2.setURL("http://localhost:" + port2 + contextPath + servletMapping + "?action=check"); exchange2.getRequestFields().add("Cookie", sessionCookie); client.send(exchange2); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } finally { server2.stop(); } } finally { server1.stop(); } } public static class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("init".equals(action)) { HttpSession session = request.getSession(true); session.setAttribute("A", "A"); } else if ("check".equals(action)) { HttpSession session = request.getSession(false); assert session == null; } } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/InvalidationSessionTest.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/InvalidationSessionTest0000644000175000017500000001437411253666353032641 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.testng.annotations.Test; /** * Goal of the test is to be sure that invalidating a session on one node * result in the session being unavailable in the other node also. * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class InvalidationSessionTest { @Test public void testInvalidation() throws Exception { Random random = new Random(System.nanoTime()); String contextPath = ""; String servletMapping = "/server"; int port1 = random.nextInt(50000) + 10000; TerracottaJettyServer server1 = new TerracottaJettyServer(port1); server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server1.start(); try { int port2 = random.nextInt(50000) + 10000; TerracottaJettyServer server2 = new TerracottaJettyServer(port2); server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server2.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { String[] urls = new String[2]; urls[0] = "http://localhost:" + port1 + contextPath + servletMapping; urls[1] = "http://localhost:" + port2 + contextPath + servletMapping; // Create the session on node1 ContentExchange exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.GET); exchange1.setURL(urls[0] + "?action=init"); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); // Be sure the session is also present in node2 ContentExchange exchange2 = new ContentExchange(true); exchange2.setMethod(HttpMethods.GET); exchange2.setURL(urls[1] + "?action=increment"); exchange2.getRequestFields().add("Cookie", sessionCookie); client.send(exchange2); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; // Invalidate on node1 exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.GET); exchange1.setURL(urls[0] + "?action=invalidate"); exchange1.getRequestFields().add("Cookie", sessionCookie); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; // Be sure on node2 we don't see the session anymore exchange2 = new ContentExchange(true); exchange2.setMethod(HttpMethods.GET); exchange2.setURL(urls[1] + "?action=test"); exchange2.getRequestFields().add("Cookie", sessionCookie); client.send(exchange2); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } finally { server2.stop(); } } finally { server1.stop(); } } public static class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("init".equals(action)) { HttpSession session = request.getSession(true); session.setAttribute("value", 0); } else if ("increment".equals(action)) { HttpSession session = request.getSession(false); int value = (Integer)session.getAttribute("value"); session.setAttribute("value", value + 1); } else if ("invalidate".equals(action)) { HttpSession session = request.getSession(false); session.invalidate(); } else if ("test".equals(action)) { HttpSession session = request.getSession(false); assert session == null; } } } } ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/WebAppObjectInSessionServlet.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/WebAppObjectInSessionSe0000644000175000017500000000607311107137212032422 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * @version $Revision: 1319 $ $Date: 2008-11-14 00:55:54 +0100 (Fri, 14 Nov 2008) $ */ public class WebAppObjectInSessionServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException { try { String action = request.getParameter("action"); if ("set".equals(action)) { HttpSession session = request.getSession(true); session.setAttribute("staticAttribute", new TestSharedStatic()); // session.setAttribute("objectAttribute", new TestSharedNonStatic()); // The session itself is not shareable, since the implementation class // refers to the session manager via the hidden field this$0, and // it seems there is no way to mark the hidden field as transient. // session.setAttribute("sessionAttribute", session); } else if ("get".equals(action)) { HttpSession session = request.getSession(false); Object staticAttribute = session.getAttribute("staticAttribute"); assert staticAttribute instanceof TestSharedStatic; // Object objectAttribute = session.getAttribute("objectAttribute"); // assert objectAttribute instanceof TestSharedNonStatic; // Object sessionAttribute = session.getAttribute("sessionAttribute"); // assert sessionAttribute instanceof HttpSession; } } catch (Exception e) { e.printStackTrace(); } } // Non static inner classes are not shareable, because even if this class is portable, // the hidden field this$0 refers to the servlet, which is a non portable class. public class TestSharedNonStatic { } // Static inner classes are shareable public static class TestSharedStatic { } } jetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/LightLoadTest.java0000644000175000017500000002222711253666353031437 0ustar moonmoon// ======================================================================== // Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Random; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.testng.annotations.Test; /** * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class LightLoadTest { private boolean _stress = Boolean.getBoolean( "STRESS" ); @Test public void testLightLoad() throws Exception { if ( _stress ) { Random random = new Random( System.nanoTime() ); String contextPath = ""; String servletMapping = "/server"; int port1 = random.nextInt( 50000 ) + 10000; TerracottaJettyServer server1 = new TerracottaJettyServer( port1 ); server1.addContext( contextPath ).addServlet( TestServlet.class, servletMapping ); server1.start(); try { int port2 = random.nextInt( 50000 ) + 10000; TerracottaJettyServer server2 = new TerracottaJettyServer( port2 ); server2.addContext( contextPath ).addServlet( TestServlet.class, servletMapping ); server2.start(); try { HttpClient client = new HttpClient(); client.setConnectorType( HttpClient.CONNECTOR_SOCKET ); client.start(); try { String[] urls = new String[2]; urls[0] = "http://localhost:" + port1 + contextPath + servletMapping; urls[1] = "http://localhost:" + port2 + contextPath + servletMapping; ContentExchange exchange1 = new ContentExchange( true ); exchange1.setMethod( HttpMethods.GET ); exchange1.setURL( urls[0] + "?action=init" ); client.send( exchange1 ); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchange1.getResponseFields().getStringField( "Set-Cookie" ); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); ExecutorService executor = Executors.newCachedThreadPool(); int clientsCount = 50; CyclicBarrier barrier = new CyclicBarrier( clientsCount + 1 ); int requestsCount = 100; Worker[] workers = new Worker[clientsCount]; for ( int i = 0; i < clientsCount; ++i ) { workers[i] = new Worker( barrier, requestsCount, sessionCookie, urls ); workers[i].start(); executor.execute( workers[i] ); } // Wait for all workers to be ready barrier.await(); long start = System.nanoTime(); // Wait for all workers to be done barrier.await(); long end = System.nanoTime(); long elapsed = TimeUnit.NANOSECONDS.toMillis( end - start ); System.out.println( "elapsed ms: " + elapsed ); for ( Worker worker : workers ) worker.stop(); executor.shutdownNow(); // Perform one request to get the result ContentExchange exchange2 = new ContentExchange( true ); exchange2.setMethod( HttpMethods.GET ); exchange2.setURL( urls[0] + "?action=result" ); exchange2.getRequestFields().add( "Cookie", sessionCookie ); client.send( exchange2 ); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; String response = exchange2.getResponseContent(); System.out.println( "get = " + response ); assert response.trim().equals( String.valueOf( clientsCount * requestsCount ) ); } finally { client.stop(); } } finally { server2.stop(); } } finally { server1.stop(); } } } public static class Worker implements Runnable { private final HttpClient client; private final CyclicBarrier barrier; private final int requestsCount; private final String sessionCookie; private final String[] urls; public Worker( CyclicBarrier barrier, int requestsCount, String sessionCookie, String[] urls ) { this.client = new HttpClient(); this.client.setConnectorType( HttpClient.CONNECTOR_SOCKET ); this.barrier = barrier; this.requestsCount = requestsCount; this.sessionCookie = sessionCookie; this.urls = urls; } public void start() throws Exception { client.start(); } public void stop() throws Exception { client.stop(); } public void run() { try { // Wait for all workers to be ready barrier.await(); Random random = new Random( System.nanoTime() ); for ( int i = 0; i < requestsCount; ++i ) { int urlIndex = random.nextInt( urls.length ); ContentExchange exchange = new ContentExchange( true ); exchange.setMethod( HttpMethods.GET ); exchange.setURL( urls[urlIndex] + "?action=increment" ); exchange.getRequestFields().add( "Cookie", sessionCookie ); client.send( exchange ); exchange.waitForDone(); assert exchange.getResponseStatus() == HttpServletResponse.SC_OK; } // Wait for all workers to be done barrier.await(); } catch ( Exception x ) { throw new RuntimeException( x ); } } } public static class TestServlet extends HttpServlet { @Override protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { String action = request.getParameter( "action" ); if ( "init".equals( action ) ) { HttpSession session = request.getSession( true ); session.setAttribute( "value", 0 ); } else if ( "increment".equals( action ) ) { // Without synchronization, because it is taken care by Jetty/Terracotta HttpSession session = request.getSession( false ); int value = (Integer) session.getAttribute( "value" ); session.setAttribute( "value", value + 1 ); } else if ( "result".equals( action ) ) { HttpSession session = request.getSession( false ); int value = (Integer) session.getAttribute( "value" ); PrintWriter writer = response.getWriter(); writer.println( value ); writer.flush(); } } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/ImmortalSessionTest.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/ImmortalSessionTest.jav0000644000175000017500000001144211253666353032554 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.testng.annotations.Test; /** * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class ImmortalSessionTest { @Test public void testImmortalSession() throws Exception { Random random = new Random(System.nanoTime()); String contextPath = ""; String servletMapping = "/server"; int port = random.nextInt(50000) + 10000; int scavengePeriod = 2; TerracottaJettyServer server = new TerracottaJettyServer(port, -1, scavengePeriod); server.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { int value = 42; ContentExchange exchange = new ContentExchange(true); exchange.setMethod(HttpMethods.GET); exchange.setURL("http://localhost:" + port + contextPath + servletMapping + "?action=set&value=" + value); client.send(exchange); exchange.waitForDone(); assert exchange.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchange.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); String response = exchange.getResponseContent(); assert response.trim().equals(String.valueOf(value)); // Let's wait for the scavenger to run, waiting 2.5 times the scavenger period Thread.sleep(scavengePeriod * 2500L); // Be sure the session is still there exchange = new ContentExchange(true); exchange.setMethod(HttpMethods.GET); exchange.setURL("http://localhost:" + port + contextPath + servletMapping + "?action=get"); exchange.getRequestFields().add("Cookie", sessionCookie); client.send(exchange); exchange.waitForDone(); assert exchange.getResponseStatus() == HttpServletResponse.SC_OK; response = exchange.getResponseContent(); assert response.trim().equals(String.valueOf(value)); } finally { client.stop(); } } finally { server.stop(); } } public static class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String result = null; String action = request.getParameter("action"); if ("set".equals(action)) { String value = request.getParameter("value"); HttpSession session = request.getSession(true); session.setAttribute("value", value); result = value; } else if ("get".equals(action)) { HttpSession session = request.getSession(false); result = (String)session.getAttribute("value"); } PrintWriter writer = response.getWriter(); writer.println(result); writer.flush(); } } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/ServerCrossContextSessionTest.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/ServerCrossContextSessi0000644000175000017500000001171311107137212032623 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.util.Collections; import java.util.Random; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.mortbay.jetty.servlet.Context; import org.testng.annotations.Test; /** * @version $Revision: 1319 $ $Date: 2008-11-14 00:55:54 +0100 (Fri, 14 Nov 2008) $ */ public class ServerCrossContextSessionTest { @Test public void testCrossContextDispatch() throws Exception { Random random = new Random(System.nanoTime()); String contextA = "/contextA"; String contextB = "/contextB"; String servletMapping = "/server"; int port = random.nextInt(50000) + 10000; TerracottaJettyServer server = new TerracottaJettyServer(port); Context ctxA = server.addContext(contextA); ctxA.addServlet(TestServletA.class, servletMapping); Context ctxB = server.addContext(contextB); ctxB.addServlet(TestServletB.class, servletMapping); server.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { // Perform a request, on server side a cross context dispatch will be done ContentExchange exchange = new ContentExchange(true); exchange.setMethod(HttpMethods.GET); exchange.setURL("http://localhost:" + port + contextA + servletMapping); client.send(exchange); exchange.waitForDone(); assert exchange.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } finally { server.stop(); } } public static class TestServletA extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session == null) session = request.getSession(true); // Add something to the session session.setAttribute("A", "A"); System.out.println("A: session.getAttributeNames() = " + Collections.list(session.getAttributeNames())); // Perform cross context dispatch to another context // Over there we will check that the session attribute added above is not visible ServletContext contextB = getServletContext().getContext("/contextB"); RequestDispatcher dispatcherB = contextB.getRequestDispatcher(request.getServletPath()); dispatcherB.forward(request, response); // Check that we don't see things put in session by contextB Object objectB = session.getAttribute("B"); assert objectB == null; System.out.println("A: session.getAttributeNames() = " + Collections.list(session.getAttributeNames())); } } public static class TestServletB extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session == null) session = request.getSession(true); // Be sure nothing from contextA is present Object objectA = session.getAttribute("A"); assert objectA == null; // Add something, so in contextA we can check if it is visible (it must not). session.setAttribute("B", "B"); System.out.println("B: session.getAttributeNames() = " + Collections.list(session.getAttributeNames())); } } } jetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/NewSessionTest.java0000644000175000017500000001044511253666353031664 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.mortbay.jetty.servlet.Context; import org.testng.annotations.Test; /** * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class NewSessionTest { @Test public void testNewSession() throws Exception { Random random = new Random(System.nanoTime()); String contextPath = ""; String servletMapping = "/server"; int port = random.nextInt(50000) + 10000; int scavengePeriod = 3; TerracottaJettyServer server = new TerracottaJettyServer(port, 1, scavengePeriod); Context context = server.addContext(contextPath); context.addServlet(TestServlet.class, servletMapping); server.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { ContentExchange exchange = new ContentExchange(true); exchange.setMethod(HttpMethods.GET); exchange.setURL("http://localhost:" + port + contextPath + servletMapping + "?action=create"); client.send(exchange); exchange.waitForDone(); assert exchange.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchange.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); // Let's wait for the scavenger to run, waiting 2.5 times the scavenger period Thread.sleep(scavengePeriod * 2500L); // The session is not there anymore, but we present an old cookie // The server creates a new session, we must ensure we released all locks exchange = new ContentExchange(true); exchange.setMethod(HttpMethods.GET); exchange.setURL("http://localhost:" + port + contextPath + servletMapping + "?action=old-create"); exchange.getRequestFields().add("Cookie", sessionCookie); client.send(exchange); exchange.waitForDone(); assert exchange.getResponseStatus() == HttpServletResponse.SC_OK; } finally { client.stop(); } } finally { server.stop(); } } public static class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("create".equals(action)) { request.getSession(true); } else if ("old-create".equals(action)) { request.getSession(true); } else { assert false; } } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/SessionMigrationTest.javajetty-6.1.26/contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/SessionMigrationTest.ja0000644000175000017500000001274711253666353032544 0ustar moonmoon// ======================================================================== // Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpMethods; import org.mortbay.jetty.client.ContentExchange; import org.mortbay.jetty.client.HttpClient; import org.testng.annotations.Test; /** * @version $Revision: 1645 $ $Date: 2009-09-15 12:31:07 +0200 (Tue, 15 Sep 2009) $ */ public class SessionMigrationTest { @Test public void testSessionMigration() throws Exception { Random random = new Random(System.nanoTime()); String contextPath = ""; String servletMapping = "/server"; int port1 = random.nextInt(50000) + 10000; TerracottaJettyServer server1 = new TerracottaJettyServer(port1); server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server1.start(); try { int port2 = random.nextInt(50000) + 10000; TerracottaJettyServer server2 = new TerracottaJettyServer(port2); server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping); server2.start(); try { HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SOCKET); client.start(); try { // Perform one request to server1 to create a session int value = 1; ContentExchange exchange1 = new ContentExchange(true); exchange1.setMethod(HttpMethods.POST); exchange1.setURL("http://localhost:" + port1 + contextPath + servletMapping + "?action=set&value=" + value); client.send(exchange1); exchange1.waitForDone(); assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK; String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie"); assert sessionCookie != null; // Mangle the cookie, replacing Path with $Path, etc. sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path="); // Perform a request to server2 using the session cookie from the previous request // This should migrate the session from server1 to server2. ContentExchange exchange2 = new ContentExchange(true); exchange2.setMethod(HttpMethods.GET); exchange2.setURL("http://localhost:" + port2 + contextPath + servletMapping + "?action=get"); exchange2.getRequestFields().add("Cookie", sessionCookie); client.send(exchange2); exchange2.waitForDone(); assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK; String response = exchange2.getResponseContent(); assert response.trim().equals(String.valueOf(value)); } finally { client.stop(); } } finally { server2.stop(); } } finally { server1.stop(); } } public static class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session == null) session = request.getSession(true); String action = request.getParameter("action"); if ("set".equals(action)) { int value = Integer.parseInt(request.getParameter("value")); session.setAttribute("value", value); PrintWriter writer = response.getWriter(); writer.println(value); writer.flush(); } else if ("get".equals(action)) { int value = (Integer)session.getAttribute("value"); PrintWriter writer = response.getWriter(); writer.println(value); writer.flush(); } } } } jetty-6.1.26/contrib/terracotta/src/test/resources/0000755000175000017500000000000011745736516021056 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/test/resources/tc-config-tim.xml0000644000175000017500000000310311064733041024215 0ustar moonmoon %(user.home)/terracotta/server-data %(user.home)/terracotta/server-logs true true true true %(user.home)/terracotta/client-logs migration lightLoad jetty-6.1.26/contrib/terracotta/src/test/resources/tc-config.xml0000644000175000017500000000444211117764540023444 0ustar moonmoon production %(user.dir)/target/terracotta/server-data %(user.dir)/target/terracotta/server-logs %(user.dir)/target/terracotta/server-stats true true true true %(user.dir)/target/terracotta/client-logs %(user.dir)/target/terracotta/client-stats org.mortbay.terracotta.servlet.TerracottaSessionManager$SessionData org.mortbay.terracotta.servlet.TerracottaSessionManager$MutableLong org.mortbay.terracotta.servlet.TerracottaSessionIdManager._sessionIds sessionIds jetty-6.1.26/contrib/terracotta/src/main/0000755000175000017500000000000011745736517017012 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/main/java/0000755000175000017500000000000011745736516017732 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/main/java/org/0000755000175000017500000000000011745736516020521 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/main/java/org/mortbay/0000755000175000017500000000000011745736516022176 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/main/java/org/mortbay/terracotta/0000755000175000017500000000000011745736516024346 5ustar moonmoonjetty-6.1.26/contrib/terracotta/src/main/java/org/mortbay/terracotta/servlet/0000755000175000017500000000000011745736517026033 5ustar moonmoon././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/main/java/org/mortbay/terracotta/servlet/TerracottaSessionIdManager.javajetty-6.1.26/contrib/terracotta/src/main/java/org/mortbay/terracotta/servlet/TerracottaSessionIdMana0000644000175000017500000001564511105016551032472 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Hashtable; import java.util.Map; import java.util.Random; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.mortbay.component.AbstractLifeCycle; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.SessionIdManager; import org.mortbay.jetty.SessionManager; import org.mortbay.jetty.servlet.AbstractSessionManager; import org.mortbay.jetty.servlet.AbstractSessionManager.Session; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.log.Log; /** * A specialized SessionIdManager to be used with
    Terracotta. * See the {@link TerracottaSessionManager} javadocs for implementation notes. * * @see TerracottaSessionManager */ public class TerracottaSessionIdManager extends AbstractLifeCycle implements SessionIdManager { private final static String __NEW_SESSION_ID = "org.mortbay.jetty.newSessionId"; private final static String SESSION_ID_RANDOM_ALGORITHM = "SHA1PRNG"; private final static String SESSION_ID_RANDOM_ALGORITHM_ALT = "IBMSecureRandom"; private static final Object PRESENT = new Object(); private final Server _server; private String _workerName; private Random _random; private boolean _weakRandom; private Map _sessionIds; public TerracottaSessionIdManager(Server server) { _server = server; } public void doStart() { if (_random == null) { try { _random = SecureRandom.getInstance(SESSION_ID_RANDOM_ALGORITHM); } catch (NoSuchAlgorithmException e) { try { _random = SecureRandom.getInstance(SESSION_ID_RANDOM_ALGORITHM_ALT); _weakRandom = false; } catch (NoSuchAlgorithmException e_alt) { Log.warn("Could not generate SecureRandom for session-id randomness", e); _random = new Random(); _weakRandom = true; } } } _random.setSeed(_random.nextLong() ^ System.currentTimeMillis() ^ hashCode() ^ Runtime.getRuntime().freeMemory()); _sessionIds = newSessionIdsSet(); } private Map newSessionIdsSet() { // We need a synchronized data structure to have node-local synchronization. // We use Hashtable because it is a natively synchronized collection that behaves // better in Terracotta than synchronized wrappers obtained with Collections.synchronized*(). return new Hashtable(); } public void doStop() { } public void addSession(HttpSession session) { String clusterId = ((TerracottaSessionManager.Session)session).getClusterId(); // Use a unique constant object, because Strings are "copied" by Terracotta, // causing unnecessary traffic to the Terracotta server. _sessionIds.put(clusterId, PRESENT); } public String getWorkerName() { return _workerName; } public void setWorkerName(String workerName) { _workerName = workerName; } public boolean idInUse(String clusterId) { return _sessionIds.containsKey(clusterId); } /** * When told to invalidate all session instances that share the same id, we must * tell all contexts on the server for which it is defined to delete any session * object they might have matching the id. */ public void invalidateAll(String clusterId) { Handler[] contexts = _server.getChildHandlersByClass(WebAppContext.class); for (int i = 0; contexts != null && i < contexts.length; i++) { WebAppContext webAppContext = (WebAppContext)contexts[i]; SessionManager sessionManager = webAppContext.getSessionHandler().getSessionManager(); if (sessionManager instanceof AbstractSessionManager) { Session session = ((AbstractSessionManager)sessionManager).getSession(clusterId); if (session != null) session.invalidate(); } } } public String newSessionId(HttpServletRequest request, long created) { // Generate a unique cluster id. This id must be unique across all nodes in the cluster, // since it is stored in the distributed shared session ids set. // A requested session ID can only be used if it is in use already. String requested_id = request.getRequestedSessionId(); if (requested_id != null && idInUse(requested_id)) return requested_id; // Else reuse any new session ID already defined for this request. String new_id = (String)request.getAttribute(__NEW_SESSION_ID); if (new_id != null && idInUse(new_id)) return new_id; // pick a new unique ID! String id = null; while (id == null || id.length() == 0 || idInUse(id)) { long r = _weakRandom ? (hashCode() ^ Runtime.getRuntime().freeMemory() ^ _random.nextInt() ^ (((long)request.hashCode()) << 32)) : _random.nextLong(); r ^= created; if (request.getRemoteAddr() != null) r ^= request.getRemoteAddr().hashCode(); if (r < 0) r = -r; id = Long.toString(r, 36); } request.setAttribute(__NEW_SESSION_ID, id); return id; } public void removeSession(HttpSession session) { String clusterId = ((TerracottaSessionManager.Session)session).getClusterId(); _sessionIds.remove(clusterId); } public String getClusterId(String nodeId) { int dot = nodeId.lastIndexOf('.'); return (dot > 0) ? nodeId.substring(0, dot) : nodeId; } public String getNodeId(String clusterId, HttpServletRequest request) { if (_workerName != null) return clusterId + '.' + _workerName; return clusterId; } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/main/java/org/mortbay/terracotta/servlet/TerracottaSessionManager.javajetty-6.1.26/contrib/terracotta/src/main/java/org/mortbay/terracotta/servlet/TerracottaSessionManage0000644000175000017500000010411211157705553032533 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Map; import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import com.tc.object.bytecode.Manageable; import com.tc.object.bytecode.Manager; import com.tc.object.bytecode.ManagerUtil; import org.mortbay.jetty.Request; import org.mortbay.jetty.handler.ContextHandler; import org.mortbay.jetty.servlet.AbstractSessionManager; import org.mortbay.log.Log; /** * A specialized SessionManager to be used with Terracotta. *
    *

    IMPLEMENTATION NOTES

    *

    Requirements

    * This implementation of the session management requires J2SE 5 or superior. *

    Use of Hashtable

    * In Terracotta, collections classes are * logically managed * and we need two levels of locking: a local locking to handle concurrent requests on the same node * and a distributed locking to handle concurrent requests on different nodes. * Natively synchronized classes such as Hashtable fit better than synchronized wrappers obtained via, for * example, {@link Collections#synchronizedMap(Map)}. This is because Terracotta may replay the method call * on the inner unsynchronized collection without invoking the external wrapper, so the synchronization will * be lost. Natively synchronized collections does not have this problem. *

    Use of Hashtable as a Set

    * There is no natively synchronized Set implementation, so we use Hashtable instead, see * {@link TerracottaSessionIdManager}. * However, we don't map the session id to itself, because Strings are treated specially by Terracotta, * causing more traffic to the Terracotta server. Instead we use the same pattern used in the implementation * of java.util.HashSet: use a single shared object to indicate the presence of a key. * This is necessary since Hashtable does not allow null values. *

    Sessions expiration map

    * In order to scavenge expired sessions, we need a way to know if they are expired. This information * is normally held in the session itself via the lastAccessedTime property. * However, we would need to iterate over all sessions to check if each one is expired, and this migrates * all sessions to the node, causing a lot of unneeded traffic between nodes and the Terracotta server. * To avoid this, we keep a separate map from session id to expiration time, so we only need to migrate * all the expirations times to see if a session is expired or not. *

    Update of lastAccessedTime

    * As a performance improvement, the lastAccessedTime is updated only periodically, and not every time * a request enters a node. This optimization allows applications that have frequent requests but less * frequent accesses to the session to perform better, because the traffic between the node and the * Terracotta server is reduced. The update period is the scavenger period, see {@link Session#access(long)}. *

    Terracotta lock id

    * The Terracotta lock id is based on the session id, but this alone is not sufficient, as there may be * two sessions with the same id for two different contexts. So we need session id and context path. * However, this also is not enough, as we may have the rare case of the same webapp mapped to two different * virtual hosts, and each virtual host must have a different session object. * Therefore the lock id we need to use is a combination of session id, context path and virtual host, see * {@link #newLockId(String)}. * * @see TerracottaSessionIdManager */ public class TerracottaSessionManager extends AbstractSessionManager implements Runnable { /** * The local cache of session objects. */ private Map _sessions; /** * The distributed shared SessionData map. * Putting objects into the map result in the objects being sent to Terracotta, and any change * to the objects are also replicated, recursively. * Getting objects from the map result in the objects being fetched from Terracotta. */ private Hashtable _sessionDatas; /** * The distributed shared session expirations map, needed for scavenging. * In particular it supports removal of sessions that have been orphaned by nodeA * (for example because it crashed) by virtue of scavenging performed by nodeB. */ private Hashtable _sessionExpirations; private String _contextPath; private String _virtualHost; private long _scavengePeriodMs = 30000; private ScheduledExecutorService _scheduler; private ScheduledFuture _scavenger; public void doStart() throws Exception { super.doStart(); _contextPath = canonicalize(_context.getContextPath()); _virtualHost = virtualHostFrom(_context); _sessions = Collections.synchronizedMap(new HashMap()); _sessionDatas = newSharedMap("sessionData:" + _contextPath + ":" + _virtualHost); _sessionExpirations = newSharedMap("sessionExpirations:" + _contextPath + ":" + _virtualHost); _scheduler = Executors.newSingleThreadScheduledExecutor(); scheduleScavenging(); } private Hashtable newSharedMap(String name) { // We want to partition the session data among contexts, so we need to have different roots for // different contexts, and each root must have a different name, since roots with the same name are shared. Lock.lock(name); try { // We need a synchronized data structure to have node-local synchronization. // We use Hashtable because it is a natively synchronized collection that behaves // better in Terracotta than synchronized wrappers obtained with Collections.synchronized*(). Hashtable result = (Hashtable)ManagerUtil.lookupOrCreateRootNoDepth(name, new Hashtable()); ((Manageable)result).__tc_managed().disableAutoLocking(); return result; } finally { Lock.unlock(name); } } private void scheduleScavenging() { if (_scavenger != null) { _scavenger.cancel(false); _scavenger = null; } long scavengePeriod = getScavengePeriodMs(); if (scavengePeriod > 0 && _scheduler != null) _scavenger = _scheduler.scheduleWithFixedDelay(this, scavengePeriod, scavengePeriod, TimeUnit.MILLISECONDS); } public void doStop() throws Exception { if (_scavenger != null) _scavenger.cancel(true); if (_scheduler != null) _scheduler.shutdownNow(); super.doStop(); } public void run() { scavenge(); } public void enter(Request request) { /** * SESSION LOCKING * This is an entry point for session locking. * We arrive here at the beginning of every request */ String requestedSessionId = request.getRequestedSessionId(); HttpSession session = request.getSession(false); Log.debug("Entering, requested session id {}, session id {}", requestedSessionId, session == null ? null : getClusterId(session)); if (requestedSessionId == null) { // The request does not have a session id, do not lock. // If the session, later in the request, is created by the user, // it will be locked when it will be created } else { // We lock anyway with the requested session id. // The requested session id may not be a valid one, // for example because the session expired. // If the user creates a new session, it will have // a different session id and that also will be locked. enter(getIdManager().getClusterId(requestedSessionId)); } } protected void enter(String clusterId) { Lock.lock(newLockId(clusterId)); Log.debug("Entered, session id {}", clusterId); } protected boolean tryEnter(String clusterId) { return Lock.tryLock(newLockId(clusterId)); } public void exit(Request request) { /** * SESSION LOCKING * This is an exit point for session locking. * We arrive here at the end of every request */ String requestedSessionId = request.getRequestedSessionId(); HttpSession session = request.getSession(false); Log.debug("Exiting, requested session id {}, session id {}", requestedSessionId, session == null ? null : getClusterId(session)); if (requestedSessionId == null) { if (session == null) { // No session has been created in the request, just return } else { // A new session has been created by the user, unlock it exit(getClusterId(session)); } } else { // There was a requested session id, and we locked it, so here release it String requestedClusterId = getIdManager().getClusterId(requestedSessionId); exit(requestedClusterId); if (session != null) { if (!requestedClusterId.equals(getClusterId(session))) { // The requested session id was invalid, and a // new session has been created by the user with // a different session id, unlock it exit(getClusterId(session)); } } } } protected void exit(String clusterId) { Lock.unlock(newLockId(clusterId)); Log.debug("Exited, session id {}", clusterId); } protected void addSession(AbstractSessionManager.Session session) { /** * SESSION LOCKING * When this method is called, we already hold the session lock. * See {@link #newSession(HttpServletRequest)} */ String clusterId = getClusterId(session); Session tcSession = (Session)session; SessionData sessionData = tcSession.getSessionData(); _sessionExpirations.put(clusterId, sessionData._expiration); _sessionDatas.put(clusterId, sessionData); _sessions.put(clusterId, tcSession); Log.debug("Added session {} with id {}", tcSession, clusterId); } @Override public Cookie access(HttpSession session, boolean secure) { Cookie cookie = super.access(session, secure); Log.debug("Accessed session {} with id {}", session, session.getId()); return cookie; } @Override public void complete(HttpSession session) { super.complete(session); Log.debug("Completed session {} with id {}", session, session.getId()); } protected void removeSession(String clusterId) { /** * SESSION LOCKING * When this method is called, we already hold the session lock. * Either the scavenger acquired it, or the user invalidated * the existing session and thus {@link #enter(String)} was called. */ // Remove locally cached session Session session = _sessions.remove(clusterId); Log.debug("Removed session {} with id {}", session, clusterId); // It may happen that one node removes its expired session data, // so that when this node does the same, the session data is already gone SessionData sessionData = _sessionDatas.remove(clusterId); Log.debug("Removed session data {} with id {}", sessionData, clusterId); // Remove the expiration entry used in scavenging _sessionExpirations.remove(clusterId); } public void setScavengePeriodMs(long ms) { ms = ms == 0 ? 60000: ms; ms = ms > 60000 ? 60000: ms; ms = ms < 1000 ? 1000: ms; this._scavengePeriodMs = ms; scheduleScavenging(); } public long getScavengePeriodMs() { return _scavengePeriodMs; } public AbstractSessionManager.Session getSession(String clusterId) { Session result = null; /** * SESSION LOCKING * This is an entry point for session locking. * We lookup the session given the id, and if it exist we hold the lock. * We unlock on end of method, since this method can be called outside * an {@link #enter(String)}/{@link #exit(String)} pair. */ enter(clusterId); try { // Need to synchronize because we use a get-then-put that must be atomic // on the local session cache // Refer to method {@link #scavenge()} for an explanation of synchronization order: // first on _sessions, then on _sessionExpirations. synchronized (_sessions) { result = _sessions.get(clusterId); if (result == null) { Log.debug("Session with id {} --> local cache miss", clusterId); // Lookup the distributed shared sessionData object. // This will migrate the session data to this node from the Terracotta server // We have not grabbed the distributed lock associated with this session yet, // so another node can migrate the session data as well. This is no problem, // since just after this method returns the distributed lock will be grabbed by // one node, the session data will be changed and the lock released. // The second node contending for the distributed lock will then acquire it, // and the session data information will be migrated lazily by Terracotta means. // We are only interested in having a SessionData reference locally. Log.debug("Distributed session data with id {} --> lookup", clusterId); SessionData sessionData = _sessionDatas.get(clusterId); if (sessionData == null) { Log.debug("Distributed session data with id {} --> not found", clusterId); } else { Log.debug("Distributed session data with id {} --> found", clusterId); // Wrap the migrated session data and cache the Session object result = new Session(sessionData); _sessions.put(clusterId, result); } } else { Log.debug("Session with id {} --> local cache hit", clusterId); if (!_sessionExpirations.containsKey(clusterId)) { // A session is present in the local cache, but it has been expired // or invalidated on another node, perform local clean up. _sessions.remove(clusterId); result = null; Log.debug("Session with id {} --> local cache stale"); } } } } finally { /** * SESSION LOCKING */ exit(clusterId); } return result; } protected String newLockId(String clusterId) { StringBuilder builder = new StringBuilder(clusterId); builder.append(":").append(_contextPath); builder.append(":").append(_virtualHost); return builder.toString(); } // TODO: This method is not needed, only used for testing public Map getSessionMap() { return Collections.unmodifiableMap(_sessions); } // TODO: rename to getSessionsCount() // TODO: also, not used if not by superclass for unused statistics data public int getSessions() { return _sessions.size(); } protected Session newSession(HttpServletRequest request) { /** * SESSION LOCKING * This is an entry point for session locking. * We arrive here when we have to create a new * session, for a request.getSession(true) call. */ Session result = new Session(request); String requestedSessionId = request.getRequestedSessionId(); if (requestedSessionId == null) { // Here the user requested a fresh new session, lock it. enter(result.getClusterId()); } else { if (result.getClusterId().equals(getIdManager().getClusterId(requestedSessionId))) { // Here we have a cross context dispatch where the same session id // is used for two different sessions; we do not lock because the lock // has already been acquired in enter(Request), based on the requested // session id. } else { // Here the requested session id is invalid (the session expired), // and a new session is created, lock it. enter(result.getClusterId()); } } return result; } protected void invalidateSessions() { // Do nothing. // We don't want to remove and invalidate all the sessions, // because this method is called from doStop(), and just // because this context is stopping does not mean that we // should remove the session from any other node (remember // the session map is shared) } private void scavenge() { Thread thread = Thread.currentThread(); ClassLoader old_loader = thread.getContextClassLoader(); if (_loader != null) thread.setContextClassLoader(_loader); try { long now = System.currentTimeMillis(); Log.debug(this + " scavenging at {}, scavenge period {}", now, getScavengePeriodMs()); // Detect the candidates that may have expired already, checking the estimated expiration time. Set candidates = new HashSet(); String lockId = "scavenge:" + _contextPath + ":" + _virtualHost; Lock.lock(lockId); try { /** * Synchronize in order, to avoid deadlocks with method {@link #getSession(String)}. * In that method, we first synchronize on _session, then we call _sessionExpirations.containsKey(), * which is synchronized by virtue of being a Collection.synchronizedMap. * Here we must synchronize in the same order to avoid deadlock. */ synchronized (_sessions) { synchronized (_sessionExpirations) { // Do not use iterators that throw ConcurrentModificationException // We do a best effort here, and leave possible imprecisions to the next scavenge Enumeration keys = _sessionExpirations.keys(); while (keys.hasMoreElements()) { String sessionId = keys.nextElement(); MutableLong value = _sessionExpirations.get(sessionId); if (value != null) { long expirationTime = value.value; Log.debug("Estimated expiration time {} for session {}", expirationTime, sessionId); if (expirationTime > 0 && expirationTime < now) candidates.add(sessionId); } } _sessions.keySet().retainAll(Collections.list(_sessionExpirations.keys())); } } } finally { Lock.unlock(lockId); } Log.debug("Scavenging detected {} candidate sessions to expire", candidates.size()); // Now validate that the candidates that do expire are really expired, // grabbing the session lock for each candidate for (String sessionId : candidates) { Session candidate = (Session)getSession(sessionId); if (candidate == null) continue; // Here we grab the lock to avoid anyone else interfering boolean entered = tryEnter(sessionId); if (entered) { try { long maxInactiveTime = candidate.getMaxIdlePeriodMs(); // Exclude sessions that never expire if (maxInactiveTime > 0) { // The lastAccessedTime is fetched from Terracotta, so we're sure it is up-to-date. long lastAccessedTime = candidate.getLastAccessedTime(); // Since we write the shared lastAccessedTime every scavenge period, // take that in account before considering the session expired long expirationTime = lastAccessedTime + maxInactiveTime + getScavengePeriodMs(); if (expirationTime < now) { Log.debug("Scavenging expired session {}, expirationTime {}", candidate.getClusterId(), expirationTime); // Calling timeout() result in calling removeSession(), that will clean the data structures candidate.timeout(); } else { Log.debug("Scavenging skipping candidate session {}, expirationTime {}", candidate.getClusterId(), expirationTime); } } } finally { exit(sessionId); } } } int sessionCount = getSessions(); if (sessionCount < _minSessions) _minSessions = sessionCount; if (sessionCount > _maxSessions) _maxSessions = sessionCount; } catch (Throwable x) { // Must avoid at all costs that the scavenge thread exits, so here we catch and log if(x instanceof ThreadDeath) throw (ThreadDeath)x; Log.warn("Problem scavenging sessions", x); } finally { thread.setContextClassLoader(old_loader); } } private String canonicalize(String contextPath) { if (contextPath == null) return ""; return contextPath.replace('/', '_').replace('.', '_').replace('\\', '_'); } private String virtualHostFrom(ContextHandler.SContext context) { String result = "0.0.0.0"; if (context == null) return result; String[] vhosts = context.getContextHandler().getVirtualHosts(); if (vhosts == null || vhosts.length == 0 || vhosts[0] == null) return result; return vhosts[0]; } class Session extends AbstractSessionManager.Session { private static final long serialVersionUID = -2134521374206116367L; private final SessionData _sessionData; private long _lastUpdate; protected Session(HttpServletRequest request) { super(request); _sessionData = new SessionData(getClusterId(), _maxIdleMs); _lastAccessed = _sessionData.getCreationTime(); } protected Session(SessionData sd) { super(sd.getCreationTime(), sd.getId()); _sessionData = sd; _lastAccessed = getLastAccessedTime(); initValues(); } public SessionData getSessionData() { return _sessionData; } @Override public long getCookieSetTime() { return _sessionData.getCookieTime(); } @Override protected void cookieSet() { _sessionData.setCookieTime(getLastAccessedTime()); } @Override public void setMaxInactiveInterval(int secs) { super.setMaxInactiveInterval(secs); if(_maxIdleMs > 0L && _maxIdleMs / 10L < (long)_scavengePeriodMs) { long newScavengeSecs = (secs + 9) / 10; setScavengePeriodMs(1000L * newScavengeSecs); } // Update the estimated expiration time if (secs < 0) { this._sessionData._expiration.value = -1L; } else { this._sessionData._expiration.value = System.currentTimeMillis() + (1000L * secs); } } @Override public long getLastAccessedTime() { if (!isValid()) throw new IllegalStateException(); return _sessionData.getPreviousAccessTime(); } @Override public long getCreationTime() throws IllegalStateException { if (!isValid()) throw new IllegalStateException(); return _sessionData.getCreationTime(); } // Overridden for visibility @Override protected String getClusterId() { return super.getClusterId(); } protected Map newAttributeMap() { // It is important to never return a new attribute map here (as other Session implementations do), // but always return the shared attributes map, so that a new session created on a different cluster // node is immediately filled with the session data from Terracotta. return _sessionData.getAttributeMap(); } @Override protected void access(long time) { // The local previous access time is always updated via the super.access() call. // If the requests are steady and within the scavenge period, the distributed shared access times // are never updated. If only one node gets hits, other nodes reach the expiration time and the // scavenging on other nodes will believe the session is expired, since the distributed shared // access times have never been updated. // Therefore we need to update the distributed shared access times once in a while, no matter what. long previousAccessTime = getPreviousAccessTime(); if (time - previousAccessTime > getScavengePeriodMs()) { Log.debug("Out-of-date update of distributed access times: previous {} - current {}", previousAccessTime, time); updateAccessTimes(time); } else { if (time - _lastUpdate > getScavengePeriodMs()) { Log.debug("Periodic update of distributed access times: last update {} - current {}", _lastUpdate, time); updateAccessTimes(time); } else { Log.debug("Skipping update of distributed access times: previous {} - current {}", previousAccessTime, time); } } super.access(time); } /** * Updates the shared distributed access times that need to be updated * * @param time the update value */ private void updateAccessTimes(long time) { _sessionData.setPreviousAccessTime(_accessed); if (getMaxIdlePeriodMs() > 0) _sessionData.setExpirationTime(time + getMaxIdlePeriodMs()); _lastUpdate = time; } // Overridden for visibility @Override protected void timeout() { super.timeout(); Log.debug("Timed out session {} with id {}", this, getClusterId()); } @Override public void invalidate() { super.invalidate(); Log.debug("Invalidated session {} with id {}", this, getClusterId()); } private long getMaxIdlePeriodMs() { return _maxIdleMs; } private long getPreviousAccessTime() { return super.getLastAccessedTime(); } } /** * The session data that is distributed to cluster nodes via Terracotta. */ public static class SessionData { private final String _id; private final Map _attributes; private final long _creation; private final MutableLong _expiration; private long _previousAccess; private long _cookieTime; public SessionData(String sessionId, long maxIdleMs) { _id = sessionId; // Don't need synchronization, as we grab a distributed session id lock // when this map is accessed. _attributes = new HashMap(); _creation = System.currentTimeMillis(); _expiration = new MutableLong(); _previousAccess = _creation; // Set expiration time to negative value if the session never expires _expiration.value = maxIdleMs > 0 ? _creation + maxIdleMs : -1L; } public String getId() { return _id; } protected Map getAttributeMap() { return _attributes; } public long getCreationTime() { return _creation; } public long getExpirationTime() { return _expiration.value; } public void setExpirationTime(long time) { _expiration.value = time; } public long getCookieTime() { return _cookieTime; } public void setCookieTime(long time) { _cookieTime = time; } public long getPreviousAccessTime() { return _previousAccess; } public void setPreviousAccessTime(long time) { _previousAccess = time; } } protected static class Lock { private static final ThreadLocal> nestings = new ThreadLocal>() { @Override protected Map initialValue() { return new HashMap(); } }; private Lock() { } public static void lock(String lockId) { Integer nestingLevel = nestings.get().get(lockId); if (nestingLevel == null) nestingLevel = 0; if (nestingLevel < 0) throw new AssertionError("Lock(" + lockId + ") nest level = " + nestingLevel + ", thread " + Thread.currentThread() + ": " + getLocks()); if (nestingLevel == 0) { ManagerUtil.beginLock(lockId, Manager.LOCK_TYPE_WRITE); Log.debug("Lock({}) acquired by thread {}", lockId, Thread.currentThread().getName()); } nestings.get().put(lockId, nestingLevel + 1); Log.debug("Lock({}) nestings {}", lockId, getLocks()); } public static boolean tryLock(String lockId) { boolean result = ManagerUtil.tryBeginLock(lockId, Manager.LOCK_TYPE_WRITE); Log.debug("Lock({}) tried and" + (result ? "" : " not") + " acquired by thread {}", lockId, Thread.currentThread().getName()); if (result) { Integer nestingLevel = nestings.get().get(lockId); if (nestingLevel == null) nestingLevel = 0; nestings.get().put(lockId, nestingLevel + 1); Log.debug("Lock({}) nestings {}", lockId, getLocks()); } return result; } public static void unlock(String lockId) { Integer nestingLevel = nestings.get().get(lockId); if (nestingLevel == null) return; if (nestingLevel < 1) throw new AssertionError("Lock(" + lockId + ") nest level = " + nestingLevel + ", thread " + Thread.currentThread() + ": " + getLocks()); if (nestingLevel == 1) { ManagerUtil.commitLock(lockId); Log.debug("Lock({}) released by thread {}", lockId, Thread.currentThread().getName()); nestings.get().remove(lockId); } else { nestings.get().put(lockId, nestingLevel - 1); } Log.debug("Lock({}) nestings {}", lockId, getLocks()); } /** * For testing and debugging purposes only. * @return the lock ids held by the current thread */ protected static Map getLocks() { return Collections.unmodifiableMap(nestings.get()); } } private static class MutableLong { private long value; } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootjetty-6.1.26/contrib/terracotta/src/main/java/org/mortbay/terracotta/servlet/TerracottaSessionHandler.javajetty-6.1.26/contrib/terracotta/src/main/java/org/mortbay/terracotta/servlet/TerracottaSessionHandle0000644000175000017500000001271111105016551032523 0ustar moonmoon// ======================================================================== // Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.terracotta.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mortbay.jetty.HttpConnection; import org.mortbay.jetty.Request; import org.mortbay.jetty.RetryRequest; import org.mortbay.jetty.SessionManager; import org.mortbay.jetty.servlet.SessionHandler; import org.mortbay.log.Log; /** * A specific subclass of {@link SessionHandler} that sets a contract between * this class and {@link TerracottaSessionManager}. * The contract requires that a Terracotta named lock will be held for the duration * of the request, where the lock name depends on the session id. * To achieve this, we call {@link TerracottaSessionManager#enter(Request)} and * {@link TerracottaSessionManager#exit(Request)}, in order to be able to obtain * and release the Terracotta lock. * See the {@link TerracottaSessionManager} javadocs for implementation notes. * * @version $Revision: 1308 $ $Date: 2008-11-07 11:50:17 +0100 (Fri, 07 Nov 2008) $ */ public class TerracottaSessionHandler extends SessionHandler { public TerracottaSessionHandler() { } public TerracottaSessionHandler(SessionManager manager) { super(manager); } @Override public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { setRequestedId(request, dispatch); Request currentRequest = (request instanceof Request) ? (Request)request : HttpConnection.getCurrentConnection().getRequest(); SessionManager requestSessionManager = currentRequest.getSessionManager(); HttpSession requestSession = currentRequest.getSession(false); TerracottaSessionManager sessionManager = (TerracottaSessionManager)getSessionManager(); Log.debug("SessionManager = {}", sessionManager); // Is it a cross context dispatch or a direct hit to this context ? if (sessionManager != requestSessionManager) { // Setup the request for this context currentRequest.setSessionManager(sessionManager); currentRequest.setSession(null); } // Tell the session manager that the request is entering if (sessionManager != null) sessionManager.enter(currentRequest); try { HttpSession currentSession = null; if (sessionManager != null) { currentSession = currentRequest.getSession(false); if (currentSession != null) { if (currentSession != requestSession) { // Access the session only if we did not already Cookie cookie = sessionManager.access(currentSession, request.isSecure()); if (cookie != null) { // Handle changed session id or cookie max-age refresh response.addCookie(cookie); } } else { // Handle resume of the request currentSession = currentRequest.recoverNewSession(sessionManager); if (currentSession != null) currentRequest.setSession(currentSession); } } } Log.debug("Session = {}", currentSession); getHandler().handle(target, request, response, dispatch); } catch (RetryRequest x) { // User may have invalidated the session, must get it again HttpSession currentSession = currentRequest.getSession(false); if (currentSession != null && currentSession.isNew()) currentRequest.saveNewSession(sessionManager, currentSession); throw x; } finally { if (sessionManager != null) { // User may have invalidated the session, must get it again HttpSession currentSession = currentRequest.getSession(false); if (currentSession != null) sessionManager.complete(currentSession); sessionManager.exit(currentRequest); } // Restore cross context dispatch if (sessionManager != requestSessionManager) { currentRequest.setSessionManager(requestSessionManager); currentRequest.setSession(requestSession); } } } } jetty-6.1.26/contrib/terracotta/src/main/resources/0000755000175000017500000000000011745736517021024 5ustar moonmoonjetty-6.1.26/contrib/terracotta/pom.xml0000644000175000017500000002626011466510475016613 0ustar moonmoon project org.mortbay.jetty 6.1.26 ../../pom.xml 4.0.0 org.mortbay.jetty jetty-terracotta-sessions jar Terracotta Sessions for Jetty http://jetty.mortbay.org 2.6.4 1.1.8 install maven-compiler-plugin 1.5 1.5 org.apache.maven.plugins maven-surefire-plugin true org.terracotta.maven.plugins tc-maven-plugin ${tc.maven.plugin.version} test test test org.apache.maven.plugins maven-jar-plugin Jetty Terracotta Sessions Implementation http://docs.codehaus.org/display/JETTY/Session+Clustering+with+Terracotta Jetty Terracotta Sessions Implementation org.mortbay.jetty.jetty-terracotta-sessions Mortbay ${project-version} maven-antrun-plugin copyfiles install run clean clean run jetty true org.terracotta.maven.plugins tc-maven-plugin src/test/resources/tc-config.xml **/TIM* tim org.terracotta.maven.plugins tc-maven-plugin src/test/resources/tc-config-tim.xml **/TIM* terracotta-repository http://www.terracotta.org/download/reflector/maven2 terracotta-plugin-repository http://www.terracotta.org/download/reflector/maven2 org.mortbay.jetty jetty ${project.version} org.mortbay.jetty jetty-client ${project.version} org.terracotta terracotta ${tc.version} javax.servlet servlet-api log4j log4j commons-logging commons-logging commons-collections commons-collections commons-lang commons-lang commons-cli commons-cli commons-io commons-io commons-httpclient commons-httpclient javax.management jmxri javax.management jmxremote javax.management jmxremote_optional org.beanshell bsh xmlbeans xbean xmlbeans xbean_xpath xmlbeans xmlpublic jline jline knopflerfish-tc knopflerfish-tc concurrent concurrent berkeleydb je jfree jfreechart org.dijon appframe treemap treemap tomcat catalina org.apache.tomcat tribes org.apache.tomcat juli stax stax com.h2database h2 org.testng testng 5.8 jdk15 test jetty-6.1.26/contrib/sweeper/0000755000175000017500000000000011745736517014601 5ustar moonmoonjetty-6.1.26/contrib/sweeper/src/0000755000175000017500000000000011745736517015370 5ustar moonmoonjetty-6.1.26/contrib/sweeper/src/main/0000755000175000017500000000000011745736517016314 5ustar moonmoonjetty-6.1.26/contrib/sweeper/src/main/java/0000755000175000017500000000000011745736517017235 5ustar moonmoonjetty-6.1.26/contrib/sweeper/src/main/java/org/0000755000175000017500000000000011745736517020024 5ustar moonmoonjetty-6.1.26/contrib/sweeper/src/main/java/org/mortbay/0000755000175000017500000000000011745736517021501 5ustar moonmoonjetty-6.1.26/contrib/sweeper/src/main/java/org/mortbay/util/0000755000175000017500000000000011745736517022456 5ustar moonmoonjetty-6.1.26/contrib/sweeper/src/main/java/org/mortbay/util/daemon/0000755000175000017500000000000011745736517023721 5ustar moonmoonjetty-6.1.26/contrib/sweeper/src/main/java/org/mortbay/util/daemon/Sweeper.java0000644000175000017500000000566511254653170026176 0ustar moonmoon//======================================================================== //Copyright 2009 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== package org.mortbay.util.daemon; import java.io.File; import java.io.FilenameFilter; import java.util.Timer; import java.util.TimerTask; public class Sweeper implements Runnable, FilenameFilter { public static final long DEFAULT_INTERVAL = 3600000; // 1 hour public static boolean LOG_TO_CONSOLE = true; public Sweeper() { // managed by a scheduler } public Sweeper(long interval) { if(interval==0) run(); else schedule(new Timer(), interval); } public Sweeper(Timer timer, long interval) { schedule(timer, interval); } private void schedule(Timer timer, long interval) { if (LOG_TO_CONSOLE) System.err.println("Sweeping "+System.getProperty("java.io.tmpdir")+" every "+interval+"ms"); timer.scheduleAtFixedRate(new TimerTask() { public void run() { Sweeper.this.run(); } }, 1000, interval); } public void run() { File tmpDir = new File(System.getProperty("java.io.tmpdir")); File[] files = tmpDir.listFiles(this); for(int i=0; i 4.0.0 project org.mortbay.jetty 6.1.26 ../../pom.xml org.mortbay.jetty sweeper 6.1.26 jar Temp dir sweeper maven-jar-plugin org.mortbay.util.daemon.Sweeper jetty-6.1.26/contrib/sweeper/README.txt0000644000175000017500000000054511466510475016274 0ustar moonmoonThe job of the sweeper is to delete temp dirs created by jetty that have not been deleted due to a sun bug - http://bugs.sun.com/view_bug.do?bug_id=4950148 Building: mvn install Usage: java -jar sweeper-6.1.26.jar To run once, add the system property: -Dinterval=0 Generally, you would setup a batch file to execute this jar on startup. jetty-6.1.26/LICENSES/0000755000175000017500000000000011745736535012674 5ustar moonmoonjetty-6.1.26/LICENSES/cla-ngonzalez.txt0000644000175000017500000001564111166563041016173 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Nicanor Gonzalez E-Mail: ngonzalez@exist.com Mailing Address: 37 TwinHill St., New Manila Rolling Hills, Q.C., Philippines You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: July 14, 2006 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.4 (MingW32) iD8DBQFEt1ZxHR/ESK2w6H8RApbOAJ9c1eooNr2oN59WZVitJExGJjUvKgCfaKji 6etDJ6AUj0jTuSl59hUsWMQ= =HmqH -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-jfarcand.txt0000644000175000017500000001566411166563041015741 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Jeanfrancois Arcand E-Mail: jfarcand@apache.org Mailing Address: 1800 McGill College Avenue, Suite 800, H3A 3J6 Montreal, Quebec (Canada) You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: /28/08/06 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQFE85cgaq9Frj/CIrIRAmuJAKCFgi4W0UOH8IUn+SV6PBHRF3BnLgCcDqqC Zokttk0bTHfwaa5TtxQbScw= =N/w/ -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-jvz.txt0000644000175000017500000001562011240377440014771 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Sarel Jason van Zyl E-Mail: jason@maven.org Mailing Address: 50 King Street, Guelph, Ontario, Canada, N1E4P6 You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 26 March 2008 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (Darwin) iD8DBQFH6pthx78m0LtheGYRArHCAJ9xjwJBVbEqZSj2tERe0rsBclIEbgCcDP9d +DYfpksPi2bcC60u20pBxa4= =Ke2v -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-jesse.txt0000644000175000017500000001562511166563041015277 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Jesse C. McConnell E-Mail: jmcconnell@apache.org Mailing Address: 7717 S 167th Street, Omaha, Ne. 68136 You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: December 19 2007 Please sign: GPG -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFHacMO+jg6q+ULyBMRAky4AJ9CdNKsmg8n2aFcpQAvcEPXxEjIJACgrvjM C/W/GuQFfCJJykkL2jd9/Ag= =ufUh -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-jocsch.txt0000644000175000017500000001554511240377440015437 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Markus Joschko E-Mail: markus.joschko@gmail.com Mailing Address: You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 12/20/2006 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (Cygwin) iD8DBQFFiWlgCWpdA0nIpYMRAm7uAJ90KNa4SmViBwVxBnai8ocoeXvJggCfd1AQ 33fLBVCnyMmWMfvBorrHHik= =aNrC -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-janb.txt0000644000175000017500000001553611166563041015101 0ustar moonmoonJetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Jan Bartel E-Mail: janb@mortbay.com Mailing Address: 62 Church St Balmain NSW 2041 Australia You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 10 March 2006 Please sign: PGP -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) iD8DBQFDjMI6J97Uv2IW248RAmGNAJ9/krpkiYJRrJTMXVkL3cdnVvfU+QCfYFEh pN0h9U/xdFTRMFsXYFHQeN4= =24Hd -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-template.txt0000644000175000017500000001511311166563041015771 0ustar moonmoonJetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: E-Mail: Mailing Address: You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: Please sign: jetty-6.1.26/LICENSES/cla-gregw.txt0000644000175000017500000001560511166563041015277 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Gregory John Wilkins E-Mail: gregw@mortbay.com Mailing Address: 62 Church St. Balmain, NSW 2041, Australia You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) iD8DBQFEEaStXR9WPTAwnLARAjsNAJ4jBB6wCEqucFljGge7yrAMSrFv/gCgoMC+ 5hdry6ZjXRcUhQEyNz2F/T4= =I4Co -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-lorban.txt0000644000175000017500000001554411240377440015442 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Ludovic Orban E-Mail: ludovic.orban@gmail.com Mailing Address: You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 23 March 2007 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.7 (MingW32) iD8DBQFGA3nBuMWb5MEZZ6cRAs8SAKCYuiBUmBuSWdWb/nGGMmamPeKBnwCg5lAC RX52XCiKwhPJ5uZha54/djQ= =YNL5 -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-jstrachan.txt0000644000175000017500000001567511166563041016150 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: James Strachan E-Mail: jstrachan@apache.org Mailing Address: 1A Leigh Road, London, UK, N5 1ST You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the public benefit or inconsistent with its nonprofit status and bylaws in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: January 30th 2006 Please sign: GPG -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (Darwin) iD8DBQFD37/4dL6IZr4c+6kRAtsIAJ41tfd3lj4OM6sIMfJfTOdYdT1bxwCdGgWv 8sfMxEDZquIqhVbfZU2c76U= =8WW7 -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/ccla-template.txt0000644000175000017500000001765111166563041016145 0ustar moonmoonJetty Project Corporate Contributor License Agreement V1.1 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. This version of the Agreement allows an entity (the "Corporation") to submit Contributions to Mort Bay, to authorize Contributions submitted by its designated employees to Mort Bay, and to grant copyright and patent licenses thereto. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at LICENSES/ccla-CORPORATE-NAME.txt. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise send a signed Agreement to MortBay. Each developer covered by this agreement should have their name appended the Schedule A and the copy commited to LICENSES/ccla-CORPORATE-NAME.txt using their authenticated codehaus ssh login. If possible, digitally sign the committed file, otherwise send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Corporation name: Mailing Address: Point of Contact: Full name: E-Mail: Fax: You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) were submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that You are legally entitled to grant the above license. You represent further that each employee of the Corporation designated on Schedule A below (or in a subsequent written modification to that Schedule) is authorized to submit Contributions on behalf of the Corporation. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. It is your responsibility to notify MortBay when any change is required to the list of designated employees authorized to submit Contributions on behalf of the Corporation, or to the Corporation's Point of Contact with MortBay. Date: Signature: Name: Positions: Schedule A Name Date added ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ ______________________________________ ________________ jetty-6.1.26/LICENSES/cla-tbecker.txt0000644000175000017500000001633511565430567015615 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Thomas Becker E-Mail: tbecker@intalio.com Mailing Address: Meertal 24, 41464 Neuss, Germany You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 2011-05-20 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org iQEcBAEBAgAGBQJN1jA1AAoJEKR1jCr0q2RRC5gH/itwDPY3I/LDnih+SyTIH23D XKBYydLv9+QOXnxLVikiIz7LvDJUgBg3WzJ346R6nkuZL5f6Ci0UCcUVosS2SuPz LmyazCN2l9gwczwes5cMnLzuOHtmFnwFRHOenwDxIXzZLP4RqhgPjGLNiemXijld kVSD8N77IEIKJZEyJgL/LA1JqcBduL0X1sWz4VChXndcEcd2XYJpBkwxgUP2Crdk D4YQ9ENAKzlXfLTmNJZb9yo/jG2UCZnwnhfQoY9M+tHsTezDgUkXRpC6jbNzOglw jYWU/6z4UmNQygMgKqwlIbNgLSCOks/rW4UA/XlQZwTKNlKBWmuZv/JvKpUn5rg= =zEAe -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-gnodet.txt0000644000175000017500000001554011240377440015441 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Guillaume Nodet E-Mail: gnodet@gmail.com Mailing Address: You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 8 March 2007 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (Cygwin) iD8DBQFF7+sp7N/qPLRJO5QRAtUWAJ9WZl5cGQyEHC0NHCJ2j937OPUvaQCeNOWc iLR55mJGzunEofYcO9ZC5M0= =SZea -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-mgorovoy.txt0000644000175000017500000001573311240377440016046 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to eclipse@eclipse.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Michael Gorovoy E-Mail: michael@webtide.com Mailing Address: You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: August 5, 2009 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (GNU/Linux) iQCVAwUBSnsLaXcrtv04RHIQAQIHBQP/Wd6ewa/krQg3GmgQsJ3Az+kjebH8ZYP5 gmywaZn4x5CWN8YE+rzpFrml/lh2N1ucNJ1KUc4E/7KdZqZXXVtkHJRiN0gunIbm ivwWTTcO/VUlHAltL2lWTNOrY5lPF5xip76qN2yaVIB3i858R8P+c/GFEGxIKlli a+7V0tcMsO0= =ow0V -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-mpurland.txt0000644000175000017500000001621111240377440015777 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Matthew Purland E-Mail: m.purland@gmail.com Mailing Address: You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 12-15-2006 Please sign: GPG -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.3 (GNU/Linux) iQEVAwUBRYMutJlB767GuE+vAQJvXgf6Awl3Px/KQm1zkf/ahZSYaDzAlXd6OjnT +LHa8HGvbKjOfZC9MFi1q0FLPoePM0qhGExKq2TpZab+OWD5+n+VDT4ZTxIGqeiz H5mGjwUmeBMd06I+9F+pGaphvN/mKjDPX/6JlpfkegnqafqZ/wcq0O5iOEmzu5yV MML8+m4Fc6Vdw4bS6JT1hNuNI8nwMjrv7HgQsBLbFVP5RpO2jHBsQEfBUmAGMJqq 7vl/D6nfFqPEB7q7SS/iuAz5w0/LTxNrsuHgK8vy3FR7K4LxgWxrmkC2kD2t6pdm cxG7aksAVLMHfEwd89+tdRF3TN3M5k/apUSGQMEqsL0niuZ5Uw1vHA== =kutZ -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-jules.txt0000644000175000017500000001567311166563041015313 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Julian Anthony Fox Gosnell E-Mail: jules@coredevelopers.net Mailing Address: 2, Tannery Cottages, Tannery Lane, Bramley, Surrey, GU5 0AB, UK. You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 10th March 2006 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.1 (GNU/Linux) iD8DBQFEEbh9SoT4b97cQk4RAnCMAKCuNGYLHa6n/Ot3GEdwCCLeQxsMPACdEhnE I/stizRWWZZkeLbcglzdQCE= =piHm -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-potterru.txt0000644000175000017500000001563111240377440016046 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Igor E. Poteryaev E-Mail: poteryaev@kazna.ru Mailing Address: Russia, Yekaterinburg, 620130, postbox 31 You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEARECAAYFAkgYaEEACgkQDHpNvmoD9JG5twCgjXxwWXCKh5vcoTkic9m6mUBW +gEAnjJUzogrTBtlhAJ2f0EdPzPbo6Kw =0X/U -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/LICENSE-CDDL-1.0.txt0000644000175000017500000004061611240400460015475 0ustar moonmoonCOMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 1. Definitions. 1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications. 1.2. Contributor Version means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. 1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. 1.4. Executable means the Covered Software in any form other than Source Code. 1.5. Initial Developer means the individual or entity that first makes Original Software available under this License. 1.6. Larger Work means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. 1.7. License means this document. 1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. Modifications means the Source Code and Executable form of any of the following: A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; B. Any new file that contains any part of the Original Software or previous Modification; or C. Any new file that is contributed or otherwise made available under the terms of this License. 1.10. Original Software means the Source Code and Executable form of computer software code that is originally released under this License. 1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.12. Source Code means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. 1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, control means (a)áthe power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b)áownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants. 2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). (c) The licenses granted in Sectionsá2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. (d) Notwithstanding Sectioná2.1(b) above, no patent license is granted: (1)áfor code that You delete from the Original Software, or (2)áfor infringements caused by: (i)áthe modification of the Original Software, or (ii)áthe combination of the Original Software with other software or devices. 2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1)áModifications made by that Contributor (or portions thereof); and (2)áthe combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) The licenses granted in Sectionsá2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. (d) Notwithstanding Sectioná2.2(b) above, no patent license is granted: (1)áfor any code that Contributor has deleted from the Contributor Version; (2)áfor infringements caused by: (i)áthird party modifications of Contributor Version, or (ii)áthe combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3)áunder Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Availability of Source Code. Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. 3.2. Modifications. The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. 3.3. Required Notices. You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. 3.4. Application of Additional Terms. You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.5. Distribution of Executable Versions. You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipients rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.6. Larger Works. You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. 4. Versions of the License. 4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. 4.2. Effect of New Versions. You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. 4.3. Modified Versions. When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a)árename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b)áotherwise make it clear that the license contains terms which differ from this License. 5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 6. TERMINATION. 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as Participant) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sectionsá2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. 6.3. In the event of termination under Sectionsá6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. 7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 8. U.S. GOVERNMENT END USERS. The Covered Software is a commercial item, as that term is defined in 48áC.F.R.á2.101 (Oct. 1995), consisting of commercial computer software (as that term is defined at 48 C.F.R. á252.227-7014(a)(1)) and commercial computer software documentation as such terms are used in 48áC.F.R.á12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. 9. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdictions conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. 10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) The GlassFish code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. jetty-6.1.26/LICENSES/ccla-sabre.pdf0000644000175000017500000261033111240377440015353 0ustar moonmoon%PDF-1.4 1 0 obj << /Type /XObject /Subtype /Image /Name /Obj1 /Width 1280 /Height 1736 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 217936 /Filter [ /DCTDecode ] >> stream ÿØÿàJFIF––ÿþ@(#) Generated by TJ++ÿÛC  $ #," '.0,)7(44418=9'.<2432ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ ÈÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÝ ÿÚ?÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š¤Ú¶˜º”z;M‹ù-šébÁæ0pNq޾õv –òÊ ­í¦ž4žä¸‚6`B£'hïÉÅßXMsqgÄosn¨ÓDnŒ?Ý,:ŒãŠžŠæá:Ð^k¸ ‚þvµ¸’ÞS ¬¬¡ã<ÁqúÖ–‰âÄ1K.Ÿ1c ìš9’H›Ñ‘€aøŠÔ¢©Øj0j z±Å2K§¶5 îeåsÕyàŠ¹EU½Ôtý8[¹„_i¹ŽÚçæ‘þêñëV¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÒ÷ú(¢Š(¢Š(¢Š(¢Šã/^|i+œðìÌÇÙdÍs©â©µk6Ö?á1M:îA#[X*FaÚ’îRÅñaרqKqsâ»Ï‡ÚªjW¨ÃuòB±‘ ‰.Sz1ù¹ä`pæ®iº>¯'‹ü`k·qȶöÌذL±¶Íß»éðãäÔ­â}z_BÑM·ÄRÝ.‘»"ç~ÒÄcÇÍÓè£ÇHòQUœõbSZóß jšÅ¤ž$†ÏF–î/øH/ÛÍIW%ºaŽNôÛ‹oØiþ5ñMâ 2úöÒ‚Y]¡X‹c›>‡féüO¢i6DêòÜëõÝ• –P¾U©Í=IÉÆjMBÓVðtš]ü:Õõõ¼ú…½¥Ý½ã«‡¡àe<àJ©uâm[IÒÓª^Ek 8 +“è=OÒ«hÞ)ðLjZTÒµ®$‹ýd`ëîTàãð­z(¨ã¸¶™åH¥GxX$Ф‡Áô8õªú¦©¦èÖ’_êmc(È'ˆ '©ô¥]OMmAô¥˜ä¶[–‹"6$œc¨õ«tT?k³ûH³ó“íF/8E¸oÙœnÇ\gŒÔÔQT,õ6úÿRÓ`v7:q„\¤æ®åÁ#LÓµ-RÏJKg¹ó1qu ªlRß<‡8Ω< »EQEVˆÒI$Ü`¢¶v»Óõ©ü;âM3Äð^Üéáü›kém7¶1!@åÁ?)Ï>•¬ïHòHÁ³3RM`é¾1Ð5nïDÓæ2ZÚ-Ä“DÊÑŒ¶6ä¼8'ë]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÕ÷ú(¢Š(¢Š(¢Š(¢¹OÞ^Ã¥ZØÚLÖójº…¾Ÿç!ù£YIÉøüjoøWþûöwö5©‹Ë)¼ ó>»þö{ç=j‰¸Öü#¥èš¼£VÖ.d{{Y'ʨDÉ/!ËF¸rjÍ®·âm;Y±Òµø­^=Eeû%ͦàÆ2QÕ³Ôt öéT|=âOkŸo½’ÚÊ 6ÆâöræIÌYÚWœ8ÎIÏ8«izÿÄí_C‹_‚ÛMD´‚̉7Ü<ÙÂçh*ݲjìž-Õ5ÆÒ,¼2Çu¨iÿÚÍt -´Y ‚ªFXœóÅKg¯øŠÊ÷QÑu¡m%ìZkßÙÜ@¬±Ì‹ÃRX‚§ä‹Ãº×޵ µûË{iô÷’ÖÆØóH:ìØ» gïÏ»ñ/‹ô1¦]jšŽ—,—70Çs¦F¤KŒìo0’S¾WÚ¤‚ÛÄ#â5ô¿lµ*qä͘ÛS;þð9%±Ž~è¨bñV»¬Ã>«e®iV—ìVWKJ¨HV.ߌ€ c¾k±ðÖµˆ´k YËûL[™3¬Ü+Ò-mu¿xŠúùÍ¥}žÒÍ$äBrÌ£ ,{õ­ÍOÃ^¡©iZ°g¶¼Óæ.²C´TŒ~TÖ,W~1ñEî¨Ú^£—¦é÷ogòDpñýö;ŽƒÀÀϽgÝx»Åꣀ [xµ»G¤\åI†Rz3zäsZ qãZСÔ5Xõ =RimåO!PÄáK)BN1ÎkJÄZCüE¾Vó&´óäÁ†0Q*çÝ鎆®ÜßøâÃÁ×^ ½Õ£–ò{ka‰!A!s×vKÎx ©õ[]rûÇ/m¦ßýƒvƒO:¢³…ž6@$÷ ý)—:Ï‹4Dñ>‘w¨ ››M!õ:ôÆ¡öòu!*qŒ(Ï¥jø‡XÕ­<úµ´þ]ÿØm%ó@3•ÜpAäö¬Û­>ý¾ [Î5kˆÓû Ü• <´‘A‹%OÊÇ“ü^Œ*m2øªÉµ´×fÓ–å¬m HÊ$jp¦MÊÅ‹c'uâ©\ø‹ÅZ¥„•ÚÙ^^ßÏixBRbʱ³èXsךï4ÛK‹8-§»–òXÁ <Ûw¹'<í~B¹¿ÿÈÝãaŒ|ÚiúþèÕŸêú}¾ŒÖ“4-6¹a…qóFíó)È<žµKn©â­cW„jw6:n•2[F¶lå—hfgb ÀÎV^µ¬ø£Ãež¬jˆ“]ê’@š’&ç[EÜT.<Ó÷FŽõ‘â;+=sG³Ò5ËíZÒþG†ê+´vhŽÜ««”\ ŒN9éRhZGˆ¼E§j—W^$Ôbt¾½ŠÌ@ê¢0Žq» –çÔôâ›q­x¢ûÿ?lki]—V–ÁGÚ6¦T2€:1m£>•.â++H|A¥ëÒjV–º{Ü Àßh‚UÏv ÛNAÁèkml.™öûmw[ùKp¶œÛ»à—ålØzsß5ë:uÌ—¶6wrDÑ<öñJѰ ¡e‚q^S¬ßøsÄZ¯Œ“R™ÆË?쫱HáJ|ìÀª‘àt9ãÞ¶¿á-Ôõi—¶Sy:¥ìöÚ[ÌG1JÒݰz¤gÔUxzïÃph·zf¹ªÚÍ„Wi-ø¸V~s“ÁÏ]»Aâ­Ûéw:ï àp8¨®t§·ð^›âï¶Ýɯ¬vWbíæ~|Æ\¡\íÛƒŒm÷îjïˆoàÕ|M©éº¦™ªj:nªÅmb­°É*–/!WBN0GZÏš]Z xâÔZjvºDV°Ë§ý¿"H÷}ôVÜ͵H|ÜgwÄÓ¼9¡Úx†Ê[–Ö­æ°w¼y¤/6çPÁòÄ ôÆ1Å_@ÑáeÜ\Sæ;Ñ&æÿ[æ•Ï\tíÓÚ»éà†æ`™wE*4n§º°Áäé¨ßéÞÕ|#¼j[ê¿ØvÀžZ+†Ê7ÓË'ò¯IOèÙVº5Åœ76ðÇÅ2\ Àà‚3\çÃX"¶µñ$ Ž(üI~‘¢ŒQ·O¥vsC ÄrC4k$R!GG«)ê=pZ—¦i_õˆ´ë8­`m ) RÞg\9¯@¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÖ÷ú(¢Š(¢Š(¢Š(¢°Æf…xØ‚3Ž5ö‹¼U©iÓkv1išN›p·In%Iq2ýÒJ€¯^äÒÁoã ]êéÚRjš}õì—°Qái>ò°`r3Ѓõ\xKÄéúy*mFoÁ¬j[ƒ<„'ìõ­ýLÔoõ Ü["46ZƒÍpY°ULl¼œV%Ɖâyã;Hlá’ËY´’H.ZL”Ű#. ëßÓò«z߇u‹ïÅ¡@"7ëic Ä&èŠîçÇRjš_‹àñBëºLV³Û 2;I šFVÞv¬œúqÖ›†õ­auûÍoÊ·»Ôì „BÅ…¼X=[,IÉÀÅejZ'ÄícÃãÃï›j‘C -0™ÛÏãÜã';½1ÎkSÒ|@¾%Óu:;y­þÄl.Ògedœ1dÀ9>Ç_JZWÄ?Û>¤®Ÿqb²IöK›‰I1ÎÅrqó­Oƒ§±_Ái*bHüͨ¿¾Îç'8ÙIö«Ðø›^»·×leÒÖß[Ó ŽC›1È’ƒ†I6gŒ¨9õÉ>»ãÓáo \y —ö(³›²$¸D˜N’–Ç¡é]Lþ-ñ(ÖSÃöÚ$Rj'NŠòG3â·Ù’àar}hhž"Ô5 u-6ÿOšÅ‚+´MÑÊ®ÖGÀà‘ƒ•zQ«kz–›á{­RöÔ[j j@·WW;QC g$ŠÆ½Òc¶±ð—ƒãU|¼wôe´Ã±lvwÇnô]üAºµð¤Z÷öz›öº{g³Þ~WFmÃ;s Ÿ»Z÷^%º’ûL²Òmã¸kÍ2{òdb6 _Ýôï1Áô¬}CâÖžÑu¸¬VI Üqˆ1”ƒŒ¸=…jêÞ!Õ Ô®,4Ëh§ú4º„Œäçvq {³õ?5žŸáB t’=WÊ’ç$þæ"T9ÍnÛëw>"¾Ò£‰ •”RM/;¼éOÊ£¶6Œš[Ô,ñ?ˆ,¼>‹u ¤ºÄ—q]6Àè @†+œ ^}3ZÖsø—Eñ-¶“yª¾§iaq<~r"¼RDG Q´ƒÜ~5ÉÙøŸ^ÔÈþ,]7Äk;£ßđۃ»ý^Jo99>Õ»®ø®|As 6¹ý•¤Í$J­4òIβ° £;sÍA¥x·]žËŶmâëWºLËcr˜HÊʸŽÀgÚ¡ðþ»%Þ£¤­Œ ÍÓ²®¡¦êh±»2ÞR„F½†H÷õé VñÜç˜t;·OO>çæb=Â?ê袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÑ÷ú(¢Š(¢Š(¢Š(¢¸ß‰ò,>3gòï¬ßbŒ—ă€=OJÏñˆt/Ûéº&‹p.¯.u IdT ºÖ8œ;4œ¤œš¥.¹os¨kqëÚõî-®¡$VÚu¢”i"S…e³¿™ìqì*†‘yáçð5½®­cssom¬IèÄöŠÈØùò Œ‘Ï?Z½£Osy«>• xŠïVÒntû±v×#p´b0…eÚ§$ž™= cØÉ£iº:Xj¾¿µoÙßKÜ~c ínÇ$c½oà >Ô­o­øê[ËHf‰ yqÎñ²¬ß½*X9ÀúÔñÄ‚ÛIÔ­íÞåt­V É¡r킨îFsYš†³eãY´K- K<0êv÷—“´n© @wc.«ó1Àg½jøR)c¾ñaxÝënÊYHÜ<´äg¨úf›àhn!´ÖDÐÉíwPe)”¿g±ìiÏ ÿðE8ü‘áçC&Ó·wœ03Ó>ÙªðÛ]É⿟%ÄrèöqÆåHV'CБßÒ¹qwq7ô]š}ï¢j6k„Âáÿrß1@@ÝøUé¼I‡ŒÛQû ì¶—^¶2ùp¹’\•-ðzAí[{íSZÖòÝ—E†;æ²r>Roöî ÙÃÇÞ´þéšÝµµýö· E};ÁlúùVÈOSÔäþ5¤øCVfñ6{nËeÅ–”ÍŒ2Ï#I‘Ïc´t«á¿øHô]ÿXÔ4¹îu‹Ë‘4–‘•óQFsŽÝ֙⻩µÛ­GJ¹Õ4Adc[k›Ë¸-÷7A^3Î=+2ÆËQÓî¼U+xwû2ÆÿCýÇ“³lba¶M¤ç=G½I¥j¾2—ÂvZM®ƒ+ÝͧÇoou½S®F;·¨Ûœô¥Õ|;q§_h«u¢Í¯èöZǧáq“‚‘í]£¿5‚Þ ×&Òµ8Õ¡‡ROͬé¬I)ù@øç 23ŒÖ•¼^?ÕõM>]B8´½6ÏsÏ 3o{¹ÀíP#}O¥eÛhþ9ð强.¦é÷V~dÆÊòy6˜Û H›Ib¹ã È«Yü5¬›ŸK5Ú]6÷y3¨V‘ž"¹EUÀäûqÜÕÍGE¿»ñ‘ªÄè¶ö¶W°KÉÞ]»JŒÛ¹®cPÐ~$êšSøwR‡K½Áˆê³3y›3÷¼ ˜Þ£šÓ¼ðÿ‰tOûWÃkksö‹(mo-ï—y„a]UùÇ#šžÛCñ•Æ™¬CXú¦¡ ÚgʲØ>P™9þ"zÖt¾ñLj.4…×áÒ¡‡O»‚éî-‹´Ò´G .åP ž¼µt~Ñîô›kƽ‘$½¾¿¸¼¸dÎܹù@ÎÊ ¶¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÒ÷ú(¢Š(¢Š(¢Š(¢ª°ÃG^i#R̪7RZR¨Hb °èh £8däã½ ¨ƒ ¡G £jçvGzZ(¢Š(¢ŠÊ‹C‚-vë]9–âÆ+CT#ÈբŠ(¢Š(¢¡»¶ŠòÚâÖ\ˆç‰âm§œ0ÁÅG¦Ø[éV6z}¹c ¬Ás–*ƒ'Ö­QEQEW=«x/ÃzÅãj$ð^:ªK5¬ÒDÒªô±— {Ö¦•¤iZ%¢Xé¶ëºB®y'©$ä’{’M]¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š) QÔãœRÑEÒè¥U˜Ç ëô§QEEÕ¤ÒK SFòB@‘(O¨íøÓnïl,d¼¹ŠÞ6pŠÒ°PXö‘ÍOEVMïŠ|%§\µ•ö±eot»wC,È®7 Œ‚AäU« [GÕ¶Ÿ{ÐB˜][n}pM\¢ŠdÓAo“O"ÇjYÝÈ  u$žÕÏZ|@ðýÔvVÚÝ«Ï#ìŒnÀvÎ0¤àô&ºJ(¢Š*”Z¶—=ÝýŒw nl&¹C‘å‰T’xäzŽç]ÑmSM’K•hõ+”¶´xòË#¸$`®Fžžõ£EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÖ÷ú(¢Š(¢Š(¢Š(¢³uŸøIDÿa‹3qæ ÿk/·f;lç9®NÇ[ø£¨jZÆ™z*K¦4 ìÞvÍ]ÃÖ²xš{-f}7Z–ÎÞ4›k§ŸqPev*À?wŽ;Öý–¡¦êP ›¨®`$$Lr=Æj·‰ü+yvÖÚ½œ×ŠpaIP¾}0jKïxwLóþß©[[˜D²()»¦A=ûV_ˆµ¹.¡ao%¤Ç=Ù+lÀ4„ £©À§^^ÙiÖÓ^^Î[B»¤–B¨õ$Ó.õ-2ÆÐßÝÝE ˜ Æg` p9éÎxªZ¯Š<1¡Ë–£ ¼ÒɘŒã88÷<{Õ–Ö4T·´»7°ýžòX¢·”0Û+ÉÂ…=ÉíRÜê}œ–°ÜΑÉw/•±æGÆp=ñI¨ßÚivw×N#‚.ìAà~5Éø7Åɨè—zγªÛ‘î™U %¯¢ä“¸Ÿç[šG‹|-®ÌöÚuòËp‹¼ÄÁ•Êú€ÁI@i±xÇÂSß®— ’_‰-Œ(²¼yÜŽNìjþ§«iz4 s¨N …æŽä7¹Àã'׊[ýWMÓÍnåòÚòå- $´Ðpæp=ë&ÿÇ>ÓngµžéÙí‰R:@@Ïï•+FMsFŒé€Ü›ì´d–C·wdc¤T³jš}½õž›,›n¯W0~a7sŒqžäVf—ã? ë7‚ÇOžIç̪áb}±˜ÉÈv*'dŒö©W–>¾þ˜ç8§èþ(Òõ‰g¶Xî-o`Ì’Öê2’„=Áàš«¡øãAñ·ö|wFÝ-Úi.¤ˆ¬1•<¡c»¾xïU×â‡ÉŽWµ¿M‘ÕSQx[6ã€wuÚOBTz¿©ø¯OÓ¯—LŽÖîú÷Ȥ{¼¸É $€2GçÚ° ]Ö‰g ±¹›U¼ò+cb–sÁÈQÿë©üC«ÿ`é7Ú§gû,[ü ÀçÉÎ+ë6¶Ðêú‡‡ä¶ÐäòØÜPË?GxÇAÈΑéSÞø»YþܺÐtÞMPLgi‚Ä©'RÙäv6yéŠ[øŠöûP´ðÞìztžMÅÅÄþZ4 d¤xGÉÉÚ3Yú‰´}kFÒ/nô—’Dñ ¤¶’¹Vµ¹WÆIvGb1Z·þ"×§Ônô¿iÐÝËb#û\×2˜âFqƒj9-ŽO Žj(üui:…åÝŒ‘jVBÊk`Y§llTnAÀã·7ˆ|ec}§Ûjz$BßP-sÚÊÎ —ªÊ6 )þðȳþ]øªâO.§>DzÕèܳ;²K‘”PÊ–£¡ÈÿtR|BžúÓWðMÕ•˜¼¹Q¸H¡,3ÉQ“ƒ€:ž¡mâ/ØjöZOˆlí#šÊ,®-Šyˆ3å¸`qÈ#ƒéI§øØËá}S\¿·X.ô¶»†êÜ1!f„ýî1Çzèt[FóLÓîuVÉ­£’h“8Fa’}+Ë4†“Eñ¶¥­²Ú÷ÄW:5ØíûÄF…¿ï¬ŒŸZŰÚÜ·6ŠÇìÚ ”7Ò㡞yUP¢?vz†»âKÍr] ÃÑZƒgo÷÷W{ŠÇæçb*©±<1T_ÆZõžâ¨µ Kxõ­ ×í !cñº’Œ½Fx=ëÅ×^<Ô|ªßêk§[[ÜEm*[ È‘± Ù~qÑp9ë^¥ XY@5G…ï0LxÀbOÞ¼ïûRÏMñѤ]êí´Ò¿fƒÌÙˆùϦi|7}§ßü@»žÒÂM.å½­Ä^T·¿;Âô!zg9ö©µoxÿLÓ¯5«Ûí'N’–h´‹…ÌtS —ï°éµHäVÔž(ÔÓTð›˜ã]]´ ’>x® oA»8Ã1·­ZÒµÍOTñ>½aŒi:T6ð–ÁÞ÷2 ͆Î0«€F:žµ“㨗W×<áË’Nsuqux˜[ eFõžEtšß†t-{JŸH»·Ak${`ÄGBœpW·‡}y¯ZÝhžÐïstl{FéCºC6Ñ´võ㯛o«x£DÕ¤Ðõ‹¸ï…Öqyav±„mÐãz:‚Tõ¥`Øê?¯<‚ºk–£[^XJ#™õ>ÅAÊK"†> ÖÛÝ\kŸ"·¹{YËMeš5RÃ6x`G8ÇJÊðõÞ»¢xcá番4±êZ­Œ­`$/ázdu'>õ¯n†½Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Šã¼6 x¿ÇMŒ&˜3ê<ª¯&“¥ê?æšöÖ9ÚÛB…¡ó¬d# õBFÑ4{¯‰1ÍE¦‹{&–+^™¢ ìf=ø¬¯ÚkÞÓ„š&¥éö—zx¶_4½Êüà ŠzüÍžy®›OÓ4ë¯xŠòâÞ9&¶°°X]À%7ƒ»\ ÁÕ!·µÓ¾&Û@‚8VòÖ@‹Â†‘’½køLßÇâÔñ4qr{TžÆT$Æ-°Gzo½Üä•Û_ÙÛê6—VW ºˆ^'Ì0kËôÛ©5˜ü-àÛ£¾ãN¿˜j*y;¹»Ùò½k§ðRÛË}âù§µ®Mžð‰@ò‡û»zvë\›-¼VW-m¶=.ßÇöíoýÀ û{ßžœWYã‹uÖ|n]|æÕŒŠÊ„ ŸÔW[8ÌRToå^[§y-áï†æôƒ§C÷ÛÏËæaü­ßð/Öº_y/­x.;p£ýªdFVCæçØŒ <Oʨ­âkäfî@Áè2ksÄÚaÀXæßåò}A®‹RÔtëxnÒ„{‹{K敃´:ñŸ~*‡KÐådÆçÔ¯‹‘܉þ@ “Çd -$üOtî¿ïÔz'”Þ2ñyë"A¥®}F8®oS(t¿‰ª¸oP°^¿q2MYñ-ÓO©øOT³Öâ²±’ÞâÝ/‚¤‘¤Œ½ c´nÏQŠ›HAwâ…’O¾¯sc§Î¡‚5…B>Wt?{<íLЭ®.¾¼6 Zil/v*\—l^•—qªi··Žo4ñ\Á°±‚LìÄòÂc!ö­ZßÃÐkÑÄ5Û­ ZƒJÔŠò1ÇÌ*̧¯Ý<õªÚÕíÿ‚¼A=ìðÝEg«C_@›RåDËàq×9#Ž+Ô-/,µ xî¬çIíåI# «b+Ìui­Ç†¾"oe+¾Á÷tå£à×UãÃizk66®³¦þ¼ººñ“ªià{ý0έwa®Æ.àçtFK¾2=ë·ñëF«ábçñSéÀ}rk“’=+D×áq Åü7q2·È'‘öHÁãž3U~SYÕçT…’O iãI]Ç!§Éãßhu>?@þ×Tœ¢1ÏЃ\¾¯â¸¼IáóáË >ðkZ…´v²[I ¨¶0Îì@]€t œÖöƒi-§ŠüBž\žRéÚ\i#†Ø¬8'ƒïɬ½/[_Ýkšn¯cy²mNâöÊ{xD¸I°v‚°ÀðAÅf\Ùê±h)¨j0µ½Æ©ã++õñº(Úe­ŽøÒêºN‹£ø‡]¹×¬59ìõIb¸µ¸²3•ÜÖÃ2 ^AëÅ>/Þ6‰s«iÚ–·I¬ÛjpZÍ+4÷QÛôß¼¶Öaœ ñÅt6þ-ÕµÍCN´Ñ4»˜­Ä»µ+‹è(Àû‰’¹rzcpõƒ$»³Õ|Q¥]X]DÒj×WñÎÈ|™#¨]¯Ð·µ'ZŽ÷—Ún›5ûYjRK,qc! d7'8é’2x¨šmCÅúö…¨x^Ú;¿ìÝ5´Éíep4$† ­‚ääsSYi%ÖõYµýjÍ,6k 1 ‘”Êrîì2pt}§èAã9¬{ê×ÚŒ<ëkM"]v ;sº8ZÎB¨Ë»W§­?UÓ~)x¢ÃN²¼Óì,ÒòÖ{ƒç—7S¹…ùG~rsï]%ž…¨Å¯ø¦þfO²j–öqÀA% ¶F?.Msš_„¼eýáM.ý,ãmYµœIŒ|Ø"VÁA†9Æ?Zê4=ûNÖ|Q1ÈÔ®m¥€);°‘;¸úrkÔü2m¬u©/õ;k®ðýâkÏeÕÌfðooœÆ\sÆíеy£iw×uÔñ“>)’ÙÕˆ(HÁGPr*Üò´0Ë*ÆÒ´hÌ#Ln|ƒ$ žÜŠå|+¥ÝKªë~%¾°kµŽ( “nõŠ0æÁ#.FHÏ¡©ø7ÂÚ½Û_ÝZµ:’HÐÈ `ÚÃ#ëš¹& K¥ì¢:o–#û>>PÈüsÎz皣gàXMosž¿h·‘dŠgfgR£ I8ÇnžÕ¾@`AäƒYËáÿ®–º'Øb:bÇå‹v@3žþõá_ x}ä—L±Hemi2Y±é¹‰8öÍ^²Ó´í;í?dbûMÃÜÍ·øä~¬}Í&¥qki4ÖV†òá6ì€8]ù<üÇÍdxCD¹Òmo.o£HõNò[ˤŒ‚±–< 8 ?\Õ‹ÏøGP»kû½*Þ[§Û¾FQóí黱Ǹ5¡}¦éš«Ù_ZÅqjàŠEN:p}*®Ÿá¿ i&Óô»[f€8¢A]ÿ{ óÞ¯ZÙÙYFa´!Œ»¹XÔ¹ŽIÀîOZ.m,ïæ•RD•€Bº‚3Ü”©mkÓ\G ,ÓÈÜûzdõ8íLûžVé~ÏÛ¼›´~÷#7¯sPÇ£hpØ2;À }œ"ùxÎ~î1×Ú¦³°Ó´øÌVVÑ[Æ[qX”('ÔŠ’-í£H`b‰Ð ®šFÓ_GcݶwLwœÿµŒÓ¯tÝ+RT[ë8nUTLŠÀlƒR›[C¶0ÆmÊì1vúc¦)ÑE ¤PƱƃ Š =€ Å ¥‡9aŽ§ÞœB·Qœy¥¦y0äF¹r p9#Öœ@=FpsHÈ€ê#"HÊŽ0Êô4´T@ž´µOSƒR¸´–-:ém.˜®É™…ÁùIÈã­Uðž¶­9¹¸y$žæá€i\å˜ÓÛÚŸâ-$ëÚ>£¥ ¼“wEæc;sßÌUø"ò!Š-ż´TÉêp*J+_ðôšüú_™}$6vWqÝInŠ¿¿xÈdË@vë[”QEVáh4ÍJ÷Wžúæþþæ1 ËpW÷1HD ªÏ_ZߢŠ(¢Š(¢±õß èþ#û2ê^sÃïòVGXääÞ*;æ¶(¢Š(¤VGPÈÁ”Œ‚:Z(¢Š­¨iúv«k-•ý¼w²€)*Ø9èk/Fðg„|o~°­ÛøWW…†P 8Lg;D¥¿LûVºx›@– æ;‚ðêò¬VlªÇ{-ƒÇœãž+^ŠŽyDË1„q³:œ ÕX‹_Ò¬õX¡xRå äÆåÁ#ŽÞµ!Õ¬Fªº1ßö¶³7cå;vÛ÷ºg=ªõdøk\Oé6Úª@Ð,í(±ŽW¨õÆkZ¹MÇ6Z·¥hÒZ¼¿lhÄÓ©ÂÛ‰jã¹÷ÕÑ:Óhc*¯"«1‚FOÒ³µzËL¿Òtù•Ìš”’¤n6íO-Ke²AÁè05¢Ó@Ÿ~E_˜/$u=ãQÏ{clñÇ=ÄQ<‡®À>Ù¬íwZ—H}c…eúœ6lKc`p~aÁÉéÇÖ¬é÷ZÄÚŠ]CqÁsåÀÑɸºm,06œö椃TÒ.§’ÚÞö n#ÎøÑÔ²ãÔš·\Íω®ØxžK#x4[WY Ä— …Šñü*1ŸsíPÚøŸW›ûc̶…~Ç¡Újà“¹åF%O°+Æ9©| â‹éswÁy &3Œ2†Vç U0¾—ÆQx~"}?l±É?ͼL‰¼Ûë~óÄ^ÓîRÎ÷T´·¹|mŠYT1ϱ9«7Z†›cåý®ê(<ÝÛ<Ç »hÉÆHè95Í_üE𞥣ٮ£dö÷Âs%Çž B|¹çsdG>µÔ¼u©ëÚþ›¥ÝéöÖÚkZ„3ÀîÌ%MÇ$Jƒ¯µ[Ñ5¯¦»qáíu-d˜X-ì6‚ºnÚÁ•‹sÓ“Å^“Æ^ Šé¬äÖ-Vu“Ê`\a_û¤ô íœÖ—öŽ›ößìß´Göß#íF~/8ÝLñXž+ñÓ,¯ãÓ® ­²ÛHcµ$•W$:çŽj¼Úlj…·Š'¶òe—J¿Q [OÏ";)9ûÅIÁõìk¤°¾¶Ô¬ío­›0ÜD’¡=pÃ<ûÕš­¨Í-µ•äñcÌŠÞY#Œª’3\Þã=:hº¯ˆ¯ ¶–ù*ŒËœã®8Íii>/ð¾·w%……æû´ˆJbttbŸÞ‚ä}3[2I(òÊá#E,ÌÇ@êI®nÓÇþ ½¹†Ú+ÆSq Ž dŠEŠf=’FP¤žØcS_ø×šn¡.•qtßÚù9·Ž7g>gLS‘ëŽñšf©ã i7’ØO$òO«\}ž $X ƒ#"°^9äôªñL3h:žµªêöpêW‚;–ÀH“¸ÕF¶i美í­eHár"+Õœã}óüMã=nãÃÚ¡¨Û«4ñÄÞQ—Ulp\áÎGÖ«¯4«}ËV¾Šæ&º)Væ󦎉$ç·lw«:7Šô­fêkŠæÒþ(„ÍkwI<²q¸Áô&´õGOÒlî/ïæXmmм’7@?ÏJÀ²ñÞu}gaqg`÷Ä‹G¼„¢NG8S“Î=BÕ ÅiZ­ªkwrI:Õì“–sûÌ"(Ÿ@+RÃÆV7z…®—s§ßé÷7qÈößk‹j˰d€Aa¸pqL´ñÆ™¨j÷-•ô×·mms"Åû¨qüLäã¶2}«”Õ¼Eyoà‹ 4™µ{¶_5»^>Ï´ óðÀœŒåSöÉÖø^´k˜ü;%½ô°iÑÝ·g‘ Á%•›,´4Í~ÏV¿Ö,mâ”eÍÌÀynì2B“•èrsÞ+ñ6½¤x“ÃV6Z}ÝŵÏڌɕ‹‚…ØSïº1О•›¤x§Sµ×|]§[麆«Ð§;Océ\œ^3°ÑôÏÛÙé××£Y°_± *Ò ‘©F$ y9ÇÕë?êS_]è÷šÖº¼v-ym–6K”YÀ9ë+Àþ0Õ—Ârêþ$‚UŽ &ÙpdW{–i™B*®*p£=k]{êhœ‘$¿QÅmøÓ„ýá!µ?øëW+«hR¥ö»q­xgû~ÖîæGŠþÕÕ§¶Tb)à4ë'ÂzÜÿç1hÁ8žÙ§¼@eš8¢b\ŽJ··ZÓÓ<9¡ê^4ñ]åõ²ÎÖ²é­H2ˆâ/¾¦áƒŽ;U4³Òµ[Íz{>¹ö›ÉbšöýãX×hÁŽ,‚Û§ øš­¥Épþø}æä²ø†ù$à#ÈÉç U¦—K´°ø’×ÒO´š£$†Ûk#E=É8ª:®%…¿‡f‡Ãº”š]•ÕŽ©àiî9½¿ÍõÆz—ž0Ø?AøVׂ´Í Qð×Ú¯m¡žmE§“Qyòn!ƒýÞƒÒ¹k[[}WMøwk|‚{SªÝ¬k/;áw—œõê+©×ììÓÅÞD‚%µУ qíY¶Ú#ë>2ñˆþÔ¿³ÿfœY˰>èÏÞàôǵE ¼~ ñSÇöéõ5-.ææñ®Nû˜ÙI8ì==úU ¸µ†ð%À·°ÓtÝ KxcžF–vVårx]ì}Û÷é[ºÆ4Èüâ‚p-ÞÒñÏüñ¹P¤·²¶ _ðLÚÛ^ w Výćü°€íOÏ×YåŸ*€ü¿{ŒsøW)ðæF‹Âšy¯›r¨Xöó[×U=X)ÓuÜi0?÷ɯ0ÓãŠ}átR¢¼m©’TŽ2¡Èü5Ök¡WÆž `0ͨ„ú8©>%¬Íá hF¬Ê"C(LäÄoéþÎj—Žï4;¯Ë£Å1¾Kx´Øã#/#0òöQ×J~ÿ„ßÅm"†ž=?I]ýþemØö8‚õ.ÀxžßPº†è5«É®ÄŒ¶1ç)\`ô®.Þxn<%ö™2Ûé±xÐÎҔܑE»åf\•Iéº ô¸»Ö|1g{âÈï®?´#»·‚ÖÕ É,Êçj‘O|ô­¿*}¯ÆŒ0[þ[•$uÀE ¦kKÇI¿Âž!_ú†ÜgðS\©ÕtX5/k7¾–ºtÖIs¸yp\2/Þn€°æ´g¿ÓõïhÙ7 rº]ì·³BÁ‘V`°ÈÉ<ãÛ5oâDe´(çxš[[MFÆêò5–†9~P'ØSï¯usr²Â°”³37]»{t9a_øŸ“ÔŸ¶œýë¨ø0ðõÞ‡ãté^Öð å œcÿlcëZôë«ZËxÛµ“Pº?ôÒàîçÜ ³|s©iº&»à½WR˜AeÕôrJÀíV’,.qV<ÁµŸ¸Û1󎿹Jã.tÛËí[š´¢éþ<¹¼œÛdLbFÃ2prTŽJ²‹á]wVЬôígZ×;è®ÝLß¹¶rBc@2 ö¯Hñc¡kAA,të¬Ô†¸m-.DßH…Š.•r$!N#ÿF\gÓӚݽŠCñG“ËrƒB¼À;Aó‚zW§Áq«xçE´ŽçûSAÕÞâæÙ$„-öÔl[o+‚y­íð¶¿s§Øií®k=ÜR\Gs4颩´¤¨\p¼äúTž#°Ôæ´ø¶‘ÙÌÿi6?gÚŒL¤B€ìõǵYñ>okâ=oVÒ§Ñ£³–[&V·–6,<Á µ<à€G5RÓÃV>#´ñLš6Ÿ}\é&ÊÎÿP¸˜½Ñ'vÕII"<ÉÆsÓ­n¯Ž5iìí4í+C¼ÿ„€ù0ËÌ,6ü€ìò`)P3¬sNS5ŸµËy­.vë:}²Û\$la$`ÁØñ?ÌW9i«êº€§ð¨Ð595«}2âÅâ7–x#x“ ã‘‚IèZÕ!Ôa¶ðtzµ¶ªtÑ¡Žæ üXÞÙ^Çw Ì›×*Á\ŒŽ}k—ñÜgˆnô/Ç|¯­‹—+ ’Ýãýñaž/Lõ÷®Ùôûå½Ó¥µ½0iö°É–jŠV\€îê6ûUÙâÃ,$àHŒ„údW¦x;ÆšE¾ŸgâÍ@›PHÎ2sÔ±=kB_ jòj:6ª5·[»8M½Ù&Û¨Ën#ê3P·ƒu'ºM3]žËK»™åšÍ#C‚ÿ{Ër2¡½³ŽØ«g„›FÒ4OÕ.!ŠÂóÏgwN…ÙŒm‘§8ãž+oR´{û+»4 kˆ^!*crnÈÏzf‘¦Zhº}ž›j‚Ö‰3Ôã¹÷=McÂ¥gN3Íö}JðÞÞCƒ˜Î=FyÍVÀ²Mw§_êºíýýÆŸp’Á¿b Ûت¨'©ëî*Gð@Šêþm/Z¾Ómïæiîm­ü½#ýæRÈÌ¥»àŠ~£à}:ëOѬ,nîtã¤HÖ{v`àƒ’Á³»<äsZ¶%¦Ÿ¨jº”rHóêFÜÌ£ÉM£huïÖ±$ð ¡žïÉÕµ}>ògš{d&gûØ;w€{€Â§±ð6‘aieb—7Omcª FÙÁòÈÎd¦I<äç½Z“ÂZðëvó,’C¬OçÜ)la€l#cõ™7ý"î%KíKSº–&F·šYÉx r˜gŽIºä]ˆ‰¸¶Õ-ÔãÖ¹ßÙ^hÚŽµ¦˜ì3\}¾Ò`>QæýøþªÃ#ØÖõÕ´7–÷³bž'‰ðpv°ÁÁ¬›ß x{PÒ,´;˜ìlÄ"ÞÛ‡”02ÙÏN<Õë#Mº¾Óõc&çOY–܆ /šn3ƒÇ¨8¬{¿ønòâæcö¨c»“̺·†wX§nåsßÏ|Ö¬º3énÖá²ß}¢¡!c;JôÁïPë¾Ñ|F- ’n´”Ë Å##©# ¤üÕ[ÏxZþöïQš EÕØA;$Ò.ýƒ…`:{U'ÂÞÑêK5Yn†&‘ÉgqèY‰8öÎ+:‡^„¸þÏó!!‚A#»Eჱ _À «âM6òßD‡ÂÚ&“5ÄQˆï 1Û.áË—}䎫€Ý+ªÓì­ôÛ;[!¶…!O¢ŒUO¦­.—w– Þ\(‚6$ó‚ç‘÷G[ˆn5XÄÖÒÉèªìÑ´{pU$êx÷¦7Ä_‹˜-†­4Åd@Æ _À* ÏvÔW5¨x÷ÁúmÝÅ”÷nÓ[\˜a‘Ö?‘XÄÕ½GžÒ¬ìu ÝF(¬ï˜-¼ü”rT°Áõ¢Ò|gá­jõôëYf[µˆÊ±Ï ‘™nMê¹LÕÍ3Ä:&¯¦¶¯g>ë$ów»«)_,Ù ÇqSi:¥Ž·am©Yk[”ßu*Júà€yúVÿ|-×Ö°ýªêêÆw†æky£)Ôœ/OCž{f´?á+ðÏö0ñÛ“û0¨"lI8Û·Ýž1ŒçµWÒ¼g¢ê—‘iæ»+©ãi-ã½…ã3ªõ)¸`ã¸ëíL´ñLJïõI4‹%¹¸»†î[[.&Û©v8IàœÕK‰¶Ý;[ß6š’ùO©$ m”†Ûýqž2zÒÕüY¤é3ÛY¬W×·ã¶³Mïåƒçû’3Û5¿4/UÕ1kî¸,@o3æÁÜyç¾+ÓÓ”_÷EyżÒé—~ŠB“7ˆŒƒœ‹b ùúpGZÖðõëx›Sð¡s¸hú+\Ü×ÃþëÜab®¤ßøGÁ­wg¬¾![œr#’á÷/Ðàf·çðχµ/­¥Õª=•—‡àòmHý×¹^„(è"´|'ek¤ø‡Åz]„b >§Í º}ÈÚDmÅGlàSF”9úëqK ÙPJ3÷Pydç¾0~µ¹©Aaoã‰å’AoÞ¹ûC'jÊ>n;€xà×5so¬h^·7¶úgˆ|#hÍ‘ŠàFq—pö žç­{°uVÍy& sà?ãœk·€Aç'ô®ÆÖÖPÛ̉ŽšÔ :cFòíØëÅKãcnu_¤Sûi}áSçÀvõ¨¼©“Çs,cÌ“ÄWѹ#’W¦IüëœXâ‹àÈÕë-€0XÍÉúæ½bÜî†Îsœúñ^k¥êZÝŽµ©éך^¤ Bù® Æd™I òèªÄŽ›Z³´èíî¼;ðËÌ " Œô;L˜ãð®¿Ä[Œ¼ x Nª®<‘\‡ˆ¦¹ÑnüMàë_’OÝ[K§º;n=¾\ø×¬YÚ[ØZÛYÛ®ØmáH£_EQ\uoYjž;µžòoÄ7W,¬yd { ¥r·^{ikVWBËF“Ç3^¥ÓG¹#‰ÔªË´àmßëŒg5ÐL²^ø‡Ãv—~-]Næ;¿¶Ã­´"¢œ³º¹Ú¬=óÐÖßÃÿ+0uU,|Q¨î+Õ±·qBöÇHÐïu øª(l#1Ð5Dʰ't dH2xæüs]‘ªiÚ7Šõ+½{ËÓeÖ42[C;E©DàeXôã¯JÎÕ.­µ£ñ/YÓ¤ikááaç¡ù'š4vb§¾ÐBæµ|fcO…îX* Ó4ãŽÀnJôZ<Œ¯¼ãÁ>(ðÇ…ü8º>³}ž¥¤™ã¼‚c‡fÞNå–œ‚3œÖV‰ewa'ÿ„Ã5Åþ±r ~± ‘W°àk׫Ȣ:~¬øš Ä×Ú1ŸUšúÝU‘a¸ŠP0UŒlK„íÒ ’ÎÖ? Ço¡$Z‡‹¬oßíó'EfWj¶8gó®ÏÇŠMÇ‚ÈBÀx¢Ó8íò?5‹ý¾³ñ'H‘˜_ÞEö˜" æT §ëïT&Ô-ômáF­}¾U.©>Y’ܪ瞾Õ{âÞ£áÍBÓÄz\m+êš|Ú;ê%pZDZȮ£F}+ÂÐxs®Íö©­bÂ’®Ñ.é n€ž¼šé(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÖ÷ú(¢Š(¢Š(¢Š(¢¹_‰ Ÿëu+÷ñk2úÏÇÞ%³·Ðµ->ÚÒÑž·^¤Û„È„#L ü]=ë{DÒµkÄ÷“ª-µõÅ«Ûl’#ˆ)ÈÇýkÎÏÇž[+IÓ­µ =®%’Îi'ØmÖC².ÒHRz¯QÚ²¼A êº‹á;+;˜ßV>#Švž@B<òfÈí'\Vúi¾/×µ]*ë[·¶²°Óí Riñ€IÚ *çŽ2}ª¼zW޼?ö« ×O¼°–yeµ’âFFµóJ²„mÀHÃÚ®ÏáÍuãð¨’ùnçÓ/ÅÅäÒŒVhQŽ3€8ã½IâÍ+Ä—WZ¥¡‹gºÓ®%fŠåŠ«¤«´ò9Oð8´qªêþ¶¶ŸeÕûIew^×!ß>Ënµèˆ‰ª ª¨€®ZãÃ”ÓøÒEš 5»Ha¶Î~FHŠþÙôÍGsá~ÖMRÑ®­×R±Ó£ÓîpÞMÄCŸ0 ò?ZH¼%«ê–ÚËxŠü=Ö¥Q*Zîòmg*c N[w$3LGÄ­E­-5]RÎ &ŽI¥±,÷!Ý98PßÅ‚}+cOÑ.,õý{Wy‘¢Ôb²HãîC r{çÓOIåœ[ÆË;w=ËÜšãõ3amâ Qô¿C¤êEÛ­î‘J?$‰¼§ qÁaëYðßü$zŒ, ÔäšÛRÔ¶Ã}"çÍ1•.ãA²8®çÄzë––±Átmo,®¢»µœ(`’&G*z‚ Ï"±gðН/t­VóÄAï¬.¢$A±†Ü[såÎ=+DÑ&±'žeþÑÔ¤½Áò÷ª£“žžÕŒÞÎy¢®¥ ’kù/b¸Ú37¨Ûž@éך±yábsa}o­5¾µooöyîÖ%+p™É ã¯#Š]7Á¶ÐÛêË«]É©]êÉåÞO ”QG ·zÊ»ø}¬j:{é7Þ(»—OD n‚(Ã.ß»½±—ÀõÇ­wJ6¨^¸VxWNo§‰üÇûBY›+n¿œg8ã®1K xWMðíαujîï©ÝÜ60ƒ’p“×'š¡7m_ðx~-Bæ/³]}ª ¡·ÌI<ÂàôÇàqZ–:ZjCU’îk‹¯ìØlÉ·çÅ·œó1<ãÚ¥³ÑmìõmWWY]¦Ôc¶GC¨! qžsÎI©uK׬gÓuD¶Ó€zG ƒÔzW.>ÚL±[ê:æ«§ÆÊEÄÀÆûzÀ©­½sÂÚ^· ”e峚ŷYÏjÛ0BöÁŒS4 iú\÷W²Ü\ß_ÜÄ!’êéƒ8Œà( žp榲ðÞ—a ÆÒµˆµ’Ø–oœ«ç<ã¯>•KQðN¨Xh¶âîØhá¤Öòm•B¦ÜnÇq׊ӰÑ4ý6ûUÔ 2õ9!y÷6Fc]£híÅgÝx#Ã7¶zeÌ2Iiw©Fd.~i #ýÓŽ•›àMM¾·¿ó¯.¤µ -êvt¶Ï»§s“ïN¿ð/‡õ JãTi.àšé.ÒÞgHîð7…#ââÖîkt{‹BæÞFt{Æií‘Á®bZÕ¼S¹«YEko¤Áq‚,ÞW”àÈpÞƒ®I®¾¸ÍÁz|’kí¯éV—?i×no-L¨®|· ƒÈàñÒºï³ZùfòSìû<¿+hÛ·Æ:bªéú&ƒ¤´§iöÖ­&˜cU-\V¡¶µ¶ó<ˆR?6F‘ö73u'ÍU}Ãò]AôÛV½<ľfG}ØÏëS^éÚf¥Å}k ÌjÁ‚Ì€#¾4ôµ³Ž²¤­¾ÂžPQ³i페§<òÄ`’$hJ…(ÀǦ:T•^K :iÒæ[hžáF@Y~‡©Ê© =©iRcÌEm§##84ü )03œsëAðFkšÔ|7ªjúííýôm£éó-Õµ’dž3*à3¾ã§$aEmϦÚ\^Ù_ÊÍf“,#'h2 Ç® 'Ö­ÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿ×÷ú(¢Š(¢Š(¢Š(¢©jÚV­ØÜiÚ„~e¬à 3‚äzZ¸»@zÅ—;r7c8¥ª—Úf›©5›^B%k;”º€œü’( 0ǦjÝV“PÓbs—P£¯YÀ#õ©ã’)T B¶Ônuhlâ]BáBË>>v¶Ã¡EQE&T äô÷¡™QY˜áTIìCgyg¨[Ãwg2Mo2ŽD9V¸5=S½Òt}H£_YArP¦TVÛž¸È5j8ã‰8Ô"(ªŒ=©ÔQE6I#‰I""–fc€êI®I¾'x\ƒ~ÞH“Ëû@ŠCï÷öíýq]dRÅ4i,N¯¨de9 B >Нwa`!k¹Òšt‚2ç¤s…Qî{UŠÆ¸ñ6•kµ<«:Ǥ.–ÜåC|ŸÞëÚµãu‘Eû®¡‡ÐÓª½õõ–™kq{y ŠÚÞ3$®A;Tuž]€Ìlà׿ӌ2\ ¨Œ’Mãjã®NqÅK Ð\F“A"ÉŒ«¡ìEC£¥ÜÍ-½½Ü2Ï Ä‘£©dú€r?mΩ¤Ù‰ZêòV¢C#¨Ù»¦rxÏlÖgˆüW¥øCŸ\ßÌ( Ä©"8“Œ+ ïߥkÚ]ÙßÀ—6“$оv¼lN8<ŒŽ f]kSoXèvhŽæÝîïY³û¨~êãÄÍúÅahþ/ׯï4[yí­‘/5fÖb»²™!Jòy8ç?…"ø‡Æ~%»¾ÂÑYA¦Ù\5³ÞÞ†o:D?0”z“Ïj¹ ø‹ÄY¹ðçˆm"Žõ-…սͶï&â<àýîCÔdÔþñ£âM*{Ûå‰eMBêÜAlmœ“Î:ó[Æ¥o£i·úœÿê­-䙽öŒãñ®gá÷Š5ý~ûo[ÅoªÚ4˜â/“:CÉnzƒÏj‡UñOˆ-o5X!keŽÓ_ÑìP²’LWA7gŸ½–àñô­­;Y¼:ö«¡_íó#/lF<ËwàƒþÒ0ÁõUÏk6žÒ¯uK—UKx‹.ìáœð£ŒžOÇŸˆÖ×6~Ôà»·†ÒòóÈÕ ä,$@\¨fÇCßœ×Q¢ø¿Â¾!ž[m.ý&ž$4d2¶ÓÜ‘î3U¯ü}à6êæÊëSEžØp]„Dÿxª=òxª>.ñþ—á´Ð%Žh¥‹R½€3ív_³°;  鎹ô®¶Úâ¸!¹‹E4k"%Xdpp1^{៉ú Ñ­ß]Ô[õ’çí- .ˬ¬ÌòÔªü uÇ­vŸ‰ü9£Ø[êW—ж·%» ,f.2¡A$‘è E¢x·@×çžÒÒIc¼’[ÜDñÈôm®ãéšÎ¸øàëi]^iͬs˜$½H$6É 8Úd ·¯=ë¬XSFAëÎü=ñÚ1¬Zß=î¡yi«_¬‚Þs)! »bãu'Ð×Y'Šü7½ö°ú|Á|§EbÒ8 ªâÙãÍWÒ¸?ݹµ?øø®Î¼Áõmq,5k(/¥ŽãQñ¬º\W‹5¼R™Î0 :k ·ðuƇ©X_èºÊÛ.õÔmAp¤pÃq8p{ŒWawcâ[Öu(¼E&¥pò´R٬˨ vˆ€!HÈlžµzåüEâøym¨Ý^é×wr_Çx#-’,KÉ cÀü7dcŠÛ³Ó!ð׌¬ìôÇš;KL¹’h^Guóc`C€ÄàóÎ5ÇÜZ¦› íâ»]bË[Žiþ V’HW-ò° Ø Ž6”é[Zö¥i¬øˆi×ÖzŽ­¥Úi–Ó$VìšI¹ó$ç/$u­JÖÿV³‹OÔ-4 Ëf—ãæ‰ÎC¢Îvž£'ŠoÄûÿô7CH¦õ[ØÖhm×to &Ð;ãŠÍÐu¥·ñÜèºuîŸc®Ø¦Ä¼‹`k‹aü'ø:Õ½'@Ò‡a*\C¨Æe€E*…Ê0$o˜7p¹Á¬ŸXÇâ}:}SUð|š¥Õü÷,÷²ËT ·>ä ò*YtCU³øk§xš&yÅõäS“ bȈÛC:“ÊlyÍjøP|@©§D–K %ÓZ*Ê’ìW(>RUxVV¡,þÑþ!ØèêmíâÖ-#†8›o”·"=ûEÎN1À&Ÿ«hÚ­­½Œº_ƒmt{»+›w·¾P)_˜e\Œ2$ç5µ§xwBÔü}ã ÝBÎ+™ ‡LX„ªW|G'ŒñŒâ¹[LÓ¡ð¯Ä½>+XŶŸ¬,â*€ºÆNÁ۩鎵ì}­•¤YÁ*åcB¨Ï'`rk’ð˼kãÇ‘yö\IžÉå“DZ5Õ¦™¥ÄQ¢µ‰9&–6 21%È÷byõ®GáCÇŸIo–ûK¾º¶¼B~`ûÉÉö ðky¼Kiÿ ~†–ãìMw<ªFÈ8PÝòÝ« áZ²èš€8ÿæ¥Ó§úʇâ|÷÷°hþÓ¡Iîõ‹Ð϶Õh-ðî°Ø÷OÒ³¤›ÅZ7Œ´MkWÓììí5(¿±¦6³3‚Ä–ˆ¶cð:þéMkhÅËC.èìJ™“I÷ô®?\ÊxÿÁÍwÉcª$Øï F}·WGâXs§Üÿè¼ò[{KÝá,W(²Dnì‰WÁ­»‘Ó­t^ ž7ð3(ž-^2GR¢58úf°ô»½Z÷EÖu-$éz&‡5Õì®÷ òÊçqòeÑAcÐØôªø'ák»€£ZÓ2Äàz÷Zà>[[Gày¶¢~ú]M¥*>ùósïŒ ÂÓ5ΉðÞÆÊÚÏûJâÞvµ»½ÉŽÛÊ\6ÕIbÈ«ú\÷+ñ8/õ¨5ÄðüÂD·Œ"ÅûÅ!pÎO^XšÊ‡ÏÒ<3}¨xs^²¾ðÜkrçKÕ""ä–‹vCg92÷¯VÒ.>צé÷?gû?i žIÿ–[”¿‡Já¾ëžµ-¶–òÚÞæjRÜp§i~äŽ;W,°ßE¥èz­½è°Òeñ~¡u Ä‘‡H"œ²ÄåX´œàœcp5Ñå»ñO‡mî|Sý©wjó]Ç­´`F›&GVùU³×'µexnMSL³Õ­®üi“qg¨Þ=ݼÐC¸rÛòÄ Õ>ÞÆÛGøåÍ<ð\ø•®b{ˆÕ¼Á#°'•ö®«ÄF1âÿe°Åµ@£×÷Bºú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÑ÷ú(¢Š(¢Š(¢Š(¢±¼\²?†õå ¹Ó.‚ª‚I;@2k†ñëÚVáíSI´‘ï/ôUÑçUVÜ­*Œž¸ÆkV} -µÏi0G µO ßÙT«÷'¦MA£x­ô]-çM¼:í„d[hàr³2Œ+#ãnÆà“¸b—Eе-ÿÀv“ÄÏ%¶›© ™‘¼›X‚ßSëZÜòi~3Ðïäµ¹–ÞçOšÃÌ‚6pŽÒ)ñÐ{ÿ…SÒµgÑ|A⸮4ÝAÖ{Øå‰âÙlÃtüª±‹Äö±«x‡HÓ§ÓŒZöV²\¨I.fc•;Nx^Å»þ5Ìên} ÜCaá}Zç^òî®/•÷FèAv #a›®Ð€çô®ÏÆw #Dñ}œ.—T‰såN¥\Å2ít`y‘Ûµox7J›GÐ4ëkøúhÌ÷$õ2Êw>~„â«^Zß7Œ´‹¤·Ú¦•v’L>â±eŸsÚ£Ú_EâÜË¥´é¦ˆdaòÈQm¿NõËaø…|=pñØÈ÷v^*—SŠÙ°dIsò“ÇÌ9vêÿÄ>#Õü-uƒyk§ÚÞ´“½ÐUu,„}Ì“´zú‘UõË#¨\ê6Þ ðsjSùî,/lÑxÏÜ åÃ+/BN§¥>]3Åz™à‰ÞÒmVóI’E»ŠS&%B£ ij8äŒã­zÊÒÁ"…åãaƒî+•Òt­b .kbºöMÄ>AeÎö …ÎHýk÷CÖí¦ðÍåî‚ÚÕµ®‡ £Ù«Ç›k€ç ìä|¹Ï­ ØøžÏÄ—×Wz46Zuõ„+ Ûº·0“…p6üÇ9ùAôÍ3š½·Š¦’XÔh6·7:…Ÿ#™îAÎp¿1­:ûÃ÷zf³©ßÁáû]b×QÙ(PK  a†]OÊÝx<ñ[žÓµ; [P·µµ¸¹¸y…µª(HýÔ%@ÜGsý+3Å:6«6µ¥k6údZ¼°K ZJê¦6cŸ17eIÇ?…7G°ñŠx˜êº…´VwZÙÂA&M¨C¸Ÿöp}²w|M¡Çâ-*çO2elIo0ë©Ê·àJçÍ߯ Xÿfißia°êcå¯û^^ÐÙöÎ)À÷:N•£.…26«¤Ü½ÒÉ>BÜ´¿ëC‘œoíÁÇn;Åî­§ßkvÐYYéŒÒÃo›ÚYˆÀf8*öïšÐ𾑤G«-ÙBnµ{»¸öp’·9Ÿ_ç\óøKÄqxJÇM¶6ÇT°Ô…ôJÌÞS옸ã<ƒéÖ¶´Í'[_M­_n4{kwŽ&c¶eb[òóÁàûUK¯ ê³…xGöÊD¶¹-€VP§å‚w¥[½Ð|W§ë×ZLJd³1_YAo=½Øp¡ÎÆR½°pF*¾ŸàÍy4ß[jZ„S]륙fHTfo#'€zrxäðÏ‹ä°Ð®¥»²‹Ä>èâtW0M(RŽ æÆr:‚®éZ‰.5TÖ¼Iqj÷ÖòAg¢·—“˜—䱯;>µÂ%LJ4?I¸•%–Ùd ñ‚îrÜéšgŒt¿è·:e­ÊÛM#Äë+®à60<ŒŽ¸õª1Y|UFeÖ4“á¼-¤€ãÛ÷Õž{?Y´–ü¤÷zÛêÖw§6Òdà“œcž™Ÿgá]êv—‰5hn—N.ö¶ö°˜ÐÈÃß.ä:ªçÂ>-°ŠãMеèí4™å•Õ$ƒtÖÂC–Xœ:ŒdœeIµ¢<#SøZHnä1è^xýïÌóù‰·,äç9äðj忆÷z}£lvv·P<;Öy¸çvxÆ=kÿ„ÄqXÉ¡Ûx–DÐÜI”ЫN‘?T’xì \ŠÒÔÕRëÀ;žò=7]Ô4Ë Ù^[‹KcÍÏ÷ŠFeÝßk Óÿ„GEþÔ¶o…#=¬Q‘´å á² =sÔ÷«_ØVŸÛ¿ÛþdŸiþÏûÎ6lß¿=3œûþY|'¢âp¯q¹"½ÜrŸ—„ …À3×9ïT-ü§­Í”×Úž¡¨Ãc(–ÒÚêPc—î’‚Å{-[Vz%•–©ªêÑ4†ãRâ`ÇåJ•]£pyäÕ9|!¡Moâ i­»!’ìèJ…ù=1ŒŽ¼ÕýKMO·ÓÒæâå`V[—Ý!Ï-ÇNƒÚ±n,o´ßÛjÖм¶z­¯Ø¯v ùRE–ŽCþÉSéÅu5Ìëðî±~u\ÜÙê,‚9.låhÞE›ÄUïø_BðÌSG§BÂIØ=Äò1ifaÝØäŸóÅcGðÏÂPµÃ@ú„+<Ï3¤7“¢ns’v«ZW‚ü;£ßE¨Û‹‰.â¶{d’ây$*ŽÛŽ7³u5£¬èšN¿h,µ(L° c˜ÅJº‚ GçZÍØéW×(ÔµÛØ|¸à¶M?ORA,™Ý$‡ãs`øõÑ:$ˆÑº†FR¬B `ižð~‘´V#µ½7°wo.R»w Ì{qŽžÕ«s¥é—w–7óÀêÀÊm¤$æ?0a±Î9¹¬ƒà/5üº›i0µÌ²ùÒg%ÿ¼S;3ï¶žÞðki3hGLû2YÌí-´99Èç#ð"¶ím­¬­àµ·AF±Fƒ¢ªŒø †ÇLÓ4ÛQeenÛ#yh>\¹%¿2MRºð¯…otØ4‹2ÞM> y0cÇ÷}Ó[øSÂv†ÀÛéV±6žÌÖ¥Pa‚A÷j|àyïÛS›D³{Öq!•£\–Ï}ëz±®¼#àëæ u£YLÂgŸ/½ÎYºu'­iÉig5»ZKolÉ嘙AB¾˜éŠ«¦hZŠ®º^Ÿoh$ûþB*îúà [Í@ÔfK‹Ý:ÚâtVIcV`Î2A5iíí¤òŒ‘#y,=ÀŒ2==)^ y$ŠWZH·yn@ÊnëƒÛ=êJ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÃÖ|8uË»).oæï¯b¡|¹ž6Ê—8ÝŒãŒãŠÜ¢Š(¢Š(¢Š(¢Š)2¼s×¥-QETp\[]D³[Ê’ÄÿuЂ§èEIA OUDÕ4™£%ä ·d‹bH˜“³žqíš·EVóRÓ4øVæòê(`i1#° YŽÏ©5jŠ(¢Š(¢ŠŽH-æ*e‰¯MÀT”QEZÊþÃQæ³&%’d9Ðá‡Ô).u>Îk;{‰–9o%1[©ë#,@üZ¢©Üêºm¥å…„óº¿2‹hð~-w7 ``z‘PéúÝŽ¥{«X@² ´¹ã†rÀK q·“‘ƒíZTT7w imqrà²ÃÈÁz£m¹àòNqPAñ ÁóMknÓÏ÷sÇ ´wJ†Rç®å_~ƒ½Ks㯠Ûß^iŠ÷…£íšÞdw_—vx_»ŽùÆxëW-|QáË͵è®ÔiÈ®^WJ8!”€AŒc5WOñ¦‡}{ƒÅui=Ê–µû\-œ“°žøìp}¨Ô|i£Ø^Ï`–÷—“[7_d…mà äwÇ8>Õ€µiµ­6úõîšæ6Õ¯DãÊßò08¥QÖ¼JtOAÍu4èØŠÎÝ ™&óO!GÚI `UôñÞˆlõ;©m¯!›LD{«9bÄèŽp.pTõÈcZ§‰t­+KƒV“Ì–Þá XËÈf#hQÇ\ÖÁ žrR|@ÒÒ9/WNÔ$ÒcbQH³Á`3¼¯¸B*þ±â½?K}>Ú&Ô/uÞK[{P¥¤E–ËP¼ŽK M+Å–ƒjPÝ[\i×Zlk-Ô7@ˆÀÁ”²•àôcYGâ-¤Ko{u£êú5Ä©zŒŠ‚?œáY—yp§±(*Ž¿©Øø—Å66öºœso"¢0À†1üNÁFOeäõÅu~×­|Edná†X9¤·ž €‘œ2¶ ‘5‡âËGRÕtŸ XÝÉh·‘Ës}<',)ü({\ƒïX¾¾Ú?ÃH>Ão)ºžñ’&ZßÎc<`ž‡Ú·×Zñ¾¿q©¿‡V ™-Qîó\Ë ¬»T3óéO}sÇwºfŠÖzBYj(¾{¼˜¬„|@*[qû¼Ž:š­¥xƒÅw®«á©¯tÛ‹è´Ñwm{n±Im¥ey9xqÅrþº×´¿‡Ö·s >â¨@¶ÐIÄy¹*å²ø''+€¸÷®®}_ÇŠu}K’ÎÚÎÊÞÒV¹–6g_0Ü “ëÆ1Ðæ«Áã=OÒuõÕ!‚ãWÓ5(ì òHîm¾Q “ŒçžOJf¹ñ3Ã0Ø]Ïe{ Íõ´ *`ó³rO›‘Áæ½ ¼ÇT×üa§Û^êZ‡‰4Ý2ò+ã²FùU'b³oß¹Ç÷q×¥kÝxƒÄ:Ôú•£MΡ¥.©wpɼÁÀ ,qÏ LÔIÜqŒ e\øÞêÃNþÛ7Ó.ïQyt¤ò|¶;÷œÇ'µkøƒÆ¶—¤d~#·Ð¬Å„7’ÜÉåù³¹TÌÊŒ/$àžGœž:¿WŒ­-5È5)´›º²Ô IWã£äܧÐr;U­i¾#hñhWñøˆMuª_Ae%¼GäE烂 ÙOw9ô­;)|AáÏéÚEæ³6§g©i÷S´,a¢– *QWå ô ãÖ¹¨fêy¦ü@Ò^ÿ[ðs FòØI¨4·p»~F;—ƒóvÏ¥IemªxÃQÖÄÚ½õž›¥^g[Ei&Çy"P^I œ“Àà{V§ƒ¯µ"ú΋¨]5寑x![—t±ºîMØnbxÓF[ïx,›ëÈ>Ðoã>D¥Byq”ÇBݨªÚvƒ.»âï$ڕ嵌7v'ɵ”ÆdsüÌë†À€ ¥'‰u­×Ú{_ÜI4~)“CŠókIpŸ›v%œ.@àóŠ-u]7VѤðäÞ!œÍ{½ü7Ñ]4RE!Á™W ÊyÈ*=±^›¬cû/RÏO±Ïÿ šóÝêí?áSB³H±Í¥ÞyȬBɶÆàLƒŠ›@Ñ4Ë¿jw÷©q5ÒYy: (ÑÊ®À¤ Üd’ztªzåî­£ xcX›PÔ¢ƒK{ËæÓ#`÷lb‡ÚÀ…[žN*} [ûMCX¶ÓtýZÓA—GšeKõ`°\/üóff 0=3ÔqYVž´›á¼zõÕíìÚÌZ;ßAxÓɾUÜ¡~l0CÞµüW#,¾"ÑdðèÔnôýKŸPµ†ÕÚ0·³p²&7)Ú9'ÖUÜ‘Ag¬Ý]Ç…§Ä5ïp± £,=Á5»ãc÷7¾µŽâï_²š!*™å¸ìr+K«ñŽ æ}¾Ð1qå?r© м@ñL-à´ñÄ“O&Ðë+©ÜW¸RA úVŽ¢—Z‡‡-/<`—òI¨ÛÝ[ÛÚÛFY¼£»q*Ü&3“éëZ¾Õô}!üKgª^Cky±wq0™Â–ŽB 8ÉqúSþÜXÝi”öDy5«ÖN¼AŸAUõ[GÑþ i²êSEO¡¼1É!ÀVó ä“€1ÏsŽõ%³i¾#ñýÅ›¥ÖŸo }‚êXÈ(Ï,›‚8$/'ã5ážÔu Â×BFO Ku5Ã0â]‡m¹üŽGÒ½/Xµ¸½ÒõKvÙ4ö“Ez3)דÛ^iñøq"ºñŽ£ÉoöIt˜ÒÛÎÓ ¡ˆ·°ÉéÎ{ÖÕõÜš$ÞÐ&Õ[CÓ—DP·“¬FwtÀò·°(¥F À9íXQ½Ž«©øËKÒõ ‹Ë‹ý²IvÜݘًŽ)ÛŽµÖÿÂÁð¼Úm¦ž©ªOäÛ¦”$GãppAÚœ’1Åhøm”øÆj1•¹²Û÷Y¦ø¡…mÀx–÷>ÇjäT,K½YÒ°’E"Õµ"ªêA ¹Æì{z×1¿Q°ðÏÃëµÓnç–Òõ^H#ŒB¶r¼`ã¦qÍoɨÇã kB[ [¥³Ó.òêyâxÀ`˜D]áI9<àqŠÎÐõÙü3kªhéwóê‘Þ^InÂå.F,¬$ÆÀ9çs U’ÿKðŸ‚ofÓîÛû?Vón HØÊŠÌã;:÷ôï[V÷×>Öµ«›6ö};Yh/mæ·‰‘öíd‘GÌãcÞ²õ­3[Õ4/ëOž9õi¬ÚÓneòmÙ@,£8'’G8ßjºÌZCé‰%¼Ò­õävãlLý äŽ3Ç­#È?JóMHÖãÒ<–3¤¶š¼ò\)\™9aØκ=vÆúëÅž8í`ML\HËøÀ\ŸsÒ°ô[¯ø_J ¦ƒwwyh&ŽÊê=¿g™‰Fw,6ã?0Á…«ÆÑ}ŽÊÒöÕ‰ÞL»vãŒcŽy‡o¡|DÐmeÐôÓ›NAgup_Í·G$í(†+Ÿ”îâ´eðƬu\›Ï´Ý›¹¦8’S,[rëÛ#®^hW³ø§I×HŽ¥…Õ´ªs¼™ ‘ŽØãžj¯„t_è3ë·’ZÉ¥Ë}=՛ǻÎýën!Áxö&¥ñ†‰¯j«¤Üè“Ûŧ_-Ê}¤1ÆÒ¤¼÷íYòè7ÒuÛÿÜØµ6Iï-¯M©8\Œ¡Î¸9éÖ¶|1 Ë¡[\›«µj×Owy8 #vQ“…QÀ5SÅš¿ª\蚎‰uoo}¦\Lëö”f–TÚÙ Aϧ"­èÚúf«âFK…•u[‹y–0¸òü¸ÂœœçíY'À†[-rÚ[â“^ë«ÙÜF¿5¬œà’ç¦AÅKg øÒîþÎë_Ö¢{{ó"·±GŒLøÀiIrHÝ}k§»·v×ÄàM ÇŸMÃÌXx2[6ðkµðvðõ´ð¶#ÀœËL›åÇ^õZoøŽÔÞÙèZÿØ4‹Ùe•à0†x ¼¿’û†ÐO#*ØíSÏàK{[mx~ñ´Ûí"Ý­­çÚIòË"œd1ç¨ÁäTÚW„ïà“R¾Ö5i5 JöÔÚy¡G ^‰$uä’I5bßÂÉ„ÿák¦dþË{p†B»¶äþYªw »´ËYšÂúËNOiv+¤ñ&1¹ŒƒÐƒÞ–×À–&ËZƒV¼—P»Ö^7»º`¨Ùˆb=Ff2½yõ¨¢ðN£ssa&½â NÛO™'··hÑÈŸu¤*2ÅzŽœö®Æ¸ûZ[[ëšuÆ¡=Γ©LóEhÁGÙY›q(ànÎyñŠKoL÷¶WZÖ½{«C§Ê³YÛÎ#޽ö¨ÜËØšÞÓôKm;PÖ5呤Õ%†YU±µ hmã<ÎI¨´ÏØévúµ´RÊé©^Ý]˼Œ«OÔ.àvëõªÒx?J—Ã)áVš±-¼py€3A8Ær?»Qêþ ´Ô¯ÓU´Ôo4ÍCìâÚI­G›œ€á•ÇcŒûÕýÃö¶– y&žIæ3Ü\\6é&Œncô€­EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÕ÷ú(¢Š(¢Š(¢Š(¢›$qÊŠJ²°È õV.àïé7+ya¥[Ãp»¶:¯)»®Üô϶)u]:êÖÂüèVfîæ>xg\%É8¸â`1’¸®VÏÚž£}¦ðÝ®ai}¡rѼeî$ŒªÆNI'é]ô6V6ó\ÜCqÍrÊóº¨B£±ïÅ$66ëpÛÆ‹q#Ë0UHÍÔ·©=óU4ßxkF–iôÍ2ÚÒi¿Ö<1ª–ú*[½C¿ž;›Ë yçŒa$–5,£9à‘V¡·¶¶ °D‘«»;e›©8îj+?M¼,nma˜´~Y2 9\玙¦ DÓ¬¥‡Iµ‚&HÜÁ#/Ž3´p ëÁ¬ èš„š¦§«´-ªê“¤“yÙF»Qœß룪ÿaÓþÓöϳEö­»|í£~=7c?­>k{k• Ó´‘lôþuçúÍÿÅ-"m"Ô´—:òZ-dù7¿ëùý*ö§¨øÛúr\ê7Ö7R˪XÀ¦(#‘À|ƒ#sއ#õ¹aâ¿ ê—FÆÃUµ¸ºÃn 0^¸õÇ|fa~Æ]i®¯íd†Òè¨ðmÐ 8”“÷»öã™âï k7&ÏOÔàžãiaž\¥sŒq‘NñUõî™ ê×¶Næ I$‰ˆÈ 굦¡y6¥£G&¥ ‹ Ï%–ÏžFù~pÝ€Î1E׎¼evö7¬)¹#V×ô= }BébóÛl+‚ZCþʨ$þ ·ñW†.´Û½Zäk+@ßh|Å·¨eÆà}±Tbøƒà‰®-íãÔ}¢a R„)ä=I·fàUsYñg‡ô)’ÖòYåãóD0Dò8LãqTV {œT‘xŸÃSi-®%üÙª iŽ@R0Aç9ãÎ{U}/Æ>Õ®ÖÆš§Fx£¹†H̪:”Þ«œ{f´5É’ßIÔæ{§´Xìæsp‹¹¢IÜ9#®1YíâM+MÓô†–yïf½¶­Äq“5ÎÛãÔçf¬èž#Ò5ñt¶"Oi Žæ ¤‘1é¹O¯b2­sßµ»ËÒôûc»¼ˆO5”ys9Dlœã Åj_x¯MÒ ­’Ûß_^µ²Jmíâ/2¡ãtüNsÚ“þó]coe Šê,‰¢|µàäf´4MrÛ]Š[‹k{˜ W9'Œ ™HÈd’¿P(]zÄë 4r¥Ø²ˆÌÇMÛNÓž õàU[hrëQܻǵÌÄ|™—îªà’[Ûj¥¯ížîÒÛPÒu 5odò­fºBH碒¬ÅKv kbÇX´¿¾Õ,"GéÏJX 1‘w ¼ÿ…d^xçJ²°Õ5 m®<;T:|ÁB–,Ë(Ï+Î}}«cGÔ®5[f¹›O¸±ýã*Gq´;(èØã>‡Ú²5_­†±ýƒk¥Ý^ê-j—¬[B's3 ¡{’;ñ“ÅGŽ-M޹5Õ„ö×ú,^eÝ”…wí#*QÚU»ýqL·ñÜM¥Ýë—Ú]Íž˜©Y¼›|˳/$`äà ã9Í:ê6÷–6úî‡6™¡0‚Öv‘î«…û¥»uïYÞ×üKqâŸZßÙ"Ötød³¶Ó4BÝS&R¡Š»¿ÍÏQÅsZî§©ßx:k„µ¶¶¾-AKµ£¸Âîõ?ÄsÍtWú<,úf¡ªßZߨ]^Áky Pì6ÞqÀhÛq$×pçÚ¶<1«êzç‰à¼(SOÖÖßhÆ#òÕ†}O5Âx³Qñ¹àýnw½ˆäµ("zGp¢0yà©ç8çÓ\^xÆóU‡ÂÖ:¢G=¥‚Ýê:™…K1‘ˆDHÉÚ $œñMþÝñ.‘'ˆômFê;«»M]RÂñc ] ‡Q•ʶ:u«CÁð—^XÚêúæ§âöÊ "¶† ©@;‹rK7~€v'Œnõ»X¬–£m¥ÙÉ; ëû‚™…Èå,ÇŽsJÁ𗉧ŸÄ·:úëÖ-¥Ø® hÝd WtaUÎzqXV>&×õ’I¼\š_‰EÄ€h×Ñ¢[®ˆòɼä¹<ô¯_O0¢ïÀr£vÓÀ>ßþªò©üIã!á{­. ÂÞ'‹^“IW'ÈqÌcûµ³gâ{ýkQð‡Ù.JZ]_SUÇÎ …U<{>+—³ñ†®Ù6±sã+?R—Í{kHùã'bºùm¼ÿx–úVÕžµuâ Sá~­4>\·Vú·œ¸À "àpHãÚ¶þçû+RÆÝwTþþš‹Æ×i¡¤Å{âÒôÇY Áj[íW2q´.ÕfØ;ã™á [V’÷ÅZnsw ½”oö¢²Èո˪¹RÀ}áXV:²ì¥½ñ¯£x—í çGª«ýžv'ç@¸í?Ưf¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿ×÷ú(¢Š(¢Š(¢Š(¢°¼h»¼1¯Œgþ%×ú ®FûÂ~µð½‚Ú(®­´´¾Šù&*n ïdŸj¥úî±â鮼;±-žŸ§$qÏ*"AçDÈGÍž}±Q]ZjVZ¢šÎ:ÍÖÚxl£dû;·ßá~èbº(­lõ¿\CªÂ³Ga£[Ie >i;ä xÈ .{UYô6ø£Ãö1$v:Žƒ×0 ÄirXª0€HãÆkœ}Fç^µÒµ¬7›ám*Îæu=DÞpƒï²3ù×yàã£yâ=}Nä¾Ô>Ïv1Z€bs]eqž:â÷ÁØx†Ü~`Óþ%Ç ÚE0ÌRjV(ãÕL€Ò£ñ…¥”þ ’Þ‹Éñ´˜Ô ‹"° c±ïY×vÚmݧíuáem.§3‘òÆJ¦ÝÞ œ=;Ó¦iš‡G‰´ý>ö!}µ•ý™d’$A({7p=«§ñš†ðÖº?ãÂsÏN¹—ó†·á©-¿ãàøZäGÇVÚ¤~µ7‡[ÂQü<…õ,é†ÅΡ»?4œù™ï»v}óYñ­ññ]ŠhÒÛ[+xjÛû<_FìÞHo˜/ΧpãvrzU-B°~ Mq©YÜ^cÇÔ6ºª°avf`[>¢¶|_ ¼UcQb´ÓÊîN•6¥hóøšúOë‰c­­•¿Úí®!ÝÑó±†vž9kwÇ~jîöòïFY^=>ÂM?ÅÑ‹û«tÝlò?|W#øˆ-×½mêp_\ë¶Ô|Em-п[«xí­N÷XÆ[æ6Õ#‚OÖø­Cxw]€tÛ®¿î㦋K¹ƒÁ)«6“¬ ÐU1ȾZîƒpOBµ|#ª>³®i×òÙ^Ím «5ý¤aZLî%Á#rãŒÀT¾8 \x@–ÇüTvƒë•j¯¦j~â¯EªÜÅm%ëZ\Z¼ÌKÇ´í$òœñ\Ljf·¾Ó>#k¬¯¦ÜI¦ÛÅ ÆÉ^Øã$ úŠõÅÀPL W!ãpúdú‰£RF—yåÝmêmçù[Žø8"¹¦²½·×å…¤’ç[ƒ^½FKC¿8Ù0qí[*×tÚiÚ6{ ííõí¬‘ˆ1‰#pÍ#c8 |S­µíÃÞ*ñL:ÍäV_k[)í¼æJª„1\õ ñÒ¹íký]½[ɛư: ƒ†hñy潊¼ÿR×ôøöI5)<˜'БLåNÈÈŸ™‡u8õ‘¬ÝGâ¼qâ5]ôØüÚëVšMHÜü×S½¢^6éã·'äY÷±îqÒ°|]feñË®i:†«¢›%qYîdŽ`Nó"+/'Œ‘V< iw¦ëšümáù4«;Ø­§µTUò  †*pç$}y=N¿´OU·°Ô4‡XÒ.–îÍd8Y;2Ø0¬›ÏxßS¶—MÓ<+}iªL†3=ÑAo<îÛÔ`sQI kžºÐ5{®5Ÿ²i’iº‚†Ìî¬Ûĉ¸ó†ê7g:UÝ>ß[ñ¾³oðüi¥5¥ÝÃä3.w¾í£ ‘ÎGzϽÓüOaeà û}%ï.4ˆ|«»HÝ¡xB’ ;x=y­Ï 麥–¯âÛ›¨Z8oue·$©¢%Œr9ãŸJåo¼+ã9|)¨ØZÛ¢êmâV¾· ë´§œ99#ß}«Rö/ø¶]+OÔtA¦ØÛ^Áw{3NŽ$0Á# 뱃 Çj/xs[×ÿ³tTÔ¬µk…¼‚o=SÉ“b«,€Œã##ñY‘xCÆà}K¼ŠÖnµi/£D’OÞ«õã°qžëUí|ko©Ûø¦ÏH®/´õµÔtÆC#FÄ£,˜Úp qN@ñ6ª|I¬j°Eo}¤>ch’nòcÁ'{à ³à éü=gu§hºE•ÈQ=µ¼2…9‘8>•ã X¾Ôô-fÆÎßQg򯆡U4 :\q‘ߨªvšGŸÅVZýí½œV’é³iïo‡u¢–q\;1€üš©ªxâ>¯¥\x{RµÒoÒDx—UŽð§8(Gê= × XÚ‹;[@ÅżÄº¶ÁŒšåÁ×éã‡ñ¸Oì×·~w ž^ìcÙïøS<à{Ÿ ]ëóÝÏñÞMåÙªç÷VÁ‚Ý­A‡þ#èv'BÐo4ïìå2%­ÍÀ:Ú6Éhʱ\ðI_qZ’xgRþÒð}мûBh±]¥Ì“’eœËPÃŒg<žE[ðž‡y YÞÛÜË>§yv¦<à,ϸžã½P×|=â3¯[ø@šÏíbÀØMê±O/vàP§!³×±KNðŠâÕõMGPÕ¡•u}?ì÷FhÞPBy1ÀêI9æ ¸ð—õ> [ÕlgÒÕ¡\$Oö™’&gs qÉæ½¥QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÐ÷ú(¢Š(¢Š(¢Š(¢ªjºt¾Ÿ{§Ṉ]Ûɲ00H>µËÛü8ÒáK{6Ôõt˜ lº|’æ"PägÄgœnǵjk^´Õî¢Ô!¼ºÓïã‹ÉûE£…g9ÚÀ‚‘‘ÅC¼?¨h¹£ÔNûˆrg™øù™Ï~=1íV5Ÿ éšÃ[Nf¸´½¶ŒÅÝ«ì”!ê¤ò>„ŸCðî› %ÇÙÚi®.]^âæáËË)sðÒ¢µðŸ‡ìãÖ¡Šòõ—‘®Ô±ù·‚ƒ“ÓÖ‘ü'¡¾‰‡ÔMŒ{ ùr0|«nûÀç“מkr¨jZ6›«=ƒÝ£3XÝÇwŒH ÇQìiÚ®“¦ëVëk™ ÍÀGÍn^AèÔ4­;T6MwógwÜ‘¶DÎgïQ`hŒºª=²ºjºñ\’$;Bô'ŽlV~™à i71]ÛÁ+Ë~ÏçM#ˆ21û°ìÁxã€+nòÒÓP¶¸³ºŒIoqE*Œ¬0G^=HŠ{+”·UšÆÙ­­Û'÷q¶2£ŸaYsøÁ77í©M¥Ä×-(™¹m¬ãøŠgn ÐÖ|? ø‚áÕ,ÒácmÑ“ÈÙa‚?Lµðdž¬´Ùô‹m>(ì.Öh€âMÃqêIõ'5nçKÒï,¿³®m£–Ïj/’ã+„ l ««økÃzñ‰µ;®$ˆa‚G aƒÆ¬Á¤èöÖ?ÙYΟgT6ž£oNj®“á hRI.—¦ÛÚÉ ÚÍ€qéŸOaÅiË3Ç$3 xäRެ2 CTï4] Q´K Û yìã © ˆ¥€F8&Ÿ¥éZLÛN´†Ös² ¹ú*imí® Fh’C‚H÷€v0èFz†ÿJÒuED¿³†åP’¢d Œúdx±ÓŰ³Ñ P¡D;FÀm¸ÇéV+›ñ^•â-v(´»7·‹M¸hÅô®[ÍØ,¨ÆXq’k¢Ž8âD*"…Uª m;L³’Ymm!†INdhÑA©f¤’ÚÖfG–wî3(%~”ý‰ÏÊ99$ðï‡ÄgT½Ks.v)Éf©  œ¥eøkÄÃ^Ö|E½ÔW:}¢Øµ«D:y¨Kd÷9Ø­^öK]CBˆjÛ-ÍÔ‘´-cs„$*·ð‘×5áÿizÖ·¬éFTQlêmHIt —.X0s×UËox&îêÞÒIwÜÈc·vGÌÀãåB“é†9í]! O@2j…¦¹£ßiÛ6×ôÿ*I¼Üº™ÜpFxÁíT/•âŸë—w–·Ab³,.„ÊÈÐ;Õ‘Ǩª^>ðµõŵº½Ä"íü»Y§‚DŠvìÙ@$öçžÕ%ÿŽ<7§êRèî×êQ´ ÛÁ ³ ÎF6÷Žx¨õè:}Õݨ†òëì_ñù-¬ ñÛœgÃŒÉ$V„þ%Ñá·Ònãi.-õK˜­í¤ È c¢ñÉ=+RRrHIÈê+Î.|_y¥èŸN“P¿[»ÈVK‰! $Ñî!‘¹vþ§Zô[i¾Ñ3ùo›¾Ér3†£½r7ßô…P{k-B{S,SjDL1²çqÈ;ˆSÔ… TZŠáÓ<#áË­A®o¯¯¡XáŠ0^{—ç8éÐrI ×Ѽ[mª_>—saw¦êK mîÕA’0pYY”㾊£?`ækP¾Ómd‘'¾SËhg ÁH9Ú§§z·¨xÏK··ÒeÓá›S›WRö0[ºUQ’ĹPrGÒ¦Ð|O³s}§Ïcq§ê6Ak{€¼«ôee,¥O±ü)¾(ñe§…¿³Dö—Msöx’ÜÛñÀÁ#©â Ó|]q>¯‹ªéeÝͼ—¦GGIU1¸e à äÖªŸêWou6‹áëGMµ•â’í$Eó 7”¬rØéÛ'¥gx«Åz¬–Þ¿ðý¼³Ú^êvä²J¨d'#É`ry={ b»Ø$•àŠIãòdhÕ¤Œv9W7Ä U­nu?×z»>nÖTHˆpÏDd¨íÈ'Ò³&×ï×ÇF]ÂMIµ ÚMo '˜Çs–Î:öRk¤Ó<`ó[ëÇUÓÞÎûD]÷Vñ·™¹ nVBÎáÐ`sY¯ãÙZÙêú§‡¾‘s$*YnO”€¬ñ”QÜd$U½SÅÚô~"›ÃZFŒ·w+cØžI¶D˜ƒ¿åcÇÀb}±MµñÑ·±ñÚõ³¼ÐYÌ1>õH3F!~ÿA9¬ícÆÞ<ðî›ý¯ªørÜZÊð¢$W¼F÷¹@?Ï8ï[šŽ½¯\jw?‡¬àš{H£’îâéÙbˆÉÊ  #“ÐZ³á¿\ë ¨ÙßÚ}TÓgXn¡V܇pÊ:6U‡L€j=wĺ.±áÛV·FÓµK‰meœ“º)væ0;|ÜŠ©ªøËû/WÕ-䉙¤èæúö`~u‘É2Ú¡qâOˆº~š˜Àô¬íOÅÚ‘ñÀŽûÒ ­·nùÙâ.wóÓ>˜­? Ýø·Q·û~µ­¼W0Ã-µ¼‹ÆdùŒx$ñÐ zšÎñgˆÑô+{YdÕós\îÛ”†Êžƒ'#ñȨ?¶¯4¯Lš¼vŽÖž7×WPÆDŒÉ!ܪI'gp={Ö}Þ·ñV/Ïâ˜ÿ³?b{´Óš97Ç]À™7Œ°‘°Ó"ªêWž#Ô|Eà›,Û¥ýÿ‡ç’YeV1Â#3èáÔdÖÕ†¡ã4Õu_ ÞßÛKx4´¾²¾Xq´3•!ã߃‚8Ã:×-áíkÄ>øwa¨­ÄC,ÑAhNË$i<’m9aßøqë]o†ïüM>£]nÃ^Ñå‰Ì—I-ä˜ßÙÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÒ÷ú(¢Š(¢Š(¢Š(¢³uûC¤êÂy`2[¿ï!l0ÀÏž½µyŒzmâxWÀëi¨ÜG=î±hÉ$„0·ÜŒ1#Àæºu±Ô<3âOÁ­}wk©‹¸®b¼“xÌi¹Yx9ë\òkúf¹-ý橪kpÉö™£µ‡OŠãÊáNc•˜õ9$sŒq]¿õ=SVÐmgÔ„†íX]䌡”#¯´€FáƒÐsX×Zuî·ã=JÆ}Fò2-6ÞW·‚f@ìÄÊ@ë¤gŠËÕ%Õ´+_hk¨\Ímo¦Ã}c3ÈÆhC’<̆ÆGËÎqÞ¯ê6wº™¦Ú[j—m¨x†þÒÖæöY 4a”–1ƒò¯uö©5}*?ÜhZŽ—yv«.¥kauÓ;¥ÂLHÉ[çF=ø¬Ý.ÊÇÃ׿ukT•®tÝÍyd`A„?Ì N{Hf²‘a¹Ó"¿ƒOñ#ø‰àI—RɆßw~ß,ž0®ŠÞÝüm­\ZkÑÊ–šv™`íc¹‘Z{…ÜÌûH'n6€OOÅž³Ó<1¬B×2]ZÛÜÛËc ³n´ʬ»·dƒÉé[ge¢øŸÃö¶1´vÐèúŽÈƒ±þ%näçŸZ£áß h~+Ñ!×5•yõ=H<æàHá É;Dx#hAÓ‘rx¥>ǪÏ,ŒÒj±M"9VaùŠ‘Ã…õ®“NÑt¿xÍ!Òa[[[ÝGšò¤I3Ž:UÏ\\&§ÙG3A§ªÚXO*2Å);°{Œ~5•â/xw±iº¾…g…ì:¤9€`ܤŽ‘ÿ½¸zäçš“@д(|q⛄ÓíÖhÆkw7FÓ#y…ObÝýkGâWüŠ×ýr‹ÿF-c]êð‡\x¶Î2w^Dºžœ˜ë,äFÊ?í¦ãYâÖo ^jPÚö›¡ßë ‘‹7ç“Z³xSÁéছì°ù‹¥ý¬^ày¦]»üÏ3ïd·=jœ6~#ñ/…¤Ö­’âCáU»‘$©“rýàzòIÁã=¸­X´Ý.?ˆ,ÎÛ $ˈ×åq67ޏâ³|-¡j“ø’XõËû(ƽvžM¹Œ.FÓœ´lÙ?ïU$~Æš«,·öj·rÜÇÅÌž~F퟼rž8íLñ ¦­•¢5Ƈ§ivvz‡ÙÕ$ßp€0àŠ úá›5ÐêóÚøWÅI¬LÛ,õm>Xn=¶Ãr“îW V‡€l'µÐ¢º¹íšœÒê7 e¦9’àU ZI.<[·GÓ ¸Ö-4Å]]ÊËÈÄ€¨e‰ê@q»µs–Ët"ø¦—2ZµÏØái¾Èˆ?’ùN{ZÕñž›kðÍV tŽ8ôû)cqµÉSŸ®zÖž”mßÇ 787k¦Ø}“wQ Ý¿o¶î¾õ„—K_øèXìÚdÓÌ›:oÚÛ½³œçÞ¬x¿?Û> 8àjïÿ¢š³ :dšŸÄË}FS›Emö‚„ïXÚÜî OÐɹmkBд¹.n4Ïxf7³âD)pT#Ù÷•™xÇšõGGr¦¼ßú®—eðÉÚöxáÙ_[ÈŒÃ*åœ?íJ­mocs‚޶ÚN¼<=ÙY£ Ñm]ÊC`<0=ñT5»ÍvÿFñ¶w Œ÷Ök§Éu}§¡ÅÄAòD‹œåÝ8â´|HdÔt»k{¿Û\[ßÜÚ‹HìíU¤f ù`HO^ýt„øßÆ.eKm(nödn?JÁsm¡âü=â”Ò¦MBS}§j(†&—²†*Á_®A9ý+©ð׈,ŸÃú%ús_8‚”…GvbF>þ2¿zèæÿU/ûü«É¡½´Àž¾–EKxuÛ9$ð¨«+‚Iôúת3¥í›=¤Êë<Å*© 8 ŽÕçžñG†tO.©Í½þŸöw6,|Ò‚xUêKç#Žk'Ã÷¶Z=ŸÃnúMºRi×–mp~ä2JFÖcØ6ÏOzé%Ôì5½ÔR…¤þ²òåxÙA&F8䘠ò;ŠÁÖü=¬ë7ímmÝd¸Mk6a'xvÐǃÈÁôÍRøâ½WWðÄÖqøPµf–ÐÞÉtc„ W…lüĶ۞9« ðþ•aâ]cSÖt[ýFÇSŽÚHf²óÃ$kµ‘’6œ¥tô¸mcÕ5´3¤E{2c•ÜÏ$qƒµ¥ Í‚rpAÖ¯øóJ—Vðî –í²òÕVöÕû¬°ëùãrº&…¨x·ÁÞ#½¸ÿI-ÔY,ð¦¡íláÔ–yAŒÈŠ#9çØ¥«øwQÕþæ^#÷­HÕ¥Ô| ©¬'ìvžx'bÃ*ò,xuíéZ£GÔÿá9}gËÙçÃëgænóDű޽+ŸÑl~#ižþÉ´Ó¡†ãK»Ržs¡MFf.£ìÎx$~Tí'ÃZ…׉´Ílxn ;®æ)½Ñ•pˆÀ^¹?•z-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÓ÷ú(¢Š(¢Š(¢Š(¢™4bh¤ˆœFRG¸®NðŠ×Nдûû›-º6±os D2A<6z1Ï«¢Õô[½CWðö£Ê‘é³Ü<ÈÀåÖHöŒ{ƒëÚ²$ðÿt™/¢ðÝýœv7“É8K´bÖ¯'-åí8 ž@lbº=M“HÓ­¬d»šîH”ù—±/#’I9ïÐvW{k®\xöþMö;k¨tkRÉ2nŽeg9 ‚Çb hÿ¨Üi¾![íIfÕõ¨V)nDxŽ%A…TLçhÉþ,œõ­kÃÑk:T:{\<Û´2ÛÜ ¢–/ºÀ>¾Æ³mü3â+ÛÛ ¯êÐÞE§ÍçÛAo–¦@W|³dŽØÀÏjš _ůjÚ‡ÛÕôV%6/9p›2=ëÅgŸkíjº1ñÃCB¨°¬J'òWþY™sœvÎÜâ´5O ÜÉy¥¡êM¥Þ¥²ZHBŽX”åC+w^Ç9ªëàHFÖ4û›çžÿVušêø¨ Ò&6£€«š»eỸî´}CPÔ份Óín-ÞMŠ¢o4ŽH1ŽÕž|©@nmtÏ\Øé/#5œq¡1ïûÂ)Ê‚{`ãµi¯„ô¸§ðì¶ÌðE¡,Ëoãk aÝž}úõ«rèÐK¬Úë&gÁi%°Œck äñœ­I¬èú~½aq§_)h&%NH9 §±‘Xö^‘.ínµMfóTlÖ+#qÑÈE]Ì;N+RÓD¶³Õµ]]%‘¦Ôc¶I±µ<@ÛÆyÏ9&®èÖ~ Ón´»¶‘`¸ ÆpÃkÁ úzUm_Âú>·{¤_^+™´¹¼Øvœx8n:dÚ§:žÚ¼ÚËîk‰l‹!?'–·ORO5†Ÿ´$ no5ÓÃ.œÓ±·…Û×h=·cð­öÑtöÕ`ÖpÂî7³L—c0nž¹WPðƨjö:ÓMs ݢǓ!U•nÚã¸Ïlz¥ÿ.в_I Þ¡Û'yåXndUÞýHñøU›?xZËO¾Óc´ßøÿKiYšIŽ:³±,HíÏžß ü)4&³yuµBóÜHÍ,çå>ãœqš«âË)uÇÓ|+›tð$öòÍ}(ÌI»I%ÈãךíÕU@UP0íXzÏ„<9®ÝC}{ ‚ê$òİÊñ±N»X£.G±¨ ð/ƒ­ZìÛØ–îÈÙ\FŒÁ%ŒõܹÁoöºûÖÖ‰£Þé‡F¸·§˜R$“©Œ ç<`wªÚÇ…¼7¯vÔ¬ÖW·Dà•e¨Ü¤{f¤Ò<7áÝî$Ò¬cµk…‰e1ç烷>ã'ëÞ¬ÝéšmôÖSÝ@²Ke1šÝXÜ‚2?U_Ã^}[ûq¬c:—”b3ó’¤c‘œ8ätª6~ð%…ÜWÖº=¼w¾øˆlmê« ý®Ž°›Á~ {ÙuÑ­òRÅä1‚Ia‚}2{š±{០êVvÚ}î—k=ªªÁ Æ¥b`ãŽ8«n‘£hÖÿdÓ,¡µ·É&8P*’{;Õk/ øSM»{û&ÒÞíóºh¢PÜûZ)kiÓ\G ,Óíódn}¼ Ç©ÇlÕ+ßxoR¸[«í2ÖâáF’ĬÀ}H4š¾‰k¬Ga ¤$V—Ö÷aBƒ“ Ê€ONqœvã½iðx5Y´í1­~ÂÖ°›LcÈ(6c9û¸ÇéSÇP¢E*FŠUFÐéPµŽž× vÖÑ•]¢b£x›±ŸÖ¤0[˜Œ40•Û³n=1Ò›mkge†ÖáˆtHÔ€Å,–֒ɲB$qÙA+ô5#*¸*À=AéH‰j*Ž€)ÔRaI‘ÐÒÑEQESÕtèµk› &šž2¾lRD=аä\Ïü!:µì–‰¯xŠãR°´ž)ã¶1FÞ3•2²Œ°œq“]•â?ÿÂGj¶Rjv–í¹gKfQç£ bTœ}­K{x- †Ú 1¬q¨èª£T´QEÉbŠxäŠUŠQÔô`zƒ\r|1ðÒ¬vÍu¨É¥ÄÁ“N{‡6à mêTň®Ì`€-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š@U€e ƒÐŠZ(¨…µªÎ÷+ ‡E¤n*¼€O\ Ô´QEQEQEV^»¯é^µ[«÷oÄpÅ–’W=rI¬Hþ XE-²jÚV£¥Epê‘Ïwîn˜3`Ÿzë袩kXjcîo¶}“í{v¾^í¿{Î{g5jgh¢’EF‘‘‚/V tîkþIü;útðK¬Ç!PÖå¶g¯Ò·¨¬íCY²Óo4»)–C&¥3à Q•T±ÜsÀÀã­>ÖïQšûP·šÅ¡¶·ò~Ïp\q¹rØQÈÚxç­\…І‡QžE 耳°U$“Ò•$PèÁ”ô ðj8îmewŽ9‘Ý>ò«GÔSo. ±¶žêf 1³±$÷¬oëÚ‡ˆ4µÕomííc›B‘K¼¬ddy‡j€ÞÜýk^ÓPÓoõÔ7Äá°}ðM/Ûôá$Q}ª/2Wt7Œ»/Py#½NJ¨,Ç ’{U =wÃúŒ¦ -JÖâ` )ªÍÇ^&‹½wÃöoÚõh<— '™"ŒF@9=Hæž5¡µ¹öæ ¹;y<ÅÛ+7@§8$ûf¦¸½±µ{xî.#‰î$òáW` è¹ê~•1* ³2IíY>+ð–§tÖ6:µ¤÷@°ò£‘K½p3Î;ã5˜ž;Ñ[Ä÷>iíÕ£…<¹<Á¹ç$†‹o÷”`ž{ôªø Ë£éÓøƒT´ƒQœHeE$*0ª“×h8þ"+­Ô5m#J´7××QÁkÆ$cÁÏLz“ÛÍVÒ|Má­r‰ôÛø§K~fÆCGþòœøŠ‹Jñ„õË¥²Òõî® ·ÚvÇ“„È'ž„ƒíVõmsDТ†mVò;X¦—ÊGáK`œÐp\UM/ÅÞÖnšÆÂùdºù‚&VVeõPÀd}3WôíWLÕ£škÄÑÃq-¼„6ÉÃ@èk*oø2ÚÊÇQ›RHí/šT·‘•Àsw™1Î2zf¡›âƒm£±’âîH¾ß Ël å ÛpnrOAŒ‘È«Ú'Š|?âp–·m> ‘ã’0zŽàúã™ÿ #Á›Éóçû ›Éûo‘'Ù·góvíÆxÎqïZšÇ‰t[[i„ÓÝÝ+4öѳÈê½[ ÐR@¦iÞ-ðÞ§c{¨ÅuåÁ`η‚udkrƒ$:°~UJÏǾ»º´¶x¯-Võ‚YÍu¤WôÌ:žÀàšê(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÕ÷ú(¢Š(¢Š(¢Š(¢©jé}&x–RÇ ËBÂ9%RʧÝA\þb¼óÃ:¯ˆ´_ è¶¿f¹ºÔå[m2-…V,ÒÇpP3À_Oz莥âÍRÒ`Ö.-ï´ýJo²™¢ŒÆðNÀ•ãs­ŒzƒÜÖ߈¯.ôíV½µe[‹k)戸ʆU$dqÇãYö»«Øx1µ»fŒ_ +Y²ÊJnr»¸ÏNOzÍñ/ˆõ(5È4ƒ¬C¡Z½ŠÜGy4a¼ù Á@\„G'½I?‰`p¹ÆO'œþ›%´ºÎ•ðÒÖ[©£óÙ–YVB$*±üÃx9Ë޽ëlè–ñ‡¿± Zê’\[]Ú—fGÚ…•ÀbpÀ޾•wÀÎdð™,äþûQ˜’Ö¿s\dz“©Û|5{ÛQ3NòÚÌ]ÛæÙG^ÇŸëZšíýö‹/Ä[›) r,:¦Ôn+-2À÷CctíYöpizN© ÿjøV} ò+¨­áÔ,YÙ¸Ù+›kŸï}úפkövWúN¡oysÂÖîÆ9*JŒŽ¡æ––tÞø{¤R ^â&ÔB ¿hhã-µÈÆw‘ÎzÖÿˆ4AÖü'£ÚÅi{q©­”«…@êw†íê884Ÿ´M Í×5_²F÷ã^Ô#2‚Ñ€ÝöÎyÇ\ÖÏŸIÔ"ÔþÐÖ÷\]©YYØaž>cÁÏÍqšµ–¡oyáäðþ£G¹e>L€Üa³¹~TUÛŽ¿;f·tMHºñ§Œïn­!šâ6°Ž6u¢´\ã= ïX°èQÞx{ƶzßNñÕÝ‚¨â)" à(9ièú·¼M¥ê1¨km#HŽäó·7c§ÕTÕø“+Çᛡ½’ gµ†åר‰äÿ1Áª¿¬´›o ÄöÖñ%Í­ÕŸö_–£)7˜¡vc×ÛµMl©ÿ þ§ÀÉÐ-Ûè|Ƭ¯iºl_î[Æ~Ñk¨5ÁÀ̤3Œ“ÏaXѶ¹7ü+±ûìi·nòÌ¢5mçp^Ÿk,:áñoŸ«^iQÞG¡Ý¬ÐY‰wÉ Æ –ù@Vé’ nü4¶µ·ð†‰äF©æ[™_ï31$ŸÆ«|Cm:?øEåÔ 4׭̦LmkuÏÏZö8Bœc’z‘>µCÅþf§â-F= „·ÖÞÔ"ºh¹ ÈG–„â'$µuµÏÿº&)íÚÕ´O³¬ A&C<½£ÙãÎjŬ7^†]rmÄðèD³:©†t à°np=ë'U¼×5-ÅÖ’=ÌÚuî—%Ƨa"â5`ͽrAhÔdŒ‘Š»­Éý¥“gqãUÔ~Ý{jÖÐXÛBdvVÜa²q’r0+ÓÓQÓ¤¼—OK˜Úò(IJBoU= qVh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÖ÷ú(¢Š(¢Š(¢Š(¢›"ïGOï)yž“¥xÁt=.’Ðjž¼Ýrº¼·A8àñ9­ÿ ‹5=%ï4‰ô­;L¸ûdŸhd/<ª0Š¡¾PNI'ŸJê5«Ôô­JÁ#ÝZM ±è ©šóÍ^‰ZÇ…Wñh oq¼Ï3Λ$X±þ¯å±üXÇ=k¤×#ñTw»WIƒZѦ¶M³˜Õ •zŸ˜ÊÃò5‰gàmUt[ï&ÚÚÊíõ”Õl¬ Ý%[1óŒçhÀÏ+RÆ×ÅwÚ“I¢Úh¶V²gu1É%Áì©…ùTžIëé]¥yLJôiÆÚ¬ôÍ"âk˜tK‹ÕRÃþ3ôÍkgø·ÃÚŽ­6ioa©Ü}«Ê’_-à™†ä«­Œö#ÐÕy|«\xwU¶šê#­jW謃 ÊYU”ªûg¯j/4߈ºíΉ5ô:}½†¥oq,1ÈîeÛ÷˜«Œt¯'ŠÜÐôCOÔüGwpèaÔ/"–„ä* wœúf­ëúDzö•y¦¼†/=YTe9Vü¹›Çþ!†+]’Â4I]Il\Ét¨s´PHç“튻ãËâY´ya•"× \îÏï $QŽçgŠÂS·ŒcñÚì‹lsoƒ»ÏÛ°7¦6ñëZ:.u¦êýäÒ£¦£x“DªUUá³ß>”xwE¸Ñ†®&™e7ÚµÍêíÚ²c }Æ)ž%ðãk‹gqkxÖ:•Œ†K[¤PÅ7  õVî+O xÏ]0Úø›W¶“L•¦·³‰Ü•9ر g¨£©øwY]Oûc@¿ŠÒâKt·¹†xËÅ2¡ùN) ½J<zú^½æ &Ö5˜9îÄxDÂíP©Ÿº¿ï}jö±á¶Õ|6Þ^Q6öðùûsþ¨©ÎÜŽ¸õ¦ê^Ôî5Ý;[Óõµ0Aök¨Ú Þt[·m#i÷æ§Ñ|>4.ãMûA”M-ËïÛ¾i'ÉéšÆ¸ð ŸKðîžš´ÐI£Éq(glppr=óÓ½^Ó<3©E©Ç«k:³êW6ð¼V«å¬iÿ¼ÁF~cÓ9éTGµZúÒ×_¸ƒE¼–Y^É#MËæ°Y!OÓñïO¹ð!}CÓ¬õY­®´‰|Ø/T±'9Êž9Íh é²\k³]È÷+¬ÛÛAqãB¥r0'9úô¬èü q+[[êšíÝþ—jÈñYȨ9_1”Àzg¾kv-µ«­hLæ[‹H­ŒgT!'#ŒäçÖª]xKG¾> fIbÖã†;ˆÉQàmã ÷ç<Õ O:\Ù˨뺆¥oe*ÍmmpSbºýÒÅUKí’k©¸†;˜f‚Lì–6FÇ\0ÅaËàÝ}ÏÃò™šÚÍbû<Ûñ4mÝpÃaô¦i~°ÓïãÕ.oo5Øbh ’òMÞHo½°-ÜàŸzÓÒ4k;¸íK‘uy=Ü›ÎNùNN=½)uL×ì'ÓuüËy€Ü ‚AR9˜®v†¾¼HþÝy©]\Âèö÷S\¹–§#aßåæº-NÓïu-Bo´j- ¸fbså.ÕǧFx´ï [jš…¥…ÝÓ^Þ›©â¶äyHRG•Káþ‚Ú&ÒOj-nõ ‰.æ„Ë-çåOø ãñÍt×6Ö·°KmsËÈRHÜeYOPEsúw€¼'¥ÞÃ}Ò¢ Œ `ÝG=~•wFð—„ü?,“éZl6ÓH»YÔíô“ì0=©·^ ðmíùÕ.´{YoK+Y,W¡=‰‰­Ã ø~Ýl’>Þ5±’I-B K>wã‚rsŠÃÖü2ÚÏŠ4Ë»Ë8n´˜ô»»y–P¤v\|§×úVö•¢hz-m¥XÁg 6æHP('Ôâ _ øQ/¿´×H³[íÛ¾Ð"MùõÎ3š³©hú.³Á©ØÁw¶åIÑXíjK-?MÓ`Ö6±[@ "8”*äû T6š&ƒa;ÜÙéöÖóºíi"UˆÎq«"ÖÍní`Œ\ºÚP£yQÐצ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢£ž®"– FèåFGÆC •OFÐôoÛM2ÜA HÒ0’Ìz’I$Ÿ©­ (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¤$Ià PAŠ(¢Š(¢Š(¤fEÆæ$žäÒÑUnµ:Ê[H.gXå¼”Ån¬y‘€Îà),õ-;P{¸í'YZÎá­ç ü SïƒV袊(¢Š(¢ “Ð šÈ%Ó&±ÓµžöÖþæ;xžÞ2vï$n`pB)’8«±jzt××:dræòÚ(å–<•dÎÓœcœ†­ÑYÑë²ê·:LHï-­²O<ƒ#Þ~U<çqž>¢³§ñž‰a®Â²Íe{u¼EW ™fHl`Öº*(®[_ñ¢hWz¥«XI0°Ñ?µK«*Pq׌æ¤Öü^šSiövº|÷úÅôbXla 2¯vv<*ƒÆOz¡Ž5KBÊÇÄúéI(†ÒåfYbiDb m'·ìÙÑY‚Œãš dœ A$LYC‚Tí †‘&‚FuŽEfC†‚GÖ£žöÆÕ£K‹ˆ¢i;[éš•¤‰6‡p»Ž'©öªÿÚZ_Ùžóípý• ›zìR§-œpzóDž•sÝ[ÞA-¼`—•J.:䃊æmÞ.á6{7ùû×ËÛë»8ÇãUSÄ~’ôi±ê¶|z[‰SÌ?ðæ¹­oÅž Óî¼C¼v¥4ùôhà.’.Ü+ïñ|ÖÔ:ÝÔ~$¹Ð¯Qeµ[½>Eyˆ>Y²O̧ž1ÁéÅhêú¥Ž‹§Ýj7³$Vöñ–g‘€\ô'ÔñXÞñ¶…®è)­Ëwmŵ肶ÌFv³~ UýÅ>ñHšV¡đ̊pÀzí88÷Æ+^Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÓ÷ú(¢Š(¢Š(¢Š(¢¡»ŠyíæŠ ÚÞWB©*€JÜ‘Ǹ® Q´ñ…¶¿¢i#Åw¢B;§wÛîSäc1ÏÒ¬kº†¡àÑá÷¿×gžÖMRO¶M:G–ŒÄp¸D^ÏzßÒ¼W£ê×fÁâÞìÃç¤W1ö–þém T%ˆ$“þÈ$ö¬›¿éÖòÞ,7×Ù9K™í¢-2ýàFJÿÅ.©ãŸiVºMë®`ÕNÛF¶BÅÎ2:äôuëŠ.<_)aéwÒjW°¼é`ª‚dD8,ù`ª>­Yš—‹ô}OÃÚÌòhØÉ§\A ì1mK¨º‘ƒ’¸>¡ˆ#5³ªxž;øô«+GPh„ï@Š2pÙŠžÃ$ŸJ­ôÖÒµmJKK˜gÒ²/,¤U#uïm!»Ø>µTxô„²½›D½‡G¼’(ã½}œy˜ÚÌ›·>¤~Ø×|m¨\%Íî™ \ÞéÏ"µÒº+Iåýãg–œŒö¬ê÷:ÌM6Î[Í/S¹Š_ÝÏå}£*O”Ý㓞8ÅzÌ0fXàù!-Õ€áwsôÍy=ƳâÏë’êvòm¶Ô•£œÌØ­À%p<×f‚=JçL‡QÐd»¼‚Ÿ”7ƒ“ŒõÆzTö6wÖºþ¹áY5}B{ôˆoá’IIšÞU‚ÉŒá¿ÏZÂÐ~Û¦xGÂ7v××›¯µë¦F”• 沕QÆ»Žõ¯máØfñî¾£¨!:l®ÙØ ÊÎà•xÚ;UT×µ¸¼>“%ÜâÔÛ@Y‹0Êï€û³œì9ÎsÇZô»+agkmj$y|ˆR/2BK¾ÑŒ±<’{×à{xõÍÄw7O!:®³z]ãvW„*€ÊAŒâàÒã´øa¦Mm<ñ]]êvy’IÄn·%U•X•ëÀïšëõ]ך—…ïô«‹¡=Ö­•ášy\¤ªÙÞ‘FFÅb}²ÇÄ޹s­èúÞ£ö}RâÎÑmù0$'h+µÓç'’NJí|6½&•›…½Œr¨aRG¹™Aã,ÝOµsZìšuÅ];McÓ¢µ¶œÄƒäŽyS.tzÔñž‡¡é~³kXmÞÆ]2ky@d5lõÉä÷¯C—NÓ'iZ[X]¥1 ;Ìg)ž9Úy•ÈxÃzx³áûÂ3)½¾Cî¾jëµ5F°½W]ÊmåÈ#¯ÊkÊôä·—DøOðA¦K07 ØØó,D±ùºg½tÞ.[dñ7¾È€jM¨MÊŽ~Ì#>`>Ý?î(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢ŠãµìÂmàÎÇÊÔûõX©/:mÞ=Ò\Û:E¼6ö9Ô³nÎAÎjîŸgk§†Öñ}£Ê{Ëécû`Q/ï#gä/¯°­?Â6Úæ“õõÖ~Ö²ýT‰ÕQ¾namÙ÷Ã.= sº–­¨ÝøcÆ–÷œz­›Y¬ŠÆÌ,ãr¿+àdzó]êÚg…üW¯É®\%¥¾« ”Ö—2œFÂ$Úɸðqž†±õ¨õ‹ˆ>!µùtÉ´Èí­§Á!X³Œò‚p|VïŒØÂ̜ŧàêéé]…ÌM=¼ð«i"t :©#­yÿ‡üc£ø{CFÔc–-cM­ÚÈFÅå`Nݘ!ûÔpéWÚF›ðîÊæ'[ˆõ_2ePH¤Wb¤Œð3Jôšò.â øŸDOý£i¬™e„DÿuîT©^9zÒ»_Ç<–ú†”¯ˆ4æ`ŠNÕÉ8w5ÊêZN¦kºÛk©«‹{é…ݤÖ2\ùm‘ó#,ï‚8Èäcž+©ð%ŒVÖ7—I¦O`/.šE[©dyäEW“y$é“T.ôaâÏ^›èï ±Ò-£‚ÞHÞHŒ’ËË2:$ÁÁÅ6ß@o ø¢Éôä¼›OÕí%·½iILo(ÌìXŽN* #Qñ†´øG¤Ð¯n/­|è ¸TÛʬī³ä`ygڠЭïfӾ˼’G × +¨â5(Ã,{gµ^ñ®kq«iúÍæ‘.«d–¯iq ù±å²®ªw ŒñÖ©ø{ÃVWòëoiáã£XO§Kc ·¾Ó!—菱vÉ5—k¥4Ø´Sà™eÖR!–^l܃1¤Ý÷OÞÆ3ÚºÛ}"úÏÅ:4‘Ú*ØÛxz[S$KˆÕ÷® ’~µoF°Ô-üIâ«É¡e¶»6g‘‡Ù ŽsÁõÅrÓxCU¾ðûG>›÷6ž!¹¾K;‚».b2©<¸Œûf§Ñ´8§Õì'±ðUž‹klÆ[‰î"‡Îfåye±Ï%‰ú é|-§êy×¾×–.u»«ˆytoŒ=k—Ÿ@ñD^¶Htñ.¡eâíkæ(2"Î[†Î2G<šô+9n'¶·–âo4‘+I ˜ØŽW#ƒjó/Ãþ)Ò_P¶OYÝ_Ü]ÜÈ5©åS¸HxfL™Œ :޵.‘á¿GaàË[»(â}U•®•Hh¶¶zu'ëSÍàÝròßÅ+º8.ç×SSÓ%'+º5]¥€äŒµ=åüZ,ôígL·Ót订žñ’q!¸„@`K`ã¥?Å~Ôu¯hš•£¢Ú¦Èu4f#ÌŠ)D`çæ£­:ÇÁ×Öþ5½×¤‘?³|·–Ö ÇpžeU‘ˆÆ êzÓu ˆ+>¥j-4ÝkL»¤·ûsì6êßÀÊ#`ʧ§zÛðŽ„þдý%äY$·G.ÈÝÎň\öà{V'öŒtsX¿Ñ¢Ó§‡V–9ž[¦q,T.>UmËÇ+ŠÏƒÁ^/M#ÄUÅÕ¤Ï{¬E¨Asó ÅZ@郌cŒ3gÚº¿è÷ºÌzR[:'ÙukKÉ7甈ä€yô­kˆ!º‚ky†è¦£qê`×¾ø•o`º¦±g›kWÛíià3³pŸ|f¶ÿá¸MwHÕè´:\ÖL²dÉ!b¸b߇9ïR.ƒr°{»Û« SQÓVúC-Ü6r…Iõll1îT­^ÿ„CÃék¡ÙÃÃo£]%ÕªF߯ ›9ÎrIîOz5ÿ éÞ šÊêK‹›KË#'‘si&É\a—8 ƒî TÓü¡i𥾳oqzoããšY'f7!€ÿ[»9Æ1´ t¨âøyᘭu{÷mc©Ü-Ä–Í3yq°}ÿ»rÝjîµá [ºŽýå¹´¿H¼Ÿ´ÙÊÑÈÉœíb:ŒúƒKƒ¼7y¡ÙÞ‡ûQgc$ÌýYœÅ®jé:¾šÚEìFK""0?» ¯ ƒÁ½h×5ý—¨x¯ûRî–•h`°É½’q™£8ï]#`U†A#Ö¹»?ø&ÇL»ÑâÓ”é÷Rù²C#;ÝŠî$ŒvÁ«'ƒü-á饹Ólö\ɦ‘ÝßhþÎXì1[´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š¯-†Ÿ=͵äÖñ½Í®ñ¬ ´{Æiê2:Ó§´³ºhâ‘ ”Kp G_CÍZÚK4B4ü©ɸ`í=²:Ô_ÙzOÙ¥³û?e•™¤‹`ØÅŽI#É<šK'GÓ7ý‚Ê mà1"©ltΫ•P[ÁæyQ$~c—}  Ìz“Žõ úf“u4wpK<rGE,¿BFjÃG”fPYT‘ÊŸjlÐ[Ü!ŽxÖD=UÀ#ò4,é…"Eˆ cò¥–']“F².AÃFGÖ—de<²£f1·bÒŠL.sŽ}ih¢Š(¢ŠäÁÚØ¶þ(¾Mœ˜YQä@ç%VV€ì2 µÓØÙZéÖ–ÖV«² x’(×=F5bŠ(¢Š(¦ù‘ެ?:uQEQEp95^ký>ÞKX¦¸Ž9.œ¥º³e`3…õ8犱EQõ=5/âÒÚuÒÀ÷ ñ2)Ÿ &­ÑUí,tý>3 •´Vñ-²% ¹=ð§ÜÝZÙA-ÍÔ© )y$r¨É5ÈÅñCáÜÓÄ¿o(®Û#¸–&ϤŒ¡qøâ» Aƒy–Š­>£§ÚÜYÚO:Gqxζñ±æBƒ- æ¬×?'Œ4ˆ¬£$7KÔÆµ£!¼Âû3ƒ—=ý+ ¢©jº®›¢YɨMäÚÆÈ®ø'Ø(ày'Òšu]Ù˜Sîýî{ U[_éwZ†³§²M(Â%w+µüÄÝòóž;ä †üAcâm*ÓVµR‘Ü!o-Ê–NHÃ`‘úÕë{ý:í¤Kk¨¦xþúÆà•úàÓn5-.ÎH¡º¼†eâ4‘Ô3ý<Öo…u»½zÂ{«˜R#¿»¶ „‘ˆœ¨<÷㚊ãÄ‚ÏÄriWM)¤ ÖžFÁ dÙƒœ ZÔ‹XÑ'´mB+ûw²LîdSý[8ýj[›í>ÊÙ¯.®b†Õ@fšF=9«{`ðKyb"Ýœ„.ÃÀ Œƒ‘Ò­[x—Ãw‡NƒU´–ùsºÝ%RàŽ¿(9ââ? é~p¿ÔímÌ ‹(’E Œ¨ žã‘U§ñ—‚­…±›Z²Qr‚HI•pêNzgŒô©¯/ç‡VÓ![ÛHíf‚åä†Lù²ìƒ8ÂÿŸáé&ŸR¶·š5­Ì«ÆûŒ°.“ à“ŽÿZ±âzçE·µ†Æ¸Ôõ …¶³‰ÎqêÌzíQÉÅc^ÚüUÓ-ÛR‹VµÔe‰|Étÿ³mWïØ1lúg5½/‰´‹-.ËTÕ\Ø-Ôq‘ ÀùØgfÜd°ö&™âOk1\Ëax’­©"q‚<âR•dŸ‰³.¤´É†8÷tÞÁp§Øi5ÏÚèúÞ‘¦Í ÊL÷ °ÊÍ¿& ƒ“÷±»®*êxÏÂòêM¤Erò_­É¶x’7%u-…À_rqïÁ®zÿÄ“Xx{KÔã×â×Ö+»Çˆ&aYX:ÛÑ@Æ@É9­ûxvþòÚÅZx'»Bö¿h…ã×a`=ñ׫ONÕ´ýTß-£–6W’YÏ•# ž£‘È®S_ñêÁc¥Þé\H“êËm)ò¾Xßk¯Q†oàëžÂµ­58.<@TÝÝÄÒh‘\›*F¥ÏÎN2±àUOøX¾Ùö¡m~tÁ)Œêû?³×n{íǽ]Õ¼c£éÖšlÜÜ\ÞAç[­¼eÄœãŽýO8jM/Åzf¤úŒRÃqc>œ‚Kˆ®×iT ã’ ñ×5œŸ4ݶ×Sé·öú]Ô‘¤ò¢ˆ›Ì8R@bàÅu®¢îi-íçš8wŽ6eŠQ´r u7^*Õ¥¼½´ÐtWÔ–ÆO*æc*Æ‚Ld¢–ÎHxzÔW~=±¶Ñ!ÖRÆy ¿[)íxÃ&pÀŽ„ŽÃ<äsÍex‹_ñÂÂ='ö;Yu˜“ËK™ÈT|)0äò@Åz-3ÅL‚9Yº­ŽFxÎ>‚¼{B…6ë«¥·ÛW¼:;¹­ßjV6z_Š5-/ιðý½Ëɧ@„¼„"|á’À1û ãéÍ^“ÅÞ3Ób°ÔuÚ 2îkx˜GpLðyÍ€]Lj3È [Zwˆ..|A¬è7VË YÅÅ´³öˆ¤êØÀÆÓÁäÓ¼/¯Oâ(/ï ¬z…ŵ««çGÛ¼ð1“Ÿ^kGUþÑûßöxˆÝùMå ‰ Ÿr2*óÏ ø‹^Ò<#£ ‚êêþqi¥D®ûœ–l™Y³€¸ÉÆx®5ïé–—gâ+k7µÔ¥û/Ò5Í?J×ní¯ Ôm®$ŽX"1˜žÜÙR×5^Æ÷â‰ídÖ´«ëKF’_°ZË s2! _p#qÂ8÷ª·>0ñN§aá9ôHà‚óT¹žÚæ+…,±¼`†èAÂO¸­H.õÛ/hzEõÔWO&‘w,óˆB³ººã'Ùæ±uÙ~!i—:~—eâtºÕ¯Ý¼˜ ¤`,cïHç' ¿NOwÄ~)š rßÃé®Úi$ºº»¸ ¾BÇ ‘«½‰cÎ8©<⩵-WVÐçÕí5²Ãͽí®Ñ½UÂ’¡”úu¥/Õ/¯¼#£Ü€tûíW7*zIå.U±?ʺ­KKÓ5M>çM½…^ÎxLRFGqÛÓ½+’K¨åð÷ƒjO©]ÚI¨Då–Ù”ÛÈ.Y2¤åº“ÅlévÞ#Õ¼S¯¬úåÔzf—{ja¶‹hÞÅÍ·;=»äó\æµy®jž ÕËݳ^Aâó ´ü.ÁŒtZÝÖ´ýsÁ‰c®A¯ßÞ…½¶‡P‚ñÃG4r°RQpNFÜ Úð¥Þ¡s©ø¾+«‡•-õq ÇˆÐÆ¤è+ƒ×RïTð‡Šæ»Ô.Ù¬Ëü>«¬k‹ÅVÖBîæ[<3upc–Fbì’ƒ¸“œ¶8úU-ÃwÞ%Ñ ñ þµ¨G«ê¨^ Ýb¶ßÊ*ÆBª1ÊsÏ5•þ³ã)~™µ ›%Ô,u#|-\§å§MÄu€x"·t»)|=ã+N¼¸67z]¤2¼‹É.Ü©rÄ<×ÛtËD>&:æ¯Ç8iu°^[rÛ¸û¬WË#øJ+Ûƒ*°`À€AëÆ5>KªÉâ½7Yææy!׬]¤H£ÎQ‚£‚Š£øvW]¦Ì.'ñ¼sèÖ’$ofc¾t9|däúšæ,!NøkáÅÓlG™­j6ö·þQXÞá Œ0ÏþÖ6䞆¶.t­V×Qðõ݇…-4)mu#7 uóa~"ª쎃“‘Åiø?Bð÷‰mµíOZ±†òþïV¾·¸7 ¢H˜ªÆ¹èã¦*×Âha¶ðÓÛÂþdêwñÄÿÞE€sïPjšV‰ª|J±]J(ç0øtÉ R€U›Í#8< Ômáý$øÃ[ÐímÒ3UðÖëè"PJd(­Àb¹ÇN•‹k{7ˆ´ÿ x6ànžßR’ U?ºÓ»gùk×袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿ×÷ú(¢Š(¢Š(¢Š(¢™)7%ö§-ýßzòty4ëèš¶‘n?µôéT\»wšsƒ»¹+!®ÇGx$ñž³4|¬ú>"1•Ë~5ÌxˆG<¼¶4ÀÄ…QsøŠ×ñ–áû/+ivÐÆÖbÎ]5âQ¸I½v g-úæ­hzuŒþ5ñmìöè÷QE§FŽÀâù€>ø¬ï izL^ñ—•i ï¾ÕѰ£•L…@: —Mßý¡ðß?ô»=Õ%kø)T?Šp ÅExl-Wñ³¦©øO]¸À±±¾–—=" µ\žÀ¿Zèõ}kLÑ´éõK©”[Åðr>rzõ,xÈXßKªx¯ÃwÚµ·Ùd¸ðôÓYÀç;&wÀ$›f3À"¬j)ž4‘­q¾?\-ñ0Î<°Þü3Úªh–öëðºEX×kè׎ÀÄŸ©¦Ã4kyð¶IX m6ç– ”@Ñwî´Zx§Â'Á"(îà2$Z‹5aæù…6y{>öíÜt¦èö“ØøÂvwd}¢ 4l§WV@qüªíã[ÂY­Ç, r§Ã Ò@€n‘w¶Tr9nƒ‘\¬z¦“¥ÙÝøWÄÍs’Àè—›$rY€ò‡ü´R=ÉÆ??^¯#´º‚_ Emmûû¯ë©w¨ÙÆ3"Ƴ³—éÈëÒ·5ÿxÅÐéú6wõÕÍõ´ådýž8Ø3;ÿwèprzW W“éÆKxÄpDÏ.©]¼ˆ£æhd•ÒAÈ÷Ïn•i¬n­4¿Íq ÛÿCuÁÈyñÏû«øUÝ#ÄZOƒ$Öt½yä¶êwVòÝ–â9ŽARªrGB+>k-E´xo¦·–&Õ †óF’ÒMö8®7ȇ);|Á†<Æ9?…tÖ›©]ø“Ãq[ï³¶MAn¤Ü>O20ŒääúXšBøûº{x~ÓD[øíšT°½¢¡‰+æ©ù\ó€sŽ*kOêºd~ ¶…ÁÓnî'¾›ptªÅˆ’ jÖ¿ÒµI‰áËý;Â#@¸–&º6—P³®vn”±Fp3éYWþñLzgƒ¿²¦³:¦°>ÿ&@cØØ núq[š‹¨iº—ˆ/®¥‰×R¸‚XÖ<åB 9÷éí\íÿ€5{¿kZ,WñC=þºúŒS8PÀ‡pó«ŸðŽøÛXŸO‡Äwö/¦ØÜÇrVÖ7tñòžfã€䜚{øoÅúv³«ßèZ¢Zêì’ÍÔLÍŠ»w&Ö\çÐãëT­þê0øO\ðôš ’ëP¿šò;¢Xo¤ŽqëÅlXøsXmVÃXÕï`¸¸‹IšÆtŠ"¨åÜ6á–l pG9ëÇJË‹ÁÞ3°µ}LñPèL8ÃÁºæÛø÷…ã %I«ƒí¬ï¼1=ŒþM¦‡ksl°ÉJ [#c'ƒŸjžïÃ^x…uÉ.–ty´Ç·ï 6íÙÈôéø×>|â‡Óÿ°%ñCÉ¡14mý ÃýÏ4±úgfk¼Ž8á"ŒaB¨ô¸¥ð&»k Þ›§xž{máå?g0£IÊIeI98ÊœU«ÿ&ýãCÔ¥Ò®ô«?±E"ªº¼+«pyõ¨í¼gÄ\ê×WWZå´¹–@Ÿ.A@Àã^ßáÌñY[è²ø†úm4D{' ™ÿ Û íÆq]~³‹^m}$LtÄÓÄ#XE}ÀãÏn½;Sô­ ÓI¹Õî¡–GmNïíR«‘„m¡p¸Ž;沬ü ¤ÙYh6)spcѵ¾€’¹vbÜ7ËÓæ=1õ«C¶±ø†OÁ{u“Æ«slŒ<™Ê®Õ.1œÓ‘T´¿‡Ú¥_è’\]Ýé·O¹ ò-°KP¥py$äu§iþÓ­oíµÝFÿSšÌ“h/eܰ1Ü óc¹ÍÞÑîﮯ ¾Ô,~Úw^Cg1HîÜÃ’:•+šÔðï‡tŸ Ø;LW[o:I•]‰Ú\ç=‡j§®x'ÃÚýü:­×Ú#Ô ƒÉ‚x%th†IÊàã<ž ðjM+@Ò|+ouj—7w2¯›q4Œd¸¸(Iäö`V?„4‡Ÿ\×üW>Ÿ%‹j ðΡdØ€nvà¹=½ë¶¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÐ÷ú(¢Š(¢Š(¢Š(¦…‹ó’öâ••X` ‘‚zäGí TÚ­íúéeÃg ‘Œä®1¤õ«CXðŽ—«Ý[_ ‹»+¸"òÖr”f9ØØÈ#>Õ𕵞­a¼¢ WË7y•Ë;'C¸’AÏ'“Ikà/ Ú\ZL‚ᢲ—͵¶’ghanÅPœqÛ¨€­»}+Oµ¾¿ÔaŒ­Õð„\6ã†ò†Œà`zQZèzM•­å”‘oy-ij©bw4Ç-ÎsÏ·JHtÒäŽÞip<ŒY‰G'œ€:梳ðÖ…§ê×ÚÕ´,—׫¶vÞÛ[§ðçh'@­+«[KØ%µº…&·™ I€Uê5ÍÚ|9ðÔwih$‰ÃĬÌR69U$ŽÜqZúΡx†¶ÕlÒæ4mé» ¡õV ý¤Ò¼? è–òZéÖi RœÈ9%øÇÌI$ñêMO•¥[éãJŠÚ5°|»Á\zb«êðÞ«ikc§A=­©CN ¬{F°«¶öV6pöÐG\ËçLQ@2>ÜÞ§UìM ìâÓì}œ\‘Á´K»vìc®yÍE§øoÃMÄ·Zv—kkq(!ä†5Vlú-߇¼7}y¡w¦[Oy&’5.÷"§}'G’ÒK²¬åfi (»±É%qŽO=:ÔXiÖ¦3okF8DQ@Ûè£îN• èÚÝý½tûay’|ñïÏûØÏëVÌ0c™UJ«ànõú_.=æM£y]¥±Î=3PG§ipÎ÷QZB—÷åTPíõ8ÍY¨ã·¶…ä’(‘SºFPcïëDp[ÂXÅ!s–*É÷©)€1KFëEQE{á©5-fÓR¼Ôf’ÎÍÖk{ ª#Y@Àrq¸ã¨ðk^[)îm¯%Œ5ŰBÄŸ“xÃ`tÉßÌÕŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ªZjšeô÷Ö¶· $ö2¬W(:ÆÌ2ü*ÝT‹SÓf¾¹Óc˜5å´qË4X9U“;O§8=êyç·µŠIî%H¡K<Ž@U¹'ŒSÕ‘Õ]2°HèAô¥¢Š+?MÖ´íV}JÞ՘ɧ]Y÷ aöƒÇ¨æ´(¢©Üjºm¥íŽŸ<Ûn¯¼ß³ÇƒóùC-ȤUÊ(ª6š¾Ÿ}y¨Ø@Ìn4÷‰.R2.á‚xùÐ#]ZÃ9QÑK¨8æ–÷UÒ4Ý‚úö mü¯œê¹údŠ–[Ë(9f¸Ž8åeDf`è=IíT£ñ†eûO—ªZ7Ù†éñ*~ìz·<~5%–¹ ê6²ßYj÷‘n2MŠQ6Œœp1ïU¿á,ð‡Úà°þزû\áLPù©¹÷tÀÏ~Þ´È5[ù~Qƒ‚¾xÆ3ž1UtŸø_Z»66wMö½†EŠXÝÔwPê¹LÔÞ'ÖF£ßj fH¢o+(Ì7ãåÜœg©ãëT,¼k¡¶ƒi­^ÊЬ¢8ʘ¤ ò•¬hFæöÚ>µwGñF‰­Í5­³KÔ+¹à¸ã“nq¸+…${ŒÓ|au{cáÝ^êÎv‚âVxåP R;Œ‚?1Tü «_êZd–ú”¾f¥apö×,q–þ%nûÊGaX~×õ½[Æ–í›IšÒéìàãhXeX÷3ɹëZ’|FðòyÓÇm6 ²I¨E5ºí8'päÜ…#Þ®k^5д9´è&K‹‰5^[Ak7n8îsÇoR+|oªIâ½;LþÊÔb´¸Òį ›‘Ù—Nãò¨$7<ƺ¯¼ñèšÃÁ#E2é÷&9òŒàpkÏtk_ ^è:uî¥ã Û{Ö²W‘¿´(Ç©Ú[ùƒZúŒ.tÏiú¶½çÜÜMrmmv'ï¯ 9X°¼ Î9ìZÖÓ|_%Ƨm¤jš=Þ—ww’[yÆ6Iv ° Œß0qõ«Z7Š,5{ BüÅ%¨Óî. ¹Žln¡ëœ1ŽzÕ¿êã^Ò¬õAnöët†DŽB7ÉÁ8ÈäsøÒëºÍŸ‡ôÛJé]ã„( Ë;1ªRMaÛx»ZŠïN¶×\cž[ʶ­¼Kâ;KOÓ¼I¦Anº‹´v×6²—Ì;2©އ}«¢ÔõM"ÆóQ»b¶ö°<Ò2v¨ÉǽpÚ—Œþ!iš+øŽmÔéæ5mÄçω[î´Ÿ.ÜxG¾*þ£âŸ¾¹‡¢i¶Ò¼ÚTWÞ}ÄŒ-ÌAÜ$Ž˜Ç5kQÕ|y6§ua£ØZÁmi M%íÿ™åÌî3¶ ¸á{’ Ê›ÇÚ¼~Õu¡cjZf¡öaG-޲*’‡ƒ‚ïVnµÿh×ZDúÅ®žtíBú+'ŠØÈf¦?!,ØV£aGµTÐÅCÇž(ó^ËìålŒÁCï1ì/nN{#•Óx¯_iËqâöææ;8 À’iNè:ŸaY°]üDÓ5 %Õ’ÎÿNº.³Kg#Y2 Üí¹;gƒíÚ©iú¯ÄOÙwG–ÂÖÆC!²³¹‰ÙæE$#‡]¥±‘…lZ­qãoj‰àïìmâ—\ûb\-Èf<æäÎÓŸLñүǩxÃIÖ­ô=RòÞí5kk¦Óï-Ñ •tÜA9 ö5M#kU•5§çàãöl'¶Ücµnx–Ç]¾¼ÒoµMçSÒLQ=•´»^ÞàòÌP2îã†8ç\»™tqá=J:êøÇo­Ø·Ù/,¶[¥LF3ÎÞã%‡½o[iZo‹ûç5™6”çÃ)¦ß-³YŸÁVöóy‹o¸2Ø*IãWE®x{ÇÅ~û6Ü!Šøm¡HAPF0@'#ÞªÞÚ[Zêÿ#‚Ž9ü=Žˆ Ádã½>ßIðœ ÑZ uµþÇóÙÀë¶gv½»ñÏZ)u•’þpÎu/øAíÜãï@n}sšÔ†ÏÃð®ÕLP¾œt_5‹cöd±?ÞÝß®jȼÓ-| â{¼‹‹xmìõ'n¾U–ÿu°O½fêQ]OáOø‰6“¬_E&çÎ>Ǫ€Øçnܓޯ®ø’ßÄW:\Z¥ö‰k¼´6RÁ¬âPÀ§”3ß§½ªÎž¾ >/ñjÚOeÉ6lÂ;Ha òíÃ/Ëœþ9¬¿²éZ_‰›R×bH§ÖíÿÒ,¡uŠÚéHüÛãqÎ3ÜV¢]øNñ‡­5ïìÍPÜ=ÊYÝB…. ù fÚK ÁÚGô®§Å›¿á×±×û2ï÷Á®:ÞòÊχw—RÇöÒä·II"¸h—žÄŒ“[Œö÷þ4ðâX2Ë-•½ì—dN *¶=[¥hxìá]{=>Ã)çé\oˆ/î|+2ê6hIñ&‹ ¤a{^ üU¿ñÚ°úAÓu»mÅñ"x"êÞ }ànÏ©<Ôú/‹ßQñψoì¢:LÚ6—ö¿k–‰ž|ŒÐ)~3ÔñÇJ¡¤?¼-¦/‡aÐ[PkQ$6WË4kÇ“°È†GPºqYÚ.·á[‡bÇy¨Z¶¦ò+¾Õ7H`ã9;r=3]-§ŠµÿéÚί¦®™e¥[Ì- iUä–Y†ŽÞ¨àsšÂºÐn.>!>7Ji-üCsþ£VAÿy°Þø®¶ #SÆ7ÚÁUhð[+nùŒ‰!'LÄÕ|'%ÈñáÔ±ÕžÆ[[’Ã÷m ça€ïÍ`øú_ˆ×>j«¦ÛÃö›5w¶•Ýï\È»Uªíüßywvš.¡‹u=iü¿±Ýiv¶Èù÷ÆÌNF:sëT.|+ª]IãÀ^%^·Š;S’J•ƒaÞ1Ç>™â¶<-ˆ Ò,íõ¸m⼂5„‹w,Œ¨$/'ÓŸ­`Ï ø¿Lñ&­¬èÐé×QêËn®ÙÖKcíશå=qòóYGÀþ6—Gñv“uye+ë3¥äW#pĬTº”ÁF>^Iõ®·Å:Ácm:E4W–“ïq‘ˆœ1üN8¬Û¿ø·KÕµ-OÃ7F=U£’îÚô>Ô•nô)Ï ƒéÖ¬x3ÃZ¿‡Nµ&¥|—³êZ¼2"ÁeÉàœž1X¾<‹R¸ñ_!ÓnÖÒô¶¨ðÈé¹r±©*Ë‘ÃkVÇÃíö¦Ú¿‰¯ šhí&´´·´VXáYq½²Ä±v°+*øÝ4ƒáíÛh´E·{u–+ô–²¶[`ã‚Bäûu«ø3Å/gáFƒX·‹UÐ ¢Í䓱²lÁ]ùÎ1ü_•_¼ðLj­µÝKú´Vm¨lkÈ.!ó#icÌL:ÄuäƒéQ;éX\j³Ü^6©¥sw(É’D`HUÎp0é[î†ÚÓèî.<ŸìíN+ﻟ3`#oQŒç¯?J©oá½JÏÄ×Úå¾§¶Êý"ûU‘ˆïmR9¾1ø×GEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÓ÷ú(¢Š(¢Š(¢Š(¢ŠâåðV¥ÿÕ¦‹o©*^Ùß‹È.š?”2Ê\esÏzÕ»ÍÅÿh‡RÓu¸¢¾k8­îãš&kyY?P:•<žŒxÆzUÿèRèÉ{5Õ×Úµ û´]L*³ ¨'êO½A­xjêóQ¶Ö´«óa©Å¶w(&ˆœíu$t<‚5_Ið{Ú_jº†¥©I¨ËªZ¥½ÂHŠ©‘òÐcŒsõæ©ÿ¬5´zD¾"¸} 6¯Ù¶(•¢^‘™FÞÝ2GïZ:¯…®n/áÕ4R]2ñ-E£íEx䌀ÈÜe{A¨ÀðO§^Ú^jÏywouuxU;BÀ¨ Р ƒõ¬Éá›m~ñ›Z¾ðþ¡$0ùóFª"½P8Áuu,½2nÜÔ^ðͦ©¢øŽ事NÕoÕí¦—>t‰_Þã?;y…všæ‡k®ÚCi<Euop1œÄÁ€äCY×¾jW:•Ž­{§5àOµÇnSlÅù•ˆ8ã*EGcàM"ÂÓ[Ó£¹º}?VSæA#îòÙ— ÊÄnÜÝNXóRØ6¦ØÏ}{,úk—µ½2bá20FàÁAÈ«:?…´Í"êêüË=åýÒ幺mϰtAÀ}€˜ß|<ÐÜY›«ÿìÉ·bÀNÂÉçäF n ÕÓØYÛéÖv¶0gɵ‚8#Ürv ÀÉõ¬}OÂN¥w%òOwes:ª\=œÍž«Ð83€qÞ¦ÿ„Së¦ÙiÛ˜ì¬î!¸…ˆ!ãmÀ“œœž¹'=êåΓ§Ýßéú”ÈÆêÀL-Ø1|цÈΠâ¨k%£C¯_Û@ϨÞérZœó…VÚ'Éö¬Máÿ†[MÒ&¾°•'¶ÒÏhòÉ䉶‚Ţݳvzü½k­]3NKù55„ É-ÖݤÉåä tëíX©àGsö”°yžo“½üþ¾^vgþLñ Ö¯¬Æ‹§éor5#’ä²í†á–`Nâ@äaMoZiöv–iÈ­¡·[pŒ2 Œ¨ëYz‚¼¥]­õ–™W)»ËnO—ž»$/ü ³«xoÚãG&¥còF»RCàg8 0qíœUˆ´}ì¸ì ]?aO³„^ÓÛn1Ut¿ x_Eî´í6 {†O,È«ómþè'œ{+Y•YC+„ˇÃ>·±›L‹Kµ[¤2Iv3äc©ô½DÑ!û>—c¤$ä¤(40\E$3ƲE"•tp °=Aµ2K;)D+$ºÀÊñPDezô#¶)ÆÞØÌ·&$3ªĘ‚“’3×Y´}îÅûX[›Àr'1¯˜ûØÏëVš(ZD•£S"ˆ\õÁ÷¦MierÑ<ðG+ÂÛâgPJQž‡éSpx5ÚÙ®6ÃÇL(© «¬`ƒMBT"…S•à}+ž·ðþ¯7ˆ?¶µkè§ŽÕgN·Š2¢%”Œ³’Í—Çàcµl®›fº„šžÝ=²Ûdž'{ž¾¸•nŒ (¢Š(¨ní¡½¶žÖmÞ\ñ•¬ÞÚØj·×1=ø Šùh¨xÞù€Iãµ7FñÚkún‘¾u«=F+ºTQ,2F7¹«9õp:ð>•‡®éPÏ㯻]]©žÒí¶Ç+*¯”… oâꯇ<6šÕωå¹Ôo¢‚?ß$P[LѪ¶A,JI9èItªÑø‹Xÿ„_@¶žîåî/5)¬§¹…KNÑBìÜs½€œqÉ«z¥kzLz$:Ñ´¸‘⿊óÎx‘Ĥ-‚çd”¾±y%ñ»{túv³©‹[v™ü¸•3‘·89ÏÈ` Á²¸WÓ¥w§øŠmjî6‘/­UÂBÙʈ@p»O»ÈëÖ´çÓ[[Ôü>»m4w÷v×bò2î§tQñ°'“Œ{ÖžŸ£iÞ3½ñæ¹æ\EkªMakl]•!X@€¤|ÌNI=±Z~ –å[ÒäžKˆt½RK[yd%›ËÚ+1ä•Î9í]MQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÖ÷ú(¢Š(¢Š(¢Š(¢Šáað·ˆbÓ´K_Ü-`WøN)Ðø:ïRŸ]»×ºÉ©Ù¥’¥˜ ")'qfêùÇn1Gö7Ä›ÁŸ}«ÚCa§™uh®·3¢t'jîþ" öëWµ-7Ʊj’j¡nÖ÷F’Ú^‡(ŒŸÅSÁ#¨Ç>µgà ڵعg¼¾¼’öéã]©æ8¼àRMAâ X¿Õ4M[K½ŠÞ}<Î’,ÈYdŽP9ãš·áýôOímÓ‰~ߪÜß .6 qòõ9Æ:ñô¬‹o4:XÔ/-µ o­nã@ NÎX|¤F'Ÿj±aáß>¥m©kºÀ»6jâÞÞÞ3A˜`³ÎXã“éZ„º$z”fo?íº•ÕéÊãoœ~ï~•†<ªÛÚϤéþ žÓE•›mºÆ¦H‘É,‰!äž8$UÍ_Âé4/ì›÷ÓfѲ¶Òò2…e!p:œÒ^xSQKë»ý Y“LkæW»ŒD’G#à60ÄuÁç*Ì^[=]&ÃQ¹¶ži Òß)g‘˜bH#-Ó§¥oÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ »¼²°…îo'ލi$`dàdž95=QEU³Ôtý@Ý Y–SkpÖÓcø$P Sî2*ÕKSÕtÝç¾—ÊŽIãN ËÈp£€jíQEQEVf›­Á©_jö ˆúlÑÄìØÃï]Ù\ÇnqZtQE!eÉ'–šòG–‘‚¨îÇ•YXR ‘GzdWÓ—JŽPá¶p}ê+CM´]÷7P›ön‘À½9=h“QÓ!šináIçÿU:†÷Fr Yï´ûRââæ(ŠGæ°v œn9==ë3W×íàÐ5MgJš ϲÚM4e\4lȹÁ*O㊳m¬ZdYjº„ÑZÇ5¬3HÒ0TS"ƒŒœSãÖ´9ìäÔ!¿·’Î0Kβ)EÇ«g³|+âí+ÅJjqÉ LªÍq•XÀ713ÈsLñ/…õ©¥·Òõ[K¹¢¼pȬÊréVu]JÏG°ºÔ.åH ·Œ»<…™>çŠâ‡Ä?·èz«c-šM>¯ei¨Ä_x·YX†ü¸ltÈü tÚg‹ü#¬Ý½ŽªAqt«¿ËVå”w_QôÍG¦k :íÖ©ªÙIoe¨Ü'™ʶѨII?}{ýiÚ/Œü!âÞ×KÔcšáS–C+õ‚’>™­©eŠÞY\$q©gf8 RO ®rËâµ ›{K}IL—-²duI[Ñ]”)?CVµŸøgA¹ŠÎúå¾Õ$fQ 1¼ŽV!}ÎCŽü6Ÿ¨ê±j*ö:{Æ—3*¹_íÏQÓ8ïO·ñŸ…nloõHï1§ØœKrèÂ6ÿp7z|¹æ£Òüoá­Zö-:6¸·»™H#º‚HŒÊ½JoUðçÚ—Sñ¦…¦Þɧ„º¼º…CÜGg Éä)îåAéœûQ{ã ØéZóÝïÓ.çŽæIŸ?xuÁÎFG¥g·Ä¿G7Ù®-5(.ÝÛ[ËlâK N?t;þ8ÀëZº'ŠôljcžÒ}<¯Úà¼MaH9#œ‚k->$hGpöZŒZd’MFH·98 »9 { U­WÇV™« ,ïo53j—1ÃmmèÄŽ¤€1ŽKõJïÇQÜøÄ7º}ìzŽ™‘Ím$j%·r™Ve-‚£¯S‘ØÖ¯ƒ5‹ísAÓ¯o-ç†w¶‡{Nª Ä %Ô)#kÇO ¨µ&ŸªG¢Øé·Zž¤m¾Ó$VûŠ2p ³²“ÐrjñΞtmkU–ÆêtmÂòÎP¢T`¡°0ÅNAÈ!±T›â#C ž§s¡^[èwRÅßHPó~ë4yÜžçŸjÐÕõÍÙê~*ÑôMS¢ûMŠMI2²Åµ›$޹ñŠì5bþm@ÒôÉÕb–)o¯w@£ zncÚ­x¯X¹Ðô‹‹»UG»fŽe|í2Hp3ŽÃ­qþ,Ò¼W§iÖSÝë¯ j6ŸjŽX£P‡xÁŒ Ri UÜ£ñw^Òué˯ÙkW÷rÂ×qÝÌ^;¤f†Óž~] cÞ½ ¹oˆòÞÁá-bk9¤†xÒ&I"b¬¸‘zE`x‹@ºð®‘ÿ %–­.«ba–á§Ú; XVŒ€ñµWæ·u ÿÂÏÔ픉à–ÇÊ=pÏ€pxàœÖMà{[(îô+ÄÃĘå[©’B.NrË(.T« ñ·ŽÕ½â…ÐuG¦º†¨ÑXDË£Ú+휟ÞHU•rz žVðü%ŸDñ®‘¦µÅ•Ì7{,!»—sÛ«¢Ã>8é†8&©iqxwIÕ´#q¤êžÔÄp™ -ï†<§pÎãÐ{Ó x‚÷[¾Õ|+¨ëÿhÝZÅ$rF"‚8ŽÕD 2xÉ;G'­wêh‚ßV†x¤·ºž(>ÒêÒ˜Aù7•fÇÞ'ŠÍ›JÓüWâý^ß[…nl´{[Eµ´—˜™¦šFN„öÍdêúN•£Ç†´­I×OÔ¼Am ݪH?Ðã•K×r¬˜éõÇZÐñ øfãÃzŽ…gßöÅ¥™à(š)Ž\óÐóš¯áï xgUÖ¼ow¨ØCu/ö³Â¾p Á%AÎ Î 8°­<9 ¯»Ôe³GÔ¤ò­Ës*4NBls’€Á½w¥húߎ´&Õ!K¾óÖ9@*î$î'§ò¬ßXXhÚ·Šì´¤Öwž »º»‚ T•WÀà28Ñzúî§à‹8t¸5(ãðêÝÃou&ȼÌ(-÷QÐmã9­-ÃROL÷–:^ö½!¾Ùcmq½§Ã²4~Z9ç­s$Ñ|9ðÌv¶È·Úôp^,‡bK¸| v–À<;WCªXø™µ É}i¡éRAªÀ-ä‚w2Hœï‰ÉLî^ÙÅz5ê,¶·(@!¢qƒÓ¥y,–Ö·_<o4hÐϬé±Ê˜Èpe ƒ]_Œ!··Ö<,1¬o²aB  #DÙQìkššUþ“ã«Ký@éñÉãÜíÜ©.c)¸c-×8âµþÑâM?Ä~‹ÄözmóÍ-Äö›ÖXX¡'tg<0ààWKã{û 3ÃZÍÕõ¡¼¶[b’[‚G˜íÁ# ç“ØWŸxżEk¡èÑjšž•oßéÂÖÂÎ6çc¯ #98QÎDcëÍtþ¼Ó¬¼WãXoæŽ+é'¶¸C!½°ŒÚN>U9Î:â/nt«Ï |U¸ÓØ5”º´n…1µ¹MÄc³Ÿ¥uÿ`¸‹FðóÚÊ–––z̓Ï+&èàr™rUl{U-Z)ouß [^x¥/. ·¶Öö–ÊXª’ίò¡œçÐâ©hÏ«X_xª [hÓ®µwpðÏ Eš90R@ÎÀWÇÅTX4ÕðÞ‰*ÝËyk¨xæÚáeš!»œ”@OÈH$tÏ¥vzèˆøïÁ{±»ìš±_\íJÃÕ­nµâE‘ÍÔþ°TPycµøüzV-Î¥¥]øj¥ñµå×Ú­ÒÓû.Ö_=˜€¦!—¸îF=k«Ñ Ž×Ç·VÄ»I…,#B ád`rGsßê©S.³ñbÁg}2Ëå’M³Šè>êúN¯á!¬.Rqmgom6ßà‘eO¸®{ÄšìqøžëLÖ5Ùt-=,â{S …{ÖlîÄ¥[îž®k˜¶ºÓ±þ'ÙA-ëÉqn/ ¡¼ù¢ò‚ùŸ0ôã¦8Ø|@Vo‡RˆÑ¿ãßMùTr‘;{RG­Øø7Äž"þÜó µÕ¥·º³ºòÙ‘ÊÆ• 1À=ª_‡·¯©j~2¾6sڥƥ Ƴ£#2y`+`€~`3ø×yEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÔ÷ú(¢Š(¢Š(¢Š(¢Šó«)bWÌe‡÷së]o…[ú )Ê2Ô‚?ÜÏxòêO ]é¾,Š2ëoöW*£–IW)øó¬É´{Ÿh^Ôna’fÓ/¾Û©ª)fàï’vïÅ_Ô5Ý+Æ:—‡ìt ¾Ö–º”W÷sƧd)8ˆs1×­C¢x—GðÄþ#Òõ2_fîæ u‰Ù®l1àsÓ¯ZØøsæŸ X™#xÜËtJ¸!‡ï[¨8¢4—þë‡ò_Ëÿ„v5ó6¹óéŸjÅÔÛÄÖú—Ä9´x%ŸcÓ ³ˆó¼…;Šda˜ àsÎ+Ö×C¸°´ºÓ,õ­JîÚêÒæâæè\7ÙÂ0Ýò¿B¯ÔøèêÖGIñfƒk-ÍÔpKhð¢¶÷Žá~BWùäqÞ™¬øBK_ørÞ(%¼þÆž)®a‰ˆ’`Ö ©Ý“23Ò«é6^Õ5½6M'Ã×i £›‰ï/¼ô0û¢5só6}ˆ¹®ÇÅq\Oáín(#if}>áR5f%N¾•‰â[=R_Hm$š÷ìKä ùË)LŒ{S._Rð¯ˆ5MTi—Wú~± ±sh¡ä†XT® ä|¤wÉæ™k¦ëZªx·XžÉí¦ÔìM¥•¬¤yùÀ.OLñÞ¶<qy6ƒaÞŸsc5”1Z2\ ˜Ð Ë‚~SÛ8®w^Òn%ñ%åÖ­áéµÝ:KXVÁU‘£”|ÊÑ»(Ëw`ÖYÐ|XÚWŒôÑáõ¶“Qh.m ÊÆTl+†P2~P3œ™ì“NÔ‡Œ¿´¾,¿°E·‘Ìžnvã9éÏLVF¡¡^iú¯‡àÖ¬µ ˜>X– `ÞpU¸<x¨eðLjî¼1«@,,l¯/nc™l-B¢ù(ÀùO"–aœžœã¥V¿Ò{­A¦Glèk«YÞ>üà¤M’çÒ©\èþ*Óu;ëïÉfÐj;d¸‚ïpÙ*ŒnR½˜uÓŠÔðöŸ¬iöl5kãy}4Ï4Î2#BÝ0z*Ž•W]ÓøÆ+¸`Ñ-DwK²`Ë»rúe²@ö¬JÕ$¼Ká ?[Ò Š%°%£Y ÀÁVó21ž›qÇj½á <6zÃk¶¶í&³yö‰¬ÔŠUUHù Àfº©a‚hÞcW‰Ô£#UìG¥fé^ð¾‡$²éZ]­œ’Œ;Á©aèH*]CBðþ¬ÈúŽmtÈVš5b $µ%¥œ©rA¤N²‚—¡±©Í»ËÏ4±†ä Ê®¿z,¯2Æ¢WP¬à Ì@O^*Ót´¸kÄ´…n›¬Áyÿc?­XÙó&Ѽ»±Î=3@HÃ3›Ž98õ¤Ž(aR±F¨¤’B€M+GYCÓ#¥.sŽzf–Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÕ÷ú(¢Š(¢Š(¢Š(¢Šo—.B ¿Þãï}i@  ;W;®èzÆ»{g ×.‡ ÐÜËVóexÎB“»sƒÓ ‘ŽõkLñÇ…õkج-¦™f]­ÌÐÈ‹8^¦6u±×‚j¾ xR)/¡G¹ž[ %Kµ† Ãåœ1l.1é냌àÓ?ábøH´m—Y¼© ½X_ìèíÐ3ãÐö©b}RÞÓ^ÔPÝ]Í,Dw`Ž=ÈyÓ%ÏLg¥AàÞø“IYïa•ncfW™¢)¿3cg'8žµjúú YÂn/ ͦ]J¶±€a# “ßeæ¨xÄÚŽ¾5Hï-®U ¾¸Ë$A o–>ß^ÇãGŠüG«èúLJí,í.&†âYu‰ùÀ)ù±a÷N;ÕÍGűÚÞ¾›c¦^jW±B“\El÷!úge]ǰÉ5¡¡ëÚv¿o$ö¢Dxfh.!•vÉ ‹ÕXzþuÎx¯Ä^ Ò¼AáÛK©íæỉ„ £°ü£{ }ã÷G¹éT´Ý[´×|Wag¦Ýjs‹èå d È8Üä“Ð(>µ¿Œô·Ñ%Ö¥‚xŒSi-Jƒ/žo–8$œcœsÚ¢µñf©Ý¥¶·¡Í¦Ç{ ŠÚc*:—=öò¤öëõ®¦¸ïˆ[Å¿‡ 1Sÿ .Ðûš½â]ïîtÝ L[Ù­fêY¥ò⌸È@v¹-Žx\9æ°|GâmSRð–¯5­¤–W¶“}šþ36Ù-ˆÁ%AÝœŒ`®Aü*-WSø„5o °ZÅ<ŸkÄñü¹ŽÃäD>èä|­Ï§Zê´}zkûísO¼·[y´ÉÔ 6D‘8Ê¿ c=Ç?Zw…õ«¿iÇQšÔ[Ç%ÄËn^%8 x'ÓŸ­eÏâ/Ïâ CCÒôûg[Ak#\Í#© ÉÊ…'qþséO›Zñn©w}‡mì…½…Á·–{ÖÞÈ ²ç'¯j¡{ã­Q4;{û]>3© ]tË›7~€œ…aëÆÒG~E]}oÅú5Þ›ý¹“ØßÜÇk¾Ô¾è$“îîÝÕIã#oÒ£‡Xñ¦¿q.„,môÛ;™-£{¥vk—†#k(UÏüÇŽ•NÿÇ·°è–W>LZ„Ú§ö]Ó\`³•s¸±Èôåzõ«Ú}ÿŒ@¿MA¬5-<ØK4ö£\õowÎ}Cb¹}Sû{RÒ¾ÝÛMehêÏËmÉHç á”&26ñþõtÿoñnµ©ÞéºmÜvúbEÍÙ‹sM; Š[G|–?γuø›OÐ|J.¸×4I­Ô¼j|©’V]¬œÃ ǧÕõxoI·Öµ+ëyÕ5 w¾†p±[¹ Ê„’IRs“ùV­æ¯©MâÍ+F°”-´vS_j(;”±¨=‰<ñÚ´¼Eq¬ÚéÓi ߬¹óØ,jI嘞Ê9ü+Å7šv©¡ÃŒ!ÖÚóP†ÎòÙcbï,ã3µ£á½7R‹Æþ*vÕ¦‘cû “FcŒ ƒÆÛC ü±‚{“^ƒEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿ×÷ú(¢Š(¢Š(¢Š(¢Šâ¼t¨ômcí†18ÔoŽ«æcïî9ßžÛqøVf…/†cñ‡M”~F•/‡æþÇY1—2mÝÎJàý*ι$øŸSkFÛxZí/~è,s¶?‹©ÕŸ«A lÑcP¦ÓOr0KH¤ŸÄ“šèüN!]kÁƒ…#P˜ öòUð¯”-ünüý»¨î?E~‘/’¿ ²ª¦È6{eþ¦·-XÜ®àKxjݱßýq¦|-»²›Ã–±\#Ïm-ÊÍ`Z<ÊÄFG­M¨H«ãÍ 276‘{Ç|nZ‡À7ö '‰4ñp†ö-{P’H |ꥀo\w¯ìt½GÂw÷Ó-½¤ZŒ¢Iœátd žÙªºn¿ økXñ Ýä6†úéoí.&`â'A€¬x;1Œf®x,5õÿ‰µø”­Ž§yÙ2óÚdó†=:t¨¼o¨iÚ>­àýOQ”CiíÒI1 dˆ€3ÔÕŸ `ë~3`¥ Ïî—¥r—uõö­Én·è>4žîU¶LcC†1ñÀŒzqOµÿ„cZÔt»M3PÖµ¦[Èneó¥Cj"9 å ç êy¯@ñšÜ:=üº0S¨Ç x.àH<Œdd‘ÓžµÆjzì1Ó´ènú-RÊîõZAl±rûËô9ªº¦—£išöµ&½ý«µü‚êÖæÊ[|¸da œ™Žübžº,’x3Å/k¤ÝÛ=ó4Çq,’\L‘ãk0rÌ Ç “Å\Õµ…ž_x†; ÷´‚{µ•Ý̨^2ƒ)ØÏ|t£Ç°êv7ö×Ú`ýî±jú,ƒÑ¤ £}G?…w:u”:m•¥Œ_êí Ž%÷ 1XšE­ä^)ñEÌ:A<:hŠR>Y «nÇÓ½r3ø{Jѵ-`ê~»Ô–ïP’òÖæÌ3$ÁÚà:í*}F &¯a¨é>Ò^-*ÚÇPŸÄv·)eà¹'b»Ac€ôü«vúmsÅwZ=šè÷V6v·±^^Íu´`ÃÈDŽìžãz‡L—Ä~ûv“ý‰s¨Û5Ü÷Ú”ÁY[vÉ70ÚA'œ`Ò&•âÍ+CGu¾¡q{¨Ëy«Ø6Ó½&ê±–!w/x<Õ=Ã× ªÞê:^&…fÚdöÝJÿtùhÌ /©Áö©î´Zx_ 8ÜjMÕ¤ÓÚ‡PH@A÷#>¦¯G‹t-OP¼²Ò>Ûeª¬W- Ì«%´ûpÀîàƒÇ ñéYÚ…|O¨xÅI C[×&·“ìáÆØ’&]¨\ðH\’zg¥w¦Ÿkªé·š}ßú››gŠO`Ãü+øYg{&q­ß·™u{äÛFÿÞ†Õv)ïŸ~µ»ã} ÷ÄzΟhc3!”G1"9|¶ ±Èç Œt5ÎêÚgÄ=R.[m'O²‹K¿¶»[!.Zsè UéÃí[Vº_‰l|[¨êÅo&“ª[ÛùÎ\‰axT€íÁŸQþ=UQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÐ÷ú(¢Š(¢Š(¢Š(¢ŠÁÔ¼àÝbð_ßépÍs•,ç#~Þ›À 6?Ú®êZƒ«ÚÇe¨XÃqm qºŒ&:môǶ(Ó´ I´–ÆÆÊ(m¦Ýæ ë7 ÙÉ9÷&¤m#F{ÒÚΰ#D·*6„tã<Ö–w³B’Inåáf”b1•ô8¤‚ÊÂØN ·Ž1q+K0EÌvêÍêO|Ó?³t¿² ?ìýˆ(O#`òð;mÆ?J”[Û ¾Ð"A7–#ó07m8Ï\TvÚv™e%Ͷ°Ã%Ã@ êÄOÖ§1Ä\HP*€{f˜–¶‘Ë%ÂB‹4€(ÜÀzž´éa‚uÙ4k"uÚÀúÓe¶´œ š!ʆPqôÍHÀ)#aÔ0ÎpE:Š(¢Š(¬7ðë\k‘kwóO°cihBˆáf\àdž¸Éã5¹E¬hÖšÔvqÜ<ˆ-o`¼C—ˆäx=ëFŠ(¢Š+;YÑ4Í~ÐØê ïn\1Tv\ãÔ©Ý*Ý¥¥¥¼–±,VðF±ÅôUQ€MECå”Ò4QOÈ¥ƒ"°$m89Ç­MEQEW–úÆ ›k9fU¹¹c'æpƒ-íÞ¬QERÔum/HKy/çXVâæ;h‹gæ’C…^3Ö®ÑEWµ¿ÓïZåmn#™­§h'AòäP Vô#5b²õNÑÒ;••åº3c‰w3yH]Ž=€üñV´ëèu;+[èRDŽæ•VUÚêg ;µY?ð“xwû.]kícû:'dy¶¶WØF1Ÿ½ÇJÖëÍ™¥ëvÚµÖ­motÛ¡jó66I&ÐÌŸ—89šÓ¢Š+/ÄZÔÒ/µi£2-´{–58218UÕ‰Ÿ¥Þê·†ì_iÆÌC0H‰0™vƒ¸cãŸJÐ „• £Ò³b×l&Õot€g´‚)Û|ã9ÈÇϲ3¼m9Ç#œuëÍZ_†ÞâïFÔ-t»‡DŽþeO/çû¥”9uÕ{â¨.¹¨XxÃÄvpÚÝêMžðÁ~î%T;˜–!W$öäš×µñ®—&“ªê—MhÚT í¼€Ô 6F85Y—d—þm¡b’ÂÙèÀŒu9ªoâ?‰1i£Äm¦X3Ê-bþÔ <çwÜÜ$c³VoüQâ+wNÒ4­$‚ûFŠÜ\oýØ/Œáz‚1Ç'­S±Ö~'ê·º®év×TŠ&¼e‘’a Êp ãïíŽÂ¦_j2øsK½ŽÚÖ5 ÖÓÒ6c䤨̮ìzìIõížôë_øKÖ4Û ^ÿOÔm5)–ÑJ<• »ß*Ý3Æ VÖ/¯§âÝ~ЂþÒ>Çk½IO9‡˜çgh84Ùu?‰vÚ%·ŠšâÎX¾ÍÔúbÄGî˜vÈ[;Àç‘j—û_ÆZ÷ˆîôíP‚ÓJŽÊÆïÎxƒÈ£;TÏïÓuâxnü_âË­N]'UM'N°½’ÊTÚ­‚ÄòvðXðö¬³k­¡éÚÖ¥©i:†Ÿ93N®%³™{¬¬‹Ã ã9ÁÍ6ŒáƳ|º® þ]üàEç~ïä¹+Œc¾r}ù®Öþ=CÂz·„'MJò}*âY4Ûµ¹”¹/>Z'$÷ÝòçÓ¤Ó5V›\ñŸˆgº“û+HˆiñE¸ù{¡]ò¶ÜãvN3ŠÂ¸Ó|KiᯠÈ-®î-nî¦Ôuètö+pæã.à« ÃAÀÛ_iZ›â»­ U¼2[X,«¥jK!’ÒRv‡BX¦HÈù‡¿5¸~<6¶7öZÍÔ:ü)f¿šWeœç.®…‚í<€1ÅQÓü9eâøÑu{‹™í-¯-ã‚ÔLë3D `‡>…`ØøvÎÿÀ7þ!½»¼¸Õ¬­/ZÎé§“u¿Ù‰ Q“Iîk­Ônf×—ÀšTŒïŒ­ç¼vÈ‘îåkžÔµ}GH²ø›=¬“ ޹kn…Í™cRS'àñÓšŽëH›OKK¿ x3SÓõk{ˆ\É, J»†õ˜ùìX0ÏPy­« øNïÇzòÜéVÒ«iðÜêï&$9Áîíah Òµk1ØYŦ×w­È 9{Y˜Ä3×€ÖºjÐx÷YðDQá­­¬Ž»x–AòFº¾ïÊ»/ÜiÖÞÖ%Ô'ž O±È²Éoþ´ù:üÇ8õåúî™%އ¤Oeá4ˆ¬oôÖ‚îY#ûV €r¨¤î?Å—õ®¼é:C|L35¹øugÉEÝæ ñ¿8ûÀqž¾õÞQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÒ÷ú(¢Š(¢Š(¢Š(¢ŠòcÃæ=K]¹ñ†$×m®îíï­˜<Öñ‘Â* ìÿdóVe:}¥¿ü[as5͵£.sssþµ­æ;?yÀå¯j=nu‹?ˆ:ôȯ[&Ô9Ž dz9?•;ľðî‘á BÊÑ"¿±–Âæ;±þ»yu ÌýI9îkCâ&¹ªÇ¤jöI¡_´ ä¶£D##rœÞoÇo¹Z7÷ºŸˆtmjÊòÂçAI- %ÝÛ÷/ÇðHÄ\ã¯Í-´z5߇—ĂխïmáµÕ4×]¦VÊã û[¾w~5nãHÖ-u?^iú^›â+ë³ö„’@.!`1’Á— ØdTííü9®?È ²uÓõ0-nNâ ýÖÉl…aÇ=?*éd¶µ´ñæžÖð¬F}åe(²EÛœzv«¾)’-ÃÚ«éG ÍÎc‰cP»ç¸!Aàu$æ³î¬màºð…-ù†Ð Ù½|»U3þó‘ùUìu¸õ]øbëNÔm®o_Ù݆“(à qžmÊ@횥+Ú\x+F×´{±ïí)lpEŠB³(nêFOÓµYÝk¯Eã¯#‰-Ž›>™f㡎(Ér=‹ŸÒªÚ[…‚$‰BÚM  Äñß<×umq KxÌ‹æ¼ á ˆÇ\W•]ÄÐï$Šh Š/ÈÓÍ2îŽ%ßò³¨+• ŒüÃë[¾¹6­á«}cÄV2Oý§ͬ6¶n$p€–çÍ|)‘ŠÓðüÑÂOã‹S ™¬ÙP‘’ =@¬MÉuÿ†pZZH¯}i Ë G42AÇBqƯøcV´ñ©¨ø¶vÙXéY«Hp¨ÅD“ž›rjÖ±¨i¶¾&ðÖ¯uqö]ÅÄ6×$)%“ îŸ:ð9æ¨ø¯RÒüGkâ+-Ýnï-´´3^ô€¾`ca’Iœ Š—ÄÞ(ð®¯áy-´û¨.§Ô£†ÞÖÖ6Bò°‚½N@Æ)ú}å—†|Q«C­\¬R³°kIæ`O! º† Ñü5âÍn}VG‚ÛW´°–ÎmŒRO-H žz¡§^‹Ý3Ço¡\^A6¦ì¥VI$ˆ…ÉŒä/Ìçñ¨4{.=kD‡Áºž§< ./,çóZÞ9$ȹVæý+¥ñA—ÅZˆ4í2~×cp‰²T*%xоžaÀ=3YZÿ‰bñ†‘/‡´›;Ïí-@G É,«h¹ÚV``tÁ9íZÚU­ä6×$0È-[I°D”©ÚÅKp'דYö:†§àëÍrÆãE¿¼†ïRžúÊk8÷¬‚l¬r6•>¸â°´dÖõmÿKšÅÖ]OÆ3E¨,x+CkÉ–c¹ïšìîmoá8Ón’Ùͪè—1<À|ŠÆE!sê}+7Yðåþ±¯øŽ1Goá¨íc¹?wÍÞØ‡SíU§Ö¼_{¡GáÛÔÖd³rÍ Qj™ZA nF9 öÅiØhWºoŠ4–Šm>ÓÃ`óøÆô‘p9É=*æ§ê6¾ ñmÔð4v÷sÙµ¼„‚$ ŒðxçÉë7>ÓÖçJŠ{Í3[º¼[‚¥n"wlŒœ®H9\ú â¯húKÝkvw6¾ ´Ñ¬lËÉ,×CçË&>Q–NÜI&¤}3QÓüâÔ#òõØ5ë¤È;^\28ùWNµR)~"k²ÐSFŽuc jFd1,, TûÛˆì@ç½t:.…¦x—Xºªi²éÚu½³†ä˜AmíŠÏ†×Æ^ºÕ¢Ò4xµK ûÙoa>zÆÐ¼¿yX0Á\ò¬­gD¾Ò<;lÚ”Èú÷Šl¯®Œ_qd’Qò¦pp ïŒÖΧ¤x‹HÖucEÓ-µHµ4‡íóH#xå‰v†V*ÃiÈãÔSd𷉵RƒV¼†J{´»²[u]›DAs´ä|ÄúñOŽßâV³}¦.¦¶ÚU”ë=Á´™™ïz/Ý\FzrOJ‚ øÎ ÏÚÚÝAk§êÓ=å­ìlÞ|3²¨Á\mÛ‘ýîŸ^!¸ðïŽ|I&ˆ-ô¸N¾·»k«fw–C Î2.ÐÝþf­k].mCñú”Ñ›é¯ï'u'`A–ÇÝPbèš«}á¿jú=ÌPêš~œŠžx&)£•d|sèA®ƒCÓE½žá ä»nä¹éèbÅà Äž¸¼µ6W’Ï.Ÿ"£oC$…ÿyÛ¯¥'‹žK_\Ûx§Pµ]X@Ò@öÿ.ùâlÅå«“¹ÇéVl<tþ ¶ðü÷UÍÙŽ}JB2di$L8#–ås["е]I´ë­#Sm>÷Owhò¥¡•\`¬ˆr=9ãµfÛx.îúãR¾ñ=äW×7ºiÓv[ÅåÇ r@˜’O9'ŽÕTøÄ7ÑZéZψ æƒlÑŸ³ˆBËp±Uf“qÈç ¤×E¤h ¤ê:õúÎdþÕ¹ŠsÜy{.3žsŒöªV~†ÓÂמ7LÑÜÃ{˜(EÁcÀÏlúÔÚO…àÒ¯¡Ôéæk}ÛL„0"EË7ÕÎ3ô®kÂvúG‹$qöUÔÕ#p‰A*NpGzÒO\ÜÏeý·¯]ê–¤Öö“*.ŸtÊÊr¾øç­i]xY¥ñ·ˆ­µ)íY`\Û R—¤ ‘ø~•OOÑôÏC­êRêWM¥Í;Ýv]Ëndl¶ÀŠXäŸæk;ᆅ”ZÞ·³Û&³¨Í=¬R-Ù¦âKcЊìum.Ã[ÓîôËäßkuŽEÐúŽÕË]|2Ñu+Qkªjš¥òƪ-Úiù‡FP‡«­[¯é×z–‘«µåâ_iÐ,lr`Ü"œí—O'¦k¡¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÓ÷ú(¢Š(¢Š(¢Š(¢ŠäŸÁwv÷WóhÚåÖo¨\5Åͺ"2ïo¼ÈX¥ºž¿JÒo èçÃÍ᥶&ØÀrã<îÉ{<ôëP§„4¨ü2ÞJ-Ý¡iAa,r[8ÆIç¥ZÖ<;§ëZ9Ñn^U¶"¹÷LçÓž*Ƴ¤ÚkšuΙtÒ, Ìg 0AàóéS_éö:¥Å…ìB[[ˆš)Pÿšçì¼ ¥ÚÜYÍ6¡¨^Efûííî¦-l>éÆJöÉ5%÷‚4›»éï༿±’äîºK9™sŒe€ïŽã®CámÙ´V·„Ä4e™mXày«†ÝëŸ|óÍ[—HÓ¦Ô­ugBo- –ÛqÀY'޽*šxSÃé!r«ýªCHÄ}£ûÝzçµ_m€ÔT¦5²Û2Õ«Æ:u>•‘©xš­Ü×·Ò%Äà Ú dÎûáAüA­xtÍ2ÞÁtÈm‘,V…G˰Œc ®…¢YigF¶µXôã‘FpVLîÎyÉÏ5$šF“.›ý%²6Ÿöu·òÝòÀÀ•G>—¦¥ÊêÑØ¤º…µ£Á Ù×`'“ëY^Ñï!Ó5Öm#GÔïµ$:¢Ê~ë‡Ïj½¤øWÂÚ²O¦i°[Lë°È‹ómþè'=†µZ:6Šu«(´D~X¹Ø<;›ºâ³®tÖÐ-._º5§Û.fÝ*dF¬H?3§84¾ðä:6…“t±Îò#µçI^N_‚9†GJÕ—NÓfµ[)mb{EUU…z¸Ç¸¥³°Ó´è¼‹h­âÜ[dJd÷ÀÇ4È´­ ‡¼†Êîœa¦XÔ9ú°ýj[›;+ÅTº·ŽeS¸ ¯9©8’ˆœ×)‹ol’4«,ÕÀ?I…OSFÏzÒãU*ªžÀqNâŠ(¢Šå/<-â?·^]i>&¹³‚òO2[y#YB60|²ü¨>ƒ#=«cAÐì¼=`–Ìòï,²ÊròÈç,ÌxäšÓ¢Š(¢Š«©iöºµÞŸs»Èº…á“iÁÚÃÖ¤´µ‚ÆÚÞÒD6ñ$Q‚rv À榢³5/蚽ͅÝý¿-„¾m¾Y¶«ö;AÁ#¶AÅh«£ÈÁ‡LƒN¢Š*¦¥¥éZųÙjV±]Z¹RÑJ ©*r2¡«E1¤Q"¤q¨TU @¥Eõ…Ì×6ð\G$Ö®©:#Ñ3 €Àt$sÍXª—zV‘5­Åå”ÍjÅ­ÞTVh‰êTp~•nŠ*+{›[¸–ki’h˜6N#ÐÔêšl7öÚd“½¹ŠIa‹.±ãqÎ1Æ}jå€0-QEQE–ukˆîµh®,&ŠÎÂÞ9–èà¬ùRX(ë•Ç5cJÔ­u‹ =J×p‚îš=ã µ†FE\àRdc9ã®jŽ­w¨ÚYÍ.›h··hcÛnd ¸Ç `dôçx2’T¸c#Ò¨jך¤1¶ŸoÌÆâtymF8-“܃½UÓu»‹ís_Ò^H´Ñfc6Lžr9ãSZ+¨érÖKw ºQ“uÞû¹ÏéKy§iÑy××PÛE»æp«ŸL’,¶G÷Jv$˜Fån‡ƒÐöªñëz×ma£l÷‹œÀ²)c¯Ëœñô«ä€ <\׆üi¢øŽëS³‚{:ÒêD‰c•XÏûÀ>RN;z»mâÏ^^:ÛX³–ô1_!%RäŽÀg­kHñÄ$ŒK3€ ó¶øg©hž'ºÒ®lÅþ™,ÿg]ûÃÃ(‘òðÙìqï]%§üqso§ÿk[5ô¥c§†“º†éœöÎjî³â_ø|DuKԦϖ‡%ßpª { ³¦jºV³l·šmÊ\[±*B:ƒÜܹEQEQEQEQEQEQEQEQEQEQEWÿÔ÷ú(¢Š(¢Š(¢Š(¢ŠÏ´Ö´»ÝCRÒàµÞäý¥JÍ\0r= ¥Ö57A±—QÔ£¶‰‘]•YˆÞÁG ê}*=o_Ѽ=j·z”þZ;ˆãUžG=Iú È´ñö…5åµíµö›5Ôž]±¾„¢ÌÞŠÜŒúdŒÔúÇŒltMt§ßÞ^QtVÒ-áP±^NGz~›â–Ôn¡µþÃÕm¼Íß½¸„,kŸ˜î={qNÒ<_¡ëZ¦©£Û™÷O‘ÖD¼+m,˜' §QÇ5n]rÖ-jÛC1Jn.,äºY£A9ÎyãÆ°á=k¹e.ƒ¨ê–Êc{¸b& àì.ê[¯[xÓF½ÐoµûT™â²Y|ûv]²ÆñŒ”e$a¿{ÕkoøŠöÚÞî×·m ð¤Ñ–š•nGñžÕkQñSiu•Íö2ê7’ù0iñ2´Žùè;qŽIÈÅP>5ÔôÙm‡ˆô´Ëk™–¹¤ˆ®ÝíÁõÁ­Ý{Y]Ò)Ä&yfº·µ† ØÞò°QÏ=:ôíZe” ž”3")g`ª:“ÐV7Š5æðþ‹s«An.¼–ˆÃ`0w œàôÎzV´×ÖÉæO*DŸÞrýiÈñȡу)är Q×5‹-NºÔî÷ LíQ–rx £Ôžs'Uø´öãQEÓ’-†O°<Ïö‚=7°1úU³ãÍ øj$2·žâ­1ûÖœ¾_×#òæ«5ÏÆ„]Çe¤.Fÿ±3Éæcû»ÇË»ðÅ:ãÆÒÍá-C^±a¾²>\Ö×>LªÀ2¶ÏŒÚ¤sñGì©uÆíå &)Fþ3€Ûøÿ¾MUÔ|cªKá {MŽ+{«©¡…’p]Q™Š·B„àôäqKªIñCD³¸ÕQÒ¥–ßìït^NÍ|tÈ5>¥âÍJëûÃÃÖèúޝf·¡®3²ÖÞàrNNÉïUµøYþ·mOûFÛY‚žæÐÀ#,}ã)ê:üÀÓ¼Câ Rñ<$Ú ÿÙ"Ö§Úe1+¥7€Gz¯¯KãïØÉ­É®Å©ÛÛ<~u¬–țјµçw§Qí]7Š5¯ì-QÕýd6äÄ1œ»p¼}McøOPñ§§êÚF­vbÖì¤1¼è©•YFQÀÆÞ?ÝíY:•ŸŒ¬õßéÅ·Æ=EnÌŽ!·Ê˜—pÇîÏëšµâïøH|5á–òuÛ¹®äÔ­Ô]H±yŠ’0@…ÇÕOÖ´ÁúÓc>1Ö?ñî3ùB+ª†3 QDdi "©wÆæÀêqŽO~yÏŠµ¯è¾-7–sÉ6—c¤Eu}b9 «ºï¨çÜ V׋ui^ÃÃ7ÚMÛ.õÍ4y‘6±HzPõ?»Õ×MÑ4›—¶Ôu‹Ô%ŒÑÆŸ4Žçב֬x U»Ôô(c¿“~¥§Ë%…îNO› ÆIõaƒø×-ð÷XÕcÖõ-Bîk‹}N[ɬŒ®Í±í¥*è2N>RŽ)¾5Ôõ{Ÿè°Ù]Í Ž—¨é‘]¬RIu&v°t>´íF/]øß]‡_Õeµ¶ŠÎÍíÓí²B™+ó`+ Ï¯ÿ^º 韡Ô^}QûUâBw(¼yp§’¦Föç'ÄmKWÒü5}q§$žoÈhÜ)s÷¹ëéÏ4]iï¢G®éRX®¦Æ;ÌGŽ)rv«‘¾9ݪ–¯âíCP°ñRèZ|“E¦E-¹¼„@¿?—Á$Ç×·< ØðUö±¨hmƧoäÊÖÐlc v™ )Ç»Žk ¯ 3k¾ø–lJÃ_ÔD»äe1ÄPn(@nGaòýk¼ð5“Øx{O´ëm?÷aÖf,¸`âJ¯ÌÝOêjM/Ä7zæ¹¢]Û,Xf·pÙóá›Á=~µƒõK»¦³Ó£šïRÖ.,t˜·²EæY8Q‚NíZ~ ñM†¯e¤ø’ÒÑWQ ;«6ržb.⎮2  çŸJ½áMvó_±½¹¹…#’ßR¼´ ™Á¹œ÷#­;ÁúÕçˆt Rî8⸜K½"ÎÐQÊñž{Veöµâ½W[¾Ñ¼8m MŽ#ywvŒãÌeQY;rI=ëšÑgˆH­•g$‚¹S×úUMkGÖ´ÍÃzÄ Ô¿¶/nôûk‰ÌÄ£-Ï gäÂçåùsï[‘é§Â¾.ðå¥õì¶úµµúÝÇu;È¡Ueq¼œ7'8ÀÇjÀÓô&Õü3âMfûR¿–îÒëW{·(¶13Ú œŽùãN½Ò¾ÃáMÆP»“]/¦\Ivò¾Nè f0:׿´ƒT×> Ù]³Éö=ƒ÷°ª»0AŽÝ}ë_áž›a§øSG’Ö6Fº´†i·3ÎT òxü0+#YЬ5ÿˆ‰k~Ò½¢xqe’Ü;*JDÄÀ3ŸÊ³õ-6ßóøËÃús:i7^¹¿å‰X%ùìÎH 9ÆzÔ:¿†ôáµÅݤe¯ol´·¹¸‘‹<¿:I=xWC©¤^ñÆ—¬œGi®Y¾rÝ¼è†øÉ÷ +—½€j½ñ<ñþûZñ%…ÌDõX"˜$ ÿÀyükgP½¾ÓuŠW–Y0i–2Äñ·?‡ZÛD¼“Ã*–¾†Öo²¥ÄZ«]Â%Iq¸JÒ}ìç“–ö®‹M´‹Ä-¸OÁ ̺~‡`Öо=Óe‘AÈ?0Ûœv®~ò; ÞüQÿ„~%…¢Òì¤ À‰œÛxãîëÁô«¾|¾AmáÝ+MŠx&ƒP{µVÁ9qsž§w5궆v¶·7LÆ$2l9]ØçÕåwˆ,´O‰RÙÆ±:ê­<`‘6Àø#aI5¿ã}3ÃV~ ¸6ÖñG¤>žñ(Ü’dyeç$ã§Zím<öµ·ûGúã yŸïcšòÉ£|%ñ-B†ÿ‰æ¢6ŒtÊñ[^5±²³ð-´v¬1ÚM¥Ü®sÜgœþ5ÒÏà[A>Ï«x“T½³b –ìbEÌc=FjµÌ–Ú,§ºÛ ž££}‚ÖC¬±¾ížƒ#§­t>'Ö4íI¼º¼‘UZ&Ž4=dvU¹&¼÷TÐî`Ó~i·SÏiqý C´-µã2p<Œâ­xÛÃ/¡i±ë‘ë…äšuÕ¼ÂÞú_2àäÀçžjÔñ¼šž­«x{@ÒŒàKý©0Ÿ>XHÛ¸/8'õÅEÿ…âý3QÕäµò5ˆ[Nsl(‘~hËn'“Ðt­?m/ðY=Oö’ûõUþ+Gž™eÿWöËMà÷]ã#·QïQËàÿƒ£i– uÁÁÿÇëWWÒ|M«O Öâv°²ku(àŠ@矘3zŒ{qTãòÿáaO¶æo &T÷lt÷®?ÄÍá;í+ÃŽ¤é~!°½ÒÜt‡÷ƒÌ„ûw/±5µ<¿Šüg¨Ë¥ê_a‹ÃÖéf³ÖMÓMóHn÷§xv Cž3½Òµ ÿ¶/ˆ-~ÝÅ7O !ÀUã%pN=+Ûødx’ó>…â[룃ɄÌVeüT“øTŒ²èºÝÊ•¸Ö¼[c¨IžHG“¯Ð Zµuá?ë鯛|I¦ÚDé» çüŠét-áÄ×ÂÏD{U¼•J톥‚ŒNÐ8õª~,Ô¬|Kàß¶˜Í(€K™F4, ` ÀôÍfø‡_Ó¼a¤iZˆ¢êMpm2Él·Š#ó»dF0¼Œž†µå¯‡üEà»›B·úUÄq4HB]E"ާ¦âN'šÑð¯‹tx¼5áÀ±ÝHKÙé « å&3¸>QÜŒŠíëÌ-¬®ãÑ>(Æmg 6«¨Ë(Ù”4c9˜Ízˆ²&“¥¬ŠQÖÊÜ2°Á È"¸_‰Éªé7wˆ4•Ýuqú,Š-ö|£ÿz·ªx~÷ðx:ûJ´{Õðöøg·ˆ2H¦M®È `yÆy©V{ïkÚÌZuåž™£É5̲]¦Ã,®›UQOÏ"Ìw.é qß#ó­Ï†Öž™á=*ÏQ·k{¸ÍÁ’'껥b={Z¥'öç…¼I«ÞC¤Üj:n² ”5®ÒðMí*ÊÅ~V9Ï­bEáŸëøÞKëÓï/ïlnôýۀP1Rz`îN3Z´Þ2ñ’høzm69å„jSÉ3¶³-Œzסc¹/húΗáÓ/ ò¯T_à~üŽWHäÞ±tï x³C±ðŽ¥gkÚž—¦½…õ“H›àá_•ܬ3ÏÖ¶4›ëZ徿­Ø.›´°YÚyÜ´‡æveù@ÀÀŸzO‡úw‰t;[ÍRÓã†ÒÚêw´¹ICyë,ŒÜ¯QŒ÷?…hj:>¡sâVˆ'Ù,­o£˜–ù³(]¸ö9æªßøoR¼ñLúªÈ‘ÙMá¹tÍÊO˜²<›²:þ×^ÕÌÃáOˆŸðŒËàø­t›ci%«ßDîLÊAçËØ¸gþ"\ã$€k ¿ðø>ÓM¹[k–‘ÛÉnèå’9íÏÈÁ¶ƒÎ9ùxÉÒÚx!OƒO†¯n?Ò§åžå9"åßÌ.3ŒáùÆ@¨—Nø§¨½¦§cig È÷&O:áSP¡¿‹ûWg$qÌŠJ²ž„¢¼ý|!ãë]5¼3c¬ZÇ¡ñ%ÉGû\P1û‹ƒ´8¥i]xS[Ó/bÔ|-y3(lî`¼VhçX†ÉR:Ž;äS"ðV¡.›âí ô›Zñ»C5¡Ä¡ ¢"䫟\š¿«x^mOGÑ´Ávôû› šB™ó>ÏŒŒdcwÔãÞ­jZ ßëš°.<±¥‹ÀÑmÏ›ç ^¹ãÏCš­¦øWû?CÕtcvdû|·ïæìÆÏ´’qŒó·>¼Ôwžž²ðѼ)öh¬cû@A–û9S¹þ,zñV¡ðÔ)¬ëz³Î]uKK{g‡#{çÒ“Âz£á½=tëM¯¡‡j[nTÅ»Ç_©®S\Ò.µ_ˆ±}R›N¼ƒÃBXf…Tç÷ÄêÀ†\ŸnÙø³×#Ô5‹ÝCZµkk»× &Ò F mP3œ`óWõ Yê>_ Mq0·ÖöþrãÌ",`ôÆN9âŸâ éÞ*ÒßJ¼y#BñÈ’Åñ²‚¤‚3Û§CI{ám&÷G³ÐØÉ¡µ1ùdˆ*®9⦃Ãúl–¯©üï&«\FäÛ•î9Í`/Ã= lV“_êi1H=6I³n9 Œd¨=lUOG«ÚRÇRµ+i¶ßWÓ„™l[Ëã¸Ü¤sÆ Gà Åo|E¨[éÓÛiw«´+x͹™#‡Ë|Äÿ$V¬_|5ñ4’ÞÏg‡‚ÂiÝ­¢#¦žƒ°$jë«/ø~_PÖR9<ýB#ÔEÛÉ“ Lt’9ÖªX|<ðvqð[ÌËlâKx%šW†ÑŠ‚;qÅu5ο¼!%Ö¯xÖDË«DÑ^ï¶@qŸ—v8ê5©£é:ömíºËgû¯Ýã÷dèsÁ½VÖ¼1á¿ù'U²IÞˆß%]Aê)ëV´­#IÐí#±Ó-RÚÙ2B êOR{’{““Wh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÖ÷ú(¢Š(¢Š(¢Š(¢ŠâäÒüm§x‹\Õt«k ‹}E,ÕDòº2ùKƒ÷coçRkÚ?Œ¼I¡êÚ]а‚IͿٙBW ÛþP{qWjÞ± x«þ85Ýk ¦}…£ºWãçÝ‘³ð­+4ñçÚcûtÚoÙCâ“{ tl~µ&£]ikO4É(¿Õf½Œ(#b¸î1Y6¾†ËÅrx†Úçm¤¶ó‰,È8óe#s)ÎldŒuïU,üâïù–žסƒIy]㶺·ÞmÑ^=2ãÍhÚx1môrÎkù.5 edû]äŠ2Y—hÂŒ«Øgñ¨m<9ã›;kKH|MÅmB Z'!FåXÔ<'s¬é¶jZ›¶«g1šÛP6Ï^F1Áê‰ðWˆ5O.x’MCOBŒÖ±Â‘,¥NFò¹$g·ÑXèÉe©êÚ™™¤“P0¤"H—GâIükÜym¦ë—V:Uô²Kqg¡Á“ïynA*¸ëÆ*å߃lvé¤\Ë¥Üé¶âÖÞXbþã«{ö9ç5ð—6›ªÙ]^\Ïsª¼/{xÅ|×1T—hQŒ€jÖ©á5¾Ô—V³Õ/4Û¶`œÛÄȧ#puq‘Ø€½„,t BîþÒöíþ× -ÄS8e‘×þZFíßFÚ·n­mom浺‰e‚hÚ9#aÊÃk tpŸe¦«ý˜xûÚ[ÉÛýßïmöÝ]AÒ´“aý•öXþÁäù>FÍ˜éŠæWᧇ!ho5&ÓâÄÜ¿’¦>ö=·WAw è×zKèm—§´"*"WjŽ€Á…^HbŽW÷j‚0=€Åc¯„|6ºD:·gÓâH‘³¹ †Ý×9ëï[•KTÒtnÒKJÙ.-¤ûÈ㿨=A÷ÇÓ|à*â»m9LðcÊiYŸË#¡PÄ€}ñšÙ½Ò´½Fk)îàYe±›Ï·cŸÝ¾1‘ÿ×Í?PÓ´íZÖ[+ût¸µ”$n2­ƒ‘ŸÆ£‹IÒ`¼mB+XÖñ­Öݦæ1¯EÏ §ÞéÚn¤°¥í¼s¬3¤ñ vHŸu‡¸¥›OÓ®nmo'·ŽK›MæÞV´{Æií‘Á¤Ô4Ý3V·kMFÖ+«g*Z)”2’G#ŠÏ ‹pE±]ß{§?¥kA½´QÁk1 HÑ ª:aIökQ9ºòSí1—vÜçëŒÑ=­¥ÉˆÏ r˜œIõc„g¡¥Š x †(‘ Ž]ö€71êN;ÓŒq³+²‚ɤŽF}( ‚ª I ¹ëJUH€@Æ? !9* õ£ qÍ/`QEyáínÏV¼Ô'–ÞÊA5µ‰ å$›vï'nâGQ–8=+~Š(¢Š(¢Š(¢Š(¨g»³¶hVâxâi¤Ä€.Dzç©úT:Ægwkas{ W—d‹xÀy?Ý^¦®ÑEQT±¥LèæSöágöÃÖÇ•»nsŒuíœûS´WNÖìmõ->O6ÖáKFä:_QI.¯§C©Zé.ä^\Á,ñ.Ó‚±œc¿­^¤ÀÎqÎ1šZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¨®®­l­æºº‘b·‚6’Yà*¨É'ØREyg:[ÉÈÉrá Þ)ÊúñSQEQT5McNÑÖͯ”]ÞCgÕ'2Jp ã ÷«ôQEQEQL•äH¤x“ÌuF*™Æâ>õ‚|G}ž‚÷M6÷»È“FdÛ2¡ld 7§­ÙæKx¤™þìhXþÍÍãÍ—†ï­-KǬ_ÛÚ²ÈÀ4"@NN7F:gñ®Ž«K‚â £¡Ãl`p}ñQÜê:e›ÅÕÜ0É)Äk#¨/ôŒÕšå¯µ§ªøŸÃ#Fš–¥»Èžb«·%½Ž»}ú{Ö…­Ýô]ZL“ÛÊ¡£’6Xz‚8ª¯‰|7¡ºÅ©êÛHñ4¨²U ç' Éö¬ÓñÀ"Ø]^&ŒÈÑíPÆ@Ë×(ñu­Eñ‡›I过û,Çæ}§wÉ·8üóÆ:çŒUm/ÆÖnVÎÊùZåãóR'VVuõPÀgñœTã¿­ìºj^4·ÐÍ$2AR3£G×!TñïÐöÍrmñPÔü1â‹‹Yš JÂiÄ¥»ªˆÄ€/ß ¥ðyϰ®’×â„®e¶ˆM:Åpë7o ‹o+žË!P¼ö籫z·Œ4}*÷û4Euy~"½½œLíâlpÔçÚ£:ð±Ò\Y¤6"ím%>[†BpDŠ@#®EijºæŸ£¾Îö“P¼KH1’Y»ŸaÜ×5â nòæ÷U¶P:f‹¢Ášä`]ÜnFNqòà“‚yV,¬WZt+¿§_êÒâÎynÌ›‚®æi#gtG%J};ã¤Ó¼]$^ÔumZ-÷MÅÍ­âÚ€w¼/·( x`àž*¬¿4Ëaiss¤jqi׿-ÛD6ÎäeT bà¿ðåkKGñxÔ53¤_éWz]ë[¨VçaƆGppj‰ñûÍÝö›¡__i"ÉyÀ$ØpÆ$,€õöÍKªøûN² °³¸Ôÿ·!’K!m·,TÜF3žI郚ɗÄ~52Ñí[H–+yô§i-¾ÑÜî]Î}ãÎ=ûU? ëÞ"¶»ñeŽ“¡Í©<^"¿’id™c7µT¶I80ük£Ù6„š½­Ä×/z4ñc€$[ÛJ1ä u'¦)Ö>)×V°Ò5Íì2êLö²Å0‘£dn‚=§èÞ2‹Pе=^ö×ì’érÝÅyo»vǃ¨9ÇëKAÕ®u=ÇW¿·oqj.^-Ù©$/nO¹ƒã/\éÍâ-;@Žm"Fe"êh9‘P)^G!IÉ«×>*Öµ-Gû'Ã6pË46]]Ïx̱À&DÚ ±r9Ǫw~<Õ,4oMy§Gµ¡LÖáÉŠU”®€v‘žÙUmKÅÿ4s¤\]èö/±r––öñÊâXe”e<Æ+´ï`qïZÚF»â¸¼Aýâl‹O`×¶óY— ÁJ°~üä ë«…ø‰°^ø²‚Š-GÓåj«eiâø‹©I$öMYÄÇ÷-¿È,v¢¶þw<ƒýÑ[þ>×5_xr÷TÓ7»†KeD­¾ER0<ƒÅdj:—ü0–ºÎ­wiw§<ðÅ}kE °•‚†ËÛIÜ9ö©Íç‹üO©j±hÚ”z^¥Ü›?0Â$’âe¿Þ \ã€Iõªž5ñ-†üC,ÐÄuùlî$‰ÆŠ‘>Ì“€‡$g¨ëбáS]¼Ôí^ÏÄöZþ“4R}¤*Æ’Û°VPœO¬—;É/Ø­-Ðl…áL€ÆÛÉêrqÏ®ûÁíω•^ËSøâ+Y5"[[wûµÄNÏ:!Àgpë·~8œ{Ô:‡Žç“KðÝÝ»C§.¯4‘Out GjÑðËÕAbr’©›QñT:Oˆ¤ºžÇR²‡L–{+ø‚í•‚œ¤‘† ãØ€EeëkÚŽ§à ‹}B+Yn-e1âa˜rì2zÀ½k^ ¿xž÷U:f¦šn§Ý=”l!WyåŒ|ìw€çÖ³ï¼Sâ´ðýÇ”ð¦¹a­Ã¦ÌÊŸ»›,0B“ÀpFyãœUÝNçžþ»¾Õ…å´š˜ƒQÌHŠpHÆHÜõÉÏ5¥§©Þø¾ãN·›n¦éѽÒ<Ó´ÔaFx5ÒצCâ½{Uñ4Sk·ÖzƒCl°,aÁÛбSò¨Áœä‘Åd_êZ½Ý…Ž©"Ï{¤øÖÂѧ œ å\À$qV5¯iWZþ©¦êZõÖ—i`"†(­„“HFY™ÕàtŽ„š—Iñ©}¡øžmeÓ¤U´ÕïªùN3—ʨ,œ»ÉÇB-Z +Ý]]Õõ?Pµµ¹k¥so"JpH,Š¡½6š“Ä’Å­jÉâ{fÊÇ|Ù—Vżi·«òwç9ÞöéRêZýÄZW…¬$Ö®/b¾YÚçPÓ¡c,ñÃÐ* r È @ÈÁéRxvõ­³y?ƒáÖ¤¸Ô.¢{™çˆ¨ÅB*¸%BŽ8ǯz켚œ: 0_m ÄñÄe—laŽÕ.¹¯O©&Ÿ¥ÿÂ3}Ž ãD[€Û"C.7tûÞýkšTXü1¤*.?Æ0¿õòk@Üø¿Ä³ZiòZ›HckÙ™Ú<áŽN’Iã&´¾Ú^Ù\ø–)VÂMôn,ìf2-¼…~pr‰·<b¬x®(Ÿ_ðK°Sÿ •!€äZ£ðlvÓj~1šä+ê?ÛRÃ&ünX¯”û$tõ§x -¢—Å0Ø M6=re·Uû¡¶¯˜°½;æV&ñç‡L±‡Ù¦^¼yuÁ?‘4h6–ëão\yJ$0ijuÁF'ó5ÈCö{{1nÍ.],àýÁó±MÝ‚îÇã]oÖmOÁÖð0:Ö¢š¿yaU>iÿt¯¤ðDP‹ÏJ÷­â„vîBª>ƒ'ó®\½³ø7ÇÐWtzƢ̹åx$V§Šµ_ ê^0iÓÃ0½´·‚Â`Y¤%B*޹SùTÚòëÚÕ´Z¦Ÿ¢ìÖîgâï÷yÜÅÈp8oéU|g¥x“Bñ¾’·âõo5{Â&}»ßz.Ù£# ïÞ^ø·ZÒnoðÞ–Ð\¦ÈLm×ÑTŸÆŸâ‹[m:iúœßdÓ|A%½å­û®a†æ  ¤¾¶‚2@###¥}¨µÎŸ­\x·FKûdž(m C$x‘ydPþc?LqŽõ§â >ÏFøu¬¤&_ÞÙËu3Ü HÒLÛ™œv9=;t©|`ëöà+x‡IQôÁ©|@¦_øvÝ[kϤêÈ:p¼þ“á¯xoÃÞ¶Ò5&6Ú¾› Z>Ÿ±¼É$L±qÈ~ ŒŽzÕ}K½Ðï¾Ø]DzàZjï*c>Y‘Cí'Ÿ»œu­ßÙèÞ9ðÕõû´v×}ÝœnˆóY”€p3Y~ñv‹á­GÆšºÏl’x†îx&òdd˜ ª•Só Ìb«Éÿ Žƒ&¤Eí…ž³âiooº´ÛZIÀ8‘œÄ@5R)|?Š<¨iú¥Å‚OuÚ•Àž@ï4d*3-Œõ!B^¸±âý7QOÉáÛE"ÇÆk4ì:Göcûïûé¯@º¸ƒT}_ÃIÄiû~ÐSbU*67r¾˜ÉiÞ&ñ Úhhâ+Ku³‰DLmX§Ê²x]„r~`{U•›Wðˆ5Kûí>æú×Z¶²’Iìb-åOle+’Á[ªœŸJÊÖ4¯kº7Ž5¡§ÏÚµµ­µ…›/HÞeω$jé¼_§ê7§ÁæÞÝåû/ˆ,çŸhÏ–Š–>Â¥¾°¿躂[»ZG¤^Ã$Ãî«3¡ýyÅli…ö£ÓÝiòØ´Ws@‹)ȈxqŽÍÚ°üo¥êšœÞ6VÆu´ñ¥ÍÁ.4 –䎶jÕ¶}Œ5E¡ai.“oË‘´º¹ÈÆs=«;⸸>Ô¼‚¢Q5‘BÝóÓ­TÕbñ׋cµÑ/´DÓìÕ¼š…ÑYdH˜6Ø‚üß1X.L¶¾/ðþ°t!um?T¾käuà‘ÀIééN²ðÿŒì4ZòÚâÝpZ1!Ôwõ­'ÂºŽ•­iW"d–ÆËÃ)¥—b|Æ‘\ãÐëXžÑ>-xkC‡B¶\ÿë¼»—’Aö`ÌN6ìùúä}ßCëZúo‚¦Ò5 ½¬Èl´]6òÚ]Ùß#Í·ærA'ŸÎ¡‹Cø¡Gq¦h鯦¼²5¬—[üËUs’¸PCsŒ‘ïWïßÄÒ´Ï·^>¥imq-Â34ë#~ð½#<;×UEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÑ÷ú(¢Š(¢Š(¢Š(¢Šæ|?i{o¯øºimÞ8..lÞ|²b S߃\wü#ºV‰6£g©x2MbI.¦–ÎêÕÄ©'!d,FÒ§ƒ‘Œ Ôº¥–­áý7Áb×H´PÑ”ØÙá#щPIÆí¼g8&·^-oŚƑ-Ε6Ÿ¥é†K‰ É_2i …URÜ.I'<öõªºUǪõÞ‰â]?V¾Õà ºÊŽ¥]C) ô4CŒ¨89ÔmRA dt4…#,¨,:r)Ø})03Ú–Š+žÓü5w¹s®ê:“ßKå<q”U[h²@ÇRp'œ èh¢Š(¢Š+;\Ñ4ïéói—áͼ­6Æ å0ä{ŠÑ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¬íOFµÕ.4»‰Õ´ë¿´ÆŒ3m+†ã§>Õ£EQE™­øDñ¼vº­¿ŸIæÜÀŒs‚2>µ¡À¨"Œ(HÀ@£¢ãµ>ªÚiºuŒ·“[B±Éy7ŸpÃøßdþ­QQÇqm3J‘JŽð¶ÙH%3ƒè~µ%QEQE™¿¢É§1¸òâÓ&xnÞPUc*<0zŽ*Äšž— ²\ƦùÂZäÿ­$nÂúñÍ[¢³õ]bËG&å\‹ËØlãØ3‡—¡<Ž=jù O šçl¼ck¨Ú‹ë=7P–Ùîâ·‰Ä_ë±Ràg;’Ò´ Öì®5{íRAsgo îÄ …eÎ0sœŒsÀ­:(¢³ÿ¶,ÿ¶‰¶Oµ¶†Ûòß·õÏlTººÝµÌïÙÌ×…K“c9ÀëZôÔ’)A1¸` Sži­=ºãtŠ2 #œuü©L±(RΠ1I=IôªºÜÖÖ·_d05ò[I,1LûUŠŽ¬z…ÏSŽ(ñZXAwªOolLQ™œ¸†#œ1ÇéSZ^XßijÙÜGq d "`Ê‘PA­hWW-go¨[Kt¤†…$Rãx5f’á\P½r{c¾k=Z`—`:ª ÀõÆ+'ž(ÿ„‹Wñ,v÷Ýi¶­blÚ,p²Ç–ÉyõäVþ­¬èú©¼Ôî’Þ ê›ø™ºI'ÐT´_xg_žkK ¢náA#Á*:H÷ÚáN=À­KÛÛ-:Ú{ÛÉ–h¼²9áTw5…¦x뺭ìZt3M ÔêÍn—0Éœt.ª¯™¤ëÚmž•«j7úË][Zj7i,òdzÊÚøòÀ'o@Fwv¨mþ"ø^[‹I–òÒêþt†Ö+›y¥ÜpÈÆ=yã#8Í:ˆ>KËý:Ö ÛëëZ;ˆ-`vdÛŽIáqéósØqWãñw†äÑ?á!8ÓùŠÛƒmÙ·Ý»Œc9ªÚwtËëÛ}>æÊûN¸ºÝöQ} A9Q’äŒÎ Ú£¾ñ͵íÝž™¨j?bm—“YÄ!lgi%—,;… EEðÛQm[Ãÿmk™.D×׌¯)bv™ Qór1Ú¡ø‰q¨\äxsM¸{{Ýjù#ócb8bù¤`TƒÀÀê:ÕÏj—ZŽWÎ[PÓd“O½ÜI>dnI<’Ãñ¬ù>"±·ºÕlôÛ½ ØÈþ2Ÿ8Œá™#,zñô¥Ÿâ=²Aá‰m´›»©Ñ寛åçnìs·<ã=3RÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÓ÷ú(¢Š(¢Š(¢Š(¢ŠçµOÚi÷“iöÖ7šÜ,·ÙÆÊV鸒£$r$ûW'c¯[ßé> Ôn¯µ%´ÿ„š‡Ê%fˆ ÑA8aéšë5¦Ÿ}ý™c¦Ýj—ë–X­vb$= ³²('°ÎMb_xÓCÖô?-µx´µŽ;¸Ž}ÍÙî<Gâ9§ÞøƒÄ0xÃM°¶Ó“O? x‚¾Ys/-»÷}àžÀõ«×>/Õ%¼¿µÑ4õÓæòn¦ó5ÞJ¦îXŽý>µCYÖ-µ»Oj–ÂXâŸÄÃkpÊ@u*Ø8àŒu" ¶×$ðü^;ÕÕîÅ®²âVÃm*€‘xQÏá]&³âHôÔÑ´j“U¼†Þ •ÆKç…Ö–©¨Ûi6z…Æ|›X^W Ô…½s¾*ñw™¦\_x}F—¨ÉG5¤ÆY!óGÊeP€mõ!ˆC¯iZ,>/¾]R?3|³¬‹ƒ×o¢ðŸƒ|=®Gâ;^vÒkšŒq¬ŒÛb]ßÀ¹À$óœf²ÿ´5Ÿ x/J–+»ø/nî๊[ˆ­‹MìÈ0p7|ÀZÓÑôë«/è÷:7„®t;W3E~ ,R¡_””I,¤uÛŸz“À~ðÝæ‡{sqj’ÜÞͩۙ_“n쬩ž€òN1’k›»7Úæ‹¡éIÿÞ´¾»™88–ÁÄqƒîFH®†W´ñ#øë^kÁ†t»v8Á/6OÔøSï´BþßÁwVØjØéÍ¥Þ0bº(ÞFGL•Ç=k&îö-;Fñ´V:<Ú°ÐZIwl²Éa’"œ—;ˆQëÚ¬ëúF¶ºEºAáíH[I"{KÓvÀàü§"!ÝÍÎ{×«ç –8ãŸjñó¥jzg†®`m?Lñ7…˜Opn!—˸dÜX±nT²ú†ŠÓŠMWQñwÚ4¨-%Xü;e%€¿gÝRç%@ É<1ÎzsU®,µ x¾"½ÌºrÉ>Ž­qid\„“kaœ2€ ¾¸Î+CÅ:vŸmðÅb·…!H,l%‹hkC‘îkODòÏŽ¼Vn¹ºûöMÝ~Ï´îÙí¿9Çz‡ÁƒK*ñïØ6yfêË~ÌcÌØÛú{ç>õgÆ·r&¡á›Kiõ;›¹žÎ{²Â+f2ÌBòXƒòŽ>µ‹búª|CÓ¡Õ5k[ËÑ£\‡ŽÚ-‚X]Ï<žOn•Ôøåt)<7©G­M,{¢,³D hÎáµ°èpOõ®Yçñ©xf=SQÓ¼Cgwv®Ñ*ÜÄYOïcÚYHQ÷Žë&åâ‡H¸¼˜3XX|B’âðŽBIJ}â~U$Øñ·ˆ¼5¨ø&ÒÊò «£â+9—Éum‰È$‘œg#Œþ­àeˆj~:ÚïøHŸqîtŸÊ¸™â¹o5Ì7Mmm¦øòê{™ãPÆ–F¶°# H'Ž8â¶.e±Ôµ¿ØŸÜë}º;È ³Kr±ˆ¹ß+(È^ÝrsÐÕï ø‡Ãþ‡^Ó5Ëèlï­ukÉä6Ö™&mÈëž[ ãŒô«Ÿ î`¼ðôÓÀ¥"}Nõ•Á@_¡ˆïYa½ñ—u›Û=VâÂôÈ¥·XÉiæ”~ñ\qÀ<~4i6:‡†<[©hwó]ÁâM=î ¹˜(aq!ÇȪ¿w éU´_Øh>_ ÞZ\ÂAei%ŸözÂå¦~@e8ÚQºçv1PxSçÿ…E ˆf¦¥€8_ÝŽ§Þ¯ø¾Ê×OñZë:µæ¡g¤Ýé‘Úý¦ÉÜåÉ &ÀN8ëš§¦hºŠ-üY& ÐÜifÂÛPÔ&•¾ÒÇæÂ$ƒ!ǵ© i~¿×´ËÂ×6ö¶m$³ÞêrÜ *ĎܶO$ŒøWEà-BÆ×^ŽîÝá2xSš ã£y2¬=jäbÒ¼C§ø/ÂìÚUÄ×OˆþÛ5¬KûÓË'*§àƒô¯V¶˜ÜA æ7ˆË¿— Ã&FpÞG~MKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÔ÷ú(¢Š(¢Š(¢Š(¢Šá´]WIðþ·â«=fê+;‹‹ÿ·Bó°Q4,€ ¤‘¸Áô®Qµ ÝÅ÷¶Å|†ñu´‰“€CI?Þê>µÔŪé^ñG‰_[m"Õ ¥Å­Ä¹È#Œ!MÝ7Û= sœ:¦›ñJú(Ø[L–*AdÙ€Ø#8aó:éµMFÇIñ_„î¯e[ÜéW6¨ì ŒPªçÔöéYgY³»¾ÖÄ:ÝýµÝ½íÄPiv›¼C…*w¹aƒÝOj«¤ÍÞðtïY¬¼W3ÄU·FÛÜá½8=ë©ð娹ÔÞ•ƒà›}N÷Z‚ÏPŒìð´Öq¹é$’9Uaì#ó¯BÖå4Ûæ·³[ÙDVÙŽÜ}Üàõúòûht„¸ÒOƒcÕôýEîàóìXL-ãŒæ‰VA°3§žÕµy£ê×ðøÂ;[f7ëv×–Ë Ú³˜Õ€Ož™ïU¼[âkÝ_L±ŽöÚ3}e%ËÝǰ'ïdä±ltíÞºmÞæ?ø®g†EŠh´ß.FSµö£´ô8ïKá«kÈ5O¼ðàØ[®GNxªþñ%÷‡uöš(޳¬]ÁpÐ+|±$l»SqêUAçŽk¢ñ•¨j¸·Ehì¯Ì³’Ø*…Èõ棹ѵ)¨ýˆEÇËÞ?{Çüµ•ßEmknÓ<0¤m3ù’•P ¶1–ÇSõ¢+[HDŠÑ%vyTÌÝIÇR{Ô:V¦oû”ÞaËù(«»ë€*Iì4ë©"šâÖ)e„æ7tû8ü*dŽ8Á¨PIbÇ'©üiB¢çh''Íõì}+ˆ—Cø¤ÑO¦oYIc7˜Ÿm’ûZÆý°¤G¸ÀõÅušN™i£iÖ:e "ÞÎÞ8#Ý×1Ͻ\¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š­w§é·þ_Û-aŸÊmñù¨iõ¥ò-þqå'ÎÁ›É ¬-ZÛÆ¢ñæÒ汞ÎH€û5â°ò¤^êÊ ÷§cOðÖ‡{¥JïR¸ŽãQÔîD÷-‘íPªˆNüšÜdGÆå##¥.ÕÝ»v1žôN* ä¾’Öt²™!ºd")w*·bW##ñá­] Òd¸º7w×W\ÝÜ•Ûæ;ú œ0ÏjÙ¢ªj–T²¸²7[ùË5»‘9H®v/j÷7rkºüÚ½œé<6â$K§Ý.W–Çà+­¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Šæ#ñ®’þ&¸ðñš²ØþgÌÓ–!£ÛŽª0z÷éV¯ìÙ]ê°E:¾ÇðèÍЩ¸`9d\çŠuÛ¦›4ˆtW6öåvÑÉ:Œ[¯,ôæ¯|C×õMJEÒdÙ¨Ü4mdp©y#…éÞ¯'Š4Ý7Dѯõ‹³^Ú@ÁQK<²2v"‚Oà8«_Š|?¬Cw-¤í›5Ýq¨é,Cù‘€ažÜsX—_ü=>—¨^hÏ=ÓÁdÓ$‰o+F®GÊ… Ÿ˜d3œb³u?êºÆ…áK«+«>kýZÆÖêE‹aa"ÛŠß)=ÏÖ§ñBk~´‹S°ñÔ÷ qbÎãËuºÞà(lãû¦º_Åšf“wö{›ÍFX<ÿ²ÚG½Ö<ãsrã“Pè‡H¿Ö 7Hš|‚;»wˆ‰¢cŽªO`sÁñaß=é·š…¨YG§^XA5”aDp:‹´``vÇlS´ý#FÒmžŸg µ¹Îc‰@SŸP*Ž­¥¬ÚÛ‘[Æ›4*¯ 1T£ð÷†¡µ61év‹he3DK°¹þ,c÷©-´]ÊO6ÓN¶‚OïÇ©üÀ-ÖŸ¦_Íݬ3˜Îä2 m§ÔdeÝ¼É ÄºtVâüò&”|¤ŽŠó·éYÞÑot¸ïnu£›SÔ.MÅËÄAÆW<íQë[Šªƒ ‚–Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*½¥ý…úÊöwαLðHc …t8e8îZ±ENëUÓ,®¬,®g q~ò%²s!EÜÝa늹Tô½SNÖmúÂ_6ÝÞDWÁ(ÅOÁ”ѫ魪¾Š$?nKE¼)´ãËf*ìc¨éœÕê(¢Šd²ÇRM!Äq£;@MbÏâÝ+RŒÉ5®±wmmjȧ$Ï÷I ‚¯ö­Ú*Ž¡}ug&žØËr·7B”úâßÄtÄBïqŸ•ppAïœñŒg×R²,mîrîaƒ‚õƒXúŸŠîáÕ&Ñ´"mJöÚç¹Ã¤qį÷Fæ<±ê$^7Ò¿±u bîÞ{c§Ü5­Å³€dEÚH%‰ÁïÚ³î¼y­iO§.¯á›‹TÔo­í q4n ÊØùñ÷HëŽsëV¥ñ†¨úýç‡ôý[©lå¶ó®<ÅX’)@%‰<ävPqÔSæñF»ww}¢‹è,&h'žY„jÒ(Ë$ckGBNÑžüP|mm.“i}ge,·÷—Me ƒ² ÔÊÇà’yâ‹x† RÏJñ•£ß¬†Ò{iŒ‘³ ÉFÊ! ŽGZÊ‹Æ~3Ô-µ{Ý;Eµû6•su­4ç3ù'¤`'o\ñž9ëKÿ ·ŠVÂËÄré0E ÜK”iÚR9X(àlÆNqœã½kêz爧ÕeÑü=mlòÚ÷w7lÂ8¼Ïº€(Éb9êZ̸ñ¾³e£x–KË(#Öô%ŒÉ±0ʲ}ÇSÁà ñÔMºñ/ô˜,µRÏNJž{hæ‚6Ï ÌÁA,@RW<Œ~=ê8Äãâ=àÙ‹s¥Bî6>ãíæÆüç'§µt¾.×%ðÞ…ªÅÈöê»Cçjî`769Ú¹ÉÇaY&§ã9¯í ½Ó5&ãÌY§²Ô•'2>àzqƒíX·ñÍÙñ$zUí¦goâ H!hK´ÒÏ9`l“ÏJЇƺö«¥øjÞÂ;xµÍiîbvpLP l‰\ äò>PO~O~ÒûÅš·¦iZÝü:•¦ª³,+ŽH¥wme©R3ƒÁÍ]ðn±©k:$—·®¯p·wÑeWÈʼ{\µ†£¬¯Ã OPu–êk›ï2@ dùN8:zVŽ›'|]æ³a®gZ «ˆtûu…]ab»¥,7Ä®]øb÷ákCp¡gûUð„ÏœV^µe­j?cµ°ÔÂ'ðÚ›‰£PdÚ'"Uµ®£aâëÝ[TK«U»}œ‚FÀ"0ª¼ü¤0í]²ÞêºoŽÊæâI4Ý_Mó­QÏËÖç«õS¸×1wâíZ×GºÖd½šµï  —û5²åw¢~f HàäqEž°º~³£ Q×5®nÒÖú øg)±ÇúÀÏ…*qžpEz&½gþ“¨ZÉ$±¬–ï–…Ê8ÀÏ 9äQés/Ãß}Žòê;›ígJo9äg03¹Œ6BصuwZJøKÄ>}:þùÓR¼žÒò;›‰$Y˜1H þµ Þ›âYõKýoOׯe÷Vö¿bYD6±ÄûWaFQ»Œ’sÏoíÞ$“Lð'ö˜»Šåb1×¥q:ÿ…4mºõ·ýµd–W+|Ò1™™™7d“ÐŽ1Ó«GÅVÞÔüJ‰s¦]ø‚êÖÁ1¦ O³Ûo'÷Ž]‘70àd“Ò¹èê |PÓd´û6¹xl‹ï[uxƒR8Áë€p «^'ðG†í4o›[*êm_N‚æí Ì“‚$Ý ;ŽîüÖìš6áßøat{H¬’ïMÔ¡š8*È#˸¤æ¼7o¨ëz4×÷¾ ƒT¸Ô¦¹’æîkˆƒ±ÜWp,¡ÀÅz€¿´Ç†t¤ÔeI®cã2G(2«¿:ðN1ŸzÀ¾KkÏj²izÕµ+kX-îg¼•VÞ×r–TL«¶X¶×)#ÚͼB=jLÅlI†<´dªä/õà}+¨ñ®á½3Á]>Þd±KY4écQ½eÜ»J‘Î[¿'9§xoNÒfñ÷o.bõ‡LUÜ(­Ý·ê@Íszúµ•¿í4•t³¬é+2dˆË·Ïo@x߯O³â›Müš„qj–fÂXŒ¾bÈ…Œþ!Ǧ+gÖvðšxæðƦä>›rB˜AÀú÷®JüEâ(§URøò#|?„@Å nöÝŒ×Kñm[ÁÛš3tÞ"±6¸Æâ¹ù¶ÿ³Ó=ºVvž9ÅÒ¹ýxº3â´Õ´»C¯v×ku´€žC1ó£+ŒqŒU 5-4ëo^ÜÞÇu£ rþ_8DÑCʬ#¹$(mØ$ãšéuëí"ox6Þ)c’ò9/‘•F…±Ÿ¯8­¿Œøk\ù¶âÂcŸL åoõÿ ßxm-®!žK.H-QÊÊSo' ûRø†i¼u¥øŽo™_I}:ý€'t¨›£n;–} u>Ó%Òt>Ú~nZ3=Áîd”îlþ'‘â ý;Kñ‡†®/îÞ­/mÑä8RìW'Œš›Àž^߄ƉoÁǯË\•ƒÅÿÿ‚6¿ ãEÇÞËÅM¬ÏàûmsYy5›Ï jÂUf`àEzü²!•½1ñ}–µm¢Á§YݺkN’âY tX1 I`>|ñœsšé´(®ž3‘áuŠEÒü·e!_¶vž‡ñ\aÓt- ÷[¶ñzÚÉ.¡qufö2]ySÇ)È !`¡Á8 …õç­M?„Xèz.£ýy·Õ'½º±ŽæVºhçKoÜÌ€Þ£5oAÓ¼=¨ëúdúN…¨{!$Ò_êOr¾[c ±¬­–o\ŒÞµ|9§ê0x{ÅVóÚȲM©k 09‘\¤{Õ_PÓµY>XØÅg+^®§)· ó‚¥21ê;Õoè}Ÿˆîõ}G@ºÕìõaÃÚg·–!·C/ÊÃúŠ<9y7†<\ö>M>MF –vÜ›™R>†RXŒ“Ðdc¾k¥ñž›«ê~6v–æ[Òö,cVü’)nN&£»X±ñ½½üZl×67ºTvRO\@Ë!l¸$qƒÛ'Ú·Ôý#ž$³°ð$I—G¹žKÜ9Æ ¿/=G¥Kg¦xûÆûKÑ­ì®tÙîæžÎyäekQ1,Êèî IÆßk[Àú&©áí-;R–9n’âêFxó†HÌ rsÍIý‰ÿ wööøþÇý‰öœïó<ÝùéŒcßð¬­cÁ7zÅç‹î’+}kJ¶³Œ¨%ѣݒÀG>¼Š¡©økâF¹¢&âçK±X<¦‰m‘ÊÎÑT6qµr;?‡_žÕ¼O¤éëÔv:Õ£¤Ép€”Fe+ ^‡Â¬ßøJÚãAÓô{I¾Í.™ög±¸ •,åb½{Žàš­k£xæûP°»×uh#¶±bëm§QpýŒ¥˜£û£S]L±¬±¼m÷]JŸ¡®Nð¹¥h·ÚÄrä궗v8c óu>£§¡®“[ÐN±{ ^ (éWæïnÜù™F\g#}ë*ok¶³êÃúñÓm/æyå Y<¹_ï4D‘ÝpC Ô¿ðƒØ%‡l"º”.©Ç¨y’|Ï<Švò¼[&µ4Í 4ÝG[Ôí#j“Ã)Bùh×8ÍXÖtȵ2ûL–F.íä…1• 1‘š§«xn×VÐÃòO$p´Ãæ®7â2<ŒgJ¥©ø>K­RM_MÖ.ôË›ˆc†ïÈ•™Sî’XˆªP|7Ò­Ó_‚=JøÛëvžMÚHቌC2“¸ýqíÓº—‡4ýR×L´åé×v·P” Ð}ÝÜt=úT·z%…橦jò—ûNœ— åÄÀÜ;ôâ°ï~è÷s]´:†£gk{#Ëuik9XegûÄŒ7wÚFk¦±²²Ómmì¬âXm­ãXâz*Ž‚°õ/èÚŽ¥.ª·¶w7¤w_dã £xSØpÁ÷®ÅÓ4Ï x¦/YÎeÔ-£Ò7bŒÊFYTŸ¼GSÔÖ¾ŸðóÂv“YÜù7-JÉok4Ò4îT˜¨#·vÅeÚk>,ñ]î§g<(ÿÙÿb¼†GذáYN2Euºw‡ÏF¹ÒúâMúƒ_ÁrHÁ&AR9#Ç<äsRéþÔÿ´­u=wZ“S–È?Ù#ò–8ãg,Uz¶8Ðõ++#Û¥†Óg%³{r£a8ã¸=Á¦hžÓ4I®.Ä·w× [»·/)AÑAã =HÒ¬t; }6È0·€0@ÌIù‰'$ûšM[GÒõËF²Ô!óa,®0HdeèÊÀ‚ìAKE𦅡Kqql’Ëup¡%¸¸‘¤‘”t]ÌOJ§ÃïÅt·KdØI ‹nds¶s‘í™ÿ€Öö¡§Øj¶“XßB³[L»dºKŒ6‰a- Ô ÛLVN™à¯è÷búÇMŽ;•ÎÇ%—ž»áŠÕ†ÂÂÚâîî..ʉs&Á…Éö*†©á_ ks,ú–› Ä«·æqÉ 8ê=ŽEhMa§ÜZ›­ã{B‚3 ()´vÇLU;xgJ­†—kl!vx¼¨Ôlf$`u#ŠÐš.b’ ãY!• :8ʲž CU#Ðôn…ôzu²]2Æ¡ÇëŒô¬I×µëë)Ù4(n!¹Ë1–S!6íÀã'qãµtÕ¶öÓ”3D’Ûrní>£=éꑦv(]ÌXàu'½#PP9ô£ÔwΧ†*ðûhRøŽÚãí:lp4Åá$/QŽGpqŽõ”> Ú˜–ãû[û; “Íû)#iïÁ'…h]xÇÃöþoFò\i‚5W.C0_ºvòPqT&ñìvÖíwsáýf+T]ÒJ`R{±ÉÀœZz‹|9¦iks\ï³¹ý˜Æ 4æOº¨£’O§çŠÃ›âöQ‹ÍOÂú½ž›Ák§D>Xþó¢»0¾Ekkþ.±ÑtË RPŠþâ-–Ø¯ï  • ±µŸyãMkJïµO ÞÁc 4©$NÑ/rÊ­œøÍuIyi%ªÞ¤€Û4"a'b„g?•s~ ñůŒío§·³{imq Œ2èë”nƒ«?Rñ¯Œ´©tø®ü(ªoîÒÒ/ƒ#d€p8ëZW~%ñ—¡êúÆ©¢ÇnÖP bny¾ °N1ô5Z×Ä˨ ¸ƒÃºxŽXÖEßzÙà ŽZéô÷Ô¥´õc‚í—2Ç–E9ìÅTŸûäW1ã/7„o´X^ÄÜZÞ ™.dRwA;w0PpO#Zž%ןGðýÞ·b±ÜùPÇ,@Ÿ‘ðÈíƒSëúÜZ‰}«º‡û=±‘?}ÏÝ_øÀª> ñïˆôÙeÔ-E¦£ks%µÕ¸9ØËÈëê¬Ëêx×PðÕå¼If¹KI×væ"¹VÉÆpIà”ÿˆž1¾ð•§öl1Í}rò0I*±D¹v xã¿z5ÝoÅŸÛz£Mej72És¾ xáBºzúÕë+?‰ s_jÚd–¢@eH­dVeô f ø úÛÔµ M*ÊæúêEŠ#.îç}kðß¼?­iv¡uwom=Ô‰DXáf|á`¹'q[·ºÞ‹§L–÷wqÇ;Ã,ë9vHÆY‚Œœ¥bx#Æv~/µºud6÷«¤að#ÜDg,,¼Ÿä+ª¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿ×÷ú(¢Š(¢Š(¢Š(¢ŠL¨ Éè* [ë ï?ì—ÍöyÞÞm„’'U8èGqV( '€+–“â/€âgÝ©¯–’ym0G1ÿ|)_Öºhf‚æ(ç‚E’)::†¡v¥wXÑŽT±>«麅–­ek¨Y¹{k˜–X˜‚ VéÁÁˆ«TU=SRµÑì.µ­ÞE´FGØ2؃֭Fë"$‹÷]C¡ªú•ô:eåüÊͬNáÜUN2G?ˆ§Ù]Ãimy"+ˆc™7pã#>õ=€ <\ç…|e¥x´êÎ)bk9U—ulíq‚x8=pxé]R¬2Aî++ÄZÚèzV£¨ÇÜKi™äîÁn{œ~U©ù‘£ã”6=3\Üþ1µþÎñå¬;æÑäž/.FJcä¸í9Ç#ð­›]WN¹ò#ûDBæXR_#xÞé×ô©o/´ý>?:öæ+x²|¬r}É$ÛÝD“ÛÊ’Äã(èAVÄqIqskgÏs2C ³È@Qõ&«éº¾‹¬FÓi—Ð]ƵšVúU£ñG…%¿:\zµ£_†ÚmÄ«¿>˜ÎsOÔõj¹åñÏ‚šámÆ©æ¸û2¾Ë2t>6çþSêþ,ðæ‰:ÚÞ\·ÚLb_&y&q¸ª {œR7‹ü*º3xƒíèÚZ²«N ¤°\AÉÁÈâ³[âW£“d·’D¬ŒðÉ$2ªO·¯”Å@cì¤çµhhþ-Ðu¹nííšhîmbYe‚â'Ž@Ñ‚¸¦k-~'x9áŽò6»}=™KÁo'“ 1ÀÄ ^;â¬Øø÷Ã÷×¶–‹ÜQß1[;™¡e†äœ#QÈÈíYÚŸˆ›LÒüeuaq{suiy$c|a–ÖC‘´qûµêIÏz¿iãKDÐô½FúÖñ.o|¸a¶ò¿}q&Ü’ˆ àõÉ cÒ®i*±Õ/%Ófµ¹°Ô#‡Ïû=ÚÏq¹H,¤ÁÁâ°µ?ˆKe©Ëg¥êRiѤð N_,8n_˜9Pˆ.+Á’Ë?†™jÌîijƒ$“’OãXzW‰uù¼_¯é÷V7 ¦Û¥¾×v‡e²…c¼á·&8ûÄw O?¹{i5h¼?zúnc}”ÜÈ:ȱgyNùàãœWco<PÃq‰!š5’7Xdõ®CÃLçÆ^;RIU:Q\’@ÌG è*OŠ,ÉàÝi•™HXå$ûÕî*‰>ÑâOi^id‹MþÎmKPòØ«N¡¶¬{† å½E.©ðÓI¶‚+Ÿ$zF±k"<!}Ž–P ÜuÈ&±ü_ÿt~;ÓåñM¼3ZÿÂ<ʾtFDßæöXôÍlxhüºÕ"°²]J%y#xíY@$1E¯­sFûÃÚߊ|[fK[}~{]^Üdî·!H‘G÷£$“ìMuúŒ°ÜøÛÁ÷07™º^¤Ñȼ«+#Ÿ~+Òn|/ >£kã¯Lunæ’mNâØÍ³|¥dÈ`cŒ~•¹¥iþ´ð—Œ_Ãú¢^iP_Mo ýÛBÑÈ9Î3Îô¨¼+ªøa4Ã7“KkºU±ÈvÚ2U°3“ÎGÖ­øÞÂóXÐô½/G’êÊÛP†öëJe¼± ä8ƒÎÓÖ³5ÍkÀ"‚×LÕ¬ï¼9v“ÄÖw76ÞY†D#$ÁQéÔ êÖ+HV+hc‘¨à^mâý7Ú?‡BÑdTÓï¼Kkm¨$r’!>]z à q×§5é°A´QÁk1 DE £ ¼Šþlm¾0ØYalc·Žå#_º“KçÇÔŽk °ñÄ[}Å­<&)§Ã埶Góa1ŸÃ5Ï\Gb¿nZÊc8’/5Ø‚§Í7¸Ç8Ãdu®®êóân¡¦}–ÏC²·{‹+ÍžëpŒ2ã;V>qõ¬tÐítOü<Ñg“Ì·°Ò¯±np e±ëŒ‘é^™2C$R$Ê&FW ЩçÚ¼= èøoá¶µU}ž'ìBV!Jyϳqëκ¿\|JMPiíôäÓ» ï³»´ë áü½Ê«œg­MãJ×NðEž¥$­ý«®e`™Lr(ÎRBgñ¬»V+ÅÞ’ÛJÔ4ý:òÀhÓȶ!xÆaÇ',yÐüB¾ðgÿŠ¢Ëù5^øŒø;Ä[~÷Ø$ÅféZ/Ä ´Ý:HüZ¨i (qœ£¾êÚÕµéXGa¤6µ)ˆ­Ä«,qa”pßÞç§JÇÕk¯xßZù2\XêÂh ´i•$p­rþ$š_ èÞ!ðÓ±Kh×:Îx(€“ÝN¿/Ò¶¼yy{sáoXY}ºYfMJêÙ]T46ü€Y¸¶?*n­éþ7˜êšWöl> ³]‹ç,î-‡ªŒ©ý+?Uµ¹7¾9Ô­”µÞ‹«iÚœêDP ëÿ\ЇÄvž*¶ñ—ˆmŸÌ±±ÑN³aд€I)ÿuOÒ´üA§WÅ~€^\ÚîÒ¯›jû…^3ƒÅu:w„Æy áÖõkŸ+?º¸¸Ýdcæ\ úýkr}­ËÁ>[d~ç–ð¿ÂÛS®ÈÓóï vìÿov6ûÔ? äs¨_™ÿá*6VØ8Ýö@£nÌq×ï÷ÏZè>¸m&ùwˬêA€=?zÝk®¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÐ÷ú(¢Š(¢Š(¢Š(¢ŠàüGm¯¿|7%¥å´!­ï2̪™ù×;¸ÇLc½Tðý¯Œ®¯|S™{oafšõÛù™$’d`•@Ç©9íŽmj1øoO»¸°j×Zƒé…ä8‚9™ZC’Ð8϶j;Oj:^¯¥ZÜø†Ã[²Ôî>ÊL"5–ÞF©‚‡9µ×øƒN¸Õô}ON‚o&k«IaI;)aŽ}½k޲×;µ’y ¬~…㌟‘ $›ˆ‰ïYº†´"µð~‹4·ÑYÏ£Çqttô‘¦*(TXfUÏ,F; ŒÕÿ ^I¶lô᫾‹5›1ŒS~âd?ÂòØaØ“ÏNõ±ãíVM+÷¦Æêïmº %‹ËÇÊ$’1\Åî—¢ø‡Ãk ݽ¬ÖH® xÕÙH1°±lÄ×£^ÊÚ\Êóˆ!‘ŒÍÒ0Þ?NµãzŒt^“RÒtýZçP>кä¬cÜÙÌùä Töuš®“g¯xÛO‚ø»Û4ÒD¬Áe"^‚29Î=EQ™‡ƒî|oo¢Æ`·‡J¶»‚'dR6àYG8ìN=)¾)ð/„¬|#uyon«} ªJ× Ÿ6bHÎöêÁ½ò+Ò-’ÖݱÃB‡Q^a…¢Yi?§¶Óí¡–)ï-ât@ Åå«mtçU­wÞÒüm}igW¶‘X\ÅsŒH$Ü¿1~½êƧý¡âûôm -Z;+Kt'‘bYYÕY[%öÅ_ðU¥ý–­â8ÚÖÚÆÍÚÖD²‚u&BâU@ÚƒŒsŠŸÄAâO X_"ÉbßlœDü¬“F¿.G} ’+3Æ6ú”úíæ•!ƒÄh2o†@+>òö9ÍZñ•á[oL±ÃÙÚéË-¤ˆUÂŒ¬9ÜN9jµ´·7ÑäÕüxZ7Ep8—ÌG¸ÉéïV›M±»ñ~·ee¼ÐQoÑ:y¬ä)8þ-¹ÅbiW:Çü"Þ¹ù§ÒnæmA}Èí>Í•®ëÅ_mÿ„[û&ãû>ãË ×;OOJÀiü ,Mò$º#Ù["Å%ÛŒ*…Áß»Ó4ï Ig¿ã(®>MDßC!óÌmÌcËÆ{å5³iq¢üF¹´Ùý—.«f##î<¨È%#·'ަ»ÃÕ<ò®ÔÕÈÿ<›úb£¼Øàækk("“Ù•FGá\e¿ˆ4 øÛÆGU’X–ítÆ€¬R0m‘|ܪ‘ÆGzŸÆšæ›âøš-ÏžH ‹rù2’àŒ£=3Æjψíµm'XÑü]cg-âCdÖ:´#2˜[æ ‹Ü«uWSñ–¡â˜Gð­üw×;R[Ù¡xÒÉIù‰.[ëOÕä¹Ñ|k¤_½íå²è2Z4ðDÒþf~b:[v¾2‚êîÞÑtmY òy~l–Ì#Ov9àT>°¹Š÷Æ+wjÉ Ö´òG½~YQ¢@HÏQÚ¹Ý'Þ"Ñ|c¦X¤ /‡¬¡¾–Æãþ}Öp?tOû$|¾ÇÚ®i¾ ñ¿†üý+^ѵ ]¢šO²ê6jŒ'ˆœ®ñ•ÚáãüK4Ÿë²[xïSŸN[uëb¶Ö ÊX‰”3òîryýM?Ú÷Š´ HÓfð~©$ÖvP[»+[íc‘™³¨¡¬ÿÂo«éÖ¦o6¨ØÞy­§ÜÈ€]F 1Fuç¨ÉãÚ²õ»ŸøÃN›Cû]…ŽâæòxÊB2 *©¸±ôéÍt=òx’{éã"ÒËI·°±bA߸–‘½AáG>•ekã¯ǨiZN‘¥g%ÕÅÅ„æuO(LŶH¤gåby‘èiï¡xÓJ—G×axõm^ =ìõ(„hVmãËm¸[¦@ȨuMâˆô ôŽÙµ ²éúbÈc#«<˜sN©5mÄvšýž»c¥ÚêÊ4¸¬Œ3È­ñ–Vn‡*džôOØø‹[Ôµu²’ÛW¶¶-ä3~á Ê¬`ó –Èçøk£Öt=3]Ó/t›¸ÿÑ®ã(û8 õ{ƒÈ®Z OŒÖ˦Ãq¤],`Güþh“`àA[øúÕËO‡º4~¼ðõä¯r×ò½ÍÝÓ`;Ü9ÝæBëÓ½SŠÇãUœka££Üˆo§ŽQ6=YÚHúóVÓÀ±Ûx_ZÑ"»ioõhn Õôãæ–iW˜ðtº]¤–u…”Žíía…˜ ( ½qñx ù|}á'¾ˆ4²KäÜ**™7Ëž¾¸"»x#0ÃDî(ФúàV?‰ü1câ{Xc–im®ífÙÝÂq$ãØ÷ë ãÂ:Õ"6:·‹Lšsü³¥µ²Ç,ÉÝK†8Ï|(âµõ¯Øjš^™¤ÛIö;m>îÒâA€ð¸=iëZbkZ^£¥¼†%½µ–ܺŽWz‘‘ô¬ˆ¼ŸmðÍÝÍëÌ4+&‚(Ê€FP¾aç®Njÿ‰4 oiÍa4Ï ¢ž)£Æøž6È+G·N†oÃöúáÒ óȇMÔa¾B˜ùÚ0xlއ=±V5­* sL¾ÒçwŽ+¸Z&tÆåÏqFG¸5ÎÁà}R¡„x»XòáUDPaˆýk¦Ó,¥Ó­"µ’òkÇBÄÏpAvÉ'œtt¨o4[ÝOKÕeiÆš.!N‰”Ü;ôâ«ø—Âú‹,E†«4K"ÈŒ‡Œ;ƒî855¾¥[ê²ë(¬od´ŽÓs1!cCvÉëëNÕ4M3Xk»F/cv—P21]}ÇcÜw¥µÑ4«K­Vî(Ϫ:5Öæ$>ÅÚ8<J¥iàÿ YhsøvÞØ¦›2Ȳ fÉß׿ÎséÍ.«á ëOa-ý©y,#híÙdu(¬#åaœã¾jü á(çŠåm¤Å$r!ódáäqºµ­´.ÒöÿQ‚—wþWÚdÉýç”0¹ÇРǵðìÀXtÄ/–ùP³Y—8` Ç8ǵlO¤iWÖšœÖ±½õ u‚r>t 0@>†¢°ðþƒ¦^^ßÙYÇ Õó︑s™\žÜûV•QEQEQEQEQEQEQEQEQEQEQ_ÿÑ÷ú(¢Š(¢Š(¢Š(¢ŠäüO»µá½[MÓZý-MÔ7ŽªÈ³|Ä9«~Óu :O›¸„bï[¸¹‡ñº®:w®þíZ} 8d·¯ìuËFÞ ˆh¦S#a[ƒ€Ê}*Ö•câ+ÍZÊwðý–‰cj^I±å<·FR«ò€y'95ÕêÚzjÚ}îžÒ¼Bæ‹ÌŒá“#¨>¢¹;9~.iö°é­§é×rÃu‚°ºm-»×ŸZrx/R±Òtágukv7òjWR"’Is½… à}«vž9Ôµ½ÖŒ6[KvV²³‰žN7HÅPaGÝ=j]/ÃúŸƒÆ+EöÏìéí·);88çãŸJ¬ÞÖì¢Ð/4»ˆTÓtØì'Iƒ®#ÀÈÈä`Œ©ÇÔTÖúˆ5EÕÿá&¼GŠúÙí#³µÈŠÛ«e¹.}Hãµe]xcâî‘'‡¦ÕlE’@!K¡ùÒª}Ðã;FˆŒûc5«áÝv;½3UÑ®­×Pµ°û Ër¬cš<ƒü$Aj½§ƒõuâ+ÛýU.'ÖtåµùbÚ°¬8ŽTdc'=yæ­\øZôÚèMc¨ mSH·X#œÇ¹%]¡Y]2ÖÀ<0 ÷©ôM\·½ŸTÖµ_¶]É‚8¡C¼Iœ¨YòÄõ$“Ú§Õ4#ªjš-ô—·Ód–o³íâIaXœÿn)|O §‰4›4ÎmÝÙ)ÔÑ:CjýÝ”öSØÝþò+ˆ{n 0k‘—ÀZî›&¨ø’ê}8CåA"#(_»½€ËmãÐâ¶ì|<Ö×Ö:Íô—7vÚY°f*ª²eƒ Ž*VðýŒšž¡¨ÌÍ'Û¬c³–ÆÍŠN{gœú×?qðâ+»¥\kúœšbŒAnY?w»ólÜÁ{$}k´Š5†8â\•D 3ès“ø+Ožë\¯nÖ bŠâÙ\Ã0ÁuÎïÄÖŽ¡áí3SÑŽ…rd6f¢;[ˆÈ#ŸÃš‹YðÆŸ¬ËѸº´¼… iqi!GØz©êúƒRè~Ò|= ÑY+—¸”Íq4¬ZIœõfcÉ?çýkBÒµût·¾F"9±IxÜte`A«iдf¼–$’{‹Å q=Ë´’H£øIlü¾Ã©Zü?ð¤±:C3à žd6ÒM#A…b,Pc·ËÅRÕü1»ã›P²y,#ÐÂÇp¤©Ž7#k) èG½§hšG†­.ΕdÅßtÒlË;Ýœä“Ðe«3ºeë_ë!¿²6W:“Ƒ۹RñÅÀÜT‘–êpOJ꫟ƒÀÞ ¶Ô©“]‰ ªÀ+Ÿâ  û…gXð¿†5÷ŽMSN†æHÔª;˜Û#ÙÅYþÆÑ €ÒÍŒOT[ì^Èùq޼ýjÄÖ–w/o$ð¤’[ÉæBÌ1¶ÊúR;¹†ÍЄÂ%Ú7l'%s×çÏìÝ,Ù8ÚCö"žY·Ú<½¾›zcð©d·¶”D$‰Dêñ†íeèG¡«ol†R±"™Žéç8Ç>¼qÍE¦CnÖ‘ZB–ÌIh•!Ï\ŒcŸ¥:ÖÎÊÆ?&ÒÞ8"É;"P«“ì1Oò-üÏ7Ë_3ßœ}j@¤*…ƒ‡CÜQ…Îp3ëKEQEQEQERpzu¥¢ŠŽiííÔ<ò¤jYP Xà{“Ò’;›Y¤š¦G–¢TV‘‘¸vÈçš– [Ûº’Ån#7qIJ¼!†õF8 G\*`CAÈ=¥¬é5ý+{«¹/¡[{[Ÿ³O!a¶9rÖ>¹ VU-WVÓtK9/õ |«hÚ5gÚÇØ(áA=O¥]¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢“ äg§ZZ(¢£YíÞI!I¥‹i‘]Ý2;gµIECå”ÓÜ[Ef'$œÕ9tÙ&¼ðÿ„o5iol1{<î‡b?$NÊrvçæägÕ»›;? x‹JºE¼2øn{ki&8XågV Ià6ÌÈô­x5] Tø‰1Ón#¡ðܱO$D-æ©ÆG×­eøx¬šwÂíÅX«Ü Žv£à¥uÉj+ ÀFW¯÷ªÚSiPjz2x"ûX!ï![Ë ÄÆÞ q÷÷ù«ò‘Û ×¥?U°ÕÿáñÜv¶SÉtþ)’xbòØ™›ÊŒr;ägëZÚö¶Þ6°‹Ã¶:mü7wW6ßl7:%¢E"³’ì6“ÆilÔ7¾Õu«Oˆºj@ñ=æ¥o=£H ¤ÞZF@ Ç® +%´ j¿g°Óü¨}¾Y£K¡~× on ‚åŸÌÃc¶ÒrkÓ¶¡Mq4m0vÓÚñ'ÀòØ+…*s¸dÇCÖ©xÛH¿Ö´;ˆ4ð¦ú`º¶W8V’ úãÉø§SñoŠ´û _@WQ³–ôÝlP‹€Ÿ1ÝÏ9ØUíOº¶±'Ä b¢õ1§½ŒÎ~Vxcq“€ÀÅbü@Õ|q}áÛ[½ Xÿl¸’dd|H¼B³Çx.uðé:˜ñö¦Ð‘c7‡ííV\ŽdY•ÆsÐç¦+‘¶Ð+->÷\’Í’Öc"I ¿3sœ ­kûN×Å7~Ôl?´.ì!û~ŸvNYc$$«·,1ÈéƒX:&•­j·ß­n/ º¼½³·¶i£C­,}ã„g¿µuºÏ‡5CÁÍáøe‰o>Áo‘³³|{yéœqé],jʈ§’N¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÔ÷ú(¢Š(¢Š(¢Š(¢Šã|Wtš6¿áÍnê)NŸ w–÷FŒþI ¥‚‚@8ëƒT,õkgÅ×—ölïjž–+ygFHî\HaÀ$ã‘êpEs­˜±Dþ·ÕôŸÉ4déÈ%ò÷ þ``còúò0éé]öŸ¨É?Äà-%Åæ™n `&anÀ„õ ñÅ[ñ5ž§?ÃÙ-`¶–KßìË0!@wî]¹ë‘ÞŸ3êž×µ=HiwWÖ:´¬Íh<2»pS á‡9ÏÝ_Þx‹Å³ÞÚ›Y_û=– ²&ÆÛ»#“ÏwÇPjMi¤^YYËxÚv±ky$0àÈѦAÚ <Ó´K{öñ¹©Kg$÷–:iˆÉŒä+nR<¯zǿ𮩬/Žm%„GõåœöLäm”ÄŠ{rFEgÇ Û]ÏcÃë-:q2««¨`1ÄŠ~o/cnb‡ê}+fÿBÖ®.|zÉj6jV‘YËûÖHØ׌Žq]f› ¶ö6PÊ1$VÑ#B\׋4FóTѯ×LV±¶YÒ[9@F|b@å$tç׊­¥i~'_®§u¥[Zé÷:[YypH¥­‚¶á¿€ïöx­Q·Òþ"Ûxzã‘éö€%´ÖÑj 7Èñœã÷{w ãžç'½ÛÅv«à›Û+[{‹­&ÌÛ]Á$¥@ó#U%[kgiœÖ߇ô­CM½ñ×;<«íOí6åNIC›ƒ‘ïXËàíXX^(–õüCq«X¿,˜fádæ\ƒŽž¦¯X[øêûQµ¸Õ×N±µ,Æ G.×,Fæd\(ëϽ]ðÞy¤lý¡‘¾Û¬]^dz<$˜À9ïÅbŸëŸðŒ6”·ë¦÷Ð?ÍåçÏ2(n3Ó®+Fê7Z”÷ú³@ëw¢%…ÄQnÆýĶÜÿ Žõ”<1ã×±Oɬ[¦ŽbQ«‹Æ…z.s´q‘Ûµ_“ÃÞ$±Õõ ýöÖ;}A %ÌlÍD»C) 21Øþu^ÃÁš¤^&Ó®õE¹‡YâS%Yd@¬NÜp0Z‘|)â°ÑÚ]^4×4­ËÜQ~íÐ¥2Ü‚:á—ž˜«zO‡ut¼ŸR×µO·ÜInm’Ð¥¼hÝp››$÷$“Ž+9|­Gcq¢Åâ #Ñ[rÉL±ÆƒÌ=W>ÙÇ®£GÓ—HÓ4ý5d2-´P#¶.3z½ð–¦//¯4=rm3ûAÕ¡`0Y7•ˆëÉúQ'tÅÓôÛK«‹K­:i'·¼B ¾d™Þ_ ‚?0Å[Ò|5-éÕ5=F]GQòL #ªªD‡’žä’k=¼nöj÷Öú<ììútL¢?œ’À6ÝáNy…Z—Áz\š>™¥%ÅÄRi›ZÎñ ¢p1¸cpA#µK£øNÓK»“R¹¼¹Ôu‡È7L $}J¨Pª<œjΟáÝ7MÐ×@¤6ko,fùöÉœóëÏ¥Pºð>=¾77v“i6âÚÚæÞM²ùx«AÀíÖ§xAÒõHµ›y.ø…âšY%f7¿ç¦sœvéNR? ü$ësnæí´ùäy>Àg³£6rUõ9@Éü¥³Óôý×L†+³²°·!¶+¶çg *ä8ñ®¢=3J…-cŠÒKV-nª€‰ÎJñÆrzTÍolòÅ;Ä4A„n@Ü¡ºàõïD6öÖûÄ1$~d#ìnfêN;žõ%7Ë‹›°y›vîÇ8ôÍ*ª&B¨$œzšÃÔ´+‹ïxWYC¦Çz²#¹¼õc·ç5¶‰c¡A9àRí\îÀÝëÞ–Š(¢Š*gf.÷’¿j0ˆL¸ù¶œgÓ5=[P°²Õ,îl/#ó-®bh¥L‘•aÏ#šæ­þéößmÔu-BÚÖD’[¹ËD¬Ÿt•gomÄ×]E1æ‚3‡‘Tã8$R¤‘J7Fêëê§5—yá­PÔí5{»s-å _!™›jÎÜíÈÉç­j(¬}gÂÞñG&«§Åq,Kµ$9£Ð2qíœUÍ3IÒ4[e³Ó-"µ··—€2z“Žæ®QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š+ VÐ5+ËÁ§kW:|æ   ñ2ƒœìnvÈÇãSh:¶„—$O-ÕÝܾuÕÌäo•€ÀèZôQEQE×’8öï`»˜*äõ'°§U_í-+.¿lƒrL°°Þ¼;tSÏSØu©RæÖIe&Fš¦XÃÉ»¦GQžÙ©h¢Šo™ÿ+xó6îÛžqëJ‚ÃP°ÔíÖêÊešgUuèJœÈÕš(¢«jÖúmÍõÆã ¼M+ìRÍ…8“SC*Or¦vÈŠã ƒ‚;ƒO¢Š(¢Š++JÖãÕ/5›5¢m2ímÙ˜ÞenÜ÷­B@“€:“HŽ’ÈÁ”ô ñN¨¡¹´¸, ™$(pÛ}qUt«»û‹3>£ Vó,³Xä¡UˆvQÉô©-õ]ðk{o0/°äS–ôàõ¦Ük:˜-s¨[BÌdÉ"Œ0ê9=EXûM©ƒí"dû>Ï3ÍÜ6íÆsž˜ªzn½áí`ºéš•­Û Ë$V#ë‚jßøSN¼M>÷V´‚ññ¶%Püôàžõƒõ{Ý{B±Ô¯5¸›Í#/ÊåxŸOSTüq¯jú-•œ*G&¯¨Ý¥µ¢H2¾¬HÈàëÞ´|-­/ˆtM;TÀY'„yÈ?‚Eá×ð`jŒÿ<mq5´ÚÄ $%怠änÆÜLçÚ¬_øÏÂ\6sÞêQÃå±¹¶,÷±ñÊŒg<Œ¾Ô·ž/ðÍ…­…Ô÷,þ!-¬K´²©ÈT¿¯ËÇzµ¥kú·m-ÞŸt²C²KU£eêX÷²aø…àùîb·$sH"†æHd[yXô )P‡=¾nj}GƾÓut‡iæÔ£HßìÐBîì¡Àîrîy¬Ññ;ÂRÂf´K뵉K]-ä&ÔAóFÓÁã®9Æ1[:‡Š´ ?N³ÔÞf– ï,Y¬*Yî ƒ*G$‘ùwÅ3Fñ^—¬\Éaä]Y_¤^wÙo#)#GœnQÈ#_”t5×OâÍnöóPµð挺„zt¦ ™åœD†UûÈŸ+d¯|íïUï~!Áo Å¬Á¦Í,ÃTM6âȰC.í¬½Á#·<är+#ÅšÏÄTO Iý™¤³ëР‰nÛæÈ;RB©­Îî[Íñž_ˆ*|ago"ÉákrâiQeó›!p„úàà~&/ƒdñÞšž D³‚; Ÿí8´I8?êÂÆÁI`y$/NõÓO¯|AŸûNòËK³µ°±žhÑu‘e¹XººápªßÂNïZOøN.ÛÁºªZ¢išì«ÁrwÁ$‹û°1Æ  5­ý»y7Š°í£­môósy)Îäwl"ŽÜŒ“žÕ¿EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÖ÷ú(¢Š(¢Š(¢Š(¢ŠäüY⻯ßè¶ðÚÏ4W·Ú<¨YË&Ó…BùóƒŽxíYÐøÎK-Ä–SÃ|RKGµµ·‡sEB¥ð€7rÙÍtV¾+Ð.´›hÌÐÚÛ4‰p&R¯ ¡ÁV^»³ÛœöÎjµ¿Œôù.l­®ìo¬Eólµ–ê-©#‹Nö k£wHÕØ*¨%‰è®:Oˆv1º‹i7ãC,öžÔò°Níßæl÷ÙÒ´o¼R#ÔKÒôùõ+¨âYgòJ„…Xew32Ý€ÏáUæñΟ…¨ëMgpN™`»³p±¹`0yÛÜCGz©sãË묾ÙáÛØíµò¬]Y É!UdÎWw¹ã¾+GJñ5íΡq¤êšSé÷Ého"_1]eˆq‚PGâkˆÚ”úø‘<;7öZãÎc2o6Ö(½À>¥sZøÃVŽçGþÐÑÖÃVœAÆUgGq” nŒØ¬wP¸ƒGñÓh¶Ÿg¹‚ôý¦o=ƒcRdNõÍ7WÕ¾ ð‹‹;h¤žíÔº}²±FÂÈ|¡ò‘ÉàóÛ½t7:ïˆ.µô½Æ $²XíÅð‰ÆB&ÐK69èý*¿ü&ÒE¥êÜiìšµ•âXµŠ¸>dÒ³ccî¾r QÆxâ°¼M? žMvÆÇÈéî¯jîLL…`ËÏ^ Ž+Ðuí±Üÿg˜…ß–|¯;;3ïŽ*óÉq¥ø;E»—OÓ¦KbÌ ØrJF÷$ó =jé­¯m´¿xêþ|íìôéŸÉ ¥?‰”Öâ5ôÔÝæˆÉè%ß‚àÓäŠç5 ¯hG^¾¾¶º†’]Ø$;B!#w–û‰%züÀçÚ k]^oˆ)ê-NóM±²µ•aÓ¶Í$Ù;äd`và|£8<õ¬Énõ«_øÚáÕ­ô¨mb›O’ûrË?}ËnÚ:›#5£â[øsHÓõÛK«·ÕínlL×o3–¸ à0p[nÓž˜ãð­ô?ÅÞ#ñöÈyí´·‚ÎÖÔ»MÑîie›8°Ÿtèô­OÆVQM$±Å©Â¥bÌËœ“·§áV|x4‹™t[+èï/KÏ,©¥Ú€EæÅÿ–™*6'^X úÖG…-ŸLñœÖ°h£D³¹Ñsh’)Vt”åP•S‚Gu>7Ó®µmîÆÖê+y§xULÌU$ùÁòØŽpÿwZä´´ÒôÏhm¨ø^]ùÄ–vÓYº5µÆWîI³™\¯nµ›jO èzMÀÆ}ã ¸.ÕxYJ콘ŸZÝñ.á½7Ä> »±³‚Úíµ(¬(zc©»ØûÔžðÿ‡®õ?Þ\ØA=Ãk“ÀZD òSŽsÔ“ŸZåÜ]Åá}#I³µŽk?øKn,Œ9Hš5‘Ê£œ7È[îŸLVå݈“[ðÅÅÆŸ¢iSEz#‰ ¸6X±óÆ«ä¦F9Æp1W¼ g¢ê^¿ŸR¶‰î.ïuí_9FL‚F>}1è*çÂï,xCLXÎcWºU>ÂVÅfjxZñ»É£Ek,^³òXÝ3Y®FI] ä…9Æ*އ'ˆôi¼ká«…†=JæÒãXÓ…±m„Ì`»°F™«óÁñü-PòÛýèÂ=¤Œ›1×~ÿÇ5—µÆ­ð¾I”9_NñƒÑXE?†MM©ÿo/ïÓQ³±š}ßì¯y “z+6õG‚-×+›inÊ+,/(7nȰWqéëÍtš[iÚ·Œlå‹^¸Õî4Ë;†/CöhV`×tä³uÓµXð!Y~©P2Ðj@ã¹óV z–—ៅº½ô¾U´‰f`pá` ÅzÌrG4i,l7PÊᡯ¶ž94;›D’çQðߊ´olQIij“ÀïÁÈÁí]ˆ‡®3ÅIgá‹ã Ïy¦h‘é·‹«A©ZY³·™2Á÷DÌÌØfà3Þ§Öõ?ø”è gáíBÞ+}nÊ{·¹TRœ đܑÇèl2¬=A¯:·Ð5ÿøB4 8Ùºß[jVÒÉ +”Q9$žqÂóÔÖ¼¾»Ô5o­Äf;=WN³·†lƒ–Upp3Ÿ”‘Ô ÂM]û Z4>Óá½TŠ5 -k…Æ\/ß$õ¨ç½v²j3XjšN–ªÖ÷6ó5X,Â1÷}ÁãOñ‘ý»¤Þé¢O-¦A±ÿºêC)üÅsW°øûĶ-¡ê:\60ËåÇwz³†ƒ¼´·A»­ý;]¶ñ>™ªéÖ±\Z=ö}ÖçÚЦýÛÇ?OåV|/£êV%…ï—æ›‹¦_,’6ÈäŽÃÖ± ðž¿k£ølÛÉj5ÌùdÜa•$Èd'cot­-ÓÆ—‘Ô5–¶³¶ŽŽ+FÞ›øärªxìõwÂúEÖ‡¥Garñ¼‰=Ì™;q$ŒÃ¯|kJð ³Ô‡âËOì©ô}J!%¦œ–sÚ܆0M´ 8 A ~xâ¡·ðT·0k¬\£^êí w´B‹“þ¯fKTòIëéOMÆ—³Ø®±­ÄÖV’¤¬¶q4orÈr¾col/¨ŸÒº²B1\?ü!ž.rè£ÄÅ´i7¡ó Ýr"cÊy¥ÈéÆJZwÞ•n­ïôó¦ÝÅf–OòŽXcû”‘Êö ƒUÇ–m#\°¿Õ'º½Ö—WŒ# >èUì?Z×Öô5½+û*Yž$ÝoLnýÓïÇ8ª:Ÿ….gÔäÕôZm.îâ$ŠïËDtSî’¬>ðè¥MᯠÚxeµ'†îâåïçYåk†·‚rêr0)Úÿ†b×&°¼ŠúæÂúÄÉä\[È 0!ƒ)ÜU+ZØêöºïö­üÚŒqI Ä“:‘pü,»p<€+k[ÑtßXM¦êÍ¥NTÊÊr¬¤r#"²´ïÙÙßZêZ•þ£5 o³ Éw,e† ±ÆMSÖô-#Iðüö)£Üj¶S_µÅÄ1·ïSÍrÌéÐåO@>õÍéšf‘¬xƒH¸Ò,5GS îµLL ª) yÜòNNd“^§i:~–÷òZ¡V¾»{¹òIÌŒ$g ãµT_ xutëÝ%­¼Ë+Ùæžx݉ËÊÛ‰œŽz`Œvªú?‚¼9¢Þ B¸žñc1Ç5ÜÒJÑ©ê{6? mï€ü¨_K¨ÜY:v :¤’,sÐÈŠÁ[ñSZú^•¦h¶‘ØiÐ-c.R5ÎâIëžæ‹ +LÒÍÙ²b7w/s9ËÈýXç=i·:NŸ=ä:ŸÙã:•´2Åo;”ÔÁ¯7¸ÑuËÕºþ+}vé%†MQ^/!L€ƒ"òdÎ9ÆÜûסiº™§Á¤'’’O¦Y­¬²ê»@lÛ±ÍI«hZ»A«XAy6åYÐ0Sê2*k ;LÒ­ÒÓOµŠÚÙ>ìP¨U€ªxgÂÖ·­©[é6‘ß1$Α(rO|ã9­·¶YžábA4Ѝò70^€ž¸©"·µ‡Íò¢Dó\É&Ðö=Iõ&ZYˆ>Ê Œ[íÙåm1鎘¤µ²°°É³·ŠÞ,çdJgè©Q#v"…QžãšG†Fñ« ÇÊ@Çú@ˆ¥˜(º‘Þ€ª¹À<œRÑEQEVV¿ Ûø†ÔYÜ]]AìÈ-¤(dR0Uˆê§¿Jз··´‚h$0Ʊƃ¢ªŒ*Z(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š‚îÊÃPˆÁyoÄ$†)*†\އ5"C EŒqª–À;@ÀÀü©V8бU \îl§ÔÔqYÙ@ï$0G¹Ë2¨¾¤TÔÁ C0D¤`¾qõ§2£Œ2†y¥¢Š(¢Š(¢Š(¢šcˆ¸”¢ùŠ¥CcQŸCN¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ªÑj:d÷3YEu ÝB¡¥…\@¼3‘øÕš¤úÆÔÞœŠ÷€°Ì ˸ôÈçžÕj)bž8扃Ç"‡F^ŒB)õRãSÓmnì¬'RêûÍû4g¬žXËcè*Ý™­kú7‡ ŽãQ˜¢Ë Š%DgyöUPXŸ ­$euW\á€##ŸjZ(¢Š£§j_Ú~Ÿd¸·û%ÛÛætÚ%ÚÞœœ©ÏнEQÕoî4ëa<S^9š(ü¨q¸` rG ÔÕê)2~”µÏo¬o"«¿ÝRFOÐS™Ñ~óÁ<ŸJŠÚòÆõ –—Ï%KFÁ†G¸Ígë:þŸ¦Zê%.-ÞúÖÊ{„¶g›bg88ô«¡&«¤ézŒˆK»8'd^Š]A }*†‡®Ýjwþ#´¸Ž8ãÒï–ÙIË)Œ6[=ù­/í]ÙD^Àl@$Üo_/àüÙÇ_zK×4r7—JÔ-ïÀêÛO¾ ª·Þ/ðv™wö íbÎ ¼¨1I"†鑞3©kºäi_Ák笙‡Œ¶3è95‹â ø„̺N¡ËÃ1!”‡×­+››[8%¹¹•"‚$/$Ž@UQÔ’k Oñß‚u[«{+=Mâà ²ºù˜þéeþ×E\­ÇÄoÚÜ4ß6Ä›È{…ŠC>q´Ê 9ÿj¯ë+дYà´¸yf¼ ‘ÛÛFòHPÔ…÷8¦Gã M£Ýë‰rÆÊÏp¹ùI/Ud#p#ÓF?ˆ¾‘í˜ý©,ndX¡¿’[gfàä§¡ zر×ôËýOUÒ"Þ·šo“ç«®Œ©SÜS´­rÇX›SŠÕdÆŸvm%vVu§<ã<ô®7ÄZæ£74cÕã´†/=þÆVvܸ,ÙÉs†éÏc[SøâÛí7iÚN¡©Cc+ÃuqjŠcת̥ˆï´6)u/xwOÒt­i{»=Ju‚n™mÄ‚¤ƒœŒcÏjÜÒ¯®u8®®,f²‘Ë~â}»Ô¥‡=zÕÚ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÔ÷ú(¢Š(¢Š(¢Š(¢ŠÂñOˆfðí­¤ðÙÉ®¯¡³Ž á>i3‚IÒ²ï¼_â]}«øiáÓãaçÍÂHÑ) nØ’=qùVÌêÜk¤$9Œi±_$á¸`ìWÇãœþ«æÃ¿ÊóÌÆvägò¤ž{{hÚiåH¢Q–w õ&ˆg·¹e‚D–6èÈAñz¦“-ËÙG{Ý'Þ…]Kªç?¥-楥éÁúîus…2º®ãí’*x¥ŠdIbuxÝC+)È`{ƒUîõM'O;o/ ¼¶ ]Tí^§“ÐU{ÏøoO³ƒP¼Ô­ ³U¡šI,¹I<çÚ¬ÙjZf£j·¶WQOjÀ‘4l `uäqÅfZxÏÁ·÷Igk«[K<²0­Äè§¡?BjmgÄþðù…5Kä‚I1¦ v©  œ\b³ü/â#¯j>!Xn¢¹°¶žØZ™1Žã5\œ©-É=†NÜU/øXí-‚ëVÚ äš*ö‹¦(­fÄd傞 œf·5Ig=­†›búŽ¡s"FUTˆ¹àÂIíUm¼^Ͷ—ºt–šž“h×RÚ;©G´•dqÁéÁê+5üw®¦™¾ÞuÑÙ"’IuóV6Æ\  ¼ â“QÕsØ‘Žy­ÍwÅšu¶g=­œšö§s"[Ç7‘(Ë3±Ã£®ÉÆ1L¶×|WgªÁ£jédòjóµ…Õ¶ý‚X—%$RsÓAä ät+ïxsAñ~»9§‹U¸VÛîi|лnÉ^~QŽ=Mw¾.Öµ ÂÒîÑc-&£g›Á#Ë‘Àl`ŽqÓùW+|TÞ|W\(#N´?QövëZ6Zæ§§]x&ÝÚ?ì}WJŽòüËp±†_›=p:Ö®‘¬jz¯ˆõø×û+MXmTmåîÜç?ìŒ VOŽW}Á‰¥IW=ò$’¦à€Æ7dr$r9ÅMÿ‰¼7­éšv±¨®¥aªG:Ç9‰Qá–%ÜAÛÁVÇÍsCÆcV‚mLxîËK¹-)¶Óˆ‡j…beß—%€çqžI}y{âäð&·©5Ûå0…Q–)@mÎ…•¹$mç#³[¶ÿÛþ,Ôµ„X¸ÓôÝ*ëì1 P‚IæEÝÙ•¸ð÷ô¬½KÄ>-µðÿˆí èþØÑµxíP9$*T²àŒpØLU¯^j~Ò¬í.µéÞçUÔÜj &Ý1—ò‘TÓ 0ØÎsT´¯ÚYkÚE®®ê­¥ì܈äÆHÊȎѦ<0Éí]çˆ[[]S:(S²}”}üq׌úgŒ×œé:®–5M4ñ­¦êír‹se«‰ ]Ã*†Â?ÂU¿Vîu½rÖÃűÛ^:ÜËâ¥Óí¦–û2Ì|¹è'³Iâ  ÛéšV±¨ÆN³`—¢k—arÇ'$àç®Ý ŒŒU«M?ø§Æj·—rX[Oh±Y¬ò,až K¬?œu8Ï5‹4º—„µÛ#y<«¥x²;KyF2DÈT3“Œã“Ò¶î´=Çšµ¾¡,ïbšE£µªÈëŒY€,Œãœ{Ö-Ì·^·ñ–…¦ÝMœzž“olììÍl—¸°’H·"2Ñ/®áÑôÛeyZÎí-ÜxùLQŒ#`ç5•àøüYwáf”Yhmtnä¿–îI7ÈåÛy— €GÔ⡆ÏOTøKoªÜÁ}Ïz‘N¹17Ëû  €HP29ÅuÚòÛø8Ú…Æ+ÿ´mûÆÜ'±Ûv1žõÇ÷v6~½7–+}ÒAìUž@{Š ®?ħĶ÷~]ÔtÅݯÙ{+8˜.rw³“µ}u¯G×ö]'TŽË?k{+…ƒw”;Zã4­_ÀÖŸìÚÿÉ“MNŽ›a‚Í&0É· —-øçš_ Ýé¶,ñ$7›lç»¶Óe°Ið¬m’,m\Ÿàläy¬nKmBÏâ¶£`êúsÚ[Ä%C”’hcùÊ‘ÁÇâµüž@Èì+kTò/®¼1«¦ÜjúÜ:_œöc6ÊÎid-òõ\ô¦xzÒh5_Úµ´Zsé–ÒùpÈ @ή ‡T7sAÍe¾Ÿa§{Â𥥌°ÈºÎ—"îRåvÈWÁþ.[­kÛ-î£âoÏ&‡o¨Ém4VÑ=Ī<¨öd*«+`6rHÆsíZÞ´»°]vÙŬVË©»Akm7˜-w(,‡å]¼óŒqšƒÄ:fŸ©x×à {MYÞȨàܘÆAôÎ~¸ªWŸÛÏã{Ô±±±¸k]6Ô[ É|¨˜ÍT~§ƒ÷zš¬ <øîmYmÎK[qya§Èûƒ¸#æá6—ž}ÍCâˆüEo é«uk¦XÙEy§ýšÖ&f•J¸Àv®@ç ‡ë]ˆ"oøµ®T}±a°[rÝ~ϰýßmùϽA௰/ˆÜ —ò®‹ÅzLºæ…©é±æÏç¡e9üEaÂ_¯_Cgc¥è—pêòòÅ.eµiâdYáb2z#>µÊKáë2i¶Úþ§e.cuÑ6ð°šá¢9]ʼn ÏÞÚ9ö¦k^Ñ´ýŲk·Îº~¥¨-÷› 6ûSò…#ŽU†sŒc¯zæ5ĺÔÛÃÖÒøÂ=féµ[6µ¶´Ž0V¤—abB®{¨éV€tÝcÄ¯Ú ŸÚÒZ¸ò¼”Û×<ç¯j˺ð,WZv¹§µûªêºÀԙ Çó)Ø9çîõã¯J׃CòuûÝsíý¦Æ _' å±9Ͼk_ðö‰emâíSSK«ëMY-MÅ´ —ŒB¡AŒ ½íŠâ5tOË£Yiž&ÔuÛØµ+I …ÀÙk8.òí9 É<ñÖ½¤€x5ÅEðæÒ8fÓŽ³¨a»9]5]U\ä®ð¢M¾ÛÅ\Ñü §éØ?é×WCIgæ•á&P»Nd(V¼š„ºÄãû\6rZ(ÏɱØ1ÈÇ^=kŸ“ᯆäK‹Ss~º\ìÌÚrÎÂÝKœ(ä óØÏjê4Í>×I±³Ó­C {H#‚ Ç'j š‚ßBÒm§Õ®"Ϫº½ØrJ¾Ô Œ1Š¢|á—Ñ­ô-Ýìm›u¸i|L £çp#<`ð8§h^Ð|?<×vË4׳F±Éuu+É)U軜œaŠ«}ð÷ÁZÍÅÕÅ‹få÷ÜG²,S7«¢°R}rµGÅÞMkSð|MK&Ò{¥ºL‘!„„ã#¡Æ1ÐÖÞ‰á/ øvI¦Òì–)¦P¯+33•ç,qíšÓ½²±Ô­¦³½…'¶™ IŒ«qX|<ðV׋£@a¸Ø$Ý’Ä)Èù‰,=0Etˆ‰ª ¨ ìdÂ%àÿííoì{?í ûþÑå.ýÞ¹Ç_z±ªè>×Q#Õ´ë{ÅŒ’‚tVÛŸLŠ¡â?­ç…µ] I‚<û`·‰@XÔ°àp8…YÓ¼?¤Zý’îM>ÔjQÀŠ÷ ïÝ´Ãc<Ög‰´=Äw¶ TðüW]\’XÍ1ˆäG·B“ŒÝ;WUM1Æ]d* ¨ 69õæ™%­œÎ’K o$g(Ì •ú…8ÈÎE-QEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÖ÷ú(¢Š(¢Š(¢Š(¢ŠÈñƒˆ ³îm}Ød,c=9ìk^²ÿ°íµ&¶Îæi4ñbÑl(¶qŒç·\cµ`¿Ã»&„éßÚÚ€ÐÛ9Ó¯•´œìÝ·ÌÙí¿¥ij^²½¹²½´»¹Ó®m-þÌhÀ‡9ØÊCn8¨l¼ ¢Xß\߬×R½å©·½I¤,—@ñ™œqÁª o‡ú<ä¿Ô., thlf˜˜oÝq’`I{Xð–™«Üýµnnìo1“ÙJQ¤AÑ[¨8í‘‘ëWô]JðýšXéÐùp†gl’Yݺ³É'¹4é´>ãQ³ÕdF7v‘KM¸à,˜Ý‘Ó·¥UÖü1¡kí·±:Ü@Šâ 9P :lLÓì¼5áë >}. 5û%Àq:¹,fÜ0K³I>äÖ\¼ InúwŸ¦À'’G1®s„,Ĩì‘Wu?xWX[E¿±YZÒ1/¹ƒªŽÛÁ GÔš·¥èZ‹ç2Æ_?g›å(¶ ý)ú¶£k¶ßcÕm#º·ÞËd÷§Úéš]Œ’Íkk2Ì‘G#"€Yb@Ý cèÚ$©y–0™zÚÖÒÊ·µ…!…8Ô_ S/,4íF1 í´W U 2;àƒK¯ü{ÛÇÈäP>QÐqØS#Ót¸®î;HRåþüÊŠ¾­Œþµ,öö·IåÜD’¦sµÀ#ò5"ª*„U@À¥5"†1„EQœàôú(¢Š(¢Š(¢Š(¬oÃZ'ˆZÐêi$±Û>õˆH뜃ó¨ 0 nµè¢Š(¢Š(¢‘•X` ‘‚CT¬´mMw’ÃO¶¶’A‡hcU-õ ½ESUI* ×­:Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š)23ŒóC2',ÀgŽh$§ždD9¸C†ç§Ö±®õõ‡WÐôè9¡Ô¾Ùºeõf€?QŠÑ—RÒ -f¼‚;‰1²&uß@NjÕQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÐ÷ú(¢Š(¢Š(¢Š(¢ŠåüowªiV¶ťäнôKŒI¯Ÿ÷zŽ•KX×n“_šKyÜéú‹qwmòÍ$ƒäFú(,>µZÄW~þÛ^ǬOj/Ô«"6+¸'—‚»CžO\Ôº&¹«ëú ÃÈñÃ{áµ=¸cåù†EÉǨ襥梚÷Š`K™„Iáq4HíGËüËèÞõwÀºDi–­Þ¡u{{yawžF*ªF@UÎ2;œd÷5[Ævw:–µá;½¹µ‚âKåœÛÈÊ]D`í8=À#=»`óY~!û ¾¯aá—±Ô®´{M/í?f³ÞÆWw*<ÆÜªã›©öª–ú†¯áËͤéú•¦‘÷Ñê‹{…8Âeœí î#8â¶ÏtŸìËKȵ muhü›–ÕLŒ]ŸÅ²ÁJ·LtÁ¦iš.‘ã KÄúì yö=NK XeÉH 9U鹉É=z`Ö«_ø“CHÖZv¹i ¬…‰h‘ÙhbIÊÇ5·¬øB´¹ðφ µX´‹ûˉîãÿHxcʉS¸õÉ9Å6÷ÃÚ‹ã?Üi–±Z›~’GÚ­²#ƒ´qžpN9ü+çBžÒ cíÞ·ñŸwsspu+YSí*¤ú0ûÉŒ ¯Ž:W¤è7WzF›=œ’Ilö‘ž_¾Wo¿Úõ÷­ (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š)0¹ Ž@ ­-QEQEQEQEQ_ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š¥«¦›6{¡"Çi4G+9`sÉö®CáÆ‡ŸÜ\j$Ü>²£{?W·TƱQŸÆ¤O øæ-=¼>šÕ¿öO–`K†‰ÒÂxÙÛ2±ÿ«Ú‡…oaŸE¼ðíÌ6sé–¦ÉRt/|§NF8 ýj+êñ^ë:þ±ö›SNû+ˆ*ÄÜŒ Ü~QØNrIæº Nm#JÓtÖ“Í6vÀ_ݱ@Î9ëPjZ)Ô5=Q˜ÿ³%¸/n|Á*mÆsÆ:÷¨5¿K©]Újvòiú² ›[9n.nĆÞ2~i6 ¶Ñß­Y¢Š(¢Š(¢ŠBB‚Äà’Ojä[ÇRÎ^]'ÃúŽ¥bŒAº„ G©@Î¥‡ÐVî…®éž"±KûcbŽ®0ñºõV¡¥Yš~±ýþ­b°²6,Q³’0û×wOzÓ¤àçD’9(Á€885[U¼};N¿½HÄmm,Ê„à1E'ÁÆ~†£ÐõÖ47RhÄMykæ0rzçÀÎ>‚©håίs®Á5ºD4ÝEíP«æ(î< ÏëZÚ¶{,Z_[Ï4yßr+2ãÔMgèÚÕæ¡ªxŠÆxãHôÛ˜c…”œ²ºnËg¿Ò³·µ’ KI]@OrXyJ[© ׎1Ç'®*Ö¯ãQwö[Y,´û8-#’mFíK$’« u%›½aÝkZLjü!âD’[5Œ“Û\Ë—†æ%\ƒpÁ`qÉ`cW´»½rÊoÙÞ½¥Á»·ºÝ"BT¢,@¨R]ˆ?Þ=ý>ÎóÆÞ)ž•¨ÛéúrO,VQ¼>a¸’ HK GpqÞªÞx·ÅZN….ž¶öÚÆµý™x’‚Ñ£®àØäd9Î*ü3ø³E×ô«GTMFÏU[…±´/îà©äœþu¯âÛëÝ3Ãú­íœžUÄÌñ¾ÚG|?:åõ9üo¢é¾%¸Ö„®¿e{›! ÈÀSùë¸ý*çŠo¯"Õ+ß&¥-¨xÖÜ©¹žLœä2± £û çÖ°Š5ãáKoªK=Ι{V·¤†2S”¨äó´dsн­Ùø³GŸAh&»¶…¬¢)pÁò p2ÈÇÅs2¶¡a¦øÂÆ[éÏâ[K[›Ã…qÅC1ÚpZé|i x{AÑmo´{,õ Ë?°¼(™‹…ØH䆂sXúýÅå¬Ú(Í.œŒËÕ#’5W?‘5¡ñþ´ðŒf Kx>Ç5§Ø¸©ÈÎyç­?Yò×\ñÖÌÞF'p$ª×šF‘mðœ,vÑ :-½Ó !PųëšÑÒ Ÿ^Ë|U®G‡ìÃw_-‹y¥àXÎ+5…ß^ø•AdÚUªßMÎÂUÜyø<ç5Ùñ¥è§X‹K×t.l~Ë4;£~`#u\•$z3^©EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿ×÷ú(¢Š(¢Š(¢Š(¢Š(®j3ø UÕ’úÊæmR»kèn­£gHÿ}d ’z*Õ–«¯ø«[°¸°†îÃÃö++Ì÷Q¯]†UæÚ½r@úU[¸ðu‘ðö£¥_Ësi4ëhöгÇtŒÅ”†*žy F=i-4sNµðrÏlÏx5©nïD_2Áç''Ðd­Yñ}õ֙⯠]ÛXËzëm¨,‘Cþ^%A#$uÆy¦Í§j8ÔšêæÂçNÓmô«Û8MÈ ,²]¬vdà(úšŠ-[ÆK¡¯‡O‡n×W[O± ‚Sì¼ ¢O3q8Ç8۞ح +Ãú†¯hiFK ? ›¹ÈÁ‘]pÎyäôªÆ}ÿ =Ýýÿ‡_^³žu°;¢+hTऌ n<äi4ÝÄÿbñ†™q¥GjÚ„O=«ÂËäæHöˆÇC•Æ ÚYÓl¼Q{?ƒ.¯4³f4ź†éUb„*·Ç·8£OƒÆÞK#NÑãÔ¬>Ñ,¶Sùê†5‘·m0ÏÊIäg"’?kV>·FIîmõѨêç/¸¹Pzànêú^¡w®xjþ†ÞÂKÃq¹°@’=«ŽyëÈ©üO§]êÚ©§Ú„7¯bC…Üzdàñø£â-SÕ<0Ú=«B.ÌV©ºBv~í”·@O@qÅT¼Ñ|Scâ ígGŠÂäjAŸkgW€Æ1ò•VÊž¤|¼÷¬Éüã;›Ø\ÝÙLu&hæÃ®Ù]ÊW ò€0âzdWM¯h—Z¬Ú Ȉ4ýJ;©7g,ª¤¾üÓ¥Ñn$ñ%¾µæ§‘—5›Eƒ¸³¸lç¦8¬Hü7ã6Ö}#GÕ­aÓ]ä6òËí‘Îv®VÇ8'¼Úf¯mg¤ÙéºAi4æK€d{ˆ”|À’r½y­IbŠhÞ)T ÔÆ¯©ëšf¿=•å÷|´h¶Æ¡pTõ=ÁÈ"¥“ÀÖ3h·zT·“¼×—qÝÝ]¶ ’H¬Óq€àVƹ¢YkÖ«mrÒFÑÊ“Á4GC"te>£èk7Nð‚Á©Ã¬jšÎ©{lŽ–¦}¡ 0JªˆêkzöÖ+ûK«9IÜC$,W¨0qïPém¾§Ùé°3¼V°¬HÎFâ×søVxðŽ€S]ŠxÚxu©|Û¸älŒã/LzõÎ{ÕKiw6·7º…ÿØß̵ŽòvxáaÐ…ã‘Øœâ´ãðÕÃDd:ÀoÎQÂ&Ðô#­a† –%·ºw6ñ‘öxf¸”¥¸â1»Ž˜ïÇ+vè·7Ô°±›P±7 ¾h†x<O#Ÿ&ƒ£K£H7i¢Ñm<¢Íþ­FÎsÓÞ¹ŸØÚËwaoáWÕ4¨`Ä7­™­ß¦Ò¹VÚGpÇÜRø+ÂÒëYÔ¤Ñ×Kµ½Š [{Ú[Ê‹vZM¥†ç'œ’}MiX|?ð.™wí¦•Mï‹%ŠÆÞª¤•èt´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¬Ë½ÞïVÓ5fšE–Â;„HÆ6¿œ%¸ÏãVQA rx¢'€:Ь¬)HÈ#¡¦ù°ùžNõóvïÙžqëJ}QEÝí„F{ˈà„ ÈÀ ŸsIg§j1yö71\Eœo‰ƒ údfŸ%Õ¤2Á“"M9a1ŸhÉÚ;àuªú–¯£hñ¤Ú•ä6±Èû¦`¡›ÀÏz‡Kñ†õ¹%‹KÔ­îÞ "ÂኃÓ8ª§Æ^çK:¬lù[3Æþ›w}ÝÞÙϵn×9©xÓFÓï¤Ób‚îþò%Vš;(‹ù!ºo<ŸLçÚ®h^%Ñ|F“µ„æ[°Iá•$ˆž•€5¯TW´MZ«ý¦[7»VÇɵ)ç®O¥_¢Š+‰²ñ¯‰µQu&™áw¸‚Þê[bææ5ÉŒóÁ­Ÿx¢ÓÄòm5–¡bê—VwŒ°àðH*{y­-JæòÖÎæk;oµ]G%Å­‹BÄlŠIâ „vR?Ÿâ®±¬YØ[Øi2[]J—“Mɲnlýã[W+·Ó-ô[_³Üj¥ýšËµ¸RîFæ%Ѝõ$R'‰ì5‹ ~Þ{kë « 6k¸ :+¡!£efRNn¢³Öí›Tø{ök‹¯²ÜXÞ’¹- ©S.‡ãÏJK?éZ‡dÔÒßPžÝuyí]e`ó2HçîƒÐqÆ*ü/¿]JÂÇUÐîtøuhí'wp¹ÚáI*Hé×ëDþ,Õ&»½ƒDÐåÔ`°˜Ás8•y‹‚ËnX¯»Ï«þñ~(ÓŽ¢–²[/Ú%„G!¾CŒœtϧjÉñØ}Té‰Ê¶«u¾f^«f?Ë7€o§“D6¤‹½ytû‚ÝO“÷[èWsâêúN¡©Øh‘M¢R}êÍãKñ¿…n&Õ.¯šîKþ. â ±(P:úv­Ÿ[kW‡‡žÃI]E ’êIGUX¦Õ.Hn9'…cÅSÄSÙÁ¯ØÞi1iZÅ®—=ä~CŽdU?2°T?)ê Še¶‘¥ËðÑ`hTÇ.ŠnÛ dÈÉ¿w×5Óø^ââï@Ñ.n´ÒéöÏ#¬ÅOã\¬v>=ðΧ¬\h¶vz¶™¨^ÉvÑ™|¹ãvûÃ$#Ò¬øRÒïu½bYt™´Ÿ›ÌérÙI#^)RT€x'×!{«,:5åý¯‰5[ývÓ<ök#Y«#r£äòü±õæºmZÎë]ñ?‡Ô^Mf“è“KpÖíµÝw)Ø22HÎ0p)%Kï ꎑýÌúuÎwwžFy-å‹‚UÏÍ‚rpG¬è¾Ýá¿KâÄÔ.¯5{­2ÙRIägH„¬¡B¡8Êäry$ryª~u•¬7šâs­Á"IçN’ºçæYC1]¤g(ÇlW°1‘\WÃ3þ…âÎBøŽýGþ;Q\ÆÇ׿ <,ËsŽ›ŒŸ.}ñÒ¹Í ÃºE·Ã‹ýi–I5 ½í$šGbËÎA8 0:b´Ö%Ñu/x_é–ú=óû:ˆŸø¬íRêî]Å~*µÞWÔ`Ó ’6 ÂÖ<¼«ž›ÎîxÆA¥ÔôNÉté´A¤\ØÝÂ`¼P®Aa¹8 ““ë^·EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¯;»Ò—\Õ~!ièÃí&.Xê’¤e£?÷Ь˜uñfãOMÅ‹C“L…X}Ò‘o›ÿ8ÿ€ÕûýrKiü9au«&‰a.ƒÃP(›¥“å«ÈWæ95KIÔ4†Õ|g÷FïD o%Ñ;®jáŒy •Ž+RÁÃÜü/)÷ …ßcÿ<³2øi²ŒvøØ m9ÿœWYãEcsáqâ|à‘½+/EÖ„[VÒu;ǘêW76oºÜ¤Í‘†P@o]Åqô« ¤¹›E¼–æÏ«ß3Ä€—ä~;Ôèòø›ÅÆ¡s5ݵ¶š‘ØZ™£,~ô‡Õ•k­xz ë­¦]N©£>úÚ5Ìð‚Û•¶qœ¥hi×Þ³âɵ'Ò.¬ôÿì9- ’á@.Þ`<Œ’3ØÃ56 êþ‹D»‰­nå²–-’Q·»±Û§á\áÑb¹µƒLƒÀqǪ2ÍvŠÖˆ78`À°îÁ®‹Ä¶×?jK[ï E­èfÕ‚8̶ò!Ø|¤cqŽõKHÑ|Y¤hš‡ö~k6¤³Å¤]H lÑï$¨fê9`?K¢x~Y|Ea«Ùøoþø-ãœ]eã r]p«²&eÀ<äxé]®ŸqªÎ÷ÂöÌ[,WM» çFÃð3èk'_ƒÅ6×ö:¶ŠŸlXâx.l]‹"·!”œ®å>½»Õ]'Nñ£¯ÿÂC¬ZG`°Y5¥µªHŽæË3°}ÏáVõP¾ñ†5(DfßNkÓpYˆaæÇµvŒsÏ^E.½mã½³Ôt)¢™"㸰¸b±ÊFV Ä0÷ÅSÓ¼?¬j:•î±âHíÒI¬Z [vfXás–ÜÄ.Y½”`Voü#>=L>ŠîËû †„^¶ï=mÏðlÆÝØã;±ŽÕÝZÛAgo¬ ¶"H£_EQ€+ÿ„gÆ¡©ÜøVêÇìzÃ]Kgzˆæo¼ÊÈsówU?ÂZ­ÄÚž£â+èî5 ý=¬¶M±ÛÄßx&I$“ÎOåT[Â7»Ñ›Ã·:ž¿‘–°0–EQ…¹Šýí£'ÔU‹øšyô=F-f}CL°{s²b•¨/¸ê<‚:UËO j’¾¥}¬ê)s©^ií` ["‚6Îv©f''“–íÚ®Ãá«3á¸|7|ÿhlRÒGim£‡\yœVIð‰/M­®¯â'ºÒ­äŽC DIü³•È‘ë…\÷®Ê¸›_x‡L}Hi~'–Ö Ûéï1oiHÎ gÒ¶t/ Øhq_by®¯/ÛuÝÝÁIN03€t)¶¾³¶ðÁ𸸕­Í”¶†n<Ì89=1ž})ú—…´ÍW@_\I'ÙÖbYT1LXÚÀàŒñéS'†ôEÐÓï™§-ªÛcË(Iç¾F9æ²­< aÅœú†¥©¥Œ‚KHo$ L:6®â½‹ÅutQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¦,P«¼ªŠ$“Ø–ÇLŸj0hÄj³¹p0s×#Þ‰!‚U $jê:Š_.<†Ú7€qÐRà `téK€h®ZçDñ¼wwO¦x…#³º”ÈcºƒÌx ê"mëÇ `Ø­mE·Ð4ètødyvy%“ïJîrÌqÜ“ZtQEQEQE1&‚BBH¬G\qO¢Š*(.mnÉo2JÙ #)Áwé³^Y[ËoÓÇ×,Ë3d*2BŽäx©ê½Õõ…ÙþÕq?h-áÞ@ß#tQî{UŠ(ªš–¥c¤ZK}{!ŽÞ-»Ø)ldàp ž¾ÕÏÿÂÈð7˜![ÙRž`E‚bJúð*äž3ðÔºuìòË ½ýѵä†Efq†Ê ö-€}jî·¯i>µ[½FFXÞT†5E,ò;ôUU’~• ]U ò¨]Ç=…qãâ¯Ã6®²¬ÏJöJØÿ„·ÂÿØË¯›å]-‰U™•†â®‘¸œŒŠn‹âïë×YÙË"ÝÄ‚F‚â'ŽM‡ø‚º©#Üf©^üBðåͤ³NâÕü»©â†F†Ý½$‘T¨÷çŽø«úߊt-ÚÖâæF”Þ0[H­Ô¼“’3ò*õã¿Oz]ÄúN»%ż 4–ÁZk[˜Ù%@ÝÓÔPH¬y¾$h‹‰â²Ôn4ûyLrßCnÆTáˆlä…=HW[ð]CÄ,Ê‹$n§!•†AZ’Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®/âKÜ.›b.JkèÆ§ö\ïò{ƒ·§¾+-?ávª!ojzn¹ˆÖÉã!Еf =AÏç]ާ¯j£SMF´ŽâõmÅÅ̳1X Bp3€Ifì8ã½T_êpÙø…/ôôƒVÑíçʘ§M¤«+`0~\ŠŸYñ-îáâ(`î>Çmqå1;s&ÜŒŽxÍc\¿‰Ä;O#ìbщùÌ™ò<ÕßÀã~~ïlU ?Ž –©‹„6ðj—¤=ÎöiܾNà(:ž{U›dk­ðïU0ùr\j2†N¡X#ýG¡¨ê<’çR’+;FÓí&òíÚù 5Ö,H‘©< ¬­OÄi«øÁúåé†Ýá"¶3°oÝ)K{q‘šè´}zÿXû^µ”ƒÃÑG'Ùò?yq³ïHyùWŽ2zœt®müQ¯]XÿnEâM.ÍÚ&ž-*_,‚ƒ®ûÃn#®ö®÷FÔàÖtË J#»·Ž`3œn3íW«˜‘ñÔþ“?÷úº=kIÒõÍ6ïNÔ£iA2Ès–äœ Ÿå]‡ô¡¡èún—æyŸc¶ŽÿÞ*9?OJÒ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®{ÅwÞ#Òâ²Ô4¸Mͽ½À7ÖÈ›¤’×gºõ®?ĺ¿‡ íEÕ­àÑof™ñ,DÍj²œºÆA Aç€Æ{Ö…÷„n­àÐÿá¾û Æ ‚”ŠhØVEsÓ9 ÔÚG‡5X.µ _UÔãX»·ÑÉ{b¶Œr’OÍÉ%¹ö¬½Á¾1Ðl#ÓíZÊ6œ–Äg7µÒïæ²šÚßID‡tˆÎ.rX 8>ùÇzØñî¡i£ÛÛØÌÐ\êWö¶ 2}èÄÍÉøéXš®gà[¿_è²OwZµ¾Ÿ}Èî· 0#s'æSÈ#­.›¢éž8Õ¼M­‡¸†ËP“L³‡{*±¹€R>f'9¬Cªj¯£[øV[É™‹°¤¹Ü|ƶ_›ïuÎß—5¹¨hºO‚õ¿ Þhý’ ëßìëÈc'lâEù'æSÎzûסÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®{Ç6W:‡†µ{{tg˜ÂUz¶Æ ïÅpúê|=¸ð½ðøµmašÔiÆ ¿iîHùó×vÑÕB½ñuůŒ]¬6P¶–³°»ûÖ€XSÀíUtM𥇌56C7†ì$·M9Y—ç7¨Ç'fâ=@íI¦jÞ¸¹¶Ö›†+Ít½Cº?….ô NÔE©F.ažÏÊbóÊÄí+…;·q‚?¥ m¨øSþ}kS‰ü‹[)l5 ³[¬ƒ1ä(' x&µì.ÓÅ>(Ö—I§éšlÅ;«*M<§î®Fp£©ÇÕI››§ÝÛ_Áqæ4'%r{‘œ{ÖEõõ׎/t KM2öÚÖËQ‡Q½šî&Œ!‡•ŒnûÌO¦@õ¥·¹Õ<«ø‚'Ñïol5;³¨ZËfñ#¨Ž20r8ÏZ Þñ)ÐTKUðñü$а뜷tÎÏÖµ^McÅúƆçH»°Ó4¹Úòw¼UV’P0Šª 8’zWsEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢©Å¥hö÷/y ”ÝIó*(vÏ\3S\ÚY^Çå]Añç;$PÃò9§-½²D°,H"P hÐt¤û5®sä¦Ý-&ÕÈl ކ–ŽJ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(ª—z¦“§•·°[–WUÈüH¢ÏTÒ5ÿa½‚çf7y.­·>¸&­Ô¶n—7Ä÷2ˆaÀŒí\õ5=#2 ,ìGsÒ–Š©©jZn‘i-ö¡:Ákä~ƒ'ñ'¥Igwmo Ý»†dŒAƒì@?˜¬½gžÐfŠÖúå¾×*oŽÞw•‡®Ô qøS´?øwÄ~zé·[æ· M «$‘çûÈÀùVÍU]?QÓõH>Óc2Í™${צäb¬?*ÕJÿUÓôDZŽéÙZöåm`“—`HàqÔàUÚ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¯;ñMdžl²1µ´²½õÜ4QˆJãcª±è9õ­˜5oø‰¯.ô°¶Ómî%‚µ#»]β¬¡W<÷ÅF|Q6¥g᫳a Ü˯-ÜRÆÙÔ0bÆt=9© Ôüo«ëšþ›i5¥–4J“´lÒ6ô.7ÁäŸN1Þ°¯ö©-ÒïOÔ•àHÉIÌR¨n:ƒÎïJô«…/'YîùåTÚŸîäãó®NÎçÅþ)—Q¼ÓµHôÝ>Þîk[UXVF›Ê8gbÇ¡9 qÞ¹ïêZö¿áˆ$’ém/ìuݽHã Ê’wdàpÀg¾kÓí"ž x¢žsq*(+ Ÿ\ ʹ‡éßü$¼ÊúçW¹ŠG?yR"¦}¶îôŸ&µg­ÌÂ-I-å·ˆ‡Çš˜Ésóc¯|W;£Úx›Åv'^}væÅîšF±·· åBŠÄ.ðAÜN>lŸ¦*€×e¾ðû¼89ë\µ­¯<,÷öZV—¥§Ü]ËsjæqA朔pAÈ$Ú™?ƒõx¼24èdŠmNãT‡P¼v8Fs(wÛÁàÇjîkŒ¹Ðü_¡j7÷þ6“Ú_Éç\XÝP²÷xÝCcwpV§Ò¼=®^jÑëþ&{vº·á²µ¶ÉŽÜ?ÞbÍÉftªž‰ñB´m"{4ÐÒ}šâãnŽs‚£†+“ŽWÞ­Úø4é×R©µÑðLdÎùZtÆáî[$ò+JãD¸›Ä–ÚÊ‚}>{Vs`AÏL W<|¯½†¯¥>¥n-$¿úk‰x¤ó7âLœ2çÛñè*]KÃ>:ÖM…ÕÞ³i Í…ÜWA ,`fSÕòÛ‰#¦ ïVî|5â[KûûÏjÐÚE¨¸–æˆLвããæ AÈÍAsàID±Ó´íIá¿´ÔWQ’ c$ù%™×ΗZèËZûfpúž`‚Õ£¹cP·>|ä•Ç &´è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¨jºÖ‰¡À—:­ì6p;ùjó0P[ã'¾T±ñƒµ)ãµ³Õí&¸e#Yæúÿ…mQEQE2Y(ÞFû¨¥ÐU]'T³Ö¬-µMÞE–Mã €qȨ¬5»BÿTÓ¡YúkÄ“nÌ\‚¼ò?ZTQEeXëq_jÚÆ’ t}4[‘‰<å,1ßzÕ¢@ äÅñ7ˆ@Ò®õ£K™-Þh·íáÜ)ÉÁéœô­º(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¯?ñ“èkâ}5»Ï#N’Îì8’fŽ2æpTõ5gÃÐü%mVЯmgÔ£GdX®YØ `»Û±î+wBñ ëz/öºÛ˜¹¸Q`O\wÇ¥s–ú±ÖõÏê¾WÙÍæŸ©±„¶Jð¼d`}+SÀgþ%ú’±ëZ‚ŸûøM.¹â]nÇZ³Ñ4Í-.溴yÖG—bÆU±ó|­ò铜 sí#Äz¤·ú¶•«Ø¤7¶%Êf.³ÄùårÈ#æ².Õ4^3Ô.t *òH—VÔnZÍ!w>RHŒC±=v ëÐS­õßiZ¶›§ësØÞ[êNñCqh¬†)@ÈVVwÈnÄÏjè¬W]¿{v¶3d" ¸GŽ|ÌñœúW?ãá‘ásŒÿÅI`ŽE]ñ–‡¥êú¥ð¦ø­¤š 1†ŠDVR0AЊÊ¿Š.ô \Cuoeݪ>¡¨NTùXQªÄ\ýqéPøcÄ÷—ZÖ«£jßY‚+w Ô(ªc`ÛYi*qø{ÖD:¯Äàõñlúâ ¡‹Í[e<¹_ißüYoöYq[Ëã çÃ÷÷šÉ¼MJú ;«?)$3ƒpڼ͚±iÿ Šîõ™ãÕçÓ¬,ï%±µŽÙSs4yܺ¶yè®k#PñŠÿ°go–=_O×âÓ^éP˜6±SdnØ­K»}sÃZ–ƒp5›»èïïÖÎî…ºœ2€£nÎÅv7_ñï?ýrå\ƒ¤ñÓxsLtzoÙÄn#3´›ŽõÚ=~µšº·ˆty|yu(·]WÍÒáV„´«´0ÝÏçžõ©®è—~Òä×ìõB[Û.k‘q3+­.;«­;Uº¹67vÜDò¶W9+’0W>ÙÅ[Ðô8dÖl®l¼i¢YZî’Y§Š>GÆËfÆ;’~‚»K;½N{½F›ooƶÓï팓ÈÁãšÅñÆŸ¬ßÚé/¦Z}®k-^Öñ¢Þ©•'«q×CT?|Im.‘ý“‘mt†;‹·¸Yc?x"¨1 œSµï ^Åqáë;N‡R³Ò­žØXÎá@È]K¹cŸÂ™a¥xÓþeÕï,¬¢³ŸL’ËʆCºØܹù@bÇ®6ãß*¾×€ÇÈþÒ67/qrß{Çüð­m{DÔ58¼>4a¬5[;©·“÷"ÎvðyôéT—Hñ†‰}©6‡ö)ì/îZë˺gV‚WûäVÊ“Î>_­C'ƒ5/ìt´qɨO¬Ã©ÞÌÀ…v žÂæ¶|C¢Ü뢴2" V É7çæT c¹ÏzÙ‘<ÈÝ?¼¤~u‘á]çAÑ,4ˉRY­ÕÃ:îbxÏ=ë>Ç}uâ—¼¸Ýk­¥ªª !á0®3œNy|ÕcáêbÚË^Ö`¹Òá‘Hာ—[THKq£Ÿj·ªøs\}_ûgCÔ㲞kt·ºŽh¼Ä‘P’Ã) 3êGµd\xOLÐô\kú…Íý¶¥äÏu"ÇûÈÊ„ÏCó ïŠæµo­G¤éöÞ-}zåîíM¥´"?‘¥›g'jç“·¯Jô+¯ØÞÝø‚{™ähµ›;{Y"_”nSëÏqÚ²n¼©j¶ §k$¼ºû8D6•û¥ð>r=ð=ºczÏ@úªë^K=ßödV¸(VÚÛ‹à >øö¦ éR^x‚êà¼ÑëA ÌbR¿.<ƒÏ?J¸øio}eý¨kú­ÍœaE¼O":r p7®à =)h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠŒ\[4Ïn%C: vŒ¸)èHëƒRQEUhu >âêîÊÕîm<¿>0yÌ\ýEY¢ŠÊÔ.¼?á›KNx’Ú éçïë[×:–—f¬÷WpªáÈêcОµ0žÝ¢¬¨a+¼HÛ·×=1Tà×¼;u³êv’æEˆl•Î݃Ôö麇ˆ|7¤Ëާkk4˜(“JªÇ>ÄŠÐGI]20X>•›«ø“Ã:•ý¯©[Y™~à™À-ô𙵭 4ÿíV¿·vÍÿi.¾^=wg­VÑüQá}æ‹KÔ"¸– ‘‚C¨=öœ{ãBëâ€,ܤúÕ¸e‘¢p¤Ÿ-”àïÀ;yþöH¾;ð;ßE§&¯ÜK ‰6’QœôPàl϶ì×EEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(®;Å’ë3kÞÒ¬µiôø/VøÎÖëfò•JòèøüªÕ¯†µ8n`šOês¬r«˜_ÈÚøìvÄ~k§¯8ðÞ·¯EâýZ×Pº’m:öööÚÐ9Š[rh[ß8¦üHÖõˆo,ì´Ë©­ÒÍ!»¼x[„²ˆãCõ䟥tú·‹a°Ô²,´ë½OQXİÛ(Ø 3²(Î8ϵfêþ)Ò5 뗒Ǩڋ½Ü1—18eáNvó‘ÈlVVkŸøNã„O/Ùφ·ùEŽÍÞv7mé»ñ[ÚuõÅè»3YMkä]Iy»z«Ñ×ü­Û8>ÕŸ­øŠM6îÓL±±{ýJæ7•`F 4êÎÇ€3Ààä×?¢ë—¾2ÔúÆâÆ[} Xƒ.D™Ü…IzàØâ§ok‹¦¶¼|9*é ó’ò¨¸òóþQŽ7æ®ë,Ô,õm?HÒô¿·O}fn#s D@W$.;ŒžƒÕ_xÖúãPÒ­ü?êš{/ÚL—?èû\e6°BİìPcÖ¬/Ž7è¶ɧ±Ôï®ÚÆãýz± ãF ';TÖÚ5 Ù[$Wå’ ›Gb‰ á€<ö#©ì*§ˆ¼{­Ï«Å¥i¶1E§j¢k™‰¶ '"Ñí56‡É’_1$Œ…xØ©ñÆGW5{ýºž9»M;>},׶Ĉç²à’sÀÈúÕ¸+2Å­aymoa‚ ”`9ÉïÏâªë—ß<5iiy6£ix·–°N‚¾O˜À„7 ôù¹Í^³{È –ô±ƒíKb>X«ÚªÃ ެÜWI®"j>(ðþ™v»¬£µº¿~ì³DUTßnIúý+Ô5HæÐN½>¿<åôíE9Ú«I°©Œ¿"ýæe$ãŠêü:ö—>#Õî´§3X.Ÿim5È9K‹ˆËr¹Uá=zñ\tšµÔqÍÿ ˆ5]Ä?ir2·ØAÝò…vñêÀ÷Ít~)»µmV O\¹[6°.Ÿ¥‰|ùä'ï“/åã§#žõo¨_I üEÓ¤–ùíl-ský¡Ÿ9H‰ “ó‘‘œœU‰ü7s¦xA^Üp>_Ʀ3x·Äû/oo`Óæðý•ܶpÌèŽîOøÆxÏJ©{}i®kšÒêúV±¨Zé÷bÒÒ ÞL{˱WL»ß8ÅkxoYñ‘¦_ ­'X»·‹R1X¬¨¦à@Ë‘»/’ñ’IäUHþ$> ·šh¹Ödãì” FÏ*I‡¸851Ñ´Ÿ x¿@4-o£gÌJÌVO%C) “óZƒÂÞð(µ½v¶êZ‰ši.]Žø~bÆsò„ªUõ榿 n®å3Êš–¥™úʱ£ª±>¤}kKš‡üY¹«kvqÞ^Üê·vîf0$-µ?»´xÁÏ9¬&Þ]Â0¡3$>6dI$1þbO<×G¢øÃÚ—‹¼gw}c ÌÑ\Y¢yÈ(h$‘“ëŠç>ÏMÖƒš;øù¬eøVݰû=”·ó­ïh>Óõ]ZY[[^.½g yHªZ<ò01>ŸC&‘¬E«xž÷H¶Ò¼Ai{s²òÞv q ª€b݆\Ð61]GfÒdðí‚é¶ÒZÛEæÂ •Ë4LŽC.âI žÝ‡JÌð¼—~$ñÍìjÚ”w±[ à–»n…¹'Ô×?$>]WÂözgü€á#Ô|õmÞOÛU>E]Ãwgh.zWCâU·.ð_Ù@›wæ•ëöaÝ»ýØÆ{Ö_†mm?áñÃù(}C[[n@ÏáTõ ·øO¢˜•"Ùo£ÍœcdBOÉ&½VŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(®Ç1è’x›Á‹«˜E™–ó3Q„R2IñÞ¯ØÛü&´»‚êÊm-nÖOÝ2Ì…ƒ7|ÇžqZ+¢øj‚ñ¼E1±4ŸcòcÆÓü;±œÏÞ¹o,Úw‹ï¬ñ%î‘â™õ@'¬J…”ÿ¼¹W¾’=CÂþ!ñD£oö¶¥haÜzA ª‘Ç“øÖž»®"x–òÃT×›B²† °EE{íãæ"GVû§Œ.k–ŠïKo üE³†[©d3¥Ê-Øo>HÛhÀ1+½ØøîÙvü§ÂäîÇCç3]›«iú¯Û>ÈÌßd»’ÒmÊˉ#ê@È÷Ìk·±xgÄðkÚ‚H4»/ì/:)a‹&á¸(' \uB×UÔuojÚ–“c?•ÿÛ¥”óDʳȯ•Æà8'×ôÁ®rïìz§‡§I Öõ?½§úD3 ‚Á"à±ÙòÆ0~è“ØëtÉf¿ñ&¨Ãm8µ“Ã’¡y#eØË"ü­0~¸ÏjÑÐmî¢ñGŒf’ ŸN1HÀ…“lX;O|w®j×Kñž›§ê‘éóIs¤ë÷ó½¶’h$fV(2qÊôÍlIyyâíOH†2öÓOÓîVúyî£Ù¹ãûˆ€’IÏ^1ïZ^³¿´ÿ„‡ívï¯^Mì|ñ¶Ü0ÇcT<6uÃö±6‘<³Rxš*#’fýáÉÆÐ9ëÒ¯Ãe¨/ŒnïŒ ,ÛFŠ%›ŒW®rµdê>Ôõ[ÏF#òRþ 4ÙÎÄmi öÉÀlgŠn¡/èÑ¢ÁPNñ÷Oâ ñ•Ïï4í>+û[8Æ¥`¶]íq#8FóÏT±Ã­ck «î9ÜŠCpN3Á¬kí ÇzŽ„t[=MÒcŠ8÷b]Âs µÐOvÉöï]EŽ“ªM­ÜÇqϤ[Û²£’Ë(bX}ÑòŽÇ¿ ª7¾»Ôî¼_ö‰Ò;]b ¶dÉxÞ~f8lcšÏÖ´?‰Þ"Ò›J¼—L…AŒ¼±™ ¸ÚGPTmõêüÒº½oDM^;wŽvµ¾´“͵¹ŒѶ0x<aÃÔ~°WGñ‚­Ò?@3Ü«,Óìp%ó½1“žÿ9®ƒDÓ.4»!m=ÂÌÙ'÷q¬qÆû¨«ÑG¹'Þ¹‰ü1ãùl§Ð¿¶m$ÒfYc7Æït#s÷ym¤À'ò«2øGZÓoã¿ðÖ¡¹k k£»ˆÈ A²•t9ÇQœ¯uÄ p\ǯXˆ¦i!ã”)Pˆ`Œÿµê‘xÄFÂß@»ñ ŸAŠ8ãx¼€'’4ÇîÌ›±´ôû™Ç®Š `×îuµŸå›N†Ì@…ØÄç?Ž:Vv¡áMOûFïSе©4ɯU~Ö†%’9F…la±ÇŸJÓðöƒoáû6¶I乚ižâæâcóÍ+õcŽ=€.­¡A«]h÷RLñ¶™vnQWs´Œ6{sÚ–÷C¶¾Õ´]å‘eÓåcqµüåîãâöêò×Q¿°[×^Ci.Øçlcq$8%HÍ:ÏÀ¾°²°ÓàiŽީý¥/ÈB“ŽTg§ëZ¶.Ÿ§^ê·ðoóõ9c–}Ç#(»FÑÛŠÃÖô-7LÑõ¤ƒF“W‹Q¾{ËËMÿ;1¹“=×ìk“²Ð´½WTѤj°ýŽú«‹íP˘㋟*?5˜üǃ´ß&»=SÀžÕo./ØÝ[\Ý*­ËZO$b`¼ áXqß÷«íá›}*ÐZ…ƒK¸K‹DF`Ó8'g¯9ÎOZƒ[ðo†ºšt'KU ¶øùW9äóœçÞ›¢xSÃidÒì–eP¯),ÎÀvÜÄœ{grÛGÒ,í®m-ícK{™&’hÀáÚ_¾OûÝé²hº,Ú|zL–p¶ŸF‰nTl @Ø«ôQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(ª·ºn•©ÖúΑ%È­´ŸLƒPG xrG‹K´FF ¥b@TŽã޵£MÆ»ö¨Î[©÷£ËhM£`ÇR½5¡eãkëªïžÇHX-mm÷°@Ëv=+ÿPÕ4mÅz-½ÄÞV™¨Asn%ൟºü¼Œäµ\ñŸá/[hº®€ÑÚÝ­ì žSäÝÂß}Xdîs’;W¦QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(®ƶßlñƒ-ÅÌÖÆI¯€– ¯N•³§øbK Èï·ª\„ û™å6ÈÇ#húõ®kJ{»¸5ÛÍN±³Óno®žâêýÙÞb ÅE Ž; ÌJÿ…c¤=ÓH.b#û9 ½B#>¼}+ øvÖîºÃ^ÿ„í„jžpÇüólÛ÷qÇZìàÂ0-öyy8ÙŒuç¥s>2ÿ„°éÚ²Ù%ƒiÇO˜Kç<Ìl;±€GN”ï7Œ^ÒÁµ%Ó†žtøL?fó<Ϻ6çwÇ\U]t¨ñǃyùŒ:–?ïÝvUÆø›y§_\FZãOy݃¸ÁÈ\Õúçdð7ƒå»žñìrÓÈeš-ïäÈç«4{¶}Ö¥²ðo„ôçµ{[O²Í,öë¹ÊÄòcqU$ø;b¯®¤.¤úÂÛ*êoöw˜g,™ÎcøŠ~›¥éš=²ÙéÖéon®î#AÆXäŸÄÔóÁÔ2ÛÏÉ Ñ´r# †V ûX¢ŠÒ(”$q¨DUè t£’ÊÆkˆ.å‚7¸·!•”Œ?]§¨Ïzž±ŽqˆX´u\Ú›{èÛ?6Îcu÷ƒžÇÚ®O¤h·W wqco-Êcl®Š\c§$gе,0ÏE4k$n0ÊÀG¸5¥•…„~M¼Vñg;"P«ù(ûˆà[Çÿ|Š¡©h«©\i[äU²²˜Ü4ÖH¿êùÏE98Ç'•­HBœÇOjZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š($Ià (¢Š(¢Š(¢Š(¢¨I¬i‘jhï!ÓÛ½Ìi´à¢»ýjýQE#°Ef=ùV—â»mb×B½³°»{}_ÌÚûF-Â̤Œãæ­~Âoí¨ìÒ[›'åžS¹Ÿfð«œHéƒWí'{«k{‡…àibI R}èË íoqÐÔÔPHš‘Í`ø£Ä3hØ k1wyz–D\"î`NYˆ8CZËr±[Ã-ëG²&ñ¼m G ŒóÓô©ZX‘<Æu Œî'Λͬï,qLŽð¶ÙX‡Ðã¡úÖ©âK½_Ó,o`EÒu$ò`ºå.sÂ?l0û½9¤Ö¼I{»£ø{J†9¯.³svÒgm½²ðXã3ÞµÄ{ÏìåÔíMîí¾@•|ÌúmÎsøU¿µZ}£ìžr}§Êó|­Ã~Ìãv:ãñ,°¯‰õýz=B-îgç‘Z(ÕXF¬~qÓ…äôc[±øÚxÍõïM²½•"‚æR„+?Ý…bP“ÀÈ#Ԋƾ¸»û_Å4ûD¡aÓ-Z!½¿vM»Sž? sZ–þ(šËNðÞgg&¥¬^iP\C… ç‘Û Ï©&¬Aâûšµ­Þ“%¾³§Ù5à³2·ŒàÇ ëÁÊŒÕ_Pø…ce¦xkT[c$zÓÕß!˜œì'¥?Äž ‰¤ñŠúp»µµðô·wDÈT1|À$nœçCUdñf©dþÒ4m gmGHIâV˜ªÀF§*~ON9«º‹5nµ‹YÅg6›f/¼Ø$/Ðó–U ‚1‚ eÝø¿ÇÖÚ4ž$þô:{@&ŠÜÌÂtFû¬ÿ)\t$@îq]ÕœææÚÚà€ °¤„ƒpÍyÿ†¯|A¦êþ3»Õd´[ Y|ûò°#fxÆÜgÞ­Kâ_&™ÿ µÓÍ—’·BÃ{}£ÉÆOÏ÷wãœm#¶j[ÿø¯PÖm4¯ ¥—‘w£G¨­ÕÖóå†lgj‘œŒ`qÏzVñëz›-…¬tVŒnåÝ‹J™ÆÀê99çpÀìk2Ç]øªi:®¨³é–ÇKkˆ|±¸¹{¾IÞ ©èÜ}êεãkÑmáVK¨txu»O´I}p›ÒØ ÉUÉÏV8À­ï ]ø’àߦ¥qi}fކÆþÔŒN¬9  °O¡Á©<[u¯ÚÙBt©í­Ü*Ý^]¶ÚÎ Øk›ðߊnæñ4Z:xŠ×^²¹±–a,(¡’28܇i~"¡Ðÿácø“K¿¼>"[I »»†ÔCg”Ä0°BÆíÀçÖ³<)y}•ðž(§xâžkÕ™UˆY£à6:úóN¶Ð¬ôÛ¯Š–×7‹=¥»ˆY§”íßm¸“–ä‚x'$vÅ]µ7ž$“Ážº»™,[ÃPê—¡ƒÝ0 ª¬ÀîÆr[ž{Õ¶´‹Âž"·Ñ´Ù¥^«¤_;Z;»d€ :$€Ààóךçôßé7_Ó^¹’êm^="kË{¦žMð”RP'Í€·5±­Zx‹YƒÂz´–Z°]-%¼Óã—ËfšER%•VÇ GZÒøvúM­Yi‘ê^TñÉ&™|1öBãþYõ;_¯Þ?…CñCÑ5+ßÍ{e ï&¹¬†AÑ2±(}‰ÁÅE£èZˆ¼EâS«ÚCtš<Öúu…œª vЈÃeTñ—'®: W9¯[Áaá߉zž²¬.lZÙ3‘ —c:.sÀ<Û5ꚇ¢è6‹m¦Û$(ÁZF敱÷º’}I4ž!Ðìªy¯/ðûêËðëÄ^-k™'×µiüÛ“ÉÆã¦Ð }k¡×ü=àÛ‡÷& XV]3íV·™çÊ8aÎælsžsSiRßKã=&kÁ¶â_FeS€|Ã(,?:ÏÔä·ŸZø›N¯† IBã!¼¹8ü±]gôí7NðÖˆ–P$K&Ÿm#.Ì€’Os] QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÖ÷ú(¢Š(¢Š(¢Š(¢Š+€ñˆÔü%|Þ*Ñ¢YEÚ Kûf8YŒE'ÕOÔÆ¢:f«¢Ç xfÚõ¡Ô5»‹›½SPŒ1Š(i60 p=êûE¨x_ļzÕÞŸ«4ÖÒÁtûÌr"nWFÀ#8à 㚻à{‹»"é®.%šEÔ¯Ð<§,Èp3è;Süsswám&{‰žy^97I#͇n¤Ö7‰I›_’+û«ý@Efž^•`²~è±9’BŒ-ü;ˆÇ`zÖE¦µ­Ùxk\´µšê“_M2ÍïtÖñÌP|ÌKd¨$Œ“ºqà;KºÓ¯ô›éìî ¸O´´’;‹´<2¸fÆOcØö¬¯øwNñŽ—>»­4²ßßÍq帑ÇÙª,@Üg§'­QÕšùµ@½ŽïÄ6¶ºQ¹”Z”_´Èj´›¤PBÓqÉ9"’ÚÛV·>"‚ÛE¼Ò´KÝÄ‘²¤ê5I$ 2žqÅImà¿ 7‚ ÔÌeu4Òñ5 ÇÎÕ7 >ržÎ1Ú–×NÒuxCTÔtëyo/ô1w;²ZhÕ ¹÷^ǵwÚÔövº^£5ÜϺZÊe–?¾‹ŽJûú{×”ëZ`µð¢\Xø^>Ci4·'Ú¾øÃüŠNòO9qÔý+¨»Ò4}Wâ*›ûXî<$± »Í#$ƒ€xô¬ j84‡ø“i§Æ¶ÖŽÒ$?(A7Ë!` ¯ZÛø ø^ÏÖÒCk»YÜ[ F@#,Ž Œ“ù× ×™iÂòïIÖn4]2ÂÏG»žòY.¯äg’bIì p=ÀT>6í7èoÈhIºû0cò™Ó¡î8ô­¹†“ÿ ÈÛìûgö4âën3÷†ÝÞøý1Uü7lðü>¼}:0—sZß°d38,âVtë«?‚à2êš4iñ£³ÈÇâAóƒè ÏjžHYôEÉ>Õ—=ÏŽuIíåIR] ÊDt ‚¬íÈ#±¬mbÆïR¸ø•gdKÜ4[*(äíBÄîejWZ6«¦AhÐò8f*U@ÆqŒô®gHð¶¥uâ-òÕÓOÒ¬oìôéX+ý±÷‚§ Á8«þµÖï<'âÍkR³™5MZÚuò66ý°C±R3ÉÉsšÒÒ´ýB=kÁÓµ´Éx&fSˆß÷+z7µI­hz†¯â-b²GkyáfµYðv L‡>£©•ªkþ)¹ÑæðõÔ7¶úy‚îæM‚ÙR5Ã:>NíÃÉç¯CÑóý™§gƒöH?ô\`ÓµµÏh—}ÂYë°Šý1(ò¶Ç=Aè?§5ÏEá˜"±‡Jáݫ둢ÀדG´$`Kçq®1º»K-P²ñtQÚ¢i±xj;!$x$IrS9‡½ZÒ4ÍJ׾(¿š=¶—©§ýò>cÜu㎵KEе{Oø‹OžIîîõWCf'a$tÏéUE‡4ÍÃvðiöú…½¾™®£¦ÊÈ p W`Tàäx57ƒ<9w¦jZƪúd:E½êAv8a˜ó—m ('8ŸÆÚ­ª¾‹{cko~4Û™&“O¹m±Ü\œ¹zŒ‚+6 3â þ ÐõÉì,mlàŽ{I,c—/ rã.\.ñ÷@Sž7|!£jZ.—qg}åyÒ_ÞÎ<¢HÛ,„¯P9ÇZæì<â}LðÍ̈́֟ۚ,WP:9o"x¦bJnG½{VŽŸ øÖãÅ~#Öf²Ž(l'µ–ÅÏ—¼‚æq=ø^ØÐxDÄ:]ÆžÓ49I!™>ôRFC#¡…‹ãýRïM:î£k •…ÂÜÓüÅ{§Oº$$à/rsQÃá¿hBîËú…Šé·Í ÝÆåí<Ã’iÃrFqSÁàhìàð½½µÙÛ£ßÉ{;È2×/"¶âyà–l÷­mGC’û[еa8DÓVñ^"¹2yêçèpCŽÇ÷¥ÿ„ÃߨWžýñ¶½s%ÔÌäÍ4„‚]œç,q]€ (è-eèžÒ4 .=Æ3ö8üÜ$„±>cÙ'Ԛȃáׄ`ž)B\¼Ê%†ÎIäkxØtÛm¼v v£®øSÃþ"’Ò}B>Ñh[Èž97P œüÔV ð†˜º‚ÙéëÔ-þÏw†bfN~ñ$’NNO_zÙ´´µ°¶·³¶O.ÞÞ$Š$çåUžx5QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿ×÷ú(¢Š(¢Š(¢Š(¢Š+ź%߈t§Óí® Zx$0$Ž à{t¥ñ…>­ö «+¡i©éÓ­feÜ¿0Ã+.FU‡\}ê­Ž­Üꖚƿy ³YG"Ú[Ú¡X£i ı,ÌG ·z£„üUe&¥k§k‘Á¤ß\Íq´Á™á2òÂ7ܯL£b·|1¢ŸèÖ:I¸7ÙL¤cvæ'¦O¯­fÝøgZMZûTѵ±h$bê7…\v«)$`ã×"«Ùø (mõ»ÍNâòÏUe™üÀ¢Xæîá×äÞ1N‹ÁºÍí…Æ»®K©[éÓ‰í-ÌHƒÌQ…i ý⽺sÍø*õ^ò-/]¹°Ó¯¦’k‹XÑ 'ßòÝ+¸òqžzb§¹ðVœ-´˜´›‰´Ë* ¤ðà‡•Ã62r:ó‘Q7†£Ò¬µýJk©õ VëOž7¹” Á’@sØO\Ö?‡ü ¡áí"mÅ”ϧïPŒÎ0'o˜ž«¼jéõo Yê—zMìwWS餈³¹2Œ?/Õ­yikmqgt‚H."h¤SÝX`×/'à æÍ¬/¯uËQÈcžrD8èP9^ÄîÅlÙø~ÂÊöDI<·qéɧù’¾KF­»-þÑ=M;þýíz­ëÁ¾MR »W$£¤`€6ž:}kþ·„^!or.®mÓLS\HË~A»NüqÒºêæO€<n§¹k6ežc4–í,†rr[Êݳ?ð£¬xwLÒ´ëM.ÏÃk©hÆâI'd&H thƒž€õ êGaUü/áâšâê–ú/ö>kg-¼1ÈAšáä#.ø-Àsô®ËNÓtí&Ù,ì X-Ñ–4è ±cù“YcÁ^ £QM¿ÚDž`m¿(ïû¹÷ÆkGSÑômf$‡R³Šæ8ÜH‚UkãÐý)Ún•¤èöâ×M´ŠÖŶD  ž§ŽôûÛ JÞKKëxî-¤ö’‰mu)UÝü¹îX0:îÇ'«WOÔ¢—VÖѵO2(-ìåû+G³ìªêNâä ïÆy銧Ä/O41‰æHg”CÔH°Jç€B¡N{sÏj·ªxÃÃúEøÒîgÔš;xbwi‰.cžxœRé~.ðþ«g¨^$’@ºqa{Ê2<ù”OLÕ_è7vVÓZßY¥ü‹ÅÔ ‘NÍÐ+ç¶àµÓÜO¬2ÜNâ8a¤‘Û¢ªŒ’~•ÉGñH/e$úv£o§^Év÷óD.d8LÛ€nĨ­û nÏQÔ5m:$‘fÓ$…%,ÖópÛÉürr~0ñEÜ 2ê àûŽõåZ®ýÇš·‰£%b±¾Òí¯qŒ{¨‚Ý`¦´þ+,šÎ4xߨiWÚÅÏÕ¤CŒ'ð­Q­x‚î]úAosýo}yu2–Xc`UË1ÏS€=i²ø“ÅZIñ“©5´Ú¦‹6©§ÝD…Rd@F lg ‚jÆÖÿá?Õü ©êºŽ¡gw:b\}’82<½¹ »7ÞqƒÓß­'‰›VÓ4‡óÝ»j·K®Ù²ˆ‘QŸtmµTÛ‘Ó–ß뺦©§ZÛ_xn÷K±[ûigÔn<¶Š’àDîÀöÏf·|Qªj±j1‰üIk è?eI"¸#5Ì„ò™¸æ²ôßx«Xðϊƪ-Ρ£]2Úß,J¦áÃ!rFW€=«cQñ-櫃aÑn|™u¹¢¹‘Ô)+oî”rçî×m\GŠ1ÿ ¿Ãã´\gÓ÷"¨išˆ½k{À:†¥}£Ë¡pnnluËœ€ ‚ ŽøëXÚý¾³¬xêÛF‹X¼±Ó[@k›„µ}¥È—§§#œ Vvµ¬Yßx‡TÒõ+el4…·‚(tĸ&WxוáRÙùæ¨]6¥«xKÆÖ7oª¾Ÿ§Eö2êídŠiWË$£î\)ë¸çšÜµ·m'Wøsikuuök‹]FIRYüÂaV·1ÎONÕ«{spž?Òí„ÏäÉáûÇ1†;w,‹Î:gÞ¹? h°^x†âêîçR—HÕ9f™Ï’Ÿ8Úƒ83œgÞ™wáM6Ûáü~"Y®›\ƒI‚õ/ši ˆÁC`e±´1Ž•ë6’™í­æ=d‰þ"¦¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š+‚Òo>!ø—ûe¢Ômtø¬µ[«[b°oiDmÆýÏŒÇ$ç¥UŸÅþ/½‹@¶±û5¶§6­u¦_Rñ…yeäcæ>Ù«:ï‰.ô;+@¼ñ ­œïl÷WšÒ¢’»°«ssë€:iºŒf¸Õu ÛV´×Šé²^ÚÍPûàÅ&ÒWÓqYz/‰5}GìRÂW:óHŸiÒ/¢Hâ6ldv;Û'·5£¬x¦õÝSM¹×›H³ÓV$Û-úäÅ_ ¹2Nrk=ü]¬Ýx_ÄÂÏT3ÝiwV©m¨¤aL‘ÈëÊW‡!°£éZº½¯‰<9&‰©zêêYõ;KKØ% äÈ“6Ä 6‘ÛêM;HÒ]ø}=¿™Ýë¶/q‡oаo†lwc:=‘˼'zŽMF×4A¯Ú\ÞÚà …ÒÆó„?Ä®¸`È9Ë/ëÓ5Ó55«ÝÄm&[Ç÷¦]§*¼Ž[ äW“E¬ÙiVdžñ[Ýù’A:èI$9` |"”¤Šébñ…áø®=rî;!x¶Ú´¹eXʶÓ܃Æ>ÕÌ]ê1ßx;ÇWÑ[˱üH³$R#pZ"R3ÏÒº/x›Dñ–Ÿ¤y³ê·VË$F7ÕQÃ;IدZ×ðÂJ¾(ñË2­sa´psØ÷ü+7AIÛÀÌf)…u‘³iÜIwè1“íÅ;H‚ðk^•í¤U_ ºHÛ[lmˆþV8àûk>ÊI¦Ò¾!x},îEÿÚµK˜Á‰‚J²}Ý­¤žÀÕ[Ûd×­¼%â9,56²²³–ÆúÞ:+ˆÉUùÕT«²†8'#œU½Fѵ»û–Ót{è,cÓî ]GQ’ãÌ2N»HŽ9Xœc©8ô§Ûk^!±ðËxa¼;~úŶœÖ*cAöwÚ»C‰2s޽±šì|!Õ¯†ô{¨Ú+ˆ´Ûd•a•‚ ‚=Es·6wÇÅ>#ÓæÓîšÏÄd0¥ìJ PìÔï9<ñÖªÙë>4ÓôXü3ÿåÛëYýŠ¥ÛöFÚ»VC&xä¹íŠìü=¤ GÓt½þa´¶H™ÀûÌ'ñ5Ï]êZ§Ž Ô-¶iÚµµœK|ÌDUˆ$m> V6•áŸÏá¯>·¾¿©Y5ŒJpÑÃÈùÉse=ûVƒi^)Ð/t½gMÓÆ Í£[éú…¨‘QÔÅʺùN9d{RÄšäÞ"Öõ Hìï.ô9t­>ÐÈ¢¶Iiq–b:gVµÆ…©\ø%´±/›D}~Q o_LûV§¤xëWѼ&ÿÙ–ÐêzF©ms-´“ü¬°¡±¸ûU­nËâWŠ,.4iì´Ý6Îñ|«‰Öw–AûÁWÊŒdôå¿ Š_ xE×gÔôk F ‹;KXþÙ#$–‚Û…;(z6œÕïh~+ѵM­Kgq§p—bh7)WÚ¦ÂÊ pw’}+á®…äë ¼IÄÚv›sq¥éGÉ ¸b>Õè:ë«fƒZ{g¾Üûͨa3òà1'8ëYš×‡nõ?x_XŠtŽ-!ïL¨ÀîLFß§z›Ãúú5ƽ4’¤ƒRÕ$¼M ‚ªÊ£ߊà{Žô J|Uˆ¾Ðk¤6ž`ÛÉ&@û·gðÆ*¦§á½uuIµêqXÜ]Ç^Åq™ÞX¶! Ú’ÛÁ²ckZv£ªO{y¬G*ÜÝ?K®2BªöóªMàvm?CkøÖti\ÚßGå²í(Ñ’Au9gKðeõ®½ˆõ-jkûác%£)R0¬AtÆ=NIëVô¯ Ûéž>O$Mksnf ÄŲqӌԓø^ÞãÂÿð‹½Ì‚§%‰@…P¹Ç#&’âÃYMgÃÆÒi†ikt—cpÙ'Ê¡7/RÙäv>Õ¿EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÒ÷ú(¢Š(¢Š(¢Š(¢Š+ͼ;¨xÒÎ_¦›¤CjÚõð‰ŒÂ3çÀƒ•>Ù=}«BÓÂÕ·ü#³HðÉu±s©jN¤ºelìã8ãŠÑñ‰«¶©a¯hñ[Ouiqopp³BĆÃa”ò>Sœš~—§ø²yõ½JhlRh ¶¶€7“ŸùhÎTeý±´{Ö¥áïˆþœš¯—"m$Õw1”…#,±l9íã=«fïGñ>—ª^ê~6³%üq ›k¢Ë‰#C«¨=GPW·Z¯yáj^Õ4ûýJ)µMBhå$‚ €+©Ø€s´ÔòOZÚñq­[YC ©[ê6—D¸$‰²@ÇsÚª6‹¯A⣬ZOoýwi‘H­æí¦28ïÎjÏŠ4)uûà‚à[Ý[]Cwm#.åFr7/bßxgÆš¬ºmõÞ±j—Vi4PE òî[-¸¶:|ÀNõ½£è²iwzÕËÜy¿Ú7¢åWn<±°.:œôö¬³à¤’ÃR´’õ„÷ĺ­­Â( m!9\AÛß=EBþñýþ“¨jÚù´ëµž8b…R6s‘’w9χ5×Mš)"'Ñ”‘Û"¹—ðM³øsNÐ~Û*˧¼S[^ ÒXÉ!±ÈïŒzSmüvu]/ZÔõË«ÛÛ4 Ú‰¸#bŽ|ç?…X·ðŒjzÅçÛ¦{Uí6 Ê,ê¶q»‘ïßéY2ü5·ºÓÎ{®êSéh¡míË ò€éó¶öÜHö®š ÊßU—WGÜKg¡RFШI g<óÍSÔ|'e{{6¡oywaup‹ÃÚI·Î ÀÜ# pûÕýEÓt $±°B±‡iœ’ò;³3I'­&µ¡hþ!´6ZœXw‡^HdaÑ•†#ØÖEŸ€ô+{»kÛ©ï5m[u°½˜ºÂ}UN}È&´5¯ iZä\NÓAwn Åsm!IOQ‘ÔB¤³ð¶c§^i‘@Æ Õuºgvi&Þ»Iw'q8÷«Z‘{¥x7iæƒÊ GȘÀÈ ñZ‹RðÖ«Üé×—–åçÓß}³«2í>ø##ëš·c¥éºlsCgÅóË<Š3ó<‡,yõ5JO xVk-6]6,¬›}¼.2¨pGCõ=sK¤x_Ã: “M¦XEo4Ü<ƒ%ˆÎq““lãÚ˜þð„—²j/¥[5Ü’ ^F@rãø±Ó>øÍO?‡¼9s§Å¤Ï§[ɧŷ˷d0*Ͷ›¦YÈó[ZÅP³"€JF0ªHì½½*­·†ü1gxú…¶—kãýé’5ùWþÏl'7"$ûAŒFdÀÜTã=qšU‚Ý$’eD²à ̦O·j¯“£ZÎ×6ö6ñ\6wH‘¨cž¹ gš¹P­¥’JgX#®n?Z‘£‰È.¡Šò2:RàzQ€ rzÒÑEQEQEQES±3¼jêd@ (<ŒôÈ÷§Õ{ë-NÖ{+Ø„ÖÓ¡IcnŒ 7NÓtÝ"Ò:Ú;kXF#Š1…Z}å펟Ý^ÜGon˜ß$¬W'$àrjz(¢Š*»Ë+ yn¯'Ž x—t’ÈÀ*rx©AA–Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š*–Ÿ¦éÚgÚÒÍ6›©næ‰&I:žIÆ*¶òGÜìtÉ8§QET½Ôô4Fo¯ ¶Îu]ÇÛ$f™k­hWÒùš…´ómݲ9¶=pjõQEU±ÔtýIgk9„¢ÞâKiHÏË$g 9ô«TV(ñ_‡¼BwògÔ¿³c>[ó>â¸Æ3ŒŽ½=ëjŠ(ªšf§§k‘ßXMæÛHΪø#%©à€x#Ò­ÑEV­â$ѵ=&ÊêÜ‹MIÚ» ÂMÕQ†?‹±Ï^Ô¾!ñhͧZÛ[}®ÿP¹Ám¼uf' £¯³æE¼F]w‘¹æ—r Xn# w4†Hƒ.ÜFy×éQ¥Ý”’RxÚS˜0ÜW¦qéïY¾#×âðýšÏä5ÍÔò¥½­²4Ò¿EÏaê{W={¬|VÒ-¥Õo4Ý2âÊóf´¶y<ôA÷°Äm%G·=«§‹^Ñ_J·Ö¤¹H,&‚9„³ +Ž3ž†¥Óµ}X„Ϧ_Aw8/«}È&³¦ñ¿mŒmzÁ<ñº<ÌŸ0Î3צjŸˆ¼u¡øwTÑôû»›t[Íï;É& 1í;[9 ÃEhÍâÏ ÛÝ-”ºœí®#¶îËù’T`sÈ#Ú¹ÝWÄš¶Ÿ __ŪÚO5¾¼-šUL$QùÁLm“÷”pMmXxçÁZ¥ìz}ž©—2çÊ\0cûŒ@Vü ­k-ONÔ^ö;I¼Ç²¸6×lHäÄtÍrþ(ñö›¤é&ÿN”M ÔE™ÌR2†Ž@²ƒ€0@é“Ééš½i¬ÛêõÙõ)Ò+"I×O’Ý—pæ32†tÚqž¸¨çø…á8àù—ZÛKåOy24¸ê …#ŽädäU½cÆÐÞÁ.呚þ7’×ÉŸÍÛŽh9'#´hÞ,Òµ››› Õí¼Bg·¼ˆ£ùdãpÏ}ë1þ$xz8Öíí5¥´Â1¨˜Ùù8Ý»9Ûžûq]‘\6ŸâýAðÆ›©O&§umq¨Ih¯pΤ½ƒÈÀÆN1ÅiXxÈ\jVºeö}§Izٽʦٶ ‘ò³qÙ€®‚öò×N´¹½º.ÞÚšW?¨2Oå\ˆñýÔvöڥׇ¯ Ñ. [o£,«!³F°S{œ•Ú×7Äx<-qâ6Óäó`º{G²Ü7‰M›s޽úV”¾*ƒíÞ²¶·3nnÇ“ mǃœäÕÞ4ñeŵxkÌÒmZožyü¹¦X‰ ÉCÇne&´[Åéý¡áˆR×:~½lòCt[&åB¸#æíuíV­õùn¼K}¡Cn 61Mqq»•’Sò \wœçð¬‰~&µ—ÂÇKX|·×-™%u-#d*°Pr‡œõè85™ ׋¢ñÆ¿m¥ÙZ5ýΗ¦Iu<Îâ¶æÉ?/N5¿¦ø·Y’ÇÄIy¦ u_-í¬Ée¸Ü¡¦FFà{ƒŠ¡qâŸhM£O®Á¦5 Û{Y-íÙÄÐŽ7d6ßâÀÔË3âøYZš­>Ît›g+µ÷y>cæÆüç'‘í[¾?¿:_…õkÑoopaŽ6ܦøÏÎ̹Ç^½k'Ä>*Õ!ñ¶m¨ÙiÚp¼ûUê1llŒEã©ËϽt^¹ñ-Í”ŸÛ°À·1ÎéÖ͘î#vEb3èMfëÚ¶½s®YøgCž;IÞÉïîîäMþTA¶¨E$Ìs×€z˽×üwá; `êñè˜ÚÝ4»Äï;m "H*y$pG½?X¹ñׄ¬á×/uhµhfˆj¾B  #-œ¦‹9Ǻñ¦¹âßh¶š¸Óô»,eHÓfTθ+‚sœ«tÇ5¯\øR🌴ëýQžm ü#\$h Ô +qŒÏ;vôùÖÕÿá4´¼ðV‡§x‚PÚŒwÿjºš(‹•TV(U^ƒ§¾j׉^ïI}ÃPñQ°ÒÖÙÄóï_¶ÝÊ:ÂRTg¶+Mñ6¥6ŸñÒÏUººƒKÓ–ãO¼¹M³/™꤀GÊJþur];Æpx:]uuëËe­-5 ¹QˆÆæD@ ¤ƒœäâ´oõë{UðU–“s$0^Fu‹£Á0F£j7³1ÁúWsEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š+Ê­ä“HñïÅ­Ö§•t;,JÑûècñ§|Z-ª©ÓÝo¦ÙNàc‚ìâ8ÁüØþÖjö·6¥ý‰áûh%»†Ú;‹©î™„P‡û«…ä³uíÞ¨Ëã-fÊÃÄQ_ØÃµ£Û-ÆÄbaž7û®§ã äG­dø®óÇWž¿¿¼KKy–ÒU… †DBÀüÏ•Î: c=j_µÄ:—æÖí㻑g¾GmemÊ6íFÉôª$¿ðýΩḠÒ$ÒgMZÞQ¨ÜÛùQª©åã’ý8Õj÷þ.þмŽ‹'L¶‰<»»ÀíÃ'ÌL*ô9äö¬¥ñ‡‰'ð½Î³´–ãMÔÌ7fZ)àFš>r2§<–éÞ¶uMvýõ iºKÆRÿÌ»¹ŒâÚ0ÿ ÍhøŸR¿Ò4]BþÆ>æ·"`žà@ä…œzW1áÍkWÔ¯,$°ñE†µi ?l·(±ËþòçƒÁ ?«á7ÅWâQg«‹ T×oÄ"8•™œ°$¹lü£ ­[Mĺ—„tÝF;ÛK —¹òoï&ÀH£Gew@Ün8Žj¾ƒâ&"±Ó-¥ws§jºtòÆe™­äŒ€v8ÁÚAã'‚8¦ü.²KGp'žFž{€VG,©åÊÊ6Žƒ=N:š½©Ovž1ðü),‚ l¯wÆìb0A#¡#·䚣xÆæÚÒvF ÈЫ1òÄ¢\+鑞¸é\ŒÛØG§ eu­Y†æ6›Q”¼°Lå¹ Á™6?¸P¿…hêsYkºþ³m¬iz–£ic$0ÛAj”Ÿ.K6>bOÎtþÖŽ-RÚâÞönÿâ_öïõ¢&^W«)Î2zVæ·£ØëÚuÖ™x3 ÂmÈꇳpyÁøhjÆÏÄ(Ô¦z¦›k>ŸkÇ-Ó$ÿ¼íÉ?Ë¥Ogà ]x^-Nò&¥6ž/dÔ‰>zÈË¿pŒ€{RéWޱà=Bïæ¹ŸÃ÷ òcï1U$þ=jö ±Ÿ_`çÂ2© |ßëzSþhz6Ÿáí2öÚÖ4»¹¶ÌÓcç Ÿ»ŸAØtâŸã.×Yðv¥rqgo¨M „ô2mBéµ-BÏJ²º¿»p–öд²1ôQ\?ÚíüSâM¨Ú4V3iwWö¶Óà†œpä·Vöv^;Ò¿³£X¦ºÒ®Î ±ŒòÙ±Ü7ÖO„t}%>]Ÿ±ÂæÏQyÉPK²³€Xû`S-\=·ÂG”îgERÄuÿF=kgÖ_ð—xÞïÊSr'±Ì#æ ågúW#©ýŒx;Åÿhèëã ¼ìÿwÎLþ•Öxøé—Z>£Æ×Rê–L1àáÇ̘ì9ÇjKVljnµK-TºÓ óïa´‘áÜÀzwúw¯ ñ¡¢j^co¬êÚÖ¤Ë ÄÈ‚(|¶FxÕQ@ŒóŽ8Í{u­Õµí¼vϾ ãYcaüJà ó^dt[áã‡ÑÖFÑg¿:ù“fóB¤ôåùÆjo‡Zf¸š†¢ú…´‘aÚbXAUY‹‚z‚6 ŠÃ ý¥¤ÞìØëÚ—ŠgŠâ'´q:ÛÆç!và¤!ÇZè'´ºÔ~iWÅ,:–‡­Ôi:20–φ‚ŒÖ×Ãèg¸°½×î£)s®ÞÉyµº¬Cå‰sèd}i>"Gz4ý"úÚÎ{¿ìÝnÊöXm×tŒˆNv¯sÍ ¾¡/‹uÍZK9à´¾Ò´Ã L»Ha»r‘ýåÏ>•‘¨i.fø“ý—±\^Í`öRÌ«‰7c€@<`žµ¨èÿj¶²—Ãþ¹¶’ÆúÎêê{‘ÜH°¸%#,ÌÌO©`1ë]Œ±ëV¾7¶ÕcÒçšÇQÑá³y¯ú3¬ŒÇ̺`öÏãZ>>ÒõkÂÚ¾§ÅæÝÏã â§ îk?İkÍyOáØ5íí?uæÁ0<ŸÞ¥HÇB©>hÚ¦¤g´|7·­qo§,›Å¢mdžH ~»¥ø‚Ï^·ñ>‰mì¿`k »7!tݹY‚2\ã"³n|=ãoØë-¬ÌšsÎmÛK³F-^ÜØ’Ç®8—PÓü}ã!Ñõ:ÛMÓ¾ÑßMþa¸H˜6ØÔ(Àb9ÝÐv5¹¥è—ö~&ñ¯)캄 Rw °lŒ`uã²n|ªÜÁãØ °(פW´<ü»b ûÎ=GlñϵKoáÿß_x;TÕ¾É ÆŽ/Væ8˜0–=‹´=2súÓµÏø¡|G‰4&±–c§‹!½ åƒ#.H'<Œv¬õðgŒ$¸ñD÷š…œßði?f—j:ù*² A“”òO'ÒºûaÑ´k+kùã igJçJ¨RyìO­q 4h Æ©Æ{?µM§éN{ZC#´÷RÄþUé4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢Š+„“Ã÷z«øþÑáx~Ùqo%¤Ì0 ‰ •e=ö°–t¿ê¾ñ^¡§:kZº€¶¸ùÄp€ª q×­lʺ¿†µÛÍY4»‹ë RÎÕn>ÊK Ð £*H%HôÎj£¤øƒ\¶ñn²útÍ{¥ >ÍÊù¥$–Ú 1àné×»âm/SÔ|w§ÛÄZõ¬b #%ÓôÏ—­7‰uá-jÛB¹2YÜO%Å¡x„ˆ í— Ï×ëŠnº<_ã+Ð΂ÚmµÑ‹íWRÆÆ4VìT/–ãŽ@¨'Ñu‹?j×—Mm.„_b¹’DýÂ*啺23•?ZÒðv®YÛøƒN×,bŠ;Ëé®àpb‘g2¨á†Þœ¨ö¬Ï†zeò˨ÞÞL'[ý‰c ï »ŸÄà~Ûëê×}ÔzUÊÛ_̺‚¡Î ðz+m_×5M"òûC²Ó$°»ŽækȤ,ÛÝL*­ßqéÚº éúBëBè¡û^³wyÂOîäÆ3Àæ¹ÏøB¼@š&µ¤×ú^«qx°ÌXÁ2»¶d0 í85pi>»Öt]bóû:8중 œLä$r.„…Fæô{ÒëY%»\@²'Ь1»P“;z}ì~®Ôò®{Eðõæ›á¡K º]JïUÕuion/4Ù,&PŠˆªÄ“ŒcÔ󓚯ÿFµ=¬ZMïˆç¸Ñã(¦bI#LaN½¹8ÖŽ¡ák™5 õ]U—L¼¹‰#¹ÚˆñÊî’Œ>ðdÅ\ð÷‡íÀ­=oºv²ºqY§²ŸNbm'´m­#Gm#ŒPé¾ ÑôÝBãUÝ\^ÜÚ5´ÒO!mêÄã±àŒ v­m'K³Ñl-tÛMßg¶bo9l{š“PÓôýVÖk+ø{i—l‘¸àŠåãøeá–&Ÿí—Vиx­.n$xŽ˜BqÇlæ·u¯h¾ ·ŽßP„°‰÷Âñ±W‰±Œ£)¡¨´O èZO%”R5ÅÀQ,óÈòJàtܱÀôÎ*ÍŽ‰¤iÚ`Ñí` `#’?+$ü®InI'œžõNûÁþÔ´Ë-êÈ=——öhÃ01ì`Ct÷­ M/L°šêâÖŽk£†rþZí\ý]ü9áÙ-®ì¤±‰í®îÜñ°ÊÉ)!·{äPØxGÂ:]éÔ,t«x.ÎìH‹‚»ºí{à Óµ xKV»KýCIµ¹º@–XÁ8Ï\{æ­bèbÒâÀX[‹;–wš ‹²Bç,Xcžô¶š>‹aö²YAÙ¢haØ€yhÇ%W€O&£“Aðì·‹¨I¦Úµê¶á;F¥ÁõÝŒçñ«¯om$±Nñ#Ma7&î¸=F{Ò˜`2‰Ìkæ„(pSÉ늮4½ ]Ñe»=gØ»ÿï¬gõ«tP ÎhÀ8$téKHFpÍ-QX~&ðôÞ$µK©ÜÙZ¶åºK}¹øK0$¦+ba¶Š(!@‘DŠˆ£¢ªŒ*J(¢Š(¢ŠFePYˆ I=¡YUу+A4´QEÝ–¡–·G=¼€ŠU ­ƒžA⟽µ¬QÁoE kµ £ÐÅIEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*®£§Új–²ÙÝoòdÛ»c²·# ¤Ö;NÓô›H,l!Xm`]±Æ½ÿß5<’ÃÓ#ªn`£qÆIíO¢Š(¢Š¨Úž˜—3ÙµÊ ˆ-Å̱çæXÉ#qœ}õ–¥k픫5´è$ŠEèÊ{ÕŠ(¢Š(ªm¨Fº„zw‘1w·iüЇÊm-Óqì=*åUcUµÑ4ë½Jå]¢¶{,c,Ý€ԚɛÅw0Ý´[¿·ê~i[mÑfŒòÎÛöô ðI®’Š@ÊA ƒŽµŸ¡ëVšý„Z…²Ir4‹²PŒTä{Ž9«òI(ÒJꈼ–c€)‰sk$^zL3æqõéYžñ‡‰ôØuPcnÝ •Þ˜b¿0õÆGµA«x·IÑõ+H¹’5kåšF‘TC±r7sótõ[Nñ…™—]]bâÖÆ;ZK8G æ*¢¶Nâ9çµtQÝÙËn·qÏÛ2o«…}sÓOMñ†õ‰%‡LÔínå‡>bC"±\z€MK«jvz=…Þ¡w,qCovijç°'Üñ\Ιã[}OЯ¬u y./ †ö qVu$Ä„mùý2? ÖÔ|gàÝ*Iá½Õmãš ,[²êHÏ*2zJ¯?Ä[¼ &·mûäGFVÊ€ý 0 û‘Z𶻡èVéu©]¤Èá#'$»@É'è 7Gñƒ¯ Ιv“µ»„™CFOMÊ@#=¸«:Ž¥§i“_j ok îyð?úçµeiž3ðÖ«zºt2Íã£ÆçS:ì2Ëgö}¼ìüÛŠã¯9郚~âíRêöÿH¼Ðä´Ö ±7°[™‘–â<íù\px9W/áÏëúoƒ[ZÖté®V+æ…$󕤛|ì§€?ƒ õí[:ޝ$ÓøZ}A{k‰µá Šyùh·DÄHûxÏPW'ëYš>§âKøÚÇDÒRîAªÅ4²ÜMåÄ¢\(!]‹ÂàzÖ³|@iOxtÓõ¶µo¥^ÚHã÷O#ªä0#ÀÍmø‹^—C›A YF§«C`Ķ<°êÇpàäñÓŠâ¬o¼XÚ×ÄHµ8m.4è-Ѧ·ó¤ )Šª¸Çßû¼ôÍj[x¦æ-‡´è£«iñËonìÞE¬(€³11UÈ¡5¥§øƒÄ–š´Z'ˆ­íV{»ig²¸´-åÈbÆô*܆ç©V™â¿‰šÏ‡G‰mí4»{x¡šSžk<â"w €¹Çú×y£ê)«éš~¤ˆQo-b¸z®õ…]¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿ×÷ú(¢Š(¢Š(¢Š(¢Š+‹Ñ|W©Ükþ"´¾´¹ŠÂÐÄë,¢0–ª#ÉÞCgæÆG ÇR*Gñý¼Vë©Ë£ß¦ŠÌ1~Uvì=$)»Ì}J~×+£¢ºÊÊHèA¯3:牵?ǰ][\E1Ýyr4‰þŒD@ˆÆÎ}ò ëÖ´lümªXéZv¡w Ü&Š!¶G½yS̰»Ì|¶ÒNsœãœVþ©â «}B='K°7ׯ<À¸D‚2p 1–=ñRh> m^Kë;«9,uAqnä0ÃŒ«+ ·áô¦x“Ä2è­§ZÚ[-Ρ©Na¶ŽGØ™Q’YðØØ{ «gâ]^Üê‰â-(Øý‚×í_h…ÌJœä+C¸z P“Å~0¶ÓGˆ.ô8“JÚ³<+)71ÂŒ»r%sÀïYúÚêš§t3­ÕªéÒ\Ù™Ùˆ•ÜøÚ@aü8ÏêQñå•¿oLvs5¥åÔžYyOïP)*¹ÇÉ·§Nk_TñÛÚËáCkIm«¤3Ü»g0Å+"©ﹱϥ]k¨øšÚÎÀ]E¤[Ûˆ‘iäŠäœ` vÍdOâ?h“éO¬\é2­õí½¼¶PY œeX»nÚzü‹Wµ¼m¨x—UÒl>ÅŸ§½›¼ò£4…d\•0<óÆ= Wj:¥Þ¦¶šÖ›¥ÚÙÏ%´"ç $ÎYtÂgŽO\ŠÜð‡ˆÄšX»”D·0Ï-µÀ…·'™ê§ÐŒ×­eÊòÅãmI×W\ŽâCT¬¼Eâ+í#Âv6’Å«¬E#ËpѰÇùÙS“À¥i}£Æ›R¸ÔîQÑ¢Ó乎mª’Ç*Ë2¨aÐãŠäeñ³¦Ÿý¯ôù51 Ìt±åOsÇï7c€wuí[÷ZˆµíN²ÒõWÓì/.mm’;‹‹‹”šE4‚)\.Oû#Oñ¬zMæ« ZÜYÝj—Qy÷0é±lò_dÅð0‡îóÔô5•á«.×,.´[}:ÖûEŠiìÃÆçÌ+¹”™=ðëcáuŽŸmá«ià·Š9§–äK"(@’¸\‘ÉÀàf¢ñN—¥]xÇÁ=œùÇP—E%ÂE•Ý‘ÎLô¨|+ èwºç/ol!šàjí´ª ±OƒŒçŸþµs7i¶ðÈÒíaŽK3ãW²6ò9XŒFBÁ°p…°®;ÖΣaâ6Õ|/5垉¤Í¥†H's,©ž%_%2 öÎ+ÐõY,îШ`ÐH0{ñ^ghð§Ãv\q­XG|ÑxfÚØø·Ç ™|ëÑÈSHúV'‡l,"øuâ†ÇšºÁ”|ÅYÀÏ€M[]}gÀæÒòÒݤð¢‹I/cgF—åóéó•Ç~™â¶ü?¢Þ4¼—PÕì®u4‘ÌVî€+8(drî7p3œUß"“Ã7¬Mƒ[…âåX!~ÛCw3º²¾Ô¼cc"M©mCtžY£‚0|Ö8è¤qïV<,â¦ñÈÜúe—Ÿº¦üPu‹Ã2Läâ¾±wbp W“Q[\X^üCŽæÚh§ŽO nã ‚<þ ŒŒV>·i{¨êßìlFë¹ô òÇkñøô¬k»Ý÷@†Úoj7ŸnŠ;Oì«xí|övöy@©òWµìV‹kkxb"‰-ÔíçÞ¼óBñ›à9µ/ø’CeÔ'ŸNºto*he;€”ç ‘W­µý[Æ:¼‘è2²xv >tžéãÀ¸ž@BˆËpIJÎðÇŒ´O xrÏDÔ’Xu­>´k™%‘If‚¨ 㚃DÑo´MKá•ÌçCc¬°ØšU ´žœ]$ÐÜÂôœBþOü#sFeÚvçÎSŒãük…ŠYåðmÞÏöž•âÚx„O½Ù`TãcžNzWuã‹k©îüÐ[É/“âKi$1©!cå›õ5g­ÞøgÄÞ0}GG¿m6îòÚK{»xÕ˜B Œ('„3‘‘Tnô_jˆõÄÓe[½C\³Ôa±l L¬€3ò‚qŸj¹®k¿Š/ü$ºv…¨%¶·msw=Ì%<¼µˆ898Àãžjg‹V´ñG`:UܰëZ| ksæ,Å)VlðIàuªÖºgˆ´/ëisÝI§h¿Ùú…’mó•T‚  VŒçšÕ´M_Å>"°ÖæÓ.4í;IµºŽ»ežiÀíáTç’j_ iµ¯€cÒ®-Z+ïìû¸¼†#!œ¶ÐNqÎGz·¢Iâ 'Gð•Ò^Wkh ¾>b²A’zîçŽ+¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š+Í5o{«ü@ðòMåêz¥³YÄÜyÁ`çiôϬ\øÓÃ÷¾m*Ô4šÅÆžl×L°•ddÚU”Ž{“ÆZí´k9tí/M±•·Imi,Þ¥^-å½¼ÿtwYMõÌSÝž[23)Óük_Ä0Ü?ó C+Ëý•f<µB_#n~P3‘ô¬ÝK²´ñ$º–¬º’é÷öp*Ïbó(ŠHø+(„ƒ‚9ŒkKÀ–x¸Õu;=>öÞ ü¨a¸¿šVšáS9;%$ªƒÓ''ÐUßEöö1_hgUÒÚsö¿,-¿+¢˜óÁÚA¹K- }dk–:+jphW:cÆ©¨ù~Ó¸òÖ_œ(ÇÍÀþZwÚïˆ5} ô(tèu›«o±Ëæ& „°Úïæd‚ dŒdŸJÒEÕ‰|2¶ðÈövz5ū͕ví õ4xx_Ùk¾&Ón´Ûowx÷±]íVUsŸ½íŠæôŸkiâ«ÈV ?ìíد̉#ÈŒ9?ÄW®:V•®ƒâÙ|«.j³Íy2ÚÙg `N2ƒž3Ö²ot}Fm>Ðè^ g{ou0•¡Må°$! Ù'¹v\â»=ÃS‡^ñ&£sna‚ý4óæRIHÈ`@'îž?•sÇ÷ú%Þ¬±øZËY‚êê[«YØÄ œ˜äÞ¤à„Çjë&‹84TþÏ‚8‚BuTbe1¯Àr=\ŒÖâè—«âxµŸ5ZÕ4SbA?906OÆ=úö¨.<;ªO«kבÞ}š;ý:ÞÞ bÏ™‘–ùã#¿5?‡¼g®2×^“Oû=Ü7O¿›)„ämÏ ¸õÆ}ªÝÆ‹âí2òþ ÜÙ}ŸPŸíCz¯ˆ¥ d(‹ ÷ï[™y¤Øˆ/oå¾»yiçõfêdíQØ•Æ<Úý–°.b·²šÝ¢ÚrÅÈ ƒžßCPèž›Iðêèot%Eržp\­f9ÆOLúÕí M}IÓt×›ÎkKX 2û3Œœ~f²o¼3«.¡y©hZ·Ø$¾ ö¨Þ%’7d †Çœ*3à¨Ûú–†ÚŒò\j,ÒÜÞÊ;HÄvôŒ1Z—ZÜêº6©ö†C¦ÇpžXùª'¶1Ú²ï|#©}®öçD×gÒÒþA-ÔI:³ã“pùXŽ¸Ï®*Càmhvú$oðÖ‚e:N›ohÒÿ¬hPßR9«ñZÚA$óE $³°i]@È|Z.-­o!’Þæš kÇ Xzx¨í´ý6Ï˶°ÃåÅä§–€mLçhÀéžÕ0†‘æXÔJêªÎËÐíP®Ÿ¦­Ë^-¬"é† Áò?ÞÆZ³Mxãmu =¥Œ.AÇ#¡¥¢Š(¢Š(¢Š(¢Š*(nmn<ÁÉ'–åcµ½;Ô´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢Š)¾\eÄ…Fð0ãëK±7oÚ7cÇ4´QEQEQEQM/b¥€`»ˆÏ8õ¥GI]2°È#¡´QEQEQEAyye§ÛËwy2Ao î’I £Ô“S++ÊrÈ>´µ^úò>ÒêömÆ+h$™öŒ¨2p=i4ëè5;+;øn Žxà ®22=j¶™­Ùj·¥´ "ɦÝ}šbàÍ´¯'#ŸjÒ¢Š*íííµÖ62\Es+¤Ó+-À\†`y ž8«¤¨êqÛšZÌŸ\³·Ö-4WGóîme¸Y8Ød s“ž8«ÒÜÚ@ȳL‘³œ(f·Ó5-qž ñÄúŠ4ìÕì¯"æ¹Üs÷(1ŒgÉkcźëøsE»ÔbŒKp»#·ˆç÷’ÈBªàsÉ=ª xk°×õ# § I7ÍˆÓ GVíÇsZš~¯£jÈòi×Ð]"ÂêÛsë‚jœþ-ð…²æMfÉr²0ÌÉÈLîïØŽk‘¹ø“-÷‚n|C¤5šjp4"kf0A¾]£~Ò‡‘ÈéW5‰þ*huÖ¬úŽ“{œM4°}žH˪òpÞkóŽœWA'‹<=i¤éúÆ£t–v÷ÐE,BSóêêO=¥²ño…5+ÝFÓQŠ[[$/rËœÄÎYq¸qê*Ìúî‰m¥mËv‹¦ù ?ŸÉRÐŒsÏÒ¯Ç"J‰"£¨e> ×1qñÁ²Ï—®RÞSó¤2´1°ê@¥ýõWuø_B6P¼ý½ív«7šòí$ä`wíI¢x»A×î.,íZh¯-Ñd’Þæ'Ž@‡€Û\)ÇÒ°õŸˆÞ]3T–ÎK¯.8® Šý sœÚGÞèpW=ë£ð½ÕÅö¢]ÜHeš}:ÚYã,Ì€’qëYçÇ:jóèvð^\ßÛÝEo:C ˆ8{7@ƒ<œúði/|q§ÛÜÝÛZiÚ†¢,ŸeܶqnH˜uRIaÜ(b*{Ïxz×H²Öc‘îmïÞ8ìÒ&IÝú*¯>¹Æ1ÍgÇã[ã©iZ……þ•~št×+ÁÉ-+2îQŠ®|s£èG„±m¨Þ®¯j‹i¼ÌUC¸e› ddg’@­;ÅßjÔ±µM2çK¾šÝ§¶I™ïld$n^ã<{õ¬íÅ>—á öÚ ÙÅÛ}žÆÖFq4…›å,N;I +CNñeójVºN¹£Ë¥Ý^¤hÆD’9v ²î^Œ8#ñ¬Ë_ø‹WþÐ:'…åº]>ö{YÞIÑ´M‚ ’qÏ@q“Yþ%ñޝ¥ø;VÐmŸìú†«m¿3É|‘ä¸ÁÈcO#ކ¶î|Wâ9u#¢i:M¼Ú½ŒWË=ÆÈâ2ŒÌ}öü«gÚÅÞ·bךtÚ}ÔSÉÖóvd<•lÊ{0k?Yñ²º¢h>³†çQÂêâK‡+ ¼lH]ÛAbÌAÀúÖyñ'‰n­|C£Íeokâ !21ŒDàþñ ÃŒÁïIð–ÖâßÂ:cËkiž%• °9÷¤È9ïÖ»Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š+‹vñ&­âmsNƒ[šÆÖÎV‰"Š"x¹'.­Þµôý'XÓ&’î÷_¼¿…"|Á$p…ú.5bGn Œ<.ta¯­ætâÛ„mÅ÷mÚ·gŒmÍ&«âÍ+Kž ?&êîúh|ñkkyV<ãs0>¤Smügá›"}dNémo/‘2:0–9r–S·dŒ æ‹i÷w¶ú}Åå…ÍÒ³[-Ü[DÛFHR œ R_XÜÉ›¤êWÒi÷2[Ý,1/ÈPH,Êq“ŽÕCÄ^7¸þÎðö¥ Cqqo{©B’4j™Àl4,‚Ž1÷…vÐM,ÖÑNöï¹…öïBFvœ2:pH÷¯<ð®»0ºñ^½­Ã}o ­ÍÌlóÌ P$eqÄŽÃxõ sýîktxÎîÜ[]jšÕŽ™rñ¢]HÈJÊŠIPxçœgœT·¾.¹Z¸Ð4ý"kËÈb†bÁÕcýIcÓBOn†º É.¢¶šKXDóªe¶‡>›°qùW“6±¯Üx3D¾Ô –co­ÚI‚PòÝl•²1…Áã$æ»h¹{áoXjœ³K£^IU\FªYÜwçhSÓš·®jÏ Zø{E›Z¹·Šù%–âü¨y‚("mB$à§zÕ]3Å)¤êoŽ©¬i ¦ÝÜIö¨ß}¼.ïõ…‡`çš}Æ…âOÂW:äÞ ½•Þ™%በp®›¼±1¼g¯~µØø8“á“×û&Ï?÷ìW!¥x{ûwÄ~3—·PÙǨC²ÞÖfsÇÎÌ„7a»xª³kúÖ—á«Ë#{u,éâgÑb»Q¾àD[9rárõÅ6).týGG›ÃÚˆÒF½†+áz²´S@Ç Íæ3Ëœ‚1ùV®¢®­âOÞ_Þ]ÍŸ­!´¶38Š7©-´Ÿ`r§&¹Ý:M;ÅÜêÚ¾®_^Oup°OlXGnŠåTC¶Ehœdœõ­{9õÉbø~u•ž;èõ[¨[ÎÀwUW \FJã<žiþð–…®^x²ãV‰î”k×Å’1HÇ•\à1Ï_aŒV÷ןþØ`–g˜ÚÝ]Û«ÈIm‰! =p8¬ÍsAðíß4).la–Yì®e²çsC·cuíQxKÚŠ,/õ~Ê+íBþòî9ŒÃ&ŽB«ç• éŠ×øy,­¢Ínfyà²Ô.í-fs–x£o—žøéøVGŠthuïM¦³k¯ \"¿÷N¥àyªún¬þ3»ð¬Ç-§Z˨j‰éq ò•O¾ýÌ>•áØ­u+†šmþL”ê’˜Xå&–>XnÇ uzŽ•¥xÏÂ¥ÛÇoux—±],*IG‘¼ }ÖÆ*†z.‡“z–pýªëR¿ÈTnm²Æ}0:W+qcàÄU ¸SŽEßô®£Ä?´û&ìÞx“VXcÎ&æã|Cg#z0Á_Pk&ÇZÔŸðQ¹†I!† @ˆÌÊ Ú?/SÁàWG6«§øÇÅ^}}Å®—wWWJŒ#S,{Q dœäé\½¾•¨Mà¿j‡í±Ã¥]\½à²Ü³¤2]ÊÏËÆp3ŒÖÖŽ¾Ö¼E¤.M_VŽÀÉs%åÜÒˆm›nÔnvéŽ09Ít º‚Ç]Iâx³â=Q:‘•2pF{ÕÆÅk}cðÿÂóIcrͦx.î!X˜Ê'|˜ÏOzÕñ+øoTÔâ¹×|7~md±†[ RÎ9üåÝÉŽA¤@ õí[¿¢×bÒï¢÷n÷ó6œ/ÏúBÛñ·ÌÏ9ÎqžqUõ©øcÅWzÜzeÕþ›ªÙA æÑwÉ °“‚W íe=³‚)º]ž­­jú牮l&²Š](i¶6ó€&‘,Y—'nÎ}kcÀv—vÐm.áx.!±$‰Æìk¢¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š+Í.´Ÿ jž5××]òð–ÖùŠÏF\öõ®“@Óþi2ke¹š<0I˳(ç¡vúô¯<ûF™ˆÅÆÍÿáþ×Û»qòÅÎ6ý«f1·wÏ^k°°Ô´­Åþ&mRæ+a¨Ácqg4ÌK&Ö Ç”õïšË×oìµ­rÆ»Zp0w*“ԃОÕ!m?T×4+UñEÞ±4wKx°Ú­¹ŽÎùYT§§ÞÉϤðÇ‹|+¢Kâk-Rþ+I—]¾”yÄ1Y¿€÷#ÀÉéÇ5—qº×ÃQk—1Émg/Œ#ÕÂȤ 2pYzŒŽzw¯S³»´¿¶‚òÒU–ÞxÖH¤^Œ¬2úלI§ßj:Ží¬ái.Ä“N‘3Ë1¹× qïW¸æ°ì4ÝKÒ¼«Ç§K4úe¬Ð]Ùð&ËÔ¨'—3Íi“âoj[Ëg.™¢K§IoÝ(K4ŸÇ´B¯Ldd×.<3n, Ó`ø{f5 «]OFÔcƒ)`wzã«¶¶Òo-¼SÒ[ªØGáõ´˜ ®²gh\ä tíQ/Ä ­ø¢öÈ$-w§Z%œò`¡–0ÝW®F~µÎ^øoV×&ÓO [麤WpÍ>§¨6l9b›>fÝØ0y«÷š¡¥jZµÍ¿‡-5»}F´¡•£Bì¸e%Ôü¤ŒŒ2k¢ð®›¨éº{.¡´W3Îó46¨«!º ÀÚ;žMfë6zÅ¿ˆáÕt),ç¼}?Ⱥ°¸£I|¬Š@b6œŽPƒê+I·ñï‰üNš”–íy.‰f8 íÌ„ìBÄNIÚ:ô­¹ü/¨Þx& É4pÞ-…¼ ã&=Ñ`àô%N0xèzVN«¡üDÖtÛ{Ao¥X àš8"we¸hH gjì_ø ž•ÒiF§k­ëš­ÓEåê1XŽ2IF…l’FOU<+¨Miã fž!ý³+½±ÁùŒŸñôíQK xºâËG¼7Qx‡K2,l¡ÌÆÃ£|ÀÇCÒ¬iú‰ïnç½ñ-ôOÚÉj–{Ä_ï3î9f#1Ú³„|o—/†áÖíÓH4Îb&äDF˜'Œã$všët=>M'IÓ4Ù$½œ6ìà`1@È=~¦ªéš^£¯_5ÇšºÔsªmÇ•µã99ÏÐVjø*,u«+›×&ÿX—S‚h€W¶rAM½rTާ¯¥øW^¹¿°»×5潆ÂO6x¢#È &·Ô{V¦‘¡®“y­]‹†—ûNð\”`‹צkj±Iy‹â ôÝ>öY%šÙ#F(Ò}ó·+ž½ðzUäðv“>·µ’HaÑ'3DªAó RòGrrqŽjö¢A¢¶¨ÑLòhj2ß>ü| hÀ Rè:%¾höpÊò£\Ï>_kÀÀ‚ªk¾‡[½Òµ¾º²¹ÓÞBlTWÆål†àâ©ÞxÒkË»«=WQÓÒöC%Ô²…ŽF#–Á {EoéšfŸ£Y[éöˆmmÓdh;©ä“ß5 hÖ/¬E­“'Úã³{5ù63§f—ÎX´Â%ÜKu9ÇSÞ­Zh>°‚ÏO·€ZM¸Ž5W›÷öàq»¾:Õ£kf× vaŒÜ¤f5”¨Þœ\¬tMÝ=ñÓ­Û‚o-w°#-Œô÷«‘E ¤P¢Ç(TE @íBÅ3º"«HAr,@Ç4Ém,çxäšäxÎQ™A*}‰éS ò 5#Š%Û*¯¢Œ ÄÖ4 u=[Úœw%Ò..%d+Ÿ0KLž1øÖíQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÔ÷ú(¢Š(¢Š(¢Š(¢Š+:ë@ðõôíuu¦ÛMpÊË$jXÛ$f›‡|3lþdU¤oµ“rÄ€á†Î;Ž [[ =mEŠÛD,Ä~X€(Ù·ÓoL~Ë3I½†;{»8'‚)xBKu¾‚;ù´ñ·Í¼ŽÚO&{;`r;àVƳâÝ#Gk8|»‹Û«È̶öÖq—‘Ðul ¼õ$V…üJÚÿ‹5äŠ[¤¶·ÓìÔÙÜ£!‚\¶ì©ïŒr3ŸZŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÕ÷ú(¢Š(¢Š(¢Š(¢Š*•ö¯¢é{~ß}om¸¾sªäü‘SIyc¹¼’â5µ ¼ÌXlÛ래üj¦Ÿâj°Í>Ÿ©ZÜÃ&WŠE`€w8â1!ápúšê4?x{\ƒOk{ëv¹»ƒÌ$€Êp:gfyâ´-µ]&òâòÒÚê)n,Š­ÌjÀ´Eºn³Tæñ_…­ôø5IuE”îRϘÀB’NG`itŸxk\ŽæM:ù&û/úõÁûÊÀ0üª='ÅÞ×dh´»ô¹)žì¶ªÿ´ØÀ>ăíUmü{àË«ˆàŠøâYDQLÑÈ!‘Ï@²Ií†æºZæo|sá«W½ˆÉ;%™1ÜÜÇ ´0?£8R8ï×ñYžÖnnìü%ö­;]_CvYcmÙUþ2gQŒf´/¼y¢YOuZß]CfíÝÍ´ ñ@Ë÷ƒ0î½ð*ž³ã9muG§Ãsu§ßE,Îmâ.“)±²>ïVö5¢|i¥¾¯>‡oi{q{oqSyqe#WïfÈG×

    ÕÉx‹Æ:¤úÔ4[[ˆÙuo²ÈùŒåJŽIâNƒÓ<â·o¼M{nÖ–VÚD×:½Å»\0è(2òd¨ð1œÓlÒ‡îHÑ47b v=q[ºöáÝ;ÇžžÆÚ kÉžý$X”.øÖ‚@‰À§|<ðÿ‡.¬¹-èNÆÉüO5S@Ô´ÍZÑîõiÒÞ K–YÜÌB¦bdÜxÉÈnÙ«žÕô]câ‰gÓ&Y£]*Î'‘RFF9+Øã¦G¥zQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š+Ïõ-'UOkZž™i¦ëkp–ðÝZ\¸[í^I ¡X|Ø rkÏûQoèëc%–“«¨Çu§ÎÛ•n¡–<ä‚ ’TtöãÒkÖvV~)ð„Ö6ñÇy<·pÍå¨íÄy`ØêÆ3Þ³4ø­¿áøåÆŸ-þ¶Õ`I¨ˆltx•/öZÙJö‚á$éõð®pßÜh1\xüßYêKç"o70ã­úWOwj4»ïèše¬º­žŸ1‚êí˜$(¬…Uyfoõ“öÃã n;ûëK»Á …”ÛG±cùøR 9ÈäžýG¥ÛÌß Õ4äIJi²9õl±/ø‘šÏÖ?µ¯<(‹{âM$ipA odìä’6*(œ’Àú ½N4™m’3&éDAw‘Ôã©Âx?Yðý‡ƒd·Ô§†¬îFa¹dÜÛ’[·5“áfàø]"0ë«*ó×ålÔ¢ãJ¶Ÿ^¸ÐüUýŽñ^Ü›Í;PXÙ<Ñ÷Š«Á_¯ sÛeõ¨Ûþƽ«ˆtõe»óK|±§™ 訷|0c>"ñžÖ EÕžpyºÎ q׳ÛÚxwY¸ ɯžBŠ2[d •Ôô½¯ø‡Ãþ*}IÑnÒòêMVÒåÄ\˜#…·3?÷HÆ9Áϧiö‹á½WÅv¤æ ‰µF¾™c•0ãx5ÏG3KðÿU½ki¡ ¯IrÑ2èà•ÆxïZ:ĺTÚÕ·‰eÔ54;ý5Q.ìÌŠªñ±ùdK ädjt;Øøž]!u „öÛ[_^ÊßéE[~ÔF …“ê}êøÂÏY𮡧ÚXÞI©=²¥Å¯‘&mÈÆíÇn0;`œö¯Iƒ>TYù¸ ÄgîÚêN¥µõ{©m^wu˜1è ƒƒÇSƒÖ§ƒÃW÷¾ÔฌÛê:„÷šFO0J͹}F?Oð÷íš”z§‰¯SeÆ­pЉýÈ ]€øãZ>9´¼¼Ñ+Hy…囄ŒdáeROоՅâk·ZüPØÛïÒ5³iý¬Üa>Êû¹çþZ/ËߥYÔü5¨júŸ‹á1´Vú†“e ¼çî™qõÏâ¡ÔuëúTºÐnm/îc[k«© }ž%8 êÙ;¸Îõ­{=êËÅ1]Exz;%“#—I2:ôö¨ž jÇÆmyœÓØj6[ÉpŒ£Èh‹˜’9íY—Ǿ´¸°ÿ„`ܨ½¸–9æ% ®Ùš†ïÂ>+Ö¬Ñ(UÇœíT<ž¹=êçˆ4 ØýŠéå‹l©<3BØ’)ü¬§žGÐ×?qðí/ÚÖçP×õ;FÎd–Úèº$©èP'=ò¤ûÖ•Ç‚ôk¨õ#ø?Ã2ièjMœoæ©ÜÞ`“9Þ;·çœç4횉q%åºÍ5䑈ÅÔ¯$ð†rÄaŠ·g¢i0ß[ÛÀW×\\)$‡y~÷_Z«eá? iúMƇ©þθ/æBîìî¼’HB*ÄÞÐn Ó­¦³áÓ¤Š[D9ÄM‘ô÷Í7Zðîââ‹U³K Œ’C!=pÀ‚3ßšŽÛž³žÚêÛL·Š{xäŽ9pÁdûÙ=óß9­  6Ö+ XWlqF0ª=¬Ûo x>Òøê6ÚE¤w‹y«1êG¡>ÕµYòèz÷k¨M§[=âã´j\cß©âÓ´ÈÙ!µ‰Ûwîë·Ž3ß Ɖ ÝηW:}´× ŒJñ©aŽœ‘ž*ÅÍìb+«xæŒ0`²( Ðàæ¥XãB̪9ˆœzÐ#‰A €ÛŽSëH‘EbˆªXåˆ~´âªH$GCéKFJ(¢ŠË×´«ÍfÓì–ú”Ö ìDÏR΄TõÕË;m:ÒÚÊÙvÁoEô 0*ÅQE›“$dd ‘é@*À9dKY'ÃZk ¯5¶íIP¢JÌÇ`#j“´qÀ­î--¼¶žXâó$X£.@ÜÍÑF{ŸJ–Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š*¤7W’_]Û=›Ço q4W—lųämïŸZµ‘œgšÎ}nÅ5ˆôBíRYµØ8v† Œç9ϵ_yaŒª¼Š¬Ü($dý)ÌȸÜÀg¦{Ôj´òMÇœžHÎdÜ6Œuç¥÷V—‘¬Ö³$Ñ7GSøŠ€jÚ1ºû¾·7yÇ‘æ.ÿûç9ý+11¶ºÕî4kM:öií®D7QJŒ±`1ì2xéW|O¬E¿Ô•CÉ_»Sл.}²y¬OCyj“뺕ýΩ(Y$™gu¹çª ¡«VWÚ·„´;ɼOt·KipÑÚÍL·±0Ã÷„œqŸsÔÑ‹µKyì×\ЦÓm¯fŽg2£…‘þêÈ•ÏNã=é%ñv­6±«hš^‡%Ìú”Zg•R" ’ ÎxÆÓМÖGˆÕo,í$²½´¹k[Õó°öÍ •e7l`®A­[¿x†ÆãHÓÛCê„3¸Ž9ÆØÌdcsäžÇŒƒÏŽ}oXµ¸Óc·Ô¤ðÔ2\\Ç!lä°ØaOCÁ>•áMsÆv¾Ónì4Kytë$UWœ¬Ó¤Y È¡ ŽŸ(-ϵuZwŠãÕum6ÒÖ lo´?í8æ'çÎð»Jý<õ¨5 o\›S×´[­Ã[iP\@ò—šBCÛØÆ;×+¢ßj¶¾ð„º­ÜRjÚt6»·–YˆÞIÿ–‹ÛWPúߊµKS³ðôv‘Zé’ y®®Ã·™62UJð¹’zž™ã­vÓÚ­á±5½+P†ÊæÜ’brî 2×#=;çbëWñþ‡w¢Ï«¾-Ž£¨Ce,èáàis´‡f!°zü‹ôª÷ž+Ö®õýcG¶Õtý!¬<¤¶Šñ {¦uÎî]ÎÃnãïÚ» }fçMµ—W¶ŽÛPd>|Q6äeO¡ê=3ZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š+ϵ¡'Û~!#å¼;Q“Çîß?³5O iVž‡Y…¦´V·‘Þ´Žeòž¤ôÇéŠ×ºÐô¯i×WQI4ÚK]eÏïbu ÿU+H°ÄjŽ­ásª\Ü]Ü¡ži#Ê*¶F Ê„Æ?„çŸzFÓ.µ=ÁV ìºÓÀÙ•YÌc~:g+`æ´•§ms&³¯x_V·µºKS§_«£eØr£ àœqê:TÒÚ^¿‹µi…¼†ðäQ,˜;YüÆùAéœV†µ¿é~³Ñ¥ðÞ¡ý­¡‚Ø<¦Ý…Ÿ8PÞÏ#Ò¥KÕ<wá«Ács¨Ú[hO¦\ý‘C> stream q 595.28 0 0 841.89 0.00 0.00 cm 1 g /Obj1 Do Q endstream endobj 3 0 obj << /Type /XObject /Subtype /Image /Name /Obj3 /Width 1280 /Height 1736 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 257903 /Filter [ /DCTDecode ] >> stream ÿØÿàJFIF––ÿþ@(#) Generated by TJ++ÿÛC  $ #," '.0,)7(44418=9'.<2432ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ ÈÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÝ ÿÚ?÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢“<ãÚ–Š+ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢¹øƒÄú-…ÑÑô·—ÛÚø²l·ÉÁ;IËëŒcß­tzTÓ\iÖÌÛ¥–ÖvÆ2Ì “Š·\#éÍ­øÇX¶¹¿¾ŽÞÖÒÕâŠÞâDPÌ98V²KÁÚîjWz>­9´’+§ÞÐJGÈQÏ͆<Iõ­{ß•­¤Éam®ZØùðÝGáÔ“Ëžmñª 1†ù›2g«dñÞ©Cñò÷M:Οá«éô胉£VP¤îØ¥²Û{ãß®4_VÓ®õ½âÖ‰æºÑnn­H“lL‡i”œn9$q\½¶½¬ÝøÅMâ-:åìàÔ%ŽáD‹ûÕ%)´€ž¹äWc¬x–âÊò+JÓdÔµ'·ûCD®¨±EœwnOA‚MCoâ÷6:Ü·ºl–šŽ‘lÓÏfî§r…,¥pTôÎ8=«9üy¬Å¦[ë³xvX´‡òšIdóQ~ÀWŸïG8­MSÄš„z§ö.§¥íòÙ‹¹ ²ˆãD'¬I>ËøÕßë7:Í´Ò]ióX][Ü=¼ÐËÓr÷Fà2žÄV½QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÖ÷ú(¢Š(¢Š(¢Š(¢¹ï_ k¬ÌE”„“Ò§Óõ 7Ãz~¡{2Åk›o$’à ƒžæµ š˜¢ž¨®Œ;« ƒ\ø‡ÃºŽ5ÖÕõ,ÄÖž_œáw`vÍ>çT±ñ¾½¡[èì×:v—roîîÕO•½GîÑX€ $äã~pqþ¼wéš§áVáÜm´ø—^ðAÏWíÖªø}dþÐðØûG†$çiÀùS©íX×vÇAñþŒ_·Ç¬\\´>[gËy—kŒ~§Šèîõ _ øšûSÕDÓµ[TK¥FeŠH266ÐHÜG5ZâIõåñf½mo/ØN‡-¡d`÷8RÅ•HÝŒœ9íSøŽÚæo†ÍA)›û"ÌyAIpFܸÎGÒ¡ñ\ZÆ«k¹¦^@«h¦ÏU²2î ÎèØÆ2¸ê7dÕ êz¶•¢ê×÷ë©_XEyÿñ4dÝÉ ÀåHVÆsÀs]À9àŒŒàÒÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿ×÷ú(¢Š(¢Š(¢Š(¢‘‘YC+ zHR6O,¨(F6‘Æ)ÀLh`s¹ãV>¤ rª ÚªôRczÇLŽ”ê(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¤ŒX+Tàã±÷¥¦,±3¼jê]1½AåsÓ?Z}QEQEQET]OMk÷ÒÄêo’Ýnâ±Ào¦E[¢Š*‘Õ´Á©®ŽfÿOkSv"ÁÿTnìã}êíU{ëë 2ÚkËéÒ hWt’Èpª=ÍE&©iõ®žD†k˜dš6Tb›SËcóÆO5%ž¡§êh6“¤ßg¸{yv¹"}å>â¬ÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÓ÷ú(¢Š(¢Š(¢Š(¢Š+VÕµ -SF±·†7Šø^yŒä‚¦$ܸúžµ‡/Œµ{MÃ^"¹´‡û>ôBu"›³n³ck¯û Ÿ›#5§â\éqéÖšTq\꺥ÂÅg“³håݱÎÕ^xö«óø‹ÃvwQé÷z¥¤WÏ€!y9'ÑIÍ^’îΠ·’dIî7ù1³Òm;G|¸¨¯/¡€KKÛ~Í,ñBÄe‚wÇ\Œ×9á¿ë:­æ• зò®ü5o©?”|×ldŸ—:ýk¢Õu+]ÂïQ¹8†Ú&‘±Ôã°÷=T³Õ$´Ñmµ/K¤ Ë9'jF_¹'¨éî{v©4¯ø\óF›}ÃD‘üÈBTà€~•‡Š¸¨üG©jqÑ~ÈÈ¿jÖ-­eÞ3˜ß9‘Ïõ„uÍáËVÒXå¼±Õo|ÈD|O¼¬…pØÜtæ­kž1Oì->óAežûZháÓŽ®ýKD-éŽjÜÞ,ðþ†©c«jb[ûh#7l‘±ÚHûÌH\õÅiK¯hPÁ§\µäf Fx ´‘>e•äû ž¸úT×:–Ÿiseg<»g½g[uÁ;Ê žƒ×¾0ðþ¡-Φ]™oÐ\ÆBFäDñçŽ2F{f²|;©xUŸLŽâöAß„áºv¨+<÷þï\véÇJÛð¦±q«éî·›F£cq%•è^žl\Ì0GÖ®êÚÖ™¢E·®ÀÍ2à h¥žW=Td“Yx²ÃP°Öâ´ií5;=>iÌ•–?”í`§‚3é‘ëYšGÄ=*=#LžýofQm^j y .mÌþ.¸ô®‡Xñ>•£Kkm"Ísyv¬Ð[Z¡yW©ÀàêH¬«ïÛjº‰[Ok›-CO±˜ÉÈRh¡*ØöÐ\3x;Tô«zŸ‹´« ]2{xå¿—TÇØ ¶¼ÿ.ìÅ@u$ŒQ£øu+Ùt˽>çNÔ#ƒí‡|yÆådfŸqY6ÿžûMm^ÇÃú„ÖQ+´Ïû T)!¶‚ÿ61“çÅu¶¶Ú•¥­õ³n‚æš3ê¬2+‹´×|KuâOi²ÚÌ-"·ˆG—ÃcaÆãæq’Gµfx_ÆšÕŸ…tëàÞÝéÖVCíW¯*oo/ï•F;˜\Œã½uú§Š#¶]:-.Õµ+íF=¬°]Ñ vfà(ÈõäŠ4OϨ^Üi:–œúv© "ãÉgWY"'‘׃ƒÁàV¼E¯AáëvðÉq4³Gooo7Í,‡ £<}sÐVe·ŠµhuK]3]Ñ͇Ûc•í§ŽQ$dÆ72¹ »X{ƒëT“Æ~%½´—XÒü:n´eÞѹœ,ó¢ž]#*FQ—þ5>¥ãƒømt=µ¯C4–ä8M»0Ýxçæç# :ÓÄþ"KÙ4_IŠÛRšÖiôÿ*bðܘÆJî(¥H÷SÇ4äñ¬máñ;[*Ê‘0k]ý& ³fì{ýŸÂªÍâÏK¬É¡iú$2]Gams$²ÌV(‹ýàß!'Ï=1Q'ˆôÝ ¼ix4À’Úê0!1/y,ˆ¡zð Õ&…¨øÒkº&§y êZi\Ù°Œ!¹a—Æpr0qÇÅrš×‹u½K—T›Ævóë¶Û$ŸJ‚8žIæ2UKŒ7í]~ýÿl¤Æ<Ï Èò85©ã_?†t;B-‚s$PBÒgb¼¬3c²ç'é\Dþ.Mm2{OM­K%ä0^YËáÒFÃ4{#R¥3œ#mE‰õÿø¦Éµë›=.ÂkEŠ`ó$*ß|© “Ç\õãÎk³kZ—ã­BÚf˜ÖKû: Ùü€>P˜ÆôÅyÿ´¹ífñ%Ó\I{s£<ÚFš%Æc†!¸Ó’Hûu­èþ½ðd2ÞA Âß[K=ôÒZGbK–cÎAü±Y>žîvø]%é-3Zj€;u*9÷\WAtð·Ä :=À¸Ðnw/³H1ǽuqZÚA°Å '—‰6¨PtQì=+•ø’Oü#åXâ¾³YÏû`þ¸¤ñBC7‰¼↲3^È}Ã:Æ<¼ûõÛïI­Ç øÓÂmjÞ47âä¯SnÞÛñŒ÷¥øgki†­å‰Ìšâí¥u¹²ò}€𮽕”Œö4UàIãÞ¼óº&›kãùjÅ,´Œ“²v7˰t>€V€'µOÖ>ÒÊ—é¬_6¡¼€CïàŸm¸ÇlW/ ʼn£]¨òô³ã„žÐž-Ëœe-œ}k«ñí“ø§Â‰:5À–îB€‚B˜ñ“ßš_‡ª‚ÇXp{뺆ò1É Ž ëø®CÂŽ¿ãYSýA¿·Aé½Sæþ”ÿ¦ŽãFš„ºeѽ"Æö06Å.ÓÃçåÃ9Æ}kj¼wö¨]Ùjá|;s7Û­ã ,`õrm$a¹#éÐÕ×0¯ÂÔo•SþØØúdÆ ýjýRá5]Å5 - bE1¿¥˜3lä8ËuúV$úl­ñ)bÖ¡#èq•ž]€È92ShPQsŒs[ö.¯ðû7è3`w?ºJ×øŒé„5ævڢׯ§Ì*¯‹ŒIƒ@¯ü$r¨üº¿Ïãm Û^M#Qþ+Ïá\V™u§èÚ7Øõ?êÖ ðË¥Æ ß¹IÀLE˜7c¸ç=kbêæOi¾Óþ}Mž‡žúåc3BÄn³Q ÉíÛ™ _hK㈠¶¥wyΑsoÍÛ³H$V+!A 9ùF+_Á ¾@Æm5 +¸åß·½nø(áäcþ%¶ßú®xêºwJˆÀÈlr€Ÿ½Þ¶n<+©[xÁZe´lºf©¦Ü]á€ÆÌ™$ŒòsÆI­éZþ¯á+«XƒÃa¨Ë-Ënb4L¹äóϦk˜ï‡îu{aàø5¸.ï..í.T ùÇ&9|Ì´ô#wªñð¶¾4¯ ÄmlÒîÛÄ6úävj±Å ÙÚ2T=MwÕÅ oxgUÖeÓ4¥Õ4íNà^*¬Ê¤à†à†ÆF?*ÎÔ|#â{ï k‚D‰µ½gQ¶¼’%’$ŽDÄaŽ3µG^2kÑ«˜—÷W>)ÔuÕM»ðüzssóó°Ç¦­s¶š'Ä 'L‡ÃöZ^˜ï ‹x5ga…ˆp¬ÑlÉp=È'œÖî“­éºÝž£¡ÝÙÝêŸÙ1YÞÙÝ?–gå•v)ÚAÎ~B;V&™¥ø‡Wñ7Œíõ;¸VîïÃð[;Zn)feÜ8$ó…ëÐT“x_â%ß…¥ð¤VzF²[cqŽÞ~ÑÙ6.ÝýÉfÆzé4ý_mL×/|ˆV¬g‚&-‰L²¤ªåp=µiø£Bÿ„‹JŸOYͼÅâš €Ï—$LN;ŒŽzqXÑÙ|NÔn¬Qº±Óìm¦In ‰v’ëoðüê©ï÷½jé5决â]FWŒÃ©Ïk$*¹Ü¢(‚߈ã«oß\i>4Ó^éµÛùî `î÷*à7â9Çj³g x–mSÃzÆ­5 ¸Ó¬¯mîVÜ>×2íÚWwÓœþíGÖ<9¨x†k««C¢ÞÞÏ~„äJ’K·!‰ùvŒW?ðÏC¶‹Sñ«m7¦Åu=†’F6¬>ay6Õwœí^—EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢¨iº6¤É¨Ih¬­v÷sîbs#3ÐqÐV,ÿü/<×/‹˜í®¤2ÜYÇ3¬±êJŽ{ã÷´õo èzͤWPŠØ«[˜Y‘¡*062F¡¨4ÏøkI½]JÖÝÍð…¡k‰$wwVÆw''Žý+v¨kzU¾¹¦^é“’©s G¸uCÙ‡¸<Õ4®èv–>'²IgEQ2“d1Hänê9Vt èÍ-…¶É¦d•ٙ؀³qøÕ­3LÓt{Hìtø hÙÙc\àbÇ®z“š·EU‡MÓ­îîïá·Dº»‰åæF0¹>Ã¥gê>ðŽ­r×—ú\\:ª¼Œ¼¸c¨ù­ 3K¼³m>æÖ)l™AM£ ÇN*ŽŸá_ iM–:]´FûÑÑàÛvç=zq×¥i[ZYÙ«¥´) É#ÊáÎI8îOZ|Æa† (F(¬p c€O<~—á½MOXn$ÞÏ,—7’¯GšC–#Øt´.ìì¯ák{¸#žûÉ"‚§ð5 Ž¢é°=­Œöî0ñÆ€+ c59´³6ÿd0Æm¼¿+ÊÚ6mÆ1Ž˜ÅEy¥é:‚GíœÆr‹*+ú ?ì:~àÿf‹xˆÂhÈCü=:{T¾T;‘¼µÜŠUT•Ò9£¨e#Á¥*Œ¨;NF{6©!ˆ€ ã4Æ·¶wY^$iî±#èiî‰"•u §¨#Š6'Ëò—îñÓéKÇJ)03œsKEQEdßèi}¬hº±é‚è,@ Iç(^OµkV‡áÏì››ÝBêúmCP»Xã{‰‚‚±¦vª…ÎO©­Ú¥«évúÍÅ„òKL y¹WBAVÁ¬<4—vw:Æ·{ªGe*MmÂ5E‘z;UÜö*ê袊(¢Š(¢ŠLŒ‘žGZ‘æ`£ÔÒÑXÚ熼/­4WZ­ª4–ªv\n(ñ¯Jœ~8©tÃú§“£@‘ÛÌÞqebÆBˆ±$ž=I­J(¢Š(¨®mm/`–Úêš Wl‘ÈV„)-m,ì`ŠÖÒà·‰vÇj¨ôqSS%šT4²*)` ±dœõ4ú(¬ëMwC¾±ƒR‚ò3g;ùqÊçhfÝ·v9'ëRSMmE´‘7úrÛ £–Úq޾õrŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š¥}ªØéÓiö÷„—×D;T[i<ã ÀïPÚk1Ý꺮”!em=-™¤$aüàOøÇ9­:2NÔ„ÔâªØÜÞÜ%Ã^Z}”Çs,q‚á¼ÄSò¿7zEZ ‡€A¦´°«*3¨fè äÓÒ5.ìTd“ÐV4ž E×4í&(–Xo,î.¿Æ@Àç9õ§øŸY›@Òn5( YÞ„ylÛAÞáO8=3ž•~;ý>iä¶Šæ'¸ïÆ® /Ôg5,sA6óŠû£m á‡P}ÅÍÁŒR+…bŒTƒ‚:ƒî+x¯Iÿ„‚O´‘¬ëj’«™ævb<°3ïÐÕ_øÃO¿Òìîõ[«K;»†›™ùVFU 1?:è§¹µµ…®.&H¡A–‘ØÜž* SIÕcitûÈn£Rh\0úàš´Ì¨¥˜€ª2Ièeé¾%ð¾±<¶Ún«iu&д'ŠÉ]®eRñÁo$¬ àˆàzâ ÿ„Ï¿Ùrk yºÊ+…·•‚>è¤f ‡\nR È«w:þ‹gªXh³Ï¶þù${xö±ÜdäÓŒ‘š©}ã/ é««=ÕË"iRÛÅxÛˆÚ|mäzóŒã½AgãŸÞ^ZZº„^±[9çÒ+‚;#0{gíš›Uñv“¦]¶žÝ^ÞÆ‹$°YÄ]¢Vè_=²síM›ÆÞƒE k–:š°»mѹm¤2ãp õqWô]fß]µk¸-îa‡ÍdO´ÆPÈ>e§¶@úW:þ.¿OìWgö?,#a“fìÿ«Ç^Օ៘4©–âÏUÔå´º»ûLñDXF<Æ* ¹Â㜠ê5è~™¨¡–éuR‹cº’rã *ñÛ®qŠf™ã/îîté´Ëë-Ff¹Kk„PfN3e<à}áÖ©xÄZι¤º…¥Òo®BM2Æ üEòœîAÁ8ÇûF´µ{›8¼Aá˜e’ígœßRÄ-¶<Ÿ5sÎÝààÖu×V%¿º´Ñ/ïtÛ ¤ŠâîÜÇ÷ö)p̹éšêlîí¯ímï-›|$±·ª°È®Z_Üˬiº^ƒy}s¥Êr¦5Œ‚26³7$öϪ¢üIyôÿí»OßI£D¹¹¹bŠÑãïmL’Ûz088Ílë^)’ÂêÃNÓ4éu-Bö¸Ž4`ˆ±¯Vwn=&³¥ñ4Ú¶•âË ‹tíSMÓdibwV–6(Èêyz)4?Gk¦xWG³¯µ)ô«)$ [d‘¹Àôà’zzÔsxƒNÐæñæ¥#O§5£ÜfS‹ƒåŒm!p8éÍxç_³K-FûÃo¢ÝOBs:™cž08ŒüäJÐÔæªÂ}âkÁ·š~m5ö¿$±4.̨…Aä7'<+N÷_ñe´ºN‚ŸÙí¯Ü[Iwy3oÐD­ŒÄ’pGCÒ¦ø²úÓQ¿Ñü@ö­5®šu$º´ÈŽHTáò¤± §ý£k%üS㣦?‰–]%,í4×-ç4;w`Ë»B;ydgŒÕ¹üYâ][YÒ´ï}‘muu1qr¬Z Í€v« öÈçœñŠ«¥jŸµmC[Ñ>Õ¦Á.2¤—¾KŸ´2ÿ—ïǨÀïR/Ä óá&ùÒÖ_Q¾“NS+o‘– ìNÐ8Î{f‹OêzV¯£Øßkšv³kªÎm·ÛYmåÚJüªï”lÈri4›ÿˆÞ)›ÄÛS´Ó­tý^îÊÙÖ ï/”ÜnÜØA’}+Ĉ|Sá ê]Ggqý»mÒ$[”Ê“ìW\œ€¤gçÖ½^Ò;˜­àŽæo>tVIB…ÞÀrvŒšóÉ|W⨴ fØNâ}|i6ï±@>cŒWû„ž‡¥_²ñF¯¬Iàx,¥ Ú…£ßjGhû‘ ¼Ž2ç`ñ\Æ»6»âxvú]KÉ™µˆV]±!W>~Õl`cf21Œ÷ÍjÜiž)›ÆñØ[kM  Aö»ß*3+âfû«€“×å&‘€K]GO:¬ ÑMÄ+¨ÿiɺoi¢è}¬£.†â䞦YNæÏМVRYigâ ìm¡3 9Ãlƒ™H-œuÇëY> ðöƒ?ƒnî%±†K‹µÔ<éfÚ죓è¬Ï3X»³øqi½½ðk \Ay!X¥’(À]Ä#ä¨Éiçé[šužºž1°»»µÒ´éžÂá.aµ¸f’â1¤¡Š1ò·sëŒÖ§Ä&Ù6ÊH²¹Õ, ¾ ã;üÙö<õ©õ»Áw Ir‹ôWa4Ï$ÅöŸ—åssëYþ´Ñ¦ðËOsRMs-ÛjO šMç~ÿ§ò®fì®4_.¢¡´ó¬È± pA-äç!j>“ÁabšÝâmÿ³Õä‚1°EÏNÕ£kñ úF2'‡­ö1þÈs¯Rq¶ûâX^ Óm›zÀÿ­t^šü7¡4r,›tëUbF2½ciw6–~7ñÖ³¢Óít,€#+I»¤ ãõRh¬[ÂZž /'¾‚ÿÄÖ“´óı¬ÇÌE-©û­Žô¯a®&ûQ°Ó¾!Yý¶â8ï@û<C2S8‚xϵ;áç”þ¸1òûRÉõ>kW'e¬Í§ø_Àý¾=6Âí.}QÑXÀ@;UK‚ª_žX•gFÔôãÍ5­õ»J9ôË«dº¹`c’]ÊvBBªÉÚ+¡ð¥§3øƒHí mjþY`nQä8lzÕgćoм ò“™õÈܵÄÝÞøVÎM^kMcPðζ·w&ž„ºK.xuˆ«+ :ü¸ëø×¨xz}VëFÒçÕ#ò若‰îÑϾ«ÁÊˬxã*@:ÊH똖±4èç? 5X\JtýP„Úwg{öëš]{QšÚûCµÕõ ý;A}"6Y«6ãºHè¬Ë…èÜúñYzH´ŠÿÇ6¶vzŒI¨h ömx&g¹£©mÎYºž ûU h÷>¶ðÞ³gÔÖz½œÄ2i#‘—÷rÁ &v0ì1Ç6½g¨MoñU"µ¸c:Yùccæ‘ÎÎ9ǶkÇÐ^ÜxD¥µ´’Î&Ó›ÊE%¾YPžv¼€¶ðTu8ëYÞÓ5kÍámÔ6墳šéî[‘çÔúõ¹ã/ ­Þ³câÑ!×!ŠÉì®,¤\)mÊñù˜\ƒA#ƒÁªÚ…Vùõ§ Ùhuîœö1F‘Çö¦óÌÎÉ•ÑryäÖ4Õ,ôøô(|¦¾¢ˆ ›¬&Ù€ãÍaþ°±•Û×½uöz¥gâ½>øFŸ`·ðרHªù¢PpttǬxGÔ´ÿx¾úáÛjWVr[0 – VÈê9뙋ÀšÏü#vKmm&¥¦kWz„6óÑN#ü¬pq¹OUíLñî­ctþ±Ð,-7<ª&¸r>P¥W £©9Éé[^Ñõ5Õ¼E_µë××ílæ9X'ßÚ¹£àÿÁà˜´¸#…õ[M\ßÅ|$nL€ní‘^ƒc%ìÖ–òÞÀ-îž%iaVÜ#b9°3\WwàÝJoZë±ÉÒv%ÍÄDÍu4h@Æ0½{S¼àÍGÃúλwp’ÛJÍ™“˜ yFSÀÇÌÞ§§^ÕVãÁž! ·Ñ-ä·þÔ³¼Žî–ò˜Ç6ð ÆyÕ³¦èúùñøƒPû<~n‡”°DÌÛeY £+ƒíô«:v‰{gâ={Wy#6Ú„IŒïV„Ù페ÅoQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢Š+Ä^ŸXm>êÎõ¬µ >W’Þ`¡—ç`Êx qY°øCZþØÓµË­zIî팉"”DÑ?ð*º}òIüª¿ü º´k}amâ)íôKɦ‘­c‰7Æ%å•$9 íŸçVnüeÐô]*×S–ÞãHš)­îö+6䪞9ÍkiúØu]KUk§š[ë{HX€‘ïgðª³ø?J»Mz+™etÕçŽwÁÂÈ )BžsÍAoá—¹²ŸYÖnu4±Km ªŠÇG} naÛö RË»© ÀUëÿh·z}†›dºvÓe-«’ pyê:ç9ïPé¾ Ó4ýR jKË˽J8d„Íq&w«c‚0¶êkW\Ѭ¼A§\i—†Ao>Íæ6Ã|¬`ýEcÙøG´žÒG¼¾¹‚ÉÄ–¶·Š_º@<½²N+?ÄÖ+â­wGÒ›NŸìúm×ÚînäB#* ˆOÞÞqœvÜV=»í^Ë[vž;ÛDòÁŠFU‘3®P8«f‹¥éxÒìã+h<ß‘˜“ûÆ,Ü’OR{ÕI|%áÉ´«MíÛìv›M¾Ä‘èÊàîzî§èþÑ4Iî.­RG»¹e¸žG’FQÐnrN À­Û+-FÚ{;ÈVkiФ‘¸á¬}'Á~Ñ®Åõ¬5Ê!Ž'šW“ÊSÙ7³mLT7¾ðuýä·ÓÙŸ2wß:¤Ž±Ì}]‚ŸÄT*ÐU—Ã6k§­Æ›ñûLx]‰€È$qœcÖž‘á_ hSKq§Y¬sÈ»V,Ï·Ð$ì eZ麞±â„Öõ3ìvúe¼–ö{Ýæw'/ò“… dçšé³ôÿ· KÈO¶‹³ùØù¼¼çoÓ<ÕkÍ<šî—mn5[¨KÊÙL`ìG8Çã^7†o5d6þ µÑ¦»1 ûðѨlù‰8ÀÈZô¥±°K·¾X]É Bócæ(¤¤úM ca×7 oÍtgpd07ø*/GÑ´HÛK´ŠÖ‘¥dˆ`=M3VÐ<=®¢G«iö÷ŠŸpL¶ý2*ÕŽŸo­”ÁoÂG€ª=€â›¦E ÖñÚÂNÎÒÆ¨6¹¼Xc=óNk;mZÞ6·Pb*6½0:qÚ5µ­ÈŒO H#‘dMଽÏqÚ¡¾Ò´}O`¿²‚çg)ç"¶ß¦A©žÞÚHÄ/4JT„ `mäqíÚ¥¨eµ´â–hc’H[tLÊ Cê éøTˆ‘Æ6¢…'w=i¯¼±ùRF÷?*Q ¨ýÎËô¥ƬΪ6798õ§SJ!!Š‚Ã¡Ç"EQEW5©øo_›Q›QÒ!е׾Mºµ”ÆŒXgŽ@ÏNÙ­:*´Z†Ÿ<—qCp’IfÁnH&2F@aØ‘Írð|KðµÔQÜ[[ês[È2²¥•ÁBÇP•Òi:¾•®YŦÜ,öÒd+ŒõAÁw »EOUÔ­´{ ÍFä1‚Öš@ƒ,BŽÃŽkƒÇ‰sSCáÍm£•ѾÎ0Ct?~º‹K†º·†s ™7—(Ó=˜yüjj+:÷X·±Ôt­9㑤ÔZu×SÊ]ÇvH<öÀ5£EVV«­.™{£Y˜ ‡R¹hj–Éõ­Z23Žô„’N1ɨ.¯ µ´¸¼c¾(byNÜd…ãßñ¬øµ«›û-ÿL³ó¡¿xL¢GUh"uÉb9Ë/þ4¶¾ µ½Ô52Ûíh‡%Ê…”È›†Ó’xèr[Ó®næ°·¹Ô!Kk†ˆ<Ñ«†XÏq»€jx.-®SÌ·•%LãrF~¢£:Ž˜·"Í®áDdB]wãýÜçô«5OVÔ­´>óP¸*#¶…äÃ0ˆ ž2O¹ÓãXnÂ×fÝ­õiö]npM¿îK•È8Ü;æº_EÔÌ‹a}orÑãx†Eb¹õÁ5æ¿áÝ:tµ½Ô­mîc–EV9ö$Ñàò+?V×t 4—VÔ-ìã‘¶£NáwlšskZéÿÚÍÓ¶†ûNõòðN3»8ëÇZ©‹¼uý—o¬ZI}¸¯’²)bGP9ëíYøóC›ÄמûU²ÉH!3-$Ù;ãÛŽ©ž{Õ ÏC hš棨XÞO}t‘Ë4$¬F-ä; ùÈ1ŸzêôísCÕ¤š Èç’á’DCʬ£(HôaÒ¥µÔ´ÛÙ¯-í§Yf³Ep«ÿ,ØŒàûâ©ê¾)ð·2ÛjwñÛÌÐÕ9dN{ ŸjÎ<Ñ SUòÒ)UÌŠSïeî÷QZOâ G¤ }õ†”Sx¸ÏÊFq\çŒc9ã[Iñ§…µ«±aitËxÑ™ãxÝÔwPê¹LÖw‡æ´TŠã_ÓaQ’5¸Òe¹]=á ¸Ü¸‘˜€T®q´ã¯N+6OŠXÞh繚·ä†ÞfX0qûÂåü{sÒ¶µ?hM•­õÅÁx¯ U…YÞrà "¨$äsÀªÚg|9ªêCG…æRò¤•í§‰ÑÑPŒî \ñëÚµõ-KOÒ,î5 ù„6¶è^Y ç¥`Yx÷D»º²µ–ÖþÏíϲÒ[¨#ˆÈ Þ¤tÎ+¤¹¸†Ò ®fm±CHçÑTd×¢é¾!ñ½°×µ-núÂÖì³ØÙØ8ŒE8Rí‚Y›¯¥køq<]£ÜêÖ:åÇÚô›eY¬u)Jd#æIÇ+뚇þ>Š.ŸOÔSIvÀÔš[àœ';¶žÇn*æ³ãm'FÔí´²ÝÝßÝZý¦Ú+d 挑€r<“ŽõJ_}«Jñ Úé·ÐjºT–ÎDO57©*ãç(TuáN†©iŸŸ…´ c\±½Y/¤µ´  NòG»ÌUF?+p0û5|ëPÞk>kÛ=JÂòóûGȶgP˜D™•X‚Håzz×=àÿë1Ùëðé:Ž®Ö:¶¡çNpÌ%Q °,Bö?*êáñƇu‡.-VIa×nZÞ*’C‚xÆ=y«º—ˆ"Óõ}#Gû;Ë6§ ä‘0 6꽞+Ï!ñ&µ{áß?ˆ´Ë³ekt GrÓk®!R¸#o¯Cë]¶³â©të»-#JÓ%ÔµK‹o´ù ê«@ãtŽÜ žšŽÏÆfHu´Ô4Ù,µ="ÐÝMhî­¾=¤«#Ž8# ÁíY𱵟ìx©w7‘"6¦yVzg•ö<¦3I’6Œ6z{ÒjÚ^"ñ$z÷SZYYiiwx¶®Èg–S´(q†Ø¸'ŒsT®Íÿ‡gñ‡ý̶oáËBÕ§‘šKg\© !Ë`ðFXGZÛðN“%®™e©\ß]Þ^ÞØ[4­<ŒÊ¿.@Uè1ž¸Éîh×òl6áìøâ½vÎx.­m® rðÍ I¬¬2 ª>&··¹Ðõxç‰$O±NÛ\2ªH<÷‘^w¢éZ_Ã;)lâ÷6ò\"¨FdîÇ\ãœõé[÷Ún›¥øÏÂÒiö±[5Å®£ÞJ…Š€ ƹ¯ Aâ]KG¼¹i7Ÿm¸»7“Þ\$Œ‚y/¸À¸µv¿¢»‡Âú\WPÝYU%·“zÀ>vŒ«œ#ÄÓøÓÄ’YØi÷s[Ec&öFVŠBv?³“Ǥ_¦\ùŒ9÷Æ`h·vzl¿õ=M–+ì«ÛXçá!ˆÆIànP@æµWZðþ­ñ+L]6x®%·Ñn£žXˆ+Ë) ¸pHëÔã5½ñQþËðååÁµ·¸H#"éwB›Ü òê½k‚ñ.£WžkßÇ©0×ìehaX–YŠäŒtŸð=kÖµ DÔlo,Ù°·VÒÂXv¤f¸_øÃAÑô¨|?¯ÝŦêºB›i¢¹!ª+¡8Xc¥2ûVñŽ,<]ŠŠÚ'öc[ØLUƒ]ÎGÏ´’>L|¿w“ÞGƾ¼ðt¶VwË{w¦›täæ5“nÏ/ïeO^*Mɬ×ïí¦‚Ù|Ks©ÜÆ–¶Šä8RÊó Œs‘P]é_|Go­Çao§—ˆÝÜ[Èì÷ Œ ¨]Øç,ÞÕ»¦è×vZö¿©»Fmïã²XUs¹|• îíôÅR²ÑüGaâ]fò3jÚF¦‘HÄ–ó’DM ¤¼šÈðþñSÃúU¶•ntWŽ3kÈfÏÌŹÀ÷§MàV]:îYuf×®5856•ã"ðýÈÊd€du'½>÷@ø‹«\hú…åæ›ÚmêL–°¬†7a‹9ù·`ñЧãÍ2×^×ü=agp>ÕpÏ¡“fŒ®ÁýF¹®äëJ)x—K[RÏŸÍÏ 8ÛŽ1Šn»§É«i:Ž‚'»µ–v Xc$qüêM"Å´Í7O°gó ¥¤0¶(ǽcëžÕ.5+}sC½ŽÓRŽm/œ…âž"sµ€*r ƒUí|%¨É·s«j q«j–OeçF›c·E$ž§'-É®‡J²m7N°±i<Ãkk ñÛ ãž¿Z«¨èßoÔô]GÎÙý›%ÃlÛŸ3ÍM½{c¯zǛšõ´×ÃB×M…ìÏ44*þS¿ÞhÉ#<à‚3ŸZ£â'áÚ\êWVd»dÔ²Y¢™²KJćç;°9íYzLk¨øÏI¸ƒ\}n{.šúu !Yv¢(O”1$“É&·`ð>£l—:| ¹‹C™äahˆãrUeå¶õ휽ê}7ÁBÂÛD´“R–xô{é.-òŠ B¤lzg9êk¨š(gŠHf@ñH…[£0Aú×ÿ=ºéRë—²h*Ã'o(™ÜSÛ®8Ío¦‡i¯®Žêñéß`HF<°›·gÎ{uÆ;R`ØGQÔ]ÝšþÒ;Yc$m ¹éÆrsëYV>´³²Ó,%Ô¯.¢Óu¯m|Ö\§–0©Â~~õløVØk—ZäW·QµÜ+Ͳ°ò¥Ú¥CŒäëL—Áš4ºN›¤ù“§önÖ´ºGÄÑ0ãp`:‘ÁãÒŸ£øOOÒ®åÔ¦¹¸¿Ôd„@nnØ3,cøTòp9¬ÓðãCòä´ŽÿRL’Fg°IØBC²ã¨SÜ­i4›±¯i·°3Eck§Onñ‡;±]€'O”ÏáZóà Ì2Á2†ŠThÝOua‚+MðN‡¦E§Â’]Lº}ÛÝZùÒ³ye—nÑÓå ­[&ÂîÿOÔ¥V76q @hÃdtmÜç9ç­`ø“E½Ô£Ó|%e£²èѵ«Mzî»#Š3Ê(,\±Ç~µÛªª*¢€@ÀUvÓô÷½QhÞGÀ“cæÄ¿BE,6÷WpÀ‰qvc3ÈÍ&Á…Éö*¤¾ðäö3i’éÖïc4¯,Øä¶=Iæ«Càß[üZ=¨Ž …¹ä‰W£dó‘êMiG¦ipÃso¤)ËÈóÆm‘¤ûŇrÝóÖ›o¥ilÖöpÄÖ¶ÿg€¢c•xáx –ÞÎÆÒ³[ÛÇ¿Íû´Pæ9<9ïX> ±× µ²ƒBÓ¬.ôøƒ%Λ8 $OáØØ* žÅH5KÃÚ²úÂkZ…®™ µ‹ZXØÛ0o/Ì`ÎÎBªäà?ZëåŠ)£x¥ExÝJ²°È`{TbÐ<9´–Pé–‰k+’‰1ÈÆ hð8VóLÒµ Ÿm³‚ãgÝóQ[oÓ Õ„DUBªŒTKe`“µÒÛÄ.a¥ 7‘îqš›jîÝ»Ï|Q’qÉïH±ÄƒFs€;Ó© © =©h£Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢ŠBàŒÒÑQÍ=½´RO<‹1©gw *Ü“Æ)êÊêH*FA¥¢Š(ªizM­ÕÅìpÇus:d@O÷Ž2jÁ– â"ê$e,<;âª[ë:-Ôw“CyEgpö×N9RN9©%Ô´èom´é'U¼¹ŽIaˆõuˆúf­QECqwgh"73$BYR÷7;tQžçµ@š®œú”ºJ˛ح’åãÁâ6$œc¨õ«n‰"”u ¬0Al6öÖë²’5Îp€úTbúÀÞ6ž'Cx°‰Úüá ÀlzgбEQU,µ=;QkÄ´˜HÖw-m>ù$P ^GlŽ™«tVvŸ¬Ûj7º­ŒqȲiÓGŒØÃ—PÀ® 8íÈ£EQÅ›—;r2;R<‘Ç‚ì'&— u4ÕšvdV‘>ò‚2>¢³,¼C¦ßjz®•V};ÈóŠí5K ¼“Æ9Ȥ·Í'’²¡—g™°¾¸ô¨¢Ô4Ùç’Ú¨d¸ïÄ® /ԚěÄ×Qê&±[U#HÓ¡»‰‹Þ³«ŽÇ½héšÄ7Z-†¯xÑÛ$öpÜHY°‰½A<œp=êÝþ¨Ä'±¹Šæq¾ ¹ú‚Efk%ÒtûmH[ÞÚ>¥kiq*[4‹¹š4-‚¹ÏÖ®h—ÓjzN™¨L$»²‚wUè¥ÔµbZøÏN·¹×#×/,ìb²ÔMµ»Háw¦Õ9;\žØ­æÕ´uŽÒf½€Exë³ï\LÍÐ!Ï$öÆjK‹ý>ÒKhnn#Š[©<¸Ø#c8PzœzUŠÍÕ¼Aáý Eý©} ±˜‘»|ÏŽ»GSŽøƒÄ^m4ë+¨Û¶š rÆN9=:ñOÓ5½Z7_Ù·‘Ü‹Y¼™š#•WÆqž‡ð&™¬ø‡@ðüq˪ÞGn²±XÃd³‘Ô*€Iǰ5ŸâÏ ê¶7zޡֶjÍrÃ9ˆ(ÉܤzŠ4ïx[V{¤°Ô"Ÿì°¬Óºçb+ ä¶6ýyÈaãŸêwPÙZê*ÓNXC¹]VR:ìfOàMt5COÖ´WO¥À–ȉH”Ý’‚àƒÚ³.|uàÛ;}.ê}@$Z¤/-‘Øù˜.3´mÎyÉì*}Åž×縵²–U»·PòÛÜDñȪz®ªq\þ¹ñ'ÃqéÚ»Y\\ƒ E|–òq:‚ ”'wÔg½jZx¢ËOð÷‡ïuYÞ[»û+m‰–âFŒµuîpÕoHñ^¬=܉íï-#Oks$¨§£m=Aõ¨<=ãmÅ2íÒæh|Ÿ4ܘ]b8Ù¹€ý†kG[×t¯Ú­Õó°J°ÃjZI¤nŠŠ9$Öv“ãMS¼›Oš ­:ú(>Óä_G±š!Õ×’ùâ¨ÂÉÐ|¯¶›Diöÿiyìøé¿9ݳ=öãðæ¯k5Ò4}BÏJ6÷Ww·¶­qmªnó@8À9zóŽõ›Ä›K¹.,í4-VmVÕÊÝØˆÐIÆC3Ù†þ9'°«W¼;o¡Økþ]ËÚÞ]­ #̱ɒdÎr¤qŸlÕI>#%µäZm燵H5 ´/anV2n@ë‚®UH츩¥øÆÂò=_ûBÖm.ãIE’ö¹K ¥”‚èk7þŠÔï4BÛC®Ûç ò«twŒ1uCëƒî\Õ¼h–Ô~³Òî¯õ ¬Vò!ÑRÅ~gb,š·áß>·.£gua.Ÿ¨éÒF—ò2¶ƒ*ÊÊH ¥oQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢Š+ÄšÝΑ¤66ës©_Ü {H˜áKc%˜ÿu@ÉÅgG­ø¯KÔtëz 6‹R-½Í¡}±Ì![œ78 öé\ñ$šÄd¿kF¶: q}ÞvÐN76c§zÖþÜø£h–:åÜxÓ#ŽÐKf»ÌË»·ä.áœãf=ëgW×5¹õYt][;g¶¶I®®îÁeC!ùQP2d2~a޵›75»M7Ä‘N,ÛWÑÒ H²`™%# Œä ÇžõÓx}¼Q,q®eyö¼P[†ýÊ‘÷Y‰ù¸ +3ľ ¼µÔm4[«[9¦·k©îîÈÛ `àRW,ǧ8ïYÖ^-Ô¢ŸZÒ¦¾²Ô.m´™µ +»|aÂpVD @`qѹ…Q›Wø™†áñd×ÖJ#µŠæM=a;$Œã9¶àÄsÀÀéÏSgQƒX¹ñÖ‹qm¨$1ͦI$`Ĭ`©tÎGÞ<ç·¥døš÷VÕü+ã-×B–:ôÖ쫟25dÚHäœó]H¼×4ýsÃ:eÝò] ‹-Aî%1*—)´©Î08<×5Æ­ Τž2Ót²^O²XIå*1 e,Û²øÉÆ0 Y½ñÍýîáZ9Λe©I*_ÞÅ›öv# 0FÁ àv­ï^jW/{z×[ÓvÆö×1í!9ÊÈÇpx>ÕSâ-åÌZ C}5²ÿlÚDDj‡ ì6Éó+r»sÈ5JëK×.|h,íµymÂø~ßíW*¨f”,„q•Ú I ô´4«ß[KâݯÒò}2e±¹»qçFH•aH뎕ÊÜxŽM2ÊÒþÓÅ—:¦¥ŲÞGµ”HØ`Œ*¨ìCÓ½t‹¦L~ É/öÐI[€®Ò<Ülû¿s¿¯½nø»U½Ò4k«‹-¿lvŽ rÝ’°POÓ9¬ÄðÏŠ´ë2òË_¹»‘fA¨EzàÅ4gïP¿+«ŒÙªz=Ž©ã®õ«fúÒ)®."²‚Ò@‹q¹PHÁË2sëÒ³oõ?ê.‰lºœ–Ú„~&M.êî”.á»#‘ƒŒc=«M¬.|7âOCoª_\[êŸj‚æ+©K‚crºç£dvÇÒ°,ôã¥é_®íoo|ûk«Øc&w8·uûý·u­[ˆu}@Óž Vêm[_¸ÓíîwÜ!óy%îŒ ãÓ$â¦ÕôƒàÕÓum7P¾r/í »Šâw‘nfÚr®H 3‘·oÒ´ü3ÿ#ŒÇ¥í¯oúd+«¯=ñBø~ó_hu%Ôuc´A4Û%}–äœï«(ËvÉÈ«îïÓÀþ1…þ×n¶:‘ŠÙ&™¡MѰRá˜ñŸï3Z¾&´O hÖv¶ }$úÆ©m ôð»5ÌÀ‚[i$a˜ q·ñUm¬SLÕ´{Ÿ h¥kÔ†üKþªH$Èbá¤nW¨ f»/jwš?‡5BÏ‹ˆ-\ÆßÝcÆïísòü?ðÔmì7eª[´7'Wg%Ýò  ` ¿LŽiš>‰£øËPñ£â t¾6Ú´ú}¬3d¥¼P÷Tð$õ÷®gU…×Ã>"ÐRâW³ÓüMkkg.æ-3#l œþìž9âº{¾ðÕï…uÍ-/¹mk$±“¾XåÈ`ç’Ù÷&«Úx@ƒÄ?¦·°·Žâ +vÂ.bi¡}å}71žõFßJÓ¼=ðâ=SMA£§ÚE=ðÿZ©3( 7$ ÕñŸ…ü-áß 5î•e¥æ•äKeqÄž``,9mýIÎji·¶¿ãÇ Þ´$ze$¬;‰5 –ðšºDz­°ÐÒÚË*¤o**€[p`vÀç®{Uý¦j·÷ö]ž‘4šãKgèÏ3Æ3ˆÕGÝS–s‘êO~‚´ÂÖ¶’´†@À§•‰›ó ŒW©W›x3UÒt¯‡ÓµíÔP‹3©E0bGó_ Aþ#‘Åfxu"’çá˜öé:ŽÒ{0zV׈"¼ŸÆwpYenæðUâDG7 ϱ5NÂ|/15Ì(±èfÍíËâ/iB½wnö÷¬ÌßE'ûÿítÒ­¥ðض†æXÕÑfeC´î ê891Zº ðÕΉ¥o—[Ԭ͜zy„‘;­¼ò„êI8ã­hi6sØøê+gˈ<k—IˆëïW´U‘|iââU‚½¾˜TppŒ85ÖÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÖ÷ú(¢Š(¢Š(¢Š(¢Š+šñ]ž§æèúÎln®4«§w·RK‹µöä¸u"³žMWÅú¦‡ Ó.ôý7LºkÉšñB<’*áW$à’Ng}“_ÿ4FÒ.Þ½õå¥Âíò§óPE$ƒ»ðǽlx›JÕ/|úmµ³I{ö;4†îB¤Œ“Ž1ëYþ ðä1kÓë7>]´¼µŠ9#ÛKo$|eD„¬1œäUi<=¬_xsÄÂ×M’ý#K;(Um‘zàí$öàz×¢ÄcŒ7(¹h72ë:ìT:²Glö—6’ìÝ·;•ãßòî 䌃֪éú>±:k×cB³Ò¢ŸM’ÖÊÑ/9ÙɑӀ À1µsPÐõ›ŸÿbG:—ö<þ^à˜ªºu¦êZwˆmu jvV yö{I,î—ÌU1‡Ûózã¥QŸÂzäú´ï.16©«\]ÚÜ:±R2{gç¥hE§x—SÕ|+«ßÙEhlí¯Òò b­ »H ã'Ò³-´oøzÖ]LÒ,/mÃËö+Ù¤ 䣜*m%Šç±äVÍÕ‡tû-é÷1_Ïh¥/à˜,ivrAv•=c­AáÏjë·þ!¼°¶ÓZ{EµK[b o›qy» gŽõ£âý/UÕ4ø˜"kÛKëkÈRbB9‰³‚Fi–:V³ÿ Ö¯YtX-dŽ6$¬ÁË62£åÚ©j^¾Ô¥ñˆi£Ž-jÒÒÎTĤ㎠ô<ŠÍÔâb ú âµ¼C£¦½¥ÝéÍ!‰¥Pb”uÔå[·B=k=ÇڕΜ5ÍBÎ;++…¸ab$rÉ÷Cî8 žHÏJŽ/øßD’òÛÃ×¶Ù·72N‰vŽ^ØÈrÁ6Ï }jÇü!¦ ÆÚè§ê‘jH¹iÙr[¸Áb}ñZZ®‹>¡ªè‚L¨šl×H…rd!Qƒž0~µ‡/ƒü@fñdj6ë¦ki,‰DL‘O"…$Àã§_qŽvu? êh°i2NÑÉn°n#4rC®Ö³£ð׉µ Ë|E«Auic:ÜComŒI*ýÖ—|íêÚ3ùUÁ¢ÝéÍâ›û{¶jJ$‡dyh8¶Œ Ç<éZZ/öŸö^ý¤I¾û,?iÈù›Fì㎾•yáauKÝKFÖ ÛÖ?µFÑ+‚È0sÐãê*Š|?•tý{K:Ìò[jÌ’³JŠdIr 1n3»01]½¡ÚëÚ{ØÍ#ÄÁ’X'ïÃ,g*ëî cÙxCR}FÏQ×õ¹5V°%ìâ1$hŽF7°^¬Lô®šîÒÖúÚ{K˜ÄOE"Œ¬0Eqñ|>•­¦£¯^_h¶rÇ$*û¾PHàeSÐ{æ®êš]BçQÒ5›½*[ͦí É)Q€Øul6;ʤ> Ñ¿±“EIgXþÙä³nY¥WY؃’ÄsÇN˜­-cDµÖŽšg’Dû¡ ô~Y3GœȵV÷ÁÚ%éÌÓÇýšª,îb¬Ð•]¹;‘׌J~…á='A’æå$¸»¾¹P³]ݹyYGEÉè¾À Ë? <(Þ|;ïŸ)f ;‹tfî¨Ç<Žp8®¦ÂÊÛM³µ±¶R°ZÁrB ÀÉ>Õ{à ^Þ]j;.`¾º}ÓOo<ˆì02¬>^:tÏ5hæø3FXt­*â{xÚÑwHÅÎI;ˆ''©$šÉðŸ…_MðÅõ¥ÅœQ^j«s5žHU2®e—' ¸ïŠèô=9´+NÓ™Äik%ÇF*0Hªº×„ü5â b¸Ô-7\D…hÙ’@§¶å*qíšXü)áxt™4(ì#]6Nd„gç9ÎIÎIÈëœÖÀAYç…¼3âO³ZÅ.Ü“ä«.z€ÊAÁî3Іx.ÝÄé6ñ°´’Ì•Ýçr·®rzäûÖ¼–vÖÑYC­´Q,)(@0=1YZƒ|¥^}¾ÇI·†ë$¬Š¼¦zíì¹öÅnV$¾ð\×ϩˢÙ=óÍ3D¥‰õ¢¡³±Óôøü›+h­âÎvD¡W?@"éÚb\5âÚB.› ÌwœÿµŒþµ>ÄÜhޱΠ(U'©õ£jôÀëŸÆ—­›S;¶Þ½éh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠL®HÏ#¨ ²®2@ÉÀÏsKE5¤ ‡`¥Ûjäõ>‚EQE^îÿO°®®î#†ÝJ©‘ØŽ>犟rnÙ¸nÆqß´QEQEQER:°Ô—JÙ/žm Öí‡ËÚn7tÝžÙÎ*ÅÕÄVvóÜËŸ.žWÀÉÂŒœT:f¡m«XYê6Á„pG<{ÆkŒŒZ·EVeŽ·k©êú\qȳi†ÜJÌÖó—pÛÎxï*mCVÓô¶±K·*on’Ö )9‘ ŽN]¢²¯uȬµHhYßRK¦YÈPNG^sÚµhÈéE#:.708¥¦¼‘Ä¥ä`ª:–8©j×—öºuÅÖ™n——(¢‰¤²sýó8«Fx‘7LëÔ ù#åçÒÐ΋$2,‘·FR?ˆªãTÒKϽ€¼ë—zæ?÷†xük:-râOÝh>Jy0épÞ‰Aù‹;•ÁœV‡ö¾‹ö¿ìÿ·[ý·þ}üÅó?ïœçô«•Çj%ñ.¡«Ýh¾´¶‘¬ ‹ëËÂÂ(™†B(^Y±×œ n™âOØkVzŠ,íüËô•¬¯lwùNc(êÜ«c܃[×Þ&ð®—p–—úµµË)eUcŸbsVîµ-.ÄB×wpÀ³#28Èã'ž~•GMñ_„µƒrºn­itm”¼Â)ìQÜàô÷éXÞøán=fI/­ ]:êár&uºcÀ±>ãÞ­ßø£LºŠEѵ«–×P´·¹yNäc}ÀA{tõªsxâÃJ×õëjöÞÚÊÒ;#k|Çi—àdœqÑx­¨üUái´©uÈõ_L‹>dêr©ƒŒàûš¹¨jºf•l·wÓ¬6í$q‡9Ái 8ÏRkš±ñö™wâÍCÆD‘ÀB>ç”gÌSÆ0½SWnü}à›+‰í§Ô•ZÞAîÌq1ìî¨>¹aŽõgXñw…4jÚž¡ê'–Üò|ÕLgnÐsÔcžÙ­K+»}BÖÞòܱ†â%–2ÊT•a‘@#ñ±}km^ÊÝ'¦D"d~GÎ8ïœsXz/5/Â6Ú¶­esru„Lç ì c#îôÁÁ=«r^ZXÛMu£O¡}t`±°Þ†IxÎæ#…gvIǽ?NñEôšœZ>³¥>›wq Ëj|Å’9‚}àcæ^¸#§9¨~œøWOûÇ÷·cæ$ŸõÍëZ1øN»¨h³Û˜¾ÍeäSÈ™ Ã`c§Ž¦°ôÿˆp_øgSñØLfÎc[—æBÁJs´cváØþ4óu Õ|XÚv—êñéÖ $­31el)ùN6„}«”û~ºþðeö£f.¦‡Y²{0²––ãåm¥Ë†?Vú×gmâÚëf—®iÖ𦦒ýžkiY‚Iî(àªöèGåZ^-mEt \ØlýŽn]™v®Ó’ ‚rNœ÷®öçÄ+á¿ÝËmÝâjVÑQÎe  ]˜pÇ?7ZëlõÏÙëVN¿me³RŠá­¥³gùZ W=QùUkoâêz…µ…•¥¤“,1_“¬][#C²¼KªkºÍ§‚u]4[—w¶’Æ“ÊÎàà1\eÈ=Íz,Fa f௚y…~îìsŒö®2=ÆšÄjº;i°éáäû4;Œ—*„Œ– îÇ+{Ó.¼i­^Ãá94+Xõ³pŽ—$þé£ò¿Ü9ÏãŒf¬Zêž4´Ö©\YM5Þ5Í•Ô1:ªH„ :9ç‡ËhWÞ‘à;ëÉÊêÝoˆ‚„¬npå²ü䜯o½nÞ[kÍñ ‚úÚ<é”4°· éãæ-È<` ëV´ÿ_[èýæ´b†‰=Ìù`…r¼Æ@$œ0 u®“B}Z]+O—UÙöù-Ñî.3 à ž:×-ªê^$Këó{âÒ H´ŠA½Äj9vÜÜØ¬ù¼gâ‹Ï xgUÓͺjZޱƒåI‰òΙœ€H®@«ú泬øv 'J¼×m£¾Ôf™¤Ô®!p©œ<É>ôÍÅLž"·Ñ¿k­[_[Ë$2G°K‘Œ•`œaÈ85Ðø¯X»ÑtÏ6Ê5’öââKU»æJÛA>ígE¦øóK¾Óî°uKI$  ñÆ›~2 c»ŽõCK‡Å¾/µ}r-~}6)¤—ìÐGUDb—z±bqÏ#Ú³îüKâÍWNð—Øî×OÔo5il/YUY pl®7/#ëZ¶é¯x{ÅE„ºÅÖ£aªÛ]K ™ŠXT6å*«ÃÝ+”›Äo6¨šÇŠnô/Gw:ZC2³îú¡VVIlóô®²MsS³ñ,Ksr%¶ÂR_M?êšTe”žyzV)Ò ÝÔöªÆgÚªª±œ–8íŒóZ>×\j×Ú~Ÿ¨jÚTÚT·1Ëu›­åCÑdd\† àŽ*®‹>¯¢x.oÝê׺† Ú[bó n`ìdŽ7I<ÖuÞ¯ŒzŽ—¨xŽç_ˆFçÍ·º0\¶Ad1˜ö<€¤z×OäMãOjÖ—×7–ºn•𥬴fI'M圡VùzœQàk7Äž7³–ê[¯.];d³6\©F ßÂñH²¿¸ðÄ“ó.±mhÂ9]ÇÉ' Ãæã‚9´Ë=&ßÅ:Þ·¥-Ãéº,XÚZ \)!$ÃÌ{&¯ø:K»=GÄž’ê[«}2âÝ­¤™·:¤é»Ë,y;qÁ$žjô´ÕüMàË9g’(%:—ÊfVu¤®å ᱃ÏJ‚]>ÛÀÞ"ÒÓE¦Ÿ©Zji³.Ì›àMêêœ1èy®r -oI‹V¼Ðõ»vòݧMFŽàíò± W·޵êž—VŸGÓ¤Õc1ß›u qÂN8ç­pš½Ÿ‡u_jí6‘yâK¨ÌyxQoaòòªÎê»R@$VÏÂé.¿°®mgWCeª^Z¤rI¼Ä¨Ü&þásUüs£j׺®™|šLZöŸom*K¦I"®€ß+qÈãµr×+ááàïØXZßỉ ·]ØmKãýV26¾3ÃèoÏ¡hš×­“Q·[„·ð¼¬R «4€Xt8÷žkRó"ðP–.?ÈýkƒI¿¹ðŠ/ü"6j&°[íYo#ùŒ»¼ö}»Ýóš½_B{Ùt.K×Gºk(g·#9Q’§¸'¡®[À,¶ºŸ´¹Ûý95é¯=Z)À(~˜­íWÄ–šf«£èâ'¼ÔÚ]‹?v‘Œ³¾OJç~éº6¡áswo÷z”×Rjm2‚Í!r[?Ýcµrv–6Ú®‰ðêÒô-Í€ñéËÏ™bO/9ê0á]†·kkoãϼ¤M-¦­›ÑcRã°<Šæ.!|ñAU‘®êg€8ÁR+Æv6:o…t;k(RaÕtpˆ Ä‹úÔºZi§â?ˆŒÊ¦ôiֆطP›@}¿Ž3\¿Š¢ˆGñ_ì}—ìšsÌîý rþÙÛ‚ß­t߯ìcðÖ˜­*ïºÔô±nûäH¬qøS+N¾1ñR[2‹·Ð­Lõ,7ccQø&ãÃP|=³’sÙÇa ÔL¬çÍžäç9®Ã6“›Ÿ…CPBeJÔä_ª‚«³ò\W«­Õ£Nö«4fá;DnU= pkšø”»üâõ³#¨¬ý+á¿€.´Ý6i4ÒÌö¹ýô¼’ özK´ÍÇZÔz„‰]i–NyXb‹!ÑI=CrG^õ‹­M§wñ#P°‘ZÂ? ý’Y£ ¤³„vê8%Tíšô ˆ†¢€ÿgZí¦6 Õ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š+’ñ»ý‰ü?«Í=Ž©‰nŠ‚|´d*$ vRyª÷ž'Ò‹UÔ#yÖìGŽáK|¦Gb ͑ی×G‡µ+K¿…±·EÓšôÝýBC –#÷Tœà·ùô­;í>þOh×énZÖ>î9&ȳ€yÏ>¹h´ ëžmÄÐß-¤ßË•{ù_˜ýìJèµ[mnÛÅZN­i§µå«Ù=„å]TÀÃo;ˆÈúzV‰´y®¼]g¦ÀWìZØ‚çQ¹dœŸfákÒkÏmt_éZž¯"øvÏP¸»Ô$¸ƒS–UQú30½ºTw†<[¡ésÚD’i~'ŠíäYÙa3—QŒŽ¸Áæº?hz…õÆ“«iÐAsw¦É.m®hå\0 8*qZ‹B³ñDú¡¿¿±µÒ¬b€Ç œ;Iº³¸Q€:§ëZ^'ѧÖôÖ·¶•a¼Šh®mdpJ¬±6W vìk.(|«_iÇPH4ËI×ÚbïtÀp¿upÎrOJ§g¦üDðäSé:<}Öžf•¬§žWW·Yvº„mÛI8à ÔÑø6öÊßÂV¶³Ç"ézƒ]ÞK&CJ][s(ä±èONüV®©¢ß^øƒÃº¬RF-ôÕ½+gs*ííÇ|â°.ôO‰/c}¢´ºf£gpó$ww»üØâœ@¥Y—82ô«Ú‚ÍŽ¥§JfYtûO ‘³½È`sé‚<Öl~ø‡i¥Má‹MNÅtÛÛݺ9¹HXp„gn@ã9éÎ*ä~×,,ü9q¦^ÀšÎ‘§-‹™UŒ(@Ü­Œ0äeHü¹«úVⶸ¾Ô5ÝJ7ž{_³Ckk¸[À;¶嘞ä *M7ÂÑEáX|3¨È'O±i¤ŒmÎ{¯\cµdÿÂ3ñê ]"û_ˆipÄ—Èéwp‰Œ+6ì.ˆ¯'Û5Tðæ¾º³ë^Ô¡´¸¹‚8.⹈¼rˆóµ¸d`Ê:óNðÇ…ïô+ýsP½Ô¾Ý6ªöîÇËÛ´Æ= 玘½Yñ^{¯ÚZ%è³¼³¾†ò Y7®èóÁ\ŒŽ}k>çÂÞ"†ö]SFÖ#´½»‚¿Y ßïÀp»SôcÚµ<9áñ ÃtÓ\µÝýìæâòé€WÆà(UÖÞÎÕ6AoÅŽÊ£¹©¼|š…ýÞ•¯]iÖúŒ¢k»x’6 &,ŒÊJ–žµsÂއ‘ßÛ[^Ï=­ÅɸŽ9ðLE¾÷ÍÇ>äÓuß G«_Újöš…Λ©ÛBöëqo°ïŽJºº°#<Ž*§ü :lºn·cywus¬ª-åì…|Òî…B€½€^õ¯‡ìaÖ[Y$7 ¦®ž‘³`mÙÆ3»>ÿ…T¿Ðtëgñ®mf¿“Q±Ž‹0W¤*À*ŽXÕ«Ì5=/ÃZÞ™¢ròòVŠ;{¿;ÊÓ¾nY÷(`ÈföÍzêhZzêòkD»]I`–,¤üžZ±o»êIçšçÛᧇ؈ æ t¡&ÿì¿8ý—®q·Ûžq»ÕÙ*ª*ª€ª @sú÷‚ü?â ˜oç[j¦Ä»´Ç(_MèúƒNðÿƒ´K=Õ°š{ë€k»© “8‹ßLU[¿‡Þ»¹¼¸ÅÔ+|åï ‚y)Øõ.ŠÀd÷Æ3ß5«7‡´9††Ü"i2¬¶h„ªÆUJŽ8ô55Α¦]ßéúœðî¼° gÉù<цã89 ÖLžð„×ÍÃÚ9ma ^¨–@’d‚NÐØã¨Ö¶¡¤iZ¥¼6—° `†hfE$ðÑ©àކ³uox?\¹–÷PÓÖK¹UΕÀAµ”‚=ñŒ÷Í]Óü=áý/O“J³²Š;Cù±c"Mÿ{vrI=óšÈƒá·ÃË|ùz49Ê,YŠl`Ãi,HävÆkVëÃ^½Õ-5»‹(ßR´]°\s¹>‡ÏPjÇ< w~u;ÖK¶q#;/ ßÞeû¤ûMlIa§Ësmy%¼msl²$7F‚žÙÇ4‰¦é±ÞË©%´k{,K “ó²)Èú ’îÎÊþÞkKÈR{y”¤‘HW±Š’8ã‰8Ô*"…U€@*¦¥£èºÌB NÆ ¸$,è¬}2 >7K·³þφÒì¶ü…@#Úz¸ÆÒ¬Gq"G„DPªª0ê(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÒ÷ú(¢Š(¢Š(¢Š(¢Š)FAê)‘Ao+ k“’?JS%Ħ5óÀl þtì ç½/i6¨ÎääÒÑÀéEQEQEQEQEdiÞÒ´ËëÍJ/:K˼‡’iÊ®sµw…ÏaZôRd†–“rn ‘¸ŒßŽñƥ݂¨êIâETsÜ[ZÄóÜJ‘Bƒ,î@UäñIͬÒM S#Ë Q*+P°ÈÜ;dtÍKESUã}Û6Ö*pzÚEeÏâ?[A¨\Íz‹2ÁvÜþéÎ0yfÓSÓ¯¦¼·¶˜I-”¢+…ù¨`àjÝQEQER¹Õlíol4÷Ü×7¾iTg Ë3zÀú‘TÅ:t6ÓÞ\[ÝAo¥ö XÊ€wÉÿVI7ÿ^·*™ÕtÑ©.fÿNkSt"ÁÿVnsŒu÷ÍA¡ëvšý¬—vÑÉqÝOnD LLT‘‚x8ãùVQEQH[ ppqÚ‚è¸ÜÀdàg¹¥¨æžÞÝ ³È±Æ:³üMsÿð“]Í«ëZU¬r›*ØÉ3I» xÀuÉ­›K·kKIo¼¨.$·Y$Œ8*§`ŒëN“PÓ"¶²]B–…C ™Ô&}ÙÇëR[]Z^D³ÚÍзÝxØ?B2*¼z·5ѱ‹P¶{°H0,Š\×åÎxúV^—ã TÖõm)¡Ø´*„J¤Ï½w6Õü_º(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š+žñ—Šm|%¥µô†&˜ÉE·Ìù†ìº¹=;V|þ6Ó­õ«c&£lºÚ;Ý,‡«J% 6žþ˜9®ƒG×ô-~)&Òï#¹HÛl›z¡ô`pGâP8ðS^µ•Ä? É%±d»ŠÎêe†ÞöXXA+7L9õìHÞ®êþ,Ót›µÓÖÚîúûÊóš 8‹²!8 ÝÏlœŸJTñ‡†ßG¸ÖþÐËinæ9•”‰#l)Û²@Æ;Ô62Ó®õ ]2æÎöÂêî6’Ô]Ç´M´d… ‘¸H8­»ëÛ=6ÖâöòQµ¼m$®ÝGZç ñÝ›Kjo4­BÆÊíÒ;{ˈÔFÌÿt6²ç¶å•qªjW¾<ŠÆKmIm--•£Ž'Uˆ¶üœ“°?î×Aã]GQÒ¼?¨ÝXG1¸¸Y!ØLÞÇ/~ûå/üO¨ÅuàmFêÆý%š;ä6hTµËÔ)!f 9±Ž¼WS¤øõ é´CL¸Ó¯–Ûí ¬„KpJ²1¹Åfhþ&Òôÿ h“ÙÛÞNײµµ¼Îy{}ç''$ð?*ÓÑüMu{¨É£êšTÚmø·ûDj̯±ƒ‚U׌ƒÔ ^×õ»}È]I“É$ÑÁžiáUÏJâõmo\¹×<iªèòi²¶ªd„Êèê# Œ®9ç¡t7'Ö.//mt-êعŠâw™c_4J&AÉäðã5Íx·_ºñ¢›;û5Ö³¥ìËåºÈ­ƒ à êAôâ·t™tûOÍbºRÛ^'‡­$yBT"±00ËëßÒ³­|sãKH퇆ã6ÆÒJ&¹Û#„ûÞXAý¢¹ì+Cû[O¼ñ‰=­‚=Ýî=ŵĎC"’¤!PÁÏ'¨÷®R KZÿ„[Å’ëºe­õ¾¥8hZâF- ™rœ§§• ÿÀEvÚ§ˆ5cª&…¡ZE5èµSËpÄE1Âçh$–ì*šx¿V·¶ñ¾§a:Æ`÷ŠˆäÅsÒU”à  ŒZÍ›Æ>¶Ñ ñDúMŠi&(fšÜJæàFøËƒ·g|éÞ½ H`t#"±¼[¤M¯è¦•ŒËuDó œäd€‘¬{æoÂUâ…&ûtöe†3†‘Äk«8Ë}x¥Kÿ‰zuæšú¥åäé ëb²y–…‡ Kêpµ ¶±ã¿­Þ¡á÷Óí´Øn&‚Ô]#³]yGibU—j’1ª·Þ8ñº>ƒw¥Ù@šî±ý™smpĬr ÊÀ2ög8#)kkoмGöƒæp¦Ì 'fjã}gMðÖ¦÷÷Ví©YëÒh‰{*…ˆÃ¸ ªrp@Ȫ‘xÆ +RÒM·íµØ¯/"µºµ'rùœ‹Ë€§¨;¸ïZ>"Ô§ƒX¿M[Æ £Û* Óí,Ê4ÌåäVGn½ãë3þj>Ñn,õ%MJ_¦œ×f ©½”B8Ï…m͈|1¯øp6¹u¨ZêÓËiw ÖÌo–Wj®ÞœÅsÚ¶¹9Ôõ»ø“Pðõäw²¦•±vÚ´ Œ[až­–éÅzv‹5ÝÆ—§ÍuqÅÃÛFÒMns„¼žÇ¨®o@íxºîC¸ØEeanð)Rïù·ò¨t—Ä:GtëùÞᵪY¯šs±06¨ö\ñéZ¾Ô§Õ¼-¢ÝÌs)·òØŸâ1’¹üqšço´[{‰¶Ž×wª[Ck½©3Ìs(Û€~áî:Íð_„†µa¬Ü]êú‚Öµ4µŠÖwmñ!ç Œ±<üÛ†8ÅDÞ.Ôîü5à‹k»›ÒÚÁ¹KË‹$f¸t¶È„†sŒ8éWôưñ&•k¡ÛëƒK¼IÒú-B9Ìq2®QÕåÉž̓é]Ä©îm¼¯Mo3A2[IŠ²Ã¡ŠççR…./!…cT’<6=§Tãsct5~ÓQÕ4½o@²‹Ä–úý¥ì͉Ö3q …'̇§’+ ø…m=φ¯„q4¢&‚icQ’ñÆá˜ô‘ã/ø{_Ð?²ô›Øo/ug·ŠÖ(X°;ˆ€£“1Z2ˆ7QîLJ!b;ÿ®<ÖŸŒ‘ßÃ:ò Ë:ãÿt×'m©éš®©ðÒ{;¨î`Ô!b‡8t·]ÃØŽõ³zËÿ ö”¿Ät+¼{þñk—±m ¼áÅÖí¦ku*µÔ«Y0‘öɑȦ}ù­?êLÚÿØ4}~}wELóÉ1öy3òâPKzs[^7ŽhcѵuŠI¡Òµ8î.#Io,‚¬ÀNÜçŽÕ‡­x›J×uǤ‰.b]U^K„BPáI rFO¶+0 ÷úý¿ˆ¯õK7—QžîÔÛ¼¢+ˆåälØÜ:0õúÔ¿Ù­m ø~X4뻵x¾Êíã¹w’m¥±¾BFA GoZéVÞäxóPœÆþKxr$´íÝæ·éŸÖ«ø^•øwO‚oì»±å•;òw`cçðªº%­àÕ¼+[Ì©†dI¡ Ãp}Ž+ñ®%Ð|} Ç§Ýý»ûJæí…ÊÊ*à£c‘ØsŠé/n.|/âK½^{›3S°·ŽIm£i `'‘rÛH=@<Ö|°j¾!Oxln!†m M;N‚TÄÒ€¬ÌÅ#-ƒÉô«ú͆£7ð%´¯yý‹k’ ™7\ŒzŠèŸYŽÓSÒôi-¦ó/-e•&yjb*Nsž}+Z¹ÿéºÎ$V!ZöÞhní•Ξ úô¬ÈüCã róK¶Óô[­2¸Y59ïQp#QÌqüÇqcÆ@â¨é7¾$ðm¼Ú ðý梱ÜÜ5…ŶÏ.D‘‹#3 ¤ƒ‘ôÍD¾ñµ‡„cx–{ÈüH5=H¡bó7³ž¡rk¡×4íFçÄ~½‚{k9/ÍË‚ŒI# œž8¹›+Å‚h룼±êS\^Ù܉d¦EP‚Žüq]ˆ4WPÑ4¥²Ø5M.k;ÈCò4ŽT‘žȪ§Šüa>™m¢6•§Z_EwróJŒÓNU&x'©8ãµlxJ¿ÓõOÜÜFëøæ€†rˆÀ'¹®†¹ÝWIÔ®¼Má­J(ÐÚXÅ~'r~e2( ïO³Òµ|S«jŽª,îtûHc`y.…·d{dW><ª\éÚô"»“Äòë:sŸ™2¥Joø!½\¶ƒâ¥¨Ø»K="ÂÖQ%ÁÄ’]8UÊ ¨O^ôª¶Ú/´=g]›J±Ó®aÕnÍÒÞ\HË,E†6²„mÊ¿Â/NËÁ~1‹O¶Ó‘­x~Ú{’óPºµ°‘d´²¹œ´²ýÒòvöÉ8­?øEtÅññ$SÜÅvð¬SE˜†m €]qÉñÍnÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢Š*–¯¥iÚå…Λ™kr›$\zä`Žàò*¦™áJ’Êkt‘§´³k8¥–FfòÙ·I'<úÕ¸ô½:;ùõ5‡“ÂI&ÖIÇJÅáï‚bº[¥°û²ùË w0«ç;„{¶ÿ®ž¸ À:-ûkskÚHóåÖ串ËÒBí•ÉF)çþUÖÝhî™ýqeé¡1oŒ*…éŒc튩¦x7Áú<–óXéÇ=»»Ç. u,»OÌI=8ëW—M³²±¹´ÓíÒNá`“$ŸÄšå¼-à+E›XÑ­¿µííJÄwïc‚G©ÍuZ¦¢ëp mRʸAÜUê3ÐÓ´Ý'HÑíÅ®›i­¸9Ù€3ëÅSƒÂ~µ¾mJ "Ò;Ö;ŒË†Ï®qVµCÖCR±‚èDÛãó6Óê2 YŽÖÒÖ(Q-Õ6•@P¾˜éŠ­e£hzk¼–6öÎã ÑFªHôà ½U-´½"Îin-là†iÖI(gú3VvG¼É´o#nìsLÓˆy¢†ÚÒÝU!…#U$¨E õÆ*L.C`d f«¸=©±ÅK¶4T_Eú@€)h¢Š(¢Š*²³{¨¯Z nb‰âŽCÕUÈ,×?JžŠ(¢Š(¢Š(¢Š(¢Š(¨¦¶µ¸h^hRF‚O2"À‚2=(žÞÖàGçÄ’¤YSxk/B3Üv©+T‚B)i x­PÒ5Ý_†[&ò+¸b™¡wˆåCŽ£?jШæ‚Þæ7†xÖXœaÑÀ*ÃÜ“À¢©\êºm¥í†<»n¯üﳦÏå · ``z‘Wh¢Š«¨ê:~“i=ýüÂXt’6p£8횊MVÞ=BÏNò¦gº†I’UBbP˜á› '›¬«œm;A ž”ªÊÀ ƒÐŠÈñ&»ý…¤ßê0Æ·2Ú¢·“»ËÉÁÇ_J³Ö¤Ú‹ÀÖ¨¶"Ñ%[0n2r¥1œÎsWÐ3ˆÄŠ\®ð Œ‘ëô¦-å“ÌÖËqFLa†áøu¦Ýßiö%½¹ŠÞ2pV 3õ$Vf¿âm;A²¶½vIcžxcL:Œ«°Á' äâµážÞæ$š X¤]ÈèAV Š‹P¾¶Ólî/.(c.K°Qì2}O› ø›K×4ˆµa41/”å<Å"ݱ’®xÁø«šn·¡k"C¦_Û݈ÎÉum¿\Wë"ÓÅ^¾½m:ÓV´šô<”‘KduÀÍŠ<-¤OömCS·‚pžaØnUõ#°÷8iõ ³ºkØ~Ïy,pÛI¸m•äû¡OBOj’çPÓì嵂âtŽ[¹ P+d`3ïŠËÔ|gàý&å¬ïµ(¢1æ/$GŸï_ÄŠ»¨ëš&“dºíäqZ6Ý’g!÷tÛŒ“Ÿ`išGˆtxLtË´¡m²§!Ðÿ´¤3ô¬ÿø”ø[Fšþ=†ãz,"Eb„–ÎÞœg#ŸÊ²®|s§[ë:}ÃßÑ®´©¤Ž3o’e”(Ú»w“ŒàÓœWC¢x›Bñ¹|ÎdµeYá•$Œ°ÈÜŽŒöâ³Ûâ„q\J!2ù?jò¤û>üãnÝÚǽtüEs—þ6ðþŸuujEÌíg·íoo º[îþùP{rqœw¬='\’ïEðýåÞ¯r­sâ4Ü#„øáÇ>ÔVRMhô;»ˆá[¦•<ÅY æ1Ÿ”Ÿö³ŽqÚ´µkqjƒEÑ4Ÿ¶]-¨¹–YäòàIÀ¶¹,px YÒøöêÛ@×õ;$è蒬WfPU‹mÁYž?Ýü)¯ã/Y¶›{©è m¤_ÝC¸Ÿ3ÃæýÖ‘6íú€íŠÑÔuÏI«\i—Ÿf·If»¼gHw?ÝDÚ¬XúàŒU8@PÃ:J¯{âè¦[G²0êÐ[·™ÙüÃÑÁQ“ŒàŽ2:Vþ¹â‹ÍRóJð奣íw7ŽÁÈ2U$ã’rÏzÉÔ¾ jö§zÚdk«éZŒWV…ò¬d+‚Œ9ÕÈõÛïüOÒµ 2ÂëLÒæ“X2Çj!’@-äA¸ù„™@äí´ôÏk¶º–«¥ø–+Dk=8j)qh_cE’*Ù ‚=y¬Öñ/Ä6ÓıÛi£Nò>Öš{— 3“&v‡+Î6Û5cPñg‰/5]Nðì­­¤›åžëwîFGÌBžF1Ç'¯Yjþ6–ïÄ¿’ËûFÞÆ+«;Øâ)ÒBAßrrìÿýwü*‡V‹Âºq¼š£&Õ"Œ©7î Ÿ Zµ­jþ"¼Öãðæ$6ÒÇh//o&BþR3mUEÈ›©Àf\jž.eñ†/î­×R‹Jûm¥ôq“@IVÜ›¸`xá±ÎqÆ+Oá¬ÐxKDûMÂJ²YÁ$!# å¡Q…8'$zñŸJÌñ_‰ïí" è7ZŒMLdŠž_¸+ÜÞËÔý+ƒ—ƺºe凌&Öd’ö(/m'A‰QÈ ÑEÚS9×5¹ >%ñ‹½ui¥iíf#†ÛbɺXáÊ’<ûžý«Y“YÔ< âëMKS¸š] VšÝ'R¡®#Œ®Ñ.^xÍtq GMñ„´eÕ/&µ¹Òu”Ìà³°ÚA$ÊçåãŠæôM Z]Ç“i:Ö 5]cQŽß2ä3BÊù ó¾6“ïÒº+ï\ø•< k¥\É k%ýÓÂĂ̊Hé–;kÐh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š+˜ñ½ÝôVzm¤ïnú®©o`óÇ÷ãI2X©ìp0lÖ6­áí/Á²hÚ¦†Ó[Èu+kKˆŒ®Ët“6Ò19aÔÔžÐ,u=wÄz­ì“Í%–¿0µ‰ä.&P>`¹$`wà}koâá×qŸøõ#ƒŽâ°o4];^ñŒáå¶_ G#C¹‚J|Þ€FG~}ª…É>Z虂¬l§‚ NØ\«2ç8õü)Þ/ð„4Ï \]Y[,WG ›Å'Ìœ³|ÆÎ[v{æ¶¼¨ÿá3Ô;xV5'Ôy†¹ýL±ðçÃÆ×tØÕäÓMÑÿXªÏŒz*@T:†‰¨& éž[;¸)íõº…eI÷|ä“üYcœ×K¥éö^!ñ½>¹kÄúxµµ‚@d‰0ì@õç}ŽŸ.ð÷O¸‚4°½¸ón—,Ò"ýr}sœVÿˆ­,¬|Eá ‹£†úk¹mßËP –þY.—CW~!Í<ÕÞe&$Ge8*Œà1Ïû¤Ó5½#ÀöúnÞÛ[[KË?°<0°)PIÝß×õ¬Í<ê7þ"¹ðþ™go¨Ðý=½+¯ñ|nø* iÉ LòT!þdVTv:ü/â¼7w§jzmΡr×¶wŠÊé/Ixý7/©Û]Ï}}à‰t›k[(N•t, ºÜÉŠB²¡R2@û§Ó ÖæžvÑŸSÔ®.‘P#Ü®#}«Â£àœuíšícñ‡õ}tØi°Ç}qoa$’Þŵ–Ü>0›†y~¸µyý†©¦MðÿÂÐ[ÜFóZkzlw‚34ç†F{fºXѼ1®x²Ï\¹ŽÊk½CíðMpÁVxYXžvA½+œÖf[ÿ øÛÄèVÇRÕlM©#T‰Ñ €ÎsŒŽq]—Ä&UµðîIñ6”8ÿ~ºnÒmCIÔìá8’âÎxû²+„±ñׇ-¼/|ÅÖàÓ–Çû3Ëo<Ì©·h\tÏ~˜ïRéZmî‘®xOI{oÝG)êÀLŒû+Ñk€ðìR¯ƒüNŒŒ ¹ÖB¤ËtÏéQkQ\?íV9 ‹‘•T% ŸÃŒþ•‰obÿ„’êÓÄwZ¶’-¡:rXùª— GϹ¡‹ƒÀ}k›0²èì-tBÔÝ›k»[yb»ÆvŒƒóeR7=85ß|A‚îm·†Ieö-¶4,Ã;xõ¬ ~HO‰5(|Ko«ÜÙáþ̆Éf6ò¤0o+~¾@t¬#EÕŽ“â {+ÛOÁ­ÙÙÌ0ÊU™*X€sóµ©âjÜ<1hZ…œX±73^ M§~ É,Iô½éºÏ‡tkê÷šÏ‡ïu;]M¢šÚ{@íå²®U—ÆTãõ¨Û×£Â÷²Xøwì^êö3Åh…šo*9 .Y°ØÉ t{×]â;-BãÄ~ ¹‚Ýä‚ÖêôÏ"ôŒ<$ÞÄñTõ-óTñVª$ŠE°½ð«ØŒ ¡ÞC‘õÁÏJãað彦™¿â¸ñQ%¹»–8ͤŒ¼y­&àp~ñœ&òf/ÐKŒùrÄÁ”‘ÜdsíX±ÙüMÔ®¬bÔ$°Ól­¦Yn$±fi.¶ô@@E=ùcïZz>…{§kþ(Õe’6ƒU’É¡UÎåòcÚwqŽOLYx+Q›Iñ®%ÄY×5 ‹«cÎ#«€üzŽqž*m?þ(›Sðα¬Kf·eí´ñÛo*Æ]¡J–°ç?…I hú߆õKywft+ÛÛB2r%ŽIHÈbp»G>õðÓF¶MSÄZ¥¬Æ}6Þêm?JoáX¼Ã$uÜpOJëü!u¯^hñO¬àÞîWpŒ¦ôYFØy—šÝ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š+/Ä·ˆlÊi$ÐO߆D9V_qY1xWYº½Ó®µÝhßE§È&‚…cV” |’;µjhÚ"èók¬í/öŽ ÷„—¹@Ú=zTºö“»¥_irJÑ-Ô&3"€Jû€j¼† f-d\;µÏÜü7kí;ûóÄ:„ÚlJÞå‚›~îæÛ–ÛÛ<{WJ4aªÉ«yÒù¦­»CÝÓ;¿{Ri^°ÒôHt"Ïsk±ºElçvç°†¿,X[ZÝêÚ…Þ“lèÑiÓ:˜¾Oº¬v‡e^Á˜Ö–¯á;mJõu+kû½:÷ÊI-£æ èÀã±Æ}ê7ðN†Ú ú4ÑÃ<žt“‡ýóK¸7˜Xçæ$S¿°µµ Éí̶úl+pòÊs>õw¨ÀfÏ9=1ï] *º²0ʰ ƒÜ嬾øvÏK›Gi.§³{<"YI6Ì¿wÊ#qÛwI𦕤Ýã5ÍåèŒÄ“ÞH]ãCÕW<{ñ“ë[7[ÝC-¼ñ¬ÊŒ’# †V ×9§xÂÚmÕµÜiq+ZÚÇ<ÒëÀž¼¾¸¿– C\¶û˜RiÛ^0ÁIúŠ’/xJ?PÒ’ÈgßÌf–ܳ ¸3òóÈÛŒe—|aqkw‘{»Y<ȧ–GyàŒnf'ôéíŇ<©Ý\^]Xæk’ û]ÔH@ÆX+ŸÂ´/¼=áýJÆ-2îÊ7³„ Š 0#Ú06ãcØŠMÚ‡ÒdÒí9·JÙ%œû±$þµvöÊËQ¶šÎòšÚd)$n8`j–áÏé?eû ŒPµ¤2A–DvÜÀ“‚y<Õ±a`·¨^< M˜¢’BçÐYãÂ>ßÚCG´ûo˜%ó¼µÝ¿ûÝ:ûõ­šÍ¼ðÿ‡5 ¨¯otÛiî¢û’É–_ÄŠ4Í*8ã‰-!Ç?ÚB ,™Îà1÷³ß­N–öÑI,ÑÄ‹,ÅL® ûFO|vÍV½ÑôMEÖKë {‡A…icV { Y’ y¢h%]¬ŒR=銎ÎÃNÓ£òlmb¶‹9Ùú) Ó´Ëo0Ak ^džkì@7?÷ŽZ|ö–w[>Ñrìm˽AÚ}Fj]¨WiQ·ÓµÔg4´ß.-þfÅßÓv9üéÔQEQEgëZRkVصÌöÞfÒ³[9Y#e9ïõ°­¼«Owcs¯ëójqØL³ÛAå$iæ(áŸo,Gn@ö®¶Š(¢Š(¢Š(¤$IÅ©Î884++ ©gRÑEQEAyge¨[ËiyOo*í’)*ÃÜ)mm,ì`ŽÚÒà·Œa#@UÀqSRE*¬À8PO_¥-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢ª_jzv™ö_¶L"ûUÌv°äšGû«À=}êÝÕíŠÆ÷s¤+$© ÎF{“Ò M[N“S›GY ½†Ú;—M§qŽ£Ö¯QEGq¸&«?‰<.…Cj¶€²Hã2§+w½>˜«3êšM´v²Ïy qÝÉvìΕŸî…9äžØªzî­ •­ìPjvÚŒvR\Çö¦ùQTã{€s´¦{â E±¶¼Ö5 xD\H[ #c? äŸlf§Óµ­W´7Úuì76ƒ9–6Wr{c¾j†ŸãOj×a±Õ­æ¹%‚¢·ß+×i<6=‰­ÚŽyà¶ŠIç‘c†$.îçTu$ú ÂÒüuà½fê;+I$¸•KD¬¬¾`v–ÀšuÇ|#k~4©5ûÚ£µû:«øÆ@ŽG=­n»¤jÎç  ±'°Ã.¹¨\økSñ æ«.›osz¯hësoÈFÐ &Ldç8Ýí[K;Ýkzæ›±(”éð2[¬`}—~áæ+‘†$ö9Æ=éþÖn5=ÅâíÔ,n$²¼¡–. f#ëVõ½Hðõº\ê2‰$C)i%sÑQ@$Ÿ ªzW‹ô}V[›UŽæÚúÞ=­.b))Oï(=Gn 桸ñ׆m¼=‰™åm:vUM¨w’XŒm8郟¥h_xƒM°¾±Óä<÷\O–¹!%ŽxÏAï\àø£á÷µmF;T—Ný}Ú[Ÿ.wäíï´0µ¹¬x«JÒb±`“^O¨ ÙÛÚ®é&d8ä’@ªÚw4ûص1=•Ý•öl×3Ù\ ˜À$2`•`q€Cu늩§üDÑõ ­XXßA¤ÛÙý¤ÞMÎpQ9$°ñ ·ˆm¦‘`’ÚêÚf·»¶—ïÃ"ö=ˆîëUõÿ¶•wc¥XX¾¡«^«É²0P±§ÞwsÀQÐuÉéUl¼[ª\Ë©i“èÏm®ÚÚ‹¨­U)q8 ’޼¨Åc| K§Ñ%¿¹°0Í{+I%ÛÍæ=Û`KáÛÐU.±¨xßÚ|šT–1Ãq<),åUÈÛ¹ÙvŸ™?„|Ùõ¹,^ø†Ú›¼±êW‘ÞH&`_1òŽÍÐm½YîÞ1ÑÀVz^ce ³ÈR®äÌÍ'ÍÄc·Íœ?Íù× èþ#¹¾ÖµÍöÕm®4áo,l­‘4R¯Þ¡´¾ñ ׉­/u¶XmF¡q›Éš(ÎÐçÓ'5•©x§Å-â› hÚ}´ŸßÚ®‚E¸C“Óc¿4ë_]XAâüKkú,k3‹bY.#qò4{°rO˃߽V½ñ7ô;HõÍgO°NøÌ3ý¢Ú9‰?+ÏÌƤ—ľ4¾ñF©áýÖÈ[YEg;]Î_„•rFÕêÇøy`æ—ûsÇ>!ºÕ‡†……½Ž›u%˜–ñ]šæhñ¸.Ö]ªù¾”’øÇħh6ÃNKjïq†ï"8<€K»c¯M£ŒäsRi¾ ñŸ­YèšíÅ•àÔ!í.­¦!–GBÏÛC~…£kÿüAá¦ñ$Sé–‹WGnav7Q9Üw¹Æ3ëžÕˆnüI¯^|8Õl.­íø™#Ia/äÌð±';—#Ç®{WªF$‚F áFâ?N™§QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÒ÷ú(¢Š(¢Š(¢Š(¢Š+ñ¾£¬hú,ºž› G³š)§Co„œ~\çÚ²¯|W©Gã/N·u:<‘EÉÚ3çNŽÑó׿­súþ¥â fÉ/`ž ãH-ô°ëò¨‹* #‚ùÏ·Jè¼Ïø[Р½ÖQµÕ$š ‘áEòÝSpd*ÁÏÖ±nßYš_[›«‰çK²V|»Aby!>˜©bñ³á›Á}xúö*[Ëi4áC·žœ+í¾3ÍbÝx¢=6ÎVßÅó^j‰å¼Ö¯ú<à‘¹B ¼}Ó»>¤×Ar5ÝwÅW6kW6Zbév×-;C’Äãi*HÏñ~Øêƒþ%×ãþfÿÐMyÞáÍvo Újpë÷Ðß%‘–Ò8™D…b”ÆÇ\ç5¡c®êÒj^Ö&ÖÇ\ÓþË<>\wnVP{· {V§…m[Äš›\HÖ v,-!$ì@ø>fïíI¯Ýc_±ðê]Íkf,žúí b²J7mT0@Ï'zÊÖ-|Aà;[ºÓµ9'²–#³ŽíšG¶Ü)`Í’W8$ò)¾ Ðeð–6½§êWòê–%‘çÙn~a¹]íÁí€1Úý–uÿêñ]ÞÞ-„Z}”¦Í%uFfŽœä g<ç›5‚¦‘ñCy®'´Òóqf$•ËF^Ûwg%Aè "’]ܯÃÍ2ÖâêÖÞþ+‰nL38gÌ Ì3žŒqÓ¶+GÄš†lîô="S{skmlæÌ;>l $`Àí^Û^ý«3LÔo|=Å¥ÕŒ¶6×–wO¼ÂÎ3€ ÁÆîÕ°<£ Êò+ùm5hÄ7gUgbæC‚ÅòÀn˜öý•,¶_AŽp©;¨ÆIàF£qi©øçÃqØ2Í.k}5ãÆr#ŽU ªÄwfäéšä Ó¿´5û¿‡òÆEq÷DňÀú4‡ò­/\ÜkÓjz­ÎGöN‹Š ùj«ºcùãÒ´ôü1—nÿc_7:>Ms×K=µ×õµÉ4›)ü7¢^¢ÆÈ%¶Ö2+*ïvã5bØi÷ú—ˆ§‡^½Ö¤±ðõÕ¼—E`éæ ìÝ¡-ÆxZÚ·“IO†6/c5å‡ö±ž~û&Ñ’9:õí\ý–¯¨ørÛ¾.}nÚòò(¤Ó® JñÁ™÷€vïWUàGW½ñ±x’áOà‰\u¦Á§hªˆO‰¨8<~ñóþ¯câÏxsÆž6ƒWœZÇ4–Gpê|²D#*[¸ó[ž c©^ø“ÄQDñYê—P O1J™Ûæ`ó†=8éUuëè¼/ã }RGMÞ‘ö¹U, •$Þ7€ÀõÇQK¤ÝG⟟iþci6L–QÎÈÊ'–W Û7HP98ëVþù¿ð‡idm¤åGï[±Å;W†á¼máY–$±ÔÕäìRBã' '¶kœžËP:ÅHŬÛî/¯šØs(1. sŸlÕÏK>kà Rk;©a±¸‰®VÙ¤‹tdªŒðzñU¾$¶©¤Ï§ø—F‰ÞæúÊmÔpÙ¸…°ºýkºðö‘£éºLGrÙÛGoï9?‰æ¸{írçDø‹©È4Û«ÛWЭ<æµMïÞÛI\äƒß⣼Ð5[x¶þ[)l>Ýe–› ÐÚî!mûG 3ð2sŠÊ¨¥µ…€'‹T‘£[¦¿öX#{nó>|^µÛèzv¡kãܽ³Ge=®––òãå-0îÖFqâK¬iƒA¼Ô­îu ›Ý>{@¥Ožw”’6•n2Aªºï…üMªÙx_Y×4Û}gQÓd¹kí;ã¸wÊZ< dóƒÍ[ðÖ‰ ÚÜZƒí4=:ÚI Œ]K# |› Ú uÎI«þѵ;À°é7–æ;õµ½O%ˆ<»¹PH$rïX×:/‹,|?à íô¦»¿Ñ%…îlĈS†'nF}kÒãgdFuØÅA+ž‡ÒEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÓ÷ú(¢Š(¢Š(¢Š(¢Š*µýœÝ”Ã1\Á$/ôqƒ^saàÏÅámF)‚o›Û[‹F.:ZXþl’õõæµ[ÂZ•¯‡¼#¥Û¢Ë>›©Ø]]ü|¤´Œ ëÉ8­½{JÔoõ? Ý[*¬od’ãqÁ ÈG¼Ö!Òü[áûN-+I³Ô¬ïnžæÝå#Û´Ÿx>TåAä`çb¥Õ¼7â{ Ãf."¼Ö »Šð#fWݰm #'Õí3K×›ÄC]¿†Ú6²Ç…ŠÌ$,@;FT×¥C/„§¾¿ñy¼‘E޵oi% Þ†4 “Æ88#“U¿³þ(ÝE™=Ŭ´k6£nÌg•óµ íVnÿ3{Vݾw‰/µs"iôø-Õyß½’Olc­sOo<*pÒDè í‘\ቚ~‰‡ÓSÓ³Bbk‚’y°«çpAœ 8úqW|ig¤éŠÎ9|—Ó…¯övÎeˆ€›Grz~5¿ámûDÓ´âs$0ƒ3zFåÏâIªúö‡©]ÝYjº=ÔvÚ•¢¼y•KG4MÕ^AcY‘ø&ãTMfo^ ‹½RÙ-±o•ŽÚ49Q$œ†ç'©íIÿÇŒu%ƒO×µ‹{*‰a„¬·>YÈÌÈÀçÚ¶ít7¶×µ=hÜî[Ë[h¿sÊÏ9Ï9Ï ª§Â¨òx¬ËvͽÆT. E³ƒž}{U-/½»xrMKV[¹tG¸•„&øäŒ"©ùÝëžõoZðÞ§wªC¬i¡ÓïE±´˜˜•ÖXó¸pq‚§§5^ÃÁRZßêwz¬×±êv~EüS*âVä¤chà?®ž»–}/P×'»Ð­Ì~]“Æ€°ŒåVI,£è3Z§Ã—)â/íëmJHc–ŠêÓb”›`;NO#íZΑc®ØM§ÞnK´îC†FSÊ{kÏÂ7_k´»Öu›Sì2y–‘J¨¨Œ` naØžž•«§h–ºmþ¯¨G,&§4RÈ­Œ&ÅÚà;òM\¼³µÔ-§³ºŒIñ´r!îZæ-üjïµkûý>Ùã{{+‡S”û»° ¶;n$Vާá{MKWÓµ¥¼ºµ»²_,ùÍíÛ$9\ý*Þ‘¢XèÖrØÛ4³Ï3o99™‹xãž+IÜ®1ƒÏÿZŸ£xGJѯ$ÔL÷WºƒÄ!ûMä…ÝS9Ú½ëÍhhú=†…f,lƒˆD²Ëó±'21cÉ÷Ø­km7N³žòæÞŽ{ÙK‡deýYeWR¬2¬ ÷Ìh>{]?Qðþ«oΕÛ5—™† áXz£d}1[’Ú[Á%Þ¡kiê[„ÝÀiBdª–ôÉü3T<+£O¢é‰Û+ßÜH÷W®½iN[àö§}a§jp=­ý´W6ïÑÊ¡”ãØæ¡Òô]D‰¡Òì ³‰ŽY`EPO¾©ÖÊÅ.d¼[xÅÔˆ#y‚죠'®)Ñ[Z@$XaHÖGgpªæn¤ã¹ïBZÚGµŽÖÜ!O(( ´öÇLSd³±šßì’ÛÆöÛBùL ¦AŽ˜ü(·³±´„[[[Ç 寠/>Ê•8ÕQ*( ªJŠ >Ùä’ÞÚ(¤åÙÇÜSUÎ98ïFÓ¾kKÐ'²Ö|I©O,rÁªËhñE·”ò£ÚsŸZßàp(¢Š(¢¹ûÏ Ë©kvz¥î£,¶vR íl6¨% 屸‘Ôdðk ¬˜txuë½}fÍsc ›Dq°,lH#ŒçŸZÖ¢Š(¢Š(¢²‚#' õ¥¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(£Š(¢Šix—,¨$œð1B:HªèÁ‘€*ÀðAô§QEJëGÑo®­onì šêГo,ˆ EŸî’2*íQEVfâ W¹½´°¹óå²}“íVÚ­é»$wÁ5v[»8%·†i‘%¸fXQˆBHQßš‚ÏUÓï®oí-Ü´Ö¬W©Y”0Á#ƒÛ5vŠ(¢‘™UK7MWÓµ VÒ û|Ûi×|o‚7¡þ•f©éš†±j—¶2-Ýä@ÄÊ1SÁõrŠ+#\×£Ñ%Ò#{w—ûGQŠÈ2<²àáŽ{U>òþîKõ¹°{U·ºh¡f`|ôaÆ:èj÷) QŒœgŠZkºF¥‚¨êIàVG‰µÃ èZ†³+tmb,{°:àÿ#Z1^ÙÊâ4hØÄnúŽ´]ßiö$¼¹ŠÝ ÀiX('êH§››E‡íd`0°ÛƒïÒ›åŒÍ:Eq½¹eVÆHÏÍéøÔVZ¾‹©4‰a}orѬȬWë‚i—šæ§L¶÷ºµ¼ÌË"«}‰x@#ik!¼Sá4¿[jöbü¶Ï³™W~ïLg¯µO¨kº’Û5BÞÙ¼–›l®”R8' &­ÛÜ[ÝÁ Í»‰!š5’7Xdõ…µ{¨kº­•£¢XiVª—0Îë‰à:ôEëêOµU°ÕïçO ;ë¶2ý·Ïóü´8½Ú„'ž6žOµ2]KÄ/¤øŽãLÔmﯴíJ*8ãÀT‹ mßÕ±‘‘ÜŠè´RÏZÓ¬õ;C˜.¡YS=F{qÐ×/ªxÊÛBñtš~©~éí¢Åq…”¨B~V5ø[D¾þ˽¹q~`Yã·Ž)äV$ Täðx6‘â¿kv×·V—%c±f[µZ6€“½\)zŠ¡kñ—S[G¾â(nåò­®f†D†fìØÏlã=³X¿ð’_ê?Hj0XØ[!ÇÍ#1¤b¤ùxû¤ ïZºO‰ô=;Âðê÷z¥Åå·Ÿ4I<ÉûéœÈ@EE'< @©¬õ{DÕïmtýZ-&{››k»èít/7–f‘>s—ùÌqœ¶O`y®ÛH²Ó´ët»iE¶cä‚XžX·»“õ¬/9Ó®õï œùZ]ÒÉh?»Àܪ?Ý9Û´|K®Ýi+akan·:–£sö{XÜáYÜõÚ£“Žj…¾·â3VÓôßAhðêEÒÚæÐ¸ *.펭ýîpAíÒ¢ðÖ¹ãMzöéå·²ƒK²Ônída¼Ë7–H]£8ã$“žphøÏZÔ´ Ký>8ä¸YáEIsµ·°àŽOoåXگŠ3RÒìd:]ÃjâD‹jH¢ÕÐ$Ì\žÉŸn÷¬1Ö¼Qy®Än…Ž tëX$c¶D²€@Ë“œõ÷©¾Y?þÛ5šI’Έò9f*1’sÓ¥/4mORÔ4[˜ôص›EœÜirHylù[o£~ÊOÿìñí¦c}¦J-áš}*èÿXÈÃãœ1t­â_ xcÃþÓu=>Ñ"Ô-otùRðÿ®wwPÅß’wgœžjÆ·•{âËÙ-ô9¼C¨ÛZÁ ‘NÑ [ Ã#iq÷ߩῠçü™aðWÄ;'¶†‡ZeKTmÑÂÆv© ~X5Ðx»F°Ð4-7MÑôÔhoõKH.ãF×C“¶I?9à“ž¾õV{ VcÃW0øfÃC–+øã3¥Ì@Ëpñ…URÙÏ"™>…©ÛÞx’æ Lñ>Ÿ¨_NòŸ1EÔGÉ`GÉÐÀŠí¼w¤ÞøoH›KI£²û8Ž(ç$º%J±$ô#j߈绶Ðõ‰í2."°¸xˆê!Æ+‘MÂ_ð®3%¼/lÚ¹yJÍ!%ó×~îùÎj¥Œzψ| 6³šx¼9%Æ%þðí ÷çó¯L€+†ð/kã'úöñ¥æýp1ëÚ¹¿´bËá#ÈóïЬn+­ð–dñ?á'¾Èÿ€­3áRºxNÑ Ê-Õà‹áµV¸}2/Š6†çËÉᢖź—óŽ@÷Æ Ö?‹#¸ŸXñ´º'Í"øLEyåw˜¹*?‹f}ê®­ýµs฾ÝâM=êÎcYÈÍÈV0&$°=0½ºWI§@‹ñ¼ç\EáKeÞF>iÜqÛ5Ïx¢ Ù¦ø­ªæÓGì,й~?ÝŽâ¼—Ú ¤w>4‚k@Á¼6¶hÒÊÅQ‡È þ]먰 ¿õevÉÿ„vÇø‘ù®7M’ÒËBð.¥tâWaâ+ßµ7ðÄÎÒ*;zc×¶kººñ„õ=rÇN´Ž-Fþ;[©ÅÌ;Y!\Íž7ôuï\F™¬Oaà߇ÐC=µ’^I$gR¹Œ2ÚÜFÝØ› $ã­Ma¨i ñ@Sâiµy•ô 4†1 ÈûHŽ3ªî=ÆXô溯†n­£_(ÁÙ­êJHõóMW¾Ôôß øÖâû[˜[Ùê:\qZÝËÄQ´móF[ 'ïrE3E¸°ñWŒ5m_O+>‘‹˜× >K‰˰SÐ…­qšF•¨ëqxƒAž&3xOJ¸°´vç|­1’6ðAW’K­gáÿ¼MunÑÜëBGØG+"Œ~þ5ÔüBIàbÑÆÄ‡Ójƒž&NÕ‡®ÚXé,ÖïuÝSSÓtýR+9-n,ÝÖ"Ñ&ÖG(­óq‘œpj„¶0]xCÇ:Žk©È·±Á77îÏ-âBxeB …ã9$zWwâáj|9ßhͪÙ¶VéñÇÆ]@’p0}ë”ðÃ[¯ˆt¨ü©j—Z.ÉΥؔÁ íù4ªlöñÖºÛ]Áà¸íç‚XæÚÇ"üÈøãŽ½« A°Ô–?… ös¨µ·½[ÈÃÉÌ8øã=³QøCÅÑhqø–ÚëJÔ$Dñ¦mäµä!Êü á³ýìzë¼ §j:LÓßÂmîõ+û­BXóžù }ÀÆ}ë§¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š+žñÍœ×ÞÖà…wIöV‘TwòÎì~8ª—ÕÜÒ5]?MþÒŒÅfó@¼¸ˆ¹`å—Óõ¬SSµñ¦¥á»mÚá¾Å¨Åqu$.‹GÕ2À|ÌxÀüi4ÝTø}oL¿°½–)µ¯4ù- ye›fTO6+{Àº]þ™¢Gý¡Šöîy¯'ŒJs·ê3ïUgµÔuéµÍFÛtR[Z]iºQ|æóÉí–ƒè¤÷®{ÃzR®±áã¥øvçI–ÂWV¹•‰B6äæeþlóŒfº*]x«Æ:Œ|IJY؆ Ä™qødTÞ.³ÕçA×4ûV»“Iº•¥·Þ)—kÏR½@Ï5OÍÔü[¬h³2êÇLÒå{©^ñ<²•Â*®IÂç$ô«þ ²¿±¶ÖîÝ i5Ëù£ Œº;e[ŽÇµ/ެ/µ-ÛÙÀÓÍöËFؤµd<ã §k¶W÷÷„î`·i ¶¸¼3ÈÄA¢ “ÜñÆj¥þ…}©x“Vó¡+¦ÞxoìFpGßg9g9ž•—ÏÄ%Ñá>&ñm>Â56?³mÆÑ']ùÇ8ÙZzo†ïtwE6ñÓl|>ÖbFíáÔŽ¼ã5WVðýåž½}«Á¢[k6ºŒ0‰b—`’bK‚6°ÆyàŠÖðŽŸ¬ÚE{q©ZÚÙ5ÌÁ¡³µTÛoô Êæ=OQéMñ›­.¡§kÚ4)qwh’Á5³¾ß>'쑞*¾—aâ=_Zƒ]Öìã°ŽÆÞHlí@íºO¾ìÀÓ€j÷„t­GH°¹‚ùQe“Pºœll‚®Ù íUüa¦k×o¢ßèÐÃ=Þ{æùS>Õee üØ?ÈÕKÕm5__Þ–;ù-Z‰ $`6r~x¬•ðmü¶>"¶’xàžó\“S±™2Þ[|¥ Žr0FOêÄ6Ÿ5+½?ûJ[M>ÎÖe–adîÏtTp§r®Ô'¨äû×K}go¨Z\Ù\ Ãq ÄãÙ† qßðüB}0xuõ ÓÄbÔÞ*¿Ú ÆýÝØã9#½]Õ¼5¬Ás£_øjkxfÓmZËȺ cxH^AZnƒá¯Zë÷úî±}o;ÝØ%¿—2ˆÈlàdœ¨‚y$žP°ðŒ­th´±¬CºuÚM¦Í¿Ì ’VuÜ+g\šÓÓ´ÜëšÏˆn­K¦ŽÖ4` ÊffbIã ÀÖbxY}/UÑçÔáû+_›Ý1–/žó üù8ažØ^˜—QðŸõˆí%¾×íÖîÊê›d†ÜˆwÆs—ËÁ–·ô}]/P×ožàKý§sÊ¡qå…@¸ês“ÏjÊ“À–ÓéÚ½Œ·Ž$¼Ö$Õmç@{iIJõÉR=²*³ø#_Ôn´‹ÝoÄOu&™y ÌI‘¶Î¹“–8ç[Øä{&‘ãa7–2Êv“µ€íÈ÷®fÛÄ¥öãeÖtûÃeo5Î@š0ñ«û¥*A¾rG½hêzçˆíµÏ Á¦ØM-”Ö’•Î@.Œ›vNcëÉç=ë¡Ñ|Eª5ešk6™w$Æì 28aÈ©¼9¬¿ˆ4«]PÚµ²ÜïdŽNÐÄÛïkVŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š+—øŠ—á=`B¬ØŽ6‘W©Œ8/ømÎ}«?dž‡wá ³–)¾Þ¶ðéñÄA.ìÃfÀ=:ûb§³.¾=¹ŽG̃Ãvû†z‘)ç£ãì_øG5?í8XlO9íÇÏÌ0ãýӃߧJåã¾Õ´ÍGÃÐ zÓ_´º¼H£ŽHÓí©ëó´gq+ùUÏ ëú‹‰`Ôõmç·Öïåx¤`c© ÔätÀ9®{D¼µ¶Ò¼®]0e½î¥Ò7݉æfÌ{r2zfºSÄžÔîïl´èb¿žÛF¼–[ØŠ•· ¼&þy@z ¯Bÿ ÑÔ€‡ÃÁ³Ûý_5ÖhLHÒ˜t66çŸ÷y­”Ú~‡q¯Úk~'ºÑæ]Væxá5Y£îä%‹gœÏ4pYÚ辞%¼Xïü_mt¿m+æ7˜OÍ…Àd w®ŸÄüx—ÀçŸøü½{Âk—ŸP³·‹ân+°Ô®¯R§&‰pÀÖ´µ=F ‡Úž ^;HífŠi6±ØòB¡AÉöªž9MWLÕ§MŒ‘â«8ôæ+Œ,ÊÁwm„þUÜÙ]iº}Õ¯‡ ŽUx4ä–3±¼±€oÆÝÞÙÍjÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÒ÷ú(¢Š(¢Š(¢Š(¢Š)y­cØxKÂ:]Ûߨé6Ð]»2¢Àž¸ô϶+HYÙ –½ ºh„&m£y@r=qžjfTudu ¬ ô"¨Xè^Ó$il4ëki`´QªŸÌ |º>‰=Ò_Mco%Úclí—é†#?­OöK?$Ûyù œÇ´m99µ=QT4cNÖ¢ž{'fŽ ©­\²‘óÄpÝ{f}©ÛéòØC$S;^ÜycBÁN Ë‘ÐqÔÕÚ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š*ž«¨G¥i×ÚŒ‘´‰im,ì‰Ìr@Σ¦ø’×Q¹¼ƒìòÀ¶¶v—m,¸ Vu-ާ•Ç5Žu=Me¹Ð|9w§ÆÌÉtŒKަ%c–÷Ínø{ÄZ_‰lÍÝ‘u1ÊÐÏ £C"õWˆ­j “Yúæ±i i×:ÒHðÛ…,±€Xî`8_Z¼ †ÈÆ3Y’ê:œSê9³Ceod³Á8fWÁ%vã uç9£CÖ¢ÕtÝ.òo. ‹ëX§ò7‚Fᜄãè+Ozn ¸o#8Ï8ª÷×ö–÷HŠ ˆÈÀ°vëëÐVE·ˆgÕ´íPÒÖÛwâæ9¥‰e”È2ýk^êšF›³í×°[y™Ùç:®ìzdŠ–[Ë(cI¥ž4ŠFUGfX·@©íU­õ½òå¬íµ y®W;¢I°Ç^ÏÏCâMzKÅã·Xω'Órdıî¯Þëíí]y!A$à’McÙx³ÂZÒÙYêÖ³\¾ý‘£‚_o]¾¸ïŒÖ=·ôë+ÝrÛ]¾‚³êM ¢w´aô'ä]"k4šöª^ÂÚ–dû@a³hïž•CJñ„µ»i§ê1ËpT²ÆC)`:•ÜqíšçuxŠ'Åw\¢O§ë‘Û[¶ÀvÄLywàžk¾®fˆ ·ó _–±YŠG#°qóáN}qJž?ð\—PZǿϘAë˜Cü"]»3ÿ«šÇ‰ôMh-nZY.çRñÛÛÆòHTnÚ€=Î>Ëľ¿Ó¦Õ »_±Á¿ÏgLEz‡RzšÍ´ñ÷‡.§´‰£»·ŠöA¥ÅıNÇ V#¿lã=³Rßø×C±Ôn´ÕÎ¥n‘»[ÛÂÌ̬3•íß‘ŒÕý _ÓÃû-¥‰.ÕÜËj²6ᵂçæÀµ%ψ|ewâmG@Ò-lÄÚÎ÷wþQ åv¯V?ÃÈÖ>•¯ ÚÚÂ.õ{ß] +@@27–§,{"¼­zˆÔE¬#PxžïoïL „Ïû ’p=ÍrÒjÞ1×u=NÓÃÒÙÚYi’‹ynnciYñ’ªªé…\Œ’O°®{Å:׈5øŠÞémíu .ä[ê1ª³¤ÉTÄICwï^…¡ÛßÚi¶^Ë ³¢`´ùiŽÀ&æÆ½sÞ£âѪ_$º½‡ô‹uŒ[Op#w»b2ÇæuTñÓ5õÛ¿&¯ÖÏy³‹Í“È& YA'ã“]/‹5]KKo}Ž@‚ï\´´Ÿ ÑÉœž•ÈiVÔZÇÄVŸTó£H×ΈBƒÍ/oòœŽFÑǽWÒ¿á`XøÇ_ƒYŽe¤Å<6"1´Q/Gc–ÜÊ9 ŒzWGu¬k¾#Õltm&é´è“¥ytŠ­ œ$i¸©$©ª“ë(Ð_Äš%æ¢o&‡@¸Õ4ëÖDY&T«€§£=Å2)þ Xø>çÄM¨I©j·Z}´Ñ[G l[”P2Ì’ry#¥Eáf;ÝZÀi2:Š0a}a¨ª¬Ý>ô@"Aê0F* øYÖWÄ’o^X[ǯê)ožÕÃ圕bÞÊšËÄšýöðþîk¦[‹ÍhZÞÀ„‘èÛr@ÅI§Øk¾&ñ‹íîuýBÛN±¾Š;xm\! Ñ‚~m¤àvã9Ímø'PÕµÝS¹û\ú5ø¶K–<±:Bøãp’Íu”QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿ×÷ú(¢Š(¢Š(¢Š(¢Š*¶¡e¥ewa9a Ô@å+ŒZå+ñlº’¼ñE-˜Žíå‚Ñ ¶Ð@Î8ö¬ ý6ͼâÛ š#Z¸K1‰0*²àI¸«"ÊÖÏÄúý½¬K [G(áU …zÕ•¡ø/Â7^Žö{hÞöM>Kƒzßëb‘A «õ_AŒ:U¿\]ßøƒÂ—ׇuÔ¾v‘ÈåÉ‘9üzÔº…®ŸwâÏ%Ä1L§Ã1Y*v±# ç§QéYðYiö¾ð[ÛEM¬é’É´½Ê¶XúŸ~µ±á/KÖµj:µ¤WWɬOd¾r†ò¡ˆ Š çŽN:湋Û;gðö¿¤F»´»GmoΗr/°bqŽ•Ôø§JÒ4Û¯ÍceE®An…*Ž­¸qŽzì€mâÞ0ÞqŸ;F|Â0[ëŽ3T¼IŒÚ&« õ×Ù-d³–9gÿžjÿ áfÖm¡®¿¥éÚŽ“iud¶—¶NÉ$möw÷ ÜúÜð­•™×ücxÐ)¹þÐŽ0Àöæ¹Ä}6Ó@Ôì%±[ÅŸÆÚZÛ;”ŒH\2î#¢‚2x9ôæ¯j‡Ä+â/.±q§‰…ì¾U½¢¾å]„ÜÇ8í£ëU5…ÿ‰ûÿÄþ&ëÿ\«Ô«‚Ñb…<'⦨/6ª_ߟªjÉü6ÑØU[}.N1€Å”“Ÿ©§íxükâ8£Õ Óäž ) Ħ‰Sa,8VÎF:Õugk§xçWúâK5¬#òÛÌL)$åƒXÚ«ø®öhF€5/ZܳëtÉimkUq–'s¶ÑêH®·B0·<`ÊU›ìÚW#¨ùñKá cƈ8Õ‘ˆô-¨¼c©Ëiªè‹wk¦¬ÿic¨\"³G´’2ØP[¾Oàk@¾ÓÝ#×S2h²Â³ÌS ‘US´uÛŸzÐðÏ–~9nT麉lsž^©]G4^ð†½h Ï¢Ûé÷ƒoW‹`Y{?¥mü?Io,õÌ“\¾’ê0z¬ òÆ?!ŸÆ¡ñdë¢ø‡Ãž »F:dÝÚ\JªOÙÚP6±ƒŒÚ¡MWOñŠt;_´ØèÑÝËsv€ù{æM«lr{œt¨üÿ¿ºGFÉMXmeÁæI8ÅdèòO¡ø†{iåÓ[Ãi§\ómí§ŠÜxjæ8dš2†|J¹*¬Ú f¨èöw±è Sì’ƒ°K©I“–àc×ÕëÑJÞ.ð\« Œ¨50ò*’©˜‡Þ={f¸Ä[{ï·Aâ; oRñ¸˜- ó…¯S³Ë*V€c–9ëWô(õ ™>ÿľæ1¦Ï©Ave‰—ÉaœòœðzZôé#ŽhÞ'GR¬=A¯$Ò<'â+?Äö°Ê­§Yféëþ°E#J®¾¼ì•¥má¯j~ ÔæžÜǮꔚ·‘/:8؇=>U­kZ޵ã;ðô¡b÷o½žéÇjà¾ÖÉÜN0¸Îzñ[FŸ©AãÞK%ͦ˜°J~ë˜ÕƒÏnü ç_À×w·^,ÕÛìºßöªÜé7ŒAÈA\`ýÖ9 œgÓ]ö“u{{akqyjÖ—2F °9££ ž==«‘‹þ_êZçÙô[WMÔïZúµtó"’@««²q‘ÁÕK¿ xšïÃ-’ku:λ7ž-UÁ*í ã€HQÉéšô8C,Q+ 0E{â¼ê]]ÓüC­ÞÉáˆu¶¾$³¼–TÄd8%BŸî)ÍCmá_KáÏi6¶ðß¶«ý£i*>a‹‡Ú(c‘Þ­êvß“â xg]»²¸~"¼™¯d”DJÉ3*vòŒž:ší"ó<¸üÌy›FìtÏz}QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¦ÉsFñH¡£u*Êzzƒ\\> ñ>”e¡ø¢k]3'Ë‚hRF„ѹÀìqWáð.……q¡—™Å̦âk¦oß<ùϘ[ûÀŽ?*ŽßÂZ¼÷6rëºìº”S,ðAå")‘~ë9^Iº Öņ‹†¥¬jK3»êonαùI´múõ9ªàû ,ÒÒ;z}QEW‚ÆÂÖ[™­íãŠ[©“º(F±îp1V*¶¡¨éÚU¬··÷ okÝòÈp«¸àdû“Vh¨§¹´µ×$BI4.Ànfè{žÂ¡žœÚƒébaöÔ·-“€sŒu÷«tU·X}°éÿhí‚´y†ÿ/8ÝŽ¸Ï«QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÑ÷ú(¢Š(¢Š(¢Š(¢Š*9ç†Ún&m±EHíèª2MGc{g©Z[_YÈ%¶¹‰e‰Æ~eayæ¬QT¡ÕtûBóKÉ»´Š)f]§dÎÜ`ôìjí‘sâM.Ú}VÔ¬ÒO¦Y¥Üée‰FÎã©8è+NÞe¹†ÕYVXÕÀq††y¡©(¢Š(¢Š) P@'“Ò†ePYˆu&€U€*A¡“â mtm/R¾Râ{8 ¾A|õ 1‘§Ã©^½Ö%·Ž;°Gp'2 ÛØò»zàõ‡£ø«Ä:Öý¥f‘É{qF×?8ˆ¹Vgù0uÏ­t÷š†›§F%¾º†Ú2ÛCÌáA>™$T†æÔCö“2ïó7 »}sÓž­£j;þÃ}os°þTŠÛAõÁ5Ï[øÖ×Tƒ_M>{(îôù%X ó)ŽT@švò'¯Nµ¿>«§éÖ1ßj—vöÑyh^Vp#ɉǔ¶:Æ‹ªZµí…ô6ª ibpÊ03ɨÉãÅ,>µd%œ!|ÕùƒýÞýûUÍW[Ñ4HÒ]Jò;urBo<¹Ý“øOÓ5]+Y¶[½6ê;›rJïŒäduÜ{Óu]cGÐíÞ§u´‚†s÷˜ôu'ØPi$ðö¼“¾™z“ù Td2gûÊ@#?J¯¥xËÂzÝÚØé—ëspÐñ±  ãæ8À>ăíZ¶¯¤èv’_jw+ol„íÜž€’Iì&¨i>/ðæ³tÖ6³H— ‚ ˆ¤ÙVPꤦj®¡ãß i×7“\JÍlÁ.eŠ+v=¤uR£ñµNûÆw?…l/ìo.µ9&Ôš/µ=¹ÉUŸ ¬£h*úãŠèl5˜o¼D‘ ‹ÈZ]n~Á¦µâñ¤Ñ\ØE«è—šm¾¡*Ãmq)F]í÷V@ŒÅY»g#Þººáÿá?Õ&µ¹Õì|7sq¢[´¥®Œ¨®é!™"nH8ÉúU½WÇÎëA´Óô¹õ u«I.-Dl« »q ““Œt5gCñ=î¡©ÞhÚ¦–úv¡o\ªùŠé,Lq¹Y@èx ŠÓ×5›m Â[é‘åÚÉQG÷å‘ÎWÜšÂ_ø‡O¹ÓÓÄ:"ÙZê m ðÎ$ò亲‹Ý2 Ógøƒ¦é³ëֺͳY\éh&Ž=Á¾×+EÀÉ'Œv=騴úß‚åÔôT‡R¼·ÔJ7šKZ€•ÆÐ aÁàc¶jñw‹õOí[­K³¸´Óo&¶hd˜‹‰ŒGæ*¤ÿbsíTuëï\ø«Á3XÁ si{$pÝ<ŠÁŒj]eEe{uç=)òø¤h:7޵{-.æÓµ¹‘IÅË€»´sÛÒ®]ø“ÇzCéwÚ¶Ÿbšeõì¯ .æ{8áK1N\ìjÌÚï‹uWSÓü9”vú[¬77›Ï™1]ÛPŽc$žü*ǃg‚â`=Ô •=sÉêݸäõµÀ|SµÔç·ðãZßp5ëÛå«|ìß+üßÜ率½S¼±ñ4þ:‚ÆÏUò%‹íw¾R™ Hùü ±ÿdéZF§âëkèrßG}u¥[Á5…ÝÐTÎŒ%ØÂ‘ÔÅr÷^/ºÒc°ºµñ›júÛ-"¼µH‘­XHá\+$cn3ÁóÒ·äÒ¯Ÿâa”j×H¿Ø‘ÜlQ6 °bå ØzõÝŸâ¯D¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š*¦§,Ði÷ÓCıÛJéÇñ$W 5ÏßCà(,o¢·—X±îäx”ä¤jÛ•xŽp3j»m©k¾ÖïtýSS}JÀhÓji$¨‹$f&Á\ PAÕµ}&-~Ó\ò5 ˆ–æßOÙÙBU•/’8-¼sÚ¤ÞC®x¾uÄ7k ZËòì#ôÈçÚ¯M©j§ÀgR-ÿö(›ÎÂïß³;±¹ü1íU}cÄš•¦¥5•µ®“ow{%¹Y¤˜| 6ÆN1šÆúΨxé$Ô§¸–Æö·.TJª‘’åOr3W®Û^Õ/|g¯siÞ‘,·†"7K„CÜ›=úŒœSþÙ¨øKV×lÖúæúÒ=]Z$»}Í‘±CvŸÒ »ÐµøEä׈5ÕOû\®%""w2¬cå޹®Û@–Iôm&ižI,-º±(2O¹®P^¡¬k){}«j“E:Ǿ™ç$vKò–FT/žNXãÐU»×u/ø\I©]Ey.¿£Ü«b]¾c ÜGŽ3œƒŽs[÷zD×¼56qt>Ûs%­ÚÉ3ºÌ<¶ °b~`yÈÅg¦³7„´ßirÏ$—¬ ±,ÉwÄ`’v·»oé’hú>§Ë+K,ê%‘É%œòÇ''­qúo…ô{[ñ{j‚Kˆ’ýR8LŽ F2ÁA${b°ì¼9§]ø ë[¹iåÕa‚âX.d•Ìýˆ@‡<o­µ·‹µë[=iDövz%­âZ±;%–n®Ëßr9ªš†|}â;-L6­áã~°);-æ°àÉcЇľð}§‚îo-m£[جÒq}ŸÞÊÇ.ýH~à’=«RÞÆÆÿÅ Ü)<·I#‘AVN„µÏ[ØiÖþÑ&†Ú(¤›Zµy™T!KƒŒœrGl×U§éúv¹âoI«AÓÙkkh§PËL›‰Pr>sÔã>õ©é¾ °Ó‰f³êqKâ bÓa‘B,àn0±#!÷ˆ9£ìš…¿|'<úU†š%MB –¯ºIE$ Àìï­3ìVpé_ÊÛÄ….n£M¨T1)ÀÇlÕÛ-õèê ²A…¢¸²ŠAòù¥€vñ¸ }K{¥·‹u8tøÖ1qᩤ¿XÀ X6#f63øU{='KO†71¥¬CÍÒ..*>i-¸ûæœmï.çð½æ©Û&¹€Œ-¯U™f…Âå ç©5©àû¦mKÄ6wz\6Z¤Om-ãÛ9h§óÚà `àr1ß©¦êžWü'ZÛ¶ýœi—bÝÓí—v=öt¦ßýüu§‹5å4{¯·²ÿÏ&#Ë ï»¦iß c<¤4hÈ&w#ø›ÌnM;Çw¢ßûÝ--&»¹Õmf½'Ê·‘Tç%»(ÈÍ`›«Øüwá‹]C\µ¾½×Ûá‚0‚ÉÇñ9ù»{U¿jºá{»mZân쮯—TŽV·´ŒI`y;‡OZæü5qgc¦ü7Õ.¤ ¤Ãw«BdsòÇ$¬Â2Ç è@#>‡¿ó®yZ8~$’ºùpkŒÒ>x^zVýôjþ+Ô—K¸I¥¼ðT¢ÚHß*wJ@ Ž:÷Í&‘ãØx.ÖÖ{˜aº·Ó…”š{&óÕv˜ü¿½’}\Ô:u•Ö­ü9²»ÂÏ‘~U;ðⵯ/øO%C œŸ ÊLCqç}Þxç§&¸c¬i^›¾ñ-͵æåXü;x¬·ú­Œ7¯=Ãï^Ùrˆ]v¹PXƼvÞî9´mgNµ‰®u-Å ©]Ù*òB³î$„‘Óžq[þ"ñãkKM Ãò=ÕÅÝå³ÊÂ7Ú(Ü3; ‚1Îs^…9˜E)„”#¡lqšñy®íuR‹Rº×5/KèÚb £H¤Ã6 DØ:üÌsîN+ Ðdº§Ãû«kyŒh7vò3FÀD訤6@ÁÈ#ß¶kxA'ü,¸ò$òφ„~vÓ³>~vîéžøëGÄ]ûZÑ#[8Þilï­ïL1W™c?2£l´‚9®FßL𶳩i¶ÚV‹­\2]Åqu.£5âEl#9Éó ùè#ßcÄ:OŠüc©ÝkÆÓþׯ’—Q`ÞL­—'paƧ<æ¶šMW\Öü «2æÙ#‹SûZJ„vhÀ³êzz×=­Xi÷×Z‹j¾Ô#×VyVÞÿJVU˜Ë7óÀÏLïÎ+NößÅ:Kü?Ô¯¬nµ;:Þæ ÿ³òš09###“š«ªh~!›ÃßíàÓ¥k‹ÝhÍif\Çó.ON¥u>6ÓõMGKÓá±€Í,z®Ÿ4Š"H qÒ³¢ƒÅÖ5Ù,´‡Õ4ýZéo#0˼²…epå~SŒ‚3J‹á™ÖOɪ¤ivúô"ÄÙD%åŒí+OÇúFµ©éVóèˆWÓ¯ ¼´R@ Tí`I ci=Ås¿ÃýnX<#gfŠ`ŽÆßOÖ›pÄ’G!#Ô– Ó=k£Õôïiž!ÄZ5šßG=‚Ù^Úyۑз ‚EPøŸ\“ÄzÎ¥k¥ÝÞ‡.•§Ù‰V“#—,Øéœõ>¹ákPøx<9 qÿhÿeÙÛì-òonFïN*ßü#Ú†¯Øj:Q%…Ì"×T¶*€‹û¹Pyq´Žâ´t][QÔ/õû[˜¡X´ûÄ‚ "bw†@ØlÿÈÎ*¯ôm[YÓ-×J5õž¡k{ LHG16pHÔË ^Åâ ä‚%},å†7,Vo3qÁ*¹\wãéYºÇ‚uM^ëÆ¹¹Ž+}rÂÆ v%^s¼`|§Ž„äf©êžø•¬èÑé‡û#NKV·‘"·óghX§*»ã°cï[7:/ŠÏ‰t~ÔÙ:jXê1H\í]ûɈ€2sÀÝ¥u´QEQEQEQEQEQEQE úæ–Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š*¶£n÷v7¶É€ó[Ëç¦YHæ¹]3ÃÕ©ð;L`F´¹Šì'™# 6qÈÏ®+Jû@¸¾ñ wòym§¶sc2’w“#ÓÆ3Þ°ÓBø•m§'‡-o,ã°DG©)qq=€@1¼ßøVÅ¿†®SWÕn&ŸÌÓîô›{RI“(bÄúƒëÖ°åðÏÄiôI<9öí>;4„ÃÈW2H‹÷U— ôb ã ­;¿ øŽÒãNÔô;«e¿ƒNŽÂê;•o*áSr¿0*s޼­ƒüG4Þ$ºÔõ8&ŸYÓ>È«d$q–$¨÷äœôéZpønî+ÿ ]›”)¤éÒÚÊ»NefUPG<=êKí )5‹jîUk#¢Ia, b îczcŒ¯?Ôf·{[OÅw¥ù]•´q¯Ú¦?òÎ"Cn<àÝƒŽµê:´ÖZN—i7Áeoÿ¼¨¬ü+âK+½HizâÛi×÷R]èØªöž¸µ°µÓVim¬õ¸µ+rÑáQ‹cžI'®Òº_E­ÖsöƒöuçÚvŸ3å#n{u÷®CR¶Ñ|Uãm'ìRy§IŽGÔ™3´Ÿ÷q±é¸>N=z%eéº,Zeæ¯x“;Já'dlb2ª õÇz©má[KoM῵LðK ÌFc·ÌbI#ŒdgŽ*;ïÚ\:[[ë«ë UµŠî»Ú0Êá••‡åzÔúW…ôí9ošye¿º¿EK»‹¢ Ê `. ¯ÍdIðßJžÎ]2ãTÔåÓÄ6­7˦ӌ¿Â°•ÐA¡X[ê+©£Iç.ž–Iù|µlçë<%£ ×DÝ7Ùm®xÎÿŸrÉ¿“éŸÒ“Xð–™«Ý‹ñqwe{åy/=œ¥Ðsµº‚? ûÔmà & !’8 œ\Å*HÂe˜ËMùÎïrMF¾ðع³¿‘®åÔmeIòIä2£IÏÝ=ÀJž_ørkÝVý’a&©nÐ]¢Êâ7` ãv;ã5>§áoêöÖv·P6Û ´‘»$‘`cåu!‡yæ¥øgAÑโÒÜt1q$ŽÍ$¼cæv%çV#Ñt˜t¿ìT€ ?ìímådýÆ#9ÏëU5 xcU·±¶¼²WK lA`Ѩ`0 ãÖ­é:.¡ÀÖúmªÁ6æÆIcêÄä“õ&“XÐôO[}U´Žæ Á‚¸åHîä¡ÍÃúivqÛ¤ºM¹,çý¦9'ñ5nÆÂÃL¶ŠÎÆ·¶ˆQŒ*‚sÀÍKKÒµ‹g³Ô­bº¶r G*†RG±ªVþð¬v±[éqÇk8¸€,J<¹ñ:ûÔ×ðÝÝêj7:e¬·É³¼j\c§ÌFx«LҚѬ œ&ÍÃbì99?.1Éç¥Eg¢h:p…l´ûh%Œ~\j6–$`u#­Ltý4Û=™µ‹ì²nßÁ±·œ®1ÉëÅ: ;P‹ooK~ZP6¯ ÇjkiÚ[\‹Æ´„Ý(À˜¢ïð,gõ«²¹PYrî3FsŽqŒÓ|˜<Ï7Ë_3ݟΟH‚H×Þ€Î^´´QEQEQEs—ôÛíBçS¶Ô5 :æì ¹6Sll 2­mEÓ4 %²°B±‡iœ’ò;³;KԚѢŠ)‘MêZ)Ô1RT‚28#ŽâŸHÀÆNM-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÔ÷ú(¢Š(¢Š(¢Š(¢Š)•Af ($ö¦C=½ÌI4,±H¡‘Ђ¬pG%C=ݱ…g™"iäD€Þç°ÏSSR3" ³=M-TfâØL¶æT²än*8'qYZT½–}CLµµi⹚ gH€q"8ÎÍlÑE…'Šü=oe¨Ag¨Ȳ%ܦ2FHç¥nÑEVvŸ¬Zê7z¥œQȲiÓ¬2— YCey<}qZ4Tw<0Í*FÒºF̱®2äƒ85š5ècþÄŠöÞ[k½W! ` ‰Âner tïSA¬Ù\j·ºB,Ÿi³‚¤$|„Kœ`úñÏr‚#qä ‘³°U’z È]t?ˆDXC#in†ëûÍ»qÇ9ü)|E¬Í¡ÙÃu¸¤¼¶·*[n®œàôý}EhÇwg4’Cñ¼±ýôV¯ÔSÒH¥ cu`¬Tí9Á¨Žhf¢‘\*JpGQXøŠêË j0¤IsŸ¦Î¤â`¿}N‰zñÔSá!½ºñ3èÖÄÖVþn§pùÊ3‘3Üç*ñ†nôC¦ªIo ¹žò2™fŠ¥¶œŒ¤ö?JèüC­Ã¤hwš´llÁŽw»ð˜ú’+Â&»o Üê~(»Ž9lïn ¸™€U[` ý¸êkWHñ—†5»‘gipëtÈΑOÆÒ(þ$«‘ôÍWÿ„ûÂ-uqe ÄÓÝ[Éq7+¤ÿwo»œûŽÞ†FkÍ!ñlÚ'…¤ÔtÜH|E5´ˆ$-1RAþó~#5¬|Cã}TÑ`×ítÿ°ê×?dF´gߥK(mÜ08Æ@ÚÖŠuû½=>ßO·[OS»[[HÜ€à–w#ªN+5uhZž•kⲺ²Õ.Ú;‹Tthf#*¬¬ÏØ<‚9íPøs\ñLj5}YXY[é:^±ufÄ+g Л Ž <ç°ÛÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢Š*¶ mpÅC­ÐñÐ׋nl´/Gk ŽŸ&¯Q$€‹[m‹œäÿÜ;ó]'‡ï<[%Åí®µ»ÃÆö·ö§Î¨ØY˜2ýH4ž'¾k)¼:¼3}£Y‚e\˜÷+|ÉèÃÖ³-µk:®¿ei=•¥žŸsåE;DÏ# …+¼:“ß8ÇzÂñþ½¯ø2ind·†âÏT÷j±–I^)€VL°#¿¦GZÛÖµí^ÆçNЯei{%›ÜÝê¨UU ´ãgÆæ9êÄ;Õ;_jPÿnéªÙjWº,Úí°^v‘˜dÈíUåÔ~#Áá«KªÛnö÷Ob°-ãld-¸1<Æ*}BÓZ¹ñî‘qoª˜c›K’D_)ØÕ“ty=wžsÔv§Eâz=.ñ‘I©\xšãI³v@2üÚ¹úÕ›ÆñW„çÓ/.u™5K«èm.¢š(ÔÇ猠\{Üw¨l—ž!Ö9<¶#z9SŽ ÷‹eáèu¯x°ÞÝ\‹X®-‚ÛÃ#¢³4cæm¤ÓœV^«&±g¢øD]Fàÿgj¶1ÙÝo&TIJ°Vläí÷ê89«ºÏ†,ì5Ï ÚÙß_Bº¤—ß°óp±¦ÿ˜’y8ÆF Hšt¯â=Nyb°¸ðãݬ-#2¤¹e,›‰##®+]GÕ­¾=ôv¸…-æfwË"ÂXƒë߯½iÚèz›ã]~ò d³Ó"½‹–8‘·n#“×éXºm¨Ö4´¾¹ð¦©}©Ý£Mý¨%„ìr2gVU^Ãhàr+b/|MªxoEñL[’¯î-YIç.•`8ädÕÍ+CÒ4´db yü>òtû‘Ÿ9GÊ:}^ø›søqâ‘ü´{ÛEgî ¸ƒê*—м?¡x~×IÔtk8­/­5+X x@ •ðÈÇ© žsŸZ‚ãRÁ:¯‹bÀK{»«ÚÓÎû®>¬Äê|!¤bhZ}£®'1ù×êe“æ|þ&ªx÷LŠ÷C¸¼W1^i@ê“&7G$#}bå¾ó­Ó!b1ÇEíÅnxóLÒ4Ý;I»Óí!ƒQµÕ,cÓÌJ²Î@@û¬¹È銵á¢?á.ñÚð1.›ÇÖ<$2Kâöˆ†Sâk³x?"Qâ_/þï«óK©d3Ä4ß%´º—Œ&ºE:Ÿö̱LX|£ÊîíéKà É╲i£]œ[û ày›;mÝžœg4ßA׊¼k2††xµx¤ø•¡Æ¹Ý)æÔn´\3´šô³Þ1ÏÏ ¦<Œñƒ»rþUN†M>[¦K·ñÝÙ»fûªw…³Ð#ñ®¿ÅóÚ]jžµµd“Qþ׎â=§æHO˜xþ8ô4¿ãEÿ„­ö€íâkðÄu mÇå\Õ…Í´žñ•¢Í¸·ŸV2Än@\‘¸g#ñ§XøàŒº ”ÚƒXÆÍ§Àó¹!•¶xßÔj§aâU4Ãuq¹¼¼¾K-_RŒ3CyòÈÉQæ:ð # wÍ^Ò/ì?áaY‰åm‘ìG$eRÕ-æµÔõ/‡èŒ¶Úæ­o{ÂÛI—œÃiLï^¾ŠˆªˆU:+Êæ©áÿ‰–V ^àø‚åÂ/%öˆØ¨ÇrsÄþ4𷈼/u¤è×1Ýêšœ k‚ÿ­W|½z®Î¤œ޵§ £[øÛY¶|¼‘h:Z´‡ø°X~µÙ] ÛÎ=bqúW–èYò~9W}¼r§ŒÆqŸJèüAm-ÏŒt“z‰t}V"à&í¸5¢øÎÏÂþµÐnlçoX[}’=9brg‘xR¬®×ëœô­+85Yüc3ÝÚˆd›Âé)L˜ÖS+eCcµsºv½6à)<2t»ùuÛm>âÆKQ ‡¿~Ý»pr0yè2jî«–t¯Çâ=æ{´˜‰½·Y|û)Â/ÊËÞqÜr+5ìµû¯ øÒÞÀj×z;ÛÚ2;õspÎdØ+ÓÒË=ï„üG©j×uÝΛ«ÙÙî–Ö3#A,®ÖEËm#@<Õ ½?Z×íüq¯¶Ÿq¾ÐާZʸšEEbI@N 1ùG_jÓñ^—©Þ|9—M¶µ–[Ó¦Y € ¾ä)‘QŠíã"Ô(Íyrè" aa ¸OÁÀ>P¸ÎþOLsô®¯Åúv£sáW´¥[]~ ‰È#÷qª8,rGLö­m¯5cGkVˆéñÚȲ–L³ƒÈ‘‚æ³üa¤ê·M£júTK=þzn`¢hÝJº‚x#>•œÉâ_êš$·ZDÚV›¥ÝÙ>ÒèdšURUQ˜$’yô­iZž•ÿ ½‡Ë~!½»€äñI· ÇOÇšé袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÖ÷ú(¢Š(¢Š(¢Š(¢Š*+¤ymç~óÄê>¤W Ÿˆôï xfÎë@MNÖ8 z‹i”ÿ &ævž£'ØÕŸè2éÚÆ§{e¥Í£èò[GvR¸"ICd‚ŒqÔgÐV׊´ÝKP“ïg˜-5»k‰ùljϦ{Sü?§j6Wþ$šæ0±]êBkrw'–£>ÜŒW=7‡|Dþñ’Û¶\k7–Ñ—¼O48ç ÜüjMWFÖoît϶ƒosyö#i{¦\:«»r”r¥w)ëÓ Ô–:'ˆn-¼A$Úm–˜·z|¶Öv0Ü”夑TrOa½^ºÐõI¼º""}¼i0Ûm-òïUØé‘éQjº_‰âÖ|9ªi–ð\¥µ¬–w‰$›J¬…rÊpsŒtÅT_êͦê1ùÑE¨O«éòrȧwÈ€yÆzš°tïø†ëNõµ•Ìwl–ò´<±ýÞ¨€(<÷&´´ ûLÔ|Iu;FbÔoÒx“¢0î9úýk çÁĺmô)qnnÿá%“YµY˜˜g*’½:ã<Ô·º/Ä=FûJÔf¸Ó£}âÈ–ˆ$ÚÊÊCçÀ”Å>ÿÁºæâ-4]²êz¹¾…ö±¦ôl7©ùiŸ–)ôëX-n=hÝ–*ÞLÇaã®Ò?Jêô­:ÛHÓì´ëqˆ­`HWßhÆËÕt¾§©£êk-þÏ=­Â³C ÎCmq냑Yßð„Mw§ëÑjwâ]GXxžYáM‹‡ýXUÉ8S×-“PÍá/ê²éRk:ü2®¨At‘ÁoµdœüÙrwœ` ô5jo ëðêú®±¤ëbÚKóèe„Ö¯†¥uÉvcHðM$~já}Œ¹Z»¢xwBðä3Ûé6ÂÞç3ºHÜ@dœpJn»á­ıÛÅ«[yËo/›”«}TƒúÕ}[Áž×.Ýý‚½Ç–#iQ™Y”vb¥I\Öµ…†™m •Œ ´+¶8Ð`(¦Ï¦é×7VwÓÀ¯ueæ}žCÖ?0a±õ‘izT·:ŒV±%íÊ"M:¨ß ^€ž¼SFÑÚæÍl¡û-Ô’K<[ÙC–,:OZƒHðφ4wÒ´Ë{Gu ÍÄÙ늽mgegç h/:VšM€ îÝXã¹ïU"ð÷‡!šþâ=6ÙeÔÛ¶¹œ·Ç?Bžðtl®š%‚²œ©&GéZvv¡Ù¯m¢¸ƒ ùr¨eãØ‚)‘ézDKl±Ù@‹lÅ  ŠDõ+dž+HÐuù5ùüA¯½©ž;_±ÙEk»lq–%™‹s¹¸tÕR*"îÚ n98îj4·µŽF•"E‘þó2~¦¤ÀÎqÏLÒÑÀàQEQEQET1ZZA-ÄñB‰5Ã+Lê2|MERVÎÒ=)h¦»¤jÎìf'€sT·¼;½cþÓ´Þľjdç§zÐä(¢¡–êÒ má–dIn–b3!Q“´wÀäÓ.õ :ÂÚ{Ë»ˆá¶€fY]€Tú𰬬)Ê‘GzZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢™4Ð[E$óȱÃwrªŽI$ö±ÉѤ±8xÝC#)È`z} V}+H–ö=JK8Zú4òÒà Þ«Ïºã“ùÕº(ª×ú†Ÿ¥ÛKy}:Amäs€3þ4ë+ËMBÚËWßÈ6ÁØàþ•=QEVF¯â-?G¹°³’‰î¯„1[ÆY°¸ÜÇ  3ÎMjÉ$pÆòÈpˆ¥˜úXóøŸIŽßF»„Iqo«]Cmnñ¯Èƒm qéŸjÚ¢Š(¢sƒœpiÑp€Üp2zÖN­¾µ¤ò[ýŸìz͈³¼Dp Æ}9úÖ¹e\d“žõ ÷–V¦1qqFFÚØ ÇÐf³uoiÚ5þ“asÃj2H‚BÊ-ŠN[$pz gš½yªi:–oo ·óÍu]ßL‘VV”‚È#½U¿Õ4-MBòTvÚ­3ª‚}H¤m[FKD¿këqfåBÎd_,î8lã“ïRK§Aqmg5ÌQÜÜïò"fäÚ2vާñUî5ÍÑ®ÖãP·‰­ "à<Š<¯7înÉãwlõªÖ¾,ðõñÓ-u{I¯rG’’)bGPyǵ.³â¿ x}Ò=WQ†ÚG]êŒrÛ}p2qïŒU¶Õôd°:«^Â4ñ›öãËÛ뻥r7Ÿ´‹ëÿÚøS‚csªÇÜENã+rqœr®ì'€+™Oˆ>’u·]Q>i¼…”«ˆYó¢LlÎÚ«zÇ‹¼/ Ïö]JôEr`óÒ-¬Y×8ù@'=†OµlG"ÉJ¹ êdp}A®DüOð&Á2]M%°m’ÎJc„ç‘‚azÕ›_øRîòÒÒ)'Ùy)ŠÖé¡qïè’´ç·8=‰©u_hº]óé‰ Ýö¡BYmì¢i$= cŸLçÚ‡ñÏ…ÓB™äþÏŠQ ¤ÆÁâ}á ²zñPZøûC¹½²³’ÖþÙ/¤òìîn e†v# +ì:d.j]CÆšu¦¥s¤ÚØÞê7–±¤—)gáa• ĨÉ€ 5"ø×ÇC“Ä ò¥¬NbxÙ•e ·ËÙ×~xÅgÿÂñ‚ïM²Ô´}JÂ}Jê8-Dñ®rU˜ w†ö«šŸ‹šÚþm7KÒnõ[«`t-¶‡pÈ ÎÈ7ÎOÒøç@þÆmevÛuö/²„ýÿÚs+o÷óïŽùÅsz¿‰u›­Áº}æ—y¥M.¦ÓdFŽhÄl ±Fê ~&»/3§‡5öFdeÒïe$DgGzãô_kVÞÒõ)<9y&„}é‘<Ò@iY,W¾r ⺋_ÚÜëë¢HIôÄÔ,NÔuúTºGˆ±©ë–1[ƒKž;´nÈ–B¹`8ÛÐòkø¯a}¨ÜøRÞÊVŽèÜÞ´Oü´HK§ê+gVñcÉà®Xô»ëH¢¶Nââb/ÕXóô®kÁ7¶Þðλ Æ÷RÛø’âÂÖÀ{™HUE™îOA]?ü$¾+Ò.4áâM6Ö+=Bå-RkIY¼²}Å2®Aé‘ß·zŽ×Äþ0Õõ[MÓ4«d¶ÒïþÏ5ÕÄ­‡] áUW;¿AøñÎè3x¦çAøˆº¯ÙžÝn5¨ÛcÈÌ$ Ê®á,>•SFÔþÇá}9o<7-Ô‰¦Åæ”Ódmço8“ËÛøïükcÂWþ Ó|¡ÿc[Ç©^\Na„ ElŽìGšÃœF88ïÅjYx“Ä–^"ÓtbM:èjPÜå%ó¼ü¤t$zº{ÍGÇþÓ,õûëÛI-¼Ë5ŸNŽqÊÁ~Y7d°Ïqjµ­x–òã\»Ñ,õ»=->d¸¸ŸcI#È2Ø ‚O<œU¿x–ãV¹Ö4›»Ëkë.H±wk“Ç(Ê’ ° :W]EQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š)•Af8P2Ií\¯ãMFïGÔ¯,´K¶ÒÚâ8ïÑÐ7BŠ™ ³<ç ãœU»/Mc¤øbÂÒÎmOV¼Ò ™bÞPny½g£Û¾•å´Ñ@ò°¹šÎñòíŽB’~¢Ÿ}ãN[ÝÓB±Šéu‹ºŽI¤*"6@@9Ïë-oÆy©h7ðX¦­ŠÞZK"E-´îæBk#ÁºŒm¼os¬W÷ þU”aŸpÌŒ¦f'…ëÇjÔ‹Ä&ÓµÍ'JÕ¥Ó®cÔÚdSi¹d…‘7r¬Í•8Æ~_¥bX?ˆ­/>!ÏpÖ3Çm$дnVGò2½\¸Àaƒžy°5ýjâ é:,V°êú\W’Èê|›X‚º€‚rNnæ¬A¬ø›LÔ'Ò5“opòØOwcw21}ät,Ø# ä6ô¬{}câM׆á&7v4Víp¶¢+4iÔ³È,@;“]í…ÒßYÚ]ª•G0SÔoÅrñ]x³Ä·z¡ÓuôË ¹,â"%‘æxþû6〠ð÷®{Ä–»­xru¸¹Ž Í+ZK+Áa’gW]Ž¡²@ Œžx¯I±†î hbº¹ûL踒m¡wŸ]£øT“™ÖZ­0Œaζ8Éô¯(Ô|M«ivR>1ŽëX”ËaookœŒ¦U ŒÔÉøWM7ˆõ/ÿdZêÏe§ÿcGu*Ĉ\±•™N3ÆO=8­Al|VãÆz¼Ó]X¥¼¶L¨%_1w8]§‘Œ•ïIyâkícGðœZuÃC®\D’¼cæbŸ¦1]f»©JÔ5›ÚÚÝäUõ pã\•Ήâk}õÕñïöÄV¦ñ‘Ù~ÌH]Å XÆÜqÁÏ|ÕK›q®ø—‘»½·]GM{¯.)HUU¶Ž:7ñz×w¬Ú‹Ý6úÜÉ${àoš&*ÃðG5åɧ1ð‡‚ÄWwÍy¬Ù~óyc ;‡îÃd vÅtͦ x‹Ã‹c{xðêOuouÌòH¯¶2Á€rpA±é\ðÔ-5ùõÝRË_º‘/n ¶þÏ­–6Ú6eùøËŸN•Ûøç\¹ÐàþØŽán¢–X·\¦Ù$Eo•™}HëXWú?¿#Ÿ´ƒþêÔÚœQjž ñN½2ï]k[ŽDç¬N±Æ?!‘õ®·Æ¶m·…Mµ¼p‹OiÉÅb±Á ŽØ¬þuϾž4“r5FI¾Ø%ó„AG–>^6mä{æ±c†+M&×í—–w<Þ7GºªÂÞ z§ÏÁO3“Ôg½u>;m$ëž]ÑCûf3ßäãæü3Šè|h·Íáylƒƒ§Ül ÷Ês|t®W¿ðøs!‰¡}:mEkÁÞå0Š÷÷~9¨4›yׯž‹PP÷–þ C#7$J$ Oדù×¢W˜i |)ÔvªàÙêŒÄt$Hüš¹â)|5à’‹¶5Õ´" ƒŒT3k[üIâX³aáèìäfci»X"Fi0 ò·O¹[[í2óÀÞ.T¼ûR/ŠUËÍ2Dy£Ãºáq¿·Ê>•è8âð«1 ŠtÀ ÷'¥aÜø‚9m/K³Ñõ +Xµk»éï¢òÕRݵrrX°8÷­ Yj6š—ŒæÝâŠãZ3@Ì8‘Lj2¾Õ‡¥Ûk‘'ô)4›•kÉõ;Ë[ž<™„ꪱ?{Û÷©|=¯x“FÑ4½-¼ªÉ=¥œP¦…”c©”Àküâ¸ts-Å™œ_øŠ]WSÒ-e ˜¤F*Ò# ZžßHÕ­õÿ êšWƒLÒí%¹Šhã0¬ÿ¿M»ÝU¶ì^¿}µ5Ñ/gñe–ŸfÊ-,Ðõmg­¥Z*Ò,øvÂæ7VnTuêVšåæ·§éz´Z„%Õ½ÁU‘!…dfV#‚:V§…4½nÅoîuDµ‚K¹ƒEihŠÞ5àÁT³¤ž=+£¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š*®§m%îŸ}k’{ibR{RyÜ>0Òm¼$úÐÜ.¹˜ö/`¹}ê…r0Ûß9éK¦Þ/†î<7®ê0̺uß…í,^am"|À8PH œtê*ÌöòøçPÕ¯tõxôÑáùôë{™¯Ÿ,ç$¨ «€ ÀäÔ¶Þ7ž-*ËL±Òî[Äk 6ÿa–'U—å,ϾXÆr5)Ô†|Q­Ï©ZÜ´¬Oo-¼/"—‰J²ˆ=Æ:Ú=jÿþ6‘ô«¸%ºÖ š˜ÈZ>@íÉÆqøW_â‹k¹µ/Ë "딨$"˜›–ô¡¦Ý^xµ‰…ŬÞ¸µ3ò«4£Œúãšááðþ•g¦6ëÁW—Zä+öpÊÏöi› “x“SÀÇLWg‡uc®øLÃd©mg¤][ÌÐçʉ°¸Q’N Î3š»ö+ÿøMM÷ÙÛìØGŸÆß3ÎÎÞ¹Î9é\u¥ŠÂQhm£^)ÒïÓí‘+*}ºḭ̂°l‘ÈÏÝÏLԥܦ¥áÍGFðcXØÙ_›%üÔ*[hoº¹ù²Ùö­;‹Ç«xÞÑ4¹eµÖlwÛ]+¦ÀëÍ„$ôàŠ‘4i ábÊÄ\]ÙèÑé×Ö^b†)´‘Ë•aÜóëV­ì|A®ê2ë:…°Ž :kK+Y]ZFy~ó¾ÒTt ŸZ–ÏFÖcð/ö4‘(ÔŽ-¿–X`HÈ@Vî‰msg¤év· ಷŠP@e@?Z梴ñ—†ouTҴص=:þñï"Ý8Gåûá· 瑊‰ü)¯Â9wj^Ö/õ4Ô.H$F¬dRBœ…QÇ'Ó5Ðj:­ý¦·¡iñGÛß‹¿8’|Äò“ ÓàçÔUÝZɵ=:þÁd1«ia:®õ#?…pòø{âæ„Þòt« xàX¼ÈYØÏ³§ËµBn#“—­ý7GÖ—\‹Z¾è[DŠÎXâf8”>ã‚@Êút>ÕjËI¹³×uÍZY#û=ì6‹Ž«åwnüs\¿ƒ´xÄþ Ô ›ÎÓ¬nf‚Ë¡T–|4ÁÝ8‰®òöÎßPµ¸³¸]ÐÜDÑ8öaƒ\qð×nlFƒy«Ú6’PC%Äq°º’ü<’€‘Á<ý+no¬hZ…¼«¶™kqn ÚrÁÔÁÏcÐÖÔ±¬±¼m÷]Jœ{×aàv ?JÓnµhe‡KÕ­ï-ÊÂbˆ“±¾n§=qÇ¡®‹TÑ[QÔtKñ?—ý›<²”ÛŸ3zÆr1Ʊî<%¯Û\_>¯>Öúgžh“dÍ$ŸC‘šÝÐô{]N·Ó­ÞI ÄÉ+eݘ噩&¸ÝSL¿Ôü{qýŸªK§^[h0:HЬ¬V:·qÇNkY< éšõ­æ¥5Ρ­Äcº¾ePÀ… £å ½‡ëZú‡´ÝWH]ì»B±Ä«"œ:4xÚêGFf³-|;^Ù^k:ÍÖ©öó-"”"¢8Ánaž ü¨Ô<·…Ö£§j÷Ú[ÞíûbZ”Û1Q€Øel68ÊàÓm¾xnÛEÔ´×Yß]5Ó™$Ë£¸*ØÏ3ž}j$ø}a%ͅjW÷6ÍlóÊ0›qµUAŒ’ 8ëSê>Òï®îîà¿¿°ûs¼ŠÒ]©9Æ2Ãޤc5&¥àên™¦Fg²‡L‘d´{G*ñá¹<çžþôÛÿi—“j^_ØÝÜ$is%œì†pƒ ¼r ¾­#HÓt;(¬,#òà$d’ÌXä–'$’z’j†³á[¹Žúo> ØãòÅͬ­…?ºJ‘‘õÍ\Ñt='ÃöŸcÓ¡òã.Ò9bKÈíÕŽI'Ôš«má/ ÙÙjšt6m5If–î2Ìw´£ Ôä~ÇjžOhi1hRZ+i±$Hpdç9àÞ¬ßéšn¨–é{•mî"¹ˆ~Y#9Vã+7Yðo„µùÖëRÓÒ[…O/Í ÊÅ} R¤®júèº"ißÙ cÓ¼¿/ìÛ—·ÓoJͰð7‚4׊KM"’’xä –WPpCO8çÐV> ð]½ðԡѬÒðIæ,«å[ûÃŽ¸æµM•‰ºÆþÖ!0‰¶á ÎÜõÆyÅOU£Ó´ÈmZÆ;XR̓†€ ØCœ¶Wç<ñO{K9#Ž'‚6Ž"ŒˆT¥>éÛµAu¤h·ÓEqwco<ñ«’HÕ™~„‚jQc§‡šAmyöù­´eöôÝÇ8íš™ãŽ@¨`0ÈèGCQIgc4±Ï-¼o4_qÙAeú¢¨ëš~­ug2è·«§ê ñºÎcV ´ýר#Ž#±¬(ü?ã-^ÿL¸ñÕŠYé×ê;kÞÌ£ ÎÏÙsëÞ»Tq†PG½- KEs¾!ðÍ߈®mRãSxôxÞ'±H×÷íîœó´œdÚº*(¢Š(¢Š+OðÆ—§j—šÂÉq=íÒ²nžFa3n)==«j©ÝizuíÍäñn¸±‘ä·pH(]vž„dÔйEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¤Âç8çÖ–Š(¢Š(¢Š(¢Š(¢Š)03žô´QQ\[Û]Á5µÌk,#G$n2¬¬0A†¢ÓôÝ3I¶K=:Ö+kdÎØâPgØUª(¢Š)“M´RÏ3¬qDŒîìp@É$ú ¥£kZV¿h/´Ù[båVBŒ¡±Ýw‘î8©ÖóN{ÉlÖxÍäq$’DÞ¨Äà‘×ç¬iºí”z†žåí¤iY”ƒ”b§‚ê)×Z­¥¥öŸ§È²™¯¼ï(ª1Aå®N掙#5vŠ+7FÖìuÈ®¦µYm¯'³q ÁßÁÇ'JÒ®pxº®µ›k=2öét”“Ζ4]¯*|¤ËXçû¸÷­ëiÄÌcxŒ‘«˜Üa“#8#Ôw§Jír:¡‘•‚/V tZÇ$Š -ëQ³¸´›T¹†ÙmØñI&pÇ5zÞòö]BúÒK"·!h®K.Ù˃¸(½óW23Žô$œÉ ` AèE-rߌ¯ô©õøbÓDßÙ‘i²!2cÍûS•9ùN6ãß>ÕÔ]_iö*¯ws Çj™X('ÐdŠ{\[ ˆ¼¨¢V $|äôÔš{xäŠ)%E’RDjHð2p;â¹½ÆWß>³qic$:¥å¤JòÞ¶ùˆç׿6¡¦Û,O=Ô1,¹1—pàdã'ž9úUâ¿5½ÍÚë6FÞÕ‚Ï ™6ÆO@Ç<Qj:í¼úÞ«¢jzyU1]Îù·S‘÷ÙOOƳµ/èZOˆ,t+Ë«X͝,ó< yOòì]§ûàär:t§øcÇz‰µ VÂÚæÙžÖà­·• cÿQžÉU®þÇáá %~b9ÀÉ­mYÒüA§Ûjšl¾m­Â’ŒAÁv ðk+Xñ…¾© ËO»Ôõ?³‹™ µ û¨ÉÀ.ÎÈ£=†sPhÿØZ¾¸mn“û&F†òÑÔ £uÆF mîCcÞ«ÿÂÁXÍ…Í·m¤_M0ßJdû¥“vð­ê@úVÖŸâ+[ýgXÐü™"¹ÓV%ñ‰RQ˃Ðt9Ç4ý^ƒ]:“A ¤6w¯h²¶11@2ËíÎ+ZŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÓ÷ú(¢Š(¢Š(¢Š(¢Š)vÖÛÁÁÅpžÕœŒ÷vòÆVh€å<Ž˜È=sšï#Ö<3¬]èö IሢΠª–êGCǵÕÉ®ØE©Zèê$šöhü×XÆD)ýé@žsØW3¢Çây¡™¯ŒK©k«p$ÎÖ@Ì"ßþÎSô­? _ÞÇ}­x~úfš}:e’ \夷›æLžå>é?Jéëƒñѳ}s–چ¡-ž?ÛÅÁŽáâ B.Ý̬½úsüêΓ£ü=Q¶“OÕ¤¸¼Cº(Ρ,™ÀÏÜ2¶xç¡©Æ·÷?h¹Ò4CL·–HÞê7EÞcûÆ$c–ñÛ'¥K©xæÊÖÛC»°³ŸQ‹X.-Ä 2 ŽsÁéŽsÒº>{ë›H&½µû%Ë®dƒxm‡ÓpÀ5ÀÚj^'¿Z_Ú²[¬3g ö|àÚ8o½Ô`š4oø—NðΙ¨ ÌÒ,ì`IeyÀÕS"Ç´‚½Æ\+¦Ô|Czomô½Ñ.ïeµ[·y_lPÄDZŽ[°·QOÐuû½BêûKÔìÅž©d#y#G߈ÿuѰ¤Ž0r Šo‹|Aáë}>k;{-Ö¡§•¿iùÁÆ9çZ¨ž ñ.™¨iö¾ ³¶KmJ_"ÞkGfJFBI¸½ÐßµixsYºÖ¬®.g…"’+˘6¡$`9#­sGÆÞ$“JðÅÕ¦Ÿm-î¯u4v» ㌜ƒÆjÞ¡®øÞÆûBÑ’ ¯õ.i2â8Ù9IuîOqSEâM_G¾›Oñ"ÛœÙM{ouj+¤?}YXœ0ê>bªK«|K›Mÿ„Š4ÓÖÌÛý©4æW2´XÜ3(l#þ™‘š]_ÆRI7‡à³¼·Òíuk#v/o#A*»ùÉÉéØÔÇÄ~"Ñ4M[PÖ–ÒçìÒ"ØÜÛ°Xî„„È,ÛpOÍÎ=+2çÅz¶ˆ-u ¯éZŒZ7fÈàõã¯_zÙ¼½ ê?&°Ý¾ËBÓMº’X&Ôe^¤ôê}jMCÁZ-‡…çÕâ¹u»{z5?5Ì(]Äœ¶0Ý1ŒcŠ«ŸeâÿØÉ«ÆÍ¾²¼–×sÝÙÏÞ€@Éàæ·<cg¢x‡Åš>ž Z|?`ž+}Ĭm*ÛsœŠíë>ãCÑnä»–{Uw»HrsóˆX²Ïð’MpÚæ‹©ÂQ©êÑhö>#¶–ÒÞÝíe‘ÖX… áúö&±ã}éƒL·»·ŠÓÆðBö·„µn%Q´gŒÅu¾,Ùÿ g€`¼ÔõÛäœþàoøjúçÆwv÷oâèdiQXªƒ€sšæ`Ólï ðö—óÀž4/¾ÙŸ¬Þd¸*<ÑvPÿÝJô_ˆ^JÚxuŸ/ˆôÝ¿]Ä çõVðì~$×e´ñ%dž5tòZè\ü‹µÙòȨäƒÇzr+©ð§ªjÚWâ3!žtŽh“b\F¬BȰn¾ý{×;®kÁ|S©iÚ¯ˆ‡¬mííšÜ¢¢É}¼ÇÌunü¸^k•ŠóMo |Mµ·žâiQw]îó刪#mb2Wuñ?ð…£*’VãJ`Ódª_ï/<'§xºÊ#!kyô«”^þ`- ü~µÖøKG“AÐt½:Sºx­ÔÎÞ²7-úÖÕQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(£t¯(ºF_Üø;Ÿ'P× Öìa ½Çýö¢¤ñן§j÷ÚløºÞÒÝO¤É"£þqž~•²nt¿øÚC©K¬Z$0ióJÁS±ß'<ƒŒÕKÛ«-WWñV©a*Éaká™-'ž3˜ÞS—À#‚UzõÆjMa¡ £u!c:5‹dtÁÙÍ;ñËàÍdi:Û]ǯÿ¤[Þ̘÷ £|nF8Ç)è2+¿®BÍ<ïj³Ç–Ú-¼2úo‘÷Ǻ-+VÓ5»8ïôé¼ëi …|’¤ƒÁðG¥rþ,¶µºñO‚b¹…f¤ÔAG]Êv9WL4m"!#ZÙÁo3FÈ%Ž5 ¹ê®#ÃÞ,Ò¼/¤E jqϱ§‰a˳\|ÇkFBCö曥éZž’>ZÜÀâas¨Mp$BeF|1 g™¯H¯=Žy!Öüy¦=µÈšþØMjâ&1ºˆ0pàc9㫯my'Ãu¶Íöƒáô_(!ó7yc½síŒÖUþŽ–š•Ž­©i×·Z}Æ‘o ‚×Ì/Ñ÷Ñböl­jø+O‡íÚ®©‰.o"Ç»Ý<†y”rÅ‘™‚®qŽçœÔŸ廂ÛÃóZÂg¸_´háR€ß.Oô桹ºÔü_¢Á‘yeeaõÌ׈æ‹;QI$ž§¦;Õ}2ÿÄZÖttЮînúæk)Ð(·‘eÁœž0O<•¢kÑéþY¬¤Ilµ ©n”•Ì*ûð[žù3Ö®ø²ïT²ñO†§Óìì«mz^eVdÀÎÒÄ Ž¼‘œu£û/Xñ…ýÍæ§a.™csek¬¦WiÆB°ÎOµB.>!¦Žž] ý·ì¿bšŸg ß3ßœs{Õ­CI×t¸tm>×Kƒ[Ñm¬RÖ{iv DÀüŽ£­dÙøöóNñD?b‡H‹S’ÚK;ÁÒ'ƒìËûÃÔÕØOöìÓHÏõda=yÇ^Ôè¼,#½ðÕßÚÉþŲ–Ø&щw ]ÙÏǽX›Ãâm|k¦é†4§Óü£3îÝŸ^ØÅdÏàV“ÃzN…©$7]Ä7÷‘$lH%Oýjý·… ZÝýË^6¥§[Y\«¨Uq[ûÙü;VZü>•­aÒ.µûÛ -€Y8@Y¢4CöëŽõ¿‡ìâ×]ILÚjX†<°Šå²3žÝqíQÃo}¯j°Í9¸Õ-¡‰‘YFà pN{’3V<;mªYèúu¾§#K|–ê'fmÇwp[¾:f´ëšÔü§ßêRêÖ÷×Úuäñ¤w-g.Ñ8@Bï•σDžðäº)ÐÜLb3ý¨Üy‡Ï3ç>o™×~{þÇ ŸÃý ÛPÓõius ÅÔìÌ)]¸àcœð=éðçÃ_h½»¶šúÒ{ë‰'»{k‡_8¹ÉVÁé錞 j xyaÑíã¶òáÒ'Ùª12yç99Îry«GFÒÛUMlÄ~Þ¶mf$Üqå–ÝŒg{ã5Rëž½]i.-‹®´#Ã{~óË\.0xÀôÅÇ„ü7¯>.¡l^M9÷Úº»«&q‘• ààdӢ𿇠֮Ö5³ÇöÁ‘çíü¼çnî¸Ï8¥†ÊÂÞ[™à·Ž9nœ<€X÷ qÍS³ð߆4û§½²Ò­-îŸ%¦Ž%s×3R]èš¡Š(¢Š(¢Š(¢¨êZ„ºx³ò짺ûEÜVíä€| ý]¹*÷«ÔQXIâ3}¥ê7ú=Œ·“ÙÜÏj-˜„i$‰¶¶ ÈÇpMmyЍ\'¶OOƹq»#n3žÔÏ>ßÌy©æ™#éRUYu=* ÒÖkÈ#¸|m‰C¶}9©nn¬ì¢iWïI#£êN2ý:æÜÞAu¶¡K‘ÁL§p8ãëUOˆ|4&†Øê–ž|Ê~jnpßw<ç¶:Ön£ãMLñ†q4)%ÌÈò4ª<¦\mVSÎ_•kIñ?…õç’-+S·»’5 é‚Àøëz±¬ÝOc¥jWpcη³žh÷ ȤŒ×1ðÓÅš§Št©›VDR¶’3"¢• È6'‚:ž•A$øQD³"ÞM§Ã#Ç5üVò5º89p:ä=ëdøG­–æ1¹½³k»vä‘®¦{ãÒŸ»§Ï¬Üèq‰êÚÕ.e`¿"‡8Ÿï¸ÇJÓ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š)®ñÆ$ŒK3€îk–ð·ŠnŽæFÕ­¼éŠÁ¸Fî™9ã'šÛ¬ KÆÞ Ò.ÚÆûRŽ;”Æõ—ž›Ê‚ñ"³ûxÛÎ+´É‘÷Šàc=qŠÇÔ|oá].æ[[‹‰H?ãàÃްqŸÞ2+ãÔŠƒXÖ.?´ü"të°ÖZ…ÌÞg—´¬ÉååyÁã¿UKÆ›s5£ ‹‰­Ô=ÂÚÂòy ŒüûAÁÇ8ëŽÕ<þ(ð従¶oì&Ø!xÁc#1ÀUQÉbxÆ3T-mÇ‘mm$$Opݶ'\|{â¤Ò¼Wc©_2kK« ÿ(ÌݦÓ"¥$wç>Õ”¿mnmî.¬4=NîI.š8Ðy[zýç¸çåÝÁæ¬Ï¬é:•÷ƒo –ðÇ~n$¶òX,M˜³ûõ'' çyã)âþ/F»Ô¢ÓÉ[©¡(XuDÜÃsà~yâ¶´]cN×ôë]RÁËÚܦô$`ŒG¨<—Rº–ÆÆîî(áà‚IV%8.Tgžæ²'ñmŒ^OGIFñÁ‘¹Îg¦wpi/¥¢´ ˆ¬f´¶–E‘œpôÆOÖ¶ãñG‰,/ì-üC¤Cik¨L ·ž üÍ’·ÝIEÁ> °ÏçN“\ñµíæ§‘¤@––˜D·Îèn]zù`!ù}’¥cëÄ#Ó< «L&_Ùþìv:—Vúd2+Ñ+ÄšÛèvI,ÿi¼¸¸ŽÖÖ ãÌ’CÀ'°O°¬¯í¯h÷šrkÐYIc}:[yÖ…Á†Wû¡ƒg*Ý21ЇO×÷ØVv¦x¥üiãm­ÅodîßfS¸28ŒrßÁúú Í𶯪x[À¶—BúÞS{|lìdÅní3†g`A+ÕŽqÓ¤¾+»Ñ5"9¼Ya­Ã{{•Ä ±,‘4¼+¦Æ<Œ‚êåƒøçÄZŸ‰íS[66‚Ý¢… ¹À8%²6Ž?‡''šÝð^©ªêš\¿ÚŒ²^ÙÞÜYË*.Ñ!‰°²:ÕNï]Ö¼HÞÓõÓì쬒êòxUL²4‡ŠX0Q’pIöª×¾=ðÝ•ÍÅäW“^ê–¶ZEìŠ7¨Ÿ¯šªe1Æ:÷©5+}ÁËaªÿnÝ_Ûý®oáºUÖVÚ]6ª•*zHö¨ ²×|Eâ?ÚK¯_ZéöSZ¬Z²«+<`Ÿ›i8öïšÅÓ`ñF©áÏÜø—P¶1^}˜DUSý°E †,G95§yq­ëúß„mãÕ.¬mõ îîÖÙ¶îáO'¯\f£ÒôN÷Ä^"ÑnÕ‰¤iþø…si•:êZ¶õf'dr£¯jëWOÓü]â›û n1se£é¶&ÞÒLùn÷–‘—¡#Î+;P²ƒE>=ðí€+¤Â2oRI[y:°\“€ÀgOYð†4¿‡‘kvvƒûZÞÆÆö;üŸ?Ês¿®=³Œv¯^FÜŠÞª xíχ糳ÖΣáÛoi×—WW-ªÙÊŸjT'цw&06>8éW'¼þ¹áèìô¿í­6 E}i 䊹ii‘ÃÀt8$žôèl5+ï“§ÙiV×^™æ°†á]ŒŠY|µU ʓߣ›Ã~‹á;\çÀ': ^ Ê3ÍØ6ìg ôçÛ¥jÜ[ÚÜx·ÀSÜÁÜ\h÷­+²‚Y•ŒŸQÚ»MyM#TVPÀÙOÁçi¯4†+Iô?…·q ÒíH@ $« 1òÿS]Œ"µ‡Ä^–Î5]Qµ7Œ3ZùgÍý‘Áú×Mâ ‡¬ƒßNºøá¯3Óõ+_Ùø?Åålõ Åav;y‘GæBO¹ù—ñ«:F›6“¨|88þнÍåÓc“5ÄaÛ?NŸ…mü4›J‡ÂMö—n!¸½þÖ2¸O¼ï2g¾={W+¤F¯¤ü72ǺÖOܽ¬r±ÅÁô"ºÿKooâ¿M;¬q‹­E71e¡À>µ‚tj¾;ñöÿ”BE¦˜’”äÅóc ¹íëM¶‡¼]ckà¶ûE¥ÅìúͤÓ÷M’[Íòýî}+"ãX^¹»ŸÄ–:m¥Ö:Á£éÑD6dîlž…^ý:×Cª„¼â›FÉ Åe4Œ‡% d 2Œ{søVÇô’ú cij}ýsQ–h³Ô[ÄvD?!ŸÆ»J(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šÿ×÷ú(¢Š(¢Š(¢Š(¢Š)UÔ«U„W’O ¼ñ$qF-¡›ÅRÙÝJ€-ÚU 21òã¥t>>Òô};ÃöÓØZÃíÝÓ J,†@®pFr;Ôº6•¦MãßMoÝDšzÆì(.qèN'…tû›Æ·[£M.±w ±,Š ôäþuŒ,lWá\Á-Õ7Û¼Ì02_Íê}ëÒíÙšXýã“õÅr €ðäÏq°]ËÓª1Ÿ;yÝ¿ðý+š±Œ¯…<(bÊÚÂ[Ú)Ïúƒ3lü1Èö¯Y¯+ð«xª-*ÿËÖô»4¶¾¼ûz\[3H¼–27œƒ'¨;zb—H†;;/‡QÇyö¸ŸR»’)ŒF-ÈáÈÂ1$xç¥Káó«Û¿ˆ¡>"·Óå·ÕŠh”°r–aò°èqÓŽÕJÉ,¬-¼ª=á¹Ñ·¯g{‰!òÑee‚äá7gã­w[ðÅÿˆ¬l-áŽ÷P†Öy¾ÓƈØ3g#L û×å„þðý¢ÏÏm¯ZGqáº2Ó¶Ù½k°ñ\Ðiž ð¶³|BiÐËifcòÃ$êö8Æj+­KMñŠü:šEÄwCL[«›¹¡!–5‘6ª–elô©<c“Ã3`†Sy¨GOõ\÷‡g¬~0l‡žø)þG­ ÄÚ„­õM+\Ÿì×¶×÷Ríu;®RF,¯6Ggæº;Ävég¢RÔé×z³²ÛÚà¶ÓÔ!@ŒœsÅt5æ:~|šü^ky™§ê’ë &Ï(Ѧ}¤'òö©u[m?G×õ»rçQµ°¾6óÛÜZ¼‚2Uv²7—’Ž29J{x¦òÃK¿O·\ÀaûD’Iqtˆë‡ÚÀ²Ž¸ð3]?Ä#¨&¤Ïec5ìöÚÍœâT–;2yô²xª—š¢øÊëF±±°½Ž;]F ë¹®`xÖ!NÀX ±8.G½by6óêÚ´~&Òõ}KSÒ›(TIöSs Ä:î9õ¤Ò¬µoøGü+§e\Ãq¦x¦qŒowÜB€È$W¡Úë1Üêú–‘öi£’Êy¼×d«6q³œðA sYþ1Óµ;»m>óMˆOu¦jÞ¬ç*d2‚xÉŒÖMÕÖ«ã+"Ö-öÆÊÖþÛ¹¯P!ýÉÊ¢.I%SÀµ|3ag¨xª[˜Z8îµo:b?xžZŒŒÆxí[÷VÐ^[Ïk:îŠxž'ªÃ¼¿Jðo‹#ðïˆa¼:šh4̲壱9„ƒœ Ç=H÷ÅhÝxoÄ1xM:+_;Yºš;«ˆƒ/2Ë8wù³”{ö®‡ÅÚ^¥©ÿÂ=ö8|ϲk¶wSe€Ûgssׂ©ÅeâKßÞÅ`³éZ¥¥¤r\‰ÝTòsžÕ§øKÅsxqô«( ŸHÔEæ<Ž+¦3áÔrƒƒœžzqZ–6^1¿Ô4Ýú%–ƒci(šå‘¢’KŒtDÂaW=OÒ¶|7£ê]ï‰g¹ å꡹ƒiÉ(QGcÇZÕÑ´K½;Yñ&£,ˆÐêsÛI ®w(Ž=§wn½1T´Ï j>Ôtž#qrº‚Ç"ƒ±|öb¹xÏ4¶>¿´Ô¼7x×1´Z^ŠÚ|ª˱ ÊûqÞ®éšöÿˆu†™=Ql‚FÊ©ÉïžÕ‘7nfÑoôá¨î¤Ö%Õ-n2!rû—*O8ïȦIájš®‰ªë:Üý—s極¼c`T‚Igc¸úçvç5» hRh²ër5À”jZ¤·ÊãËÛÔç§^>•oà#ŸebÚ&×Ä?ÛÄcæùËÆ}3úT—¾Ö¢Ô/ï¼=®6–º‹‰/!0¬ŠdÆ7¦HÚÄc=A¨_áݽ­žŽš6£5–£¥Ë<±^²«´­?úÓ"œ¿ðÅIiàJnÃÄ> ¹¹Ô ŽHgß䉱ò"gœŒ“ëQ»O#ÄöW¸þÌ×%–cl?q$¬ 2±œã¡ãÛ½hê¾—Vº–©\iÚ•½°µóâ ÂXÎ×VGB=hµðeŒ:v³gqyquu¬Âñ^ÞÈWÍpT¨ÆP”À÷«7þÓµ Ë,Ëiö8­|Å#ÌÛ0s‚3Ç¥m¢„UQÑ@ð®>_‡ZY7qÚjš••ÜÏ,öVób&/÷±ò–»€Â´µ/hZ„tQyÖ2i±ùVsÚ9I!L´r¤A›¥ø3CÒàÔãÝ=Ìú¢ïn®´Ò®Ý ã˜­·‡4wЇ‡´Ñf¶{KÆ01÷ºçWWðnƒ­dÍÄRi'ýH%duR*Xà€3Ïã[Ή"²8 ¬ °=Á®vÏÀ~²Òn44³i4Ùäó 3HîöØY‰\vÚG56‹àï h½Ýœ5ÛGåù÷<’þègf { VÔðAu ¶ó(x¥£u=X`ŠÍ¸ðdž®´»mâÂ94Ûa†ÉTòþî9ÏZ·>™¦ÜÝY^Ínseæ}šB9Ìl}G•}àêwÍ©^iòݹܾG÷€8?ˆ5¯6¦Ü›FšÖ) œ‚K}Ê?tÀc+èqǯ¡h:üÛjö0ÞC‚TITwdž¼/wp×w:U¤·.ª­+Ä¥ˆQ€ #< ³a¥iTmg¬lrË *‚}ðWƒÃ¾µº’ö *Ò;©3¾d‰¶zäž{Ö?‰´Mz}5t/Aak§ÝG,lùS 9òÑT©$××Gaek¦ÙÚØÚ®È-¡Hc_EAV(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¬› èvöº—‘æ[jW3Ü]G!,¦ûÝzLtªo¼=¦ÝAvêå­ú*]Lò%¿ù‰ú“ï[úN›i©Ã[«õ…nqÃy@…ã8€Qe¥iÚy¾6ÑlûmËÜÏÉ;Àò}»TÃÚÒ…ö|é¦#„³}Òs×9ëïZh‰ª ¨@+ŸÔ¼ à½^íï¯tØä¸ƒ#ÀIï€@?ˆ5­q¥éwQZÃ=´o¬±MÄoÝ {v«uá? êwbúûK·žçå˺ƒ»oMáÇlƒZ2ØØNöÏ-¼nö¯¾Tf3Œe}8㊧¨økÃÄñ\êZ]­Ôñ $“F¬À}H«ïmk$ÚHQ­Êl1•Júc¦* +HÒÖDÓìá¶YsˆP.ãêp$zF LñXÛ£M2Í!XÔprñÉY–(fFŠTW†Xdî*;K+ ü›;x­âÎvD¡Gä1S*¢ *€2N HÆÜ(~ï>”2FÅY”½ *µÞm{=”ón&Îc4J˼©\‘ßœUº(¢Š(¢«ÅeeÅÍÜq¸¹ÙçIÝö (úßýz±EQE™ž½)h¢Š(¢ŒƒÒ«=þŸÜ62\F·sFòG a½Õz:àw¢ÆÿOÔíÒîÆâ;‹w,HØ%Nô5f«ßߨév—׳,6¶ñ´’ÈÝGSJ—¶2 b³§úRo€dfAŒåGSÅOEQ¿Õô½2k.æò俸û=°ÚN÷Á8àp;â®»¤jÎìTÄôT6w¶Z¼WvS¤öÓ.è匂¬=A=QEQEQTt»½Fò;†¼±k6Žêh£VpÞdj~Wã¦î¸ê*âÉ’ƒ88=)qk¤rJ‹#ýÕ$~‚³5éú-æ‘grýNå FÜ &¶[$qÆ8ÍOgy©Ï¨êvó[Ä–p ´É -.õËn_áÁéëSGªi\µœW°=Ògt*ê\cÕsŸÒ‹­SI²ó>×yR+Éæ:®Õc€NHÀ'¥>ÊûOÔ`[›˜®mßîÉ Sô ‘V(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š+ç^m:ÏY¿Ô,f‚ÛNvÚFÖ3 î@©Æ:V´r$‘¤£…e 3èiÀ‚2A •ÉÆzS|Øv7¯–3–Ï{ÑÐJ‚HäWŒÿGçP¾¡¦Ç$P½Ô+,Ã1¡q¹þƒ<þùï,­C‰ãˆ*{…IÏaQOªiÖñ]ÏyVò€c•ÝB¾FF 89476·0­Ä$2îYR=AU+xkTí¬5;[™ãÎèâ‘Y†:ð 7Sñ'†4Y"‹TÕ-m$—î,Ò*“øV.µmÊ8&º½†®,.î¹#<qÓš©¦ø«Âº¼²Á§êvóË~k"0ÎÏïÝ}ÆEgxcƺWˆåÕ!Iaiu:DZ‰@˜ÄœŒçßëSZøóÀ×—ico«ÂóÉ'—P®Ý0¬@R~Œj§ü'zø­ü<Ò'—öu Á_Ú `¡ãÆz{ÕÄZjZYý·YŽòKÛû‹ky–2Šî⹃B¸h¿ÒÞDÞ‹&fˆs·'×8íZšŸ‰ï£Õ$Ñ´]0ê7@“Ý HáWû ±ænÀé<+âÉüGs«ÚO¥Ë§Ï¦Ir$¬ ,Àç§prr9â²|}w>Ÿ¬x2òÞɯnc½»H`F³IÑÉày=…héþ'×âÕí4éQYIg5¼ÆHÝ£dl¢ÀsЃëW<;â)µÝë-n±>n€[p>K²Žp:ã=+ŽÕ|CâÝbÛÀÚ­µ´K{sùm4€˜0ÚÛW”Ç9çŸá¯KV˜@­(Q(Œ r¡±Î~¼óNñgÄÝ_B!¶Ó4È­£†I^C$ÞY;Š``03šØ½ñn¥xtK[ÂúŽ«b/órO—oÌÛy$“€)m5¿G¨ÜxUK$Ôf²{>êæ6œèH`W¯ Èôª #ÕãðìbæKv´Î-–%`À‰_ybI÷pgVxûÃ'Œ/QÿÃXqx£Ä6žÐ.´«k¯ouÖ°òV2°á¥qÀSI'žüU»»ß‰¶zå–‚5;Ž©o$Ëuä6¾WßÚ›ÈlÿO×¥$Ú׊ml·¶Ây]Þdpv;ÝëÖ±µ-êÇÀú7‰âÖ5íÇM1¾Öfs…•vì'iêrG$×Cq£Áá?øCû2{£ý§-ݵÿ3¸¸ `Ì‘¸r­_‡ÒÍ,^(;±Åš ä 0Àí\*As{áZKyqÜxÂH^h¤`û|ÉÃg=+¦¸Ð4Ÿ x¿Â-¢ÄöɨëkÅåeT‹rî ÇG^µ‡ש£_é±\Iê¿.´ùåBC$R9,ö$ ~5×øCCÕtOJxô‰ãv…Ò2½VSò8'“ÜMq_ÙÚ±§ëW:w†g× Ì—r6µ~Ñ&H'˜‰;ö§EÚŠ8©¤Ó4½fÇá=Ö§g ì·+{‰'PÍ"y B±9ÈÏ<÷©uñJ]=þÏ2Ùhˆ HÊP‘îŒãÒµ¼eá_èž º»ÓìයÓ-Ò{+¸” DªFÓ¼rKIÎh‡FÓuŸˆ-u«YÅ4ðøfÊEI*®Ò0'ŒŽƒ5Â6Öºw‹ðþƒŒtïê—׿kÔW·0Ìè-# B,aHÉ$÷¬¡qªx–ÛÜêWH÷Ú•¥ÄöîPÎ d㌲N ÈÁ¯MÓ´û=*Ò E+oí@ÌI9êI?­yƱgo}¥|CûNd6º¡¹ƒ.ØFX—çôéíWuÏ ÜEaáÅÒôÓ{¤Zù’Þi‰)S1‘A – 6Ó“‚pI«^oÛê:­žŸþ+ÅÏ¥^., ‘}îðpÄtâŸãý2ÓU¼ð­È.MU‘¶ Œ‚Èà㱬ßYÙÛkZ†í4V»Òm¬¦»[YV6røÜáˆ/\sËdŠ]?M¿±Öu/²hÿÙZmî;\[ù±•3ޱ©ààáˆZg…|á ÂóÚDÏqk$ïpÃ/ ãku0ÁÅVÒì-üMàyµØÔ‡AšVóFD…Yv–®~÷=êÝÚ]Üø¿U45(´» 8¬á–DT…$’ˆÀ˜ñž1·^ßJ—ìÞ6°º’ËCÓîâ¶>BNŒ¶²8ÃQ´*ÉǧùwzUχWÄ~µm¯­à´Ô4É0«#ü«¹0­´ç‘–Æ“@ÿ„¦îãÄWVš6™vòê·PÜKy; 0‡ ˆŸ A»ð¬ø´Ø¥Ñ¼9c|lñvØ¢¶É FI>^â«§ ŒcW_®Ao‹¼$H¨Äj1 TE>‚²ìît» â÷дö«¬_‰¢C‚êÈ£nF1ž™Ídx¥|K…lÖít« –Ëì¶pïy0mUrTn^¤…9Çã]€u?u$Þ^ äþøôÍÛisê~ÔRÐí½±Õnî혒C)a¨â¯é7oâëÝ_Ä69Ŷ¶6^ÓJžcþ •‰¤M­§„Sâ-&ßHŠÕ¢ž)-¼]™÷Ã/ž¿/'µi=…’Gákmzm;Z‹I gw$ $ñàeŒ÷ÆàG½iøWV¼ŽûÄpëiÒ5ŠA$ú•ª„YÓĹ'  zð+²‚x.bŠx$Y!•ãt9VVC\áŒjßB¸Þt[RÃÓ½?VòÂñ‚<¿ì+^OL^itÝSMÑ|M©ËªÜGo«¦éòÙO)Â:Ä„:† eH5»+ã RX¢ œƒÈ‡Õ¿øÏÃ:í–‘k¤Lodm^ÂY<¤cä*È9s”çž”ýox—â«|àfÙ2§œBzqÏášÒñˆ•¾¸˜ÙXa@$òÉØsLmA¼!â}~óSµ¹}?XK9m®mây¼I±£`ˆ'ªñƒëKà]BmSÄ^3»–Ö[_5ôæH¦p›iaØ‘Î"¦ñä×¶:„µk ‹Ñi};H–èY‚4d1ãŽHÏR09¦.¥ÿ ˆ4)´û;¤Óô™'¸¸¹¹…ãÙ6ª p¤žrxÇk+CÕõè×Þ“EÔnuXg½H|¸ÉœJìÊþoÜ ƒÎXjŒÁ©é~ð%Ôºeä¦ßA-Í´1–™ >ç^2+Óc“í6é(GO6 Áa—pèGb;×!á]?TƒÀ1Ø\ÛK ïØoPÂÃç™ñÇ©íYÐÙkþÿ„c_‹LžóÉГLÔ-bÇá••I ðFkOIWñˆÓ_»Ó§ÓìllžÚÒ;œ eyH,åA8 žiß—V°³»Ñ/´Éí…ÌÛ.o—p$‘˜ÁÏÛü½KMÔæñw‡µ Ýgmgòå~Fp»F3žqØæl<5âX¼9á{'±e¹²ñ:]ÏtÊB&s»9Áàç“í]>£¥êsø³AÔ¢‹6V¶w±Ï&áò³ãhÇSŸjÊÕ<7­ÜÝøúH Rš¾‘o£<‰)gŽHëŠM{GñLRø'SÒìRòãGY#¸¶iU8– „†9.*9t_ø~ÿWŸKÐìõ{]Nàݨ’EŽH%qó©,§rÈÁÈ犒 ø®çC°y¯-›Ä6Z’êpm@°#<¡´³iÆNOz†óLø‹â=O÷·övZ}¦™¨$ò@³wã–(t¾y"»é£ób’<ãz2çÓ"¼çKðo#Ðô«Iå³·Õ4 ¿3L 2L‡!–Q€@`qò“[6ú'‹5­SLÔ|Iö8-ô¶i­ímÛÌ™†7»0^tuïÅtZΕi®i·º]Ö|›¸Z&#ªç¡àò+‘>ø–©ë«¦[´^uͨ‘n®V"SÎv>b «xsÆzF£©Ýx^öÅm59¾Ó=½ò9L@ èP½Üýéà ²"²†íAõ¸µ‹»¦Oõ²†ËaAàcÉǽmjšºŽ»áÝan&“öÍÑÉ“ÏM¼Œcèjµï…%»ÔµëñxuMiÁ6s¾|çž½0>µ¡àÖ¿ð† îÃm‚€Ÿ{ì̧îçÛ}N=êþ³áåÕµ/ê_h16‘u,á6çÌÞ…HÎF:ûÖ4žÖ ½ÕdÒ|G5†Ÿª\µÍŲBŒÊî0æ7nT·û§¥-,tŸi+¨Lñ躿öŒnTfL3íóuö­íOBƒSÔtMEæt}*y¥EP0þb çëÚ³GtwÓu}2y¦’=GT›Róà•Ø018ÚGj=?ÁRG©ÛjºÎ±u«Md¬¶K8EHK ˆã&«CðâÆ¦ÓÓXÔWD‘¤oìÕu€ç,¡‚‰6ŸMôçøs§¾‰¦h£U¿Oì»±qet®¢hp Ü`ŽF}ëZ hñÜj÷3.[V´·µ»Yˆ*ë•9 óý+*×á¾Öþ~¥©ÞXÚº=½…Ìå Œ§Ýùq’°f"ºÑ4øõ™õÕßöɬã³n~]ˆÅ†®Mš&e©êZ´*âëQXà–%O’0¸£EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(®1|'â­7í6º¼–ºeÄÒH!š ïo¿–6õã<ÊØ«Ñø6ÆÕü1ö9š(t'•É›ÍB§q㜜ž+¥®~O Ûˉmä¹ršÛ³6ýÎc ǯLóYïà½Nk=(ɯLºÆ˜Ò‹{èãQò8ÆÆCWêsÇZÓÑ|9&ws©ßßɨjSÂ4#S¨«ÀòzÕWD·Õ®t‹™&’6Óo>ÔŠ˜Ã¤a²öÅE¯xvÛ\û,Âæk;ë7f¶»· Iá‚9GPAOOð­¶Žº–¡-ÕÆ£ªÜÛ4R]\\ "… ç°k˜ð‡íu é^}ö§oms–êÄHU‰ç À7p=+¹šº…Ž£´rYYÉi jpŽÞØãš«­øSMÖ®"½óîl¯ãˆÂ·Vr¡9Úz‚3Ï"‹/øvËM¼Òü–ž âíxó±i'fê]ºçÓ¦;b«XxB±¸¶¸yïnþÈáícºÝ `Rq‘Û9#ÖŸªøÃz½Ü׳-Ä3\"¥Á¶šHÄázoÀN{UïøG4o¥Ú%¢¥¾—2MhˆH²àó×¾jÍÖ—¦Þ]Ø_\C¾æÁ¤kgÉù ‹µºã×5B? xf-GQÕÌF Öæb’)ë”'o=øªq|<ðPÍÒbxåŒÆD…›jç8RÄ•ÿ€â¯MáO \\iwRØ£Üih‰g!-º0½sÎ=óZ:vŸ¦ÄðY@ÄòÉ+* 9Ë©4Ý?LÓ4˜>˧ÛGoæ}‘Œ ž¦¨Ëá/Oý§.“j÷»÷™ŒcqoSê}Í\Ô´YƒìÚ”pç!&@ÀlƒP J¶Òî´­6Ú ('†HÂÇì×+À?ZÓl`Òì,´ø 1Z[ÅêU5/Ùm7Í'’›æP²¶Ñ— cÜzQ¸ˆ@#_$(@˜@±ÓÙí,î£ò® ŽXøùA{•U@‹±qµqÀÇLRI¼ÅL±£•9]À})àœ½i#LíP2rp:šuÌêú7Œ[Q}CC×Ý%…c’Òî#$ ¯ñ&>¼àÕ¯ x~M;¹®îÚ÷R¿˜MyrÀ ÌUGVåQEQEQEQM’H¡G’W )ff8 RMñÈ‹$lV ƒÜS¨¢Š@èY”0,¸Èî3KEQEQEgoOÐÐ~¶›}Óåò÷íëëš~­ªE¤[¥Ä–÷†š8v[¡fÎ2G ïW¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢©[êº}Õõþ›±º±™Ô© FWŒ= Å]¢ªjZž£ÚK}¨L µ‹nù8ˆ¦{š·EU}BIõ ëeqÚ¬,·£Ê›xÎç’½øzŠ(¤gEÆæ=3Tµ;RÙm šÝ.âŠ`d åDßyù%};ÖZø‡SüK®žs¥I@(Q>ä ’HÂþ¿ZÝI€‰r±¹Œ;®á…õçÐQmugy–Öh挒7ÆÀÌT'UÑÖI¡7¶âXW|¨d]È=Xgõ«@‚ ò+“µñ½{¦ê7*,mî-u¹,¸fXÌHàdœýò³[Úž¹ èÁ§¨[Ú >çœê»¾™"²|Mã='@Ómuç¶œ\͠ʉ‘½”óƒ“ÌUëŸøRÎÖÖúãU¶K[¥-o!q‰@êW×Ù«º~£¦j¶Éy§ÜÅslùÛ$L œ{еXZ·Œü!¡ÜýQÔcŠãhvŒb€ô-´gßjóÄ^°Ó“V¹¿…,$ÛåÌ*ûºmÆrOlf£Ò´“CK›ýa&TH®2ËE*ÌÅ®rÞ˜ïWïÒ»‚ aß8ük#C·ñîµà¥ñ-çŠ/#Ôc´¹¸¶ŽŒGˆ‰À”mù‰Ç=·®×ö¶·âɼ1¤Ã}.ž.ô4Õõ­°$`vª¢ܱ$ñœ ¯£išŽñ%­®uïáo ³[ÉrA‘ÎV`pzÏ5Ð|C»½²Ñ"žÒæ[y¥b¥â$­ qØ÷®Æ3ßGâ ?·X‡Ã¢Î3i.—¿bËÎó1çÈãnxÇÔÔ/qâ ¿Ätjã]†=X-Äö¿-çÙù£œù£Ž~RGj—ÂwºöãÚéz¾¥nd±”Í£ê¢c!`x’6”’1Ü+7áW¼1u{7ù’æY.±ïÌÌK–ùÜNr;sX7š´÷V~ÑnÓQ¸²¸Ñöö; Í-ÁEPªìm¹$·<ñZ¾û]—‰¾•¥êÖz Å‹ùÑ_+yqL„m(Y˜Ã €kÑ袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(®*ÎïÆ¾(7ZŽ—¨Á§éÑÜK œm˜ngÜ’0 èë>ïž-½²ðàÓ…½¦§u«M§^Ç"—^ CcqÆá϶kNÖëÅ:/‰4Ý/RÕQµÕ-®3 £Å$¼sßó­ïë áýÿTuÝöh·*ž…‰ÂƒìIç7~5=²jÃÇ6:ÔeçMSП™cÛ󂣡,ÙÇ"·ÓU‹IÖ|w«ß:~r«ýìFØÏÜx’ê×JþÝ‹ÆãVX–ᬂ©µ|Œ˜”Ýìüç¿jèÚóUñ†¬l-/çÓ´ËM>ÖêàÛ&’K‘¹WqhQÉÀÉ5âíÄöž× Õµifµµº…ìfWY¢vQ²o”´žäÕýCLÖλ¢ø~Û^Ô"´m*âK‰wƒ,€8þ-¼7 ŽZŽÎó_Öu&MNî3D‚ÒÝV Ë<Ž™/#˜àzÏ5•¨^ëÚV™ãmõ‰¿³-í®,ï¿|±ÍÕY†2W¯4íwI¾ðö•§ø‰5›ùu8nlËÉ3ys¬Œ/—÷çŒ(úԺƳ©èºÄ ئvû>›¦e$•‰Ü2ä)Èë‚xçÕù< q¾Ÿw§kQë6óG,·SJì·ŸdLãi8âºûüýŠï¸“‘Ûƒ^C.eÃøüJnn›YŠæ‚ìÍ&è± «ócq]÷‡4¿ ê>¿Ó<å½¹Ô£´º™åv7 "ÆL’ ã=:Õ[» êÚÖ¼Óiw¾$¹û@€åBÁdå£;ªäu%yüj¥›Ü¿„<*·&@öþ*·‹Ûš0“° [¾ÑÅ^ÕU%_ŠQ8ÜŸg¶ÊõÃO¼Ñ4gÄ^†þ<+ »~·nã<‘Ó qP맆5OÿbĶ‹7‡é„C $W+¸Æ@§ø¯Âž·ð¯¤*ðÙC$w 1Øã’ÝNüœäž½+Ñ,¿ãÒ×þ¸Gü«Ëï o ø³Œù~,“n}¤CÞ¶µm;X'¾Õ4a§j“ 8 º±¹|KòFÆÀ~¿0þX7m£ŸjÑ[iN–Ï^‰nm$më­"ØyH=€ÕÑkšv©ÿ $WÞ¹ÓäÔ ÒÄ3i÷™ùag$:ädðxÁÅZðEű“^µm!t»øoVKØã“|nò/‡€2#ºúà—ˆSV×îü-¨X]¤·o¬ïQÁŽE¯8#¦Aõ“£Ýé·º${ôû:¬pÛgtiv‡)èsÉZéu†üoát¶Á»ŽÚý®ŠõÂîöߌg½fx7QÓl< x×7)YÉ©Ç1vÆ|Ç89ïȬÍA/ü*q.$ù/ÊçûË#ò5Ñ4ÖÖŸ¯™cûF„©bòÛ&dU'¿B@íX4»Ðõ[¾‹oûë;­4ê·±¢²Ê±¶qÁù¼¡Ë t¦ë~u÷ö5çü^ßÚµ¬6–±•²|…äö¯D× »ºÑõ[{Oøù–Æâ8ßd ~µÆéž2ð]§ƒ4øåh®dK¬ßLLÒJ£iË<äŸQF‰ªi~ñ?‰ Ö-5¯ÖÆâÐÌʨñ¬{J+p2‡Œf°µHîõëkúLF{½Òžƒ?j[" …¼=1×V—Ž' ¾Q°Ò•%e;_b°8n„úÖ=ÆŸ¨]AñR´˜½Êí€#Î>Gðzþ¤°½}kPøs{ekr-m£Ô ¤‰×Ëe€r:À9ÁíZ:¤×žñUι%ÕÞ—©éð[Êö±™ÞXIÆå\¶Ö°<ÕmuO¿Š|B,n ‚OM¦éÐL„K6AfbFNƒÉô®¿Â‘O‡tf£–=2Ña”„zŠâüQuª^Åâ_O¨¨eþνӢ,í>ë¸pÊÊsÜ –? kW&Óµ$Žþ%šîÓÎ}Ò[ùn^fç•Ï?‚ ×nô-gÄj±&µ¯I-Ì`%"í…OC·Œöà×;¡]ø…ôñkàé´EqÏ©¦Èâ‡kì¬óägiëÍu#NÖm¼g­ÓdŸI׬-¢{´e …ÀyÏÿ.zÓÃÚÞ‘¦Ç¡/‚l/¯íÃAmªH ò†Iýæì}á´çךê?áÖ!Ö¼p© Ûév7°ÝÉTPò"±8'ÐqWtý+T·ñn½©É‹+»(á0Ë4{²ëÆk"ÃBñ¶—§xƒû9¡ŠþÜêé)'Ø|¬pÅw ôŽ®jþ$Ò5ËÏÛhcNóÞWŽDynšEÚ”P6޼“ô®›ÃzÆ£«ÿl}²£û­qg BIY<`’{äàúEeø³A×®µ} ^ÒmíoeÓRæ6´»bªD aѶ¾cû½*­Ž‰ãïøJ`ñ£ö úkØÍo¿ú*î ’¿9'®Bcµ_ð÷†µ=/ÁqøvæH಺€ºS2Áäßž+=|â=:×ÃWºUͪëzNšº|â`Æ ˜°2¤˜`Œ©ÇáSh¾ñzø¥üO­ÞÚ¹“Kk!ml¬/œ0Án½É'ž˜­hW#Ò[O‚d†Csk0wåHôõ¨êÚ7âÕ§Õ<=ªÀ#º†8糿Wh•“8xö°*OqŒµJ/êpé“u–ƒ[›V:´—p¦"2ž6÷s8Ácëš·§økÄwÍž³â=JÞæK¦ŽÎHJ"™F˜³9$Ž1e‡Þ&M6óÃø“ÉÐ%¤Q¤ÏŽ9 %<ÂØÛÏ÷2GqZrø&eÓ|= ަöÚ®‡l°[Þ„:í ÊèI[õàŽ [м3¨Xßͬk:«êZœý`H¡9 '’z’I5ÒQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(®OOøN;"ËG]JÌO,–3¬ÊC²ÏÊ{Œæ’ßÂ:Í”\Ç5Ͷ¯-þ¥*œ Ò«*Q’­½SKÔ®|Gá½FCkeúÜ1lóPÀï’9«Úþ‘½¥_ir¾Åº„ p3µºƒcÍsaø‰w¶žÖÚ~Ÿ±Ô\ê0°ft_ùçN wÜx÷­ðÅÅ֥ⷻòþëÙZÛFTãb2¶áŒqž95–ºgÅ6´¶Ñ ÖðƩ갳ŒiýØ™pŽ3¼Z:–‡â;-Xë~’ÞI'µŽÚòÞì°Y|¼ìpÊ :‚1Teð‡‰5-Äúž¢«j쒥ͽ¿—‚ˆ€ó·ŽN9éZ/‰eÕ´gVšÔMm¦Ü[\Go»k;¸ ®îØç½&¥¡x–×V¹Ö|9sh’ÞÃw^+v…pPä8î @|6‘¯Ãu}šÎ¶ªn.v-JŒ*ªg;z¶y&´üAáùµ½ i r±I›Re*HýÓ)cýâŽÀ•Ý߃튎ÏÀvv1é£Rº{H5hµ+um»£(Û¶nÆH'©<ûÖŒþÓî‰ O0:ôqÇ> þì"l8üyÏ54^°ŠÿJÔ²™4벉Ie8å¸ëÇ·Ò›¨h¶"îÿ[0IwpúSY5¨+¶T¶8åºrq^g©YxcRÒΙ¤.±=ü±¤všUÁ—˱vãs«0ôí^Ço‘ 0ç>\j™õÀ¬Y<áùlµ >D”Ûßêþq¼äÈXa8§êžÒ5;Á¨ïžÖûʵŬ……lpGÔ|á¥Ñn4!•Ã&,ìd‘ÉÎörwÈ뚆ëÀž»ŠÁ$+5Œ&nRâU›aê ƒõ&›wàÍ&?꺗GöèßsÊÎKH߯í’ÄŽ½{bº+xVÚ`RJÅ '© 1XúŸƒ|)«ÜÉyybâXÄrÈŒÊdQÙ¶‘ŸÆ¬\økÃWšdz5ÆŸ éÑ…Á·åLt+ŽA ƒïF‰á¯øu%M&É-üÒ Œ2YñÓ,Ä“­W“Á~ šþMNM"Ùï$mîì€îoïÓw¾3ïW Ðô+a§¬60 Ó•–Ï?p`ìôÈàâ©èú.µÙµK(.àÎBL€>£9æŸa¦iz]²ÙØZEml¹ÄQ(UçØU{xoKžK?Lµ¶žA‡’(ÕXþ V•SNŒ.Íø±·‡¬þZùŸ÷Ö3úÔ—–v ‹í¬W«U•CG|jdDUB¢Œ*ÀÕvv1y†;xÓÌ}ïµ@ÜÞ§Þ¥xâ”"+s†§t¢À¥âŠ(¢Š(¬xz[-œ÷·vÐe„«lû|åa‚¯Áàûb´íííí †Úà kh:*¨À¥¢Ž(¢š’G ÌlŒƒžiսͅÁ•-fŠC•FÀìnàã¡úÒ\ßéÖM ]]ENû"8Ríè¹#'éV(¤fDÆæ'=Íejþ(ð¶€ñE«ê–ÖrJ¥‘fp¥€8È£Ò|_àívvµÒµ‹K»…RÆ8¤RØñ×µEZþþÃK´¸¾¾™`µ·C$²?E™¥ê–Íœ:…‹;[L Iã8`=8æ®QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¦<°ÆQ]ÕZFÚ€žXú WxâF’F ˆ¥™˜à;“I°ÏM ¬‘H¡‘Ô‚„ÚŸEQE\ÚÉ,ÖñÌ4!L±†“wMèÏlÔ´QEWQÔtý&Ò[ëé„6Ñc{œàdàtÏz†}fÎßS±Ò]d7‘M,lä­§Ûêz\¬Âêò9d„m;H²ØÀ?SWh¢Iâ–:œTfâÔFf3'”:¾FãOWÔ:0d#!àŠ†ÞÿN»gKk¨¦hÎFà•>ø4Ë­OI²G’îò#4Žª@I#š™n¬Þµ$ѵ¾Íþha·o®zb«YkZ¤íŽ¡ms"®â±H¬@õÀ'ŠPñ†´©£·ÔuK[YäÆÈæ•UŽzpH«êzUÄ]Cw –ð3¤²«‚¨Sï9ÀÇ|ôªz_Š<+­Í-¾—ªZÝÍ%ãŠE,ï€zTzŸ‹¼%£]%–£ªAorêËfåAîÞƒÜàUokWÚö•%íÜ‘Hßnº!ò”G!qÉÏûÕ-[Æú‰ÚÏT½ŠßKþÇYÐ2üÍ1—oËŒ“Ç`+NÛÆ^¼Ó¯5[}AÒÏþ>XÝûÉÃñZ»®hÚfý«wr©bV6€H"LmÀ“œö¡Yz߈t_Ç ê2½Ã˜àŠ5g’V8DPXþ Ò£Ôw®¼Q¨éž3ñ&ž–·Ú›Imc%­¥¾6Æó—eE‘ß“ë]ŸãMîÃS½ºI¬JÈ¿·¹\I ÆGCºA9íT“ÇsBö²êš öŸ§]ÌÁu6Â9ÂùЬY7™ß’ºö±§øÓÅ–VuΧ<é²Ç È(”FwÎp¹8è >œÚ‹ÇVCEÕukÛ‹yô«†¶º³i¼`)ÙdNæÈè^x$WCàK&°ðöŸÓí,wD’­ (Á”Ä•_˜÷àýMt•ã¾Ý¢x¢úä9z毫ØÈ¿Â·òŒôþ%,:õ¦ü@ιâX'Éko_éè;‹©•œþó®ÎëZñ~³«ê:g†þÇoo¥²Guwv¬áåeݱY~èûÄ·~••©øïĺ‡uÉä³·]{FÔ-m'‰w¥²a“pÊÜdð}j‡Žm~ É¥h²êšzL|E`ëP¹X‰pæ.3´ä·Ê3Û7ˆ¯®´øF[ÛYu;£¤^$¢Ê.YeBÇþj[XƒUñ_ƒÞãIºÑVÞòR·—±mó™—*XeÿÚaӌ־µ©ø¢=CP7¾"°ðå„ ¶Éd;ܨ»ïnzªGƾ#hž*EåÁ¨¬z 2²À$1³(9#±à×A{­êW/Ñô=:u[hìfÔ5w!ùcPNq–çŒqT¾-[^Ïá IíïÜCåÉ"ª©€Ãå9è3Ït¨çM¨ižµÖfINmBÿR1Çç2ÚˆƒnÀIÎNÓÀõ©-/|E¡ëwö¤ÚŒL×¶W2ª £hÎ`U#œƒ´zS¾Gâ]CKÓõýgYžêK»% mµ$˜íPKœuÎ9Æ+¶¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¯;Ò¼Câë[ÏÜÞØ¬–ö§òÍÁo-’Â4:7RxÁ= jéþ.×.4{½zïA’5´ŽkXc}óÎǰE^=9Î9 Tð“xËNŸJ}sG¶ŠËQº†ÔyËInòçnðQA¸<{Õ«½{Ä·Úþ—áë;fþ΋››¶`†GØA$É'V£¬Ïª?„¯5+°¸µñ\G/ÝVHÛ,Œ@Ê‘ÐÖÜ:íöµi¬_Ggh)e7Ùš`w^[£=F[¯JÊÿ„Ÿ[µ°ðE¶‰¦ÚyšÅ£~å‹,plOËŽv®yɊѶ×üE¦ëéšúÚ< ¦Ë}Ũq••‰íÈ ÖlšçÄ©4i¼Mkž-Õ®a°u4GŒ†i7»‘³ÛuvíÆ£¤iw×D×6PM QÀgPN:ñŸs\…׉µ­CYÖt»M^ÇIšÂDŠÚ ¤ËÜ\†$²ü¤ôÛ“ïWnõïéëá;½Jm¢¼¹û&© á¶<ƒ²¶xúõÅIâ oûwW¶ÓMm£èæy¡ óMq&LhQÀíëXšˆuýcû2ïNñ5…ýÃÊŸnÓ]3·ß ÉpÉÛ9ÍK§®¥¦ø³Æ÷:›µ­•­­ÍÄ~R9<·*¹ÆFÎØëÞ±O^KÖ_ÇVj^OžšVa0§)¿å¡nÄîö­Ùõ¯ø‡VðÜV¤l,õMÞϵ™AÇ(X˜p9cŸ©x«Â³Ü=À{Ë{‰ËšE£Œ´+ \c=ó]ÕìžU­ÌžrÁ²ÎaòÇ÷N^µãWÑé1èSjzdÕî­ $£\>dhí¸e†÷'  xõë]V³¥ÁâéöW²Î,Ûï4ÐÇ#*͉@Ãm#Œœþq‘U¯šÚûÄ:µ•æ‘{¨ØèðZAgio-7&K0.™b8'V×¢Õ-%ÖlÞÆîÓIŽh¤ÓÒ픲‡z.ÎÕ#Œžõ4«-_Ä^ µ»-ä¼·ûÕXác ƒ‚88Áõ¬ëøPøÊ÷Nþ΋û14¨n…–‘æ—#w—÷IÛ½TDÑôßøÓJ¸–âÛK‡]k[x¬¹—l›Š0s÷ÉÇn éPßÙKg}àû¨<+ˆ±ëV¶é(‘<ã‚ ‘b:åÛñ­­Ãú¥ã]_ÙCs,rY" ”0PÑr@98Æqž+G¢ZxÄÚEͬòYŸ½…«ó eŒÀBy=8Í\¼·Ô­üC໫­NÒGö„D-Ü4ÅZ&ʶÔEÛì sŠ×ð]†•©ŸÝj0Cq{6·wouæ¨%cçøBôú× ¤~ŠÇKŠ)4ù‹Ø‘QßIàÿCm§Ùëúæ³q{<*Ö 6<¿˜eÌ(N§?•vš+ãd76úAŽîÛ½s—·zfÒÌñÈ5ËC,ÉçŽ#’£=Ž+W›ÃãÃZžq¬j±Øë6——÷&wŽòG*@]ÄŸáLŽþý@·¼i¾+·—F Ê7ïOÙqòñÏ,Ôt/ßIg³WÖµk ¤³WRaŠ@ªÍ»‚‚[éšé>!iº¾£¢Ät«_µ]Új6W‰o¸)C $xéYZÄ0—Äñ%¦‚ÓymÔWVÆxÕ¡iqÁ$àãÛ4ýJÏÆþ1“O²¿ÑãÒtÛ{ènî%yÖI$òŽB A“Ô–ü*•¶…âÍU×f‡Ã¶ZÆ¡¨Kso©Ï2ƒ?ÝGKá=µhøSìÕ|5â8còä–ñ<èÜ™'%‹—àÕ/„V:ŒšmÖ½©¸–îôÅk€}ë{EòÐŒÿx‚}óšêSÖ“Lðÿˆnµ;Í{_{d½}=¬-m­‹4pÆÇq%˜),ÇFjxKH¼Ðt +J»tyí-ÄNÑçi#Ó Ò¶¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¯:¸º6ºŸô··¸óïìÍÅ©Xœ¤ [àá€#9ãž•£x|GÃûC¤¤Ë¨¦—d6¢þù@ ¿h?Æ8Èë\~¡ÿñ‡MÔ4]X¹k-JÎâîòæ9ÚDDpX'ÌÄçŠ@ë©‹SŸÂZ¦·ö­2öâÇS¸[ûYíbiçPG ‚8ÈÆ=1Uu{-wÅ6^:æ’LSø€HÖÈaµÚØó¹<ÿ{§\b¯iö:¶‹ý»á¨íf—Kk)îtÉÇ!€ƒ>ªy_c׊¯§éºÂŸ†®öS/ØígK¼õ oüxúÖžµ¤_ê&±q 4[ûYfÄm!¥`Þ^xóNð½Ö‡.‰™­tÙmÛQócû9‰àg~í½Šuï]‡ƒ÷Â3áíÜ7öUžsÿ\ÅsÚõ¾¯5Íý¾«áHµûI63Gå}ÇÞÀŒ뜎Ôè|-u€eÑ/äò§ŽÚiSçÈ·!‹¢î=“ô¾ ±Ö®<=¨j­0‡X×Z[¥˜®Bdmˆàç€8ç­eßh~+ñDv–š§†ìì›V¡#Ë –Œ*îËv€3[rèÚØñ>ªßbŽ}[±Š©Œ˜h|´eÀ\wgÚ¨Ûé¬4ÔÐm-tå1 ·‡U-÷b1m$Èlã=ëoûR_hú—œ²ÛYé3ZJîq#ÈÅppà“ÓéSiz=õŸˆºƒU±Ö.õqso¤¶žàFdˆßÔã¦1MÕ¼1us¨6­¤j’i—òÂ\2¢ºLŠ~]ÈÜnŽzUŸørÛÃñ]Ÿ´Iu{{?Ÿwu.7ÊøÇA€:TÚ†‰¡©èÚ›Ìèú[Ü2"ãkù©´î㺵Õm$ó‚j:‡öƒº¹ØhÈéŒqÖ¨Éðß÷ oquw¨\_[Ë‘^KpæTØs€xøÖ½‡eÖu&Õ|-« —`‚]<Êb¿GË¿ËdìCÄÖ߃¼+ >¹Óµ}>8£Ônîn¤±8+Èß*qÆTÓ¡éZO¼1£Þ®£ sMw†K™¤Â§²ofÇáK©øÁú½óê7–;®dUYJ;¨”/MáH øƒZšV¤hvïk¦[%¼3ÌQ3Îy5SVðŸ…uÙþÕªiÑ\Î ò¾r©»wðsÜ`ûÓ¬4]'Ã6I¡i¨¬Uæòá§;g“Ó$œV_…4Uu oÄ:½¢ÙÞêRD‘Û«1Eàe‡˜òqíZžÐâÐ-'·FF3Þ\]7–›T8UÉà ¼õ«šŽ™¥jöíi¨ÚÅunܘæPËùn›£èÚ=¿Ù4Û(mmÉ$Ç RO¨bÚÖÒÊííaH`Œa#Œª=€â–h-îcxge‰Æ¬=Á¨l´Ý+MWK 8m‘ÎæXQTï€*x⊠Dh¨ !F2OSøÒ¢G„B¨è` G† C #V `ÀãÖœªˆ¡QB¨t#RYTz:Ó¨¢Š(¢«]ØXßcu“ìÓ­Ä[º,Š£Š(¢Š+;BÖ¬¼C§A©Ù¬‹Í*¨aF*r2{Zt:‘—S»Ó~ÉpŸg‚)¾ÐËû™7“ò«g–\sÅ_¢Š(¤HÈ9¹ÏjÏK½Iµ9mÚÙž¶‹*ÜùƒsH[•Ù×sœÕ–½°Icî"Y¥ ÍôM-ÕÝ•ŒF{¹ã‚ @/+QŸsI íÉ ÄR±ŒH09SÐñØÖGмSaá[[k›Œg»†F‘TáØn{.rp*£ø¾Ê r[{‹Ë8ôq£Åz—LàÏ!_½»qÓùÖþŸ©éz¬iӮẃq_2 ¹FFyªQx§Âsß.-ZÑïÁÁe]ùôÆzÖ½ržñ%î¡¥ê³k-Ýé7÷–×F5!q €Iþz§ðçÅZ׈íµÖV4¼‚HgŒ"à{„ êy뚆¼^B¾ñ¿{V/¨Ü­£•ÛˆU¶ ÀÉczdšÜѼUáŸI<:eêÍ5¸Xˆeu¡ÚÀ{ã—/T–02LžnrŽàç€AÏ¥‹ßEѼ‘¡ù«¬[ˆ­íVoõ;cFæÜœ9ÁéZºgŠ5ô×…â:ÞÖi¬^òÚkiKÆÊ„S¹†ÏLVzøÃÆ·Ö2ø‡LÑm¥ÐÑe’4’V3Æ™ùÕvíÆ@''Öº êÒëÚ&™ªËÃ%å²LÑ©ÈR{Çò­Z(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(®|q%Ý÷Š´Ø·£Z[±°qƒb,ÆF ¨Ã—!sÛ4ÝâO‡#Òôè]\K ·¶ŽîóÈ“ÉI™FwÈ©°õèëŠéõi:"Û‹ƒ$“]-à É.:íQØw'zÒhž#Òuï´¥©’;‹V qm:–"znSØö# úѯøHðÕ¼Z“:Ã5ÂÀ¶‚y'zU?ƺ]î¡™qg{aqr¬Ößlˆ Ÿo]‡'žø85¥£kv:äw’Z¬Š-/g³H0wÄpqÉãÒ±$øƒ¡Ç¦éz§Ù®ÞFê[XQ„® ƒüD`c={R^øò-=ô«{PÚœs4ª¨dÊ6·Ï€Xs×u"®é^+†öêîÃP²ŸL¾¶‰§1\!â]IüñYŸðŸ\5«jñ诠®[퀦â€ýñwlíZZŸŠ„ØYim©^_[¨‘Q?ßgnǶÍEgã8ŽŸªÝêÚ}ÆŸ>”Án`q»qaòùl8`Ý1ÍB|]­Ø½¤ÚÞ„ö:}ÔÉœJ®agá|Õ`äÇz꥖(#’iX,q©wcÐÔ×<]âë«7Ö¬<>’èʦDß>Û™b]Sa^œ€\Xþ/¹½ñ§àß±ØY_éׂ[›h®ä`²¾ÌþñB0 üÜñ^“qq¼×3°H ‰¤‘»*¨É¯<Öµ¿jÔuC¥Yÿd]ØË¶wûBÅ ;pS§ÌG§z½áëËuÕ|3f¶PoÅ(ºÇïUAA°î÷úÔ~*ñ¾·dúƉq Lãû8³ ‚Šq‚Ù ŽpWæ¶/õŸ_j‡GÐ’Þ µK‹Ë‹ XBdûˆYrÇ’~`õ¬ÙüOãM:ÆEÔ¬aŠú fÒÏÎUo"â˜|ñäç8àòp*Üñ.±¤Ïáô¶òößjðÚM¼v89ÛÈÁüþ•ÍÏâ}sSÕõ>ÏZ±ÒgÓ®<‹{K”îN Ř|­Ûo8©µÿxN·ð;¡$4º—š·×¬¢H­Ý §;s!é¸ð=éßÚž+µÐüGq.£g©[ÛÙ´Ö„!>vÁʺWå=1Ö“QÕ¼_s«økLÓ/b¶QÒ¤¸¹‘¢ °¨rŒŽ{N9èqMþ¿á‹ïXêw£SŽÓHþÔµvEG1]´`äô8ªÚÄ´ÿÝkéâ7¦ÐO-±†/& ÑË»+ž fÎ9ßiòÉ=•œÒ¼–ñ;RT\&·x¯zš¿‹$°Øê–6Zq˨#†”bK€ñõ¬ûwÅZŸ…ü'=¾¤öú…潓ܪ€]7:åÐŒg$`sé[_fÔ¼1âO@šÕõ嶬×pÜExáÀhã.8éÐqíU´K _ÆV:ûë×ö²]\\ ­Ü,vé•\®0Äã-œç8­/…¾gü"hîq5ècê|çÍEy}‰]'QƒÀ^*]gSmm-ín"˜Ü9UVp”'a<åI'©®ŽëCO k>»²¼¼’kÛÓg|ÓÌî.#²’FAä` téPh>³ñ.¡âçÖ¦º¸·‡[¸†ÞØÍ Hñƒ¸Ãž@˜àrk"õµ)ô˜ô9õ ‡:w­ôØ.Ã7Ê#+–YAÆO¥ojžÓSð÷„-İè³-åõÜbWÝrÉŒ+9%ˆÉÉæ¤mMðÏŠô[-&3޹o} å bb>Rn“ƒØãÇ‚òÿHðÖ»áø˜ÁªÿeYdä´W¹è·Ó¡ý™a¦x‹S²·@±[x";eì#°¬»oø]þýµlc{çÒ…âÜL‹"®åÚÝ@^€­e ·‰|M§&³\Ãká«[»h&Ã+I1ÃÈAà‘ÀéÞ¦ðî‘£hÞ<×`Ó Ha}* ^8ÆŸ=ëzµñ:ÖÊãF³k‹xåeÕlK¨$•CžÄuõRmD»ø‡\YÂðÙøq^Ú"£b4Œ…éÀ>ë/V7Z=ÇÄñ¤Ä!UÒ¬§E‡Œ3#p|sÀíUu7ÄxGìÒé:¦¥¼RAx×n ÁIòGÍŸö¹Íz½ŸÚ~Ëmö–VŸÉÍ+÷Kcœtã>Õå~-–m'Xñ6‡'‹!ÓÅ·+ÈÞL¿øïÍWo¦9úW«h·öžgueqÄ/ bHØHô¯3‚?ì­Åvº¯‹.t7ŸQ{øy'…Ôa•¥‰+¤ã*ƪøÃÞ×5/¯áÕõEºßß¨Ë 6**ü²cºçœU?ØÝx*îãÂÚÜqÃy®Ú,ÖWˆX‚ʘ0Äóðó‚*îãÂ~·Ñ¯bu×4ØÞÏû0#y“ʧ˜*üŒŒÓÓþÛqã÷Vßf¸›Áy©ÊÄæc•Ý€µsºW‹,4ÏIá© ¹[X]Y=ŠÃ!pß0Ý÷q·ç=*öŸ5χ'ð‡ˆï­¦:l¾ƒN»t™­d]Kª‚ÀAãƒÖ¤‡VŸÄ>/Õo-tûµÓ…'·¶¹’QpÂL €{àgà‘ÅUž¡ ɵŸ6ñÌ“å÷Y€Ÿ?wñÅnk¶7~3Ð[ÊmΑªA$ê§jÙ€O@OlÖ&—«ø«Ãþÿ„e¼;{6«em%¤3"¯ÙdQ² Àä‚3ÛÒü69ðg†ø#ý1Íu4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(®7…uŸˆŠdšÎÐí=€€Ó(ÂòªCáâÝ8ÉL“ùóYïý¤¾#Ð^=N;µxb­¥–0áÝXUÉ60}ÇÒ´|3›âÝRáõÏí+«m:;k*H×/• êÄÙ^O±¤¸’5bˆÍ ÎO`OLâ»^Áu]7PÓËmv³A»Óz‘šá$×5Õð´úü#÷í«Á§›Gû¢6—WÎ#‘ŽIãwDÓµhuŸ O%¤¨øH[Êì>XåÊ|þÕsºž–š¤w+wà˨|TÛÕo,FÈL€ü² CŽ;Ù5ÒLj|-©É¨Ëi>©¡§ÚGvöÀ4‰qíÎÒFUýº¡Ô,üs¯èº…ÍݪÇ8Ômî´ý<•Þ±BAðãsòzœt¤Ô¦ñw‰o|:ñø~{;;-VÞâá®^0ÿ(䪆?*óÎrOAŽh×-5‹»›û]cÂPë¶Ï3ˆÌJR28WÞCuÎ})m´hz'‡ìá´ƒR·…'QÓäeÎÙ (ß ùwÅR·ðލëâ«»M%u -­ ²GR&“Ÿöüª{ {Öô³¹á‹Æ>Ïc¢ËmpÁ†VBãƒMÖ¼;.¡¬ê—w:Lþk)&,#ï,IÏeç5Íx™¾ /„®íï¦Ó#Ó¡³P×ðÈì÷H1´*mེð+ÒtÄ’=>ÅJºÛDÄ(®NßHñÖ{ªÇ¥C§Im¨^Ët/.ıù™Û{|ëU,<â˜lt>îâÖEÓ¤8âºü Zf`·ò´Öú¼Z­Å˨/s*¶æÝÓéÇ@ZÐñ†Æºlnmï$±Ô¬%i-n£”Ü0À©à«¢ Ñ|1yi|u}gSmOS˜"ƨ¡9!xËw9&–ëÁšU׉­°‡ÃcÃ"iM¨°6^nG™´®3œc?‡á\¯‹-ü'¥\hpj+ªXý’ÈAk¬Yîù@ãÊr g”Ç¡ïéÖ­jÚÆš·gM’Òt¸¼ßæ]˸³Éóá°8àA]†¿¡iþ#Ó§Ó/L‹ ¥|GŒ„TóÈ#Ò«é¾ÓôÛÈ5qsqyœº›;îgŒ6ì·-žõf=KPÔu=…§Ô † €Ç(ËqòôïÏ­bCðßÂ0Ï…nd¶·—Í‚ÊY­â|ç+8ã¶r=«­¬Ëÿèš•þ©ÝÛ /4æv¶“$l-×€@?ˆ4ícBÑ5øa·Õ-Vâ(gIãV$muèx"Ÿ«hÚ>»hö:¥ª\Û9£Ž„t õz‚ Tм+០ùÇI²Xb<É fvÇbÌIǶqWlô+Oµ{KdŠÕÚVh€ùI’ß™&¢m@}6=ì }6%EKvPQBŒéP¦…ø†]x²om5,UUpظ–lóÛ sÉÍhÝZYßC%µÜ)<9lsÈàf¥¾ÑôMMâ’þÂÞåâÿVÓF¬WèH52YÙF³*[Æ«1&PaÎ1ózñÇ4ZYÙXB¶öpG+±Ä¡TgÐ .l¬o «x¦Û”H í>£9©vG…FF:})HS‚FqÒ¤eƒ•‡CŽE:Œ´QEÄÉàm|Å.‹/Æ‘+>ø]Q¦Øç%Ì c· ;×]cei¦Ú[XÚ'—om CuT` ±EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¬¹ü9áÛ­Euyì!“PXZ;›c ùqô«?ÙšX°þ˱}ƒÈû?Ùöž^1·oLb™}¢èššØ_XÁqf¡BÃ"£oLéOÓ´½'G·ºm¤6¶àäG …\ýeø£J¿ÕWE©ý—Yµº˜HqˆÓ;±ÁçžœVž•£éí#ÙYAnò}ö‰K}H–M/Hšå/e²î“fdRëFÆZ›ìö FIˆØºp>R{zÆÔ4;»ÏhÚ²¼_e²¶»ŠTlîc(ÇÇæ¶ãŠT$H¨£ QG“™æùkæc°3­8…a‚2=é@8““Ž´´QEQEQESdŽ)£x¥Pñº•eaÁ¨5Í[|>ðU¥Ä7سy$†)%‘¢‡u˜¨ü«§¢ŠŠââÚÒn.eX¡‰ É#Tu$žÔøäŽTI#`èêYNA¡ê(¢™0Bd1F¨drîT¹½O½>¨Þêúns§Ú\ÈRmBf†Üb€É€@ã×zŠ(¢Š¡­ê‘hšeö§,O4v´­xÜÀv ~µnÞe¸†ÔÆ®ê7 óRQYžººn«¡i†çU’á€àGå&îG|ôíZô›—;r7Ýéã@K0P9$ž”ê¯,Rt¶{ˆÖáÆV"Ãs}ZÌÔüO¥é:®•¥\°Y59YÔ,~XæÉæÎT°ñ]»Þø‚ R[k84ëôµ†I/˜5nw3ÏjècžÞh–x¥G…×zȤ#Ô˜ª–:æ©Ë$6µÌ±ŒºC"±Ô€M2_øn V u;U™§kp†EÜd^«Œç#¸íN“]ðü:pÕäÔm×M td_,‚p0ÙÇ'޵-Σao%µ´—QGsv$û29æB‹“ß“Y:wˆ,¬ü9i«ëZ½œ©åþööˆdl‘ò~˜ûU½ÄÞñ˜é7ÑÜH(ÈdÏL©àöâ¨ËãÿAzl$ÕáYÄÞI?6Àý6—ÆÌÿÀ«¤®sSñׄ4›¹ìn¯Ïn®DQHâFA‘‘X/âEgxGÅQËá‰õÝkQG·Žöð ’5”ªchçÐ`}Íii>6ðæ¯yŸ\[ÝËK WpÉ™GR›Õsn}ªµ÷Ä ØÍvž]äðYJÑ^][Àï ¿x3ü=ñœw©Î«§\ø‹GH5+†:T÷ÁÞdÊüìzävæª\|Fðü]²Ú_Ïcg#Çq ­Ñ“†ù‡$)à¤ZuÇÄ_ ÛiÚ¦ÉtÐk%–ÑR2ÎXPIÉ< gšµ¤xÆ×SÔ¿².4ëÝ:ù­Úæ(îÑG› R¬ÃŒŒ‚Aýk6_ˆ°·Ûî4íQÔ4Û eŠâöÌÇ÷öuf ß T¼Mã=V+ßM¢YÝ]XjRyÙ„ÄÊ´lD9÷Žv~Õ¹¨ø²âïì­+IŸQÔRžæ4tT·÷C»n=€Ï¯JH¸&«¿ˆ|5@ªZ+Oþ¨SççsÏ_(ÿl@RM€H»Š)n˜  ýH«ÏzGˆ-¬Æ $Ó¥˜Yù3àyýL{Õ+ßx;O¹–Úâôƒ ž\Ò¬nÑDÜpò*•žì*Þ©â H’Ò åy..×|Û£Hî¿Þ €¾çÞ¨ÜxÓG›CÕµ]5ä’KtxŒ2y‘K”1Òì/eÓáµ½¿¹· nÊ"â Üç G8É8íIyã Ùi6šÛÎïasp W•cœ†\nÁŒƒÚ–ÇÆ}æ¡m¦Mc}e=Ò;Û¨¶¬ÛHS“Èààâ´õ›Éôý6öê%žX¡fDˆÄú€Huë^w?‹5‰4 ê·É{ ‰¬Z¥Ã QöÕ*ÙÚ¨NU@@çµuÚ‹šãR¶Ó5 "óMšî9Õ®<²²ìa”vÃÎ øÊæâ}E4}çQƒN๙5Dûʘ+ßîýk3Ä,Ôn-|+¨h–÷ m}¨Ûî*È¥òH0¸bq“Ôôã­wP<²CËŠFEgŒv9qí\N•â]/GðÌVZ|Ù¸Õ'³µ´irÒLò·Wn<žz ÙÓµýjMMt½WE’Ñ妆xŸÌ…¶õV`ÖôÈçÖ¯ëšÅ¾…b÷’Æò¶ôŠ(cûÒÈç £êkø¦×QÓìõÍ ·ÔÒ+‹YZQ²ü‰ŒŽà‘š‚x»W‚mOBÒmæÓØCçÊV[ ‡  @ÝÜyö¤½ñÅÛÛør}NGYy£Êû&AМ0ùNw{ŒÕ7[ñM¾³¯ÛÙƒwm,öÓY³íÌdnV3œä~U•iâïë6“jÚ%¦ŸqoÒ¯ØFûS,lT‚~ècŒ€E[Ô.aµo)¿¸ÍÀoøsøW+¬ø+ú/†nµ‹V’=jÊÌÞ.§æ1™åUÎY‰ä7L0zT1ég‹|`Y¶ób ØÜ½¹$#;9ûÀBäàŽkÐõ[‰l´Ûû˜tZM$kêUI¸}'ÂÔ|$š…üÍ{}eöëA¹˜JË»p~£ié‚1Ž•‹kke¯Ýü,¾Õ­ ¹º¼±½2JŠLâ8~RÙ>£>µ³áï è:‡‹¼s}¨YÃu2ÞÚÇ™S çädý;W9p÷v^Öô«8U¬‡Ž$ÓÄö ·wË݃µXœ¥jêz^½‹¢IoªÛùWÝa¤SÃD…7²kWÀúF’úÏu-c{Áâ âY]AePª~RzrNqÖ¹c§GzÒ|6bU!ÖîçQÏËhbi##èìá[ Ôeñf³gw6IÐ|?¬Ùíw9"OÄýj†‹amàÏÇ©†§ Ü’iÆdßÒ¡|«/FqÈ#µ^šóÄðjz¥¦§¥Y/‰'ðÕëÙê{>c謭‚âäúf©Û¦ªÿ­ÒKíô¨ãy$ŽVÚÁÈÝÌ™öÎîÕé~Šh4m&gûD‘ØÛ«M´¯˜B›iägÐó\¯€®´ûK_A$QjkWÒjaÍ•sŸá+Œ•ÂY3h7zdñÛéÖþ1’f™ÓtpÂd}Œë•ùT•î+«Ôâï\ð¶£âX//ø]Á •¨É§qf1T à’Nj€ò-Ä^ñT6Ç}x÷ú^ªˆÑ¬¹ùÇ$:«˜,x«zM캎³à[“l–RÞxføˆ#Hþæ6ŽÃ¸”žñ_…4¦“¨N‘jZ|SYÜéíþ¹æÉùBumýF=k?ÃÓ¾ù˜Ïx÷µušëìñç‚ÀêöZ¸úáP׈-õ]*ÿûcÄ—ú¤Ÿj„h:rªÉ䀛B´¬Os¸žÔ©¬iVžøc«Kp–›7r€H…¼–\0ƒŸj·¨Ç¦i¾'×o5}oRÓ,µdµ»²žÕÊÃ(X°$#|ãñÁ¨¡ÒΡ¡ëºÎ§wRÂî7½}Ò_¥›J&Õ ¹äàUÏxÃFñ5†›g¢Gsw'ö¶Ÿ$å`}™VA÷É^ µý• E¨x[Ã÷†ûCúœ¯ŽVX+ ÇhÉ$žœô­½BÃLÒ<[á©tÈc¶žù.à¹HT(–(Ó#p|§5Ïi„>ê³(^Y࿞G* fFm§8íŠÒÕ´Í*ÇAðt¶¶±Bñjz[£ª€À¿Þç®[¿­ii62øÛÅWrÂX\ð:òAíŠÓ’ÓžÕµ‹½#MMRÃU™.L"UŽH& ¾ð «`¼zUY<­êz‰ô‘E­k“%Á IŽ(ƒyê@Ç$ç¡Õl~&xthîtÛ=:+NÎîàyûÚo)Á;0¸ žrON+WSƒÇ°êˆ‚ÎËXÒnÕndÖì §÷lIç“‘Yú_õ:ËÃP«Ú¬–zÜšÜqäGÈ)ÇA‘Œã¹öª¾:Ñ£Õ|Qáë;y¶¾§A¨Ä9ßknë&O§#n}ëÒàV.—£^Ùkž!Ôå’6ƒQ6~J®w ‰ ݹ=1T´Ï ê^Õô‰®#’{×Ô HÚå¶ç¿çIü%â1áËÍ&öÕu/KM:qpŒb•02W09ˆëIcá?Å®I¬ßk\›½:K;¨Ä%D|å<¡¸à×q$þ¿…j ŒƒÁ®4ü9ÓÇ™k­¨Ã£ÈìϦG Ç%AÛ¼)îZzç„4n=-|Û‹4·Ýi-›ìxÁ]¥AÁàŽ:Uû ÇM½Õ/à2µ)"’}Ç#1®ÑÛŠ«„ü=¦±bÐy¶Ú½Ü×wqÈråÆqéÓŒtªzg€ô6ú FI¯/®m”­©½™¤àð|°zqžO½liÚ>™¥K¨ÍiGÔ.ÕÆXÒ#'ŽjŒxE]eµñ5&µ¦]ǘóœmÎ3ïŒûÓôÍFÑÚõôûe…¯n^æàŒüò7SÉ?§ÕR_xRm"- [m6&ßD·ÈÙ'*ÙÜIä] Â~ðÛM&—f"šp’³3;ÐbN¦qUŸÀ^}AuFÒ 7k/œnÿïlÎÜûí®Ž±µ øKW¼‹PÔt«k›¸À $ˆ ÀéŸ\vÎqW­ô­"ÖÚ[;{8bµ•¤i!D¿ÞÈÆ9ïUô¯xkB2+M¶³2\éo©‹¿øfþåo/4»Iî—–H”¿9#5xÛÛ4±ÎbC4jÈŽ@Ü¡º€}+Š“Nøš$¾‹5ÃY÷,©tÌaXI®—@Ьô'KÒÐùÂÂ%p2[·±<Ö¡D,®TP@=Æi‚ q!˜F¢R0_8úÒ˜¡*P¢•'8ǧR0@"–Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(®sTð}ýíÆ¡ky§]\ıܵ¤›|འÜŒS¤ðW†ÛH¶Ñ¢ŠH!µMo,ND±Ëœï×qï×5&á]?H¹{湺¾½hü¡qy&÷Dëµxy8ÔÖÞÑm4i´£qa,sÆÊXîÄÄ–ùº÷8ô©®´-&òÊÓO¸ˆ½µ£ÛÉî9 óœñŽýjH4« kûíJ$"êõ!IرÁ ëØSmtm&Ê Ûh!Û äÓÏ:äï7ß<žõRïÂ~¾Ólô‰ìÃYÙyfPÌ"ƒ«»8÷¦iÞðž•1¹³ÓÑ.å$—‘‚CI9Ç|Õø4}"ÛM]d]<@mÄíØFüh‹GÒ!šÎxícYl­µ»ÌqœeG·©ÜxGÂ7w¿Ú7U¼—E󲙇BGBGbA5.­á¯ ë­êºm½ÛÁŸ,Ì€•üûTÐhš­È¼·°·Šä[ý˜Hˆ¡¼¬çn@éíM²ðÿ‡täXì´Ûh'7 #F$#‡qÆjKÝEÔdŽ[ë{‰#F•ˆœƒVZ wXÑ£R±²²¯B>©^(ddgEf·!#•8ÆE>£Ž x³åĉ¹·  Ÿ_­?à‘Ó¥&ÄÝ¿hÝŒgÒí\ƒÖ–Š(¢Š(¢³Ž‹du¥×wIö¡`lvçäØ_vq޹÷­(¢ŠMËœdgǵ Êà2Tô#¡¥¢²“KðÆ‘wqªˆ-í®îÜ$· €Î\ð»©ì:žÕ«EŒÊŠYŽI=…P³×4-BKx¬ï¡šK‹cu ÆÀ—ˆ»Ç¶xÍhQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(ªjÜ^ÞÙfV´‘ЈßÌù¾;úUº(¢¡»š[{k‰¢…§’8Ò%#t„ …ã'§5AõÈ-äÑmîíå†çUÜ<"eM̃Ž:wÉ«6—WÓÜßÃ=“A¢Á)`DêW$€9ÑZOÞk—W·w“éš”1<Ó9¨Ü0£8ÏÉÉ÷¤¾Ñ4Q>ɨFÓµÕ´Vó;Hຈw á‡9ç=}ê}KÌX¾)FŒÄ µe?(ò§>ÞÕ·á½E𵎿mæ ^Óì?mgc#³2†ÜIäã+i4+Å>$ñ kvëw˜mmí­åæ5Ëíé’{ãµ7Àºmž‘¬xÂÂјÁÝ®ÍìX¨)¹98^ƒž‚¤ñ®›§êºÇ„m/=´—wAÔôl&@>ÄŒZQÒ4½Å^}2Þ;uÔRòÎò× 4Ka•|§¾;×>òK¦xWð,/þ”5DÓ-3×ȼ%ÔŸ¢îϦ+Ôí-mìm­í-×d0D‘F£²¨ÀÅ|IÓ™míu‹9ÞÖùì ,xËCppAàôÁ7ò¬mOMÔ&Ò´é)[L³ŠEŒËÄ.ƒÌˆýz¯¡ÉZêV׺=æ´ªßÙÑxá/®7s²’Àgîçšê¼[«iÃhf—wÕüÚ½¥ÄK †1¤GsHqœ=qÖ§Ð/¬"ñ‹ìâ4º–K)#„œ;+’ëŽøÍYñæ«>“¦ÚIÀ&Ômà’ît –ŠÄþðƒÆGlð ®NçQÑm¼Máidñ,º“Gy:K,…<ˆŒ±«”UPÇ 'èºæœum+PÓÃk›y#V=Áü r/Ä? éZ|:oˆ§:n§§Â°O Èß7–1¹ÑŒÕ=Pø»ÅÞñ5äq0±™­äÒ-1$‘ÀÁ™¿y”“Äž,Ѽ[¢¾…¢y—–¨#„BÑ8òà]¤ÈyëZÚD3Eãd1ŒéZh AÁÁa×ÿ¯XúŽ£t¿-Ò žÚ#x|ŽvúþêHo¿¶¯¾_ZÃrb‰¯c˜¼.»[àîÈà‡±­{ËKÖñÝ…ÒÁ!·»‰¥ v2© OLú ç<â]SAðÍ®•{áíLjQ$ÂÞ8àb“nv+óßvÓßš‘4gÂ0øõ¬§½M6 Èoãµ]ò#\ÙQ‘ƒZZEα¬xÐj²è×vZzèr[Ã-Ê€XùªNFN ì8®~ÞÏÄoáitÑïæ›®Á wP# ÎýÈsȓҺ9_Z𞿬^&“u¨éz¹‚`ÖaZH&EÚÁ”•;XAÅgßh^#Õ´OêRX´z†· )kbYw¤pŒ c»ŽI#êî{Él‰k‰<Éâ8ŠWõhÃl'êµµ¦éº~‘g…„"Xlq‚HQœ÷Éýk;Tð…u›¥½¿°InUB—ËÀt ‚2¾iöÞð­›_}6Öþ%Šå~IF+Ó§µE¥x7Â-ÂÝéúlPÜ(`’rJnë·q8϶+v¢¸·¶»†[k˜–X%B’Fã*Êz‚cOŽ8âDŽ5 ˆ¡U@àÐ † >Ú9b‚Ú(ã•ÙäTP3u$w&¡°Ñt=-å“O°·¶y~ûDŠ¥¾¸§6Vä^›hÐM‚m£x_MØÎ?•Ò9’E Œ0TŒ‚*±ÓÒ4…-¢X‘êCàc­X¦´q9Ð12:S©0$OZZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š‚âòÆÏÉûLñÃçÊ°Åæ0ݺ*ç©=€©è¢Š(¬iüWá«x¯ç’ï÷v‰es„rRW Àç#¦G½i}¶Çí_aóãû_“çù;†ÿ/8Ý·®3Æj +VÓõ«_¶X»<>l±e•” ê*õQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢¢¸¹µ´C-ÌÉc«HÀÌÒÃ=½Â `‘dº2AüEIERCžqKEP°Ö´]RkË{ ¸î%³p—3ŒsÁ=3ÁïRꎛ¥[Iy¨\Gom7É!Àÿűñ ¨làÔTO9Ä"TtE, íœ×IEQU/5³šÊ†i ÜÆ%h•Œàœ¹ì8ëëVë?UÕí´bgŽGûeô6i°•¤èNHãׯҴ*•–«c¨M»1’Æ"pÊ@ €x$r0{f«kÚìZ V2ÉÌ.¯íìÆÂ>C)ÆãžÂµª–™uyÉydÖr,Ò ˜6åS€ÙÞÕÅdlí`ppqM2Ĭ¨Î¡›î‚y?Jqd\`3ž¾ÕV—JÍo2JªÅIF;qQ KK7?c›¡ÿ,w®ÿûç9ý)÷w¶‰o."‚2ÁCJÁFOlœS­îmnâIí¦I¡q•xÈ*ßB8©kÔµ¯j:Ýæ…áÓinl ŠK»«µfÁ—•TE+ž:’ÔíYñ}¶¶4ÛC7l×·öhâ6ÛÕd [kz|ƺKMGN¿€ÝZ\G5¸iÈ„gØŽk˜Ö|gae?…¯aÔ-×DÔdº3Ü66”HÉRôù¿:ÖÑ|[á_Ë,^ “ÍîxðÊÛ}@` àUô}vÊûWRÖaº‚'œIzb²¾£îûŸ­O¥x·ÃZÕËÙYݵ*R££2âPár=Æj¶§ã¿ éW×»ZŸô¦‚$KúèȬ«ø‘YºÇmìu¿ÚÛ .4ûø%–W† ¸e3(ÁÞÆì¸®·P»[ K‹¦I$F[lHYÏÑG&¹? øîÞçà ­k^d-Ù4žS*ÌåˆPËÎ1žkOLñ–™¨^C§Ïi{§Ý\6é{O;hÉØrF@çÚ´uûû3I¿¼·‚Yæ†dHTÏb qÔóÒ¼þjWð®µwöËw]ZÀ]º®Ót»I}ª„å[°ÀÏ¥u:w#ºÔ­tËí"ÿLšõdkFºTÛ6Á’×l69ÁÁ¥¾ñ}Â]ÜÚé:-Þ¨¶nRîX *ÆÀdªïeÜø=sÅlé¶Ÿ®XèX¹heÏÞee8*ñƒ\Þ¿âx|m¥Ca4–¥–+æF1s6?.vã ŸJ¹?Œ5«‰¯…áéµ++9d†[Ÿ9;Ç÷„JÙ-ƒÆ~Qž•¡ñÒÞÃÃúŽŸ§Í}µ9‚…‘‚ Áäc“ž)—¾5׬.ô=*O–Õµ[{™VJÄb=ö‚¼’0j+oxÊöúûDƒÃ‘.­c±® —#ìáeHp…‰nÃË:Ô’|@òü:uf° ~º—öSZ4€*ÜoÛƒ&1·¾qÓ¶kGKÕücý§Ÿ­hñ$3ÂòEyg##ñÆ‘}£G¯ÚißeÕ.ÒÐ-¬æÀî22a€Æ1AñŽuëÚ&“gccÛÿ¥Ü—äKm»W©ÎyȆ™Ž5TÐïgº±ˆë–ڹђÞ6>T×€¤2ƒ“ž€ÉñCxæÞïÂqëŸ`¹´›ÄV,%¶GS€ð¤36A矗§Jô}BößM²»¿¸$Ck“ÈG]¨2k‹[ÿŠ—:d>"´[7Æ— £ì;Ú&ä8°ýæ?Ù=ªËê~,ñ&­¨iú5ÒiVzX….'’!$’M"†Ø  (<žNzVf£ãiÚ‹b­Æ¹ =¸¢þîhæ*QöpHÈ#$g½Mª]|AðêizÍî¯ ÌßÙÛÞX$ ±Æ³°Så¾wåIîN}*ëÜx—ÄúÆ­m¥êí¦iúDëjæ(‘äžbŽK‚®@À<ó\…¦«âEñÌò]Gý«mâ{Xäš8ÀVW1)!Nà7)ÉôÍoO¦jñB9WW¹[AˆÕcÆÄ˜J´žOñz5AkâŸM¡YÛÅuÿMSÄWšd72"‘#¹Ý´ Uêzæ´¯"×|{¢\ÿm]j7ú„V7pÝí$4 íxÈUÆQÓ…SÒ´ÿø£RñRÞxŠúÚÂËX–ÚÖB¨Ë…—ÚI< ýsUcÖ®H ßÃÁ¦_xÇ]–Ï—=”>¸0ÎÍû³³<0ì§“Ç qŒÔöº¯Œ¬õµÑ5Y,eûu”óÙ\A®ÇWRç g³ ÿ*¿ aÖâƒZw6ò@º½âíŽ&Vówüí’íò“ÐcSZÞ"Õõ”¾Ót-Ä—÷É,¯q0ܶñGŒ¶ÜŒ’NȵJßiº¤Z¥} ÁÔ­'k õ‹k$±Œ²¼{ˆ#ŒéïPü.¶ÔáÐÚK›Õž¹¸F±…òÊÈÁŽG]ÇžzTšäQjž1Ð4Ûµgki5úÄßvIAÚ§Êõ½â-Gñ›=†¦¸·80"¼†VìG­b^\ë¾°¾Òõ³´³°†æêò0,¦L„U,F@É;O¶*£ê^$Ò[ÄZÖ nf‡C“PÓï ( à ¤«`”gÒ«ÃgãgðÔ!>!™µ4°[ň¢}”(mŒ  îNAÉãн¥ëúƒøƒNk‰›û7ij/Ã{O¦ùñ~“©pÆO.>72’àîNy°4½/Fñ¤k¦ÅŒwš Á¸ò€U&7]®G*3ÍrÒi'FѼ½oñ^ØÄþöÞ—*ùäÜ%ç žä†#ë[÷/y©xÆô2-NM6Ñ­RyDB\’ê¬K‚xÆ*ïƒ,ïlu¿Fa´²µZËö yƒ˜d`rÅB¨]ã¹ÅvõÁêZG„¼Mâ{ëxî/´ÏX[Â^âÚO-¦‰ÆA^»•z”`ñL°—ÄþñF•¡]km«ØêpÜ2¬è¢{o)r²ã*zr?úö| um‡59'tŠmKTxŒ,ŒN}8®FÈim¡|.}GcZF@Ûñ·q-·9í»ÙxZŸx3ÈÛý &»-·ï}ŸË;·³œc=ëˆý<5ái!žbÅW»å¹RУd—¯ôù‡8®Žæ vOøf-__Óžò)æžÞ [G:l!Áo5ö©Èš³à}KEÓü7¨®©4PÜÚ^ßYe åÉ%½r¸Ç¨ª‚ÿAŠûá½Õ”cNÒd‡P0$ø]ŠÑ|£©õ×£žAúWéšž›…üxÓ¤–šV®[QU96ûÙ´ƒ¨ Ny®—Äz¦‘¯ê^Óô‹¸nî£Õá¾v·pÞT1X±\à7ÝäŒæ»+õ/gv€Z ¾EyU–¥¥ßø;ÀImp“½¦»¤A:©Ã†µ×x¶@š÷Á{Tœïäµr6òiηa®øšÿH¸MFææ8•¬ñK’­ÈKg<à“‘]·€¬ã´Ñ|Èá»…o.§ºÛzÁ¥;Ûïî¸Ç¬ÝkPµÒ<{¡ÜÞ,‰æ‘=ŒR…b¦V•HS€qŸ|W§¦‰áˆï4ÍwU×mu {‰ÌP[¼¾]Ê3U#æÏ?0ù³šØ´ÑæÓí~¢X\[cYži!•̲E棶]ð0O~8‚Ú¼Þ)½yí$OšKvq—Hùˆê½3Ž Cá«(SÄš\žµÕ¬´tŠàêQ^ VWä’œïÝÏbºßůKáûÄÑ–f¹ß t·m²¼Aǘ#nÌW8¯?¾Óíôÿø.þ$Óµk[‹«™ãá‘[•@ìda““Èw®ïÃö·‰¼ew5»Gmy.žÖò’l‡kcèx¬ |1â+‹_K¸Žú _NYœFó€Ã#œsK¬Üx×Å2xu`ðåÅ•µž·gsx×2Fžvc•I8í€k»Õtøum:ÿN”•ŽòÚ[v#¨¤f¸˜eø§“‡m´´¶½#µþ×ó#0,iǘ±œ±lºWïVÍ—‹ü3¬êwšfž5kWÈšEóV9!#˜`«€j£{áêš‹&¹Ž%×<@Ð7ÙÃü$8›ñÉ$œc&º/hÚ–µ£Ãge³í }a1ÜØb•Y¹Áì8¬ùtßè:Ω{ ÚÚßYjò¤óC<¦3ÊKò¬ÏÍaÿ ãYôoÚ^\Ù½ö±«Û_BÈX"…d,ÊOÀëœ{×E«hÞ'*Òõí$ZI²6‰pÌc2,˜'늡µdÑ~Ì—‘GªZkw­„ø%™É ヂ ^3е‰ã=nÿJ¸ñ+ØÅi¦Î.ã·².ÆYÀ!K3ò®r{ñZžЮ´kŸÍ4¨ë©j²^D?"²¨ÁÏ|ŽÕ•„5Û]*êÖÏWû-ñ×.58&NÂËä\ÊAÁä~•%‡‡|Q{­Øk~$¹²gÓcm!²Gt£k3³’OW_EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÑ÷ú(¢Š(¢Š(¢Š(¢Šò½cV²Öµ½J×Ä‘j¿ÙSù6ö6ö—;d‘‘៺ÇÖ»+_iél°Óo¾Éo4v©n–®Ž3€ ÆÁÑžHë]yý´Úϯµ[i4›½CF¾¼’òÚk5д˜Ý¦AÀìG ‡Ä:î½áÍJßAšËI³»týðU”ïS—d„Àç$ž•ÑøjÎúÖûÅqD—±’n’/–¿0ç¦xí\}¶“v«ym¨xZmKÄM>/®¶µ»'kbÛT6…ϵ^Ñt¿5§m2ky4«©âºùFÀ0Á9V8Æ9ö®RÓõ¼Qáëè¡-imo|“É‘„.oyüj§„-õí6÷Ä7ºqŠÖMJæòÞìH¥e°ÀÚ9¹©|I¦k‰©i~ Ñ`ŽæêÍ%‚{g`¾t2u”ò3L°±ñ±®ÛëZ½’ØÁ§[Ëœ`ww—†v#€005oÁš^¥£èâÎý&wnFב™y Ó|O êZŒš~§£ÜGo«iÒ3BÒ‚c‘a‘ñηJÆÔ,¾#ø¢¤ê6¶Zf›) {,R™$•UŒPtÉÏÒ®ßèÞ•©C«xb+WÿBŠÊ{9Ù‘#?!VUl}ÓÅV—HÖ–ËÅæ¶Ð­ýΑ5¼pÛ’c·‰Ž $òNÒ³´}+ÇÚ§…tý,^ئya‹¯ç¥¼ˆ2»~îàÐsïŒÕ¯ˆ6¶Ú—g§J!Ô­n-àÒÑHÞŇ—´{m'?J×Ô|$³ørÃ@³‘#fUÜŸ%'ŒrpWõÍãV—E’)–1a©Gvû%•TŒsšäqk{®&‡âÛm:Õ¯e{û{˜Á{yŽ7‹2`7^CJo…<5&§á­9c¹d†=ûJ$\´ÑDügîòàg?Ž+³Õ´vÔî´{?–4ûÏ´Æw¤c¯­T±ðõþŸ¯êZ¬:ú¡±å³1ŒùŠ¡AœãÛ7‰ü>|IašÝ½£ÇsÂJІCÇŠ«‡ãš7›ÅIº–Œ[D7Û>ÿJAà½)´Ûý2y¥u»ÔfÔPB¼2;nèW·ëFŸá)"Ô­õ]WU¸Ôîm’ÐJR¨b:“ù §qàÝ® ´Öõ =.îGy¬!dòÎÿ¼Š–PÇ’[ðŒé+>ƒ4á]%KX£ &×M˜aƒÐtäT×Ϋo«ÈÎf‚Ò[P™ù$ œÂ±áÞ†±?¶êL߸XyçÈ9ÛŒgo¶êÒÖü+¥ërÛÜ´×6w–ècŽæÎB’=T‘Õ}ˆ4¶^ÐltýCNŠ9 z€“ír³±–bã³ç9ÇLŽØ­K+H,-m¬àÝå[‘&âIÚƒ$òOÖ²ußxcÄsAs¨Ú–ºJÅq²H ö …N?4?x_ÓKs§Zmº•vI<ŒÏ#MÎIúóPÝxÁ7·²ê:b<óH%”Û$VLí'êµbOøBk-2m. ll‹xdTÜ<úž¹¨¬<1áï Eyw¡é*o0ç—o!¹8ˆ[Â~šßÃcL×mbg¹šêk‹f!Ð ¤-´ž‡óïZZ?…ü1 4¥iÐÛ<Šæ t98™Åþð–©v·÷úE¥ÅÚ€ÒÄ¥øéɪÕþ‘£j‘áeÌp¸’%•aЀGZ»U`Ó4«_´}žÎ¾Òŧ؊<Ò{¶?Ži,´½#M,, ¶rþJ*îúà ·PÅkg+ /¼…P2Þ¼w©J© jkE•gEb½ )ôQÇZ(¢Š(¢Š(¢Š(¢ŠdRÃ:ŠEt$ÊAuéO¨ º´¹ó|‰’_*C›Ž:©ÇB=*Z)®ñƥ݂¨êIàS¨¢ŠÌÓ|A¡ê÷7Öš}Èž[òî6«mFÉݤŒs‚qZtQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šd±C¡¨L!µwH䌜t?«Ê“Åɲ"ºîÜAúÓèªz®¥k£Ø]ê7AŒ±4²lAëV!™."ŠdÎÉ]sèFjJ(¢³4f aµ5Š'ì„¶O»3FHÇnkNŠ)‹4ÊÈ­†ÛÁ})²\ÚE2dLȱÌYº©¨®5-*ÎHá¹¼‚dû‰#¨fújy&‚-ždŠ›Îq'¯RÛYЯ|ãk¨[Mä®é|¹ì­‚p>µŸá¯é^&[ϲÉ’ÚêhLk"³2!¿ÂÝGó¨|Kã=#ÃzM­ä°/ÛgÛ)’US óЃÕsÇo­_Ô|Ká"yõ NÚÞ+… Hày€ó•õJ»e}§êVñÝØÜGqo ÊKVú\—Ä_ø‡Ãvú[èéÍ=Ä¡ÒUÎõ 9'ÿJß¹ñ/ˆCn³[z¤íÜ?\çÃïëZŽ‹«_x¢h¢šÂþX¥bV$TV;»q“[Zw|#ªÝEek}þ‘2–…dGO4è]T7ášmÇŽ<%o~ÚY»g¿[! Š)Õ°!TñÏ^žõƒ¥øòMvÃÅb2+«ÔÒAo"ªÇü…‹¾`'•8?ìÔz›âÍS@Óu©üg{ ×61\¶b¶ò²ääy@à¼>µ{Ãþ6Eðž½â);Êð‰úK*¦4’_?JÓÒ¼e¥j—ɦ=­íì‘<±E{ !•W©SÈ8î3Ÿj¹¤øHÖl.5vd†ÚYáœJ0Ñ´'æ =ºý*}V¶×4ë]NÚ9c†å Ƴ.À$dõê9éXמ5†=B÷MÓt›ýRk¢í­U6BÌ2—tËcœ.i·_<=m ÙxˆGs%•ÕÊÛHÿzŽIR *A ŸLÒZxÕŸS°ÓuûNþÑóœÓùed(3´ív*Är–ÜÉy¨[é:-Ö£›)Šîxš5Pàe’0Ì 2÷ñš¯ðÃP“TðçÛI\K¨_2yÌK…2œ’zzgŠ­ªkž+·ñî§[X¼º{éÒ<ôUq¹wHTŒæ>˜ê{UÆñ~¹}5áðþ‚Ú…•¤²B÷ 2F%‘8a 猒£5½¡kV>!Ómµ;0ëàü’ 22œ2°õŠÁÕ|_­Câ ¼7¤hÂòí,¢»ód”$J¬Äçi#À9ÏlT×>!ñ î¥y¦øO‚q§•KË‹© Æ$eÜ#MªÄœ“€{ÕoøO¢Gº¼ŸO‘u[m@im§«Zéˆ ªÝ6¶sœtíÆ*[mkÇVZŽ›k­éïk¨;Æ'°g³0PÊ8=7 ö¬ Í¡øCK¿Òtx\k²X-œlBÓ8Ê“œ#<ñ“Zï¯øÛC¿ÒLjm¬NÔ®’Íd³2o·–O¸ ¤ñžÕZ×ÅPézŠ.âÓí’x|I=¼Q|Ÿi™Š…iŸ˜“–8è:R·‰|Y¡O§K­Þi7vW—qZ̶{•íšN‚ÎÛ—=xSNVñþ¹®ø“IÓ§²²³Òîan¤‰žFßm¡wªñÜçÓŽõÎx£Tñ/ˆ|¯}²kX.´ÍQ쯊FJN!•pS-•ê;ºŽxÛñˆuý} H¼Ö­´õº‚Y'Õäƒ÷lê~XÕKRG$³œWCá+¿]Awý¥yg¨[¤«ö;ûB1qîPXŽ¥Câm[Y]GGðþ*Ay¨ùÒËtë¸A d…<b@⨋èºÝއ}«}²×Y¶¹[[¦‰ky¡Lœ€°#‘•ëíP|+´ÔaÒ®æ¹Ôe¸FÔ/cX™c …&`XmPrÝNI€W{EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¬}kÄv:,–¶Æî¯n÷ù¶ÊF 9<R@ª1øÂÞîßUH,nÓTÓáY%±‘K†èË–ÚWÜ9éU~\_]èiux/šyÛÌy¯0”‘÷¢œ' Âý)š—ˆ5ûoØiY\Ëbö2T1m–_Þd°lGÐŽ ÏÕ Ä:ս׈ì¬t«½NXµ»·wiBÇ0ªÎO=p `{dVŒ¾"ѵ‹ jb .õQ H¡†P®†‚1ÈïSÝx³U–ïR¶Ñ4WÔWM“ʹ9÷˜ª’p>œÖî‘©&¯§Úê Ð ãÝåN¥dCІ ×ãë+ßi¾·”Æ­ÅýË)û¡¬yö.JÖðψã¹ð´Z® JIeo$wÀýå’߇ϹÆÉ¿ñŸ4ýüA/‡áû ‹ÌH¾Ð|äVÆÆq³9ù°IõwQñWˆµí4m#L†y®´¤¾Í)U‹,AÜ’@öä“Û­Oy®x–ëPŸIÐà³7QB׳Ý3ùhò „@£q8ç9ã­WOOo§jͨÙ*júmÄVÏmåfy±åb3µóÜd`úROâè§O­Ga%ÕÌvÓý•Ÿu³Hp§æÈeƒÂžôßíŸjºÖ¿¥ikam›$.gWbÞb´¨e÷ç#pk2ßÄŸ5 çÄQÿf[Cd“3[²HÆãÈûä>åÚ +ýkSVñeÔ¯¤Ùi×6¶ߨ-ü·7„m†6Æ®åËîÅC¦ø®ýnµm"mBËP¸ƒL–þÒîÛ`œ‘˜:‘ØU¨üI“ÃQxœêV±¼vÂäÙ,IcÞbÛaÏ:sÖ¥Õ`ÖuxVöÛRû2\ÙÍ$Iå#4K±K®O]ÿ¥zgkš5–¿§\i×c÷r¨Úê0åX{ƒ\Nš5¿ê6º6µøq£’ù²6ÞN3åœwqÏ~Õ£¦E¯ø¶;Í[ûjâÂÙ®g‹OŠØ ‘»äÜ­¸’ ÁÀªvÞ"×îSÃIqpê?M¦ßù@ŸËVç8ƒÆ9­ýbêþøZÞ)Ù-®øž!ÒM±‚¹ú•/T7†uÀz}ŠR\–£¦êÚ†í0·êKkgäIaut¯Û‚SqÚÇiÏ\kS_†o è°-µÕô÷šµý¬W Åç`A-åÀbc>Õ™ld°Ôôi¼7¢k¶¦KØ¡¿Jæ)anŸ{·Ì½AÀ=jÖ‡áM^Õ¼bú¢½Äqër$pyލ„¢’ûU€ÜsŒûVm;«ƒ¬´wÜIá™ìØ–h" ÌŒÄäáIç¥tq\Ûx§Æ6ÀL–:.–·hçx>\ÿÀ9«d™´ý3N4Pjš½¥Ë¡!„R¸:gükÅ^ð–‡wá­.Î+)Gˆ¬c1Ãò¬£=X ÄŒõçš±áïhw¾1ñ†§yj“ÜÛj¦ÜÈ2"o(Ê:néÏ^+>ÚÃNÕŸ]¸Ò¼2š¬w·—"]OU’5V#‚#ùüµè¸úÕH-­µŸ |8¶ÔT\DúªDáŽC*ogÓJéu=3HÓÔï$C^ñ»¦OíHnû|°@úšËÑeƒì?lÄÊn?´õI<°Fà­çéšÇð·‡~ÜxcI“T6>t–Içù—$Øç#xÇä*µžµya ØÃ¶–þ'k=#SÔWzÚÛ*ü’ ØÉ*„‘õ«_Ú6øßÂ"çÅ_Úòfú7lD°ÂÒGòª”noBÌ}…;ÅK£êÚ÷‡¬QãnÖ„}Ô•ŽËŒÿÀ~c^«km¼°.Ø`‰"Aèª0+Ìæñ´ú¶½m­xšM­ož8tûUE–h¯’Œî[¨ÙÓ¥bi—6SøCH³ŒÈe²ñ²MÆ|Ø·\¾`ë’9ï]ïŒÁþÒðKfƾ àg‰úÖFƒâ}#«hÙ–äÔîî-À‰ØÝÇ;—VM î<àQZ Ãø~y&·’ÙäÕµ0Èh÷HN0})ž#¼Iñ¯†¯®c›ì³ØÝÙ #™DŽÊT6ÐqŸóÞ©xo^¶ð]ŒÞÕlïÕÅÇÙ¼˜$qw¹ed*ÉÎHÁë]‚4íCOÑc:„~UååÄ÷³Eÿ<šf-·ðïïU­-nÓǺµÓBâÞM É]§ae‘òzûW)¨øsGÒµívã[ÐïõmJè]Ú\YyŒ²á£uF\z0AëÅM…u4ÐSPÓtì/­µÈuX, Œdš8xFf`$e'8Öº+Ox“\Ô´ø4íêÆÂ7gÔgÔ#ÚvÂD7’zž€ âïìµÝÁš4fÈF¬¶ðHÀo-på2sŒ6Zé/¦ñŒ¯tk#¡]i¶6:„7׳ݔhrU" Í»'©àUgðf¯©é~*µžÖ/6_>§eø1Ϋ´€øÏʜ£³ÐžóRÓ£³ð†¬·—w[·Ê¿ÃBNIþ#·µuÒu; sÅ×wÛP½¶šÙpXU[Ž£‘Þ°.¼!¯OáÏi© WWº¼´Rã++“Û8Ç5~ê_ˆ7i×¢ÛO–ï þ4©•}ß+¬…HËÁöɪ^!Ô,4xrîöC3Ú^Z+H.Ì›WŒòjoíó¼Y€äc»ê:ü«Ò¹>;–Ó|4R)ÇãI÷|§…Ý $ñÓÞ¤×G„¶µ95Hµ-SóQ!¼±2âõ6ü§äR¥»A#Ö»¾¿&`úÛ;_7-*…r›ÎÂàc W®{HÐ$ñ6©®ëÚƒßÙæí¬ìÒ9"a„cq†<ŒýGZ¯oá{í>x^ÔNún©eöÛK‰‹0IΕä9$±Áäôªþ#ñ.¿7„ïôæðõô7±Ø˜îä•T@Šƒçe|á³ü ó[úm÷ü$ú]ñ†O³Â,°´¤|¢O1NÒ}qXúÞ‡c§ø“QÔïü?sªÚjIÇ% ,ðIí*Êxa‚4àë­_@ÖBh¶ºl÷WpÜ[Z·Þ™!û«pÙa—Ž:g½2Ø]^éqéÞµ°Î’Þ\ÞÅ*õXö±%cÐWS¡iÚ•§ˆ<[w<%-¯'³kg%x,60sÁãœU +BÖ ðf«¤K[ÙSTH£,0|Ö}œŒŒŠ£wá}Bü;©" RkM>öÊb¹À+¹NsœdµwFÑuw}ZæM"ËH‚k7¶µµ…cóI#—‘Ô½€'Þ­Û躿ü ë¢É®¡ýŽm¶nCìÀºU{ý#ÄÐËá ëh.'Ó!h.¢y6ŒIRU°~éö­½;RÔ.µ]nÊxc[k&¶H„’þbåƒg€G;ZÕ£h·º~³âMBfŒÁ¨Ílð'p¦î=zc5›m¢x×A7ÖºÖ§ÍpóÛ­ÐpÖþaË/ËÕsÈéI7‚ï ÑôË}:ñ?µtûïíq:“ÌÙß¼=‰#Š}¾ã½sIÖµ‹Û=–K:ý–ÙhÞ„d3’O\€08­ýsO“VÒµ:9ouk,*ì2°À$8üEQÖ|;&­áÇÐEȉÚÞ¼í¹Ë çnG\zÔ—‡u©M«è:”vWw0G ÒO™¢<ílB½Óµ@þ »¸Ñ5>ïV–âÿU!§ºuùTŒ`$yÀP;øÖγ¢[kZØ&–HÙZ9"ž#‡ŠHÎUÔóÈ5“má]^mFÊÿ[×$ÔÀï¶·X–4cßi;ˆíÐJ®Þ ÕmõWRÒ|Cqe.¥?™*yQ¼``c ÝÇ<ç¿N*Ù‡Ã^ ЦPžI-e’O´Í(/%Ä“}âÛAÉníTþh-¢è+$±Š³ŠÒñ¢é¡Ý FÂæöÓt~dvƒ2§Ì>uÁäëÇ>Ƹ´Ð|C«xph÷º¦­=ž¡os%Õß™åÚÃÌFYQw9t'é^›a¢Ùé׺µü,æ]Jhå˜1áJ Q·Ž˜úÖü+ÝϹ+y~–2É,ºzNËnÌç-òŒÔ¬éÞÐ4Ë[(Zá­ì5¾µG‘ü£ý“ÁÍk]iuíþ›©L„ÜéÆcnÁˆ æ®ÖÈèxõªºo†t'RÔuKC:ͨ1y£21‹qÆX&v‚q×&½áíÄ–‰g©FÏs$Ñ”vVG^Œ¬¤«¨ø;Ã:¡·{›wóàmãž9dYBÅՃğִt­#JÐíËM·X-Ô–Ú½ÉêI<’}I4û½7N¿’Î[¨Y,çóíËàŒÀÓ²´¯íío²Çý¡ö³ý£?—œíϦhIÒaÂ;H‚ßÈÒ] £1þ@ÅPÒ¼!á´éº\óí*$Uù”ÊNp=†+R +Y.f·#–êA$ì #[Ôàb«.‡ ¥å΢¶ Û¨¼©çØ7ÈžŒqÈà~UU<ਸ਼lЬgÝÄñôâµ&³²¹­g‚9-Ùv˜AR=0x¨"ÑôHb†¬-ÒeÄ‹…GÄ8>õ‹…®^øŽ=cW’ÔÚéë:i°Àpóx/!oâÛÆ×OL1B\HQL€`69;jóÀäæ–Œ´QEQE›­hvìVÝ— m{ox›ø[+žëZTQESh$i9š6ÚàJœgÞŸEAs{cfmÖæâ8Zâa !Ø1ÈÈUÏRqÐTôQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¦K3¡ŽTWCÕXáJ‘Ç„B¨èÀ¥ VÆ@89íKÅQEEq\Á5»–U–6ŠàŽAúW(¾Ôg…týOÄW—ºJ2bÙÕH«Ñd Ì=zÜ×^À)h¢ŠLŽyéKEQG“QÁqmuOo*K Œ£¡X{Å2;Ë)§žÖ9Ñî-£V£Þ2»‡QžÕ=ɦ†Þ)g™‚E3»Šª2MVÓ5M3Y´ŽûN¸[‹i2Dèppj×ô8õh´6ºQ©K ™ ÁÉQß8ÇëZTUyo¬`¸¶´–tK‹‘!‚2~i6 ¶Ñß­bÞøËK´Ônô¤´¾º»´HÞe¶…˜(eyàsShÞ,ÑuË›‹Dð_ÛÆ²Éku$£G#èMnQEQE! rx¥âš$ˆ’‚Cm<÷ô¦Å=¼û¼™RM§ ´ƒƒïŠŠ}CMµ’8n.¡ŠIxÀ-ôóY¾!ñ>›áÆÓé“uõôVÀ3ªìWÎ\çøW¿Öµ!¼±¹b\G+*$„#B¿ÝæY¤»XIJEm ’4Hz3ìVÀúâ±<3ã‹9¬õ=GP¾3YMâY,,%Tà$›|°vŽOVüMtòø‹E‡[ƒÃÏ)ŒöÍr‰´à 'øºgƒÆ{V6«âM*ìÃ7×V¿dñ%®Ÿ#ăKÔÆIþœ1wTñ~›§_I¦Ãkyy K,ñYÄ\­Óyȶ8Éô¬? øÂÂ{?ë·—ò6™oª¿”f“ËO)ç'c9­K?ZÍuim¥jbÞÉåZKyªJý—åf*ǰ`¹®¦±¼Oâ; éªÞE,$±F˾vÆpHéùûVT>6ºMCNµÔô+½>×S›È³¹•î|ÕX•,Ͼ*k¿j^ÞØh:<š¤–,Wry©q¹ì ÙËyÀãÖªÞ|C°·Ñ Ö#Óî$c©&qiÀš IÁR9ŽÀr9©-ü_­Eªéš~µ ¶Ÿ¦Ï¬Þz?ïKmp `8Á<×]\bø³Å:¢Ï}áý+½*$E–iöIså’Ä¡c#‚̹§ÝøúÎßLÑ5õµfÑ/œ%ÕÁl5™c€]@<áŽáz|9´¸m~õ!AÑ£`÷ÊÙóåQ–XÔ ½3»“Àê›x“â-¼zÅÆ…núeÞÖÝ®áŽNŒFÝ¤Ž¬O^õJ-Jo7ÄíJÖ4’kkØn;X˜®9®‹Äþ!½Ñü6u«Hã’lZ0GÎÒ%u¡¡â²µokSx†ûÃÚuî¦Ég«ß†f¹2 â5 ʽ Ëö¥½Ö|G§…ŸXÒí"¿ŸÄ0Ù߽̀„ç œqžFqŠÒÑõýAõÏèú©…M‰ŽêÕºÚAÁl“’¤HÀö®}|s­>‘¥\I-¥Ö½}rld¹ùc·µNC¸,76Ü`n\’*Ɠ⫻MMÑnµÛjM'ò¦·Ø²C$cvQ˜aÐðr+¾¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¬í_^Ñ4$…õ•‡Î}‘. g>Š Qé¾$ðö­muwgz «2ÜʘJõÞ~ V}Ÿ|}u ¤WŒ­pá-ä’)9˜öGe OÐÖ<þ.–_K¦‹‹Ø¬¬-Ë4Ú»yî7nÜÛ ùHÀcÑJ~‡ñÆ{+›Yf„G¨5¸”[ʱ…wÄy$>÷#¨Ó\xƒH¶Õìô9d"þîš$ÚpUsÔô>•RãÆ>µ‹X¸žWHt›…¶¸r‡ #B¦2Xò­2ËÆ:}Íõ¦Ÿsc}c=àcmö¨¶¬¥FH288¦Aã]2ïV›F´³½žæÞìÛÜ2Eû¸Úg'z㿊eÇa\‹ &ÿPµ´‘⹺·TòÑ“ï¹Õ›ÕjÞÓµZÎÛP±”Kmq’7Áþ¾µ¨ø¢X5t­3K¸Ôn ‰e¹1•T„7ݘ˜Ž@¥qöúåÞ‰ã]Bö=C쩬ÄZ0¤Ñ«TîùBž }k®ÔüO{¤ú>‘¥¾£{ ²ÜN ‹F­£sg$ûƹÿø³^“ÂöÃO¸³¸‡QŽÞí]Â<,޼)Á ¯œdqƒZÚ‡‹uë+í?J‹A3ê–Mqå¤ë¶6 Œ3䟠Ç5CT¸¶šOÛ½€‡P‰î&Y f7€@)Ï8æ ÒüQã XêáõmÖÊçÏÍËDŠ3 M˜÷Ápq]=¯ˆ…渺\1+ZɤE¨Årïo}¸ÛŽ˜ç9ü+7W×5k–ñ~•i (úm¼‘ÊîÃp™¾p8*Ë‚yôª:6½â-?ÃZ M½Î£¨aÓÕ]ðSË|ÌÜåFKc9ãkNÏ]ñŽ©e¦kÑÙ²ê ¶¸³fº.â®­Ï#8 þR oÇݵƭ¤ÃbšjÉ2ÛÁ8s-ÊFH-¸.ì£k{Ö‡€ Ÿ èÄ(Qä·ýãXÌž$“ÆZõ¾-½²Ëoe%ÍÄÈ\¨UÂ…PTdóÔñކ–oøÒÚÇÄ–n¶Òk:"Ár²"7—s󥲃óšÕÕ£q¥áHµý!áChѼØuo1—ƒÔ#õ—¥ø?ÄVšF‰¶ò¼ŸÇ©-£K»ìvÙ? byÚ9ãÖ´¼{áoê÷6Wº ¤wÛϥߖ fÖ~­Ït=;óW“ç\:ö;ë‹’ÀË4¨á·9Ç|c§J©ñM]V/ÙÈ&òe×-ÖFƒvå[œŽF=xÅ^Òüoa¨Cª^jwÚݼM³^:‘n¥BªÄpIÉÇz†ÿÀZ]åÅäÐj…ŒW®^êÞÒb‘ÊÇï18-ßf®ßøCA¾Ñ ÐcG´³¶15¹·m¯ Fr¥O<ûÔþÑõ ì®ÚêúÛkhíM̲É4hs‰ë“Éã>ôë?xFÆËTÓá³?eÔ‹´wvߌä’AïsžzÕI>ø:æôw7ŒËs<Œðàäyl[å>ëƒêkvßDÒíno/aˆý¦ò`™˜ïX œ“ëÉêj hòh:-†˜ì¬öèÁ¶gh,Ű¹ç8çkSÑôa-ãÔm’á-îâ ÿÃ"t?…¤i2ê0êÏkjÂÐG9:¡ê3éU5 xc_– µM>+‰ â9C(ôÈÁǶjÈÑ4!§d ´/Ù¶/ÏÝéך±secz±%Õ¼s,R¤Ñ‡PBº« ÷ª¦¥áï ëÁ>§¦[]ËÌO4jÅ>„ƒVí¬ì¬Ä‚ÚῘþZ¹±Œœw¦?M[v³°‹VÎèB ‡''+Œr}ªW‚ÞEDxÕ•YA W¡NÔË›>ðÄn­¢˜ÄÛ£ó‡Ôd˜*.pÏ\w¦G¼LÍHŒÜ±P?Z¯™k£s©‚æââ`lŸ•R2H >¤æ®QEQEQEQER«Ðc'‚§Z¹§øŸÂº­Ô–Z~­isuKŪÌ1×€{Q¨øŸÃ:Dßg¿Ô`‚}›Ìlß0_R {œ š}w@¶´·Ô&Ô-ÒÎåÑ!œ¸Øåþè œsõª£Å¾m5õq¨Ätõ”Ãçs†qÙxÉöÀ9íMÓŽÀ‰»‘L‰,N7PÊÊr„JVeU,Ü 5£ø×Ã:ó7ötÒK[´òNbuŠ0½C;wÆsН¼7+Fån£±–EŽ+é!u·vc‡#¡= {Ö¼Þ>«w£)u¼¶‚9Ø2à2?B§¾³î¼gáë8õ©§y"Xàöä<Ž8DÇ%¹ñÔÓlü_k5õžŸy§_ió^ïû)¹Œ”¨ÉV`;6 s7zö¿¦é^6¸·{‰§ƒ\–(]v°µBˆs‡8Ú=<ž•ÓYx¯Ì¹Ñ¬oôÛ«+Nš/;ËÀh¹*v;rG#üx«ñë–óksèqÅ#Kof—2Ê1±7œ*žs¸ŽztïY_¯õ=?ײØÇ!vÛË…0£[ž}¸çœÖ|>!›ÃPhš%¿‡®ÕÜ´6Âer¬¤ŸÙe‰ÉÇ¡éZ÷^#ÔÒk]:ÏJ7«Ú¥ÅÌ>jˆíƒvgÁÏ< )Î3M³ñ}©·ÖU¶}>çGA%ä,CŒ VFx68àñŠ£/‹¼Oazž§áÿ#Gvs¤Á§…_ø¤h鈮˃Ȯ{Ç7¶žÕ'¹²ŠöãBÖó}ÇùÇ\g§Z§¬x‹ÄÑkè:.Ÿm4³i‚ðM<…V/œ©Ü$LrIôæ›&¿ã ~óDÓl¬Ìvkk$÷3;aUÔ@ÎãÎÞqÇ5$š×‰µK»äÑMŒ6vS=¹–ïqi¥O¼R0 ñœŸ¥gÝxïP‹G´ÕþËkm¬¦Ÿ¬FÄ·’7mfFãFGC[¿ˆ.¬õ­?OƒËû2YÜê‹°$¤1Œ.ÜÉo\ð+-Câf§¥ØÉcrÅö›m6XسÅÔ”0Ã0ôL šOjšüº&áöKYõ-4êSÜL»þÍBà.@,X㓎:³k7Ä]:-jÚê8u9 ¶i·xXÄÎG)"îã¸ÀÇz殼Q­h·L’øºÇR¹žöÞ ­6(ãàJÛ[aBXlí¸œ÷«1Ùx›Qñ·‹­´Ý[û:ÕcÓdžHãF•‰ ª\R~RzU?jzßü#Þ.Ñ5›„¹ºÒfÓ.•6ù±M"•,£ÃcéZ¾)ñ<_Û¯¡Í­ÎÚÊ+™æ‰Ašf‘Ž V2NÜò:UøïïõmûMµX-c†{k·k”|‚ò¨%OBÈ5ÅwÚ›Þè~Ó¬³™®|ñà å¶g€ÍÁÅQž×ÄÞ ¦¥©.¥£¦Ÿ4Æç-,S¯ÝÚÁFQ»‚xíTî´Úè2ëËâ+Ö×"³7¬ÇÙ‹¸§•»{z÷Í6YuOøƒC‰u «->óÃi}s¼…wîaÀ#yäŒqžiÃNÕlµ}WÂVúÓØj:—Vo,ŽÒÚJ¬íÛNAå‰J]vÿÄðÞŽ.¥‡VÔ¯ÓN¼x˜‰ì­ûæÈÁ?]ÒôUÖÓýâlíc¹£íväó÷N;ñ^Ãeee§[Cge Ãm íŽ4U¼›UØ<=ão0pÞôn†sˆˆëÀ9ÉéZKy©Ùj÷ÿÚ†ËÄsh¿c¼±”´W",ÂAÆ7)ôÍPÓlõ¹>À¦- =&}/ÍžiÞB~eË;¿<ž¼×¤øm.#Ðôtžà\J¶áæ\âB|ß0ž¼€k‰½ûöÅxìr.ÛJ³h6ýíßgaÆ9ϧ½_ž_ Gð͘³ƒµFF ðûÅ¿×Mᄾ‹@Ñ#½ÏÚ“N¶Y·uÞg>õÏx 8~Õã‰#P&oÝ£7s…R?,šå|!.½aáÉ>Ñâ>Â+).–þÞ{`dŠMçvòe,yû¼çŠ‹:‡í¾IwxdÓâ¼¼1Ü\ÇåàJ§Ë%Np#=0k¨Õ¯´½oÆ~‡J¹ŠââÀ^]]<$0Šh FGÎØÀϽPðͤ×ÿ o­tñþ‘,Z¬j«¿˜ãSÒ¥›Æ>ŸÀÆÖÒî.¦Ò~Âf32lù{9ã¥C¢M‚üA^"-Å÷‡´Ë{{©N̶R$yã9;†O5RÒúÏÄÚßĦÒTΗ ¼0° ÛË‘ASÜÀ#Ò©ë¾7ðÍ×á¥Ú\Oû.Ú mcV2BcÚÈ1ò…Áëj莯aá?ÞêÑh4ý[M²û=ÙV)Â1±àœîÆjˆï5è—·Úu…ÂXiÚ½•Í´ÑnYïb„þñ£AgäëœUO kÚ†e¦ÞkºÓ­ä7$óʰڈÎwɽ ôQÉ>•é°kV­îŒ‚Awg3I¹HVY3‚§¿NkFŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(®ÆúFŸ¬ëÞ µ¾ŒInס”çæ0qÇcŽ}GWWµ´ðω…Þj–ïsáÝ@²D6¤o†LÆ}ñš—Kð¿„®üÅݼ3Éu§»‹×ÊÒ2î/¿ïdœñSi¿¥Ð4 ì4Ë{æ›N¥–âsè66w ÓôèaÔüc«6­mwc§X‹XØîXÖPL…2?½ÆqÚ±¼M¦xJZÃMmË7ˆ4Ó¨[);"yA 0Ü9 øVçŠìl,î¼-´ÂÐëÁ@ÚŽŒ b;U-=µ­[ÄW>Ó졉µýåôŽÏ+Ä 0T{e€ö®vÖÚ h¶·>UÄ-⥌ì»uk†hçå ôÏCÖ» ìÐx«ÁæçjY(¾X³Â ʹí’3·ô¨/nté> iQZ´mxºUи*FàÜ úÖ†á,_Hë¬i¶Ð½Ð¾ŠâÙÙã}ÌdóH™'¯Ý®ÃÁ†ËNðÞ…n×é2ËÛi FPIJ…F$ð:xÑÉÊ8ÿd×›YZ\Ýü(h4õ&WÓ¦`«É|9,>¬2*÷‰|Gá[ï\Gcqÿn²KkKhÙK—“ ªåIãŠb(¡Cá‰ÆjíÒ‰´Ÿ‰°¡bRþI§îÿ!ùV†¹um®xVÃ_Ñ&[—Òä‚úOâòx‘,‚* Y6½§kZ¬ÒÏnuÛ¶x¤…ŠË1ü±á» ïÁ¨üG¡ÿcxOÄ(···ÆX–LÝH]—i.O «—i1ñW…ä±S§Þl/ ÔãßÚ±òy pYÜßÏ3IuåüÙ+!%W<yôY£Ð/í Òìô-^}QÊE5µä—K?Þi%f*Tu-šôs«[A«[hf „’Ù=Ìrày{c`¥sœîºµCÇv·—¾Ö-­ {‰ä€‰Ìß0éQ­–£ÿ ”ÞC 1áæ¥íæy …úãž•6™i{‰|Gs$,¶óÃaåHq‡*¬NõÉßxgJÓµYõÿm%ÝÄ—V·"3|ü˜Ü1ÁÎN{ßÑ|.¯á{½"ûO³°þÐYÌ–ÖˆEæ .zå”c'Ô{U/øo^{-aüL¡ooí¢Ó¾VEÐr bYª 7ø‹¥è±xm45šæo±Á¨ A° ªìÎ@Sœu©ÿáÖ¼5&…¡Æ·òéúYÓn­ÝÂÐÛ‘ˆ 0nyìzÓotŸx£Lñ_2i¿m´K{ á‚m9f‘ÔËN‡àVv¥£øûRÒ"²°ðö¤¥œÖ÷BÌ ¸h˜ªQ@Qß''Û½h/âŸâMW_Óílæ·Ô-l’KI&*Û£\0R>SžÜƒÛ÷ƒ¼I«h~%ûcÛ&µ®IlJ#7“ @Ãj†ÆNI;FIéZú¾‰â}_û{@6Ò\Kh¶·v·E‚J’Œ¬ Ã$}ÒúUÏXø¦'¾½×ï#{‹¦O.Öß>M²¯e'’Oñ'‰4+íQôëý2å-µM6f’ÝäRÈÊ㎠=9má¯j×—Wž)»…â’Æ[(¬¬‹ˆ•dûÎÅŽK‘À㊨<-ãéì?á¼ÖmGòÖ¸H˜]<#‚§æØ ðªºÞ›¨ŸèÖú%âXOkáùŒ!“tl© ]޹S·±+EÐ/ôëÛí_ÔcºÔ%¶ïDÙ ¼(wPKO$–®ÂZf‘¨ø¿Äþ›(›M·•£”æ3s0_=“·` ÷5×iš 麮½ª †ê²[¹Œ€^RmÀ=ó×µsZþ‰áý CÕ­stm®õ¶ÔÕº|öRHF×Îc“ƒô®u’Ã]ñ…¾ÁâI|A{i|³Ë"lò- NâÞX ¹Î:’~‚½+HÐàÒ.u‹˜æyS½7n­Œ!Ú§óY³øK¸Ñµ}®n:•ü×Í #|Nîå8ÆŽ2 né¶“ØÙÁm=Ü·rƸiæÛ¾Nz ÈV5Ç‚ô[›MZÊI'òµ=I5 ¾a•‘YNŽTz÷æ¤Ö<'§ê׉©Guuc~±y =¤›ZHó­ÁÓŒZm¿‚¼1o£Ï¢5»Mks#Mpò±2K)9óø;óÈ Œv¨´ÏèÚuü:œ×7º…åº2[I}1“È ÁØ$qœïZúv¦éO¨IiF¿¼{ÉòIÝ# éÒ³fðO….4ét¹- ¶’öKÎÅ‹«¸ž0EI¢øKAЧ’òÙgšòH„Oqu+É!Aü!œ¶ÓRO‡ž–àÎÚÊÒ™šÜHþC99É‹vÌçýšê8²äðç‡äÕâךÍ©^RÏ“¸#gƒÜU$ð'£¾:’èöâèÉæîÛòïþöß»Ÿ}¹®†«ÛXéömrö¶ñÂ÷3§( €76:œ ¡{áo êW‘êÚM¥ÅäxÛ4‘)n:rGnÕCÄž»Ö5o ÝF½®up÷I/t’"¸~•µa¤èúXuÓì µÂUÝŽ™Àb {kdòíâH£Ü͵$äœSP.™¤¥Ó^­œíºÎwŸø3úÔ×Ö·Iå\B’Çvº‚2==R4ûªp; A@³P[ï:ýiÅU†= -Z->ÎË›õCö›ˆâŽG$Ÿ–<ítdž1É«4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¬ûíÖþûK¿•äYté%’ §åc"í;†=>”—%…Ϋe¬H_í6–óÁä+.3‘ëdž~èYxRîý4×f/§$Ì-Îã’6õÚOPjêãŽ8‘#B¢(UP8t²u é:Ìö÷“ ¼·c¸·r’m=T‘Õ}Žj(¼á¨tåҒݾÌ.£»b]‹É*0`ÎÙÜI#œ“šÑ¿ÒôíLÙ›¸¼Ãgt—PrFÙ8<Ó=ë*ïÁ½¾›PšÌùÓ°iÕduŽb:@ÁIúƒR[ø7ÂV‘Iož‘À÷±ßyj[j̇!”g°Àö¦x®Û‹hb]bȹ7VÎTI÷L{°¤ƒêWëX~Ðd:Ä”~…œ LPÍ<³¹Ÿaa€w$×C{àÿjWfúóJ·šå™YÝ—ï•èXt8íjÆ©¢Zj’é2˵³¯ê?”g*¤n¼ý1Zuµµ­œ)omE gj FNx«Å£h\5Ü6érÄ“*Æ¡‰=yÆy¬éïˆßKAlº,²B÷®ìÞk*6J*íÇ8îõâº2‘²ÙAB0Tލb°Ó „[Ãmp+nª ç9À©ö§Ì6›¯½bx‡KÖõìý&ê (fVŠáÚ2X#p|¼ÆzƒZ¶v–ö¶övë¶x’(×ÑT`TôQE´´7KzcáahUû„b ê@ÏÒ§¢Š(¢Š(¤X§ ô"¼a• ì žN)"š Ô¼2,Š®T‚2ãÒŸQ[ÜZÝÄ“ÛJ“Bü«ÆAVúÅKEW¹¾°³’Ú+›ˆâ’ê_*r‘ñœ/©À¨,îtMNi®ìÞæµ’[9%L”ÈO^¸È«ÌªêU€*À‚B)°Ã¼k¬q¯E@€ª×Z¦›eucgq0K‹çt¶Lœ¢î=8¸«d<ƒMŠ E '$(4ú(¢ŠÌÓµ»=JûW°…$Yt¹ã†bàmbèmÁ<`÷s[¶Ðmíî'ŠI{ÛkEã!¦` œ‘ÀïSA}<×÷¶mg4qÛ¤,— .mùÈNs•Ç9­]¬­3\‹RÔ5½=ahßK¸ŠbAyˆŽqÍjÑÀäÓ °‡XÌŠ†BädþK40FÒÍ"ÇŒ³1îM4\Ú˜~Ò&CÍþfá·o®zb±¼Kâ­/ÃÚV£¨yÐÍ5¤!Ö1Afoº;‘»èx©´­edÑâÔõK«ÁVie‚\ÀœôÞqÓ¡éÍ]±Ôô­R#>Ÿw Ì@à¼.îA5]|Gá—m©ªZ3}îp²©ýÒ}çàýÑÜô¨Æ ’î;Ö¬šêE ‘ P–dcžãš~™âŸ k7Ziš­­ÕÄ`³G‚p êµkÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(éḦ2Ìõ4´Ù$Š$i$pˆ£%˜à ÈMt˯¦‘höÏ¥›Õ¸WÎH“nÐ1ŒwÎ ¿&¥¥Er–r^@—O÷!gPíô\çô§\_iöaÍÌPìŒÊÞc…IÉéT"ÕÛ/Ú{»¦CkñºÉûÅœ´™8 „÷­ o,`¶kÉn#KUÌ33}wtÇãTµ?økFò¿´µ+kc*–A#€Xr¥PñŒt}@}rÞâÞæ7mq Ù;žÊÃw¿@zT–Úýž£}¦5Ž©g%•խˈ†L’´dPç^CpkRËTÒõ5Ô,îRkFD¨~_”àþXæ¨Üx¯Ã¶š”·ª-nÿãØ€Å¥ÿu@Ü*µ¥ëZ>µ’é÷+2Å!Ž@2Ñ”àƒõëÍ[L°¹°´º—ËšþFŠÜ`áÙFHÈz‘Qîi¥Öû¯íbYfiùU±ŽqŽã¡ïTäñ‡†ã°:‰Ìíí#7/,¨H+ã-È8À#Þ£ø£JÖ.%²Xî-o£Í6×q”§÷€<ô&³âñ®•­C}”—lñÛ\—ŸÊ`:€Ìp7£ãi>%‚ÓBðÇÛk½CQµ·X㌖VÚ79ɬIUGŰZ_\iÖzmî£sjˆ÷"ÕˆCŒ€Å™FHç&´´MkNñ„Z…‹1†BêCŒ222°ìAàÕWĦÊþ=*ÇOŸQ¾1ùÒ$%B‡¡vbÏaÉ5BûÅS]è:ÜÖ6wêVPÈ—ÒY-‰BC“’¤ ©9íV¼ ‘èFKy¡ie&yŒ!u~â[†ôã•Ñ×aãŸk6rßé>–x wI7Ί]ò#àîã×oµV/x’O è>({ŸÝÚjo¦ª€ àó {ˆ G‚;ý+¤“SÔoügm¦ÙÎVÃOÓZêô.1#Ìqž;X`×U^~–Zþ¿âßÙÍ®^[iV_b1AlÁ[t‘gïc u$ÉúVN±«x“JÑü]£ÿiO-Æs¦5­îq1ŠáÔ…r1’9ã‘]oŽoo,­´7¶žHZOiÑ9Œ‘¹ùVÇcÞ¹«/ &¹ã_-åíÜvQɧ0··•£;B>f(UŽ1ÇÍŠ¡ªË¨Ú[jZ ÷RÞC¤ø›Ckyç9E;«mcܯ©í[Z¶¹¨hº·Ä ؤgû‡a<;ˆäIÈÇ'À§‡ö‡N±Ô¡Õn-µôÜÉ©¼®ÁÜà¶ô,¡éŽ8ªsè÷õïÅ 5’gm:KWC†°RÿhR¶±ÿ ²øÁþüÿiê+ÝE§O±“».ý[_ïi·cÿ!šàl<á9| m©ÉþÓ]oQÉó¢‘cÜ¥_ïa:Ó¥T:†³âW@‚ûFþÙX¼/e¨›W•34Ç #+pHÆdÐú~«§Ûxê!¥E¥iWžS§¤ñ¾ÙÀa½Q~èuëÆ sYð¿†ôÿ†7f×OƒÍ:D-+ .òqc“žN9㘮~ÆWÔ4Í/À—/þ—k©›[µÅkhCƒôe*=ëd‹Ÿø†OéVÍyÛÛÞ^ßHÛwʤh uåA>µÏ[Eÿ7"f¶jפqˆùÈ9ÀÍuW{Šü"cké×Ãتšç¯ç}OøF݊ˬ^Ã&œd¼8—€Lδ¯­5+/ØÚi“ZZ˜ô%‚ÄÝ£:áçT“æÆ3ÎqV¼3 óx§X¸»Õ­.î㱆 ¨¬íÝ[vP»$€ÈÆsƒZ>:´itsÍÆ•q¡¼£–ÿÇs\MÞ¦tˆ—Çqna©]êPŒuhšUpqÁ&µÿá’ïE×lµ-@Ë©ëN²ÜÝ¢`#¦<°‹Ÿº˜Ž}yª×~ñž¶t¦ÖõøtÛû{´ŽÚܪÊblåÉv9#¦0¡«>ñ :ö¯¯èº÷ÙeÔ…ºÉo,âÄI·Ÿ™N{Œס§‰t¹¬î5)&¿ºÕ-µ«ÆQ™V( ` ñZ‡ÃrêšÞ¡s!šZÆ 9mØ ¡cÜ?ín¬ð÷Q¹‚ÛJÔ|Eqw [´dY—o¢ÉlŸn¶ëY?(€‚œç<;Õ‹½/M¾¸°»¹„<ö´¶Ï“ò3.Òx=Ç®jž‘¡G¥êî ¥7j—QÌUyÉ9$䞟JØ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(®+â 77xVk¯²Ü¾´‚)±¬ˆã#>ãÒ­Ùx{Äwzµ–­âø&:zH--íQ–0î0dmÌÄœt©«Ú‡"Ò´C¢ÝH.âsr$%pff$“Øã­b'ƒ‘©ø’ò{Œ$¢FŒ»~áv-·Ž¸¸5½gáå·Ôm5iï%¸½‡K{³ ܹpIŽ* W¿m¿mSOÕ.´»Ù"X§{m„L«Órº¸Èìp½[Ð9È·bNOË×ò@ {Vÿö6š/íuŒ¤ÖÖ­kS„ÄméÆ8§Å¥XC©\ꨭö»ˆ"‚F,q¶2HÀéÞ¢‡@Ñmõkr;p5˜VeÉåF8Æp: àvªZƒ<5ª_¶¥q ¢âDT›Ê–DY‚ð<ÅV±î Imá YǪCo§¤pjˆî'Ëp8\àq×hí3¾ÑÅ€±³XÍ„sGlŘ˜ÖS–’zÕé´½*âò×PšÖ7¼µWX&aóF`àûÔz¶‹£k mNÕ." ¹CuSê¤`ƒô"¥éF‹l-4ÛXí ;Pu>¤õ'Ü’jÜ‘Ç*Ð×ÃÚréëpÓ…žâPì?½rØÀôÎ+ZŠ(¢ŠË×´+_Ú +››˜!/™>Í!C"à‚¬GU9æ¯ZÚÛY[Áil‚8 ‰"EU¦¦‰"!HpC)Ï_¥:Ч§iZn“ÐØÂ!Žk‰ny’C–<ç©©’îÎIåµI£kˆ•^Hƒ È¡#¨µMTµ=#FÖ¡K}RθE•c™C(aÐà÷«qÇH‘Æ¡*ªŒ@:¢KkXå–t…i¶ù®Üûzdõ8íš–Š*¦©©Xèö7Zë¶¶ŒÉ#IzÍX†XçŠ9£9I]O±ú(¢²ìõÛ;Ý_VÑ£ŽEŸMKg•Ø ¬'¼çŒs+RŠÈ“^†?[hó'Óå½äm.ÜuÏ9­lŒã<ÒÕw¨DÀ-Wû;ìbayædÝ›:ãç8íW‹(]ĸÎ{b ¹¿Ó¬£Y®®¢‚& +Èà)Ï¡$U-oÄn‰£]ëRÈ’[ÁnÓ.×Qæàd$ã'µW]{ó¡O¦Ëg%ë?Ÿ¾Q¼|›€Œ ‚ÀýáØV½µÕä~m¬ñÍâ»ã`FGQ‘ž•Z]kB‚Éõ)u u±BÁ® ‹å‚Íœuã­;LÖ4]j´éw°]Á¥ápÀCŠ»EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¨å·¶™¢ybGhŸ|e€%Èô8©(ªŸÚšwöˆÒ|áöãkö¯+>^í»³Œu÷§ÞÜÙØ[Ü_Üü±[A$’8Š2pOnÕV={Jš]*ÝÙµKv¸µ! Š¡‰'×¥EQEQH9ÁéHÏ »Ç&”•’pÉ5‹{â·Ôô+ uŽxµ)ncyUÿÕùI»€Îzu­ºæüIâ»M+LÔ.téín¯lÌAàóT3…;€$ŒéZ]_¾©ylímöXà…âÄ͹³ëÐ/¥6?xnk³§Å©Ú½àb¦•Kävۜ泭üc£Ïâ ÍÏn²B‰å7𻥓èÕ1Ï'è*k¯èS[]®›¬Xűžæ"ÒET}¶ŸºZÍ¿ñaÒ¯ü8·×¶i§ßi×ÜOœ+:*c$ýÓž 9­­#ľ×RwÓ/⸭U$2¼§~Ub_IŸNþÖŠåÃÉyüứü1\Þ¥ãý"ËWÑ,’U’ÖþšIHXPÑœ†ï×Õ­ªø³ÃÚ=À´¹šGºØ¡·ŠIÿVÀúâ´tíKNÕ­b½°¸Ií¥¤ˆx8ëøŽþ•Ïx›QÕü;¨XkFw“C [j`bÇå˜nã£sŒvÍA«ê÷ú§ˆ-4].ðÛZX"jµÊc:¤Y ãSÓŽõ'ü,o á.ÔÓÂ.¤Ð0¶98]¹îTzÝþÚ°þØ]7MboƒòyaöõõϵT¼ñV•c.¹±Ì[G±[Ûª>d`OÉÏ'o­/‡|KoâXÞæÒÊî+?.7†âtÚ³ÏÜϸКËñ…ö©q}£xcM¹{IµV™î.£ûñCËlôfèj£©|<šÎÜÞxcT¾¶ÖaĈóÜHñÜü2«n>Àbµõ?^éÒéú\kjíͯŸ%´qÃ3HØÂçÁ'Ò›kãðëQÞéÒÙêšM£]Mi#)›I Ž8*qŒãƒÔVQøƒ­&/Ÿ Lº9D’YdóUI²¦9QÛæàTšž¯â…ñ®oen²XM§ÎÀ‚«"å2åvžS ç=EXÑ|Yâ {R¿³‡CXì,/îlînä˜a¼¼ãbíÉ'‚s€3Ô×+.¡l<-à]CJÑÄA5°-¬B@|ȸùîGzë ñŠtíGL³ñ…¬Pjnb‚{Y„Rã"7 £¯b:žÕ¥ánç\¶¿šxR'¶Ô®íBH+`žäu®W×2e#Î{Qeâ_XÂ[c©Ãýö‰kÝ»[!_´¤ˆHrØ Œp Ïð÷ˆ¼Y«¶“a¯éz¬wM¾Ó‘UÙï;Ëe=s^Ä€H8àzדj~(ñ>“aw¨j>-Óíõ¨VI†‰Äê¡O’˜N:œŒVíþ«âíS^ÐtÝ.ù,m/ôF½¹o-YÓ‘Ênþ.@ç#©Á¨à×µ¿ ^x¢ÇV¿}R ;IS¶–UE“p(ÛƒÈààVo‰ô^êÓø‚in%²ó®ìÌqù[€YS ¸ãœsíéQΧŸ[Xô^Y©ks&§¬Eâ_jš Ú^Êša1haêØŒ­ž­¹‡§ÓC©êϯø*5¸ŽïH¼’á­Ïî.U0àzwZ5nûIñV¥!–F³´ðŒ×ßgÏÈdIO8õÀÇÒªYøKÄž‹k¬'ˆoSÄW0Çv“_ìèφòüvlºOj®žþÞñ·ˆá¿»ž;hì4Ƹ‚ÖFŒNåX ̤6ÑÎáœóÒ¶¼nm.üS¢½ÌÓÛiº”ijgrΑɶÝÍ’@=2M3ÄêÚç‰4o Ï$‘éÏgqv±¹S>ÂPAÛ“’æ±-ô/ øþÙ¬_±?†ïdŽÙäfX™$]Û7@n?Ö—·‰4hõmCÃ:Õî±~†q¨À襒SÉ&eÚ©ü?(÷§y¦ê:ýßÃ;?ù±ÝKk©¥ôBL4¥#^¡þ,dà÷­Ÿì}1…®êO§Ê4ϵêØ+3îÚ!*¼Nè3U­µËÈWĺ~©^ÞÙ.…s{kupŽ$·•A<ÆUÏPW9"’}7[µð|%:þ¡.­•½àc'îÈ!NÓHÇ#'®y«¾-›PþÓ²ŸR·ÔæðëØ.˜Î''“ Œ«‘Ž˜${U×c´ð´É¤k×ZŠO«Çe¥Iº´I9(w|ÅÀÎÒ@<ûSQäÓõ-oézôR}¶(ï…ÊHbšŸ{™z‚+Ôë›ñËÚ Dº¿¸³ŠY᪓4Ùoõh9~œW)gooeâ/ ϧhWº<<Öò4Ò.ËùCFϬÍYð÷ƒü9®\xª}^Ô^g^½#”’‘ŽUs€Ç=@ÏNx¬ý-¡¢øCÃ÷²É-„úôcûÈíYÌq±ô8P+[Qðî£x¿Â:m¬V¯<—i*D«„€vŽ2:g¿ã›«›? ê’Àæ71¤fEêŠì›ð×/ãï xGOðœ“ZiöðÉfmü‰cUrÁyn§ ÷'Ö´ä†/øJ¼HZql²øzÓä,e†ìÿ³Ö¹‰¬.´MÊ=k@±Ô4[&†hµ-6M’¢†dÛ€rz¯Íu¶pÛÂm¬°AmÖ@p:–`O×Ö±¼+¥ið|8½h`Ž9®´ýDÌáysó®Oà4G§=÷¯¶*2>_/Ìé¿È]¿Žz{ÖÞ«¹ñ–ŽÖª¢å´ÛÑ{´raÀÙ»ÛJÎÐolbøhe–dXÿ³ï"$ž7À®xÅCe$ksð©Ù‚«i“¨ÏrmÖ£Ò“ÅcZñd6Z¶g0Õi’âÝžS(ØÙ§Ë·Çc[ŸbU±Õ'MB;å¹Õn%2à GìÛ3dduŠê®­­¯m浸ŒI Ñ´r#t`G"¼ÏÃ:O™ðëZM]÷w‹| –¡(9?Â09­ CÅ~›ÁGmuo)¸ÒŬjÊd2:mTÙ× öÅCöþñ?†ÿ¶§ŽØ7„Å—Ÿ3­4n¥—qã8ç“Y÷zæ­_üE–Æåe·‹ÃJ*Ÿ”•Wɦ=úu¯BðÉS h…z6ÓÿpVïKÔ´Áo%Ä:kÍ ìp®_É™q¸ÉØy8ªúŸÄ­öÍí|-;ßëWHRÒ£l«7ñ>å*õ9¨òø† KÄR<–÷ú-µ¬·é(—“¸0Pp9M2Ÿ_ø^°ŠFÓ#ðäÚu´ŒŒ>Òï–b €H^8äž*ÅͽĿ £as/ü#ÖãËK#m9ü*=RðéZïïî-n »éóÚ±†6o.I6†?Ï¥kxÞòñ7Ú ’3ÄwòGæ)ÐíÃ.q{䡵ñŸƒ¼"öúMÌ×¶Záí¶â@‚I!º:ê+~æöûÆŽ…¾•{igczš…Ô÷‘lÁˆ¨ žI=qÀê®—©k¾¸×t–ðýíÔ÷¥ÕÝœð ò%Y°Fç$#¡Èüë2ÓIñ&Ÿà _J™õ 7XŠòk8Àó ¥Ã1Ú:rGµlÉ£jž!Ô¼BóÙËgg«ørÖy¶å$;ò¬?2çžÞõ·Þ>ºÑ†N4zœ–fÊKötû(v™ÜXärÀk[OÐoôßÙME´Û ¥‡œHæHä:çôŤx‰|Aâ{ë-¶ÿlÒmb³¹ló“wUëÇGzæïôxŠ])n¼)k§j0ÝÛÍ>¯±å<¶Ë Øà^kÓ/!’æÚæä1<°º,‹Õ =Åy•‡†|s‡§ðŶ‰¦iîö¯o6§ænû@#¶ݹûîn3žzWC¢è~"]S@Ôïà·„Yè2XΉ!fn\m;@ øtç­I¨xJ}WÄÅÕÙOì½CÃɦ°SóïÞÄœcÁÏ^Õ“}áÿІ…/†ÞãMHV€^æC$胀SRØÃÍÔàWya –ÖvIñAm·¦T`â¹;#âM´šµ…þŸy§ÞM$°Ed2[‰:¦†UþãÒ«¿5]2×ÂÍ _Bº†ƒЃt§Ê&8!NG<ŒtéV4ßko­Þkzþ£ Ù½ÒŸO–ÖÊÆŠX!,N1œç’On•Lø#ÆOa‡ÄÿÂ>bܱvÐ)ÿV_vÞœd.qÚº];ÃÿÙÚÞ§ª¤àÃyignÿWäÎyÎ};IÐŽ™©ëÚ‰¸ó«q Â=¸ò¼¸Âã99Î3Ú¡ñ†Žµ%õìš~©`Îm®£PØÃ+)à«~Z¡¥ø*êÛ^‡Äzž±5þ ¶RÚ0dEcFÕ^˜ç¹ÎzÕy|v‘\iÚwˆnìtK†röQ$d s–Xä#r©ôç«a<%£ÁsáÙíwÁ… ðÚ˜ØVT wdÆ3ׯZ²tC¯§ˆ|É>ÒºsXy|l(_~zg9÷ªƒÁÚñ9ñ^û@ÚýŸnFÏMøÆwc޽;TZŸ‚ìïõ95[mFÿN¹ž4Žëìrm„]À†ä5™ài?ÛÚµÏÙuh WVï)dbFùËoaÔ–5.™àMƒH€Íwsý“póÚ=Ä¥š2Ë·oo”ƒsUðÆƒ¬êN§}oæ]iR4–­’–ÇP:ôg½I®xGñ A¨DÍäÈ%†HÙ’HŸÕH`~†¡Ð|-¡xpܽŒr5ÅË=Äò4’ÉŽ›‰8¹­ª(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¬_/‰þÏm.†°Í$W®-fÀ1`åCp{ƒù×9¤xjöë^:ÄÚ$+a=«Ç «=É—¶À Û’sUSIø¾¸ð¬vVˆ±ÛÉmûK‘,\ãäÛÌ8äàuç¡·/‡¼mg¡jz_ØÞK ;˜fvVeA p;ƒƒÓîóV Ð¹ŸÂcëp‰8Ób´m%w"¹éÇ­E¨h>$[Ë}CDÕR VÑ-g‚åà)È`¡× î" ‡Á"k R=NôË©jW1ÝKwò¤Œ†5ù±·ÉÏ94¶þñÍí•ν¯È,eÃoB%wL3G§=«JÅuÏíýi§šFÒü‹1jŽª$Ãy›#î“’y8)þ"Ðbñ¤P‰-§·¸ŽêÚxñº)S889sÈ5/‚µ;¹¬¯ï|Ew.¥g*¼3*F±ªÿˆÀÛó¤äÿ*ÝÑôX4c©˜¥y>ߨM|ûñò´€ ÀÅfÿ£ÿcÿcù×VîKÈn€–YËBÎ:æ™ià›Xµ ;V½Ôﯵ á%×2‘Šª sž9êk£º¶¶½‚k[˜ÄMG"7FV ×(~ø~[sgwy¨ÝY®ß" n¤zlÆ:9ÏÐci¦þãRd-=Å¢ÚH’¦5$ãoNüÖ,¼1‘k·³‚A$Vo;˜ƒŸ¸O#=ŽGµiÝøoH¼Õ­5©«{lžZ´r2«¯<:‚=ÅKm èözQÑ!ƒyŠXŒE˜ådÎá’sÎOz­{á ê6ú}­í‚OŸ †Ô9oÝ©P89Îp=G\Ôº7†¼? ÛMµIpA–BYñÐbNaœU/ø@ü nç¾m&švv“vJ’ÝNÒv‚}@«—Þð¾§iccy§Å-­‰CmmÆ8Å;Uðφµ·Ž]ON‚æHÆÕw_›o¡=qìxö­{{kXc··‰b†5 ˆ€P;*J†ÖÒÎÊ!¬) @³@PXäð=MWMCŠèßG§Û­Ù$™„k¼“׿ÆZžêÊÂþ?&òÞ)âÎvJ¡†~‡4ä¶µ‰vG *ì …PÑÛéR Ò–˜±D„²¢«¤´þZ:QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¤%Tc€I=©#’)‘$‰ÃÆêYNA¸4ê(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¬oë­ 2V·ó ºÔ!´™÷cÉð¡ÈϪ¤~-üW/†~Í…KC(¸ÝÖ@ŠmÇ÷N~÷áYÑøæòîÚÜÙiË-æ¡©]ZéÑ0²EÃJí·…ÀÚ¯XëÚý®­i£x‚ÒÝ%½ŠY-n-ŒncÁd`À@ärAö¬í;]ñ_‰-ušÊÒßK/`g.Í$ÅA¨À3œ÷ÅWð¾¿s&“áÝDŽ)¯cÓížîFÏ•i8Ý‚2Íü+‘êp*Þ¡âMzç_¾Ðt»­>ÆK(á|Þ†f¹2 þíC'Ê:–çµtzÖµwašÅšÚ_+:K0d;N)þëuäw­*(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¬im­hzŠ Í%»}¤^Sõ¼úk?ŸÂMŸ7ü$-«Ív`Ú|ÍŽ†m뀸?…nO¡j>¶ð…õ•£ÞÞKk«x@ó&P2C ã½Z‰µxƒH¿uÍ–Ÿ¤-Ä›î—kÍ,«´\“…’~•oÃ:~¡káûÛ9`xg7€[!¶ž§ƒÔW5¤x_TðÞ—áýoIÓ]uXGªYP×ÊÙ|äãzWŸjÔñ,—…ÌZ·…W\Ó8Í”°,~l'2¾÷S×WÖ¦ðÝ—ˆü1 ¤QéÍ<²êLÑÙyÀ›Ky½²ÁÉ×»:(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*½­þ}æýŽê)ü§1Éå8mŒ;ƒV(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¨Äöæcn%C0@æ<ÁO|uÅ%ÅÍ­œO=ÌÉ )ÒHÀ(ÉÇ$ñRÑEQEW'?ÄO E,É ^]C+5͵¼pAe8ïŒ×C¦êzn±i þŸ:Ïk0Ê:÷Ç_pGppE[¬í?Y±Ô®õK(‚]6d†mã–]Ãiî1OÕµ1¥[¥Áµ¸ºÝñ~“âˆnž aY­§š9!IUØ"± çÀaÈãñ«–&ð¶©pöš~«isr™ÝR«0ü¢ãÄÞ´¹6w¥´wBxíÌ-"ïó$ªíÎrsÇVóÆþ°vŽçZµGId‰×x%pÆÞäà FñÇ‚þ-0ëÆîVED KŒ¨Ü>\žÃ9©õ¿øcíz¥òÃ,ª]#™Êާj†8÷Æ*æ•«é:åœwúeÊ\Úɲ!ã#¨=ÁÁÅVןyÒC,,r C÷‘¸ÊžÇ•­xƒÄ2jçÃþ·¶’ö+U¹º¸»-å@®p£ Éfäã#¨¶¿â«‹oh—pÚA¯ÙX‹ˆÝK›y¡“#rô`FÆO8æ¤øWg{gá=3íÙÄ&‚9cû*‘¹YG2ysÜŠíh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÑ÷ú(¢Š(¢Š(¢Š(¢Šç¼E­êöWz^“£ÛG6¡¨4¬}Â(cˆÌÛFIçd}j-^×$ÖotfÞÝn ¶[¨¦µ-²HÉÇ!¹sšé«šñN·«ZͧhÚ"ÆumIŸË’PLpFƒæv®;æ³/ôÿ‰š-£jZ×öÄð|òYK(™sÈB˜ ã§^kzûÅ:.“o§Oª»ÙµònŽ7RX0\•;Aät÷< ‚óÆz¾Ÿ4«rfÔ7}–Õas<›zþïwνK§x¯DÔ¡ÔeΊM97ÝÛÍ,± 2§ÔŒdZÉÿ…—á£oòÛj ¦±P÷¢Ý¼˜‰êœŒñšM_Åš…Št­2K¹¬¦‚O3ʈ+6 ²¶GÊŸÅõï]|óAm³Ìá"‰ÝÛ¢¨$ý+“Oˆ6&(ïäÒu´iÛ¨¼kåàœ+»xSØ”Æ+?YÔu;ÏéšwØõ²‚¼Ê‘ÈKÞ¶$RȽ=ºA®·ÄE×DÖ }ÉR§‡¡ìk‰Ñ4ÏMáý6çSÕ+©l¢–i ôÑ’sæuÍOáÏj>±¾¼ŽãRžâý¬´îžeÒ–"2Ç ,{ óšÝµñ6¨5[m#UÒÎkÈd’ÒE•]$1Œ²’ ¡ÍbxcÄÚÄCÅ·šÜ&; û—wi·˜YUt‹´e{ƒ‘ÉéWgñwŠ4ècÕ5]môgh÷È“îžâ’=€`wÚìEO{â_¶¿s i:l3‰ }škk÷ww(Ψdûˆ¨2H’[ªËâéZmÚêÖ0M5ll䭽ɗî¿$’Ã'§½BÞ&Ö4kí&=CUÓµ{û¨í%KpHd“…eß+œžG\ö¢Î÷Çšþ§âKmFÚÂÏN¿0E(ƒ|À8;›nsŒóíÌ0ñ ¿…ÞöaßAª:îå#fŽWÁ—`$ð1ÆzŸJ¹ jº´Ú‰x¼Ce­èæÑÞf@‹5»®1Âu î+ž>47ö²êGÆÚ~›xÁ¤¶Ó[É*ƒøV]ß9'¾ ã=+Ð|7¬.¿£iÚ P¦æìä6¦zUû¸E͵ÄÌbX^=ãªîÈúW¤Kñ'ÂV6úkx~ßT³·cšÊeFÛ’yGŸ¡ÿ§&«£Áá VóÃ"ëL˜k0›¸dÈ’šDÞ¸%€c…ãu5½¿²O›K‡‡Îñ„lþ8Üœ©ö5ÏiºÚÏ‹–îÎÜë¶VÌÒ($Å#ËÏcŽEV·ðχïüqª%Õ”R[éúe€µ€å§³¦T /v¬}LÉáí3âE–Ž¿g‚+«'Ž8›hˆ\…ì¼dñÓ­Α¨ÛévæÓšv‰=”ÐIk¨5ÜKå0=Y‚‚wt “œ×¬ÚkVšUп7‚ÞKùžÂ+æÌñ[ð9$ŸR$UµÕ|1â{í~ 6ãQÓõ[;xnЖaÈS´‘• öèiº]†·¬j> ñ%匶BçK]:ÂÖm¾iw1g 1àg æ¶¼iaá ÒúÔ1G,gV§¿EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÒ÷ú(¢Š(¢Š(¢Š(¢ŠÉÔ5‹5-s,sjp\y¦1È œ†ÁÈâ¹mÀøcÆÙ–÷Òߦ©e%ÍË]óÂb )߀v€ס®ò9a”«€ÅISœÚ¸¿ÝC x§@×o>M>[y´ùç?vc”-è ã5ŽdÑ`´ºÕÿá$¾·™íöÚÛÙÜáe“]¨''®*¥ÇÛÇÂÙîæiå•'fw9.Â,äŸ\ŒÖ§‰u)ÿá(Ó´ËY¬´ë“¦Í0Ônc ûK`ÇJŒäÙ'ŽÕ‹¦_YɬøÊíuÔ&} ?~BÆ5`Û€ ®{gœóZŒÐ¿ÂÒãj¡ðöìö&sL»Ô´ý?WðÝíÂ[Ã6™s’C…,ѦOsÚº_Ø^êžÖl¬òn&´F£«Î?•ÌÝø×º†O°™&Ô®l¾Çœ£÷Ë#(]¥:¤òN½[Óí¥ÓüW¡XÊåå·ð©‰ÛûÅA9®Ÿ^ÿ>­Á?è7“÷jç|áß ]xsEšãJµ’I-#vi"]ÌHêr;Ôž:»¾Ó¬tß³Í=žš×‰üö‰™!‡iû¸8€H®^ t4ñO†5 2RæÓ̹‚]BàNèï*a@ßœ õ!UFzðq4–wZ‡ü, ¤3%ýåãêÎѰ‰×ToÆÜ’1×ùP{Oj0Á§Úh:ÝÆ§;¤sÚÞÍx°Cýâò3Ú;mÝšítë{¨|c«‹h4›4I „« õæ¨>™ªOwñ$¶“¶°%©`BÊÞAiï϶üy=惧‰ìîm&¶‚+i#¹M¬Z5?º{VF¦u];ÆiªG¤Ý^Z¶‰ömöáN×2nÁÜËØ*_Ô5Ïh:ÖŸoáÛø'{Pbóü $`Ãå¼<÷ç޵5ÚøƒÃºÝÖ«g¥Ë©ÙêVÖéq» –b•Hëópj­þãé7„P¥Ôzœ7º~6ÒŠ‘Ë9X’üç’ô–š~­¨êziO ÙéöÓ ®®&X^FÚ2-¹ÆOñjÜðÞ—¨é×Þ&–ê=‘^ê†â܆rQœœŽõ•k£øßOÓõC§´1Þ7ˆ./cŠB \[±#1]ÞA¨4ÿjz—ˆlµ«½×EK8îVO*Ei.ÌË· °(Ú:òIÏjK}'ÇÚ-‘ÐtË+ âLVš”¯ƒg§™ÒK/lø®œ[ø’ÊÚÖX.V6TÔ&¸;¨²ÜO¯§umå¼ö³®èg‰â‘}U†®#OѾ'øvÖ='K¹Òîì -åº sÀ`¼£Š™¼q?‡u2ëRß©ê·?lšíS ³¥v¦~èÚ;úÔWžñþ».‹&±©XDšn¥mxaµñ7–rIfn ÔÓx_Æ6zæµ­èšµ²hù ÚÜÄÌŸ»LYXƒéÆ8ÇzÄñ^•ƒá‰í¯¯ÖëYÕõ{Iä|k‰D‰òÆ™ÎçÔêþÖ›T}kÃúšXÞOCuÑy‘Nî±”†^™¥AÖëIÕ,uÍFkëÍNE’{‘òùl‡)å.HPG\ž¹¨¡ð^·w{§\x‡_}JßM™g¶€B‘†•~ëÈFrGnœþU£¦xjûK×u=NQΟ¨1–KàJ@ƒõíÒ¬x§ÃãĺoØVíí&IḆâ0 ãlƒƒÁ¬û¿ÝÍ-Ž£m­\[k0Z%¬÷ˆˆEÒyzò1ŒVŽáë} ]Jn%»¾½u’îîr7ÊT`pÐ¥ñ'‡­|Kb–SÏ5»GqÄ3À@xÞ3ÁRAþTižµÓ/fÔÍÅÅÔÖvÖ²¼Ìá8c€>fÏ?ʇ4…ŸZÑ¥þØ‹¨ä9B6àÀ޵iðï@·šÑ线½·³Ikkw;<0°û¤)ë·¶âØ®º¹Ë/ørÆ}jDId‡Xgk«Y\´$¿Þ*‡€[½E¦xš]ìñGq4ÖÙû0¹žI ÿÏ5v ~U·k¤é–Wš†¡oË«ó¹|ŸŸË^ ÀÀô›g£i6 ~–ÐÖþâ[› ùäa^þب[Ã~mx}¬ÔéB%ˆ[’qµN@Îs×Þ£Ö|'áo4ªiñÜIíŽCê=7)Ù«Úf—¥èÖ±Øé¶ÑÛ[G±Æ09ê~§Þ«k>ð߈R(õ: ʼn·Gæ¨%O±ëÏzd~ð”M ǤY£AnöÑ•‰FØß;”`t99æ¯gi¿cwÙbûˆB Ú6lvôÆ=©·zV‘¨E¶P\C4••Hé€AÅ:ÛOÓlŽmma„ùkc@>E較µNé¨É"†F2°È úÔ6–:~ŸŠÊÚ+xÉÜV% 3ôS¾Ëgç}£ÉÏÆ<Í£v>½j\ ç½.sÞ“ ’qÉïKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÓ÷ú(¢Š(¢Š(¢Š(¢ŠÏÕôM^·ºª\B®Cg*ú‘‚ÐÔZ?†¼; ßL²HdœæY9.ÿVbNÖ¬éÚV—¤E$}²[Å$ÒNꃂîrÇñ©îmm/a’Úêš 9*ÃÜÈÓ|àÍcq§èö–óüéÏ>õ¥›¥Â¶‰¬H¶`‹`~è—ÓJmþ•¤jª‰¨YÃr±¶ä m§Û Ò®—¤#Ã"Y@¯ F˜"åõQÇÚ§öË·X@`Œ´/¦:b™5ÊÆ“ÛÇ*ÄÊèA GB3Њž£[‰ ¢$®ÉüiøÎ9éKEQEQEQEQETR\ÚC,0Ë2$³–#0 ûFNÑßñRÑE ÖvWC4ÐG$°bwPZ2zí'§áSQEA-íŒÛZÍq\]oFÌI°e¶Ž§“Šž«ØßXjVñÝØÎ—ògd‘U°ppG½X¦M*A“>vƌ편±ü1âŶO¦i)‰ÖUÃ)À<Œž úÔWž/Ò,üE§øeã™ï¯ci” ˆcóƒ’è tU ícOÓ®ôË+‚âmFgŠßj’ "–9=¸ëûÆÂk—ú— K-”0Í$‚hÑq Èûß•O¢øº]CS}SÒ§Òõ!nncŽVFIc«©##¸À®›r‚‘“ÐQ‘œgœgnMÛ7 ØÎ;â‘Þ8ÕžF Š fc€õ¨m/´ûô2YÜÅpŠpZ& ü ¨&Öô+ÏÔmcó‰ï•Fò2yÁô«7VvµÅÌñà ´’0 ¹‚ºOÄÑZ$Ô¯á¶yA(®Ãq©Ç\ç¥0x—à kwzº³ZÚ«‚±–Œ‘Ç9Þ%ðÝä7÷0j½½ƒ”¹—?$d Ÿ˜ñùPi>0ð¦¹pm4ýA$¸ XFÁ•˜¥C;ã4º§‹¼3£Ü5­ÝÑóÑÈ‘£¹OwØëŠu¤ÙÞÍo4In(RÇh%€ü§·O¥jH‹* ™a³†HË›¯(à³¶á´06Ž;æ²#ñ—Žnü?á«ÈÖ=WQÖå±™O–£sß?.8<ãµoj­ãm>ÏJµmbÖ=òJuZdE/TTŒ¶2zu==ë?Âþ)¾¼Ö5}k–ÚÌéßk†òU1¾í¥ÒTãƒüê…„ßµ/ Ëâ/"æI®#-ãòägýnA9l @=(ÖbÕ5ígáö¡­=ƒj6“º¤IòXÁ¹Š–Fåº玘¯G¾¶–êÒ{xîd·’HʬñmÞ‡ÔdŸ¨5å~¸×4¯èñéÚŒ­w­êa€ÎªRÌy¯½Ñv©ÎpÄóíÅt7¶Ú߃ntk¸µ«ÝBÎïP†Êò ÖVÏÀt!T‚§°È"»[Å kr§ap*òÿ‡@hsè¬Ggâ #$ö6¤ç?ï!ý*-8 ïx{ÄÍ–þ××ïÌÿϼp2Gn ükcBÑdñµ½Î¿«jWè×w e ­ÃÆ–ÑÆåWŽ2Kô¬‹­C_Ö4?ÚË©Íì-T×6Ö™²–㌕ö#<ÕÏø/öz¯‚í¢E$¿ž'Ýq1, ³’Nþ¤÷àöéÅH!ñ#x÷Ä1hW6¶ìºm‡šn£wÈåÆ?“Köþ‹ãm2çÅ[ÝJÒâÓOžØKmƒ{†ŒîÎáü[ÏÒ¹«‹QÑ5‹ë-PÖn¶]ÜoLDCz䆌³†Ú¸Àژ⺧’Ú‡ž4•Ù¤K[[=BCÕ¢»@71ôW9ükcÂñ¦¯âø…—+«£Ú7ûàÉbÿÊŸñûâßG°¿‚îñ®5hl-vÿ¥´`²nÀòÇVÉ…¦Ú\iþ9Ðd]ÛDKÍ>ú9#·‘I—`oTU^;}îý;¯ü!á[ß jWzm½ÅÅåÞ¤²<ˆ ²2€¤çëÆ9æ¨è~N°>麢‰¬ZÆútŠNRI ùP0<‹œf¶®4½Nø—¢ÍePÍu£Ý‰Ö5;O @îy…n|D†¼!â*+°™ÆáÐÔW?ç™i»>žrUˆÐËgiá8,RÚ(õëDu™O€+lÞ>]ØüqQê°k“x‰«jšlwQ^´Ö±ÛC)šTÙ‡\î!PޤñÓÒ¥øw£ÙhZßö”ÑGu«©6­æ‘æCËg±\cµgiØrx“À3è–¯i¦I£êím ƒ)e9Æ[ƒÔsÒ§øi¯xJÇÂ÷b{Ûx ¥õñ½:‚¤ÈpH'ºãáhf· 7©%º×%…¨ŠEfOЃô©4)µ:OÚ]xÆâßX½žky¡‡%dmË g Ãüª+;{ôïÜCq=ͽí$ºc/æ+òˆ2“Êôëœ ëüNÊž5ð=Yµe÷äV“©èÅñG¼„ÞÜjêSi©þºhW%A#·¡¬»]^ÏL:$^ñdÚ‘¸º¶ˆh÷;edˆ‘¸gÓ`õR¿wŽë>ÚÚÑt‘yíµßb•!hâù™²±«vç$k±Õ–/øM|2X.ï±ßc×€+\‚âê÷â5µ¦^âM&Ã÷i÷˜l€=HȬFä^ør$ŸÆkui{ 0Gcki ™ØàU Ê~˜®³BE‹ÆZì,åä‹HÓT³}ãÁÉ?ZÌŸç—â¬I‚E´Ghë“n}+wÃÞ&ðÚø{@˜ê4r­¦ž¬§9¸(Ì᾵Ô×ñÖÊqáfžŸYEó ü®Náô8©|E1"îr:þ_NÒ¼l•Ÿyá¯[Øø"]9m%Ôt–9¢™ØFá¡òÛ ž;e»±œ õÇ5ç¶ ñ\z)Ò'º´ŠM7Pº=Ô{™·fýêq€OÍi®‡âín÷L›Ä’ÙGk¦Î·IžóçL¿t±|aW¨rk­‘<ÈÝ?¼¥:âgðýǃ¬<;ý¢°êd4W‘¡Â¶Np7¤½Z’øLá4´¹A ¸ùJäÊ¢=˜ÎF=z¢|)âÝ2{Äðæ¹ ¦yq%ÃA=¾öäå¼£¹F ç*Ïü!éúŸitñ¦•©Å¨4Ž7<줖Ür9by=½*ÏŠ¼7y¯¦-ޤÚ}öŸt. ˜ qЂ ’ëY÷¾ ×$ÖgÖôß½ÅͬónËïótÍX±ðfÝQugTŸU»Š!·ª¬p+Œ6ÔPæsÅgÇðæE³}__6ƒµÑl”"Œsµ¤ ¼¨ô㎤ÕoG¥øcÁëá{Ù®uIîm$´°O/2JWÈ»FÌŽO§zê<'¡hZn—ÒAfoïHçsœû±4xÃ6$ŽÐM<ö·6syÖ·6ͶH›88#uY‘|>ÒRþÃW“PÔfÕ,åÞ.¤›-"ž¨Ãv{*¯^µµ£hz~‡`Úu¡ÀežCæ6NebÇž8Éâ³äð?†äѬtFY„ ¾Öe‰¢l“¹\`çŸþµo‚<;¦jjéö‰õ(¢’/µ\Lîì¯Ù²qÇn8çMn_YZj6—67q‰-îbxeCüJÃV x  £Ã¡ÉhÓXÃ/›–Gg½UÉÜ1ÛUÝÂþðñôëb“O´M4ŽÏ#…è ¹fÀúÕÝOKÓu›9l5ö²íßg ´‚:c¸©.ìì¯íå´¼'·•vÉ€aèA¬­ÁþðôÒ\éZlVóÈ›A’Û}bH—Rð‡ƒõ‹¥½Ôt‹[›•y’ $ã¦}qÛ9­&Óô縶ºkhŲ€UmcÆZ‹t¶2ý¢æôÅç5½¤O#¢y‚ƒõÆ{Y:ŠSQ›Áwšñm?QÕ^НßQ¬dG±®›NÖl5Iõ;{mþfuöi÷.ý¡¸õ5™'¼?åûùÁ-µÓ¼½„É,ëü1¨ÎsÛúStß隥ôšD¶·ºuù·y£Šî="¬„\ûU Å:EŽ“á8¼ÍBê^G¶·»»Ú_x'c‘Ët·®õû+MbÇE1È÷Vóܳ®6CÄä@'€y¬'ø‡‚MN=P—CŽíEU6d[Ì(=v~×Á471E<.)Q]teaGÖ¤¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š+/_Ö£Ðl~ØÖòÜ»MC7Hò6r@‰¤‡]„ßYiw0I¡sd×f>P)‚ÃŒäÖ­SXQ•E Ý#&•ï0Éô¨åŠÀnšâ1n|ÒÃn>½)Ö÷·q,ÖÒ¤±8ʼd?B8§K,0FòÊê‘ ,ÌÇ@îI®zëÅ06© Zi—·V÷÷Ü2>æM‘–ÚqõÏj½¦êrµ¶¡q©\Ùí¯.#ó |¢F‡0žŽÞ©,ÒÈ &K‚$‚aSYøÛK¹¾´Óî,ï¬e½Ü-Zî‰18'œsƒŠÐÑüA§kPßK’/°ÝMkp“>½ÏÇ5&‡¬[ëúu¾§o±C>ý‹(ˆV#8ðq‘ÏJவ}[MñýÝÃ]Ltµ¸°±žcå§Ú¢ùX à|àdàu«ÿ//$²‹H²šH¦’ ›ùž&*Ë²ç¨ üÍִωeÓ¬´->ÒÊ]GV»Ó£™ V ª2ò;pN;äö©ì¼]çjZßiòÙjzu™»’ÙÙH’<QÇd`ôÁíX7Þ0ñ>­á­[R±Ðåµµþ͑⹒áUÁÚw2€ É#8â±üSw5ÿƒüsâ(VN±¥5Ã4…üÈŠrì@{œõúÖŠ.~­´QxVHíüD÷P­ƒÛïn,ÇjíÆs’kÒu=gÄI©ÛèúV˜&”Úý¢{¹Ë-¼c8 VÜäöãšÉx†=+Ä“>“ö®…"  IKE"r¶Ð~îN ö­=[Å2[ÛxvM2¸›[»·Žb@XÝw3ñýÕ®‚æV‚ æXÚVŽ6q}ç gÜרx«â‘¤§ˆu+}6ÞÜ’]5ÙÄêŒq€ùÆüvÙ^†¬U‡p pzv¯ñÄSkia.eª\ÚÇ,‘»™¶€ëŒw99좚þ>Ô?±­·Emm®K©É¥J'b †Xò]ÉÈ;@ä ƒÎ3N²ñF£§ëZfŸ{­XjÖš›¼*öûVKy€ÈU›(Ý©¥ðÖ¥ã`_êwZ…²i¶wWðÅEóÎ ±8O çõªZ¿õß[kÃZ¶‚àÂeŠÑmÔÇ0Lýö'#û8Å2ûâZ…¿‡¡MZÛC–ž××wS& §nÈ·ü¥‹g“œҤЕáiuí#Á~¹‡V™…î·kB‘íŠ33Uùs†ï’HìEwÞ&½Ô-/ü/´íw:°Šu\bEòØàä3éŠåu»øŸXÕ!Ö|[qfÉ K  ³†B*ÁSðì>M¾ñ6¬Ú ¶[GÒ"(.<Ìm1*óƒÐ‘ŽõéZuö‘áÛo h ,7V X¤›0 ,¬ê6ä¦{WCEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¬íxk ¤ê#H j&ÚAlN>þ8ëÆ}3ÆkÍô{"×PÑU¯õ­VkˆÒâ=LÊñ^–á“,Æ<±û¤mǧJÜÑ´˜|e&¯«j×7.¿o¸´´‚9]Ù!;r•ùÉä““éX:…«jš[j“Éw6‘âuÒÒáƒI‘~öÒ2Ø8Ï^3‘ÍjÞxWÃQøßB‰m[oöd²àÉ!ù *çwaù÷¬«ˆ$]7Sð$S:M/ˆ£†’Ym¦>p9ôH­MøøŠÿÁÐÈß>‘¥Íwx¹é2þàô!c3Ãú¥¦«ygáÛjI¤¹˜k7†4ç'˜™Žý©ü;P:Õ«› _GðºT´¢{I¼ÝÌwIˆTHçæÆÔ½¯[ºx›LÒ,ô$¿°°ÒZâ éHí&Ýå[‚Tp8ã5kÂVZ­‰5ipé66),–I:9óƒQq´0È< ‘W¼j‘Þ^ø[L»éך™ ~ì†4,ˆÞ ‘ÐõÅP×t}Oñ‚®¬­a·¸’{¸œD¡w"Äq1Ó·Ö²’ KDñŸÛ-ìæo\}Ÿí81M2¸+Ž2Óô5¥j×pøŸE"Ð- Ô&ŠæÞÎþÆRcp,®„)ÆÜéYw[ø´P§v tY…t,±²±Ò<9og E Þ– Fýœ$Ö4?Ïá‹ "ò˧Ö-oÁ¼¸¡ùÛÀÇã$Öo‹ÿBÕu{K$x¦Ú Àà\¿Ó(rMz-…œu­”[C)ôA\%Æ‘·­üBÓAÄ“Ùi…÷$Åà@¬ë ‹Ÿé,ñ%ÜM©¢¾— äã-)йý*ݦ£†ïô=oTYN¾ðÝ­©¹Ì!•0B¶ 6x÷«^zø—SÕõËåm2ÜXÅ1B>Ñ#Ç` éÔñš¹am5ÏĶH¤—î‹3ÀÇ\šæ5=RßPðW„.­m®å]7VÒ’á ©·_ŸåÛ’¨v­x—Oñ‘}¤iú£{uy Å Mi$q«0á™åTPó×5¨YÞYê~ŸâˆuKí& Ö°¬­— 1'š"ù‹áÝÆ=êï,–ÓXñ=“è7:mŽ¡¼ÖñÊŸ#FªU·0,7¶rA9ªžÒõ7ñÙÞö¾ŽâÊÑÿ¾× JŸªÇß­z&³¥6—¨Å¦Éåß=¬«nÿÝ©Ú:òÏI¨xjâÂÃÁ7?ÛÆÐGuy³våÁb’331cœcžH¯aÒç’êÂÒy-¤¶y!BÐÊxÎ:6 ükÏ<9«ø—K»ñbYè2ê6oâÏ)à’5d“Œ‡Ëòô Œý*I¼ ¬M¤[^\ÚÛ\ë+¬Ë«ÜYÈA†S(ÚÑd‚8\`‘ŒŠ»¤iZ½Îµgrž°ÐôëMï)d…§ÈÀP|ª:ç9>•­á+QÒt}NÞú0%ö¡2( æ9•ÒßM»=µ»;™2¤ÜUy†;œšmŸ‡|y¢]ëhóé¿aÔ¯ç¼ûEÂÈg…¥ê Žoðå…T²ð/ŠàÒ¬´©ïíd#‡R†p4‘,ÁÇ@Ç©¾ò[±t—»QЮÞ7g€ }á[—Þ µ¹Ðt­ÚéígÒE»ØÝ¢‚ÑÉÀb§‚qß5—…µËFËRñ¬—í§—{Ha„G; oo™É`:rô­?èB}e…Á˜j:¤÷ø+/ÌåêsŒu¬QðöÝt+ &=JxîôëÙo,¯‘@xÝ›§ ŒzŠ[__kJñ­¯\ß_iþj Ø‰WR¸Ø£Ž¹''?…h¿ƒô§ñL~,ó$‰dm¼¡‡¯ÌxÎìuéNð÷„t¯ Þkw¶#I«]‰Cã É;Wq’O9ëUÀ:èúMpÑZܽͽÆà&†Råƒ+ ž8é×5·Ãý95=7Y¾Ôõ ýGOvhe¸‘p)vªªãè'©¥Ô>é7—7sÛê„w®d»·´˜¬S³pÄ® wÚW5.µáXäÑôFìÐY_ÙÉG*#Ž&Ëg¶Fx=IÉ5ÔV~‘¢izÛØÆR9îf¹pÌN^S–<Öü!^:${=útd‰›tnX¶ålî$ò©tO ø{@š[›(dk©PF÷ÈòJTç,qì \Ótm'H±þͱ€Ei™O—’Ö[’Iä“Þ¥Ótí?H³·Óì!ÚۦȣáGã“UõAñ m«YÇs6ô9Sê¤`ƒô" ³ð§…l4Û×N†=>à0š8“=w§>äÕ› @»ÓãÒ®4ûytøÕ-ÝB}Ü.1Çj‹TðÏ…õ³nÚ¦—mvmÿÕ£V(=GJ¶tÝ,¥¬fÒ–Œ¯l»" `ウ*+Ý@Ô¦ŠæûN¶¸ž!ˆä–5f_¡ Õ±XySCöx¼©ÙšTÚ6¹n¥†9Ï|Ôv:V¦+.Ÿeª·,!E\ýpXŽ(¡AH¨ƒ8Uð§*"¨¡Tt¥7ɃÌó¼µóqøÇÖ«]i¶×—Z}ÜÅËXÉ$‘(?.÷R¹#¹œsÞ®QEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(ªZ¶žº¶Ÿw`ÓËÚ"dÂÅ] èTŽâ¹á_j-aˆ5«{«+˜nÁnRIš#•ÞÅØuëµFjÄžñ•åüú´,­¯æiæ·– I|ÍܸÏ\ŒÔà«A£Zé]ÈôW²\0 óH¯¹‹toÓÓŠ³­xrëRÕ4ZÏR’ÊâÇÌG ŠÂhÜŒ©§N´Má=:o[x¤qs¡€DÚO#q8Î@$u£Bð–• _ëz…³;I«OçHNIÚ¸Œ’yÍfÃðþ(`}5uÍDhìÎEˆd ªÇ;C„ß·Ûw×5oMð]ŽžºµõÕÁÑsjÒÉYWnÖÂŒ…:­]Öü7e­ÉirgžÒúÓ‘slÛ]CuSASÜi4/ éÚ ÝÜG,÷7·…MÅÕËî’M¿tg€ìkYÑ´Ýzͬ¯´e•ÑñºôeaÈ#±¬‹Oh6×Ö:œÓ^^jLLWS37 ŒÀÇ>jãøGÃrXêZl¶»íu¹o.™²er `s‘Èãb£Ò| è÷K}Ún/#s]M$ŒŠz…ÞÄ ÷Àð7„Ùµ’Ö®WX9¼Í}Œs’B†À$ó‘Š×¿Ò´ÝN( ¼‡ÌŽ âž5ÉxÎTðGJÌÔ|àíZââò÷Mî®I`ç`Àù zc5~×BЬôßìˆ,¢]<£!ƒV ×9Îsß9ª~ðU­ô›uhåŽXÙ†æFîí-’1ÛUùt= }F ^[[QvGpToQ‚8?‰¨$𯄥Ô«&“h×áƒyæ5ß‘ß8ëW¯´í3SˆAkÌAƒ•CG|Ò[išU“µ´†X„@Æ€™ÎÞLóSË YcW Á€`èyî*m;K³’Ymm!†IŽdxÑAsî@ükû]¿ñ:ލö¿Ùúœl"‹vòòqºBxÈ1ÞºJL “ŽOZ\ L cRð8QE^ú î­g‚—¶–D*“F´d÷úƒT|= [xzÍíbž[™%žK‰î' É4ŽyfÀØ`+ZŠ+;JѬ´s¨f‘õô·²ùœ<˜È_AÇ´h¤e ž„`ÕM+KÓô[}:Â3­º•K@'=I'õ«”QEpyQETBêÐÜA4fäF%1nÂØëŒ÷ÅKUîoôû9-b¹¸Ž).¥ò W Âúœ ±Egk:ÕŽ…o ÍØs·P[.Á“ºVÚ=8ÏZÐ'ŸAT´}M5‹ }A-î-–pÄEr›$\>eíÓò«Õíå¶Ÿiu{pJÁm “H@É ƒ'íY*±Š_ $PÉ,zó‘‹åïç‘í[ÕGH½½Ô-âîÂKŒ’)‚F€V ¯0殂CšZŽ+‹kÆRM§að¦Kyco$qMqrKÄhìo =jIe†ÞYc³;¹&¨¶»¢ F Ûy­ BÍ"H¥r;Î}ÍcXx±õÍ7BÔt¹,P^]@—qO0ݸ$ªíë' 8­O^ðö‰åÿjj6Ö~iÂyò*îúdŠ’m_F·µŠökØÒfEŽbë±Ëœ( œžœÕ;/øCR½m6ËX´žõK&9±Ç\yÇ|T:n·tÚö« ß…D‰ydê0%·~9äüÈÙ׃Šß¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š¥¤êÚv·eýƒ—·‘¤UfR§(ÅO ê=*íQEQGŠ21¦ci;tRFOáY:ž·.Ÿ¬h:`€uÁ?)ÏÅjÍ=½¼m4ò¤q.2î@>æžÌª 1@É' Èèž2UÔ5“-Ö—`ïgÎW W÷§¢3œ¼÷®’SI¹k¤‚ò×h àùYþ÷µ™Ä- äÓ¼ûKë[]Fa ¥Ôð•ŠFo»Îr7@ÍK{ãkh¯¯tý;K¾Õ&°e[³h‹¶"Ã8Ë2å€ì¹5‰â¯ÙK£xcÄ3]%›k° R0ÂF ¸4lƒ’r1ŽrkjËÆžf£i¦êz=î—%öï±Ér¤¤ íÊ3a±Øâ³¼3­Ã¤é^)¿Ô§–H­|C~ƒ$³° ˆ =IÀ¯[øÇP†æÆ-oB¸Ó ¿`¶äGÛî¬NT·AמõÕ’<2k‹ðΩézߌuY q]O4‹œŸ.ÚÜ•EÔàž$ÒËã/X[¦«ªø|ÛhÌP´¢ei G8 $`Ž™Ã±…_»ñ…¦—­'V„Z[Ëh÷6—¬ùŽ`ƒ.§†QÏS‘T#ñÝÛèÖÚ©ÒeÔïE¶‘j_ç¸ >W|¨Ÿ½ëš³iâYêÖúoˆ4ØR¸%–»6vŽ3Ë,›”cއ€}*‚x›ÇÚ…‰×´½*É´­,6óHâæâ!ü@±K@;¾´íGƺ¼×‡ÃöNºý¬ÓFn‡•µCÛsÀÈîxRwưjø{S†Áo¯,å¸Ó.¢ó<™<³ó$ŠNàÀði~ÿkÂ/bnžÝ­¶°µXƒnP³¼’A禭/Þø¹/,lô…¶¶´’9$»Ôn†ä‡Sr’Íîp+#Añ~­,¾'²¹šÓV›GµK˜%°û@e'a]Îdc†=zV^ƒâoëPiÚ¦Ÿ®éz”³¼mw£¢ª<(Çæ Å÷nOö†å^™+¼qHè…ÙQ˜ êăë^O¦ø³ÅÚ%凊´øõapUô˜Ö5|lÜO™»9=«Qlµæø›!þÖ)Ñ#¸1ˆ“˜„Øò³Œã=úÕ=k[Õm¦ÕdÔüi•{³}‹N´X¤ÛýÃ*”w%»ôÅUÕæÕüMcð×X“TšÒkëëxØ[ªmI2.åc¸ôÁ$`ôÍ]ÖüShúõöƒ¨x’}.ÓJ‚Ù _ßÝË"†,X#c…Q’On* OêPé ³µÔ´.-nìí4ÝBHö—gj™Œç< àqG<3«hÚe…Ññ¡}Õ,>ÙÓ+#Ÿ0a`Ãv¯V=Ò¼~ ïj~ð.³you¨kÛ\\£~ñ—2sžÕÐG§Íá_øzÎËP½šËWµ¾Kˆn¦yøT0uÞI÷Ƶt>7°¶Ô|1®A9p‚Ââ_‘ÙNQI*AǨè{Šó†ðõ¯ö7ÂûK;››a}u’ʲ¹o¶;Â[h cåÀ…té6>ñŸ‡l´o6=VËQP4ŽÈÍVWÃù¹ÇÒ±ltÿjþŠ9$ºòüAv÷v¦SÝ@³>cÛ³“ÑC¨\ r°‚æb;rJg…ug_*ËU¿Ô4¹´§ºS~‡rÈ®Èì¨H óÔU|=s®Úøf럆­wy=¼7ÂÞÝØ€W*7€㑜“Àâ¯è:凅.uxüE© QmyÛÍùp”.0 ÜëN׵Ȯµ[P—RKô¨n¥M=%2O$‡vˆ ¸É=x«þ ¼¼M[SÓ`œš(¶Ž{i5ä ç yf‚2N+»®PÑb×ümyi}sptøôˆ%kT•Õ%mäÁHéÏ×J]3F°ñ•ÿˆ¯5Ô{ˆí59të[bì#…"æHù˜œ’sÚ²§±¿¹ÐÕ‹qew©xwÅ&ÌNÍiã9î]mÿÖ²Dê[ËãïÈàò*<øSZ½Ò,4Ý_[×f{¸&’„vÊ„2\ ÆßN éÅzÍÜ-qmq¶Ó,N‡mï=Òtû­á´úE±Û{ÜÛ'K ¤í9éœ~µ…qká=JÚßLµÓuÛíVäÇöWw7‹<Æf,T(ö=«Æ:>£ãkäðµ´-k§i°­Ì×’ÄJ´»qFX`Õ±ž8È5³øŸSÓ4=ZçGœjÞÔÈ»´D#í £4À`AÈÁõ]ˆuÝkÅécc¦\ÚhÆÚu¿¸½…‘Ù™p©$ƒÉ8#ÃÛø{LÒìSI»ðEåö½˜RtßöYÎp²7€ŽXô­ÍY5 jŸÒÓKIå¶´¿I­,Îÿ/yç¦NOãZö+¬x›Ä¶šÌúeƧiV—[‹°³K> œ*Üóš›áÈÖ-4ìKKžÎ]>IÌ©I÷»6P‚N|T¼a¤êø‡LÕ&Ðß]Ò¡³h–Õ3û³ælvU9gPÖšD®î$T 6; ûWAs¤xšËÅzV«§ÛÃwfÚZi·,›dŒ,·ŽãíÇÔVNá߈µþ‰§Zé«÷ ^Gc# Xœ¼ArιÇ2À¨¢ð‡Ž`ðLJ,![ªxTIáíå\F›†I Nz`ýknçEñv©Ükš²{JÞÝu+K†p†X—ãp éÁyt¦뺾‰ªÙø‹Uóoõ –xÚ|«&Œæ1<áHÉÎ ¬í_Ã|Kikiªjd1ÚÝA9é!ûAF'ŽpÉî+Ñ+‰°ð5õ®ák'¾vªI{#*J¹Ú2x?7=kkSðüš†½áíenk¤‹ÀÑÉ—Ï@¼Œc‡5«{kõ¥Õœ„ˆî!’#®`×¥xXµ·ð䆴.¿°¯|ër°…ÝŒ¢¡ùN¹æ·µ /õ½Z3”m)/F'ž žØÅcŸ‡öÇIN]Fx®-õYµ;[¸Â‡†GrØÁÉ=jÖ•á;è5XµgX—T¼·áµ F 1¸…Q÷›I­?h:w‰tÙ´Ëíâ)^3‡ÐåYO8 ûVM‡‚åP³Ôumn÷U’Å­ãËT‰˜cv-Ž2sQ^øÊâ[ß²jÚŽŸi|Î÷V–²(ÙþñV*[¾Ò*ýß‚ü7s¥Øi1ÂÖ°éÅZÊKv+%»ÊÜžùÎ{æ“Cðv“¢\Ý_™î¯µ ˜„2]^I¾O,à¾À §§|;ðÞ›mof’ÞKmk¨Ãm³1X,í è¼ò;ÕcÁ:±zÚ‰šòÎòH„SKe3FeQÐ>Þ;qŸz°ÞðÃiQh¿dÅŒSG8@Í’èÁƒ3gq9äœÕíKHÓ5±}¶#'Øî⼃ FÙcÎÓÁëÐäVEž“ywâ›ývú.;Ke°Ó –SóI&q¸áG|œ×KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¬ývÖ{í#U´CMqeq`ô,È@Íajz.±uàS£G ¶£ý“S0ÁuQ‘»§nµúwŠt=VëWÑ좿‹P¶·[»F”#¬°¡•ˆ ‚8 ã¥^ðþª-Þ¯¬k+ÝjFèw$1DUÜ@É9$ðOâê– ƒGkymsÝ«íùVXπǡª–Þ>Õ5 [ìúm“<¤ÌæéÈÀJ¦uÇ9ïW<1¢ê>%…ÛÆÓ5Å䀡%q+±^ v<ñ\ü> ñ%†á&µžÎ]KBYÕ’`ÞT¢^»N2ìqW­tŸYk÷·¶o‹ymf¶,q1ylNKds¸éV4Ý ÂSéÌË-ºCxn$ŒÝ™¸œ€}+†×ûøM­á.µ¾Óž(á±H"æé²#ç=³„SÇ=ë¹¼ðÖ­æéÚ¦“y¦­ob–sy¨^)£8` œ©äGãRé:·§¦«¨ê¯uª^Eñ©@¢(‰=<ò{Ö‡[X}Mm[?Ú l†ãpî#¸g×Z‹_º×<òLöZy;FÆ'v}ë6óÂz¢ê7šŽ‡­I¦µó#]Åå$ˆì£”7Ýb:ã­X··Ð<£Ê÷w.`3n®fË<ÒÊpY¶Ž¤ñÀÅdü3Ñ ÓôË­Ab’/í;†’(åÎä·RDjsíÏãRÃðú`}5u­@hŒdÅ‚²… ç•Þ~ßmß]Ó¼e`4××WE{ƒle+ÊÊ»v¶d(éÐûš’-ÏCÔµ%ÝáŠâ&šk5ù¢Ü e•,\Û?JËðv™ί¯x¡m%¶KùDV©2•r€ îT€FöìFx®Ö±[ÂÚÙë6,’5yåžèol–vœñÐc~ëKÓ¯¬Mº…f´x„Mò ëY:g‚¼9¥^ǨF·܆8êi%òAë³{63íRj¾ðÖ³toníÝnY$’3"Žö2ä}sQêþÒ¯¼7qá«;x`³–5‰Sj À–ÀêGQ“Éë]¨U :¬É<7áÙmï­$±‰í﮾Õs$— î>ùò«wv}ÿÙÅÜ 7ÙçKˆ·Œì‘>ëqEþŸ§j–ÒZ_ÛGsm ÃÅ*‚§ð5_HÐ4 7‡I°‚Ñ$;œD n>ç©üjËXØ=Ò_5¼fî8Ìi1Q½Tö®)·Úf•©¢%ý¤7(¹DÈê2 KookiAmC $q€G°T0ézE´ò]AeWg|¨Š³ê@ÍHö:|“¥Ô–Ñ5 $¥Auǧˆ-Áf¨,ÁÉÀäúýic†‹ãT,rÛ@>ôàè1Þ€ª¤$äã½-eéÚ,:eö§wm!XuI¤·Çʳ†pÛϸÏzÔ¢Š(¬»Í Ò÷WÒu‰%‘fÓåbE#cyÊÝÆxÇŠÔ¢Š(¢Š(¢Š¬ÚŽš’\Ä÷Q,–Ñ §RÃ1¡Î‡aÁäÔ–÷×pÅsm*ËȲG"UÕ†Au¥¢Š«©jZ~‘gq¨_Ì!µ·]òÈA!Gá“úTcXÒZþ-,\{-¡¼H°rb³Œu÷Í^ªSêÚ}¾¡e¥ÊÌ.¯#–HT+DxÝ–Æ^äUÚ(¢Š*•®«§Þ^j¹7{D· T€¦Eܸ$`ñèM]¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢³×\ÐdŠÚe¿·hn® ´’PHا»d=©°xÖ·k·Ó-b¸É>bF¡²{äzÒ¢Š(¤ 4µZÏPÓõ´}’u—ì÷o6ßà‘:©÷fŠ(¢²¼E®Eáí9õ!i•e†=ˆ@?¼`¹çÓ9­ZL€O^”´Vâ8µm>;˱¤’\ÜB±™Ï•!^ ÉÇ¥mI,P£I+ªF£,Ìp÷5 ¾£¦]Ä÷×pÍ gt‘º•ë’*AsjaûH™  ù†Ý£¾zb«Üjú-¥¬w·7ÖñZÈŽg‘B0##œ=*{KË+øRâÒxçó¶HØ8÷ö©¥ižOÛ®á¶óœÇšÁw°àgàf²“Ç>’ ‹˜õË6Š¢B²‚Ý0:œöÀ9íWôÍ{AÖlÛPÓïbžÑ ‘OW¨lã{â³,¼}à]Bî+]Zžg)ѽˆ O¦ ÍYÖ<]á}â;MBð%Ì‘™V%VgØ?ˆ…îqYžñDzÇü$÷’jϦÙj,¶ó.Љ[“ÇLœ“Vtÿx?S»‚ÎÞêE{’E³Ë ‰çþ™»(Søéjޱ«ØhvRj¥Å¼m±E,rìp2zš5MZÇHKi.˹»†Ö=£?<‡>Õ©xãL°¼º²‚ÇP¿’Ïí¬á.°3†98ç5boøz=*ËW‚I. ¾`–‘À…¤ùùUx99Î1ŽhÑüYeª_I¥Ígw§ß¬^rÁvL‘ç‚À€zó‘é[õ¯øŠ ZD¶Ó^_^Êbµµƒä*2NI:’@BÇÅ÷77š]Ö‘=¦³ «ÜÃk#![”~î@võàç¯0—WñL^ñF­ý™z.nï&‚{óv¹‰DØØ‹žýß”Zô85‰ü;§èú.Ÿ¡JÚ¬ñÌñiÞxo*5o™ä™‰àçß“Vôï]LÚ¥ž©¥½†©afo>ÎdWY¢ÇÞGx ßxªÒÿÂÃJ†3ê‘(-;'™!V7 §ä#œüÜÿz¿sâ?Ýjrhš%…»ÝÙÛÃ.£=ÄŒ!ä¸]ÌHçø@•^ð߈nuy5 BÐYêºl¨—0«nRe]*ݲª¾.ñ=î‰>¦Ø-°½Õf–8¦¼r°Æ#œã’N@PÏ­EmâOiQkrx¦Æ(­ôÛauå¡c èAʀ܇Üõüón ñËC†[ [H‡Ô“Óxð‰xoô µÿÐt'¡ï^WaâßkÐËy¦kšt:¤s:ÿ`NXmllgf¸Žàc=«_^ñUÜšÐÐ!Ö-43„Ww—÷H~XãBñ‚XàöÀ®sWñ-Î¥áÿø~ïTµÕ'°Ó£º†öØ(Dç8eRT2‘ŽB+§„øO4fÂrÊU®æ¹}cRÔ­¼[á[n Z^A¨™âÀØÐ9Æxö"¹=>/kš_‰õKŸÝÛ?QÕÂ;q`c3å%½1Ç×+´ðž›ã{~éïÛìW[ ¢Õ’gUØcÇ¡ëœæµ®àÖµÏjºGöÍ妗•ipðÛ8RÌĆÁ øÆx¬íCÄ"ðzø£EŠöKÙ-í¬fÓ..¾i#û\ž^$oâÜŒj¹â-ÿÁº4¾"²Öõõ  ׿fh®†àLg*¹ cŠ{X]x‹ÆÚ½¥Æ§}™cqöH%dWgÎ2A¹Œž½)ÞÐ4ûxºu{­Ö²Ù<[甩3Cón°ÃÓ9ÇlW¡ÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(ª÷÷_b³»»Ø_ìðI.Ñü[qø×üYu¦&½†âT©æJàyåï2&Ì9Æ]I ÍjÞx“VºŸL¶ðöž.ÖöÌ^›¹Ë,Äzr’çû¼U !·³0ê.ÑAqfψå;\?÷€àƒ×µgéúÿÄmv-Nm>×M·ŽÊîæÞ6˜Èßh1·GbryíYšö­®ø‡Jð>«gö{ss¬Zf9C“Êy ¹AƒÇצB'F'eiB.ò£ [àxüMy¶‰y%–…ááºËâ©mÛÌLì ,™)Ï èy­Æ¾ñgˆ¯µh4[Øtë-6²‰Þ/1æ™FX`¯NäúÕ+ßx¢ËOÒlµ%´Ó5«ë™à{‰˜y¤=eQ»ÃAaÉç¥;Jñ-õ–»§h÷z妳o©¤þLЄY"’1» Tއš©£KñÄ=Þ§ý»³E5ÊÚ¬P!ó<¦#÷„ç¿( Òj~1Ö[Bð®£$í§Yê*F§} [Í»à*ÀlòU±V4¿ÞXišö¦šõ¿ˆ4Ë[Q5¬€§ž²`ü’pN0pµ`]xÁ¬4ÕÕ"ñs]êê©;Ù˜¿Ñ¤ÏXÔȇy>µêðL·Ö‘N›‘n W^Ì¡Æ1^[¥½÷†ôßêv·×ÝÇ­\X— FGdF›žqôÅmkzf¹áM,ëÐk××WVF9.c¸pÑ\) 8Ù·ÕqŒW|¬U‡FƼ¢ËLÔ5Þë×zÞ¤o­Rò[VIܼ–< ’ÞÝÁÇ«·v3i:‡½ý‹yâB Bký_Ë‚L±Y6ÚnêÒeRÌy Û%Ýßü ~$[´§kB(b¹mòÇIÍ–ÉÇÞ?Zé|+u'‰u{íKVYm¯ôæÛé²p-c•r$?Þgûr©æ´ß'_‚ïRÔü9ªê——sËûø™B@ªÄ*EºTÀ_a×9®ûÁo¯>ƒfºÔrG}’6óJ—eV!K,2F3ÍoךxSÂ>ÕômZëQ±Žîk‹»ø‹N7Ñ\ü©Ÿº3Ïçš«ö—†<m¨Au©]K#µµ”eBÜyÌ[ˆ0O?«šEœÖÞ4¶h¶ºR^è× $î̇úÀª«‘ÐuïÍfË=Σj~…ÂÞ>³›kȵºù÷cÙwgéW®­uEñtÖZvg{•¤ÚGeÜÅÛ ²/—&I#à` gšÓðU–§g¯x”Ï…¤s­¤’XÙÎdò¥ÁËØ›wnqR|C´´½“ÂP]D²Àþ!µWFä7‚=)/tÍ6OˆzDÏkh´;‡¶Œ†YðãëX÷·ZV›qñI®í|ëO2Û£mbÁÉÆãŒŸJ«âÅñ%ž‰¢J]*ÊÒ-CNû=•²³9Úë…Y€ùG\!ϵtÞ’ñWé_™íY7cq¶òþL²â/žÎmâAÑÊ›Q¯C,…FSfSÌ8ÊðIÁéÞ¶YQœ0Éþ qõ¤ ø·SÐ|U͵•Æ©käXØ@lã‘TÌzõVÜZ¬¾%ѵVòþÍm¡Ie6çÌ,¤`c§¿áW|5«jš²êæú8S욵ͤ %dŽ<`’‹9 ŽàÔZ¦…}{âOkIÛé±ß,ÊÄîo9@]¼cŒsȪÚ'†µ=?Gñq,FMFÿSžBHU¹$®ìÈÏ8ÏÖ«^ø?S»ð5·…ÅÄ+yµœM/ÍåæRqßœqYvÞ#oˆº¬Ú%ݼW  Ù—†éÇ2—aÕH#ocÏÒµ!ðÚ®¾Þ"¼[G[H’I-×j[,<Æ"'å?6OSLŸÂž4ÖÒ 7ÄZŬúDRÄò­¼,²ÝùdÄ3´sí[ÖšÛx‹R×~Ð ^Y[[BࡈžwgœçÐUdðö¯mâ{nÓRXì/"Œ^Z4YghÔª•|ð^‡õâÂ@th[•å½i®ùQÌ~aÙ¹W€vãηh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(ª:ÐJÔÁïg?þ‚kÏ´¯”ð…®—•}.ªö"ÒÚöM¸GcfÒ9$·ÅGwg6‹q£éšújSè¶ú4¶ ##ÜŽH"ùw?/ãV<-g$:—‹,í´[­6B²¡ÚB!_™²À9'8-œUa§]ëþÑMíæÐnbK›;…1µÊ*á¼³‘žÄr3ŒU½GÑ®õ­>]/ÂrÙZÚæi®õpÊÀ|¢%.~lõ$q]‚,5; 7P†úŠGÕ¯ä[£¹*xìzŠæ£ÑüGeàÏ *i³K}¥j‘]Íh¥|ÆUwÈã<ƒÖ½ÚWžfxš’5vñ¹  ðMpv¾ñzN…nlÀžÛÅ-y2—_–5ÎüçЃÏ=*ìPx³ÃúÏØ4¡©Xj7-{ÉU^)\|êÛ±ò“È#§¥Auá¯ÝXèúÿÙõjÂêâáí¦Ú"hæàħn2£IG'š¹¡ÙxŽãUŽúëJ´Ñôø e[xü·–i»:¨Ú täžµsÂz6¥¤è-§Þ¬kpf¼l#eq$ŒWœÇÒ²¬ô_hÚ‡aÓ¤¶{«äKË)Ü+ö°W·õ¦Ùø:óT»Öïõ›K]<ê:iÓü‹6,J“Ÿ1Ûj‚Ý1ÀîißÙŸg··Ò$º±µ¶drjPóÞ5þêÚ¬GS¹½…và`œàcšâƒ5yÛÅmÔðcj×^C"nûDS¹R÷p¸ã½JúŽ5ˆâÓüAbÚdrDÒý–7ÝÎpûŽ9Ûšìëš±ð½Å§…îü\.™®i ­M%¶§sÐyL« *\–àÛ}+ »ðôSëz~»Ã[ÜÛDðN.bnŠßîžA¬¹ü—k£ë·u•äÍ4öȈÁYþ÷–ÄewuïÏLTÚ†…u§éz.—áÃ-²Zê6…¼¶ƒfO0žHaœã’Ø÷®ž³4]×C³–Ê $’9.'œ´„g2±$p·’|¢;HÓḻ…ô—w´ºŽLL›ÏÌ Æn„b–×ÀºM®£g«‹Ëé5}Áç’bZu?ÂàŒm€ ZxcB¸×-¼E$$ê6ðc|œsɸ$Su¿ é:ì¶÷34ö÷–êËÕ¬…%Un«¸uЃSh^Ò<;o$¶fË<²1i&süNÇ$š›PÒ4ÝQì^î2íct—paˆÛ"‚àŒõèr)Ï¥iÒj0ê­oa·{t“'„r Î:J…´ äÕe{4vÕQ÷vH™Qv€AãéŠÇá¿ÃèíåµþÈŽH¥M‡ÌgfUÎp¬ÌJÿÀH«ºƒ|!«-¢ßé±MöH–(Y³¹Pt]À‚G±&¯Xhš–“Åac¼sãÍXø]£ {qTôïø;H»7Ú~“mÑÎ$D\õÛéŸlTé¢ÂºäÚáa浊٪ªà…ݸ–=óÆ:cõ¤éˆÑÈ¡‘VR2=gÛx{Ãv`‹m.Ò ]_ ™NAàu‘RÞi.¢ñË{aoq$cÒÆ¬WèH5i¡ã0´jb+´¡i˜ô¨íl¬,cò¬íâ‚<“²% 3ô¨4Í*ÛKžS;µÝä·r³ã%Ÿ· Üžjé‚È>´ˆ‘Æ¡cPª:0)ÔQEQEQQɼÍK;Bûã,(Ø##Ðà‘RQEUA©i!!]ÁåÍ?‘o\<™?(9岚·E]llíïÖÞ1vñ,-0Q¼¢œ…'®«UMOSÓ´k9õ Ba ¬ I'h''¯µZVV‡ ŒŠZ¯5õ…½Å­¬Ó¤wEı¤(2ÛG|MX¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¨níÅݵűm¢hž2öáŒÕmMþÆÒôý7Î3}’Ú8|Â0_hÆqÏ_­_¢Š(¢Š(¢Š)‘Ë »¼·WÚÅiÎê½>Š)23Œó×´QE˜âI\ÿçÚq¨xãUñn«¢išŒ6zmµ•¥Çœa"—…ÉÁÝß9Æ8Ö.¹ªx‚çž>Òuk„žïF–(Öê4Ùæ£íu%AÀ8à⺘µRËÅv:eÌÁ´ÍSJ2Ù)QòM7®@ÉÊœòM?Áú®©®Ýx‹Q–྘5´ÓâÚ0« à€ Þ}IéX¾7Ó/îü]àíuh&{ØÔB#ýÑXòYw#rÝr1Ð ³dšïŒïu¹Ž±u§iÚ}üº}¬VeUááäv*ÙÉè8ê jø/UÕoaÕtýRaq{¤j2Ù½ÀyÊ(Ä óŽõÓÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(£É®>O‰>HÞím¯äÒÑʶ¡ mÆ Ý×÷ E_Õ|e£i7öÚkÅsqwukö‹t·Œ¿˜3Œ;÷çêM+Åzf¨ú”/öWr‡¹Šé6²¡†Tàò r~(ñÓÝx{Q’ÛLÕm-®mÊÚj!RIùHÚÛÔ7bUz× Ø;IghìÛ™ Œ“êH®zO\Oq}£]j0ØJÐÜM"®õê±î#qñïY'ñ…ôÚO‡µOÅ4–÷z¥ºÊÁ•‡Úa`ÜåŽAôÇZŽMg\³ñuÈ¶Ñæº¾»Ñ­Û T$XîÜäíã8àÖþ™âø§´ÖfÕläÓ®tvÅä Áð îR¬¼çCžÕF_köCªj¾k]VŒ<‚`Ó@®pHÀ3‡b=*[ÿëÃ^ºÐ4­n¦ŠÚ…žIvFºîùIãŒc9ç¦9&KÏqf±Ýhw2D°‡'ÍR?tÄíßìãKŒnn´Ï ]Ãf¿jÕï’ÚHKœE´·˜AÇ;0{³¿á(·ðþ‘â ètÈ!xüE= Tm©$ŽÀy²±g9n¾Õ¯¦j^6]B }VÎÎ{ ˜–òÅ›l,£8pý›±ð¬øüAãm^Þ}[GNŽÀ4Ÿd†ä¿›r¨HÉ €»±òðÞõÓh:½¾¿¥Ùj)D¹‹qCÕpÊ~‡"¹h ß¿Úív:7qä¶ãníLïûÀõ8#ý‘Sø?Vñî·d5@Ú}™b¹H­`Báш³6‘€9õ$V>­âŸhZoöÅþ¹¦­òym6‹±I]Çî_pùØ­ý_Qñeωmô=&ò´ƒw$¯÷Œ‰1•“ÀÁã½V´Ö¼_§Kâ­2æEÕ.ôÛ8®ìäXö4ž`?+*ðpGÁ5C@×umN}2ãOñe®¡4²D/ôë„HÊ!7–Þ{œúÔÚ<7Ú_ˆ|g¨Üj“Í ˆŠi¡ÙḅÏÊ8+ïšÈÿ„’îm-µïøL„zˆÜ%ŠÆ¦ÙxÏ”Ãar{¿9­«KÄ^!Ô¼5Ÿ©I§[jZ9º¹TU,:´°8nÙì3Æk¸[f[5´3ÊÄ@"3ûÃÆ7g{¿Nµä¦Égá?Loîæ1j3[•ò§dˆwã|÷?¥oêÚf±á»=7]]rþâño-ÚHù†T•€p#Àsòã¥A¯ë6Wúö§§ê“êñÙX,1Å™ÿ¼g]ÌÒ<*O‡~ nxþþàjvr}º[;Yc6wÑ:JèàåNð¤”#®3ȦüBO²Zé:òðÚF©m3·)Ø+õ°5‹õÿøN5›cº}:{X´æî¯`·ýæ$U“¬Å©kº§ˆm’-©4 ô\ ÿÇF 6ÇÁZ>¥áhµkÛ‰ßZº°í¨‰\H’²np@z€1TL)ã;ï‡ï«ï+w£ÝKtˆÅDØ ÁÆ>V<Ô~(¸Õ¼9â;äðåƒ6ß A1‹H"å•I }Ñž¾µè^°Ðl4‹_ìc¾ÒáÀ˜’^rã%Ý%|ÖÍy>©é·>)𒀫®jV7«Ž«xáfÇû»I¥ÐIÔ¯ü)á‰~fðä÷ó])>ÊÛ ?“+SÀ~ðýņ½qsc óÜê÷ñÉ$Š•VÀ9Àïõ®z9µ;­áíŒpAy·wÊ`º¬R4¼µbþèÎÒ ·á´ññw‡î¯­t}6o*í-§fšê=¿wi‰2àòx¤ð]¼>ñ¡§@©©MqªbP£{2 ϶cé¶úûø#Ãé¡K¦†–YŒ¹Ã™Ÿï篽zO†dÐte–u¸u°·e Ÿ(ù†ì}Ækе±Ö£»ñ5ׄu[ »Yµ+ƒ¨Xê1°ò§8Þ0p{eHÇCUôÍFÆêóá•ì6‰§[ºê°¬ v°Œ)Àà‘•õ«šÝâÝøÞæËM›}ü^½L!#³‚ƒØ÷üªm#ZðMŸÃÛWÔÓâÓÄvüniæÒAÜ[œÒj—^.ŸQ–É,¾z¹( ÀÈ_Öº™çÔ|c®øxÃ¥^YéúEÓ_ÜOx› I°ª")$žNXô¬km_]Hƒû>Uš›×B9ùîwý0*“U𮙦xƒZÔµ/ zËTxî"–Ñå‚@¸defiÆA¼Ö†¤x“Oðö«q¦x{LÓ¯n®Dé¡ßœl™ÚdaŸaŸ­giÚ—þ#Ñu-+“xtYÎò_ÎÆ4&Ò<µH؆ÉÇ$vþ/Ðçñ‡{¦ÛÊ"¹q–îÝ‘°eϱ#Ú¹­V?xÆÆ=ûCe¼ÒCý¡vÓ£)D`Ì"UÉ%±¸.néÚ>¡kâ­sShÔY]XXà ä´[²1íšÂÕü'â Ⱦ!$1;Éö,¾7yq€Û½9§|M·»¶ð柨ÚHWÒï-ÌŽ²HäFPzîñí]G…´Hü9¡éšJ›kuYûÎycø’MexËEñ-õΪèfkÝ*êY<«¢Á$ISiåA9Th¾9Ðoµ¼?ö ‹=NàÝËÛ:˜'q‡(Ê­•cÎÞ¶|+ O ÙÜ‹»s¨_]Ëyy2Œ+I'eáT`kvŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¨/e{{[™’#3G Ž#\œ­yæ­ÿƒ¥žC¸µ“ÊÒôèã ™÷Da¤Àþ#ò÷è+¤Ñ®¬®¼Má© –9Dž%] íuØñQøŠÊãR×|U§Úô› ÆGV;ÛñéUüAão ]x:æÊ ¤k÷±5ž?{ (·§U ‚I8W éM»N°n™µ„ÿ㢸 x‡Fð•Ö‰®Hö·–wwl»‘ÏÚ#w,®„œƒÛœŠË¹¶¼°ð„õ´‘ù¾%W–§0Dóg‘Ô`r}ÍtšMÔ:ŒgÔ-C½Ç‡­ž9J0V̇9ö¬íCGÔ5kψ¶pG"ÉsšÐ3FHÁ“Ç$`‘Ò°¤µðæ©kŸm¦k׺”ísÙ^\Þ,Pò7\±L/lnÏjítÛ[˜|i­IäH¶Í¤Ø¢HAØÅKp¹“â}W›ÅØíÝôí\Ú I”|©ö7Þ¥mÃz4 Y·ñuò\Zºit—wV¸ÏzA`¿îüßLÒÃeâ;M7Å~N’—Fo\Lm.@"êÙ¶îÙ’Héž2:U-G´“^±¸Ðt CE±Dœjh&8åp¨±ï`NyÈ Í·ð¥®‰g>—sàXõ}B‘m/6Fb¸V'kHÌAR úf½3ÃÚtšV“ae$6ÐË#ÌŽÑ6D®ym‹Ï¬k¸5Ë?Á¨[é¯ucw§%¤³# òI’X ô͉¬Áà÷Ò&ÿDÔØÔ†Ï–Ò;9_¨áícJÐn®’K¹Ú[UYB}”»B0„$ŽN2ZëJª©9 IïYÞѵ kL×§Wûnž’$8o”†þðS¬<5¢éº¶§­[FË{¨„’įËýÑÛ=ýj}#EÓ´Hn ²VX纚åÃ1?<§'íè*›xCÃO¤G¡½±k¤2Æ ¶ôrÅ·+çp ž"“GðŽƒ¢Ý˨@³M}$b#qs+É Aü ¹8Lf´4Í+MÑ­ÚÖÂ/*šYŠäŸšF,Ç’z“X²ü<ð4÷my&š 4¾sE½ü–Sí„ÿÀk§à çµ?x+Y¼mBÿKŠ[§ÀwË37… 7â ^¿ðï‡u;´ËÝ>lbÙåBTon1ŒvÆ(Óü9á½&DšÃM··•ÑdD°ç,7uäòy¨_Â^“P]Yô{C¨+o5ß»×8ëïZKeb·Oz¶ñ‹©#Xž`£{"œ€O\K¥œ3Oq¤Óíó¤U¤Ú07§¦iÒ[ÛJñI$HòBKFÌ(HÁ öâˆíí¡ó|¨‘<×/&Ðæ=Iõ5µ†dd6¶±@emÎc@»©À§KiepñÉ4É$g(Π•>ÄÔ¤) ‘’:{RñIµ2pè{ÒÑE‘áýÁ{S<¢ëPº½bà|¦fÜ@ÇaFµ ZësèóÍ4‘2ý/c Œ;(# xç¶+^Š(¢Š2Z(¬›ß xwQÔ¬õ{Ë5šúÌŽNBçnA<gÞµ¨¨gº³µ0‹‰£ˆÍ(Š-ì÷=g©>‚¤’HâG’Fˆ¥™˜à:“Lµº´½‚+«Y’ky|Ù3çÔã&¥‚ÎÆÕc[{xâXÔ¢P‚r@Çj—ËŒ9(ÞT)lr@íšh‚Ü3¸C?Þ8?Z’ª ‘Ó=©H`ô4QEQEQEQE×ÖÊ­<©³ªäYº{šHîm%–h#™h6ù¨¬ &ᑸuíš–Š(¢ŠGeEgc…PI>€Um7RÓõ{85 D¶³®èÜ7¡þ•Ú¾›o¨ÚiRHEåÜRË m8+7sŒ½Í^¢³íµ>ïSÔt˜‹›«çʸ˜¸=úsZUMRüé–Wßg–çìñ4†@.àuÚ ?E§ëZV§¥Á¬ÛÌ>Ã-¿ž$n6¨;½ïéPxo^ĺzêpÚÍoo$Ž ó°TSàplÖ½W-}ã[Ht-sY³µyŽ•u-«Å! ½ã`§æãž8ü+¥Iávòï™´™…2æòÊÉ<Û»ˆà8Ý#™ÅPñ¿g h÷ZÃ4pÅæ"+¨ó}”ž*õ•í¦¡oÍ´©$N2 0 LŒò)—º®¦ìû}ìÛÁ+ç:®ìuÆHéJÚž”–ÑÞ5ä"ÖB¡&.»±ÀÃgžœÔqkZð]\Ånöö®Éq*È¥"e!Žp÷¨´Ÿøk^2'S¶¼h¿Ö$V+õÕËËÛ-:ÚkËÉ’ hP¼’9¨ɬhüqà‰oãÓ#Ö-šòG¢á˜ôPßww¶síVu¿øoþGö­ò[´äˆ‚]ñ×  œüTú~¹¡ê–'R²¼Š[5ß¾PxM½wg#¾qYv=ðV¥wock¨«OrH·ÜŽ«1ÜfP§ð&«xßÂÚ5Ô¶W3Ê÷ yÖÞ$òŒƒ!E`¼sÎ8«W^)ðÝž•µ%ⵄåF Kôª $úš¯£xËAÖ®§±Ïµ¾†;[ÝÄÑÉåŸã€ÈõÇNø¬ïøY~ÝêiòÊ"QhZ³‡ô'ŒãõXñ–•¤_¦”–·—ú‹B'k{(·²FN71ÈÓ& >ðïö£â·+o¦Èb»ãÄÑ8 *Hç‘ßñ¬ÛÿéšÅ•ß•«ØÙgOŠÚtQº27 rb?Å2:Tqø†}Vø}x.n¬ôѧLFÛŠ!‡-±X€=O"·õéºNe¬ˆ¤¹ŽùíRÖ(±¾VŸ@ɧ=kOXh—KÔZPæ1g9p†ÆÓœÇÐ×!Œl´ Á°Zi—·‹«Z¬v±«+J¥P’ëÉÎZаñv¯.£>¨èog©/-#ó‘ÒáP€Wx “Ü{×á¿ßøIñg‹µ-Ig]Jhä”ÜîgýøO)T‚(/ƒ´ÝNÑ´èííl¡±xܼñÆ?ŠMà+0atÍtV^/¼»Ö<6ÁPhÚö–òA‘óÇpŸ1RsŒmàqÔUí YÔõsÄh“§Ëœ_™¦Q™ >ÄâºZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¨çžÞÖn'‘c†$i$w8UU$ŸA\üFŽûÃ÷:–-¢_Û_C°ß²'›b±ÁR7¯#ú×Sgâ¿ êbÆÏU¶šå‹…å>öß\wÆqF¯âŸ h2$:•üpÌë½cä¾ß]ª Ǿ1VNµ¡;ûXßCý³ÌûFá³Z©¥ø·ÂúÍɳ±¾Wºù¢&VVeõ€$}3Uïüsá6æk[‹ÆßnÛn8äd€úHê¥Wñ"·â–ãŽh]^)::œ†¡Ð×?}ã ØßÝi[§ŸR¶Û¾Ú]œ†]Ù#dç8ÎjhŸ©éš¥‚][³|ÈYÁRN ·o_JéuOê0j«¢éZSÞÝ‹Qs+»„Š%'!²ÄŽ€V&±âK]WÃ":¶"˧M7v&\n;”©Y·9è:V¦«â}f×ZƒBÓ4¥»ž}<]$.ÄO˜ƒ¿åcí““Ò¨Ùø«Æú”·Öº º_iÎR饸>I$eDd&â[ÝWõ$þ;c¢èº…µš­æ«yö(âžM±Å $6çÇ@AÆO¥ihÚ—‹[Q—NÖôè•~Ì'Šöб…¹¡Ü Ürr*ŸÄ4¥X „Ö4öç¶$׬ôSÇ3ÙÁzt3¼± Kqº3€ç¹Âýj#ªüO¶‚ÓVšÂÎ{Yž6ŸnÜEžHbp̽ÆÑÞy¯x‹TÔ5]ûOÓíté…¼“Ý©vš\e•T:aW8''žÕFóÇ:÷ü#—w–‘ÚbÃUOZX‘ÊAÂ1ÉÇ¡«×:´ý õKËK«MJñlç†(J˜d¥q$×pü«2ïÄÚÍþ««YGâ;=âÆá¢¶²¹‰I¸î»3‘ÃöÙÐVέã²ÐÌ—ZH›'T»wVXH*Ä€wž9Î=ë7Ã^%ž÷[Õ4a­Ã­X0ÝÇpˆªÑÛJŸ+sex/Jñµ÷„ìoìÐþdr•+´lWpükš“F½Õüsâ£Ôî¬mVÆÁçû+y Ý‚@çÏÄ~,[xjßVºšçN†ÚÿMºgÄÛ[$Æì1žAŽsW®õû?­´Û™!þÒa¨Ý4,A@¹dlv,všïëÊum V³Ö“Áö¬Zˆnò@ ß Ý4ií&Ó=:ÖÐÓmŸàÏËij±Jš­åª²ç"$‘0¹' ­ïxKÞÒôÍWKµXuKmGOc{ÖiwÈïcËnç9§ëQiwÞ+ÔÛA›ÄZ…½¼Ê“´kkbg \}÷ÎN}GJÃOY|ãû+Û(£:•ãÛÚ©–¤F§’1“Ц½[D´²²Ó¬â´·ŽÌ(û"P£,Ns\MÜQÞx«\“Iðúj·ÑÅmoss¨J«.BF6H܃–Âõ®M¬‘|â« ¸àHãñw–b¶'ÊŒ3Ç™ÁdöÔø÷O[𖓤é¶a›W­¤ýÜ:!1‡*§ŒŒýÓ’iþ!>(ðµåìZ6t:m·™Ì·ùÐä/žžÕÑ|CVx‰Uw°KÇáX3²³²øw³·Ž1hšd°ØÂDù†;Ò+x‘üâ³–Á%u‘·ûZ¹+>^Ò>]ùÝïŠçµÈo›ãÉ~Ýmu¾ãL”6H©WýéÜKÅ~þs]ïˆ/¼ ¶Þ[è㺎mBÐiqÂ|ÜüŒ˜#…îsŒW%á”ñ\Sø­!×´û‡]¾–ê;«bÒc•rÆTùJcoËŒw¨-m<4¾Ó~Ó­N±\ø’[?R‚)-çbØÂ±aå“»ðsÚµlïµ{Oäê÷–:úÏ¥ÝÈ'‚[¨@ʶÒF×ÎLšçZþ ÃBÿþ)‚ûITS‰©Ç¹¿Õ û‡`A­ûíf[ê¶“k¾K{7i q}¢ì:ç;åmŒü¼+sšå#½Ó'ðŸÅ(`Ô^ï7^zË9YPª~ð¨ ò“Ð…+½ñü‘§‡ôGÊ‹¬èì=y‚Ÿ¡Çmsãˆ6²¨t’=)dCЫBGë\·…íµ Ý{Gð­Ú±ƒÁײÈÏÒQÀ¶?P­‘ô¯QÖÔ¾“ª(êÖW~(kδ…'Âå·Émp‡*~_ô|séø×GªÇ?ü'Þ•QŒÙZš»vŽSœb¹+Û;×ðŒ-ÖÖc'ü$Wf8Â1gjS1’>•×øòÚîâ 5¼RHÐøN•Â)mª œt<š_[ÞÅâïË-¼‰o3ifYHY1 ´ô8=q\ÌÞñ%Ì~*’Ö;ÓkâØuk$“åB5R@'ŒLÓ3‚éÚGÜÃyRyÈSëW¾/ñ=ç†~ËáË»[+=jÖæñîŒa†Ü•wUs’~˜»ýB)'²¼…sÉo"(õ$ó‰úo†-¼=7†ÉÔ¡·Šég‹ÉX`çvS<€­œpjïŠü?…à<[NçÃ?e¼¶™ÿ‰á?6ߌ{×Aà}*ãIðýŒW\Þ\»º$re˜îlý3º*(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¤ 0 Œ‚0A¯ ¹†Íþj‘Ëìme£“dµŽ=«­ñ¥¥¿…–Þ$…`ñœ‘yjÀIƧx0[¶§ã .6SûaÖb~ð„(òà;zW:°h7šo‰¢–ôØiâu ™Hç]¹ cwç9ÀÏqZ‚ãÄšˆt mv-7R’ãíQY^À…'„ì$’¤°Ú@ÁÁÒ±<*|O†¤oíÍ*ÎÞÙî×P†æÙ™ã“yÞ%o9rOû£5ÜxÚ+O iÃr÷0ˆYâ•ãd,ŽÄ¯ÈÄ8=+JÔt‹/x²Þêx¡¸ž‡y²¤63é‘XWºÅ’Â]«ØCk>w«iÖ©qp»­’Ty[Ô)Ç õïMÖu+8u_ µç‹SR‘5XÑK jIù‰Pp{ ¿#¸éV|'¥­®¾Óh–:ŽŸ¢­“,ñ^É#WËFf ŽçJÞñÅž¡{¤Å•»\L·ö±1œ+ŒžqÀïY7¾Ôµ[ÿBÑ!Ôí4ô´¸$mw§8VÆx§m|BÔb´Ó-´YtëðÑ-åôÆ3j§æ1òÅ·vÏ8ª7~“DÕõkÓáXõØu ´Ã2|è]‡ÌæùsÈ œg¥O?‡¼E/‡!¦ÚA>­mvÖ¶¡QaEppÍÀfP9=ûVÿŠ4ÍKRmÙÆ®-u«[™òØÛg$zý+V´ñtÓ_Ú_øvË_´’g{)äxÐÄÑ2“•õ^µGþ½{Jµð«¥´ÃiÜG-œÒm@e9 `GÉ÷FáÓ¦+BÇHñ°ñDZÍåµ’Y\i²X´0¹Ýj¡·)$¨ÞXõÀ\{ãšñ[ÃÚ¾ƒo™6VU[³+³o$ò»>lÆ ý+bÏÁÓé—¾6s!³ÑlîàŸvwÊÒ¨€Áœ“ȪÐh>=ðú]iÞ›Nm6k‰¦·{âK_4äŒ(ÃI#${×U¢Ø]išu¥Õì—·&%¹—ïHÇ’}‡ ì+œÔ<;ãüGyâ þÑkH-þËrŒUöç%™H#mÆ{äUýH¸Ñ[UÖuÛØd¿¿hÚâU"Š8Æqè2y'$šæþèöÚZöµi1›N[™ìtܪÄ$g“aþécô¯G¬Kÿµö¿¢ëbë`Óc¹CÜùžjã®xÇÐÕ]WÄڡÖt]Q´ëÉaHndŽuCòîSŒ0è=)tÿZÃi«Å©]I}w¬)[ë–K.Ý¡TTtëXÓü;Ö/ôäÒu/ÝÏc ¢À‰JFΛÎì;z×z8W'ÃÛyÄvßÚ׋§ë$²[.ÌE$Œ :¤äã¹Çµnëž²×´åÓ.e–8V[y7F@lÄÁ‡$¸çŠÎ¿ð]µÎ©s«Yê—út÷‹Þ-«¨Yö )!•°Àq‘ƒLÓü é±kvÍvÖZ¼en-䲆eÃ:’7nn䱿¶4=4+ìîæéc$¬—/¹À=p8¸¬­CÀÚ-þ¥qª%Õõœ÷J‹v-'hÖà(ÀÞp8È ûÔVÿ|!iýœN–W²ÛÌöâgòÕá †Qœ‚p7sÎ+VÒt½rÎ[ F=´¸Ü§#t ŒGb"³tøsD»}BÞ9¦½hü¡qu,’È©ýÕgf }1ZÚ……–©gsa{›msE*Fån£#¢¼Ñ´COþʺ·Y,vÆžQ'Œ‚£ƒž0;ÕmoÂþñ„jÖ)pÐå>HtÏ\2p~µcMÑ4MÈiº}œPY€ÀÄ£†Ý×vz“ß9ÍQÓ|àÝóíú~“oÖYy@zíì3튗T🄵»ˆîõ=&Öêá*É*؉ôúÕùôí2æÐØOk–ey €¦ÑÐmÆ0>•_Jðÿ‡t%uÒtÛk0ÿÈWw×R/‡¼4—Bùt»Av¿œ"Mû}ØÎj{½/I¿x¤¼³‚áâ9¥EbŸBAÅKöK"òJ`Ì‘;me>‚¤dÀVP@ àJŠínþÏsö/-nÚ&òš@JoÇË»8Ï\Å𾤶©}ª\EsªêwBk‰"R¨ªªA$á@ïÖº(¢Š+?ZÒ£Öôùìâ{o3iY­œ¬‘²œ‚¤“X–þ »–òÂï\×.µA§ÉæÛBëF$Â(ÜËÛ'ÕÕÑEV6±á^¸³ŸQH-X:B%q0 ‚èVÁdÙ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢¹Áà_©±’šœÉ=ÌfGØÎ­¸»°9ç€+bÿLÓµ5·[ØD«osÌ@“òÉÊž1Ò³õoxS\¸[½BÁ$¹UÙæ©eb¾„©®jñÑôVÓÿ²”'Oòü¿³ì^ßM½*ž“á? hRµÆ›§ÅÌ¥<Á’ÁO`I$aŠ/¼%á Jì_^é³Ý§ÌxÁ$Ž™õÇlæ¶@8¹X¼- Ö½âÍZÆÖæÆóì&ÔHbBF=1]Øéémö%¶ˆZìÙä…6úmÆ1øTè~еMµKvpæ%‰ ÆEXk+¸K¶·ˆÝF¥b£zƒØ7\~4=®Ù¶ˆÜ…Ú%*7ãÓv3úÔÛWvì ØÆ{⌠çôÍ ¨¹Ú däã¹¥¢Š(¢Š(¢Š(¢Š(¢ŠŠ{›[Pq2D¯"Æ¥ØÌÇ ÷'¥KEEqomwÁsM ƒ€aî¶ööÖ‘$Ñ$PÆ0ˆ€Qì%QTmµ2ïPÔ4¸d-w`°µÂm8Q(ÊóŒBhÕõ[=Æ}FìH`‡nÿ-K7Ì@ž¦¯y¢Š§ý«¦ÿi#ÍÿN¿kòðÕîÛœã}óLÒu6ÕmäœÙÜZl¸–.åv±ØØÜOÊÝE_¢Š*+«ˆí-繓&8byp£'—áj÷_Ó£Ôn,>Ä“ð!;4dà ôçëUnôl00{ŽNiuO\ÛëÚW‡ôëe¸º¹V¹»fl ku8ÜpKqÍlǨé’Ü=¤wp½ÊgtJê]~«œþ•(žÜÊÐ ̪“#p¡#® E.¡¦@.Zk¨c[`¦rΔ¦ìž3ïŠKmKK½–â [¸f–تΑ¸&2zñŸzÃñW‰oô©ôÝ'GµK½gSw$„ˆãDi$#£ÐrkQÕ>*ø^8õ=Elum5]~× ”R,ñ+f0YƒïÒºÍKÄ^Ñ­ »Ô¯c¶†p<¯0áŸ#8 ԟ›kâo ^é·Ŷ¡ º}º»M2œˆÂ ¶áÔ:‚3TÄ5Ü+¬@fÖ8ˆÎÆcÑCãn}·f©Üø÷OµñŒ^‘ÔDöy-²Bâภ™Jœç§½\OxFþå´ËL=ó‹„4vòš wùp1ƒŒ‘žÙ®zÿÅÏ£Ùxþ}tO§]Í"ÞÞ‚‹¥ò˜©Ù‚Wæì0k¦ÑüiáÍnïìï<7f3"Cu ‘4ˆ:”«=ªþ“­éšÝ›ßX»< ,ÑTƒº&!¸8î+×þ!¤Vþ¿Ò!»–ÓS¿@å -æGóƒ=‘:àVΓ«XK­ø…Þúí|›; ‰­®€X­П—БË硪‹ñ+B1ÇxÖŠi28TÔš Á8 Nw'¡+VõiºVªšXÞ^êRÙ¥Ô1[ "Ef#ïc%ˆõ>“ã ;S‡Vy­®,n4‘›ÛkÄ6îå,#¡Ö^‹¯7Ã7,Ö^V:Œ‹x \±E“ QŒãž=9$š·câûöÔ¬ôÝcB¹ÓZü?Ù%fGG*2Uе±ëùÔ~º¹Óõ­{Ã7^+v[ûbKy’JœöGÈØ«®¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¦ÈdTs†p¤ª“ŒžÃ<Ö7†|Gˆí&•­ÚÒîÖâK{»W`Zô$u¨4ßøŒxõ9`·Ù§Úܵ¼%¸¸)÷™F>è<“šÛGŽEÜŒ}Aâ—zm߸mÆsÚ£{›XÀg™J°û£©úS¢–)ãIbuxÝC#©È`zGjägñ‹5‹ûÛ? ZÚkL·¬ÛQÕ#TäíîIÆjmÄšéÕäð÷ˆ¬£ƒPÿi‚{bÆ „†CCZ×>&ð­âé÷:µ¤7Œp!yT>}0NsV/õKòÿ´/ ¶óGO9Âî2ÄdŽê¥Š¼)©Cw=–©mZ7'‚Ȫ0øãOÓµm~ËZ¿UònÕm!T%Ä{<($Œ÷?JßÄþ–Æ×RŠõ$´º¸ŽÚ)$à)dõÈ{ªéÚt¶0ÝK²Kë³ÛŒ¹ðN8p;â¹-;Æëª^xšÅÞh#µÞÚuµ”QcËÜ1¸•.GcZ±ø›HÓ4]ææòk×½·ˆ[Œù×d¨9€0OSÀ¾*Γâ#Wk˜cYíîícMksIUOC´õØšÇO‰~šÐjÖ:•ň\Íq»‡Cr>ï|Å]ñ.­$–ÚM†™pRã[™#†dêãsºû…éîj}WÄði—cL´±ºÔ¯Ö3Ál)p 3²¯=¾lŸJϻ׈¼?}¨è¯=µþ™1v‚@UÒhæŠEä08<ž¾µÑi”Æe¨ÁÄwP$ zn?•ªøªâÛSmHÒäﵒоdWTH‘Žs7vì5®ø„k¾ñ‹{‹Ë&\Àç‚§†S‚=Aæ¶µ?Mgyg£é¶¨js[‹‡Œ8U†,ãs±é“ÐI¨"ñ”‹m­‹í2K]OI´7RZ3‚%L¬Ž28ÁãƒÚ³gñ߈­´ëm~_”ÑDÒ¹œyèŽ@Þ# ‚¼ÿ|v·«ëÚ¬wɤèv1ÝßyâfšM‘A8ˆ InpíÖ¤Ð5ëÍFâûMԬŞ©b"i£Gݤ™ÚÈØRAÇp£ÄzõÎ’tû+ auªjS4V±3mA´eÏ'jޏÕ {ÄÖZµ–‘â;[UmA%6—6lÅã(Êã ãrA¨<+âøŽâIä³³·Ò­î®mämÎe˜¡ nÉ99Æ)Ÿ%šßCµ¸‚<ÐjÖ2Å8êü óŒŸjKkÇ^ŸM¹×~Áq§ß^Ei*Ú««Ú¼¼)ÜÌC.zð¦®hÞ&¼kŸYë"8äÑg2†ŒÙ×r1É<àóø »àýGWÕô;-KS³Ý†™U¨XØœyÛŒÖ\÷þ*ñ±ªiÚ-üZuž–cŽ[ƒ‘晆J€HTuêsTß^ñìVºnwÞ ¿¿žÖ; Da‰w4ꀞ݈ç¯e.ü]áÍgH³Õu$Õ4ýVG·–9 ”.WN ·N™µ‰ewñVÑuhëâØX\_}–8àŒ‰VÖduvôÎI©&¼ñÅ–—¤x²mpÈ.g²i´á <«†h8Þœ—<ö©†¬jž8ñ4º”º}š[iÍrÐó%;ÐÀëœ ûŠ¥«k>*Ñ´éRê’Iu¤­”¶z†Jc‡‚Ñ£9­}]|AªøÊßX¹²Ó›BS¬C±ùX‚A`‡=‡aŽ&·~\]ÍáØâ¹žIÚÒòîÕe”’ì‘ÈBî'œÅQ¼Ó­¼_âýOMÕ÷K¥èÖv¦âYgÉ20ghÈëY­¤é–7^.ð¢+M¢bG«³0¶“Ÿ•I$€Ä5Òü<Ó4Í;ÃZ\–p,Oyk ÅÃùi!Q–?Z¹âýßÄ:Eų¹Šâ\ÚN¿z£åX¯_jó»K­R‡zߌž}Úæµ3\ Á†?3Ë;€‹“õ­øGÂ:ƒ®o4ëH­o4ÈâÒö5a*‘‚\rw¹'9­%¤ßÉ,a&“Ã6 ÿhÈÙ…s'û<Ÿð·J2Éþ¥oN†½+ÃÚ6¢iÖÖúm¬vñ˜c-° ¹ÇV#©÷9®gZx´¿ˆ>Ô/K[Ý2}>XáV`Û€'Õ‡Öºx’˺MƧp¾k&Ô‚8iäc…EëÉö¹Í1Íﮥա]&g%„.så'ÎÚzd6#œ{V'‰V퟈ibÚÿÂ!þŸ°|¿i;öçý­•wÆ–ÿ Š[‰ZvŸ$`îC‘Žõ©,ÇñN22«Ká‰U2q¸ùÀàT!¶M_dŒ+É­jÞkwr€IúWö—ká„Wº‹ªÚÇ©®÷oº§k€O°5ÚxŽëMÕ§©J‘XÍá‘ko4„Ž”Xð /NyÅm=í–·ã%ÒäIâÓô‹•»¸„‚™”±–ãv3Pøeà†¡×3¥ßŽ_&ªZ2‹Ÿ…·½mÛN’݃In6þ' ©|['…ÄûCR»Ð5d†-J9"¸MÇ(KeISνêÿ…u}BëH×g¿½ö6²Ê¶×ÞXO´F¨  ã `ÕÍ…4e—ï<-(Ï÷dbËú\÷ˆ5t‹Ä×vzî¯{¦ié »iéh¬Ñ#ç,êŒÄƒÆ2+‡ûÇÖÚßE$¯Ô0Ý$†g‰‚ÄÄ–<õÈô®šæìx_ÄÇW¿·˜éº¦•o \G0·–Ñö‚@`x8ÆET½7~#>)×ímg[ðìÖ{âa%Ë»2¡±Ð9­Ûê|:h"µ•îΓh<…RdÜ6ämÆr>•KÄZ=¤ÿö®©¥ÝÞé×v1ÆÍkæ·–?ï"J°ïƒ‚=ëGÁ:u²Ýjz¾ˆúm´Ë6ípÏö‰•IÉufm«Ÿ»ßÖ¬x²ËU‡QÐ|C§Ú5ëi’N“ÛG1â@%2@%zã#5Z'Õ|W®è×ÇKº°Ót†žr׊I¥t*¦I‚I'{À¶ž¤Íü´¯]UˆÉFx'­3⟮jZ ‹F€O|—Ö“D¬@cƒ’N8Oò5›||YâÉtÍ6ëB›L´‚ö›éå–6 "ù‚Eµ˜Ç¼vª4‹»cJK I¯Ät{µxÂ9aþê†Ï±¯G†­âŽ”,q¢¢(è¸ùí|]áÝcT¼ÑôÔÔìuWIÚ/9cx&UØ`«qß9ª²xoÇÛiÚ¼×pMâ+-Bk´…É¥Z`¹Æ:§š¹o§x¯_Ö4ÍK\³‡O³ÒüÉ ¶I|Ç–fÜĨéÔæ§Ò|=ªYxoVÒf1}¦æMHÄU‰\NÌW'÷çƒøÔz†5[ÏéºIÝÛǧ,ŒIÛû†RØ8ÏcŽ*½ï‡üoiâmKÄ-Å“Cwmm Z\ïö¥—¡¸läçµCuàSÑ|Gýí¹Öµ³y#V‘µ9b<ñ’kutµñRëþz}œh¿Ùæ,ÅüÍÛ½1Š©¨xAµKÏ=ÅÀ[MgL‚È: ’sÁëÅc_x3ǺÖý‡¨k¶ZÃi´€†˜Ç÷|ÍÌ@Bõ­‹ øŽ]gD×!ÔàŠê 5³ÔSÉ%'MÁ›f[+“Ó“ÛÓà4}6âÍõ ëûjmZÎê5­äf%@@èsÔzT¶~×.5+-GÄzÂêO,öpEŽ5Œyó1,N@…jèzè²k †›ûGR–û 1åïmÃxsAöRÙ¤í0’òâä³ïX¶8ôéTµ¿ I¨êë:f§6—ª$gi¢Te–<çk£CÁ&•áKm6ßSÝÍw}ª.//%Æ÷ùpAù@¥¢é‘hºeŽ™*Z@«¾76ÑÔã®H‹"¤æ­]iMîžt«›Xå°1¤F)UÆ=±Pê>ðî­qawa ÅŃﵑ×&#ÁãñÕ«M;M°ŽXm-£†)e’YÎç,Hõ=ê¢h"ÞÚÐiößfµÏ‘–»"È#åÀàž”šfƒáíÍþËÓ­¬üÓ™<ˆÕw}p¡x~KÑ©>›j×Ã¥Á‰|Ïûëýji4Í*[Qe%œh1ˆ§?wý*Xmm-ù†äDù•z;ÔŰӒá¯Ö%ºa†˜ ÞG»c?­Oµ7oÚ7cïŠ02N95“¡hgB:„ÌÆ{£qmÜ}œ8”ò dŽ3ZÁUs€zâ²´M4s¨Jó‹»ûÉ.g™† Ï  sÂ.浨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢²uÍ×]:YžY#þÏÔa¾f>f8 ðsÛÞ›¯xrÇ_[f’i­®­ÉmunÛdˆ‘ƒƒ‚0GPAÍE£xbßJº—Q¸½¹Ôu"››¢¥–0sµBª¨òp¼Öc|:Ñ^;‹C}¨.›4!±Yˆ‰KsÀ8Ï8Î3Úµíü1£ÛK¢L‚C&hö¶¥˜ýÆP§w©À­šçµøsX¼”‰5¾ Ssk+G#ÙŠ‘‘õÍZм5¡xr9SN€«ÎÛçšF-,­êîÄ“ùÖtß|=Ì× k"¬ò™f·I¤Hç’Z Áýó[si:]ÅÍ…ä¶êgÓüϲ·#ËÞ»Nã‘ÇJséšl—ðê7°Àð$¼ä#Hôê+5|á“Pi±Ô%I®AÉWtmÀàœ»žæµ.ì4ûãl×P$ÆÚu¸„¸ÎÉ8aî3Y÷þðާ,³Þé6ÓM,‚G‘nf ·9ëÓŽ½*ðÒô•²þÍp‹›>ϰy{}6ã¥T±ð¿„ôÀ‚ÇH´·ò寗‚20:òjÓé:<—fýì kÈÎQw•#nÆqøÓ¤Ót¹m„–½˜P‚@ctqŒ¥:ÒÇOÓâY[Åo$ì‰B®O°ÅJ‘C‘c@ãJËñˆ5­?ìÐÈ ¹‚Xî,åÇKÊzv>Õ¤aI¢DºD‘€]ÞÀæ³õýõ½9ôÄŸìðÎñ­ÁQËB]#‡ìJÓDHÑcE Š¡UG@¥.Æ{RÑEQERdd òik èÐkë¤K-û£"4²3,*ÝDjN=ð+bŠ*wd­:ã ˜OBÞƒëOŠXg%‰Õã‘C#©È`zGcO¤$Ià ­s¨é¶fÔ\\Ǻ™aƒsæ;tUõ&­QEV›P°·º´²–`·7~g“9`ƒ,xì=N*ÍS¦žuÒ¼Â/Ü\ì Ñ“ŒƒŒ¸"“@6älÓÿÏÝÇ.Wn1øç5® Aç4žd[Ä{×yÛžqô¦Çqm3H‘JŽÑœ8R Sï\Ýÿ‹dд™õ=jÖ8ŠêfŽ8eVÞ ElœùaÚ¥½ñžƒe¬iIž:„wç Sl~Pž‹8«¬èzYu BÚÕ¤û‚yw}2EY’æÖZæY‘ TÞÒ1Bú“ÓË]øÖÂ}Cöúõ•õ½ýü–×M‡(lÃ[ƒ‘ß5×W7ãwRðö’—Ö#)¼·ˆùªHÚíƒÀ+ÏãX¾"ñÒYx³Kð復ef­™vó)w,Ì¡"P@,rsô®õ™Tb’O@+šƒâ€în"¶‡V‰žiŒ1¾Fïè®FÃí†æ§Õ¼iá-éìoï„w‹H-Õ]¤pùÆÕPIÊ—Ç—D$(Ì‘±œ(=OÒ™ªêvZ=Ρy4qAe™ä`«žÀ“êx¬¯øÃEÖôUÖæÞ‰ÛÍ[?ufãêÒ®i^$ðÞ¸òG¦jÜɆdFù‚ž‡p{b­ê:ޤÚË}:ÁkÝò?EÉÀÏãLºÖ4‹;›;‹”Žâø°¶CÖB£œ~u…âï-Ž›­G¦^$z¦Ÿ¬’¹ò–W‘ŽFj{_øFîêÞÎ+Â^áÄpHcq­è’ IÇcš±cÕ¼Cš™•m>Ìínñ…[EdÏßÀÝ»©äâ©CñÂsOišd†òSµÔºÁ+ú,„Ïnp{̳ñØ5é÷_lÔ."¿ÝommöŽ‹è ŸSšë4}cM×l¢¿°rÐHY~e!•”à†j®¯â;"âÞÏì÷w³£H–öɹö/V=ã“TÇšiz†¨b¹Oìûˆíîížfã uÆ0}:÷ªº®§â+ÝCÄú%£ÛD¶úU¼öï,e¹“vðÀ0È `tǽs^»×4ÿ x§6WÜêvöàÀsL¬8%›çô`Òº?·x¿Äº–­‹›§i—ÓÎhD’O2Œ¿€sR{Ö^£ãáݬbÚ=~Ã[¶Ó¥Â“ Þc ¤rƒêHçš»5ÏŽ<9ªh/©ëjz¥è²šSÉwRTÆA$€G;‰â¬èSÆ)¾—û=-´ëoöT‚Ò~mü«’_뺄·ësâÄÐõèn¥K}.ê$K}ªß(fu,Û‡VWïÀ®—Ʋ^XGá=}¶%íž§m Ï”ISÀÛ*ŽGLdvÍw¥•”1RAŽ¢¼šçÄ~0—ÂQi–×ÒÂLš½Þ›$à.ö6á¤'¦9PNõµ'Ц¿ÔtËû{‰ÂÃÃkW‘!ùe2®[é†5Îun´uÖá#ÕÆ½qoö¨â‚ZÙ$ÆD~XŒ©^Ü“ž¹­{»wÅç…m õö•oáùnïa„”bÙ_—H`O^¸È¨5­RÎo\øzúmgû/G±´UOYÙî$‘sºY"øÇÌ2ry­¯ßß=Ö³§©É¥ÁäKa6¥‹&;Ót€ GÉÁ©¾ ÛëÓÅ¥›[K›Ý*;‡mNÖÎM“Ì›~P§*JƒÔñ\Æs .Ÿã}ëR³Î…q1Ñï–E’ݶ·ï#g$€{àœJØ×æš_…M9‘į Z9mÇq%W¿\š«{¡iúÿ,­µ2Ò[ÇáXex°YXJ@Ý‚2sƒßWX²‡Ã—2ÐôÖx´ËŸÜê o¹ŠÁ*îRS$à0äéYÚ߃ü;eàÏ jpFÑê’K¤ùš‚3 ØOµ_çÎìNp+£¹Ð4 øÇÁŸØ¶qÙ ¸õ+{Çœ©a¿ÔƒÎNMr׺f—sà}m®mb”ÛxÂãÊ. •vªØôܨ®Ÿ^ðÿ†cñ¯à]*ÐFðj€¨‰vþí®F?„ôô¬Ý -[TÔÏwœ’ÿM Ÿ­`xvæûÄ:—„ü;x Káuš}S=<èwçÕë”QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¤# Œã#åW:¯Š¤ðĺ 7óÿÂA¹&–.·bF ™Cd…:VÅž·¨x‡Rðѵº’(cÐeÔoQÞQ±U‡û-’3éXRÃ.µá_ÝÞÞÝ´Ójv¶òH%`ÌÛæ8?|cƒÔVªxn OÆŤ׷igm§ØoŠ)Zr…28!Ž9þ.sÎkcÁ‚æÊ÷Äš+\M=®ŸyÙLîÌè’ m»˜’@=2MTø…¦i×w’åÚMrÚØ…vc†'€G>ý}êŒѵŸøŽÒ÷Í’ÊÒ×M mæ8F>^¶$¨d÷ª2ßÞøkCñ¥Ž,â;=V[ ³À—XöÉÛ“Á¨®4ùìťχ¼#ªÙjv×°¹’H€™w ÂRf%ƒ õ½j¼žäEñƒGÞ¿ñ¨€1Þ±ì¡[5cÄ·‡Ãwž0°*šÎ—Å¢¯½b p¾ç*k@hÖ3x“Dðíüb}?Iðüwð8ýÛÌaf ¦AÆj RÂÃIñ­c¥BAákÉ®àˆ›íGÚ8Žƒ5U´]ÇᄳZÚE×:D2M Q½ËÇ'®è3Z{¹¼C3xšÝ[{(æÓpÙŽ;frG>u?|õ?Jíõ(Ö[ÈØÞA‚8é^kaµÎ‹ðâÚõTéÓ]7ž¬ו¼ Þ¹oÖºOEkþ{DUÔZúEÊðM¸CæíÖº-gN‹WÓ/´é8[›w‹>„Žày¯'7WzݪëXÜø[L°.fI·IÿŽ'?ZÑ»o·øKÆ> #þBºˆòIÿžJ±§ò'ñ®ÇqC‡ôá¬k¥¦€ ¶AŒ}+_K«‰>'[Ú©3}“Ol/V_/,?šÞÔuÿI¡éŠë¡ivÖ±ÙÚEµšFÈÚIw¿Lb ,Ûþ5aÿÚàã®c¥ð)_ …ñ5úà˜ÛT¼\žmOûN§s¢j¦ÂO³jȱH¹·ä>öz×;}­êžñ½£ÞE«Ebm Z„…ópÁ¤.A1ÔV§‹üeá]Nß@·Ó¯ãº’mgN“÷'w–»ÇßÇLž89«–öá=_ĶšõÊÙµÕ÷Û­æ›!&Ô¨{•#ëU/µ95™<~4ãgÞ%saóKÆÄ„``¿^sõ­¿dx¿Á'kP÷C©­?h­â- RÒѶK“ªxÖ Úx}ü3x53b-"•Šy …v«»nàÔ`œŠ¹s¤ëÕ´ NÇO›S³µÑ“:@WÍB0p€ ‘Î*]ÓÅ·Þ!×µMSKûµî™ÊdVa´žiûÜäã#2k/JÒ|a.‰áM6çF{i´]rͤg•xSvç\7lô<ûV¼6Þ/𮥭giCUÓu;ƾdÊ®>umÜ$dÓÒ©ÉáO¤É%ÊDú­ÿˆmu;˜Ñ¾HcIÊã;z ž•Ñx§IÔµI|:öj„YkV÷S–8"5 œzžk7DUÒBBê°Ûêv¾‡nR@=ÁÁük7PÑ>!ÞØ^hZ…Ž™«Ç+N–úËá£ó‚ñˆþúƒÆÓøúϯéX·ðW„!Í$wV³NÇþ}ì׿cõ8Ü×\m·‚¦ƒÆ·>%ó“ì2Û³-¸Îápê¨Ïéʯ4Ïøør=v;éÒéu LQŸ’Ùr{Ç8â«§†>"Úééáë-nÖ=)ÉŽð£ý®8{(ÁÛ¸p{ã5¹ÿÓ®»£jÑÜ“Ÿ¦ObRL³É¼®±=xç9ÍC«øsZ:©×¹=Í#ðýæ°ú}݆¥&Ÿ¨XHï ª¡‘ƒŒ2ºê1Ttï\›»ÍGÄ‘ÔîîtæÓˆXÖ8Ò9`dåRMdMðÓS½Ñχ¯¼Qw.’‘ˆà‰#]BŸ”;à– éÅjjÞþÐÖ,õÛ]^êÊþÏO[8š ¥H N\ry~=§‚í£µÖ’þþ{ÛífØÛ]Þ>ÐÛ6• ŠÕ ’@Áç®jÅ÷„ôÝCDÓô¦˜[Ù"’)ÛìÄÉÆ9Ç<­êž£©èÚ¤²H³iO;BªFÖóWiÝÁ?LY“xAŸEÕô7yþË©ÞÍ{+ÒI~PãŒÇñ¤¾ð6¨ÛèÑ\jZÚt§‘ ½Y±9ß÷ƒ69qÐSµ_éä÷Ñ^_ØMr¡n¾Ã;F.00 Hd`ã½Z““DO]1ì‰IX† íÙç9Î{Õ+O‡þ¶º²Ô%ûUÝõœ¢H.n§‘Ý00$ýßl`žNMlÙhºfŸy©_Û£ Eã{†.Ä1A€I@)Ú¾¥k¶c©@&¶gG(I¡ÈäzÒɤé’ê6ú³Â õ¼[Ç.OÊŽA#Ç8ô«SC ÄRC2,‘H…d0=A†¹»o‡_­#ž(´[r“ÆÑ8|¶º…ÜNû¸­‹-EÓ]%³´Ž)Ö;Eu7•Ý\õÀ¢âÚ;Ôu :Â9uã ÊF¸hÆ3‘øzV?„´[û9ugT‚85-bå&–(Ûp‰B¢nã$rIµÓÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢¹Aàâ¾1o ‘ä5¶ ¾|í»7ç8û¼tϽ'…<<56¹)¹hN|L ±Täž…L}*±ðN§…´×Q5 .â;˜nZ<¡tby\ôçÖµô­òËW¾Ö.¯i¯,­ ‘Q6¨xË™¸lð;zšŸLÑŸ©ëš‰¸2iˈÈÇ—å¦Üg<ç¯AQx£@ŸÄ–±Û^;»KÈ®íç+¦z©À=iú^ƒ&Ÿ©_ê“^5ÅÅí­œ2‚¡Wt Fà÷³œv¨?áÒ¤!Žéžx5¹VI£lÕ ò‘ÏlƒØÕ¼w4öŸÛ:åÖ§ee*Mom*¢èr¦B +Û8ç­uÕ‡qáM"çÄ6ž$rÿl¶€ÂŠØxa’1œ€HëF»áMÄ7z=íðs.•söˆ6Ù ÁÈÈ•&»á½?^6ÒK,ö×V¬Z ›W)*nà€yà÷M𦓧E|¦K‹©ï¢ò®nnd-+¦0î0lS?‡4‰41áçW:xµ[lo;¶(ãæëŸz–ïCÒ¯¤Ó&š6ótÙD¶®¬À©Æ0H# Ž äÐ Aä sÖÞð¶Ÿw¥-™{©|׆Gv ݶd¸í·cGð§‡4)žæÊÜý¥ÓË3Jìï·Ð3– }+j¨A¢h¶É¨G ¤jš„%Úã"Vqƒ»>¢†ÑtFÓ¿²Ê§l ör£fÎ1õ©î¬4ûè– »xæ…]REC•8=ÁéNŽÒÎ)繎Yî ¤n“`ÀÜ{ãµQ¶ð߆lïQ¶Òíb½lætCóîjüVÖ<ÒÅ $“°yYTä esZX­í­üÏ&$ÌÈû˜õ'Í2êÊÆú?*òÞ)ãÎvJ¡‡äsO† {xÖ#HâQ…D(ÀSbµ³ƒw“qîm͵@Éõ8©#ê‘‘NâŠ(¢Š(¢Š(¢Š)2¹ÛžqœPΈ ;QÜž* ìlngµ¹šyíYÚ=P°ÁÁ÷jÅ@,¬EÛ_ˆím€Í›`9ÛŸLóSÑEQEQUþß§ý³û;íý·ÈûG‘‘¿ËÎ7c®3ÅC¤êúvµ—6.ÏwÛ±e#çŒáºã½^¢Š(¢³õgOЭ’îô¸‰î!·“ºV ¼sO7—ƒS[c!µ6†cw‘°8llÇ\‘Ï¥3DÖluûõ0â T_1pÙŠž>£ŠÐ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(ª7ZÆggy¨MtŸe³Þ.$S¸FW¨;rr;Œf¦[ë–ñùÓDfŽ2FæAÔ×>•bЧg©YßM}oÿ2Êa Û‘€ÜT”=FjåSPÔôí*8¥½˜D’Ϻ ËÈp£€zšEÔ7j2iße¸-Ö´ýËdãhlýáÔŒt£JÕtíjÊBÂC%´¥Â1R3µŠž¨ô«•JÓU±½¼Ôla,gÓÞ$œ "î'ƒÇ¥]¤$’p)i QÔãŒÒG$R¨xÝ]Ou9Ô4Õ¸†êrFDEÆóÿÎJÎÔ¼M¦iz®›¥\­z³4º…ˆ È ’ÍÛŠ¿{ªèúiŒ_^ÁldÎÏ:E]ØôÉ,·vp$rK™®zÃÇqëvž*„Ï-‹Ø›³ot¶Òâ(QÁ—Á?tàœ}Úß›Äú>“§é2\ÜËw5ôý™bŒ™nNÐKQÇ©èµI§x³BÔ¡Ô%‰¥Ž]9K]ÛÊŒ³DÏ(yätÆAõ¬ƒñ7ÂæÞ+øà¿“MvU{Õ·&"zï'Žø»%euVR °Ѓ\Å׎,£¼¾²°Ó5 JKݵ¤`¬LFvå™rGp¹©åñŸ‡ãÑmuÄie·»‘a¶‰ù²ÊIpwdË­Q¶ñì'TÓtmCEÔ4ûÝBGXê…U,NåvØêjt¾6ž{ÍB×FÑ.õ$Ógh.æ£U(ÉTÞÀ³ý>µ ÷ˆ´=ZËÂ:²­ç“}¬A l+!Ü1(Ï* Žy§Éã]RãPÕt½Ã÷·:lÂ9Y¥Hã Œ‚ç“éŽÝ©ãÇv‡AÇØf&óìbb¡ÅÆí» ghóž»T¶¾#ñ9»{ ÿ½½Ä¶ÒÍhé(xddØîä'¶AµPøo©ø—Q³¿þՈ㾹T˜Ì]·o;“F:¸çÐUè—Ïö_èу­éš5ÿŸˆO߈ãÔt÷¬VÕ4߉…‘„“á½&(ïï‹‚—e#oúæ9n¼ñW¢ñGÄ FÆM{LѬßIÚÒÛÛÍ+-Ìñ¯ñ )POP~µ¤¾.:Ÿ…mì£G²Öín§.ÄïO)OcVŸ]»_Cáÿ)>Ï&Ž÷Þg;÷¬qéŒJ“Å:ûø~Æ9`ƒí7·W1ZYÀN“IÐØ§éX“k>9ðåÆ.¿ö ­:öî+IÑÙå8Rw3\ð~éïŠMZñ¾»­êöñ›(4­+W{w£™fEìpŽíÏ_»Åuš¤÷öÖ“Ø[}¦î8 ƒpcÀÉÀ>õçw~-ñ‡.™5çˆô»Û‹›Ø-ît¸‘CGæ0 #erÙOö­[­CƺŸ‹5mMÔ ²±µ²µ¦0‡‘Lð¹ |Þàã9¬ùõÿÚèþ-¶[¨®5Ï ¢ãÊ\@Ê‚¼€vç¥mj~"¾¿¹ð…®…p±ÿkH·³9Pصw0ç8-­¯k?ð躎ª#óÚÈŸÞsÂÄ‘\–§kñ@Ñeñž"{«ÛH>×ubñÄ-W–D‡óPAiq}ñ ص[´†Ãz± Õ}Ììî{äýîÕOÂ>Öu›]nSâ ë(SZÔÚ2¨ƒòÎJ’Ù=³Š[êRøkÁñÝÞËku­I,WW¶ñ–‘Rß;Š*«aŸøH'Tú&²ö~$Òìô«ýgQÓ¯VX®Òþ ±*ådxÓô#8«Ÿ4ýZþÚ={TÖon¤[›è`¤ýÒ¢ÈËó/ñBÄàc+Wâ&µ{£hЋI%†kûû{4ZHćæ(¸9l¹®V9.t‹íYøÚ[Ø¢ÔôLñÉ ðÌÛËeà‚»*µ£xrÛÄú÷Œÿ¶o/.-m5o*ÞÐO"Ç1©Ü°çŽp=9®{S²þÒðeÄZ‹Ïs&‹âÆÓí¤’G.bûJ¨ÜAäàà’;W^úNŒìtdFkxRævÁS0ïœçž¹Ï½sðmÏ€54ÈŒzª^]ψ͒ö“?–:ã§ËøÖéÕmüu­x*Nm`³þÞºP~ë¯ËŸ£çò¯I¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢¼úOêÅÅóÙø‹MÒ-índ‚Þ+€$æ> 8gRž˜Ç9æ¢ox—VÓƒãB-SsÛêèŠÐƘ0Ì‡Ž­éÒ´o¬µkÏxféui!7\²a?(RÊ2§‡={ŽÄVŽ—â+ý)|_m­Ü›‰´iê)(/o"îŒpÈÆ:Vσƶt 6]fá§Ô'‡Î™˜G™È\(Qò‚Jæ5]k\†ËâÇ{"½„°‹B»shÔ¼~<æ£Ôì¼I¡é>#^Ï}–ou•ò¬Œ(hsÁÎ}èñ>¡sm­ê ¯\jÖZ7Ùâ7xo(qó™ `ÀôÈÆ*–³Ôü'£\6¿.§åjB·P1O1^P?xûè;œyÅoGo1ñU΄׷Mb|3Á™÷†óHÞwÜ×+£Z7ÁšUí½ÕÚÍq®[¬¿¾|K†8÷Àïší|g<ðÜxSË‘Ð?ˆ-‘Â7ƒŽ£×5ÏZYÙh¯õKT•î4Ûxf€<ŽÃ- cœ±Ï>¹ÅdÅg Þ—¶ÚWˆÄml'MHî¥# Œ¾Ý„ñ¸ÛÚ·5ý?Ä÷:6©¨èÏ«Y %VçMŽ@­Ãrϰ°VþèçŽÕ«à 4UƒS´ÓMô+ Ðg°¾=žõáW9;OQóõWÅNŸ«øÃÃV÷£|&ÒìÉâ¡pv°FpHïŠi°Ò<'âh"ÒÕltûÝ.òkØ!<œ(^€öàs\½Ö—lþ½“OðÉkqn×Iªê"ÜJÙÏ›…·w_»Û¥tšŽŸ§ßëÞžêÒÚêÖèÎÒ"“!XA]Ùàôôªº}½Þ©©x–æ_Zj’Rko:êUù0 VFÀž:æ²fÒ‹øbËL¿Kcgÿ „Åoo/šD̓lºKƒÕx“LÓtýoÁWV±[¼z‹Ûƒ…´ÿ'ð‰?ô2ZÑ«$ª¿ü-~ïÓ¿ÙéªTËðªBA>K¯çkW¼q¤ÛØkâþXc»MVùµ/0ÕŽ gøvãâ¹½.öÂ?h‰ockp·>!’;µ!¼Æ(íAÐw&®^ϨÇãCªëV—WAïȶ·‹`ˆ4G’îÜô#=…I ŨӾ(Ú4è'š„¾Y#pC󎸤ѯ,´½÷Z¬© 7~µ·²šBoR ®O#ÜT׳XêÞ(×/´÷Im,ü+qiwqLŽÛ•28%@'¾*{ |+Còùð—'±>^Iüù®»Ãí¿EÒ9Ýalsë”çcÄv·wÚðÕ|Mý†,õ9¡]:ÑcY¥ €–Vv2vØãY:Ü0èÔ×ÍžÛ@×/ÿ´¡ÚZkq)‘~öW ž3Îq]§â½Ä>'ðbén`†ös%ÈF¬Ñ bÉêqéU?·-îïu„ñ³¨Z^[êÅ•b®žd@ü˜Ú›œ¸ç;»öª:ÆþðMœJþvŸâØ¡¹‰•·DÛäl6GPÍvþÜ5Ž£û],¤˜—¡= ç’!ƒâU¼Ð¤Ô¬äñMßÚmʰ$°Ì‘€2Åz¸ÏcG†’¼C¦/…nõY4fŠv¿ŠìJmâ]¿ C(6îÀž+_áåÄ kG¹µ¹‚êßT¼™Œ‘0ÒG;J¿Ý9ö5Û× àítoØÞÚÉiöÍ_R pLn†Þ•RÃ^ñ&¢Cá×ðö¡&¯kkö(e‰¶ªíGós€§‚r8ô¦Þh𝅗Á7–Ö3jI£¥Ô‰l“ý!ydŒ€Ý½*ÎŽþ#Õül5«æÃK]KX^à vc"·Ì¡‰ö‚¶|i£êz­œÚXFÔ4ÍB ûxä8YLyÊÛp'ŸZÇ»oøÊçJ²¸Ð®4­>ÖúÛ¹®^2dòNUQ˜œ¶2N8­ iz–wâ™.áòÒóZ–æÜäñ²(ÏŽñV¼a¥j:߇µ]7O˜EusnR6$€yä9‡ë\.¥áÿjLVZW„ìt…¶žÖyÍ}ÁÁ …§V5×ézV­‰õMfâŠÞ÷L±Œ.ðJÊ›·=3×½?GѯíuÏÞÝÇÙ5)-<Œ—T ¸cŽxï\¯Ã-xu=nòY¼ëM2Y´m1»RRíõÁ!síŠï5í×ÄUþ“rqÜ-aÕOfàó\•Ήñ/\ÓLJõytèì$Ww°4†iâSÈT*³c“¹€Ï´/¼;¯Aâ'[ѨµNeÜSîÊÂ01í{·$ Ðð®…u Zê\J’5Ωwv…3€²¶@9î;Ö¿5+oè–0jëè·S\Z]*ÎÍ”eÈ%YN#Ö´4½Æ“j±jž!Õ!1ÚÆéoe`abÝ^MÌK@xzÕï hxgIM1畹º”8\q,ŒÀc'¦jè6~#ÓÞÂâGˆù‘Í ÑýødŒå]}Á¬[ x¢òÿNºñ¼·vút¾t6öÐùK$€aZ_³Ž¸íZÚ6‚4‹ízô\µoVëfÜyxE\g'=3Ú²'ðhÚæ‘ý¡*KW“SI‚ŒÀæEpÏ íZ>žOOÖ/u.ï­tÉ,drŠ«.÷ ¸ÐñŽ*–•¢Ùx böãW¸}%ç{…·‘[c#äíÚ¥ŽIÿ=k;ᇇíì!Öu¨á’Õ¯æ’Ö)A ²»yciäg$ãÞ»ê(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢¼èxwUЮ5-|/c¬[Ïs%ťļ^aÎÉ7)$)èA¸¯Eà ãï¼%©ÝCã8’â:ß–m²÷{c óþ>•¥¯ø~}gÃÇFI’9JÛ1+˜™Iã óZ‚óHñ…¾§y£jp´‹{[ÕvH™7FU†2:Œr{Õ< 9ðíÞ—ú®¥u~5ºòþO?xn<.ÍiiÞÔ¡Ö£×oïcšëû,%X£*¬ÂBåÆY°;cŸ­dZøù4}KB¹Ö –R\yús$@IjÞa|““»“è?^&—Ášö£w£Þë k‰4˸®#Ž(U#m½r2NOçŽp9­áyÓ_Ô5eÔØu(;ËŒ¢mq9€æ³À7Ò[¦“'ˆ¯AL(²ÚÌ`ñ” Å;v8ïZz§„ÅÍí¶§¥_ɦ_Aj-7ĪÉ$ ä++ pz`ŒU½ @‹Er½Ô·—×’,—73ct…F@@è®ÅšIÕüQáxK\©ô‚æÜbevöÁàúVΗá; .înî®5+˸>Ï4÷dcþà @=ð£5ÿ ëF{_ìûCQŸNEeŠÑç>\`ôÆ0NßáÉ8«w> Ó.ì´{9ooƒéLM½ÊK‰°F,àŽ:•&¥àíP»šõg¼³žà ¹kI™<ð£88ÈÁ÷©Ç…<8ºvŸ¥GmåÙØ\CsnˆÌ1$g ’O=rN{ÕÛí'NÔ¦°žê2òXÜ}¢Ü‚F×Áàó×¾j¬~Ñ"Öf×ã‰×Pš1Œ¶¸+¹ÇµZÔ4­7T6my˜lî’îHÙ"g‚:g½iT2j2¥º‡ÔX²r|Ì.ÞAöãŒU;Â>Ò…¢ÙØ$bÒâKˆ2X˜ÞEÚÄdž£Šæõ{+ùuIæ¾ð=®«p²Ÿ±ÞÆÑP}ß7Ì;Á‡¥lè^·‹ÃÑéå½½ÙšIn.¢+º-ò9|GEÎÒ®ÅáÁ Vñhök S­Â(‰~Y£tê=jwðÿ‡d»¹¿}:Ù®îa0O)EÝ"V8äjk­'G¾µ[»(&´@¡a‘  ÓŒqÚ¤µ°Ó¬`¶–ÑAn3û¨Ô篎jAol°‹u‰6Àvúc¦)ꪊª *¨ÐQ›kF•n3(À¨Ü×­fëš~µqn‡C¾K ĸY™š0É0QÇ ê#Ö²l¼=âkýWNÕ¼Guh³D¦ÖÖÉ'™ Ú]™ÎI€0>µÖ`g8äRÑEQEQEÖŠ(¢ªê:u†­i=ô^m´êDÉÏPAýhÓ´Ý7H´†ÇO·K{XAƃdäþg­>{ÛY-⸸Ž).d1À®À áAêqÏéîmm¢šyåXâåv8 d“ì>9#™XØÛöÛ1j!º’(NðÞlc~:gÐò*Øšî‚E.ƒ,¹Zl7· ´$ª§i(AúqRÕ;]WG¾–Hm/­ç–"D‰ŠÌ¸õ’(—WÑ C5õ¼r´ËF‘C¢ã?xöjådÁ⟠Ý_6 ^ÎKàJù *—Ϧ3ÖSÄþÑ$Xu=JÞÚVMá$po®:ãߥO.µ¢CÌ—°ˆ/fŠ i7²¼Ÿt)IíS\ê}œ¶\L±Ëw)Šn²8à~±o<{à{ &†}R?: ¤†XÐ3:2}쪂@¸Ç½Rñ?4½JÓ5;âž;ûˆ„OµÙ-Ãy{Ó=ûÓ¾ñ‡†ôû[+¹§r/P½´QÆí,  ±…-Ç–kâï ^é—Ú´E­¬QÚèa$;Hd#p8í¶ ±ñÇ…5kûø.›ìQ¬“]::ŃÙX€ ÀÍG§xëÃú…íµŽîÖ[µÝh×p¼kqŸ°ëŽÇÚ³ü?âˆôï ßêÚýë:[jW°™ËJUUBŽOaÅhé¾5Ó¯¯m¬'Óõ >{°ßfûdVR£$ Î*šxŸHЭ«6²t-cIû ÛZ5ÜG(’)Q[g AVª|SÛÿf²Xà³=|Õ«º®¹â$ÕaÑ´],O'ÙEÌ×w,ÉjN‚·9ôÀ¬·ñ¾µâ[‰t¨ÓUÐ~Ñ”´N¤,®»“ʃÅO¬xàXjþ°¶&·Õ•dšbNbIXÈã3rEG«xæçK.¹6k%–‡öHc`H2Í(ƒ@UÈϽM¥jÞ={Í<Þ[é·Ú]à`×:s¶mÎ2 o8e=8çÚ´<'®_k¶ºŒ×q$omªÞY¨@yH›œ“Ék™µñUþ«§xR¼²´kC[–ÚLÆO“·Ì]Ñ’I Àç'©£Á¶¾!)ñ’^]YÉÚ û\qÂÀÈÏÚA.pàä6}«KáüÒÚwÃ’9a¢jO ¶ãÈ·nˆ~ì+OÅw^$¶·´]í­Ö[€·w·$lµˆX)eËvãÖ¹ß x§P“ÅrxvMvÓ\·}5îþÑ"´Ž£l%NAÏc\öŒ6øsáù e<]*ãÓ÷“ ÕÔüco¨k:Å”¾/·ðý¦™?ÙR?ÝyÓÈsæù8^py¦Zø÷W¿ÑZÒÆúÚçV}v= B%' Âm¹Ævç€qŸjµ­Eã_ Þø[gˆî/l¯µ«kKŸŽ-ç~xR¨¸Sƒ‘ÉéÏZ¯¯x‡ÄÖúGĉ¡½xæÓµ x¬XÌJË@ãÔž¹«ÕŸ‰|1­·ˆ¯n®[R²‚ö }žU°T 6ã<`þun+}KÆ:Þ½æj÷¶Z~“t¶6ðÙI°»„ îçžNéÅMðö]tMâ«-WQ–þKe ŠYHÎÏ-Hàp:×mEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢¹-6_í¯j÷/Ì:$1Ù[ÂI†é[ëÀ_ÿ]cÚxžëJðæ>£[«^ksY Drwä68$Œžæ¶-õÏØkZf›¯[ؘ5E™`’ÑŸ1Éî*Áú‚:¥BšßŽu´½¾Ð ±K&–+uºÞ^ëË8b ÷~÷¾*+ɵx~úêÎK;©ü?rd·—ïD|ÅÈ?N•¯áoRÖ<<5;¡ºÍØ; û·`8$öóXÖÞ(ñ.©aák[/³¦­«Û½ÅÄì„Ç qýæ œä’‚ßZ§~&¶ñå„Z­Ä@h—_gi|°ÈuÉííM‡Ä~-ox>{iî¥xm¥Ýî†KŒc<×¶¹ñv‹¯éz~©ªG¨ÙêpÜàù+C$+»§•#×'Þ ÓfñψôéuÛ=R;E¤{3 ²lB@1ù‰ls‚1Ú¶<¨êZ·‡4ÛÝBQ-Ü«(•¸«°è8íY^'Ô.mõc÷ˆÓHÓª´1Û”73É“¸Èçh09õ«>Ö¯5{mR;‹Æ½ZƒÁ Ì‘ìy#Ú,¸^yþèúTºõÞ£{¬éþ²ºkEžÖ[Ë©ãǘ#B*SÔv¬ÍCNño‡tïŸkçÍ´Çlfêc@\œVu}>÷Áéa«Ùê×÷!o-ἆêRë:HB’0ê6ãéY¾ ûLzÖ©'‰#Ö†˜Îq¦¼žL(%Ö"ìòw+lT—­ê^ðìö7÷:昒Ëý£%‘ò®.d/pß/G$TþÕô‹Ki´ùuWòíVá´[¨ÜÏ¢ó’ b3Þ§×<]©]hÓý—OÔ4©¦º³´I®ã TNØ,¼žT}0H«cÁ6‘y¦ê:]ä–\Æ·$ŒßlCÁG Ø,ݯjÀYl…üK ÕíŬRx’êܵªæi H?v€w~•Y, Òõß Ýéž›DŽ[ãm,²H¡§VCòº+¶sŒå¹Rê‘ÄÞøéÿ 3`ôæ#š³âøRÊï‚ÚÌB×:¢ÚÝKa%Â:’Ë#– ŽrMlYéš^‹ãˆ¡Ó-ã´†ëBv–(FÕvŽ@8Èt«¤”hÐÛohíïuKK¹à¤2>çß§ãYþ0ÑtÃM¿Òìá´¿´Ô-Ñ P¬åØ)BF2u¦Ð4ãÅ*¾žÖ9nẶ»¨&1³9\ô'ÔV‡Ä ¯`ð¦¹%™a0µ#r}åR@b>‹“U5'áý®¦-â$}´Öe,ïdl(T%\g=ê?Ce=׋.§Œ6¦ÚÝÄW&NXF ykÏðíéÚ¹%{Kk6Ä&“Ä+qlGÜTÜ7mí´6zqœ×]âû»u×ümæ/œÚ¤³Œì°ÏæE/-íÒëÆ3*/šþ#ºFaÔ¨U í“ù×(²C‰/åÅkâŒàÔ]{ñšÓÔ[Y>=™¬õkK´èÖâÒK˜|Å•ÎõŒù‘€AäõÈÇ¥R›Ê™~!^]/îBû=ÓAÈCª1_Ÿ{Àuô­iëÑB< á¹ÄE´ûFÑînãQÖÝ6–ÈîSô­Gľ ¾¿ÐlcXuk»‹±-°€£ýŸh'ÍcŸ”߯¥rú³i¾™¢û8 âË›W¹ºMñÚfSûÒ=W¶HÁ=i·Ú®—ˆü(óø±µF†ô™› hwÆ@É@ Ç .xÍ7[ž üGÞAø’ùé‚b®»Åç×øÈ:ăÿL[ÿ×Om£â^§ÃOÂqIñ'Ÿ Ê$›Û œùËéK¤ xßÅGa°Ól¡éKá…uñw#o­H%HyC¡ïU¼}u©[K¢=í¶‡$ó N{c*áv PX!?xùW;¢2ÛÆºeÞŸ¦ê‰§Ía=’ß]¬íçÊX7&MÌ…¶ƒÎ+®ømwyá=b [y.'t‹dQ),Ø‘OV‰bžOȺ펫{¢5Œ?a†ÃÌ1y£;üÑ)-Ónî)<¥Ék¨x®ÆãAŸLÓõ! ÖñÈ2†-›f†óÔŒ“Ídéñdú?Š"½¶e¾±† ?H,1æ%“™#eÉþ"@Ï+¤Ò4ßXx>îT±‚]{P¸šúêÒã”Ë&Y gg$Œõ¬k ;{F¾ð÷†/t‚ç~£,…c‰âÁÌb5v X÷ ×5£¦Iã? ¾»¦Ááù¯ÚëT»¼²ºI#•œäy™`Ë´õŸj«£øgÅ6úmn¬ñw§k²\Þ(uÄhZ_›9är8óÒ·´›?é¾/ñ ¾ž_JÕ>ÏöqÀ÷«sè^+ÐõM^óA´°¿´Õ§RÃvå¶…$0GʶƽWÕ|?~|;ü$:ôú²jÐßZÝQ¼á¿wƒ·)Û““šÉñ<^1¸Ö<±}cæ ~ "²²ûÀŠKÈÅÎpƒ°ç­mjþÕ5Ú%Ô*ÚõÔ@X6#ØîqÚ·í­/Úd•‹ã;ÁèçÖ›eáïéo…5+[4“RÒ­¦¶º²2æE)è¯Èܧv5zÖÏÆz—Šm5CO†ÏO‚ÆæÝ#óCH Ë`ó{ŒsÖ Óü/â4ÙËBãKÕ>Ñt7ð©—û§œé]«¥_Þkž¿‡Ëû5‰¼ûFãó~ò=«´cžzò+šÓlüY¤é·Zv¦M¢Æ÷F ò1{d,K)P ±Lœ|ëî+cá²Hžуõhåp}U¤bÐŽj Å6"Ôu+”Ô¢·I Û2¼!”ª¶Tõ#Ž{ÕŸ è~$ѯu™5;›k¨ïæ[¡,A•„„Ë´ämãæ'Ö¬ëú.¥wse«iÇ©d²F‚`LRÇ&2¯Ž{dÐö¬¿øE¼O©E®\k:œ_mÔ4é,má· ö{d=ö±Ë1=IÇ¥jj>—‡íôg¹1Oo ¿“rƒ˜å‡\î=zwª?ðŽx›VžÃþ-BÚkK„¹HmbdóäOº\³6ëß¿j’ë@ñt…íÞ‹®G ½ë¬’[ÝÂe°&#½qŸBÏj„x&æ×OÓ!Óuymõ æ¸ûNÐVf˜’áãÈ=¹â¯hÞÔmµ 5cPÚ‹[}–3b8â;ˆU˓Ԗ5©«éV:Ý…Æx¤Á:€vœAÈ úƒÈ¬ßË{cs­ksjPéò m xÑȹQó0íÓš|žÓäÓ¯ì>ÙpuªÉªGp„ ™›#oÀ÷ªÜx kù-/5 ~úmFÎd–Úq±V-½@Œ.ß›¹!¡*ýσ4»«-~ÆIçë7bæbÊ7ËÂñÓåïšÐÕ4;ZM.[†6›x—pì8ÔqÈçÚ–MÆMb mšOµCföŠ ü›]$^=j}KMÓõ‹;>þ5­Â‘qõçÓ‹aà&ÎîÞòk»ëçµböËw;:BqŒªð3Ž™ÍlZiVWW÷°!ß:<ä± ”Ç¥Z–(gŽHfExäRŽŒ2 C\ÝÃïi÷pÝÅk#µ¼že´RË#ÅzÆŒÅWÛ¬jþ ð¦·t×·¶y¹xÄrIºvm¤gñÍ]—@Ð&Òÿ±$±„éžXìÛ~M£ÛëÏ®j†›àoi2C5ž—Ï ‚Hå|³«@Ã1'€}qZözv§µÓZ[¤-u;\NPcÌ‘€¹ÅBú„öWsXÂl®Þhv®ÎrI¤óPÏá ]iði3évÒiöøòmÙHñýÑÚ¬Ûhú-•“iÖ¶0CbÊÊÐ"„7\®1Ïz´ÁKF«  E@РczUK-CÓd’[ {i$vŠ5RÃÐXû%Ÿ•$D~L…‹¦Ñµ·uÈéÏz‰4½&(¬vp%¸`Â%E9Î1вcŒ†A rÃ~´¸:Qœ÷¥¢Š(¢Š(¢Š(¦MwK ™Ù"26 c‚9üª+-6ÒÞÆÎ!µ¼KH:*¨ÀbŠ(ª×ö~©k5•ý¼w³.Ù"‘AVàÖfàïx~VŸKÓ!‚vy¸%ð{bN=­°AèsŽ*½åþŸ§ˆZòâ8yÒŒŒùî¨ÏsÚ³o´ßxŠî[kë;+ë»/ÌYQYáÞ2¹È$g¨­x`‚Ú(á‚5Š(Ô*"@ì©*%¹µy¤¶YÏ«¼a†å Б×µKEQm_N]Q4s!ûsÚ5Ú¦Ó-[i;±Ž½³š½EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢¨\i7ލÁ–îÑ%7¤ƒ•oQœèE_¢Š(¢Š(®rçÀ^»¸šê}.6’y<ÉT #z²“ß#žõ·4úv™ni"¶µ‰B‚ä* 8£±Õ´mOØ/`¹ÙþS«mÏ® «”QMY"vtW€ÀW>µ_QÔtý&Î{ûù„6°.é$9ÂÃ&šº®˜×±iË87rÚ›´& @Ýœc©õ«”Us}`·i`׋Dž¦XIÊ)Á`:àfŸ¨ÚêQÍ%¾ð±\KoB§tg#Ðô5nŠ(¢Š*‚jöO©Üi+¿íPZÇrÿ/˵É׊ÃúÌzö™k©,&9Ø‚FÆ+×ð­2@<H®Ž7#_PkÅšôþÓ©¨¸Ž+ˆVp[nÈݰXprG§Z«ã¿„´”Ô µsI0Ž8·¸m,Ç 1àÚ¤ñŠJðúkV1-ÓÜ ²FIC1yö9éZ·z®“¦ˆÆ¡{ojÒ ¨–E\ã®2EM%íŒ1Å4·$R²¬nÌrÝ=ÉíX7ž(ˆêžµÓg¶¹´¿¹º‚âEmÅLQîH8ÎzçÿQX:Ä«´ ­BFìC-õüväÄŽ8bÄc§}ªEzrG*$‘°du ¬:zYz7ˆtÝoûH[‰#}:òKK„”`«'~§ƒØÖRøÿC—NÓïííîæ}JâX,m‘›9ŒÌ£vŒg$Ž*ÖâË}Jò].êÆëNÔãƒíf¹ —8ÜŒŒÊFzá²=*Æ™â;MSAüPJ&›Ê|oY ޤgZ¹¤j «iÖ:ŠFÑ-ݼs„lewŒàãŽ+†±×µÛ?x¿NÓ´«Nauo?Í(H¢Vˆq¹ÉÁ'  ùVÂøòÔèzÁÓ®~Õkxl%°\À`»`’}?*t+×-õM3NÖô?±&¦Ï´ÑN²"©m®®8FáWt/¦«.½muoö;ñ ™ îÌxܲg‡=+"ÛÇw·Ú~‘5¦•¿RÖe¹6­&Ɉÿ­‘öü£8 ÇkGKñ³ý¬º&½a­ÜÐ=Ŭ¶ò—ŠeB7™Qƒ.z`ñÞ¯x—^‹Ãºs^´-q3˽´@i¥áTêzú Ç·Ö|c§E­éV²YßHb2Ø4Œmheå{d` «gâ/øŠ uoÙéë¥ %[Uºi<Û¥Œ‘¸ùT1d7©ª÷¾?Önl|'u éðÉ>¹u-¬Ü±K ;²ËŸ¸AÏ qÖ®Ûë>5°×ít=a¬%þÓ³»šÊâÙDoÜ««9Èç³ ûW!¢jž0ð߆¼qª­Í”Íg¬ßb3ŒÏæ¨vÉ“îNQýã]&«âû?L½ÖŸ$·šÞ˜‘Û¬E–Ùd88bÙ/èØ=ª²Ãâ˯ø®×G»†Æ†Â[‹—‹Ì|ùxPªHóœç¥3Qñ‹4#Å–w’Bú΄,äŽí#ÂOì0Å 8=AÁÇ¥t¾5Ö5=J´¼±‘c‘õ+d%Aù%+Ö¹ËKMZÛâ.½q&®ÂÝ4«k©#'Í÷Äyë…ÇQÉÏ5kãí›7Õÿá8¶Óï$I%·ÓbhâQ÷V\‚äž7a—ð+nßÄÚïŒãðÅ–›tÚ[êcêWóƪ]&È÷†¶y àz4« gKø‡µî¥&¡ xzf·–`¢EjåXª¨8=潊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢¼ú/xŽïWñ–›%Ú[Áj<†& -rÇ9VÜ|ÃÊãv;â¢Ðümcá­>úmúãN³´‰.ï×q(fUfÞÀ§Œõ®›Vñ9³ŸO²Ó,dÔooákˆQ*—fvàxàæ«[x£S½‹Y´KÁ¬éÑFíjÒ¦×YAÚVA‘ØõšoÃÝG[Ôü?g6§n ˆî@Íp2~c€0{w­õò|C>5©Œ‹%»·ŸvDËœ0Æ8*}ÍeËã…ˆëGì-$vzŒ:ežÆù®î|Ê §¾O5'ü$~"Ó.ôèµý6-u ’Ú9í¦/åLùÚ® ' #<öïZZ&µ>«s­ÛËn"þÎÔ ªÙóh`ÇŽ¾ÿZÀ¹ñ¾«‘w¨G§G-Ä:ëé«só€Ø8ûÇéŒ×Q¤6¼ö»µ˜íãºg$%±bª½-ŒŸ^ö®Qlm|Uã ]5h–{- ;hímäå “.ær½ Ç=«V÷ÁZ<ºŽ›ªé¡tÛÛ9ÕžKdQçÇüQ¸Ò«6§âÝwPÔ­ô9í,ìté³Ï¡ ¥äŒ0˜à2 ©SΡӴí[Ä:ÏŠcº×/á²´¿ò ‚Þ@»K çpàvÆrkgÀ×—×må½ÝËÜɧêWVBy>ü‹à±îyÆ{âºzàtm!|f—ÚÖ§{z·sÃi ÉÛÇm!9#$œÖ=íæ·¨hzf.£r—6Þ/M)¯bb²H€‘ÔàŽÄ:W£éEމh¶V~a‰Yœ™]™˜ä’ÌIçë\|ZŠßî¤6ù‘4ĽFÜÜJdÁ=qϧOjÈð߃|?¨øBmBú9e»xoJ9‘Ç‘±Û0gŽôËíRÿV°ðՕΩîœ×7Vðº«\¼H1¸³ *ÌFîN85§á½>ûNñ-³iÞ›DÒ糕níÞX|¶uåcIæìHƒÍvºö˜šÎ‘©i­ÿ/V²D£Áü p^¾,½ð¼S®åÒt9žñIÎ'Üá½ðÕ-)伟ž™·Ë¢k7mr;ùvc0Ÿ¡Ü WAá]3JÖ¯üY}«[Ew|5™ìñ:†ò ˆ Š çƒž:ç5ÈßZYO¤M£F¡ôx|ymin„ð±±Ñ=”“Žk¦ñ½öuá  ZÚÁp··)nŒ¡bBÑà’Ðdð9Åi|:k?ìÛ¨dRºÜM°dmÒ=Àþ"ºÃ•èàt¥ø”"þÀWuS³Q°#wOõ«Þ¢±[føƒ«‹µ|z=§övïùäY¼Â£ýìg&°ÿÂsâ6±Ç‘ýŸf/6ô7;}³·¯áRüAŠX´«m^Lº5ý½þS6ß$×&«&Œ‡Ç‘+í¹5‹uç£gþýþµÒ =ïá–—2‡kqv$=Œ¾Nâï®kWReOø€MýïÃ)ü«Ñ¥‚ßCø©]º®™i«ß —<";´‹7`wíšìoõß jZÌ6°G¨E§ÝÉöÈv0³B¸!›9Ï ÍÒ~Î>HS1 Þÿ|¶Mu`ÞðóúM‘ÿÈb¸/Ýj^Õõ/°F[þÍ=,àÚŠÁ8é”lþ¡o§ø#\ð­õÙ)¢Úèòé^ym¼™RñÐ8ϯZ·¥aâïé—š$ÂâÃH³»qƒå³ÎTVÆ ÉÁ8®Iñ~‹¤x>÷ÃӉ޻i ý³XœÈÎÌØÆùH9ÎqŠï¼Kx_Ãä‚ Óm² ýÑØÖ†¡ž?xÝÞ7T’âÀ£2¬?Â{ã¿ZääéÚWŠžÉ/!IlÉ+QëÎ+oÇZWˆ¡Õä“C´yĶ)¥^É’ ea‰_Ø!aøUøNÏí^¿þΞûLÒ­¥²šÖÙ˜J±°]B•'n0FzãŠg…4&_}¿MðÜö6VvΩy|e¼¯Á£¹ùvõ%k¡ñÆ“©jz]¼ºtbkí7P¶Ô`„œ šÉLûŒãÞ©Ûx‡Å:ö¡ame¢]iÖ(Kê3êíÇÄ’zž€Vf‡{âßiƒÃ­áÛ«ù­Xìn`1ù3ÆÌJ—bÀ©üÙ_¦i–žÖ´¨¼n\I§êW7ZŒˆ@Ui‘Ëœq¸à`~ÐjúN§uâÏ êp­gc¦—C2¨\ ääŽÀ×%uáï>“ãßE¤~ïP¾º¾²ºóSlÆgVÛ·9 õÀâºßèúž­¦éPYIJMmªé÷2)`0‘8,A>‚²î¬|w¤ø«WÖôÍ> ý:òÚÒ&€ÌBÈܤ‚>^àã9àñPÉàí[ÒüYq©y6º¾¿)JÛ’Ý »RØç'%ˆø¨57⇊lôËK« >;KÛ;‹ß—3˜œ“ €^I9{ÖÕÞâ8ü`5[Xm§Ò¯tÈìoD®UâØìr£ƒŒqõ¬»MâF…`|?£5¬cߥüÅ„ÐDÇ 4aJ³/c¸ÜVŽ©áBÚ&©¢ßG6³¦[=¬zËÈ߃ìèr20¥7HðïŒÄËâMnîÐÿĵìÅ­°}±eƒ 3uÏ98¸­¿ Ýëºy›SØfûD謈ʈçžÕ±EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢¸¨iö~-ñn›på.µ=>ÙíP©ýèŽ& ‚8÷5,(ò|2e1±cáù~M§qýÙí×?…fêœö_ðŒÛê—ךn‚Ú$gµV ÷»vUfQ·çž)þkëÁmŽŸ –²^ Y§ä3n|‘×€ÄqÛšÙøk{ ¾·°òf†ãN/oq±²ímÄðHþÓ> yº\:oŠ-ãß>pÌëœnŠa±‡æA¬Óá­fÓž–¾Ñªiú„ÅÌ#†Ø–‘Gû_1ÇÒ­ê×>3›J°³Óomííõ//'»ˆÆbù‚.y,ÇŒëIö£ás_Ž]úò-Ní.­%µ@ÊÙ@ ¶H AõíYVšOŠåðû‹:HoŸÅ‰xð ±™–8*9çÒ½B¸ÝbÇÄZ¹7ˆ´K!¨C{pêaÂÈLvHÉà8ÁÇøC2ø«Æ7v\é“èúE¥Ê\Îf‘|ë†Oº€#.y9njD_ø_QÕVËG}OMÔnšò&†TW†G:¸r>RFAý*œÞñ ú¨ÒÅÕµ]ZÞöhU†Ø‘d\(n3µFO©®‡Å:Uþ¨4AhŠßdÖ­.åÜq¶8Éɧڳ³W–Üä¬ÊTäƒÇ®i#Ñô¸u)õxâÛ{< ® ꜌Œã#×÷§jºV™­ÙO§j0‰­'P$BHÎG#ƒïY·~ ðý•žŸu§¬–öcùfßöpCsßæ­ 'GÒ4;U³Ó-’ÞÜÛW¹=É9$û’jÔðAu ¶óƲC*4r# †V CTÛAÐÊ×N}>ݬ­YHÊ}Ò ñ‘Ú¬Ëge<Ö×AÍlÌÐ;(-aƒ´öÈàâ•­,Þâ;¶…â$dŽRåVê냎i‰§é±Û5’Z¶­¸B ‡qÉùqŽO^)–N¥¤‘éöP[$‡.!EPÇßf§ŽÞÖVÞ(‘ TØ#P…ôÇLTŠªŠª *¨Ð\ÍÆƒ®j~"³Ô5)­Ž•¦4’ØÁ·˜Ò°Ài 8ùFqZ銫¬¨4ˆ‘Æ6¢…_@8¥ÀÎqÏ­-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢“ qÈïKEV¹áÙ5ë‹?´j¦› ‘Ë-’*íãlÌA;sŒŽø­Ú(¢Š(¢ŒÖ“ ç¥-QEQEQPµÝš\GhÓ ¹’6‘",72¯R\ ”'µc§Št)-ô›¥’O'T¹û5©1°%ùà‚2:¸­š*¥î§§iÍh·sÝÊ[A~y8^|wÅ[¢Š(¢‘™e˜êj†¹¬Zh:uƧt’<0,±Xî p ¾µwÍ‹gšXÆKÀG43 ’)Ðôe Ϋɩé0¼1Ëy<ÿê•A÷Fyü+3Sñ^“¥ëZ^pñ¬—É;E-€Ÿ›·ÒµïdšK©a1‰c†FC)Âǰõöªvº½¬v:|ÚåœSÜÛ II–ä.ç1’yQ×>”Û?øWP·ºº³Õ­'·´R÷G*•ˆ¥ˆ<­s~ñå¾±mªêz¦§¦ÁiÀ!FÃÛ©rªfbØÌœm¯ãZ·^'Ó®—öF­bWûb+’ä°bÀ“8óläTúŒü¥I<º¤O‹‘d— Wpù@'§< µˆ¼;q¥j-BÓÚçpØ uÉìGLsY–_¼¨Oµ¶«\O4pÅ+«;>q€Ê:ô÷«Z·‹¼5¢\­íË}©“Ì1CÈê¿Þ`ŠÄ®)×^-𵞙o­M¨F4ÙäHÒàd¦Xã’Ç=sŒwÅf‰^In¦ŠBáI`•MÀ'É|Ÿîæµ4Ohºñ¼ŽÔËöe~Ñ Äm‘†«Áìk,|Fð¹a&Û±§<±¨˜ì¹Î?ÖcÏÆ=êÞ±ã]EÔaÒ&[‰µ í~Ññ3´«’0¸ã<Éë>çÇV×:7ˆ.,lï¢Ô´È™k,?¾‰NÇ)œïÔð+GÁ:å߈t>úêÞx§kxD21@K ¤ž:}+}ت³,@$(ê}…yRø«Äº¿†¼|.m¯­Z͵#ËÔÀ±»rŽø#ý£[VŸ¥†ÇL¿¹ÐïÓF™mâ:Œ›:¾r›·ì$õ#>Õ¹¬øžk+ôÒ4½6]OS0 ‰"FTHc$€ÎíÀÜAÀ“Ž•Ÿ?àµÑõíBçMší'Û,]†á¿î•qU‡ ÈT2xïYµþν¾ðìÖº5íÄP-ËÌžd~iâ'Ÿ›#ÓµvõÄ¿‹¼ctº…î—áÔm2Êi£ßw9ŽYÄ_y‘<¶ãŽ70ϵþ=º á&Ò4¦½>"ŠW‰@†-¨n8aŽyúqž•jÇÄ~#]fmV°¶ŠòM9ïlå‚Fhä v•l¨ ‚G89• >:àÛ¯Ml±][$ñÉk»;nŠ'òØíÞº:Kùllä¾c»x#iÑ>ê¹0ì Y¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢±5x{Dmnæ‘îL~i†Þ'‘Õ?¼ÊŠÄ/¹Åâï .‘¸/•ôùˆX%ØœmUqlñŒgÚ/ÅZ­w&ŸK òD&6÷1¼nPÿ GÓ8ïYð²<1$rÍk õÔP/»•ƒns¼àvã'8äV¥ÿŠô;]>éZK¯í ”VÈZIÁʯ ’peÍã‹K­7\6V·°êšu¾ç´–Mðv>ÒpW¹ÃS±ñ!Ô´ÞjGPµžæþÒѪªÜÈÑ“–ŸÝ1úsŽ*]#ź´ú÷‰lî¬/>Çd#xò±’CÙ&B2¿{¯jÝÄvrøxøŽ8e6ÿakÁÌÚ«œuÆƹûë’xƒAK+ —ÓïtöŸË $ÞîÉl/<ò3ž­[¯ÞµíÝ–¤M©' u*º"#ã;±å€Æ@ç­E/Žt¡£ÚêÛÍ$·W£OŠÐ€²}¤’<¶ÉÀ ƒ“œcÖ¬iž ÕçÔŽ—ªè³XÊð´ÐÊ®$‰ÂõÔ 7±ÕÝ[ƒ@°kÇ…çÉ0AÞ–IGÔþ•ÆëÚ§‰æ¿ðŶ±£¥š¶¹k,3C?˜¼m•0Üÿ´5müCk ÛxßQ²ÒÐMc©Fek¤³ªeŽAÛ× qZ2x—_±Ó¤w7wPÛéÖqË—‘¤è$lR9'€©¤M{Åeömâ +U·Ôfò"¸´‘ˆŠR2ªá€ûÝûTÛ¾1ÖfÔÃÖ¶_a²¸’ØIvϺâHþöÀ¼ŒœäÖ©©x»TÔü}ok ŒÓ°–÷bLÇ(Fr¸/õè·W0Ù[OwpÛb‚'–Cèª2kŽSø‘w§ÿo[&ž–­¸‹Ous#ÅÔfPØ G?êȧ_ø›Äw÷>ƒÃël‰«ÙIpÏt¬|9°É1Ü÷Ø[‹ˆíá[©IÖ%ºŒ+02p ÷?Zâ­ï~ xŽÆ}oG½·´€¼ßa³’-ÞzÆHc–#øzæ§}[ÅšÍýžhSJ¹NŠ÷RªÈÑ3œÓ½AÉ9☺ljô¹µýP¹Žææ "]GO¼X–QC§#*ØÆíY’]|@Âx©µÅ71ÙExmòdBÃp[qÃO§Ôìï¯|m \ê\[­Ö›4¨ˆ±Š›I@J<ç'Њ·á¡âm[QÕ®ï5™¾Å§ë7pAjˆ€8^ÛnJŒð8>¤ÖÕÆ¿¬ø_Á·ñ†£.¾#,ªJò(m¸à{ Ý»‡Z𖧢κ½ÝýŽ¥~–WpÝ•b­ ù2qƒÔr1Ú´¼y¨ÞÚë {3ÊñkwСs÷Q[姸;›[ÍoÃÞ º»Ô¯Œïâhò,¤1S3€ß侮®l®ÚÒêÎåœùÑ,Ç”.0x#ƒœàÕýwÃ׺‡›V²Ô¯îu++‹}Ny$™Ú_}J‚!Rxu¯¿á"ñ~œÏö 3M:Œ¥…‘®F#VÛ-Îj×Ä¿0xCY1¹Õ!!”F$^ã°|Mám;Âúž!Òæu½=a”ݼ®ÍrwÂ@X‚ÓJMn Xñ%êϦ^ø†â-â6Š[X9gt]ÍÔðÄV Y¬Þñd7ÖD'[•líå“Ì6£äùUùé“ß½nxŽÊ(õoxrËEzJÙ]^>7Xã–M×Ü@!rN9É9Å?AÓu=;ÄS4(´]>ïL˜\Ú%ÄL²:ãl‹bBýjŽƒá/ KðÚYäÓašâ]6êãÌuæí»XòãŒV#²°Ôu_†7W¶ÑOqu¤ÎÓ¼ˆ ‘– ±#’L× k©æé¬ß±¸_Í y´:v™ªÚü#·¿&€Ú±òÜ ¤¤ Ã#êtWV6¶¾>Ò#‰.tKÈe Ê@ zv®M­­G½M.?´'V uîºïZÙØ[øJ HRcñ.š¨‘€öž³´ÿ„ßÇ7f47ñ,@øåTÅÈϽq÷mmk¡ç…M&ˆ¨÷™û‰QËvÛ¿ÏÑxóPðóë>…&…õ#®Û´A,!<1ãøIÇãôªZ+x©u¯Eo¬iÖ3.­$Ò%Ô ò˜J-÷y±ü›x`óY&Ö×þ{‡[ôÔ-¯øz¶w pֺΕk8CŸ.DCÞ†¶í/,¢ñ‹ô©f y¨ÛZ5¬Md ƒÓŠÃ²ñ‡âð4Ú.ùVƒOžÎk%F2ÆÃ –á@ç>•¢oítkŸ‡·wÞdVçH{bû…wŽ=¡° Ö`ƒLðþ«®Á®jºÅƒ\êSÝÚ}™äònl—bŸœ>ÕìV0øQ¥¼ðÕåͦ¡ªýªêÞiîcFãÏÀ· µNFzÔ¾ˆ-¡ðýþ§u£y5ê_y†(¸ùo"†Ýž£'޵ÐxÚËR¹±±»Óà7éš•µÿÙ׬Ë;”{àä{ŠÁÖµ«¿ÍáØôÝP6ðkVw2Ï F"ØÝ0Ø'’@#޼Õ}gKÖ¥°ø‡z}õÕí«[*¯úðd§®;×Aã½}sK³Úý­ì¯aºk]ÛLè †@Ù$9ZçôH¼Õ´ÖÒü!5”³ù÷ZˆpP§Ý.ó–Ï~ƒÞ´tûŸxIoô‘¢]_ÆnçŸOšßiGYNí²FÒ¤à“×µ&©Œ­áðž©ubu-FÊæg¼†Óh*&R>]ħ^k²¾µMFÆêÎL¢Ý[É z¨uÁü«Œ·¸øm¥aßì‘j ,gÙ÷CNüÉÖ´-¼;}§ê~(–ÓMÓg¶žb@;¶€8ëóʺ²†¸KkOˆ~²›AÒ´ûk¨Ì,oÞm¾J9$yˆT’ËžÜ:U¿ì/h×–Z­Œ‰©Ý5„vzŠÎÛ å9)€AãtïE¶â;éuÍ[Vò"¾½ÓžÂÎÞ&,FA?32Y¹8^1Þ­I joàµÐD/†‘¦I&=ê€uÆqŸo¡Õ4 KÃZž”ö­&Ÿo%­Ò\‘‚T¨<ŒwÅixsG½Ò°.dþÛ«\ÞGåƒò¤˜À9î1Ís¯à|økEÑáÔ ‚úÃSûa¸Ub£çvFAÈÈëÅhC¡x¯SÔ¬.üGsdÖºl¦kh-Ç™.åÉû ð~üT1øgÆ:mÆ­ªÛC§jW’]“,LÓ[¼¸ß³æ }²8ô5]<©Zø_JÐí5Uûv—¨‹è.ä‹*XHÌ.ïC½W®¼1â8¤jÐÛjW°Á¨ !-ÃGÑÂïVR9ÇÎx¨eð]èÚõ•æ¤ÓjZÞÃu{å˜Ú3€ª'¯ZèumCDÑtÙ'Ö.c†ÅcI$§å9Áú×1ð·D]3E{Ò$ ¨È$ˆJNõ·O–9ÿgŸÆ®|Oðf»ò–ýÌd…'µ šU²ƒQׯo´»Y#š 9Bvr¢V ž™Ç¾jÍçƒ&}^ïUÓu«Í;íâ?¶ÅB%(0.­´ã‚@¨lþèöVZÞ˜—·a«a¤ŠG c“2+»s É#=ªÔž ³žÃOµ¸Ô/d¼ÓÝÞÛP󸌷Q¸ Ž0AÈëëShžÓô{›BK«›ýJæ! —wnÄ`çjà( žp«V>Òôýhù†È[Éoó6\«ç<úóT/¼¡_Yè–f[¨±‘RÒhe+*¨P¤ò=+¡š®!– Fc•z‚0k& ø~Ýt4Hþ$…‰.ĦåÚsÏø§Ž(b]‘¢¢äœ(ÀÉäþtÃkfЋf†3yeFÜn”°[ÚÚÆ"·‰"ŒtTø tpÁ"8ÕmØP>´»#Ý¿hÜ3Žq@Hà 7SŽM;Š(¢Š(¢Š(¢Š(¢Š*îìæš{x¦Gšßhš5`Z=Ã#pí‘Ó5)e\n dàgÖ–ŠŽYíá1,²¢_daˆ›Ðzš‚ ONº»½°†`×V^WÚ#ÁÊyƒ+ÛBjÝ]/¬$ºšÉ'®¡$–FäWÎÒG\Tìªã †–ŽZ©©êzvi5þ¡0†Ö»Ü‚q¸€8ž§Ò›.£åê6ºÙnO²ý¡W÷I°•›<ž8¥Óu];WŠYì¤2GòÛ¹*F3†ÐÕÊ( O€AŠÄñ>¿ÿþ“y©C ÜÉlч~ÞÂòpØÆsҵ渷·ŒË<©c«9ÄÒ™aXüÖuã;‰ÇÖ›Õ¤òMSFòB@•(OMÀtϽb_ø»GÓµë y#Yn –S#H FWT‚s–ÏJ©¦øÎÄÉ­®µsg`–ZÄÖ6åä æ**Nâ9çµjjº•ÊA¥Üi·6>UÍõ¼n÷…’'ê"#«ŸáìiuoøWB’8µ]VÖÎIQ&‘T‘ë‚zVœ3AqsC"ÉŠ*Àô ŽÕÊø÷ÄZæ‡ico ÃúÆ¡rb·ŽQ‘µ³œezê:Ödžõ˜|A¢éº´xÅÕ²HÀ cæȬپ"|?‚ià—Z·Vƒ˜Ù;Q’ci#Ð}ªÖ¥ã?é n×ú”P‹›_µ@9’>9P'9Ÿj5xkK‚Êk›‡&ú!-´1Æí,ŠFr#U-õÊŒU­/Ä:³c&£cvkq+6TÄS¨pØ*G|YVÿ|!s=¼+<ÉÌ¢+{™`•`•@²2„9íÏ=ª]SÇÒµ t‡7êir‹Kx]äu~…p1ßž+8|P𬰼Öp_ÞCµ··rÖ»IÍé‚0xä÷Æ+fûÅš Ž™eªù<þX³H´—A•½rGÓñQèþ-Óµk©4ù-nì/Ò<[ÞG±Ý:^H ‡Å-&îÁµ[UºÓ¢ nn% Þ¹Á8êv†ÅGâ_êvšŸ„¿²,îîì5Ó‹JÑ’ª¥ØWï»ÇsÒ»‹‰æ†ÖYã·y¥H™Ö*ÈtBäôäï^eàoÉa¡êÞ#×!ÔKÍtë¾YD‚góV(c v‘÷~êç׺xŠÎ:ŠÒñ•æ©aáÍbçMˆÉs”̸}…Ó—•ê=kϵ=o^þÄøuª_iòIwý«h"Š)ƒ½ÖøÖ-…±ëœãÖ»?Å X°ÑüA¤Ee&¥òZIÞb“‘þDÁÁ÷ôÉZa‡™Ž» ð&©iÞ9Óo¼M©x|ºƒ––Ä+î‘À&@xÀ Ž9æ­]xçÁÖw2ÛMƒìšEG1DÙÆ@¥Ï« ³«x¯ÃZ$¶ÐßÞ幌É…f2€GÝÚIÏrj ø{RƒP–Õ® –âÝà•fPÝ–T1ÏlPxÄóø£G†îæ'KµÈœùN‘±ÉÆÂÙÈÀç pi÷7ú‚xÂËO°³“E¹â`ºÈ 6qœïøT:_‰´k éڥơqy ÄÅ ²Çûû‡,@PŠÍØ: ·¥ø»KÔ¯æÒä·º±¾Žv—¶À=êåιâkS›LðÔ¶°ÃkiÅÅåÂ3ŒÎ2ˆˆ?‡’KwéU<Ú»xƒÅÿÚ©Þ†ÓÖ_';À0Ï8#Úñ ZUðé´º†ÿ¶ì×l‘n>io‘³¸p¼äcŸQSÍyâÍ_R¸ÑtÍFOìÈ-þÝxa ÒË ÈTBvŽNIô«¾Õ5y/5MW’9¯´ï!ÅÄKµgŽPv¶Üœ‚+â%ž«qyáVµÔ¾Ê­¬CcÊV+) ‡îéU­ì¤ÖçõÛhW7¶Ì«pÏ;)`#cq“´sŽø®&}v-]:÷G×õmRáîáK›{ˆ¤hçÎhòÔ#£1Z¶zf­âx®Þï\Ô!°´¹…`·¶“fÓ“¸ ؆@Ï$ÃÕþßà[_j3É¢ëRYÅ9rTYf0÷½k§¸³kxgFŠöðÙÉ¥êhá糓·–brXgƒœŽÕÏè>óü;âµÓo/¡¾]Fî($g08eãv2Ýã'¾kbãZ?‚¬íe‘>ÖßÚW¦6 ª[U±ÙŸå5ÒøÀºøk^*̬4ë’I|‡¡×;âyfÿ…kæév¶H$’™ç¯5 ö‰§ëÞ?– C|¶‘x~ Û{‘¼Òe=k3Qš_ÙüA´ÑÙ¡µ¶‡O{d H·7#k²äñŽ£š_x Â:O…æ»Óí…½å³[r¬wÏ—PDœ¶zóžjMMnõŸëQÜxpkévö‘[E,±¬pù‹¸¶É8,ÇŒã€+6úËP³ðǬ®,£°ÓB[Mme礟gf9q…'j’zW§xBÑt(àÓ­’ê­+¨ù¥l}ç=I>ä×3¯iº\þ=ð»Íio#Ke¨3—E%Œav’HçooJ‡Áúw­xÖþêÊ,¥@ÛP 8Ï\œú×=mPxwK¶Aˆlü~±BDj³Ÿ”}3[“éZÚk¾$Ô¼:ú^­ö™"ŠúÎó"XY Šà0ÚG8aŠßðÆ›> Øéí§ÅÍÔ lÎ\G"Hw…lœ®så\ô’x‡\ñÕõö‘¬¶Ú§ØÝ3Íó9Mªyå=+?K}I²ñß…¦HâÔE•Χb¶ÅŠlNDyÁù[ØrjÞ©}àȾ|²[›Ñ’8æm¼?¾¯piÚl6³x›À-2xü'#Å‘­ˆÆG¾ ¢äx|®GkªYØI>›dÖ¦î!’%ÈaGŒ7,9ê+þÓQ¼Ñþ#ÜÙjñêw²Ãk×ÙmŠC˜~øR]Ã1NÒ­x‰Æ¥ ZÛ\øÊÞk=A­ã·‚ÎÒ6–F,6ÔI‘´þXë]>|@ñ` «£i 9Kg𨼑ù>9À›Äº˜oÉkеÇ¡ü0Õ[S“NÓà¶¼¶–õ@òŒ#6õeàŒ‘Æzó]º~£âëˆïuÛ2ÒåÚT[³Ûù£n×xÑr[¨=3V| ¨~ª8:n 0_™ëõ+ #CøM«ßMåØ[¤k4åNÕßoœŒšõ´t‘UÐåXw¼‹N±¿ Òï¡·–fÑüQ>¡5º)ß$qÎႯ¨8ö­w_Òürt}@2ÝÔín®æ:­´Pij2€‘€95«á8®SÄ~;y"tŽMJÔÆÌ¤©= ßñ´×º&±k ––}>æ$QÔ³!WžØÍ6«¢|9[[+Ä:f±gov’Âêј `Ää}Ð{ô÷®›Ä–—Óx³À×0Ã#Áo6¥çº©+xp7ƒ'¦kŽŽÙ®fÔ¡ñ6«êú鼟ÉFßö3cåì;„J˜Ær õÍ> }rÓÁžØ·sáýnÝîíU˜V=ÛŒc?0ù†1ý+Õí§ûM¼ùo›¿— æáœ0çw©h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢¸60øÿÄ/2ÆoE…§ÙË»fÑ¿ŽÜ×?ªË¤Y]øûý/4ÙeÒ¢’Ü>Øšéø;˜p1ÁÖ­ø‡ûz¿ &¯u¦Çÿ«1¥ª0`ä‡fû `}{VÅ£HL’FQˆm;I$aN9æ¶ÔD> NÛÃHÍê|@4φwVSxfÊÞÒI­št™£&F#pê3ïR^”:Ò#shW üH•Èè×0éº'€µ‹¦Q¥YÝêÜ8å"2³ª9ôñžÙ®—RÖô_Þ^hú4qß_.‘wþR–ÆE¦ñž\ö§5ÇC¨éqxz(.¼a¨¥ÂÛ‹94x£¶óƒão”¨bÝì =9Íuº}¤Zw‰|9g‰“á“ p\yl£æ#Œ×ë°?á0×3iö°|.¹ƒþ{|íòsÇÍÒ¹8.ì,,ídðn¯©Ç¨<‘¬z%ÀiIa¾2r¡yÉÝÇ­_¿ƒOмA®I®êº¦op—6’Ú»ˆe@e;¾e#¾8«VV«á½rõôýBÖúî3$7²–¸¹…0<лAu©Ær8¤ÐžÕu½*? ßê“Xnj÷BS1…8•r8À úW[ã=.ÿUÑ¥ŠÅwÝÃ471FHC·'ŽErž1ñ-Þ§¦YÅn¦úÍîæ=‹Î0£'’NâºM&Öò/ø¢áà‘mî-´ß*R>W(¬Û½s2Ú»êÚ¿ü$:§ª]æ:x&ÛÈ#äæTíîZf›¦kcHдçÒ'‚m7ÅPË,`-b,͹pQAí]gˆ,µ oÂw6ð4Û^\™Üc«D@'Û§¥Yñ®Ÿ«ßé¶Ï¥À·–Z¥êBÌÌò›$n< Ïx|c¤êëvJ]VÚØÞXùê¯o4c+‘´Œpzt­?i:¤7z¦µªªG©A‚6ܰG!WvO9<ž•4ÍsPµÓ'Ñâ†kÍ?S‚ñb™¶¬2ÝÎ:úSôM#W¶×uÝ^ôD‰¨ÛiÁcF,UâBdÆO¾‚±õOêÚ¥§Œ-MÌ1ÿjßÛÝZ _Ý*ñ Àà‘ƒ‚xüªWBø™®ÛØù­¥Ø:öÖîhLŒ³4,ö®ÕôÖ¶[Gñ,>*MfÖKO°]XÃo}›¼Àc$ƒûÖ§ˆtXõèöZ&—f4ç£ÜØY-œ3°Ä`@>ø£VÐt z$‡VÓà¼PL¶Ÿlô«v›¥[Ge§ÛEmk;"‰@QŸaU-ü7á{;è[iVÞæt‰óîjúÛZ¬Ò\¬H'‘@æUÎ=p2qK½´>g•'šæI6€71êO©¤[kU‡ìë íò¸ôÇLR[ZYYGåZÁ䑨Q“ì1R…U@z CeBF01Çê(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢¸¹|#k«ø›[ºÕ´ñ%›ÛØ›I÷aƒ¨;‚•`özÇZ߃Ã^¶Ó$Ñ¢Óát¡„c*ûº–Ï$ŸRsTbða·’Ùtx) –Þ 7Êr>f%¸=9­ ¼=áëJÛXšÆ'Ôm£òá¸#çEç€ùÔ3øOÂ7WãS¸Òmd¾Èo9ã²:­i=”—ݼ×0£¤r7"¶2냎ißfµûA»ò“í/+ÍÀݳ9Ûž¸Ï5 ž™¥iïs%¤0IrþdídoVÇSV 0c™UJ«ànõúE·¶H¼…‰°·Û¥2ÖÎÆÅ v–ñÁ%ŠÄ¡FO| S¾ÏkæùþRyØÆü ߟZ“9Ç=3Kœ÷¤Âäœ žô´QTõ]=u[‹#q=¿œ  ­Ü¬ˆAÈ*°!ðŽ­<öo®kójVös$ñAåG³§Ý.W–ÛÔtí]]QEQE#2 Ë©¤Þ…Š€Éçê(¢Š*½õ†¥mÝŒéqm&vK[{ÕŠ*)®m-¼¡<É Š=ì÷=g©>‚¤eWX¤`ƒÐÐP ´QE™®ë–~³wË6ùR¡wI+¿EQ‘ÉúŠ¿o+O 34o’5sãrdt8$dwäÖ%ï‹ôkM+[Õ£Y§‹GžX.Q ¾›¡_êwÚ´×6¶Ú…ÜO<é‡ $+媨çå\j]?Ç]íõ®Ÿsc§Ow»ì¿n„¢ÌTd…9#8ç¡›ÇúwÛu:ÇLÔoï4ùŒWÛÄ\s¸²®nrqÒ¶ôsNñŸ¥c¼E!u)"áÑ”à«ÄÒ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢¹í{ÄÒi—vºVbú†­t†EX*Ç8/#€=8æ³Åþ#Ò¯lí¼U£Åeo{2Á å´ÞdBFûªàª‘Ÿ\bºË»ý:ÁU¯.¢·V8S+…ûdŠ•¦HÒ*Æq†$`ç§>õZ[F¸¹{8/­äºL–…$RëU?¥eXøÇD½Ö5] \@cåí5•,øÏÉš¤Ô!´ŽÂúÿA6úEÔÐD%3ƒ4BS…gnéœ9"¯ê:çŠT¹ÒôM!&û,QÉ5ÕÛ´qã!P„rÇ×°®Äz×ü$ Õ亳ò.,µ­®!ÜD‘J‡åaŒŽA ×µ¾?Ôþ\3h6Çw÷±#*ƒâ“ëøng°1*,ð4ÌìÊÀ nÒ¾ýrGfó\ñ\sXh¶ÐY6µ-³\ÝÈÌÿg‚0Ø-Ð;šŠë–Í­éÚ¤¿ÚV:dš…´0΀ ò žÉö5™ÿ gŽãð•­ì"_ìø§´·Pä–$|Îr8aÈ‘ÆM¦¿ñ?IMîH´ÉF­s¢Ùâ@mžaò“&ã¸/ñ|‹íëZÚn§â»âkw×‘ÞØIu ÐFPÆñH,Ù9 Ö&ñ,~ðÕÖ™”w·ÚÇØŒ~YXB™x xè Á=ëV;ßh~ Ðì5MJ FÓXûLgl"3‘&ñ· r§§9>õGUÕüI Ö¨ÚŠ,4%Iž=>ÓlNò û®û›v_ÐY:­þ·âÀzÁ¾[in5›XÝcY»ÙD‹»$c8çšÓ×üOåjçÃ÷^'F†ÆÒqvÂ15Ô®3„Ü €' y8¥àIªÞk:Kj‘jÉaä<Ñ€ ‰ ?+…ùw)€Ï¥_ñµÕÝ­¹Mb"ÑîÞ]¹AËAØôãé\÷…µÂðÝŸˆí.îß\¶62½Ô“93ou ¬¹Û°ƒÓhTšõݶ³âSMÕ4½KR±ÓaµXm¬Áò·Ê»‹É‡LžËœô5¯àÕm®uË&±¿µÑ£’Ó–ü‚é¸è¿3 ã=éþ*†-sÄ~ðíîN›$W³Ä v‹TàŒœ‘ô¬˜<;¡øsâ&’4Åû5½ÆzæÙXùhÊË’«œ ÷Æ:V Úf£ë7º†'ÕÚT¼ŸûsQxÑØŒá£'çÚ¿Ã…N•z}#K×_áUæ§gÜ×v.Þd ÓlX$rsÏz˜jj~)ñ3Ká˜u¥°ž Ka<Ѫ[E°67ÞÎIÇ=;V÷ë]FÁ5ëI­áµ´MH½­¤s¬¿fÜ ´/Ýò3Ò›ã-÷Q×4K½>M:îòÆ ‡þË¿o–D|"`1 :giÉêRi«¡üB²} ´mSìV×7p$àÓng7Ê=ó]OÄ™ _[îuÌ—šX§Î|Õ<~5/‡­ínüaã;‹äY/mä³··LvÆ FÜô ÙÎ;×7®iÞ’ÛM±Ñ“}“øöÙo"Ãy^qz¨n6ú…È®›ÅEŠ|$h¨Âîú @þ ãéÅjøéwxKÄËÓ:Eçþ‹5ÍXþ$𻹓Â×9„GúÖÒ¿ü{`ﱪ’¹É¿È$WE¦ßéº޵“ªLM{£éÍ`óD¼ÅR{†äƱa×´·|SÕ¬-ãÔlâ³µó#\î ÆÁ󨝩ç½ex¾úá|% ^øªÄÇ8²k}:Â$X«©Àl»í@:ü½? í/µ-.Ûâ‰4×QG燧ŠÝÙ€Yʤ9Á'¶+•LÁ¡Ûj/™a¥øþîæ÷;"¸ÞG¢’ ®“ÅZÖ‡â;Ÿ é:-Ü×­¬ÚÞ“nἈ`;Ø®qÇ8Îj÷‚Bÿkøä½ý»ƒÿ~’ðìÿ£øc§‰õAù8®ÆŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢¸Ý9£‡ÇÚôsŸß\é–’Ûg¼iÃcþ[ž Öt½Ò;‹èÚU’æ"‰y°»A#žõÏhšN•¯k'¿Ö-bº¹ƒP61$êC (+´ãvwZæu;eð÷‹ôXòÚUž»h–Ë’DA™ "û))ðQ¾Dp47kpøæP£øÉgX¶HüYuö(™ü3wöІ2ÀwêµG-Õª|/ÚUUm8TäråB€=óÅOi*øE¸Ä¾”zÿ¬ DD4u§?ñ/‹ÇïðxòC.síœfºIg-– ¹F¾—V²6pH`À–_`¹ÏlT¾ŠÖüc Ìu”¶9Û傿M/<±ˆc@Çâ-Ap;r*nì´ßI&£*B/4xã²’B’’è þ.AÆk2þ[mW\ñUæŸ"=¥¿†$³¹™(fl°èJ¯_L×QàÝ¿ðŒxn0tËSÇC”xÆÁõêÇþµ`3DGPñ|È®{Â+‹ôÿjó¦Øõ¹ ªž Çü ufxI5?¶´Òü—zvŠº ¹ÿž£;Éüv𻥸ÓÃzg‡-´»©|­^ÖÌY¶žÊ|ç•Ü*c$1îÒØé×Zn¥ðæÖáž õu|¡‘žœt¦ø£ÃIâ5¬“MMÍ“!|Á)Ù¸ô!O8ö®ŸÂšÍÞ¯`ɨB`Ôì¤6×±@óø—=U‡#‘ãq¡5Ö˜5Í6v±B𕱓}¬½òÆàwÎ3Ú¹yáÖ&Ð¥¨èÂÒ`oŒÍ 9/*”qŽ>™æ»ZÝ^xcÊ‚ %—αa)-Ä‹ž=»Öµå?ˆµX¼Ig«]ÙºBºd6«)×oÌŒ¿w÷ÏÒ³"Óõ?øEüa¥E¢ÝZNú¤wVöÂ2w#!XeXŒØ'ÚÅizµÑí§Ó%µ³Œ"-ÌìÊr\†*œÔÕëÍZŸáÂèÑÚ“©bA‘¹sæ*Œ®s·ÕÔ×7/ݼSo°SM×’g6æ%&¥ œ‘ÇL Ø×|6šÞ‚t#tЩKuó•A8‰éÓœTÇ…®îµ«hú¬š^ ð¬¨®“¢ôÜÆåìAµYðç†í¼>—Žn%¼¾¾›Ï¼»›å`0:¨á@éKâ[këhÿhšÎúÎS-­Ý¹H‰#A 8 ‚ giÞ´´Ö!ñÞ¥yªGo%»I;.ÖGìTlc¯9¨áΘ±=ƒêº“èÌ_oš@1Îܪ‡Ûì_$¿´¹t#JþÑ¿S¤ÍæYÝ$€MÁwÆ1ÇOÆ­êž Ó5+¿í¯/l/š$Šiìå(Ó*ôÁŽ3ïZ:ƒ¤xrÌXéÑŒÈÒÈÌÅžGo¼ÎÇ$±îMA®x_F×ä´¸ºób»³,mîmäd–=Ý@aØ÷"£Ó9Š3€UO¡ÀªŸðŠxOÎÔ.“jfÔT­ãÁ3rCzäóY^&µñ—pùzŸ­éKì·”ªÍ  ýà\2Ç R=éÞÐu+9õ}SS¶·µŸQ0G¹Ê[à áTœIäœ Vµ·†<)f.E¶e¹R³ì…˜PØ­Y}+G‘mì e³ÇÙq:lãŒ{b§ŽÞÚtŠ$DvgeP%ŽI>ç½Gk§é¶;þÇk Î[Ê@»¾«UK,rqÞ€ª¹À''´´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢±“.ŸVƒM$ŽÎò073OçY£á߀ƒNN“,ÅËFÅŠýJ©8è;V•÷†¼9©6œ×–1ÊÚqМþëéŒqÀã§f-'I†;Ø£´ˆG{+Ír»F%wbþGZ¥¥øSº$ÆãMÓa·›i@ê9UôΰÅiCgem%ÄÐArܸyT#€X÷8ãšt¶–¢Ao D%•¥“`s·V8î{Ó/,4íB1í´W«n *†úŒƒÍ-½•…¤ÖÚÞ8­À#ÊEyëÀãš–8â…8$h¡UT`(êdqE âEDFü)ÁUs€NN) qPoÇ4ì´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢ª üê/§ýšq¶ÙgóÊþèå±´6~÷|c¥[¢¹¸î{·íZÕ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢¹I§¾ÿ„ÖkXná£$q3,Iç®qŸ|t®dþΆ 5»sE×"œµ)Œ’ÚHÛ¹kö0ÿe@þ~Á4Q\Ã$2dÇ,l´HaŽä~¼të+x¢æÔ¼S‹ùay<ÇàE8Ç~qŒ÷®—Q»’ÇÅ—÷‘¦÷ƒÂ2W)ok%ö‰ÚxoY¸Ö.mÅÈÕXƒyÅrIœa}ÑÇjè ·—ÅΕ§øšÂ×ð^MfÄ丕¶¹` S·G5?‡ô]7Añ¦§i§/—júDr¬Y$DLàwÀõ®îŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢±§ÐEƶڳÜ-ô¦ÓÚ0~gÝ»p9öþµ€Þ ñöB»ñO¢•òÝ^ö‡?pɸñŽ3·>õÛªª*¢Œ*€öÍÉàø%Ñ5]ÞÊPºžá¦w!‘÷`˜+CûØë'Yi\¹ÓEˆãa]û³Ó9íÖ°ÃóövÒ—\½M˜æÀlá ÿV$ÆýžÙÎ8Î+WUð¥ù°–Êê}2êÂ/&Þ{B ¬xû…X2•àpAÅ7Fð–¨\jŸm»º½¹·Ï$îüîÀÐpt­M+OU”Bæ{Ÿ+wï®_t’O-íÐ{UÚ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÙ endstream endobj 4 0 obj << /Length 48 >> stream q 595.28 0 0 841.89 0.00 0.00 cm 1 g /Obj3 Do Q endstream endobj 5 0 obj << /Type /XObject /Subtype /Image /Name /Obj5 /Width 1280 /Height 1736 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 203362 /Filter [ /DCTDecode ] >> stream ÿØÿàJFIF––ÿþ@(#) Generated by TJ++ÿÛC  $ #," '.0,)7(44418=9'.<2432ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ ÈÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÝ ÿÚ?÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¨-/loâó¬î#ž-ÅwÄÁ—#¨ÈÏ"{b×-d·›¥ŒHІÂú•ë§¢Š(¢Š(¢Š(¦É$q#I#DRÌÌpÉ¥VGUt`ÊÀGB F.-šg·YPΈãnU= pj3SÓu‹H¯´ù„Ö²– i õÁàŠ·EEoskwÍm2MÆASƒƒÈª³k:U¶£k¤Í6ËÛ¨ÞH«b@½pØÛ‘éœûRjúÖ•¡[¥Ö¡)Ž7•!@ªÌÎíÑUTIö¡EQEU ]cO»Ô5.cu§¬pT€<ÐJàô´=¼L«$Ьßt1Ÿ¥<²°ºZ ¢•RÀ3}ÐO'éQ›«10·3F'#"2ÃqNµ-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÒ÷ú(¢Š(¢Š(¢Š(¢¸j†«k«èšL…#³°–çS¸_áIXAþôŸÅÏ õÒøIvøo@_M2Óÿ@³^y¨ÝÅðãX½¿xämXÎé’a»UÎ¥óôŸ&³ ¤Mh—.ñeɤ„„·8b2vĽ@äž+~ÓYñFŸ¬YiZüV¯ ’}–æÓpã(êÙê: ¹ámjûZÒæ½ºŽ4•.®¢<í+:“Û­Iá-^ï^Ðì5;¤Džád.#Îß•Èã$žÞµq­xÎ÷Äš–‡¥Ge­šZJ÷‡,¢A’»A-Û9Îi$×q—•œy½v³öÂñß5&§ãÉfµð³Ú\Á¦E®G#Éyr7$Ìc•]Äð 8ã¡«¶þ ñ‹¦kWúÛ[_ÙÙÄ’Ù^Ú¢ëwJîl08èsY~,ñi³s®i7Š ow¦Ã´F<ùO¼±e¸ç«NëSñ®§â}CEÒ¯-ml!²·œÜ4{äBãøF@;½úïY׺‰/ü?ãm"þòy¤#¬— ËqÅ»s€ÄpHéé]O‚ Ôàðö–/®ÖæFµ…Ьa!Aµp Î={×=§Ùë?ð°uwþÓ]‹i’ …~x‰;cÎr6ú÷ô¬_Úøõü'öËb+kQxö°, þn×bLŒÇŒœ—µt÷:ïˆõÃú…ŒöºtWѤ—÷³•+l6ÿ ±–nzUøƒRÔ5}C@ƒÄvú¢6˜÷ßAn·0\¤£c9«_ ­µt?6{Ó44Ë>Z¨Œ¬Œärwžyé[>,Ð_\°ClþV¥e*ÝXÊ:¤©Ð}¡®SOÕ&ñ,Óx«Uµ0éþµvŠÜžZè&doøáx÷â­,.´UñkKÓÛ}µ4ñ6¸FN7ç»­]²ñ&¡©ë~0¿—a©h“]ÉÄŸ.>lgŽGÒ¯¦£~|e6šn3f4E¸àpþn7géÇ\{UϬÛi3>—smk9xÕ®nH ó?<@{×§ø­(Öµjiµ¹#Ót½jH£¶2mìfÆvŽœòrzV,>%\†}No6™pï/Øí!U) £`y€«'ø¹gŒWoàívOhv« Q,èÂM€…,ŒT•ÏcŒŠåo5¿øGu‰°ŒHÖ–ZS"yŠ0öɬ ¯Úé¶+¬ZxÊ{íaI%£¡û4üüѪùco± ž{×VgÕ_°Ïv@Ž0ѱ áFmØ‘\üúô:]¾Ÿ¨éž-Ôu]@^[Gv0^ÎMì¸Tÿ ô­ý]±¯xÿ#áXÏ×åz-o5"/†ú€º‘tË« m6ê ü›åˆÛ»¸Ímh——ú¿ŠüAr·R3NŽ->(AýÛM÷¤b?¼¼¡¨<{®Ëa.‹¤­äÖ1êrÍçÝ@¥¥Hâ•@Žæ$ ààf³4M`[ø“N²Òµ-CPÓ¯£.£»ŽCöww+d\èA5OÃZ&­â-ëU¾ñª² ¯VÕb˜¨ˆ#‘Î9cz“Ç«jksâ7áæ¥wyt·Z„²´2Å—q¼ã¨õ­‡Šæöûâ•q}yö[k ;È"V ˜„’TƒÕˆù½{Ö6‘gŸ‡¾È“ÜHnµ[)›Ív`¤Æx\Ÿ•}‡5kZÖººÅƶ-ì/ÊÒßMŽçbù`nvhW–' 'Ž9¦Á®x¢m #í7ÑKyâ4Ò­õ ˜š9Í«|ÛðÁNües޼õ« ð´~Õ|5õì–²k–ÑÍos;È¥ù!ÆòĹÁúW¡ë0jZuå¤Í"Ç,D²¸Ç<2Gç^[¢Ãsoáï éz}åͼ¾$¾‘.§óX˜â‡yaIX  Výö“‚5oÜèÓÜ%­þ¡wg$®ñÈ%Ã)$c5Óx¿UºÐü=«êV£7ö®Ñqœ1à{u® ž‡Hðeþ¯iª_G¬%šËqyç¹7±¹XÆlŽ1V®tqâ?¦™}}t4Øü/i4Ö±Êê³±»zàŒñš5èü3{â-F Euq­¡‚8´ëäòìA^K²º©gëÉÈ«âëU“á÷ˆ óîí¤³ñÚ[¤ÌÐF' \¹ÇÞ>™Ånxúg….¼3«ém:ê3kÖ6w3¼ÎÆâ9‰æ$^ƒªmÚ|AñEÚÛ°–Öábï…yÄ›Î7`çÜ;b­|_±³»ðf«4ñ‡’ÔG,$’±p¹àúëY¿„ô)üYá= #’-2-'Q•àŽG@]IV9Ý‚Ç'šL> ñ‰­ô˜ÊXGáoíam¹Šùѳ ¨$ã sŠÀ‹M‚û@MA|9­Ïâ »4¸MYY<Ã; «ß '€1Ú½oD—RŸJÓeÔ£1_=¤-r‡,…FáÇ}+Íî¬|7¬kzü‡D½ñM×ÚŒG¶ö[@ýÔnî£*z•Ö<‘]ꟼ)g}<‘³øª;Fs!/ Ý@œü£€s]7ˆ¼9¡x>ã߇mÊèëv–Rˆ‰hŠ|†Wçæ=Á9#x?Ã^ñŽ™s¯ø†Æ+ûýFîëqœn6èŽUc?wh°sX2hKàËmp3\ÜøGÄm;œ´¶°JU²Ý~ç_]µ¿~Ú®¿¬kö¡gµðƃ#Yq×Wï$}ø×;e¢ KÂÝÉq¨^Ú­Ûj’\@'3Ü&[ Ðd`vë}JMJ}Kn6p‚¬/´d‚2O¥iQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÓ÷ú(¢Š(¢Š(¢Š(¢¼óUð&«c¤ëí§xƒT‘®#¼¹6a"i´þëqÝÓïïZž]OÂÞÒ#¸PÔg”ÚÆÐíBöÁÔ ¸p‰ß%½uõÊ|B°Ô5 ²¶{‰~ÝjÅ … Éç;Òø²×V‚ûCñfׯ¦=ÂOmcÃ:€Å3€YHª–ï«x¯^ÒuÓn´ý7IÉþ˜¡džYh ¹'jŽrzÕ.ëŃUРÐ.n.ÝÔ¶w+´[H²¶T³“Æ3ÈÁ>•ÑxÊ÷NðÞ—iyAqI¾6ÆW.HÎ íïLÒ¬¯àñO‰®ä·dµ¹ƒOòf$bBŠCÎxú änü5c£êšÌº‡ƒW]Kë¹.í.bŽ7u2c1¾òÁèy¨õ­7WѼ-¢¬zm–£7ˆí'ŽÒÑÄŽÌv+O3~U¹vþ&ñmÞ‘g6‡>™cg}íä×/ÜМªF› ž¤ãŠÓ𮕨Û[x†ßQ„Ä·zÕü± ƒº)1†ã=k±Ðõ]O} x*Úúú7‘-õ!ò%¯.Nð@ûÃiϯ5Ñê^"Ó,tkX´›MWOŽÝ¢Ôl¡Ž4Ëã!¢W!qœðOãXZ®õüSåé¿Ø6Z¬ÛÙ3+66Ýæ:¡*2p0#5+i:Ýú[XCà­;O¹F·7Ò¤ ¨ûÆ5q'¶Tc5ÓéúV¥oâ½oQ’ÿS¾ðÆ¥oên%¸·»™]¸ó#*AñAšÞ–m4ë^âmQ/WQMBNY.TäRH:m銭7„ÒÛJ³yf‰åydyÈ,å†9À:t¬i>YŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+7YÑ,µÄ²ŽåäU´¾‚õ<³Œ¼G ½+JŠ(¢Š(¢Š(¢Š(¢Š†{»+S¸ž8Œ®#{½@3ÔššŠ*(®mgi’’F…öJ(ÝpØè~µ-V&µá/ x‚DŸVÓ¡žh×jÊr/¦àAǶqV¬âðî„–ZM ·³Y·‹[dÚ»öŒ¶ÕïÉëZ4V~¡£è”ösj6V÷Û9kf™”c‚vç¿§¥hQEUXu:âîîÂÕî­&ž1Ö1 ÊçëV¨¢Š(ªzž«¦hð%ÍüÂ^h¡ A9ypSW*”F‹k;][Ø[ÅpÙÝ*F¡Žzäš»EQEdÞø“E±Õ,ôid‘õ µ‘E¶ÔÎ79PB®{±´n®­l šêêUŠÞÚIds…EQ’IôBi0^èÖ%ÙåÕÖf´dV®âIì1Òµ(¢°%²½Óô­OL·¸½´Ôn#Š6‰QX]Ãm!WñøVÕQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š+Š¿º–?êñËqp-¦VŽ7 $l²Œà6;ãñ©­fb1ŒuÇ~3EŒí%¶ÖåԬ氹ÑT=ìC¥w…NaÓ§Ò«ÛøÏTi§Rðõ͆£$q[ÜïGÚÒ}Ñ"®Jç×$ ³yâDß]Øèš4º™²eK©D‰#‘ª[ï0p8õ­=\³ñˆ½·I"+#Ã42Œ<2!Ã+yZÓ® ;ˆ¼®ÝÅw7—áí\ÉsŽÇmµÂŒºsÐ8åG¯U3UžÜÍã+ûYî5 nT³Ñ´ô?0ƒªõànûÌOAùWMeâmQ5M3\ÒŽŸ-ò¹´‘%Y#‘d¡ z`ö5{ÃúÙ× ½˜Û˜ µýÍ¡RÙÝånè:ÑáløHµÕ ¹¶3™Aˆ°m»¯P\g¥dê^+×!×fÐ4½í“¥´wV˜"*±Á/HÇÆâ}8©.üI®Ýjº‡´¸¯žÈ—sÜM寲0bá–óÀÖ©Þü@šºÇö\¿jµÔÆîȰß™ù€ xåzg#¥Mÿ O‰´ë‹×´X­4ûÙ£&†}íÉ÷D«±@Éã*Ì­oŠ|G«k†Ÿm£Æ¶z~¢ö×o7M«·%ýGAÇÍÍ5%ñk«¢h–6Ó‰tÈïRæiD Äe€‘Ó99ª­¯xª÷NñN™skk±¦Â2ÈïäɨNå8Ü3ǯzÓðëRxsKmHÂÙµ„ÀÑ–,Ñì.[ø½qšÂÕ-5»ÏX -´é¢·²ó­üýä¤bA¹‡÷{c½t¾Öï5Í>êæâ8ã–Û«lG¤DÄÏë\ëøãĤx^òÓO·žóX¹’ÞH·2ªHN22rªšßü,âùÏ¥ý¨ý¿`_7Ëß°îÝÎHÛŒ{Óôfñkkž.·ÑRÊ(Ʀ$š{ç,TaUWœ’ÝúV¤>4ÔWÃÂúâÊ3¬h¶–¶Ñ±½À}£ y ˜õÀ¦Ÿø·D½ÒÓ^m:æËQºKO2Ïzµ¼²}܆-¹Iã?)ö§išßµoT³‚;´Í3Sò%™·™%LµFp§8äqÖ®üBŽþ_ kihñ/úÞwš¤†iÜÁ=#Ø×tþ+¶“ᘌYÜjoÚÛ :Æ‘µºŒ·,IQÉÆÜûW[¤ê¾-³ñèZì¶—Kq`÷v÷Ñ´d`YYß× æ±µ/üA´²½Õî®ô)a2¼mØ&I3Ò Ìã U5_Ä·:ö·wðûR°¸µµûk,öé4,æ)^"Ä’r6œ`sÎ{W¥ïòaß;’=Ò0N9þuçx·ÄÚ”ÚÝ®±¤Y¦${]6ãœy¼Ì:ap3ÎkRçÄž"Ö4í÷Eû=…•ü 5õýÑV[@¸ù,¹bräqPè^0ºŠ÷^±Ô5+MVßLÓÖùo-@Žw#€Ì»ºcâš.~+O¦ÅâYmdiÏŒ±š&è¾i`w㞀gµUŠ/^ø×ÅéQéêöºd—3É‘ЈÎÕUÈ^rrNz{×IáWZ¼:ÆŸ«É×z]ñ·óã]¢d* ±\œ\U_ø–}6ïKÑ­oítùõ4’^ÝclÆ:…b ³N:Õ Å±k±èW:åžµÕœ³ÛÝ@]$ˆüÈêŒF䆱,õ¯‰·>.“Y·¡GZ}v̈ø;Û9ÿ³ŽÕ°oÒ¿á"oÜj fÑ˨ZÌ‘ùSFXíU*GðüÇÞ™™u'Ĺ&Mbð+hq]ù`G´§œG”~Lìïýïö«â%¬×^×DWS[˜ìg”˜våÂ!;Aá»ãÜWu¦ë*~ZZk‹›”ºau2£±wãû JpòÛZ[Æßg·üŠËå0ö²y¯Lð~³sâéZ¥Ì>MÅÄ™0FI €yÁ##Ú¹ïª]ø»Çw×?5ì7vÖq†Ç¦Wo³u>õÐëö^–ãF½ÖŒQÏk|ŸÙòHåOœü\ÞœçÒ¹½2ÓSñ¼ú¾£s«ßØÚ[jW66VöRy`,iw KõàzV¡¯x¶}ÛM‡U’-NÏÆ‘h­| fTÉÃ0ÆÓÁÁ"´¼A¦kš]ÿƒ4-;Ä‚-õõñº¸–@ÒÈ¡ÈÇ;xùzгx÷ž×´t‹P¼¼Ó5T¼Ià»ÈѼ1™£7#8 Œãš‡Eðî¯â­^xƒQƒSÔbk«³LVPü¢¬c€1ÙÏ<Ökë ñL_u9ì$Õ?´#½’Øí2ù+†ÀÁà‘Çâµ|Q—¦K¡éºõúéñÛÊM±™ï/[<3Ò¥œ Nžà uºoü':ψeÕnn×NÒ￳ìía•ã]È ¼°©$“ÆN¬=sPÖí¼7ã}5+ƒ.¨iñZ^—>hŽf€f$®H'¸ëZ¾ ÐÓÂáÝVÏP¿{çÖlín¤šy\¤Ç IÛî0£«Ò(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š+…ÕŠŸkHUüQîxxÜ}kN¸]ÓÀ ¼ŽC¦Á¤Ii4Š„ýœÊ«µØ@8ÆqZš®®Þ7´ñ™ ZàM2Dí•W˜Ÿõ+¹FANp+––_ÞiI`º¿ˆïu˜ÖÙ´å_w•·E´*÷$ãÙi¶ßeñÃÀ¨û!ðµ¬[›'îÊ@»ŸÊ«8‘u߈Mýœ×ÊÚ~þŒFãËl¨$xô®sN»°µ¹Òbð^­ª¼Ò]@“i7+#Å Yýàbë”Ú;ï>Õ,¶ºv©kÐëÚ¾µ§}§RžòÑ­O&xåçåØó©àƒí]…æ²ð΃q©Ïe¨Äš†¦g)92Ü1”…WpÎ#œw5Ü×!ñ6Ý®<-zݧ‘e·dDBÍàp'¥/‹`»³»ðÞ¹¬—6úTò‹ˆaR]c™6ïUÀã¥U›Q/Ö´¥ÛÎltÛ—¼ººš'Ea‰¼)$“Î:ÕM]>—^Òn´Ëù/ŸU¼ºµX`vK„åJ¸¾æ­†Ñ^CáM6;»y-çu¾)T«.en óO±ŠäxÏZ• BÚe˜YJŒAnèOÐ×#w¡éºNµ®É­Úk íë]ÚO¦½Ï–â@2Œ°ÃƒÜŽF9¨51ôß\]ŤMg5Æ·osµÄï$²á€O0¹;Y»Œœzõ­ý[Tºñ’YhÖzMý¹kÈ%½’îÛ¤L€Ç†cÐm,=ëSÁö—PËâ±q ± õû©#27¡U—ÔzWc¤Yx~Æ]'Qðî§y©@óØÈa¹ŽÂ[ Á÷­‹í!4ïhšuÿ…’óL #ÞÚÛ3I-«¹,­$3rHbÛŠ¥§økP¾ÿ„ƒOÒ“P²Ð®t³ 1j Ø$äÕ‹0@:ôëßµáí&[8, ðMñÖ¬R}¢YE²0ûÌd¯q“é]µž›skâï5-JYGáØm’PÍË'Ý÷¡þÍÕ$Ö|lËnËîŸk´ŒÙFÀ€}Z¹àYîäðý…µÖŸse=”1Úº\¨RÅ|ËÉÊûñD¶wçÆv÷¢6cD’&›øCù íúâ°t«ßxm5}!<;yupú…ÜösE³È•el©g,6ã¾F~µ_GÐ|C™ðþì%Š[ ùå»]Ëû•;ñ»r:f¶ü`ºÅ¶«á^ËMŸP†Æk¥ž+}¾`ó*¨ÀïÍYðÅŽ£i¨ø¦[›v†+LK1¼]ƒ‘‚xíÍs·>Õµ- Q‚kyâñ-Æ¡ ¬ì6]Fî’3€êN3øÔZ†ìn5}1´ïÚéPÛ̳ÝÝÞGq·°„rwgøÞº 麕…º„Åæ²÷ä•;ТÑߴ¼Ges©h𽕰Ì÷3Å'fR5Èé¶^&¾ºðÍÎ-šé+yØ•ã%XmcÇŽ}kkPÒõI¼Y¦j0Ä~Í“ynóîÙQ·99úv®'Nð¾½m¤Þéá&×'¬úµÔ±2LÏœHæ“>ƒbãÔV£éþ/‹CðMÄ:É}¢H‰=“Kb2›ƒd®QÎpzW¡²}ªØÇ:ó¢Û"g;wFkÌ­<5­èöFO麅Ü{â·Ôäò¼§RxyT‚ùÀ$uéWµ j±]ørwÒmµ»; ‚K5ÙqÎÄ5co“‘Ž¢™iáÏÝk:ƒ_höÖZV«¢½€[Y›Ldã ’sü øf­)øª4È4, µ¹ßû\L¬Š‹ÆõŒ®âÄv#­GÕ,üKâ-Bp ­å¾žI‘¹ÌHCNiþÓ5;WÄ÷7Q*A{}¶ÌêHíÏ­Sño†îïõ +[²´¶¾žÁ&Š[;œž91ш`HÈÈõäT~ÒuöÔ'Ôn´«Ø[´PÙÀ±´ŽçøÞEQØøÕ;? xŽ/‡-á׎!ªý–höoÊe¤$|Øî=«[\ÐõmBÏÃB#2éúÍÆ[lJCcƒž¼t®{O¸ñ…§Š¼c&‘cm}l×V«,2Lct/†kqÁô©n<â{"ý§{WÖµ=fÒþà)ai.N2vÜ ÖΕâ½[ÔõmÚÞúßV5Í´Ò˜Ú9b]¡‘¶°!†2 ZðÞe.µªëm jı´ñÄIŠ(ã]¨€ ÀÎNIé\·Â½H®õmFKsia$Ú6•'¬ÊÌÄù$ ÿ³Zph^6ð述ЬôË» î'žÖ[§d{s1,U”#îž0ËÇjûÂzüºn‡*j]xƒH™®{„ÄSŒp¤#­YÓ-Ã2]D]0ÛY ûóPhž×ôÍróX¼Ö–÷ûFÙc¼F‡iÜ™Ûåa¾U± }ë?Oø{­ÛézF‘w­G5¶‘¬ZßZƒ åÄXìc¿’s×zÔ¼ð¶¿kª_jžÕ¢²:ŽÆ»·¸‡Ì¤Q€ë†B޼}*+¿GwáíKG{ö7šÌWWw¬ƒ2H¬§;A .[>"зíì`ûGmu [ÀÛs»ÉlíÆG_^Õ³EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(â“í@ FsŽih¢Š(¢Š(¢Š+'Ä:>!²K)g’[˜'Ý2|¶Î9ìkZŠ(¢Š(¢Š(¢Š(¢Š(¢Š2J(¤fUÁbH>´´QEQYööZ&™ws4+7zœ¡å%¾i™°'°ô­ *ž©¥éšÕœÚ~£Ïi6ß26ÎGLt"Ÿ§éú~•k …º[ÚÀ»cŠ1…Qì*ÍQE! IÀ´QET´Õ4›øZâÒî)¡YZt`T:œŸ\Õƒ$Jëu0%TžHp)ôQQImk4Í,(òÂXÄì ”$`í=²=*Z(¢©\êÚ]¥õ†›<Á.ïÄÆÚ<ŸÊnqŽ©Dø»ÂÃMºÖýÂÖáí啃 ²#m+ŒdœñÀ9íRØø›@Ônà±¶¸fºžÀjÆÈêL%¶†;”cžÇÚµ¨¨çžÞÖn'‘c†$i$w8UU$ŸATn5ýÜiL×ÓT™"³xÁe²î¨#s“ÅiQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢Š+#Zñ>ƒáö·P„×¼˜bÞGÛÔ„@Íô¬x¢=s[×ÌÂm*ÞÞÑáBùLAß» 6r9 Ò¬Zü@ðmåÄ6ñ]¸Yäò¡â‘`•óŒ$¥B{a¹íVõŸèéitóKtÑù¾E´RK LãqTV {œU;Ïi:–Ÿ¤jf°`·¸Õm ßE̤¶ L¤eww$ U­cÆÑn–Ævžk½‚F†Ö%hÐÿ„VÀúÔ1xïÂi—úÌW…ì,gX'”Fü3mÆ2G# þTË_ø^îêÎÙáùü»K‰!‘a½ÈžÝ3Û5>¥ãN½—NXî¯/ D’x­!i *Ý ‘ÀÏ\g8íY'ñíµ¯…Ž»¡3Nf$.ar¨Êà0|¥OQÎ9­›¿éVV—“Åt$¼wK{A }¢V^ GŒûäàc½I£ø§GÖZæZÝZ yí®¤‘©èÄÞà‘\·ˆ>#i’hšŒÚrßÀ²Bég¨ù !y;lb^ĨõÜé’K-…Œ’¶éÚ&võ%FMaÞxßI·¹¼µµ³¾ÔÈíºk8K¤-ÝIȇp2E>ûÇ>±Ò´íi¦’[ ùÖd…ˆfªŽF0Aã9íFŸã íF.k니ÚKoµÅµf 2ÁNO rAÅ^ñ&¡y¥hºý¤~e޳É‘‘:;¦¸}H‡Ä:lWö^6¿›X–+îbJÃ;L8ÀP{bº[oj‡l.üWÍQˆ·hmÀvžRHPx%‡8jŽ/[_Iy¥\Y^iš™±šâîT*¨ä£+0Èî3‘ùÖ‡¼zlü;§ÜO¦ê—¶–Öê·zŽÐTÔü̱܅=+®ÕüOa¦-’Ã××Wê^ÖÞØò(–ä€drH¨ôYj2^[]ÛO¦ßYÄ&žÞè("3üa”²•÷ q\ψ|t×z£q“©Å§]Zɶ¢¡@,ã Øæ*“Ѷº=]„>‰£H²És>‰ïžyR(9$ç$œô¦ëôO&½¢F’¥Å¾‹%ßž 7Á‡^ƒëT4¿ 'Ã^G†ãPÔ¯¬`X C™%`€³31ܱüëSGñ1¿¿›H¿ÓæÓõ8à ²Éq¹IƒÐûV¶£}o¦Y]ßÎq´LÿE¯;ðTúæ™­Àuiä‘Cž1^{Ÿ²Üã9òdÆ:ô¯:ð¯‹5Û? ØO‡®®ôû;w&dÞv¸¢Kõ®–ÿÆ0ªii¢ÙIª^jp}¦ÞØ X†2ò3p£œt$ž1U&ñ$ºžâ=/PÓåÓuKm*yšpÁãd 4n½@<ªé%}Âþ ´‚Ò[ýWPÓm–ÞÙXÁc™Ù¸ £©æµl•©èïe©ý’K«XüÅxîQ8!\t`O ~k6÷âM¥§…´ß‹ÞÊbû0|2Ý¿'ôö­ù<@?·4íÞ;í6RÞK0l£\8ÁÎâqÔT^4Ö§Ðt ûëa›­« ¸ÿ¦’ªsøV{ÞCà}/CÐìí¤¿ÔÞÀ¤t’;ƒ9,yëSi¾&Ö—T·Ñ¼C¦%•ÝÜRIi,ù‘M匲äªÀsÈçÖ ð—‹uÿyWCDšoï’Iä˜]E Èõ'o9ëŽgñÔú|zC^Ø-ê6¹`¨¬å|·-Â:•ôèj½ÏŠüM7ˆ5Oé4S½’[Ènf˜¬ad\À#ög<äŠÓð¾¿y­Ã}ý˜³¿°»{[ˆ•·.@2¶AÐRø‡YÖ4ùtë-'MkËËéC¾D0* –‘Àl{ýª¦‰â=j]jçÃÚÝœ0ßEf/#–ÙËE,{¶ž=¹úÕßøŠ? ijm™–Hâ Rò6æ<;š¡¦jþ7MJÎÏXÒíäµ¼ŽFKËfHYFvɸb^ÕkÃzõö·¡¾©=ºE0{¥©%tļóŽkˆÖõí[Q‡žŸÚÅÕòÇâ3!\– £©ã8®žÓÄž'Óµ‹-ÄÖ–£ûF)žÒæÄ¹Mñ ÌŒ®3œrëéY:â^K§õªqxîçM±ñü$±¦£¡¬M"Z±1Ü,ßêŒ{¹=z¥®xŸâ‡†ôÔÕ/ôý2Xd–hái7[ùŒ>öxoN1Î;WKe®Þ\ø£XÐÞ8Ž••­Än3½Œ¹È=±Ç/d°—Æo} m í–wÊf@Bœñ’ÄZ¥yâoè6ÑjúÂérXí–Öìâ[tràÌHm¹äm\ö©e×üs©ø“\Ðtd°†ßOŽÎOµÜ+±_53—$öù”;Öˆuk¾ ñm­à³ŠûIºšÒüª¹Žx‘Cf1»*[#®áÁãšô/ ®°šMÕ%‚[Ÿ)NëteM¸àa™Ž@ëÏà+œ—ÆZ•„ž;‚ùaót8VæÏj‘æG$d¦îNNî1ôª±xÓÄ3x{E“e¼zýö²º\±•;#uùŸ.ìðƒ?xÕ7XñÞ·â-jÆ ,­ô­'SŽ9$(Í,ÈT1@7«{Œ+‘ñÖ±¬x,ÏYYÇŠ $pðÅn‚£pÃ[ƒ»Úµõ›ÿÂqàðúµ™¸6:WÄ'™Çš~÷nx÷«oâ½[\½Õ>Áâ7F³°¼–Î$¸Uyn.˜3®< œg5ÇÄÝxJ»Ò£´mZO¦r„–œg%H9ÚÜyÀ=ëP_øß@×ô+=[Q·Ôlµ™&„„ƒË6ò"nNæÊžœóï]'‰¯nôÝ X¾´`·ÖDÄdU$dW­üPÓ4]Äo¨YÊ÷ÒÙÆÚw‘ˆÀ¸S¼1lŒ‚{{VÔ7Þ/Ð|K¡éš¶­£m¬CyÀc0< *Tœ©éósïPéÓøÿÆÓkZnµ—g$³.Ÿoöu}èŒT4¬Ç?1~4×µÝ?ÃÖ{Ee­ê·Wv×2•Ü–ßcϜʧ©'AÏ^zU[‹?éþ>ðTž¤5VSh&h•$Vò¾em¸R:òŽõ‘¯Ýø“^ðå¥ÌºŸañƒY•X“ ÆØÏAÊc>ýë³:ί¤ø’KëÃscgáf¾™¼´ $©!¸p:*…¬u­"/ÚëBÞöâ%º¶Òü¨þϰŒ¬nÄoÜéÜ0OJ±â}K\†ãMþÐ×­¼9¦={‡ žKƒÖ4Þm_P 5…o­ê¾ Ð|y§G­Éu—nÞùbU’hÞÅJíÇÈUȺ´ØÖrøû¯™#ä}k´ø€!ŽËÃÃñ˜°Ý¿ ËQ½¼ÕüHöºžŸ ÛÙÞˆ®I‰ ÅÁE¼±8^뜆âÖO†ž'e»ûBÿkÈ|Ó€ÌdÃ0Á=z è|I<óx£A¿³×b±³¹Ó.-í¯6¤‘™C‚Ê  °÷íŠÉ½´¼Õ.üF¶úüš¾¥máéíÝ ·DŒ ! £¹ÁÀýkK^ñG„%øzV+Ësæé°ÃÆõpz‚‡¯b»íþAzo9ÿCƒÿAÆx'[Ðô-3PÓõ‹Ø,õ=FðݬìªÎY‹žC)#5‰,ºO†.J ÔùŠÀGýƒ;níÊŸÇ­b]'ØçðŽ£y«O¤ióxn A{ÀPlrèà:r:Óà±·ñLjdÒu}GV–={%¼Åövi|´(ˆK sŒš—Pñ¯„äðLº|w ×饋i,p|Ø™ ½1$€0*fÕ4ÝVðn¥ªÌ-¬¦ðáµÄbL+aAÇ®*5Ötío^ñuÕ™gµO 4k!RP3–R@ÈÎF{àÕ·X,< ª^^^Yi¿Ø‘ÛKuhH0»(+¿ ØVéœu5­áX´]GÄæóLÔ5MV 9#7·†· !"ü ±Ç'µ> K%ìZW†`r³kWk…G+4„pF~µ“âß Þh¶ºü¥ýìú$ñܤ32•d 7GoÒ»çž+­=®!ù£šØÈžá—"¼ãÂþ7Ð´Ï Zé÷Üh¬¤6žL›§ÞͳoË‚ëYÒh_ðŒ\xvë[»¾³±:'Ù&žÉ˜y3ù†M²m vœ;dUý2ÛO¿>&Õ4á©ÝÛC ÜZC¨^JçÎ,7Ž6U$ uÏ^1E“I GàÜÛÎú|^]>핵¾õVVe¶ ©ëú—ªxtxzþ}F;‹áléò&1*Þa Ï9ª’Yø§LÓþ]Zè×73i²]½Õº”ƒœ3Œã'“ÇzÝYµëúEìZ]Õ†Ÿ£Çs6ûäØÓO"mU œí^I™ñ"Ûì¤Iª]Lö*Yz<¥ƒž2F9Åu¾¼¿½Ò,å½Óæ°¸XÖ7‚r¥QŒü¤ð{t>ÕÊø×ÂúÞ©â ëOˆ½ÚÇg«à¨¥YœyÁgéIaá]n?ÝêGšþѲ¸77¤oÆsÀôï[^Òõ; OÅ·væ(ïuq5»nIFxX_¾çǽM}á¿iºüZÖ•mi«gL‚ÄýºVYb1“ó+ì~9n&›§ø_ÆŸkñiÕe³xüA`΀°ò$XÊG*ÎwÇNi,|5ã9´ïÛjIcº¥Éå;ðEPFT|ÄöéïÚ¬A£xóÃwZ”ZØ]é—×’Þ"Ý;£Û<§,>U`Ëœ‘÷M7þmJ#O´Šê)oÿ·áÕïçp@‘·î}£Ÿ Ïç[ž"ÑoµkŸÏm$hºv¨—r‡ÏÌX¸yïŠÞ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š+3Xðþ¯¤Qê¶Q܈[teÇ(O¡#ð4ý;BÐtÿÙÖZï"o)Ü© ã°Éª–¾ðu•èÔm´‹X®Õ‹,Šƒå'©QÐßTú·†ü5®´oªéÐ]<@„iP{×*èšZÛY-…¸µµ•%‚ ‹¶7C•eÀ ×7®CâgÔ¦ó|5a­Ø¢ÎBÊ’B•÷†È'œ®8íW|7áÉmôûôÖà¶–}Jùïn Aº(ÉÆÕ;@às]Å¥ÚÆ·0¤«‰*Pvºœ‚3ÜvªW~ðÝýÜwךe¬÷qãdÒF¥Æ=ÈÍKý‹¡m¾_°[í¾ÿ±å®'ÿŽÑý¡ý‰4ß°[ý…>å¿–¾ZóžëÏJ–ËOӴؼ‹h­¡ÎvD¡F~ƒ\hÍ8Ó-|Ùà _Ê\¾î¹8ç=ëAUQB¨TèSºÑôK飸¼°·žhñ²IcVeÇ¡ š³$óy~lHþ[‡MÀ¬:èE+ï´‘gËbW=p{fŸTßJÑäœ]=»\’˜×püqš¶ÊŽ¥C) ô"¡¶³±²Éµ·ŽòNÈÔ“ì1Rùqlò¶/—·nÜqLRw`žœž9©¨¨.o,lÂ5ÕÄp‰" Ì{ ãšžŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š+ óÅZM–·i¢M$k$ðI!‘¤PT‚s–ÎEh]êú-„±Áyoo4Ÿq%‘U›è wƒÈ®~Oix|=$°¬†ÐMæ™T~ð¸QÞ»ˆ9þ•_Fñ…”ð^I¬ÝYÙÉ¥yk2Þ¾Ð~c×Öº¯lm­ÍÔ÷Çn1•ØÁï“ÅV±×|?©Å4öµÄ0‚ex¤V÷ˆ<~5Ÿái¾&Ë B³ÚÝM”’«³" 8Ç ÛùÔ^*ñ§¥Ë¥éšDMªê“:Aç’"Pe™±ÉÆx­dÞkž?ð¼¶3ë‰e¦\ÝGm,–i"ËðÛIpTwèkªÕuïèH’jº…½šÈHC3…ÝLšË×|L¶¶ºö—sm-­ö­ko$ÄîCçqRã¯8ô«Ú_м'­\Ki¦jÖ·W^8¤RÀø¥ŸŠ<-£N–Ú–§om;(`’8ÆHì=Î*ÝÖ«¤ØÙFêò¬‚óÙ€L„œö®kþK=CÄ>Óô{ë{‹Kµ½ûZõˆc@ÉÆAˆæº‹-GNÔak‹;„š‘ã.‡ 20ü s÷þ%ó/<&ÚMÌSiú­ÔÑÈê2U OnE^Õü]áM u¶Ôµᜨo/’ÁOBBƒîqPxƒ^–ÇI·×ôÉ#º°ŠXæ¸òðÂ[váŠÝs‘ôÅoÅ$sF’ÆÁ£‘C+„†±í5!ý­¯Å>§ Ág«›}›M¨d$—sÁ ×Ú£±ñ¯ƒõ+¨,­uiî ¸þá ø[üMsMñÀé!µ5 &òLÛ_ÊéæmÙÿVËjšjjém0³[½ÂGƒÊ)œãO­PÕ|O¤i­¨[<§ív–KvÉå»®v©ùAÏ=pxïŠäæñÕÕΠj‹t¶²^Ê Iü¦Xö6K….Ê@ê Ç­tÚ_|1«Þ¦Ÿm4©s*»Â³Ã$b`½JU ޼gŠ5?xkJ»’ÆWžkˆ@3‹hd@÷Ê+øÔ—Þ1𦟧Øê·Ëö ÙA:ÊÄ‚{އ®9â©Ãâ-SRðô¶×÷6ðÞ%öËImÙ~Ó厤°võ^›ª;ïˆÞÓDÍw£p’$‘¬çØ0q÷¶cij+Ñ4ë; ¹LÎÚ‚+Z[Å4Òäg„<¹Æ;‘OÑüM£kFñ i"¸³ \Áp…$‹# Øàö##Þ¹?üIÑΉ©Ë§µôà‘,õ³¿’òô‚:ô$ï]Æ“,³éº|Ò¶é$´…ݽIPI®OÃ^7›TÕuûkÛ{˜mmdß“BQmãT„¬O¸Ïj³Ä ¿“3ÛßC§Nê‘jÀÂÝË›¨±*½uõÈß|DÐì܉e¨]YÙÊÑ\Þ[ÀZÊ}ì¶A!{à׃ĚEÖ¡c§Û³J׺qÔ •GîÚ,×=Nxâ«jÚõ·›¬èЙc¿·Ñ¤½ò€AiÎwíø×5áÿˆ¶ÐøK¹½±Ôî ‚Òï5(˜Ã¨Ø’wrBšè5oéUõžš¶×W—w¶¿i¶KT $\úäc×'ë>ˆö×&{{m U›R¶b.¬–%ß 1`˜oáÜâ}âMXÓ¼/ªC5üp^kVÑF°æe†É?pCŸlÔ:?Š5û¿kšLÖŸ`‰mÒ Ë[|˱ ¸¬¸~÷¸«ã}v÷AÒ<Íœ×aet—Ö–×h’F³Â’„•Jº†ÃÈ#½róx¯Äw÷z„ÑRúßN­çžâ)d•GÌ‘®IÉÚ3Þ«_|G‚ÛB²Ö`ÓfšYuTÓ'²Ü±M’} 8äg=EOŠüOi«é:~½¢Ãi¬òGm,3ù…$UݶA±y#БZž5Çü"¾$ÈÈþȽãþÙšãôøÏLð¶—«Â;ÐítÛràOþ’bDÈfÜc7ç•Ò_ø¢úæêÓMðÝ´W—wI|ÒÎåa†áY° Ý€¡äVF¥âýGDñž‹¬Ø¥¶«c£O3¤O¾)â’6ÚèHG¹ªV*ñžá}/[ŸF¶MÚÎÐ"Dík7öœ±AŸ0Llã¨Z­àmÃ÷Kâ{»‹ež}wP‰ÞT” ÀçµcYÿgÜx{ÁºtÖ©Þë¹,­Lb>C°Ý! ¨ÀÁíÅiiöúŠxêÊMFÊÆÒyôK•x¬Ø¶T8ÿXJ¦}¾QÞ´þ[ÚLj^8xƒPr¨¨aÓ ©,¸½E{»e²‚ÜH1ÀS?/³6sïXZÞ™àÉm`°Ò€–Ò_Û%ìùk+}õP@õ"ºÛZ[øƒÁ2CFë{s*ùL'#é\ÿ†Åó·ˆ'³ƒHw“X»KÆ»2y¹S€BãolU]Ù! ³»¹³ºÒίª<ßqd˜Ð;Ní¿¥t:ÔZbxÿÂO¢Þ=µ÷œT Ågfâ¤ð,ööžÔå™ÂGo¨ê-.ïàÃ’séÅs~#û+á–?è!zF?àuÃíã)5>žÚXk7 ?ÚÄžnÐÌí8Ù·j[Ç‚üL~Ùmqo4š¤¨mUÄ1S•MÜ<ŒJé¼&йÝýo×®6Œ~•Ì^.›&«ñ-Rg‚ÁìtÑ4‘‚YÆÃ IÇÐÔ7oâ-=ê­¦ëš8¾²ŽÖP….˜€Ž£,¤lf»ýNâ; ë™É6ÒÈè:²ª’@ú×–ë ¬¯€§™ï4½7H›OQkc $?! Œàz'^s]Kx·ÂòJáD¾™#,~ûeIßÔk{eãO­´ë'Ùü=öyvœ…pÙ#ŽàÞ±¿Ñ®<àH™‘ÐkZtn¹}öéüaƵà’>÷ö³€}Œçó¨<}¦YXë0ÞÜEý¾«xú‡˜ÀŲçÆJæ­Ñ$°Ð¥ çŽ öhz‹= ŠëuìÂgàÌŸùg©ÿè±Y·–—âýaVæú¼;¦M"·\)î »ŒþúŠƒÄz|g¤Ý[ë1i¶÷Z$‘Z]´k";‰2 Ä(,0AÏ8¬Û‹;ÝZçÅB×^}[R‡ÃÓZ9‚Ý d9 ½Xåø8ý{UÝoÄÞ ŸáÓCí¿ït˜àŽÝXoW 6õ^8Åwº GÒHèlmñÿ| ómWüPÒm¥Ú3ÉÉl÷’ Km^§ v­â?xCQðlöºuÌ2ߨ­µ¥”L¦BîUØr§¯®ëN†{k('mÓEoHÙêÊ ^W%Þco­ßh>(mH®®¾Ó¤ê'O4¸ÉÜöÚǯJЇZŠÓ^ðn±®yzjßxrX‰’%”•m¼ôã &šºæ®øŸÅré÷+40xaá2!Ê’ $©èG8Ï#"™¡øÛÁËàkCy¼]/ìbÌÿ­’F]£ju!ú‚9«z ”ºw‹<;arGÚ-¼µ‡¡¨8út­o ȯâÏ( ”—NÛ÷F¹ '‡ûÂÁ\6|w·>§ÎÖº[ KO±ø‰¯Ù]N"¸Ô,tóiÿË_-[vß§ô­/éZ†¥£Ç>Ÿ›{¦^Ûê0D?å£Bs·êFqïTSâÏ€^ØH·r}´Œ -þÑæsf:çOzÊ»“ÄÖ¶¾ñ/‰·Øõ+‰îãDæÖЪs³ŒžO5wPÖ4Ïë~¶ÐeqX_›û˨) ¢·L¹8ÆsíW~.Ø|Mïâ}HôÆyÅC$VŸ´;ÉQÒÞËÄbæs´æ8ÒåòHÆk±Ñîlõ^ê„Éo?‡lÞ9B¬®ìG$µ«Ç3Cñx,L壷ØŸ›ýtãŸÃ5&¡âý3[ð¡ð奵Áׯ,"²:{C"´Là)fÊà*õÎqе&¡§ø/ÅÒK«É$VWzµ½ÆÇdgˆ*Jƒó`æ³ –çY‡âÅÔv7)ö»XVe•¤U€ Ì9¯5rßR‡[¹øe{§¬²A—PLÆ']Œ¶ø9Èç¡éîj_ øŽÃÁ:{øw\Šâ;ëK«‘— Œ/ܲ´eT‚NpFsš£¬Ùé¾ {»G[«¯JxPöu›Ìl63 ŒöÍu$†éüYàY£…ÞæÔ„®ªJ¦èxÜp@Ïl⸽Høe¤Öe“OÕt/¬óátÏ8‹¶ÉØëµ|¶ßÔä×'½z‡‡?¶¿±t¿í“Kì‘}«§úÌsœqŸ\W£ëià†Õ4mZÂõ³¨\ÜÙÍmo$‹q͸  8pN8¬É4-ut}.êæÆQw¨xâßV–ÝZÞ9$ã~3«Þ†ºŸÚßO«ø.K{y%H5†y™‘ùl2Ät\V¿Šàžëúõ¼´³K¥ÝÇ(ÉfhÈS\$>!ןÂ6¾>ÔW^ŸJKF„ˆT´{|Ɠ È}ꫨ¬¿Ú\o×ôSTÒ …¸±†ËqŠ9~ðHŠËóжF+"ÛGÖbÓ¾#i±xj}9u;%žÆUJòöìÊœy„ò@Ï~{žÊçMÕŸ]ð ÊÚHa³´½[·bð¨¹îxã5ÑxƒKÞªi{ö}¶Îhtºá\IÖƒÿÈðÝâk eö¸;>È¿.Ó “w#à.{b´bðýþ⤼–Zn‹wi,üm=òØâ»j(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š+ZðÆŸ­Þi·ò\\ÛÝX3¤¶©ele[®AÅS¾ð.‘wuus î¡d.ß̺†Òr‘ÌÄ`–^y#®1šß°±²Ó-m쬢Xm ŒGkÑ@¬ÝKÃ^©©éúÄ’\Cycò£A!Pëœíp:®{U½+GÓ´dºŽÍYVæîk¹w19’C“×µfKà Éac`©4Ka4“ZKŒ%‰œ’Ølç<ƒ‘íQÚøÃV—Öš¢}¥µvrn^g2J´‡<¯ ÆaWtÏ iF£©jvfe—Ps$Ñ™Ÿœ’©œ{œUkCѼChluKež ÁÀ9Xt*F#ØÖ6ŸðóÂ6P^4WsÛ°hòi%òˆèT;1ô«ÚÏ„¼?®ÜEyt“Gw~PžÚWŽB™ÎÒÈÊHö4èü'ᨬ´ý>+O.ÚÂî;ÈY†%CÌs’s×$æ¯]ézuõÅ…ÕÄ[汕¥·l‘µ™Jž‡ž=sYZŸ‚|+«ÝÉ}ulâyT,Æ)ÀtÞ”7ãš»yáÏ_鉣ÜXÆtôT£6ôÛŒG¶*¦à¯ iWV÷Ö¶#í¶áÂ\;»Ió.Ó–bIã×?­2ãÀ¾ »¾ŸPŸNGšáƒÌ¥›Ë‘‡vLí'ꦮ[øgÖ±ipÁd‰–îöJ ÄEŽ{äõÍA«ø7ÂZíÇÚµ=%œ¨FpÌ¥Àèi\Ô>!Ñî®4‹} G-í.%ŽÞvL(‚ß«í¤p0;æºaŠÞ( ‰BÇ*"Ž€€*·öV•ç^Ü}–3-ò$w,GúÕQ€ÔYzw‚<¥]-í–• WrÉØÙ?+|…`A`ƒÞ°aðG‚-Þi#ÑíƒL®­•ÈÃŒ0ä{à ±7…¼-qci¦Í¦Àövxû4l¿ê±ýÓÔ¡©´ýÃÚSoÓôë{g0ˆKDФ 9ÁÀ隆×¾²O*×Jµ‰>Ô—{V15>ëôê;Uû‹ ¹m¦¸·ŽYmd2@،eOcŽ*†¥áo ëÝêZM­ÕÄxÛ$±©n=È«ÓiúuÇÙ„ÖÑ8µ‘eƒrƒå2Œ¾„{Sä´³–x.d…xˆ¤` ½´öÏzÎð€É5ÉϧøU»'G»´[‹(%³@¡atRŠL.01Ú§éº^•µÓíbµ€ˆáP«Ÿ ÅW>ðÑ–yΗiæÎ®²¿”™pÿ{'ç¿­hª¢*¢(UPÐéU¿³t¿µÿh}’¶ìÙçìfßMØÎ?ŽB¶¹kÈ4ûh®›;¦HÔ9Ï\°ýjõS›IÑ®.î{y.SfxÔ¸ÇL1ýj[»+ øü›Ëx®"È;%PË‘ìsNŽÚÖ p¢>UåÒ˜l4ã4wÖ´†(YÖVLŠV dgÐÓê?"ßÌó|µó?¿ŸÎ¤¦¢GÂ(Qœà u!ŒÅ-qÖŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÖ÷ú(¢Š(¢Š(¢Š(¢Š*¤º„Öºl’uu²Ä˜?2ÇÜãdu5¬Ûë?ÚT2Gö+ù¬ŸÌÇÌÑã$`žxεiQHî‘«;°UPKÐ\zxæêøË.áëýBÆ6eûRìU“o_,;ß­ÍÄg‰,þÙb\‘¢š)$†Eê®;Z´QERdgçÒ¨^ë–7Úe„ªæ]AåXе|µÜwŒqÓƒO±ºÔ.&¿ŽæÄÛGþ\ ç¦ÜéÏ5p2T0$u”$h ;©'¥(!€ ä„RÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿ×÷ú(¢Š(¢Š(¢Š(¢Š+ƒñ‡gyãmäžé|ë[¹G<Šˆ&Ý 0Àþð¾jžƒá[=rëÄÓ__^ùI¯^,P[Ï$JK…I'ޤޕI|A®/…¼?g5ÍÜ·š¤ö3Ü[®ë††líÇ;Èg®2zÕ½=¦ÓõÍ!´K=r;Yå0_Åx²´E1&]›iSÔädWKñ®Wšá·Îÿ³|Ø?Á‘¿ÿÍlhëjšfž¶Øò¬"Ÿk¬Ãáß. NãS´´½žÇ—%ÁÆö8°îpzÕoxrÃÁúzkÚ5ÅÌWÖ—í3<ÎßlV`¬²$ÙëƒÒ¥Ó´kmkÅþ(šúââHln´÷‚ÛÍqÈ#yP@íÇn¼U/ øOIñž%¸Öd¸» â ø ‰¦“l[ª€ÃçòÅT±»ÔõXôÏ O3ZÿnjvS\†"Yà³Ã*?6v±ê@ëÍmÏ£iþ×<<úx!Ôn^ÒêÐ;•v N1Ôv¨<¡iq¬ë—¯,—šÖ¢-̲1Kuþ"«œs“ž?•s2Ùiw õí–‘©ê—E'¹þÝ™„$ºä‰2Ú;LWC©éf³àFÝg–úÙÖ阜È Ã8=5WP»¼Òìüvl¦0K6±mn%SÌ"PªXuÁñW¼SáÂz+ëz%°µÕ,Ý£Iß?Π¬‡’Á‡çð§Ûøk@×¼_â¹5[awK§m·”æ-Æ.¥:1ÆAÅhø ÞøI4ÛpRÎÏ[š;h»D…Tí_lçØQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢Š+ž×ü?ªjZ–ªiº‚ÙÜiædpñïY#—†7.jÞ…¢ûW3ùßnÔç½û¸Ùæcåïœc­d§‚tXô¿í æÞþKë[´P –\@£=*[ k©Ûjzæ´×­f¬-`†?.%f,À,qÓ'ÒºIbŠhÞ)Taoïddqj«„5‹©¬ÿ·õé5+K9’x­ü”@Ò'Ý2å±× ó[n…›©ëz’LÎú¤°Hè@Ä~RmÀúõ®Ã³{/Š.´½rãNó|EñˆÑ‘‚·ÞPÆç®Np8âºwð>4‹-.Öi­ä±Ÿí6÷ŠA™f$’ä‘‚X“»#¤Òü/sü:®±ªË©ß[Å$Vì與êU}ãÐ’OsIðýž—i}gæ=ÄW—W7y¸ÿ–Ǖ㕂Ÿ]¬±îuýB]!Ö+U(¤)ûªÎq Ød{æ­Oà¹fÓ´;1­]Åu¤1ò/c‰ WiJãw·Ö¯Â'¤I» É’â-f@÷ä|¸P>\F1Ÿ\÷ª6¾ +-©Ôµ«íJÒÒE’ÞÖà¦Åe?)bª¬Å{n&¶,´K;OVÕcy úŸÙüÕcò¯’»FÑŽýù5_þ›Tƒ[† »¨V¸k‰&‰Àx™”ÝœqÓÞ¶!ÉŠ(·³ìE]ÎrÍÔŸSO¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(£Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÖs$L’ ½Jä¶z`äcCRQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢šÏðÌÔÒ«+ ©zŠZ‚ÚöÆôJmn#›Ê‘¢“Ë`v:õSŽ„zRý=n×O71‹ÆˆÌ°nÊÛzã=ñV(¢Š(¢Š(¢Š)®é³»E™‰àÜÓažÞæ(ç‚E–::UèAb“íVŸhû'œŸiò¼ß+pß³8ÝŽ¸Ï¨4ÝSMÕá{‹¼Ø’i c‚0ñœ0䆮QPZÞØß#Éi:L‰#ÄÍC†ÁëSÑEWRÔ-4«+«û¢DÑ4’8€TÐMÄ1OJJŠëŸF%›­ë–´w7K+ù³$Å y$~Š w>øõv)Œ°G?–ê^0þ[ 0ÈÎõüjŽƒ¯iþ!´k»1"l™á–)WDèyVóøšn—â ^÷U³´ŽVl˳<¶Œ•Cœ’½ø«EW/ªøÖÚÏQ“HÓtë½[Q…çŠÐ.ØCtÞìUA=†j}ÅÖ:ÕÝÆ›-¥ÎŸªA•í.Ô(xܤ 猃] U #W°Öí~Ùf\ÃçKΤѱSÁ÷íFöæËìžM”·^}ÜP?•Ý+uvÉ*÷Ç5_LÖ“S¾Öl…»Ætˈá.ÄbMÈ#ó­Z+*=vÖæïZÓíb’[Í)"i# æT,¡Iãž±W¬¦¹¸´¶žæÜÛO$HòBÄÊ’88ö©V#Ú‚È€-ÓÞ†e@Yˆ :“B²° ¤zToîõ;{6;K1q ÷;™ L ´À½ÏnIíá*²ÊˆÏ÷C3ô©+µñ4¿ð’^xsPµÒyçO”>EÔÅÆOQ“Ç4¿ð’M?‰¿á±¶Gmkçê%° /÷ ³uê0+j í>éäŽÞæ)^#‰§ÜÅJ6,ªÀ²œ0‘õ¨þÕgµÛÏjIå±Ü08Á÷¥‚êÎëÍû<ÑËåHc“c±‡PqÐûTwº†™¦Æ%¾º†Ú2ÛCÌáA>™$S–öÁ­¾Ú·1]…üàÃfÑßvqƳ5]h,®“wa%ì[,©< *,› ‘¹êjõö«£éž_Ûï`µó3³Îu]ØëŒ‘Tµmcn™s¤]Ø=Õº¡ q.!BØ#Ìe9ƒ‘øUË­_G°__[Û²Ãç8’E\&q»’8Ï¥Óµ]Xƒí:eìpnÚdÕ”L‚yªqø³ÁòÞÿfÇ­Y5îí¾BÌ…óéŒç5 ZÕëø¦ëDdì±iq]« ïÞÎTƒÎ1oƶåšxÞi¤XâK;¹(I'µfi^'ð¶¹,°iZ¥­Ü°ŒÈȬTzà”ëOøbþâK=RÚ{‰‘äŽ8¤VfT8'ž⫟ø0jK:ŧÛL†!˜3¿û¹é»Û9ö«z¶»¡h1$Ú¥ìVÉ#yåÈ죩?@j¬~-ð¼úeÞ¯m¨Á-¨>t¿ÕŸFAúŠÂÒ¼l¾ Ñôû{ë;+››ûXná—s¬Ïî“îüíŽ tÇŠü/ Iž¡J»’.K‘ëµA8÷Æ*Wñ‡SLÑÔ þÌ;ÒCÌÛG#ߊ§gãêÑéÖš¤2]JYbQ²êˆÚÄ{[ôQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÕ÷ú(¢Š(¢Š(¢Š(¢¼ËZ‡H¿ñ^¶Ú—‡/u²ÚÙC—(‹‚͂̀Ÿ› $ñ]wƒçðµÆ’áèE½˜šExv•håy]O!‡zß® \uð&µ'‰7:6¦<½R8Ô“À|’€?½÷MQ°›XÒ¢ìÖ«'Š{ÅŒëFÖèYð|à Î8Ç×ð®_@ðÌ^+Ñãñ©}x5MEx¦†wQh¤«©1œƒžõš·š·‰íþ¥ÍýÄ]˨Aw-³”2ˆ‚xþþßÃ<`âµ£Ðì4OÛéV/:éºÆ‘xníÚiK¡_IbCqEsºu¥‡Ã­vöÄË Ô·²DÒ 8Šë Æî8ëŒg¾k©Öô;/ÚèZÍpÒÜx—Nk‰¥•ÙælK{ú j§cá=Ä^*ñ“êÞlöðÜÚ„¶ó\&æˆeÊ«{Ƴo݆™¯èfæYm´Ïi«hîäºG++÷’¶Mv8'Íð F|Kg20Ý}«š±ðæƒkâ?ˆw0ZlšÚÒ…Ã6TÏ<“ÔÔvÿnÁðû× ÓeÐ…íÔa˜} ÆŠ‚ œ‘žki4Ë x»E´ÑU ³Õí¯EÕª±1†„Y’p{c"¹ß øÂÚ¿‚ä¿ÔmÍÕä‘ߦwbÖû¶ˆùùpFxïÖ§žÇÄþ‡àmIì×[µ‹MW¾Óe+N΀,Ÿ6Šú7­n|?oAw­Ùi–·Ú\Š`šm*é@KrÀüÑ‘†ï†#Ž‚¬xÐFu¿nRq­>1ØùM\Ö±áéT×®µ §‰lo.ã»Ñ®-P< ŒA{laù×yàë:ëÃú\š}ÅÅŨ‡bIuþ·ä$ø•#‡zÍø‡§4gÖ­dò5=uõœàd‚ƒæSê®8"¹{»+?Áš$_hvŸÄú­Õïሻ;ŸtùF;VŸ‹´Ãphz–‰g ý¶­coB™’W Ѷ:†¹éZ^Ûÿ ?€oí }ÿÑÖ¸RÞÖóÂþ5…_÷w8 ì¸ÈÌÑzõ+GÑ´;ag¥ÚEkw@ÜqŒŸSîrk“µ±Óõïxû^ocŒ3(efBÎáNFXñœgŒW;­ÃkaÅ=#NA‘o9…)æFÜt€Žj- Cð ¼zu¬P«Í£´’*ÒŸ9>f=IäžI­=ÃMÖ<]ãVÚ+‹«9mmm–e å@Ñòƒœ$“\]í¦‘aáÏ‹Vºj ³‹Q‰Q#Æár¿Eljì/4­/Tø‹¦5õª\  ¼ÑyŠ «ùØÎ|Š«¿FмIñ 䡱:%¥ÝÌp ù\3.1†#ÜsX!²Õ¡ð,k‡¦ézT"Éí–I —#2.ÒEPç¿ÎÝO5ÜZü@¾%qŸ[œúþôÒ|CHn!ðí•ØÎ›w¯ÚÅzÝdÃVö,¯ê¶žMoò]¬¯:i Aa³çhû zñ\ƒ,†ðßQÔ4»dMRk]RQ"/Îò+8^zñŠ ,uù<Çáë}M5§g—äܼ>Býü󞻫eæ¿›Wðí…­÷ˆ,ü=ï¨]Hâ$ŽL)*€n,äuÀ wíKáCtÞ(ñºÞÍg%çØôñp-ˆÕ¶7$’G¿>²¬ˆ> øbßxÿni¼ûüþµÓx5-Û]ñ¬· Pj¡·ÞûÊýœgñ®?UŽÚMâ:Û…Lž!²HGð7Ä&ÇÕ¿Zì¼umi†Ò8Ò4·ñš! 0 €§¥vtQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÖ÷ú(¢Š(¢Š(¢Š(¢¹IõÏiZŽ¥ æ5ýƒ0}>k¹Á¤œsß§Ò Ð-|A éZ¶§6˜gÔµ=M¯ZÆPcÜp¹QɮʹŸˆv£«xcS²ÓíþÑs/‘²,¸,ŠORAëIâ'V¸]SÒâYµ "èL°3`M.ÙÀ$tÏz¤Ëâ?ê:;Ýé3izn›uöÉËFdšT@¡À9$ŸÂ¡´oxn÷\³´Ðd¿ŠÿRšöÖå%ch!†¢¶kgÁ~«¦hp[jq®Ä÷.ê?zBAÈÏ^´C¦j ã ½Q¢Íôhm–LŒ—1#z{V ï‡n´ÍgV½ÃvºÝ¦¢ëp…ÌbX% †SæºÇ‘ƒÇÐv¦vªª…P£=‡ÔÕWB³Õî´‹¹ä‘_K»7Q# ÛJá²öÅbÝø5åõÖ—®jZj™® µdØî@†äb¬{•"º'J±Ñ,-´ë%+on›WqÉ99$žäžO½;TÓ­õ}>÷N¸fXníä‚B‡ ŒuçðªSøgF»ÐcðíÊ4–1ÚÃn¹8`")c 0GzÎÓüemwi{©ê¤¶LZÔ^Èblcp ª c¹É§ê> ÓïµIõh/ï¬..¢HîÅœ»Và –<¨àŠŽÛáï…­4›­l®oÒù”ÈK ©c“”u'ë]Usúç„tínê-@]^XßÇ“ö‹)J;Gœín ŒóÈ¢ø~#QÑ‚ÊÐêK'Û&w&i™Æ 3žsއ¥\Ô¼?¤êºdzEÒ»ZFmÈ Äܰeç¯P3\wŠãÐ\–]_AÕct·Híõ0ÌMÊ“ù$0ÁàÈ÷xGÁv:O‰mït¹4ý3[¼V†È²$1ª…-‚Hf “É>½ëµ.˜5DÖB7ÛRÈÙÜqånÝŒtÎ{õ¦Iáýk½Bú[a$Ú…¢YÜï$«Ä¹ùvôîsÇ5‚Ÿ |!6ÓAqsn¨R®.%t€݆bŽÄr=krÃÃÚ>›r—–é!¹K¬|É$vcg Ääç¹çÞ­jZf›¬ZMa¨@³Ú̸xß¡ÿëŽØ¬­Á^ÐnšúÎÞF»1ùBiåyûª]›éŠÓÒ´­7E²‹O°‹Êµˆ¹DÉ8ÞÅ''©¬/øW>ûZÞgr³Ä&Gòwy[¶gþZç„ü5â7·—Sµó&·ÈŠTvGPzÈTàúf›§x?šEÜwºvŸ´énmó 2“Ÿ˜g sÝ>ôË/ø?O]–Úz" دUK1 ,yÚÊ 8ÆxÇíkÁ¾ñ ñÝjv -Äi°J¬Êå} R¤cšµÿ³F1 5<½¶àaFÆ ?QŸ­Z½ÓôýE"Žò™bž9ã >ëÆr¬=Á«4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*Ž­¤éÚÝ¡²¾Bð"€ÄÆÁ—‘ƒÔUê)RH‘Ö–Š(¢Ž&£‚âÚå<È%IcÉ‚28ž/Ø¥´ÂU‘ €gccÛ‚ $ž(Ön®oSDÑZúÚÊG†IÚU@ò§ÞXÁ8铚ÙÑu{MrÂBØ:¤›”£Œ22œ2°õb²õ_jjߨzFž—wëf/$3KåÆˆ[hçk’O²þ5 ~2ht‹‹ýKK¹´½‚ìY}ŒŒ´Ó66ˆ›€ÊÙàôëéM‹ÄÞ!±»±‡Ä$Ô&Ô‡‡4x¯-téÞÞYn&1™¥O¼±œtÉ*3XÚ‰yJwÆ~Uú[ß[R_ jŸcòù…–0¶|¢0Ûqü^™â²ì5 sHÓ´= MÓ¬­unÓˆ²ÛA ãçn7rä÷­M7^× Ô›F×íí’ñíêÚkVo*UC†\7Ì}NEAà½{ž%‚ NöÊÒÓM–™¥y±‘^½rjE7‡í¬L5íäv©-ˆ"ÀÎGÓŽŸZ†×Tñ„ ¨®¡kk=¼Vuk{jÄFì£î:’H=ÁŒ{Ó£ñóx8x‰£ˆ]ÿe²œù{öçsŒûÖõ÷ˆn¼IáÛ& cy{ #Ï»d*ì¶'` ŽOZÓÄ>%ÒæÔ´ÍdZËy—>¡gq²Ç(Œr¬…˜‚£JÇ›Å?-ü?iâ©!Ó¾Ìc…¤° ûÝ\à0“v9 ‡õ5±©ãm+VÑ Ö^Æ{]VY!ÙnŽ­ná ™™·1÷V³¤ñuö—£x£QŽÎÕ$µñÖJÊ„FªYG›6ÒIÆrÄc>Õ«¡ê>*žúØí?XÒf…¼Û«L+A o|«vî;Ö§ŠüW­‹»/RÓc¾‚æX“DvÈDm‚ËÜG9 ´{õ®‚]nk_ÍÔGo†Íô¬2©Y9]êÛj„7_5 )!ø‹NOZj°Ù-Ìm5žžÐ+!Oà9!²Ã®1ŽÕZxŸ[mx¬›Y[Å»Æ#B¿6Ür¤6ß^3Åjiw^&ÒüNº§©FÚïM{¸dh•7‚‘òðAÎzf—â‰xCS1àÈÔ¦zgÍ\gÚ©j­ã ÛG®ÝëŸÚ0%ÄúÑ¡EEŽF LEpÀ®‰›5KXñ…Ö³ªi×+‹@·ÓåŽÕ|¿:âLe˜ù†ÀNœk'Rñ%çˆ|1qW¶×·ºoˆìmà½u9Ü n@8ÎéÖºk…ñG†5-kz}F KP[+˜&Ž  È§kG±TŒÐ–Èªšæ« Lu+évÌ#y>Góa~`d'ðúU ;D×-|oâñüwÖšHº· tX—*†<`ŒpI'&´üCâÁw¨èzMÕåí­Æ©pÚtr<Ò3]•G$œ ð3F®Þý§Ä:uÖ§s¦cOwoq{ ©%´ËÁ@ò"œ‚½HÁæ¥Ò´ßM­Ùj×—úýî’ ²JãËvؤÞvÎO^µCCÕ4±¬èñůjúv§#ªÝéúÀ­ÐÆ]ØPÙèQ¿à5Ð4¦ÃâJEêºé”w’ Ö?ðEvôWñÎ{`ñ~µu-3°c…žÝ¿ÖFÇž;Ž byZ¶‹áxo㸠âê6kqz0ý¤ð=£Nßšµ¯è°ø"ÚÇ\Òo¯|øo­"ºŽyÞE¼I\+W$nç €+c’ݾ»ãt–i$Ž=RÜD®Ä„$(è}(ð÷s§‰þÑ3Êcñ6£nbÛP…è§jÍñ…ŒºÇ‹ü/¥=õͽ•ÅŽ¤×ÛÈÉçÙò’;~¸Ï<ÖV·=”ž! Üišî£é–¢+KÄ3Éœ4§z±Ú,yɪwk6^ñÌZêv::iþu‡Û‰@ÄaÑs6Þãž9­ kÂv…eñå×öõŠ^h4ò3LÊ!ƒ1R­ÓÅ>ÏÅ^4ÕTyÚÑ4}.ãìbGXÚFÜA`ÎßNœÕ .#ñ·â7Õ¼;©ëYj2XÚ%»(†@8Xþv$’H‰~&ÒWÕ<#ªjzù–_í’c;ŽÑfVPtç5~ãOÕõ¿øVV^#ó’åßQŽð,¿4‹g™à Ø'©­øG4 ÆVZve¾Ÿ¬h·É}jƒK°® ^™ÁÇçëV>húFŸ¢Msii7^ÝÇ,Š0αÊÁ>Š:W{EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢Š+‘Ö³mã \¿ú™à¾µ* ûãô¬Ÿ7„W[ݯCw¦Ê¶«ö=ZÑ¥AŸ™ Œ=nÍd˧ø“XðìWW2j¶šwˆêѹKɬÕvî Ź$p …[±‡Ã:¾µ¤G¥G«êKâêiî®.6¦>T•~ “Ðb¨Ç¦øB“U³×›ZŽéo'šßìs\ˆîc‘²¾Xˆ…ÝØŽ9®óÁZzéÚ²}†K™ä¸x%•¤u.só3s¸ŽHìk Æ áÙµ›xõý"à[­ 6𵝙½'tlb—É ç±¬7Ñ|A¬xnè•Ôol¬µ¨o4øn˜¥Ôöè¸`å`NNÜàñô©ìl¼3ªjzL:N¬N"ºK‹‰µ nÒ+o/æ¶óŒ÷ÅhiZÕÏ‚âÔ´{ý*þyúæk-¡iå%mËó(!['vÚv±wâaàÍsWÓeyíç¸7Ø#9‡ÎBm'ϯáLÔ´ [X—â´Pº³¦ËhÒ.V‰`î0})úλ¨ø«J—@´Ñµ mBõc‚àÜBV+e$obçå ãi9ö­O»µñ_ˆf0ʶ²Xé±Ã#‘ÊqÞŸáÛKË}oÅÒÍ‘Ã=í»Bì>Y–2Wèx5gÆSjø{SþÍ‚Yï$‹É‰"oÞ¤÷AÏáZ:NŸ•§YiðŒGmoCßhëøÖw-no|5­[[ÂóM%£ªGÞcíïYðjú=ö¯Ûéó^E•ö ÛxpfEáƒ*’2AàŒÔ–+ªøƒ]Z›OžÊÂÆÊhmRä–Y%ÆæÛ“€Ç=kCÁwÖÓ-¯`h.#I7ÄØÊåÉÁ#§½/ŠÿµÅµ±´ÒâÕ-|ð/­)wˆŽ±î!w)篵sZ‡AÕ¯'Òt™ô]*m2[y£˜àM+ãiXƒ0yãÓXIãaáI<3†î>Ûœ–3Ôlt‡¼KMm¯#G@æUw0Ë‚:ƒÍ\[-wÄZޝu§Éb©¤ÜXØÛÌÊdv—–vÚH'ßö‹®MðúËHKV:ŠYiñ¼ ®C#&áœãŒóô­é×ךŸ…緄ɦ¡$“¶@òÔÆÃ''׎3Yéž0Óì3…ŒòOq[$ѯuy4¶xÕlux/&ÞNJ l…À<óß…o¡øëEÔu³¤G¥Éoª^½Ø»¸.&ˆ¸åYBüÁ‡çZ­cà¯ǤC¤ÝÜZÈÖ¾!ƒQŽàXěزã†ô‘ï]4-Ü^'½ÖËÇöyôØmUwîG$“Û/‰´6×ôãkÁ¶ºŠh®mg>T±©Çµa¶‡ã}z}93Õu¤æÓL³DMÙæß¾R?Ýá~¹®‹K¶Õí–èj7ËvÒ]Ë$%c åÄ~ê’¾½êýføƒIþÝÒ5-+Íò~Ùm$>f3³p댎ŸQTïü-i©øvâw{tŽâ>muë‚ÍfGá ~þãOë¿Úº}Ê\Ãp,bISî´„'iç5%ç„õÄÕµ OD×[O]KÊk¸ZŒ …ˆÁÛ׃W<áXü#g{f—³^}ªþkÃ$ÀoÌ€d:ôëV®ô®õÍ+[iоou DÃyûrIöÇëTõ¯ \Þê1kV§&™©-¹¶’EEtš<äFë´ô ‚3\ç‰|1ý‹àÿÜÏy6£©ê2=ÍÌ Á ª«ÀUüêÅŸ€¯/4í;OÔÓ»w›»ÝŸnœTš„.SP²Õ5fçT¹±W«"¢G:ífÚ€eˆîIöRo‡à}®ÛO×oì4»Éd–k lC—ÅK(cÔúbµG„´h¥ðëÚ†·‹BóE´Qãi&Ò Ÿ~¹Í[¸Ðìîu?[y$V×ñ #c Šäž3‘Ž9OÞ‹ÃrêFÞþêkkË—¸KiŠ”€»m˜à“ܚߢŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÒ÷ú(¢Š(¢Š(¢Š(¢Š+3]ÑmõÛE·w1M ÑÜ[L£- ±œ«ëê+KsÍ-QEQEQEQEQEQEQERdgæ–ŠBʸ“žô´QEOo$’ŨÒD@‘¦FFGlÔ”TS\ÚÛy^|É›"ÅösžŠ3ÔŸJ–Š‚æòÆÈDn®#„M2C‘€Þï÷Tg©=…OEQESd’8cyd`¨ŠY˜ôu5 í–¥ko{g*Ímqɋєô"§TD"…“ÀîzÓ!¸¶¸ÐJ’vŠpËÔwêJ*;‹ˆ-`šâvÙ 1´’1þQ’i–W–š­½í¤‚Kk˜’Xœó+ ƒÎ OPZ^ØßÂ.,çŽxK2‰#`T•8##ÐðjzÅ»ñ_‡¬ Õîn't‡I•"¼o-þFlcsÔ}ÜÖÏ =A´QYZ'ˆt¯­Äšq•à†CœÑ²¤„ÂÀnŽ£5«EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÓ÷ú(¢Š(¢Š(¢Š(¢Š+‘ñŒ×A×t]5£•¡¹Yšä¤»äòÊ‚ ÏÞÀl¸ëTôÿÁk©x†ÃP–âêâNE·‚ÞvŽ‹Œ„^™Ï,y<Jèá*ðßö7ü$ñF›´Ÿ4ƒœƒ·nÜnÝž1ŒçµA§øÇD¿¾‡Nhî­n®žÝ.¡d󂌄Œ;ŒƒíT¼=âÙõ}w\Ó%·™a·–1jÍ®ÕÙó ã$ä®@È«Þ.ÄCO[Íf–3-Á€c(¿z3zŽ˜ç5¬ø²m_KÑí¼36ÝK^Çümÿ­vŒ§O­]—Æz>˜Ïa:†¥ö°Ý\[ÂÒ,l g{ e»œô­Câm ãÜE1š ^u†ÒHÁ!™”‘ŸNûÔ÷zÍ…–£¦i“oûF£çù/îWsdöã¥fi>4Òu»÷Óìmoášxg”ÄDp´yûÌN>lqŒž™¥ñ~¹q éM=¢,—×GkfÐË' ŸaÖ±ÿáÖ^>_j§UÚ[ÍI„9ô‹vûzUøð­ ¿Çm©&>¤öpÝcTùCõ ŽùÇ#Ö7‰/â:_’Æâú+«im¼Æi8FeR<œ¨Ç^œæµ#ñâGýî{k¤ÝH‘¥ä¡0»øVt YU»> Vힵ歪é+ ‹&œ–Îòm86óž1Î@¬ø¦ìé>'þÌ·ntÉ ³J¥Ì o1w¹é‚}¨´Õ~×àöÔ¬®­õ «kƈyªPmKœçJž_ßÜMx4]}JÒÊg†{„‘3§Þ†9ltì3ÞCÇš]¦—¤jÖÖ·‘jw+mqæ ü¤9ÈÇ^µ5Š5Õmô_G“O–í%{GóÒO,d‚WlsŽ~µ±«ê–š.Ÿw©]nò-¢28QÉÇaîkÛÅعӓPÐ&·µÔR)ã‘dòÙ¹Q QÀ#¿ zÖ–‡­iµU³õ)¬NNwù`Ý3žœ×âo‹ýGÕÅ”¡­|O -¼l Èbf[ÐÖä>*×-/ì-uýXÁ¨KäÛOÂ@²’|«‚ݱ¸g½RÆÞ%¾V›MðúÉ—uq òKp8ˆóåá–Ç<íÔÓG޵ãem¯6„#ðüiaö…Wm»ü°¥JçþšdŽÕ¤5 &ÏÄž ‘ì„sZèö·݆%¤Œ;vôqëÎj…§Œ<]sia¬9t{ÇL y‹ÜDzÚÚ‰nëÄÚíÞ³©èÚ ¬Òé‘D× u)]Í ÜªªªÇêOÕVï[[ÕðuΧ¢4—É€E;Ö²ª8.¤ 0㎀ƒš³/ˆ¼Qªßj¾±µ’ :o"{›ÇeY%,‘…ü½Éã=T½øsoá÷ÕcÒÉ¿·ÕNº²wå%Ü Às‘´àg#¥N¾!ñ®›©i0ëºu’Yj—&ÝÚWg·r Pû”œc#ñOŒuk­e<;k§¼zUÜ–Ï ÔŽ'™£êT…ð¤ç>Õ×i—s_ØÚ]Ík%¬³D®ðK÷ãcÕOÒ¸û½~]_ˆ–Ú}ªO§ 9D¼æà´CiÝè1Ú™sâé¶š~¹¨Xéé¥Ï5ºÏo9ž˜€î‘žFßǽj^kž$¿Ö®´ÃjOŽ6½¹ºÜT<ƒ*ˆ«ƒœrI8¬=KS×5 Mkzx´¿µñu»ìË—Ä‘ÎÒó®§HÖ¯5 gÄzt©‡M–Õ!eÎæG¸îÏzcŒÞ3Ôá³×í¢’öß^“IÓa\36n<ú’qŽcøœøò Ǭµ…ͤÞ!ÓØ½ª:\? C3îž~SÇJØŸ_ñ.³¨êvú%öŸag¦Ü›W–í ¼ò¨‚¨tÂŒã<œÖÇ…5ùuû+†¹Ž8ï,®å³ºX›r©ëµf«ëZƹ&³káíÉŽáíMåÕÌêYaˆ6Ð\³™`;Ö]ωücá»=hëvQÝÍo-¼zdöãb^4çj©RÌC)ûÜôé¡ãï Åm«j·vwÖh£¿‚Ju‘€ßnl…'ßjiÔ<}­xƒÄzN›{kcc§=¸K†„¼„Ém¸,ä“ô÷¬«=wân©áëß-õ·ö`¹fHK-Ù¶$9ffC@§­ij^$ñmþ£á;= à¶ZÓ%º§MþH ­¸`Œ‘œx$Ô‹©x—JÔn¼=®ÝGî—uugv‘ˆØ†A#¡È#•oâiô x#Mµ»·±»ÕmÂýªï-ã‰rí‚TèM^Ó|I¨[kvz Þ#´Õ×U¶¹û5Ì+–ÞX—?2¡*TŽG‘ŠÃðî««øKþ-Önµ»Xu›Ø"ãXÐÜ4¡w³@$䎀U›¯]èKg~þ3Ó5€.bŽòÆ1’ŽØ&-¬[)×9½6òê [‹¹Ž!·…æsè¨2kÍîSâ±á;Ïÿlˆd»ÓfºLÆaº¶7î+ßxçµBÒ$!%`V-²0ù8Ï~MOã«Ï³Üi1]ø‡û#K“Í3ˆ W 1µc±Ú:±5‘á}jôê*Ó-ïõ ­>ÛKŠîÒ]AfG`Á°YQŠñÁ#èj¦ŸâI¼ Š.|O©N4ß!GQ©!Y1†Èûۉɮ‚][U·×|©Ëpÿٺ݇Øç‡?ºK†_1Våjï…ooµ­gÄÚ™¹•´è®×N³„ŸÝæûǧÌǯµu´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š+‘ñ,Ööþ)ð\³Ê±&íIrä“ÀÉ÷¤ðbCý¥ã)1µÇW=ðp rñjcOÐ/Ùí]®Ù­½G_Ðõ?xBÖÂê+—…uv‰ƒ(Ý##>¼ÿ:Ðøzcm3Qt9Ý­j;©út©<}e}s£ÇuešçM½·Ô 2_É9 c¾)ƒâW€ÛO7ãSŒàöùm¼¹åýí߇éX:…æ¼–Þñ'‰bX ¶Õ&šê%CþÊV&q“Êq¸öÏjÑÔµ}+Å׆í4K˜¯ 辺š`Pà|à æ®øaƒÄ%qÿ#£’=w ã º¶²ðO…¯n¤[Zø K<‡8E[‰2MuºUÅ­×u+‹vE6ƒc,r/FVvÁÐ×7¯gìŸpbkÇqI«º÷ŠtOø|è:i/¬j °±d`ðFã ÇÊžOq𷝦xgÅÚðÕæ6ñßÙX=¬Œ¬VA ²°È{u¬»k¦Ö4O‰7ÛÌžtólIQ•ʈWk ò9éW¬õKkUøw`í,ÛP˜+¥bPs:)<9âmÂz|º²e·Ô,®npž[±¸W²º¤ÙÇ^µ^=;P¶²ðº·džëĦõáÇú‘&æú`u÷®‹^W>(ðkb¢MG$ûžü…kx‰t}D®ž5Ü6ëBqç/qÐóŽœs^u¦Í¥&¡£ÅàCT o!z|ÂF‚?å¦ï5~RL7^li¾ µð¶¡âM?S·»ûEÆ­5嘊\¤ªT‘Œ‘ŠÄWÖcðžxt»–¼Oý¥­3¿‰‘Œ~<{Öýö³oã+ÝNÓ-®öZê0_ÞM4.‹ƒ‡x303V¼?ky‰âxä·–9%ÔuV]N\6p@êA펵CQµÔᥥ¬v“Érl4õòO™ÉWã¿¢jqø»ÄwPÚ´›´+Eƒx"9Yþ]Øüúã5Ã=¥Œ‘C'…ô}kEñ<’ǺÞ$•m‘÷ þaaåÇ=?*è•ÜxNÛ[³Ðt»}fV“PŽ&fmÍœð w `Ü×#­éüñüJÙÊæú+1f¾Û ·ŸòksÆšv©¨ø\ÚZ[´—FKc\dm‘KuãTå:¿…5íný4«GOÕü‰ƒZÒE,k´«)#†‚* ‹_ë6z=Ö¥faâ{[µµB¹µµB~ûg÷8'®1R´šÿ†üKâ ¤ÑnuMYme‚K]Ÿ#Ä›J>æ\g¨=+&ÏÞ3¹Òµk»›(àÖ£ñ9Ö,àg$Ú«òîˆÊäÏ5oW¹ñ§‰§ðúCáË‹+KMbÎæñ®^-ß#s°+œªòIàž0*ß…¡Ò5]j[ŸCâu Ç»µ¹U„ÉKËG'˜A Fx=+¯ðv‘q¤iŒ·6VÜN󽵊HÃ`$pÌäñš£­ÙøƒKñ #ÒìN¡ šy±¼µFU”mÈèX€{‚ ϽÒ|{â;Wšõc°—ϵ¸Ñ윫yMnÁ³+¯w<`õ¥ÔWƾ1Š×G½ÐÛJ²iá“QžI‘÷$d1H‚N㓌 ñ[z—©ÙkÞ+½¸Œ-­üöolÀ‚X$A[#·ÔHÉ›ÝØp:`š¥/ƒu‘£x>u³µ¸Õ4(JKg99’Eèl`8ÆG5¥ é¾"›X]FïH²Ñ¬`‘-¢¼ÓHßÄΪ6¨œžõ—„|E{câÏß[ÃÞ¥>¡§Þ‡Ý—i¨hñœ9çð«QYxÿQ¹²†M#NÑãŠt’òò&IZe^«”ãwL· {×owmíµÅ¤Ã1OÄãÕX`׺7Äèö;ýlÂ%â  ÝØ YµmM[ˆf$Eq"†PûI0Nߨ­]ÏÆrjSê:×Ù¬­D}>ÔïÎK¼…“ØÅréàoIáëÏ̶;MWíÖ™Š]5¤Ù:í=‹sÛŽnêº'ÄnMùáÓ-?²o⺎Á$vYHIi6 `ŒýjMWÁ:Ýõ—Ž­£–}rîÞkRK`Tt=3[:ÅŸŽ`Ôb¾Ð絸µkQöŒÊ›ÈtuV ž‡*i<áËÝê÷×âÙ/u[¥¸š@D1mP .pI=IÀÉ=(ñ¬ÍªXkú ðÅ©[Bö²ÇrʸÎv¼‚§GãI¢èZüš´šÿˆf¶kÕµ6–°Zîòà›,rÜ–l ð8oÁº߆ô &êT–ko7sǧs³ gØÖ~¿áïɯXøB–ÐÝÃdöRCx­°£6íÊWÙëê*¥—…<_µ¨j·Ú­Âêza´¸E—É+‚.OÊ3Îãž¿A¥mዸ|¾k„7ØíbfíÜSnq×…ãØ,ôïZi²^"êÖI`tí¤ $¹…”)E9<ž:]_…´Uðö‰§i™Ý$5¿¿#rçñ$ÖÅQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÕ÷ú(¢Š(¢Š(¢Š(¢Š*–¥£èÚÌqéÙCwoæ"Ì¡‚·¨ÍO ­¥³LðB‘´òy’•l“êp*&Òô—·žÑìákyÝÞXŠ ®ÌrIÁ$õªÑxoÃA¬ZU¢[Ç*Ì‘ˆ—huèÀc¨íV³4¯¶ÿi}’·y~WÚ63o¦î¸üjÝE½´RM4q"I1S+¨¹'¾W¹ÑôKÉÒæêÂÞk„ÆÙ$K täŒñVg·¶º‰à¸‰%…Ƭ=Á⡵Ót«$‰-m!…!ÝåˆÑ@MÝqÆ{Õ„Ž8Á¡A%ˆ¹ëNªßÙÚaŸíFÒ´Ï]‹¿óÆjÃ*°*À#õ6öÖÊR’%'8@ý*@g9â‘£‰”£"”=TŽ)B¨èã…ñׯ½P1`£q'½ŒŒã¥- Î9¥¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠB@'ÊIPFáÔw´QT¥ÒtÙõ]ZH³{k °Dù?*IÃÁÎQVüÈ÷˜÷ áwÏ8õÅ:Š(¢Š(ª­©ih׈÷p«YÆ$¹ÆaR ùà ç<3AqsÁ"É ¨¯¡Ê²‘A>«ÝßXX,oyq ,É Îç £=ÏjŸrnÙ¸nÆqß´UfÔ4ô¼OiÐ^I LçædR`=5fŠ*´Úv™sqÜöÉs|™]xóýÒFGáVh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÖ÷ú(¢Š(¢Š(¢Š(¢Š+œ×ÕÓéÚ¶•«Z}ºÂå&¶Üêd^€¡Á>”í7RÓµ{8oì&ZÎ Ž@Žø=k“›_Õ~ÏâöŸTŠÁ4íRmîL[ÄHÁ8esœg¶}«¤Õ¼C¢hf¿¸Ù$û¼¨ÑYñ×  œ¥6ËľÔ4éukkøšÆÞl¤àFW¨là‚=ÀªÚgŒ¼/«Ý%•­Ó ‰´I,nžhJUðÍC{ã¿ XÜÜÙ=Ì’Þ[>É`‚EéÎÕRqïÓò5lø¯Ã#I\ûj>B$嘜m Û³Æ1Ÿjf‹âÝ]¸šÎÕæŠò$5½ÌO› Æà®‘ôª÷^:ð½¤ÓÆÒO$vòyWC#C w áJñߓ޸®†)bš4–'ŠNCЃéXúŠt:í¬6\]^$^l‘ZÄÎÑ©îØì3“éQÉã? G¤Å­›¼éòN°y[(äã ¸ÈÁë1Wô}b×[¶k»h§Ž1‘Lñ²ø”6ÓØâªë>'Óti¢´0ÜÝÞÉ•m­#/&ÀpXŽR+>ïÆv3h:®§¦Gp÷6i$oˆù°KŽ<Ä88O8ÇzÀŸÆ—†ÓÁšµÙº´ŠIÙ/Ë#í$ÃÁE‰Vcò⺭+ź~©~tÇ´¼±¼0ãŠò-†D©ÉçœûT^6Ómå»X,o¯ ³b—7Ñn}ᜌ•þ- âªxãÃÚZiŸ>å5ev³6Ñ—ß´99q×®+nÂí¯­ ºkym̨ʘaÓ=˜dàþ5‰mã+ÝR}&ÒÆòií®Œ*.,n,N0yÆ2xéP]xâä»6Z>¡¨ZYÈñÜÝ["yjSïÜêÍŽ‡jšµ}ã&ÚÓK¹³ŽmBMW?a‚Ø ó`dŸ˜¨G]Äb³äñ¼“Zk&“}o¬iö~y³qò­ÀtmåþnÝ+7Kø…5‡†t-G[Ó¯ž[É`³Ycf¸vL‰£tb0Ðsü5ª5dºÖü.o¬ïìon¡Ô|«s"ù` óB±‘Êã8ïM»ñÌᯤҴ;­JÇO‘㺹‰‘Fäûâ0ÄÛßç¡5•ãM^ç^ð¤š-ÅÖ•¨ÚO*„h€¹AÏÌA>ù+íšÔÓüE é6~+ÔeQÃc¬Î“ù¬]¤“ ÄC'‰G…IŒu(%³þÛÐn4Û;Ù’.D}®ÿtJªr¹éÜg½^2Ô¶uM KЧ½¼°X]ŸÌDˆ¬‹žXœƒØ §5©á¯/ˆmg•­^ÒêÖêK[«y&)¨ÈàŽx5Ÿã+©¦:?‡àvGÖ¯ 2º‚5Ý.b@ÛøÓe¾Ó,µ¡ÿ –·eoâKMVÎÞ-cG°7©å».# á†@` çëZ>!ñ5Ö‘á7ñ ½ºI0¶µ™bsòþõ”G¦ky|V~%A-h-Žˆk´™0yÃqÀãÌÏNØ®»Å¬ú…ªê°*<¶v²L‹&v’£¾9Årמ)ñö—¦Úx‹P±ÓãÒݭŲ»™âŽRw) ž›}³Þ´®µïêzΡ£øv;UM1bûeÕÞò¾dƒpDUÆH’O~•…âw_Ôü+ã-:æ+km[I·u½sG$/`ñœ‚ ™Îæºÿ_û LþÓ’ '6Ñ0 ³hÛ÷‰9ÇZää¸k-oâ­ÒC­“c(ŽQ”r¶îpø=éòø§Å­qàÝ+D¶°C¬h†êF•_Ë·(ª~P¤|£8éÈ¥±Õ¾(_êúLJúdRé‚ _Pò\‡Y—*¢/3ƒ×'Ì?J†oj·Z”÷VÖr_Ûøª "ë(Z-É.Òè È=Ç¡¥‚Çñ3SßÚˆF·–AäÆßÍl&wðÀä–è»Q[ø·ÄZÕ«ë–Zþ‘cnÁÞÓNœ)iIÛæ¿˜¥YýãÞ¯Âg«ø’/ Úxsɶ»Õì佸ša¼ZE Ø_—sàgŽ•_N‹Ä–ßì­õ«ˆnÙ$ÂökáÁfØ¿¼ öÍøòüÆÆÝ½þ´ív î5Ï'ˆRÕ§óïÌ¢,ù[©M»¹ë޽êö¹ö;oxnx[¯±êó`ùšÝS#v;nÆ=랃û^oß˧Øéšo‡æµ¹’4™žIœ1',rsvË6:ô«q[ÚÞj_ ’æ%.“<ªdXSê"·/6/4|àgD¼Qïó­rúÅÕdž§ñO‡lÆ%Öæ·›M_ö®Ï—.?Ý#5ézuŒe•¥„ê­ Žú(Åy¦µ“¤|H :ê¶øéÿLë¤Ó¼¡ã½pÝñpÚUØ·w„ó6ÿÀºÖ‹§Ñ'µÔ¦Ñq¼C§ZâD-2÷`íß‚¾æ­jöÞ#žïÃðë Ów>§o5¬vÖ’y’Û'Î|)WÖµü ‘_Ærà®#-ßj  ~šæ-âÒeÒomïoäÓä3º[ ¨×"ÁÊg9\G8âµ­î|Kgâ ]/S“OÔ®î,.þÉ} {'„(ç\°ÚÇçµgxn{è<%¾}vÎÒÖÖ;ˆ® kpZîWò[ðçÞ»O[ ?hð-Ã\"Ú!I §•ùI$`q‚k/Ã7–z§Ší¯'Ž;óª=Á (»ÏUjå.ͽæ¬_ÂPé—Þ.´ò1÷e Ê®Ëêþx¯[®:ÎöÃLñ‡ˆR–8%½‚ÒK'”æD‹† O£ue,°êןõ?Y6”–‚Tå'–8›;Hë·8ïQZ^i×Ö¿ >ÏqÂ)RÚÀâD·åN;ŠÜ×JÿÂiàõܵ¶©^•rZêé:¶Ú‡‹¿²î4ù'ŽæÐÇô`Äü¡fÝœƒÎsZm¬6Wß `C?–ãW™Ò¨—…¹ ÀëøW¦W%཭qâü›þ‘ŸO•k‡ÒîtíK¹´Ô*,OæÂ:ÀG´îÿWé×?…R¶¸o êZF³¨Á9Ó¯|;ge$É7Ù¥‹œ8=qÖ¢ñ6³¬x«ÂÞ$šÓM¸M"˜4û‹F¼·ÓšÅnc(fòA#¯÷±õÅXñ—Чñ‡.4Ý3CÔå¾”Â.b{iÈàœ’'#¥½kNîËPmwÇR%´Ågðí¼p°C¶G ' zì*Ylõ'øa˜¶—í¿ðÃió7ˆ†Wo\ûT ý·áb ]´»»ÛCF³·¸˺[y¡Lƒ´ƒÔw¨ü/©êwÞ2ñEíÞ›5¦t»&‚ 1æ˜ÁlnŽp â»M W‡^Ómµ8a–œ?î¦:b¤0Œäz×!ªÜkš7ŽßUG¼½ÒåÐb·–[e QĬFA>øÉç5š^µâÃâ½[ì2Ù}¯Dm+N†éB»ŽY™×'±dô“â-Wĺσ×@²ð¾¦·Éœw>daQL¹ØrwGíÏjéuOí-;Ç:N¤4Û›«+­%´æ–Ý7$2†ÌœŒ.;ÖÏŒín¯¼3®ÚÚÄÒÏ6Ÿ:GŒ—b¼=Mdø¿IÕu/I¦ÚÛ<·­ob¢@l£¡=N8ÁïPÿÄëÂæ»xšUΣ¥êòCt†Ì+I ÁB²²’§ €AÅVÿ„{Äž“ã­BêÛÈÔ|Ahñ[Z¢Ž8ŠÆ¬FFæ$“‚@ÏZéü#s{s¡ißkÓç°žxáhn6îù ðO¶p}…s÷Ú¹5ïÄwKbcÕt‹xlŽáû׺‘׌:â—KÐu«}WÁÚ‹Oðì¶—O¹w!XÆÓÎOCÓ#Þ´ô}/TµñgŠõ ¡Ûe{š-äÈùÌHÁ¸Îx÷¹sá?&æÜÚ~ùüwý¨zäÛùá·ç>œã¯µm^Ùx‚ßÇ }˜nô­GHŽÂiÕÔ}œ¤ŒÄ°'${ ç,ü3«xzÀh‘x&ÃS¸ˆ¼VÚ›y>[¡o•¦ 7åAù€ œpkrïÃþ$Ðæðö³¥[A}wac%•õ¬Ab$„11 XgóK¦Xø×Pñ•¿ˆ5=>;-:=&kX¡óCÈŒ]N_e½‰Àk»¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š+ÄÒ|H–«zÓFö²ù°Ëo##¡# ¼óV¬4?MŸP¸¶V_Î'œ³– ŒôàUFð§‡Ú ­Œ åM©ÿi¸ÞÜϸ6sž™:{UÛm'M´¾¿Ô¡‹mÕø„\>OÍå /¥dê>ðƧ{5ôñÎ’\([”†i9ÀÿžŠ¬üEjé:F™¡Ú-Ž“n®îp\äõ'½sÞ.ðüzþ±áxîlÚæÂ7½ûO÷S( A|ÀcëWE𧇴 'žÆ7¨I'šG’FQÑw9c隣ÃÏÃ$¬º~è¤rÿgws ±êV2Åࢴl|1áí8iŸf¶ÁÓd³,ÌÆ%—ïI=}óŽÔýSúµqaumæÏa/™nᘙ¦·µ´´…-í¡H`A…Ž5@öŠ‚ÓIѬURÒÆeiTFŠv,0:‘ÅYh`y#•£S$a‚9*®½V¸Òtk»ˆî®lm幋\²F¥×„ŒÕ£lÈì ²gi#‘ŸJu5R4ÜUBîmÍÔúšŽKK)eI¤‚7•>㲂Ëô=jI#ŠU)"CÕXddöÖ±¬Vñ$Q¯D@€¥H-âŽ$A¸·Êç×ëO!I‘ÐúRâfQK/BG"••”ŒúÒÓU3µ@ÉÉÀëN¢³5í vÁìÞCÒh&QóC*«pkE…Pä370 úS¨¢Š(¢Šçõ¿ë×°ê:V»q¦Ü$@«$2.s“q¸z‚ ;Ãþ‹D}Bîâò[íKQdk»©p UU\UüÍkÙYYéÖÐYÚD"·Fƒ¢SÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÑ÷ú(¢Š(¢Š(¢Š(¢Š*•Þ«§ØÝiöwV{ù;u NâŠXäÇ®*íQEejÚiú¦‹¦4 çS{…YÊMÜŽ§>Õ«Yú¾±e¢Ã÷AÊMu ²ì\Ò¶}½k@9ÒÞúóS¶‚ÖáUá–I,€Œ‚¤ž ³a©iz¥ºÝØ]EsnÙÄ‘0eãÜW/â/hVºn¦Ú.©cq©Ú*ðÝ\ò‚ ãÐ×G©kZ.rêW‘[,Œ<ÆÁvôQÔŸ¥$Zîƒ>œú´7ð>œˆÎ÷ ࢅêIöªKãO=г]fÐÎC<Áƒ´dóÓ rFsSi>)ðÆ»4Öúf¡ÄШwD<í?Ä3Œq‘ïUo¼sà2éì¯5h#ž6Û É"3èì ø‘W5/økH[gÔ5-Òê9$¸‘Pdzt5—eâ)µ/ZÛYÜ,šE΂ױü„q(]Ù c¶+U|Iá×·Ô.Öú/²éò4wSgä—¨ÝБßóÅUÒ¯¤êl­¨i—;K¨À–>hŸ3Ž;ŠÙ¼¼³Óíæ»¼™!·… É#œ*êkKñ¿„µ‹¨ì­nØ\J B³G$~pJoUÝøf°ô¿ͬxÚÿKK颲²EH­E³3í;Ì’2ü »Ê†ã÷ëõ _LÒÞÆ;ÉLm{r¶Ð|¤†‘º@ gßëº;êï¡,ÙÔRÛí-ÖÀLã;±Ã9ö®cľ4³¶þ˼µ¿h,­¼@Ö:ƒ8a1uåI#=שï[G4 føiÑ-Ôm MwPI•òɼ ÿ?jƒKñ•c¤j:•ö®÷6Öú•Ô-4±ída&Ѩ;Oæ§Ò¼g¢ê·ÿÙb+«KæˆÍWq4fTÓ=~}«–ðÇÄkh´HŸRMBú{w¹ûmÌ6ìÉ67²€8\8Ç­z-­Íµí¼VÒ ž5–7^Œ¬2úÕ3^Óu[½VÆ1n4ÉÖ„‘q÷†Aª{Ì><ðвº¿Ìæ(u'ÓcUŒ—¸™{DKg±ö5&ã3V¾:\–—š~¡å’ ض4¨:”9 ã¿9ö«Ú^½§êúYÕ­–An<þpߺb­Æ}G­M£j¶šæi©Ú«¬Q‰H0À{€Oó5•«xÂÓNÔ¿±ítûÍKQââHmO–„àgdQžÃ9¨ÇÚ zÿˆ$†ê8tùþÏw¦&ŠMÁH*N8È<1â¤ÆÚoö]Ưue{kl“¬6ë4X’è¾6yI’NâxÈ…Œ¡¸Ô-´ÍGK½Òî/ÚÓía6Ï´d€QÜœÝÔ/bÓ¬®ï¥VhímäÂõ!N3Žãáø•m>Ÿ´º¤4FUi/J¦#‚Jo.U{¤zf¶µ/ÛÚÏge§ZK©ÞÝÂ.+r»V"qæ;±)íÔžÀÕX¼obÚv»w=Å½æ‰ Kye.ß1@RÀ‚ RlUh~ Û¶“w¯\é7¶ÚdqÛµ¬’ßvÒœ‰»#œ`¶Îj͇‹u6Õmt½cA¹ÓZôIö9‹¤‘¹A’¬P­Ž™ëëUÿá7Ô/îmÃ÷:–›i,‘It’"ù "V9l;z5?ˆš]žŸáýJÊÎãP‡[›É·Hq¼6ÒpA#œŒF=x«_‹59µˆ´]gE“L¹¹·’{VóRD”GÃ+Œ0Îz­Soë·'QŸHðÜ×z}…İI<“$m)‹ï˜Ñ$Ù#5^óVµÖu߆ú•±‘`½MFdVàüІŒÆ¨é~" é*ÕM«]AŒ/RàÁŽ6p ƒ¼qÇÔWa¬ø‡û2÷B°··7­ÑFül‰^N‡;Gn3ëWõmF='O¼Ô$ŠIRÖ”Ç˾ÑÑG©®LøËŶM¼Ö¼=®›s ¸hî7K”á|Ä(£ëµŽ+V?„Ô¼Kc{l MÚ+´6|è™ Æ6‘ަ±í>"Éwá!âÓBß5âY%‰“¬¯ U]ÛGcŸ»Z:†»ã uk+CÑ£‘m!ŠIîïdt‰šNBG„bÇOAY—.íü3y­¶•þcª 6æÌI‘æ Žzäp+Joø—NÓá}GK‡û[P½ú}Œç ®xå@@%ˆÓ4ZxƒÄÖ¥†™â;+XÆ¥æ-­Í›±A" ùn)ÉÎ}utQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š+‚ñ¾‹a¨øƒÂ†y.TÜ\MySH€*¡o—k 6z‘‚G*M;K_jåÖ©qrm¬oåÓ­-£•ÑD\í –bz“ÇjÐð]ÕÿüNô›«‡ºV¤öÐNç.Ñ ¡v\àšêk‚ÑtTÔ¼Mâ;ËÛ»™#±Ôâkk5ÄHûÝ´Ütöæ¹ëytí}nµ-gG×oo&¸ŸÉšÐ8ŽÙЍ‹lŠäã$Öž™s®Oqðôë1ÏêÜj‘¿ž¸‘ÕP…f¥qŸz†òÏÃú®§­¼ÖZŸˆîVí£S ) ¦1û¤c"&W©#¿^k:âÕ5¯x^ëWY&º‹TŽÔ<²1ppP‚Aä•g“ß5¯©%¤¾!m M"òûIÒ,-…½­»|Ÿø¤ÜêN ’Ý꘸׼9¦x°Yi÷ºn—äÛ›»uc’¶Ç)‡…çpÉàŠ—Ç^ðΓák‹»$hn­„;çÞÛ®78HIù²Nyï^¢: ó?ø'ÃÆ™}s«Z‹É¥Ô/L¤Ÿ +‘û¾~RNNW&©Åqi©øoB±ÖZ÷RxõK¸`´ƒµ¶fQæ@Ø£%€$rjÖ‡§Acã³M=ÆÿE¸Y-Фû]~gDùAÁÇ|óÍg[ÚÛh~ñ]Þ“f–÷­O§‰` ²<ÕP¡»8^x«ºŽ‰ygŸ>áHô»Ë+˜L7"â%à·Ì®r èrI$ÖžáýUñÇŒ.¯íRáí×NXÖA•áä•<Æ#ƹÍKNÓ"ð§,’Ù¾›®3Z&ò7'gu==k©ñ'‡KÞh-¥YØ]E§GpÿÙˆâL1dõ\sÔTžþ͇P×-ãÒgÑïŸÈžæÉ™L €ñmãŸâàtéSxãû2yô+)ì&ÔîÞæIí¬U•b”ļ™Kqµs‘ïØÖ^iwgã¤i4«=4O¢Mû»GÉp² TôÀ?ZƒÁþðåÇ‚îçžÂ e½ŽôÌìŠXífQ‚sŒcŒwæ£Ñ¡·Õ¥ð–¦‚[H´Yn!ŠL’xÀQx%W$u­eÓt?â%¼¶6ñÅ-Ή;\À"A† w?Ò´þ E¾Õ÷ b‡\Ž„0äV.µ£è—Þ*ð]­Í¬2[¥•üÉ Q´²…Á#§ç§Z›RKâÁ£Ãw©Øé±E$×2”‚Ú'b@E ùcìf¹{–Õ,4߉£ý;ŒØ™–Ç"4 H@<çnw9®â•ᨼV( H­¾Ìl™@;†6ŸqŸ­6íùüqª Hl¤–ßJ´6¿kfùÉÜP(=[ï;V=Ýýµ§Ä™fŸOV—OŒÏmd\ˆ¥~f î=+CÄúFŽ<1àÛ5³‰­¿µtxöÚänüÇ_ZÙÕ⷇ƞ‘QšÏR‹ J…RÓÒ¹Í2}N÷Ãz½þ“o§iZÑ¿”½Ùyf“,ÛÝÆåQžp qô¨ô‹[{¥øEÌbTK–†FRGäj׬|O¨ø Yè1ÚÜKá©Ä’6wýÔ ðXàg°$õÅYü¬ø V_ìK!$aW?d¸IÊãáúîÆz“Îißjñ>—¯xnC¦êBâya²½·VIâcË%†ë´Š¿lþ.£åŸ“þø|Ü{ÍùsøgïˆÞRéúD·D 6-rÁï÷}Ñoâÿgv3Qøúki£ðå½»+êë–Oh€S—aþÈ\æ¬h$ÿÂeãQžzI÷íªÚOsáËé­×uÕ†Ëø?߀îþ@×ú¤Vïÿ $#ßU¹·ÚÝM¿“å¨ÿ¿‹ŸÆ´Ž’,t‡6÷ЦiµÈnîwšUw=}×Gâ"ƒÅÞÎ7ÔñÏ8òkŒãµ²°½»ÀÓm|y}%Ûò¦]‚;{#>•Ý\ë^½ñ‹cQßêKÄñMÖû"må˜ç ?A×5—àQl¾,ª2jLÞÿ¼|“ZÿÈ>ðöGö|@ ®gÆÚ”Þ ×]‚6hõ}"k6Tn¡æ~ ‘QO¦Càù~É~á4ëw ÜÎ~Hîn!Øž€¶à éšÓÔõ ;Ä.ðœZ=ÄWM¦µåÝäÐ0amÐ¥†GÎOLöéYžñ_†´oê—÷ÑC}g>¥¶…‡¼ÈÄ(^¤œŒ`ê>|# AdŽüšçõ}`Ÿë67ž!‡Ã¶öÖÖÎŒ©šíH$·™(aµNFœW%&¡¤ÜxOâ^<çûfÞpnOï^7xð줵»|£Šîþ%ÚÜ5–‰z—[Zéú´3ÝOnx#*Wx\|¤óòœkÝ´cÄ·Šu-~[{}ˆ¹†ÜF8iY#Rg “ž•ßø£ðë¹ÿ eßþ‹5çö9ð¨ð ®™›µWÑRÊ-4)ó¤Ç°a1’¬yÅS:JøgV³mY½Òí'ðþŸj—VòͶR¶°œ¯@y©R.ïFñö¯§Ï¨ÞÀÚ3Ú%õë‚—!‰òÆÅ8Rq“Á$âºm´åð%¹¿ÒßR±û¸·!„x\ºàg)÷¸Áãµs&£zö‹eá_jÖ ¾µºË­¼!HÊ p,sW¼+â½Áz>Öüè5]9ç‡ìâ'f¹ùÉV‹ CÏýj¦¤j:E·Ãho`t¸mfîæXÀ8„Î’0SŽ˜Î½uZêL|gà×XÝ‘`ÕC2ƒµr‹Ç Ïl× ü¥µô%ºÖn|JÒ\!Ñí¼äy!ˆö©B1ó3{š³á£ö•øU² ɰµÆäaäȰà†ÈÑxcGþÑÓkÀ(ük´ñœ¾ ‡Ãº¤š¹ÔV!åy`pÜP Î=ëË5•Ð.ì¬o4};^Ôî­/ìînîîÅÁhù_±èDhqÏJé>"iÚÍåî‘u£[K,zå«h·ÅQ³32°vÈÚ7:ÐþÕÏŽâ²[W_­ÄZç˜ìóã‹Ê ž™ÎÍi`k â{föØ´'J‚ÑekvMƒ˜8=*ä>°µ }šy= ÎQ[æ3T‚Y9Ï5I<«ÚO~šwˆn-4ËÛ©nd¶Xк4‡.B ŸcŠdû?‡$ðâj²˜£¼63]öû\8ûÜ瓎µn÷š”òYêšÔ¶ºÔ6‚Ökµ‰ ܯ_ž3Ç‘‚1š“NðnoiªÃ¨Ï&£s«Œ_ÜM€Ò `*ªÿ=k.çáåÖ£dtÍOÄ—÷6•ûöN8ÇñÍkê:}ž«esav¥ ¸ŒÆàCëéYšw„´M5ôÉÏ4úlw[Ë<¬Ìb7“ÏL8)5hZÕäZ„ÿh†ñ#òŒÖ³Õ)‚ ÔPZÚ[ð¤AŽ[b“¬ØÉ©éz•„n#{»9àW=ȤøTz–4/K°¤“YÙAlÒ(Æï-@ãÚ´]E*êOPG€ª((t¥¦ª"gj…Ï'—àã§JZ(¢©êvúÕ¤°é÷Ÿc¹m»'Øn?) Ž*¯‡4+éÑØE+Îþd³O<˜ß4²1ffÇrkZŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š*Õtã©>$?n[Uº1í8òËmÎq޾ù«´U+ýWOÓe°†éʽõȶ€'sN§v©éº•¦« Ïl$“K ó”î°x g¥\ª:>¯a®ØC¨Ù6ó\~F*x>â¯QEQEQEKU½ŸN²šê9¯$n ƒß$2@ã¯Z»QÜO´\IŸ.(ÚFÀç 2j-:þ×T²µ¿¶,`º…&Œ° ía‘jÍ! ~U™áÍe|C¤Új‚¸ó?vÄ»X¯Qô­J+}böÅuÛ›ûŠÇNŒK¨êÍr¡76Œx<Ô'‰†šrñkr…Ž @Æ\0yíÔ}kr9a—>\ŠûNÒ)õwV’ÈñG4o"}äV¨¤šêÎÙ$’yã#»;>¹¥[›V%YÇ&68a†ÏLt’ÃS,Š˜"î e@=Í+¼q+<Œe™ŽõXjº9º"öÜݰȃÌ]äc?w9ý)×ºŽ—¦F%¿»†Ú2v†™ÕA>™$P5 5­¾Ú.¡6¸ÏœlÇûÙÇëX¾!ñ¦ƒ Ú\Î.mî.-åŠ9-ÖU7ž=: Þµº´½†;›I’x$I#`U‡±U=C_ðî“$Pê:•­¬²ýÄšERß@H¬¿xª èÆúÞ[Vº˜Æ¶‹3ás[ŽJ¨98üë[E¹šóM³¹–êÚêIb ÓÚ©tå¸üMch>"ÔfÖuok)wö§í­!n-˜à0žTðÜõ¨ôŸ\êwúÕóKo†tìۥĜfCó¶âvì^9=ë[HñG…õö‘4NÞíãu‰Á`=q×ý*íž¡§ê ,–wΑM$È!]N;ŽõLø›Âëim~Ú¥²ÙÜÈñÃ38ì¹È¦FåVt½SLÖ­"¿Ó®âÖRÁ%N´qøŠåïõ¿ëºÍö…á©`´‹M‹íBtÞVG d@êIÅ%•ÿt-jÃLÖŠêÚv¡½"¿·„£Á"ŒâU]Ë´ö"Žy–84ÉexÜG'ÍoÎÙ^ ç޵XÔ|gáýKLÔ$Ñõä¶6­hd½XZHÓÌpä`–èpN3Î1Pj^4‡Cñ…Æ©^l°:4ÛÀ±–y&iAbp:s[þ6ðΕ}¬Çyþ‰bÚ²Ž$„ú2¸ø hêZÖ•¤XiÞÍåÚn…w€O2°Uày$v®hxé?á6—Ã- ¿g1²°·—wœ\ƒ–Æß/ÅŒgøªÞ•âM"ËA¹Õu dÝZÁ{s\ÉÆÈ¨@€d~QÍYÒ¼c¡ê·‰§…¹µ½’#4PÝÂñ´¨;¦àÇpGqU%ø‡á…–þÞÙ//.4ùå‚ê+hÚ3ÃŒzsÏ`qWdñ—†Fµ×’äËevÊ–ÞZ1yŽ*cv쎘úÓt_èúÕôÚX†êÏQŠ9¶¼ˆÆí8ܹàŒñÁ®‚Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÕ÷ú(¢Š(¢Š(¢Š(¢Š+ñ]Æ¿ X&yo§ÛI9ûmôûO’€pX€YñéX~ñ=ÕÆµ¥C­Á­Y¦–×qÜ¢ häVÚP”ùO¯AŠÎ±¸ø¨xHxžO,71ÙÉu o—"G“ûÌäå€þ g¥m\jÚ´+L»:oŸ¤Ç©ÞΊ¬ê¯€¨›²'9$WÐíuË/Ý[êWÆø.„¾DìŠ®Éæ¿·vsÈŒq[>3Ô5"ÎÃR¶£‚ÛQ·7ªð1ÚÀäqÔ1Y)â-_þ‡´iÉÑ =’®h¹HĤçÎܽjÁ½ºñ³¥øgQ˜¹¿ñLb!`ê˜ÂŒŒþuÒFº×‡¼I Ø>­siªÃv’¥ÈBVHT0u*«Œô#§µeCâ?M¦Ãcîu-KÄw–\²ƒäBŒI!q‚UFèl4?éµ´jó_i2Å"ÝÅzÀÉã*Ñ£©à‚@Årе›Ÿ IuëÛ6/$´†ØªÇÇcóŒÙ<œžœW¡ørþãTÑ4›ûŒy×6PË&Þ›™Fqíšä|Iyký»uoªø–æÚ‚?±Øi…üá•;šPˆÍ’~èéY‹®øŽëÂ24:Ìwpø‰l ¹•@—fðÍ\yÃ=ëWÄÍáˆ4µ›âÚ¥ÜÏszÀÉ:¢(Ü# §nNÂü¹&£Ñµ5´ñg¥_jw–i2]G{¤BȹWWtÏB3Šíµ™f‡L¿’+¨í$[iJ\K÷"8á›Øu¯-–úÒÂ×OÔ´}SZ»¼[»Aqw(›ì× Ç ‘ Ùµ³°pqÍløªKˆµÛ–×ãÕÿ±<ˆM”ºkH#‰€ùÌ¢"vzg#©’É­^xONm+V¹Ö­SQÅÜÖ¿%Ô– Ÿ“9 ½xÝ÷XÓ4gCÒ›Y¹Òµ+åû.•4òhúˆººrL„¶;óWcð¼Òè[}bôkeößµ‰˜*¹]ÀyyÙ°tÆÞ”–÷w~4Ôtk;¹¥‚ÄhPjw0BÅ<ùe8Aؼñž{Ô)ѵ/ øwÅMi©Ìl%[I-!.þe©Þí}ÙÚ{ñ«¾/þĹլmµ)¯oQlÝ×H²G%ØœyŽPŽà#ž•£[ÇwoãÍk[È4ËXm¦µ´¹—‹tlÜä…$ï¨ê*Êi>ð…¬75§Ž{õ³,e”÷2¦X`7ÚF8«z26Ÿ¯émáýWÓì%2ǨÇr¤BË´•™Ûæ¸ÆEYÐöXû×Ck hzϼS6£iÇÙlôЉ 2êÜ•<ã9ÆN+1|9oy¦øÿA°ËŠÏRK»Ó¤R„òÙaÛÖ´!Ô ñƵá5½•€ÖîW²Ì~D_ª¶Oá]/ŽvÂ+â êFpH=Ë\¦¡áO Zx.­­¡†æÛLŠò ÔÎYUC›$ûÒÝy:¦½ © ¶±­[èö©t·2"ÚÚy£wƒìzáO•`´RÛøwâeµÅµµ¯—}†ÚØ“ e‚Œªçßåö®—Æ~ðæ‘àÉ ´°†5‰­0Áq%Ô$Œ’GRz× 0[FÁÇ * T{\W‚tý;R"Ô5 x®5 õ›Ë{†•A*‘œ,|º0+–žÞÝ|­Û"+XÚx¡ °Ü2:ð¾ÀäW°"GªF¡QF¨ÀÁüW°c£&±g;Zêv2yp\G÷‚Oò2ýsøS|K¤ézwü Ú ˆ ê‚9‘¾ëº£4aýw?'9É«^.·¶ƒ]ðLÖqÔŽªb02mü¶óAÿd } ?À3Á›â$+Ãâ TÈO@ç'ð®3Mµ²Ô¼5ðÖ ˆÖX$×åfVki ö¯eUTTQЂ¸_Ï™âOh·„Gwq©JßwheQÊúí#¶µ%†µ£hV-ÝíüŒÓ |xs#  Î3ëY¿VÓìËË´ß¶³~5ØÝ¸9Àom¸ÇµpþEµÖ Æ‘†Ògø†œd|†Ù¤l?ºNq]NJщü긾½P@Ú`9aLÃû3âìLFÿ>é¶“ÎÕqÅYñ\6Öß m£D¶ºIP£Œy‘Õƒq¦CñM’æD[‰|3ÛnÆIó˜°_|~•ƒã4Žòïâ$Úi ‘xjÚ;³ ̬Ì3âTûV§ÄcH> ².âi/çÓE¨V¼Û"1#ØZh‚‰’Ç$Š7…á†8,EÃp=kŠÓä¶´°ð¥åù ¥ÛxËSûC¸’3È"f>»ž™®ËÅ·vZŽ·à» kôÕ…á10&+xÐù„㢶@÷4ÿ‡)Ÿ2¸ø·RÜGS÷z×%¦§‡ŸÁšTZ­äöþ[±e}Ùg¾Öbx y‚9ük{BÔõ˜l{WhÆ=y†¾ ÖSK"ˆcÕ­uËRÊC“ÞÇ ýN:{Ö†›cãmCU·ÔuÙ!³·³ŽE†ÎÎWe•Ü`´„„ÈÚ£¤ø]4[™c{¡Ò—\í̬Äv¼ñZ>Ó®4KÓî ´Ö¶‘E!Lí,£Ç€º‹ô­_YºÑe°6Ú¬ÑÎït̉ÀÁÆß¼;€HÅT´ð_‰b²»ÓîoíçV×`Ô㜩ãpi¨à>\q]ˆô;½TXÝi÷+m©iÓ™í¤uÊŒ28뵇\Õm/Kñ„ÚœZž½¨B«-VV;Ä%›«¹c–>ƒ£â-¤{U]Áº†™¬\Üë2^ëZ,wK,`?˜27+)(€6œqϯõÑmô»­iÞæÂáfÓ.ã‰U­‚ *ã$0Æsž ÕÍ3Âú¢jëÞ±&£qmÇkAQofÚ½XôÉíUO‚µ8êÛN×§³Ñ®žG’Í#BSÌûÂ7<¨?CŽÕ¹áÍ?é6šTs4ËoæbFÞź­Wñ…¬|G.•-įÓîÖpÞA(sØàføSN>%'óíÓìþVÜôßÓ9ÇzQÿµ›KâY$žVôiËÀòÕcÙòŸ×š¥§x)­`С»Õ®/vÓÛ³ª ¦ÍЇ¢Žs×Þ¶/4K{Í[JÕÞi]9.U#\m8wqž1Ƨëš5‡ˆ4Û½.ø1·¹@¬TᔃAõ‘\ÍÏá¨Ãêž!Õ.æ·t’ÒVt_!ÐðÁU“Û.º?A¶Óõ=KUYå’ãPŠÖ9C‘´y€@rsÏôªío£xWûo[žY¶_\E5Ƕª œ~uðÛDK =KU6­lÚ½ô·BêCEcå©¡äœ{ÖÇVVð¾¾±#;:à* %‰Úzɬ-#áÖö *;›½BK(£‚oìéfcpÁSÎçãÚ¶5_iºž¢uXïo¬.ä…a¬å(&Uè`ôìx5Q~øR8µkx¾Ò–Ú¬H—P‰[k2wó“¼ã““ŸÆ·u­O×ôË*ô?Ù®+8a´‚> Š›L°M.ÊÞÉ'šu…6‰n¼þóI¬MGÀÚ¡>¢·¶“\¨[¥´ãKŒ eÀ=qÆF½^—Âþ“HƒBÛ4èZ&H‘ˆÁƒAÏQÏ<÷­Š£«èún»g%†¡’ÚFFe FJG ƒÔQ«èúV»e.Ÿ©@&¶“©$G ‚0Aˆ"³ôox{B¹{Ûdš[¶ËÝK$®©ýÕ.ÍôÅW»ðƒo¯çÔ'³6æA%Äk,‚)ØwxÃ?ŠœÕÛ xjÖ &Ú 0éS´öJ¿t휞¼õ=r+f±õß øgÄËêö1ÜI19ÈtÏ÷YHaùÒh^ðdž„ÃH±HcûÙ2Y߬Ĝ~5[Uð/‚µ»·¾¿ÓRK™,ެêd¦í¬ þ9­Itmhlm䳈Ãc,SZ¦Ü,OÝ*Lv©.´Ý:ö{+«˜Iì¤i-œõ™J’> ÖtÞðÅýî©6› ÞÞÛµµÌ¤É FqÈã¥_¹Ò´›Ë!¦ÜÚÇ-X×Éq•ÂWl U]OÃÖdiµ-2Þâfbóðªrn£ä`Š›KÐô-ÐØi¶Q[Ú±bÑ¢ðź–õ'ß5<mæù: Šy¬¬ø…y ävìy­+ÍBÔ.ìïï,`žîÍ·[Í"ñçå=©é¤èÑÚK`–P-œÆF’ƒc—9lŒ`äòj 'þÐDƒIÓm¬üÏ¿äÆª[ê@«ÐZÚZù¿g…"óeidØ ovêÇIîjììaö(>Ç!fx6.Æ,rI\c“Éâ›§hÚŽ®ºm…½ åü”UÝõÀ«¶–VQù6G[™¶F .XäœSSQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(£ÖŠ(¢Š(¢ŠŠ;‹YžXâ•ám’ªJgÐãÖ‰îmmU^âd‰YÕvc€9î{T´QEQETsOon¡ç‘#RÊ ¹eŽç¹©+:={B—T—EŠò7ÔaÌ’É(¼}ìp:ô'5£EGq¤TÞño‡¼KçÇa3-Õ¾>Ñk2š,ÿyñõ¹EWOÔtýVÝnìf@Îès‚QŠž¾„S/õ8ôù,bk{‰åÈL(XFH'sžËïPéºåŽ«w«YÛ¤‚M2åmæ.¸Іùyä`ûVœºÖ+j±[ž},…¹Š5;ƒg’Æ XÓ¯?´,­o>Ï-¿Ú!I|™×l‘îÃpG~jÍQEQEpzRP@$zZ;×,,5='J˜9¸ÔþÑä•hòWqÜsùpkNŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÓ÷ú(¢Š(¢Š(¢Š(¢¹m_S×o5itm"êí-’{ÛÙSqC!;¹8É$ž;sW<7qâ‡û}¶·nmæQmy]FÃ!¶†lÐô•»\…Ö§ªøÅG}pÒèšÖØm™ÀÅ­È虲™Ï5ñ׺æ£öÿ²økÃñ¼WOÆÛ‹Œ|ÀœˆÇ¦2Þµ¡cã­öêÚÒH/lÍÙ i%Ü,‰pO@Œ{žÀàûV½ž±a}}©éð—óôç‰gܤ È»†~(Óu{ U¯ÒÔ¾ëÇ´›r‘‡@ ÆzŽzÕmsÄšf„öPN“Ow}#%µµºn’M¼±€îI¡ÓÒÛì³Ï§ßÛi÷N‰ ôÑb"\áIçr†ìYGZë+ŠOˆÖ—VóÝéÚ&§yojη2Fˆ{:ýç¸çåÏZÕ»ñ~“ –—ukג걇±¶…y0Û¸ðÄêXŒS4ÿ‹Ù¯,&ÒîíukkSr,¥Ùºd΃9_ÈöÝÔöïV/$hLž!»Õ¡»{dûMÞž°(Ëþ%GvTt'9ô©5+ÿêÞ'mFÕ"±ÓÛF†ñ¥0«È…œ³'op@ÇJî€ NN9>µåºÔÚç€u½?C·3[xšSýœ£lï\áÉÿ`ƒ»ê:V‚XêZ<Ú7´ϲÊÖrꎡ°4„nÁ*+¹Øõ àv5e/¼QáýbMóRmFÞóJºº±¹•eŠX>ò±E AvƧ²Õõy~ÿlIvͨ [Ÿ´mPw„$61·#éj˽½ñާªøSK°ÕÚÎ;ýîoe£1 /̹ “Ødñ^…m ÛÛÁ Jó4qª$Æç c'=øÄü,T¹Òu Z]­¨j·otøù²­€¤õÂö³[Z­·…tÝSþ;©«C¦Ü"bL<ÐÆ70Ù‘»CŠçtÍ'Ææ‹ˆ¥ñÕ¶©woöËh!*-aW‘ üÃÜIϽS¹Ö¼IâkŸ‡ÿbÔ¤ÓW²¾{ÑLj¹Û¸AÎÓÛ9­ >ÛTÓ|Syá†Ö/®tûݯç4ÐH$ØJ>3Ðçœà×#c±¢ü;’ûLծ㼸Õb‚=òec?j)òŒ½üYë]†«kªøm¼)o±}v÷ž#ˆ]K<™2+FÙ\LŒà ÍÑ´ kÅ^;óµ;Ëk(õ }°ÚHcÝ!ˆe™€ÝÀÆì{©}¬ëú~—«i3ê7Í£ø›L¶K°Ø–X'deWaŒ×½uþ6¹¿·›ÂBÖy!xŽÒ)¼¶#z|«zƒÜW3¤èööÄ{¨.ï<Û2Â2÷—µVËÜOÊNqÛºtÚŸˆ¢ðg‡dÔ.a·“ñêwòÅ)Oª¨dûÀIbO­jÚÁ?…¸­-VojºG‚µ)­o5&M=eÕmì_l²»Æ¥X€T²ç9‡ÐÖ¯Ãë­Kf/Q¼0)…ÿ²ï•Ķ$ƒœ ;[°ä î«Ì ÕµOê±&©‹ÃccGm!Åôûˆ61”p9?…khþѼm§¬kžm̳ÞÜCn¾c¨µŽ#µUã$÷5‘«Édž<+y%î¿f¶·—Ì€÷^SíE‘¼Åá3ó|üœdU½ JÇZ¸þÌðþ¡¥h—Z]Ⱥ†á“Ë(Ê2*Èä2íÅCá?øgSðNy~.¡-‡š—¯#™mÈÉ_-³ò…öÀõª°Yé¾(»øg©k±Ïsez·.㙼¨þRzwä}k×ø (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÔ÷ú(¢Š(¢Š(¢Š(¢¼ñô/ê^8×!× Žãε´žÊ ŽcÚÌðJ‘Üf¥ðWØ4OÆ6ÖSªxzÊâÜ ~êÝöfURNç»ÄxåD’6Ž¡•”äzk ÆÖ–—žÖ’åw,vrΧº¼cr}AÉ_ØYXü?ðãEüK ›L¾¾ñ–#7¯'q­_éšž›§éöPÍ}}¨Z!AW \c<('¥;H¾Ó´ÿxÉ/.#·yM„è%`7 ‹†{Áů­5!â{ÛY–ók÷ ÔlNoŠuKˆµý/NŠöÏJ/e<ÃP¸Egá€1Ÿ“Õ³ž;V‹y¦Éâ?Æ5Óª3è…|é<±¸©;•6WØù5v +›ÿ…¶Öö@¼¦C Ép¬€õÜ3Xú¬úV©£AnÞ5¼¿RÃ…¬v¦g-—nÀF:œ‘Œu¯[v"&KmP2zœWàžsÔõÞø‘…s~½³Ñ—ÁZΡ"¦›6‰5šÜ·Ü†Bû†O@p>•ÑÇ}iâX\ir%Ŧ“cr·71òždÄdã8¥øm¨iòé—zlw÷¶:…躇?<[ær»‡¸ªž6Ž=FÕoï®,4ß²Oi%Ü$0Þpp­ëÈÔ>“Ãsk×Z¥–©¨jVÚn"K¨O*µ²î ”S´p7Ö°mî.-5…ø6œ‹¢Ýܼ67› L‹’=[ü¹Áïšèá"Ñt?ërêˆm®ôû&[’–¥Aá˜àxÎ:Vn¥kwâÛoêúT3y£°†Ì…*÷?emîÉœe8äÕk…ð¶°–zež§¯ê·’¢ÉfóH¾Z†ŒÅ“'~ùé] ¦·¦ø7Sñ¶¸ÒAæ¢omn lRe‘* ƒÊ‘ƒœU_j÷Wš®êVY[Ûø†Öì¦ t·F8w\déƒÔTÔz4ìúæ§u¨A£êÖ6²AuhÓ*« ÆÙ ŒŒÜ=ETM=OHñö…c}¸Ée%¬×³Hò_-³oùVC;.O5{ž,´×ôhmt«+Ù¦–òÛÏg}›kƒ‡ÊõÎü…zUyZÁw}gâ­"ÚÖàêVž —UŠ9‚L¢E +‘´–šÓ×5Èüiaƒ¥ØÞ‰o¦…nžxÖ4`ÌX°<`NkÐCô¯/ðwŒ•á«{FÑõ ®•®E ‚hî2ìFAQƒÁÜGNõ{KÐõ}*ûÀ0M 1·ƒT{¶@JDÓ.í¤Ž'Ö´5 ®ü3âKÍbK+›­7S³†9Ú2ïçQÎÖ°<Ô¾†ïW×µ/Ïi5­»YǧÚG:í‘ÑX³³/`O<þ•‹áßkVþ#M>êÕ“EЮ/nôéqòÈnqµGýs©š‡‡5ëÿøMMµ³-Ïö½ý‡™ÂÎ`U8úãÆ›âmgÄ>)±Óì¬|7©@˨ØÍv×1…„p¼ÜòHfoÃ:MŸˆumOUð»ëvZŠC$RC’H$Qµ¡#†ê®ƒÀzSXZß\×FK»ÐÚ H"QòùÄ7NLÓ¼^ÚšËbCMgDq"ÞÀ¨­4oüˆušå´Ï ]Ïcãô­.ãIÓµ †ÎÆå¾ôÀ\&æØ¨ú ~¹sãoøj=×ÃP\"Ú¥Ñã û¶ß7Lç~*ÝÖ£­é~:Ö.,tÉu—f·@è$NNҡʃß<Š­¬ÙksèÞ3ñ¯kö)om!·¶µ,â†#Ár¤®æ'8ãÔÕËÙ|yâ&?É¡5£\Ç7—í,fš0 rXtF3Ö®µ·ˆü+¬j·zn’úž›©ˆeòá‘H&vœ‡* °¡ãÒ³u x§RÐüQu=² cZ¹´‘-Aˆc—j—à$öÍt~:Ó5]SC’-2=ÜW\G`»ü¶ž3õ­½:âöêÎÚ{ËCiq$a¤·,Æ}7á\ðýí¿Ž,®ñ z½ÿŸi ã®Ö#¶töª·ð|Hñ.šÞÔ4¨lRtHo5%YY7ÐÙnÙÆ+zÛGÔ-üW>¤FœtXmçæóBqLWG\׊t=OW¿ð½Í§–#ÓµU¹¸Þpv#åàäþUˆô}yum7ÄzqOykÖ—²¾Áq ò|a‘Ç>µ†…®êÚ¼šïˆ"ŠÕ’ÂK;H_–²œ»»aFãÀÀ¹¬ðÿÄáá‰ü!VǤ¶±êV>lD G·!ˆà’HFk ²ðÞ­µá»ù/#NÐd±œ92Ÿtc•àú}+­®"}ÆÚýý×…d²šËPœÜÍe{½|¹[ï4n ðÝÁJ›Ið®±{¨Í®ø®ky¯žÎK(-­òm⽂ܖnçJχAøa¦ YÝií§¬Mm¡&ÿ>8OÀÚ]G¬ž{=GÁòØÊ‹c Ú][º¾wÈ$Œ*ã·Q“W_C¼oC¯‰Z¦%‰‹ÅÚ@Á½1ŠåÓÀÞ+:&¡áù¯,Í Õa»±ÞOæ0“¶}1ÞºŸhWÔúÑL±fêÑ^¸`NõU`@÷æ°Ï†|w¦kšö±¢êV&=Rx\ÚÝFûT$awnRìû`Šsøy¼?¨éój;µ{ûåÔe¾ ö…`W Ÿ¸¸ zS'𷎵«Í÷ZÕ¬ÐiWñ]}žÒ&Ù.Üä±fÎïN09ëÚÛø[[]cÄ÷Ð.—­ÀEÄN„Ê’„`©Èîr?Æ oêÖÖ>}7TH5ÌZ †‹1O2ºdda² ^Ѽ5ª¦§6»¯_Gy©5¯Ù!X#) ¼dä…±%RM?Bð«hþO µ×šE¥Å¹Ÿn?Ö–çnOLúÕà½ZÖËÃJÖM¶£¢Ù ?5£Ý Âm‡pôÈÃdzÔÖ^Õ´Ñ®ë7º™¹Ö¯,¼¥šXV Åqå²A9åŽzVׇ¶‹¥\“¨›8MÖ@Ì+ód3ž¸¬ÍcÃŒú‰Ö4=P麄¬$ƲG:/Ýܤ™{zqUï±õ‹#®\6¥¬87ºQ¸¯M¨™Wo2jcàM2ÖûÃ÷ú<§O“I‹ìÄF ‹ˆXß‘ßyçš‚÷ÁzȺ¿“Cñ Ú]¦¥1šîÝbGùØaš&8*[¿^y©æð&›¤Ùè÷2é×ZFï±]  Ë¿ïï†ÕïéIaáItù¯õ½WR“SÕžÊKtÑQa‹®ÔEàdõ99®OÀþ ¾Ô¼£Åˆ¯ Òï­ÜZ(CçæTr»•[¸®ÇYðe®¡†ºuìÚ\º6VÒKp¤ª W ÁWOEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢³µ]A×%Ôìa¹ò‰1™æBºzÀÓâÑ´H4ó¥Ee iæ3·U ž ŽœÕ¸a†Ú( …qDŠˆŠ0T`ì)'‚Þêmî#Y!•9†C+ G¡¤KkXà[T‰Ýc¬` ¡@Æ1Óª:w‡|5¤Ë$úv™kk4Ÿ}áUÔO¿Ðô RX§¿Óíîe„b7–5b£Ø‘V൴µó¼)˜æGØ ncÜã½E{¦ézš,wöÜ¢6åYP0ÔdLÒ‘ u³^Ìp‹˜Ôõ ÇûTñE ¤0ƱÅ…DPP:j­‘¢Ûܽä6ñÝ>wL‘¨vÏ«ŸÖ®S#Š—dh¨œüª09¤0[´^KD†,can>(‚ÞÚÖ1¼Ic¢ ÀP[ÄÒ¦žÊ¬ ° Ò$qÆ¡B¨èÀ¥ÀÆ1ÅcÚè³A®jú¬’£Á}miÅŽTÅ»$žœçŽ+d8€($ÉëAõ¥ 4QEQAäY~Ñcðö•m¥Ç3N°˜àÛÜ·Aõ­J(¢Š(¢Š(¬Ø4K}Z÷ZF“íW–ðÁ 'å q޼óÍI¬iVšÞw¦]—÷Q˜ä(pØ>†®GĉýÔP£>‚EQE6I#‰I"(%™ŽÔÒ«+¨e!”Œ‚:Ž+›YžX¢™HX,ª¬ B{Ûñ©h¢Š(¢Š(¢Š(ªv:®™©µâÙ\,Ígrö·sû¹ªŸqš[ýOMÓ±½a71Úû?<’}Õæ­ÑEQEQU¯u ?M%½ åŽg8ÜáGÔž•f` Z(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š+Ä>)Ó¼;6— ÃE›Û´…·Ê«å!2ÿ#ºõ­½cD°Žo/íàŽ` M$Šçû¹<þf íî¢IíäIa‘w#¡Xz‚8¬=sÅš^…¨éV2B¿lgóZIù(áˆ=‰ãµT_XYj~ ƒY½´´±±’Ím¥‘‚—ócÜrIÁç¦1]½þwl/mîb–Ô©a20)Ôç§KNñ?…µyäµÓµK[›ˆÁ-R)`Á8¦kV±›Å¾Kѧ6­j.̾W—¼g÷}7{g>Õ¡ý¡¦ý³û;í1}·Êó¼Ã~ÌãvÞ¸Íaø—ÆZF‰§ê3ÛÝ[M{hé_þZ·!nH$dô«©â*=eïâ[‰Ià·Läç°§é>%ðæ¹òé·©2Ûÿ®†ýå`…f?Ä_‡è!c¬BRR€:†(¥ºn`_ø½ã}?C×42YPCp’½ÓrÈýÞÝ ƒ¸ç=qí]-äW3ÚÜEm9·âeŽ`1±ƒzåôOªhÚ”ºóµ ´Zˆàn |¬£ÒAÓ§4Ý'ÄW:V—¡â»Â—z¤Ï5­šG—‰Êƪ‹¹ˆœ‚k^ÇÅžÔl¯¯íÁî•‘–HBŒüÈ@aÇO—š±u¯hözGöäÓ§ùÏæbv>0v»œúVŠ2º«¯*Àô5Ïßx×Ãv76®óÊÖ…EÓÁ º@O÷ÙAßÓ½gøkÅGáhubøÊs:,»rÒ~ô„UU'°ÀÍki~*Ò5K¯°žÖôÄeX.£dwOï.x#×#¸ª7¾?ðí“\³Ey-¥¬Íä0;C/PXÝð÷«ke?ˆ,ÖBgiqº`‘ ÞnÇÞ瞆¡Ðüo¡xŠUNŽéã»É3DËEOÝv<=qÏ•øƒ )YMµðÓY GÉo³rpþ»sÆvãß×T ¼‚21Þ¸¿xÂêúó_]JÞæ [IžD–hÂ%¼J ìsŸ½Ô÷ã½YÇúK,73XjúlΩôÐâ¸às¸)ã¨×Y\ˆñõ¥ÃÞG§ióÙ\K Ȇ5Ä{Œå™AÎ2äã°§Þ|Aðõ­†‘©$w7j“´¬)—Y?+.AÎ~^‡Ÿnjk¯­¤r¾•xuKÿ3ÈÓ”!›yf;¶Žr_½>1†ïûNÞm6î×T°¶k—±”/™" àÆC`O7Z–Oiiá“â…ŽFµû/ž±q¼·MHÝ»Ž§š¥¦êú\Z¿Š.nEÍ´¶¶V‚iE˜Éù‚9ÝÇ&¹ø×T¹ðž¥pt+ûM>öÛ×›Ð0ÜFÒêr†ìy®ÇRñ,–ÙéZ}„ºŽ©5§Ú<”eUHÇÛ“Àà’{TúˆÆ±5íÕœ¶–Ã=´¤+ýÖV^ ŸoÄS¼EâôìÑ-šêöúåm­mÑ‚ïsÏ,x§Ÿ¥gÚø·RjVz¦‰5•Ý¥Œ—±áâ¨YÀlö#Þ¬ŸÿÅ(pHì+KPñ]ü×ði^°Pº{4¼–Yeòá†)>ææ ä–ìôæ£__Ecâ·i¢ cF´k—µf9”©*ÈûAÚqŽPé\ÿˆ+[ :-6ß%³3™eTm®ÊÜ(ç;rަºMkRñt·V6š ðÛÍjngÔ.Áh㊪ÊK¿x VNŸâ¯ÞZøºÉÂçXÑ#à–ßq†}èX»²Œ¿­XÔÒuŸ‹·‡­¼L¦Æ>Íç‹-óp«ÔïÝò–ÆT`8É5=׋üS¬ßxnÛÃKk:Î÷¬÷JÌ`Áü¤g1ÆOz»&§âí_W¸Ð4«È-†•mnu+ö‹s<Ò.BÆ…°99'®=Ꜿ$ñ¤:wŠ´ækVñ… W1̈|»˜XnÎÍÙ @ Çš¿©x²êïOð¡ÑYVóÄ3Û˜Ë ùpíß+þÊñõ5–£a0Pr²H G#ŠÉy|g­ø»ÄZ5¶°ÖUŒOº(£2†‘3…fV<“•cÓ¬Ý_Äž0Ñ´_éò߉µMìrZß,jHîcrà®áÈ8úUÍlxçÂÚ`ñ<úóÞIla’úÅ£Eш ±áw)\äÍžõnݵßjz»Á«ÜiºV™tl KPæ•TwfVà€Ç­djþ&ñeŸ‡|Of·ÀëZ.§cj—óRfB¥—‘’ ŠU ÀN«Éç®kÒí k[x`i¤£@¦IHÞøîpÏáSQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿ×÷ú(¢Š(¢Š(¢Š(¢Š+ñÝ•ÅÇ…kh¥-¯[BÅÔ£+9ížiš–©xÅSßÛÇ-ÕÄ–é"ƒäÁå‚»è’N)Þ ŠÞËYñާ K·¾·hQ~ärÉeUΚ—ÅPZ˯ø?͵åÂ’Ê2psÛ5[FÓtËŸø¾ê{xåžÓÒ&p ^.qž™ÅsšŠm+ĶV±Ä,ÛÅÑG4LvÄ#}„ƒÂ³`6êk_ÄїípºE„j¶¿e‘Ãç<ÆŸ/;‡àWcâ.áÑuy-3ö”±¸h¶õÞãù¯8¶²×¤ðE¼lºz#éñ³K!—*ûäàùç¿ÍV¼^—é>{9Úo"Àº|gÂ7vì~ìŽNìRZ O†Z‹é¥ÚY ‘¯šN%7;‡™æµŸÓ£â~úçƒ~Ìö¡M½Á·ûPc—hé´›nvóëLhu7ñO›{§ B-äIoh’y’DÝ –$¦zÓt›KHþLô‹¹_ó>äû椷˜ ¯†ìý6àO­ºÿZô à¼W¢éw~.ð¹™Oúhœ\ $,ÂÛà:àúæ®3ÃË^•_;DT°gâ6˜Ä|6àx¯PÓ-þÇacm¹ÛȶŠ<ÉçjócŒú×›_¼wQ|EÐíå ªKt.’×?¼’0¨NÑÔ‚?zÖñ/Š|1«ø^k=.xnîµ(VÖÖÍ2n0S¨Ûß cÛÙÃ%½­´26÷ŽFoR ® Ã^+ð¦‚|Ekª^Åe2k7³æc5KuRz‘Œ`dŽ8æ²ì"—í~»–†=KÅ:…ì8ÁXÞ3·#¶qŸÆº-nþÇþ/´Ö5Vòtû­!ì–åÙ‹&ü1ìîqÒ“KÔ-Ie‘ÁÚ§¸P2q‘\å×öúøÆßÙözËëE¿‡ì؉ÿéWu6ÿX¿ø™afÚ'ÓtÑ#‡!ã'›¥Vñ‡Ž|=«x2úÊÍ&–þkEI,ÄOº¤nßòñ¶¤ñ¾âUÕµmCQÓô»Í"Þº³fUIb')!Ub2W æµ| ›u¨êš½ö•͹†;Xoïä'íO–¬ªv©îzö«þ?:(²±Ö—%Þ˜nÇŸ<%·Ù>YA»ààŒ{×7áÖšöÿR°ðî­©hri7 #_n+íÂ,r:‚xÎG8[þ»aà_øG¢°¿“Z‡KsÚ y7EµpÌÇn6ã‘‚sØUÙµˆ|?âÝ"êîÖvƒþ(£â™ fw2€N20p8Ï4íBâ_?Šõè-fM·ðÍÕ…¼“!CrÇ.Ì €vŒ`sÚ¡µñsÝx>ÏCµÒ/ßX¸Ò#´ŠˆÎèö‡ó1³f9Îï®[,ÞÖ%šîÖæçL½Ò´ø Í´M'•-¢ìÃ*‚ØaÈ8¨ï-õvÛÆ>#K˜¡¹ÐÞÆÂ –iB†,Û>ðÜxQŒŸJØ×4ýBëáì–QÛ»]ÿc@<œ|å‘T•ǯ=jþ›âQ=®‚cÒµ·å¡mð•û1y2ƒ‚ÆÁÍtuÇx³N¿»ñ‚n`µy¡µ½¹iäUȈ,{ëQë±jšŠmüOÅý”úaÓ®¢¶]ÒÂU÷«…ÈÈ=:u¦YZj~&×nµÉ¬§°³‡I“O³K¥IS–r ’è3ֹد¼W‚§ðœ^Ô©„¶Nìª +‚ «–ù²:2Oç^• Ã5¾¤Ã2åŽÆÝU`€~•‡á-;S²ŸÆêÝ¡[½vâ{rqûÄdP`÷ÅbZè:øø_&ŒÖn53g: sÄ™ ®2G½G¯è—¯¬i—:¾…>·£Ç¤EV±2°‚åOÌ^6eS¸`Î1øÕŸéšÆ•â-rYü:4Ë NÚÑí–Ž+±Âãç9χ½eøSD¾Oßinû#Ã76[{5ø ªGûv>µéz®?³¯óÿ>³è&¼ÇÂ:—ÁZV•c ùòÍaåÚßyÈ Xßî´€à¨<€‡8ë]‘á;í[ðÏ“{7ÃÒØK8 ~órŸ»œüØ'¥:ê×Å>ñ©ªéZaÕlu…§‰$D’ a]¹ÈXc¾sW|/¤jë{­ëÚÌ)îªÐ ¶VÜ †©lX䓎+Á¾ Öô}nâ]@¡Òô´¸¶ÐÔ‘ěط=@ÂóŽ)’x+Ä3ZkåZ(ï‡ŠŽ·¥3¶Q¶íÚ A¥Õ­~#øžo4ÚDu¶Ÿ¬ÚÝÝ#\yg’»@G=yo½ªÓèÞ6ÐuMRçËcsa©Ê.^Þí݈ÃeVʶ2Ažõ^ïÀú½Ç‡µ;G¹‚]gTÔmo®å9XƒG"«Á;UW?¥mø×DÔõÝ#ìúd‘%üV×Vælì-ƒ†ÆNÒ¶tó©Ks¨¬Kzcx€“nûIÁÇÖ¬ÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢Š++_ðþâ;E³½iPG2M¹WסVê–£àÍ#P–Þä\^ZÝÃÛ›‹i™d• ó»êF}ëOHÑôÍÑl¬"Ùfv,IgfêÌÇ$“Ü“PkþÒ|I0_‰G‘0š'…Ùw ¤žÏGÓl//¯àFÂ;'w’»W‚}=:Ôkáí cÕa6ÁâÕ&i®ÑÉ"F`àž8±T4¿xcI»Žúe–â+\K$žBž¢0ìØü;WE\Áø{à£v/ ‰âo?ÈóÈó3ÞVí™ÿ€ÖÇö.“ý¨5“uoöe”’v¦s€3žø øoÃÉý¬ÍêÜß('’1’3Œ‘Ô€*ð…HB6Útl]"rÇkg9 Nà~†§Ò<5áÝ .M³H~Ðs3rZN1ó1$ŸÎ¬C¤i0iÃHŠÙOò#.Æ#èj®¡á ê¶–v7ÖKkdPÛÆr{0G­z¯=†Ÿsqku=¼r\Z0HÀŒ¸Ãm=²:Ô:®¢ë mRÎ+¨CnU‘s´úƒÔ¦)tÍ#HÑ­…ž›iµ¸$ìŒ`{ŸSõª àÏÇ%Ô©¢Y+Ý)Yˆ‰~pzƒÇzÛTQ€«:ïÃþ¾»ŠþïM¶žò,lšHÔ²ãÜŠ°ºn˜–ÒY-¬BÖMûá 66ó–ÈéÉëQéÚ6‰¤ ›c¨åü” »ëI>‡ \Ü}®}>Ú[Œ©ó^5-•éÉãµ[6öÆU¸1'œ¨c`n NHÏ\R[ÛÚÚD°ÛD‘D¹Ú‘€däàz®4]›ñan/ ϟ寙Ó{ýjíB-lÄæèA¸dØeÚ7•ôÏ\Sc°Ó¡žK˜­aK‰>üª€3}N3V+ BОÂ;õ¿ÎÓê—W‘`d"È~QÈ뎵¸Bœ3ŽGµ ¨à«(e=AéBª ªG@:Q…ÉlrF ¥¤ 9=ih¢Š+#û ÂEý¿öƒÿ ¿°yãýfýÙÏáŒU½VÇûON¿°ó _j¶–0 ”Þ¤gÔºUŠéš}†ž®d–Ñ@ŒnØ gõnŠ(¢Š(¢Š(¢¢¹‡í0M˜ñù±²oŒá—pÆTö#µføúo‡-æ‚Ѧ•î'iî'¸rÒÌä–cì1Úµ&†;ˆ¥†NRDdlzƒU4}*ËCÓ¬ô»=ßf´…byË`zŸZ½E&ŠLŒã<õÅ-QETƒKÓm¯o5`T¼½X–âQœÈ".~™¥Ô´Ý;W´šÃPgµ˜$mÑ€9çñ« 0)h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÑ÷ú(¢Š(¢Š(¢Š(¢Š++_×mô X®$·šæIî#¶‚/$Ð •™£o$“C ²DлƬѶ7!#¡Á##Øš’ŠÆÕõöÓotí6ÞÆ[Ë»ï1•P¨THñ¹˜±¼c9­š(¢ŠÄñ¿q¤I§ZÚYËËùž8£Þ@A–,ÄƒØæ¶ ˆLŒÇŠ©¬x¯Âú ±Á©ßÇ Î»Ö>YöúíPN=ñŠÍñ7Š“[Ðn ˜­Ö9GÌ„4Xqß·±«Vú®¦þ-¾Ò“ì1épÜF¸ùƒ— œúWC\Ϋ«j–Þ+ðÖ›  Y^Ã|×í±r§=F¥/µ]KEðÝþ¡§Î º‰ Ù!PÀnp#¥MªøÏº%ר/ï ^ùQȰ";;‡$ ªªI9ðK£¿ÚfÔ£ò¿Ñà…Ù˜8ÎF0^x§êž1Ò´Û¹,#¶¼¾¹…U®Ê“É 27‘À$vÎ}ªVñw††Š5õºß§žUbåó›1»vxÆ3š¡oñD–öÇNžÏP³¼½—ˆ+˜ ’?½œ‘ŽÝsÈâ¶´­nÃX}J;a m>úK)·®>tœzŽkÿĺ>§i¥]Cs}mñVCÉ4’+¶@å›wÇ8«2øãKÌú µ•õÕý¼ðÅ8†,¤k ;6@ 3ëž—¾6¶‚îêÖÇJÔ5!fÅn¦³Lq0ê¹f\°î1©î¼iáë}"ÇY…了ýÖ+8 RešFÏÊ«Ç#9Æ1Ís²xª÷Qñ…4ç´Ô4É¿yín0Tò¾VÊ3+`^¥oøþiàðž½4I©dìe#Ђüë"Ûâ,QYX_Þ躌<ë JUMƒvfPåÂÜ­tV>"´½Öµ] É’+› ›sãlÉ(ûÉ‚NàäiÚ&¿¹.ª°A"Cazöžkcl¬Ÿx® à9ªzߊΛ©[èº~6£ªÏl×BÙUR%8ÜîÄ àpyªöž8†m?Ä7ZmÅ¥îƒIyg!RØØ\m`vÀpr*ø‡sö }u¼=x𑤒^3G¾4oã1d±Qê;sŒU½KÆÒÛkqèv‘6¡u6ž—°¼n‹Vb>fcÀ냜ô¬½gÄÿÛ>ñŽ›ye.«iúl¯=³8'c©*èëÁSíŒ*î‘s`5½-ä7ád“í&C´ eÊ”éœóšŽOê²Ø\ëzo‡¦»ÑmÙÏÚ<ÕY%HãÁÊŒ2ÀŸJ½{âÛé.4û/éO¨M{`·âI_ʆ8›¦æ*Çqô Mcë#›]𷎬/ì †¡¦ióÇsðë‰",¬®1G°ÅGaã?éÞÓµ›¯íÐâ³·2H'ácÚ™åmÆ;ã~qÚ´!¼°‡Æš¦ Î¸ðÌ/mØçòæ¡>4ñˆÓÛÄ'Ñ Gö€ ÇúW‘×ÌòöméÎ<Ìâ»{[˜/-ືCË Jþ\LÁsŒœãŸNœšæìMñ‘Õµ}\½ÔnžgŽêØ6ÈbC‰a?ÝëÉ«WZ®»{káM#_±Ô¥3[\˨[Û¨\yMµ7á—å?y°Þ•±áÛK;Ä‘®“¥j:5ͤ¿jŠãRÊUÔb èqŠô á¼[¡èº‰¼,÷v‹)¸7PÌN~dDÜ óØœÔZ>…¢øº÷_Ô5ÛqxÖÚ¤öÐÊIKxàÀW8 z“×Þ°õô WF7µ¥‡Š`³µ“q/d© ó˜Éàç°¯KÒ4m#B¶û&›n „¹‘€$–cÔ’rI>æ¹ vûÄòçK¹×omlâŒÛÙì÷äî%ÈÜuÆãŽÕ?襵_Ùµ¯Ø£ƒU>]¢¸e€2)Ú¤q§§øßIÑïµ =Ýœ34º‚[Èd@KÇ‚vœŽW<â²nEÕߊµ¥]]4Ø­-í¢’HÖ;ttÜJ«ç–=ñÐc50ñáÿ–COµ’òÔ[Ú¥Â1€N@”¿p7n3š›UÓ5X-ì^ÃÂ6š<öwVíoz.¡]¸`6±d“ŸzõZäü|ÎöZU‹dZjÅ¥¥Ù‰É$èØÇéÞªø»JÒ4ÄÐotëX­¯­õk8mŒ*²ÈØd8tŒæ™á½#H¸ñO‹µ ­b’êÛtŽFPJaÊäp}Ç¥lxèámt >Å'¥s~$Ñ´]7À¶¦ÎÊ(šÛû>hZ5•˧Ì]ÜõÍièöÖ·¾1ñMÅê,·V‰e°q“,„¹þñÎqY3[ZÛ·Ä«kHÔX-œslYÚ&/Ð>õÙøecŒQB†Óí˜íä ®jáéújªØÙ…Æ>ÏNr 6§uâ-v_éöqÍ·‚ööõÜ™ Žzòô=k”—ð„x´É<3øI2Ä™*2Üzr~µÜ[Èù¨ž˜ÐàüxkªI#•CÆÁÐô*r q^+¹·Ó•bÑ-4 _kÒµàÑâ¾Ôe¸–õP3U>$ÙØê–w yüCmƒü@«qøô¦ëÚ6¡k>¾Ñ­"´»›RR-º…@èK‡ ŒŒô¬ß iZm†—âÝzÚÒ'ÕcÔusÅAdòó´/§¾1œÕ½'Âþ»ð<ÞÚA3Ýi_j¹»‘A”È빜¿\ƒïÅPó® Ó|㟚kt†Òúf3Ar6†cìpßWÖbMcÃÿÍ¢è6tVñIÙ¼`an ÈÈ6qÎî}kÕ¬þÑö[o´2´þJy…>élsl×ñ_NÆÇUµ¸’Öþ9þÄ'‹©Šàe>ÝÇ¡©µ+L³Ö<¡˜Thð› ‘7ÜibŒy{³Ôõ#=MY×b´ƒÆ~’Ò5Ké’ú9Ê ·TÏÏŽÁ±Œ÷¤ð5ŵ¿†µ)fuD·¿Ô̤ô]®IÏá\®›imu§ü-·¹&…¯ï•¹(v_È^¾€+ƒð<öÚ^·ãܸKæÖ%Ô¢W82ÅpsÔ `ã¥lê>*þ!Ò|;cn·w7BInÈ|}–y¸<“À—ðÕ¬‡‡.Zà ¼þÑÔ¨[y»~}±×µr6Öóè~GMÖxÂG´ºy%¤)øwÕÚxþ/È6†Îª¾äEró¼mᯊ0—ÿ¶oÎÒy„ý+cÆÑ[[ø/H‰$1]èÁBôP$N”ëK½&×âfµ̱¥ÝÆf-· IuïÐþÎø¬-ã|I¾°pöii¥Ç3GÊ™á}ÏÈÏ(¸Ý[ßu½M7ñE{Ëy®iFº«†,1ž1W,®­aø®A,Ê’Í¢XyHÍ‚øwÎ|W¢Kkc§ü4Ô¯&—m©jÌì~DšRâ6lôç#=‰®·_»°Õ|[àË]6tšîÎâêîá¢`|˜ EHlgÉg­MðÛcéºã›ÄZ®ò;Ÿ0×£§‡›Á T½¹Ó¥þкû£ P-¦I€å²0ã#Aö®—Ã:¶¯ÿ \šMÆ©e®B4£?Û XðnP•Ãu*ïÞ; ëyþÍÓµ…{³ü1‰•doeb?:©â=_Iñ&¯á;C»†öâ ^=Fy-Ü0‚”î,T7g'š¹ð÷Ë2xÏo'þ½@zôZ>ÿ„z`¤àjÚç·ïš³¼O­IŠN›y®Gáû¥¬Év1-É,r¢I( ×g½sn£¤:üT‚ BæçÎÑÒh%¼'̸!egPBåà¸é]GŠY¦a¿Ø¶'ðù+Ð 9†#ê‹üªJ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÖ÷ú(¢Š(¢Š(¢Š(¢Š+Ä:^¥¨]øzkP†;-Mn.7qÁÉçÚ¹û]'Æ&£­-"Êõõ ùn¢Ôf—i_Yic³ ÚqJ~á}xøGVðÖ±>k¤‚xß"o0–W#.ôç¥S¹ðOŠ.<%ž%ñÛf»–mçii÷+üÁ¸ßÝí]ý…œu¥”[A)ôA\Ýîâ½'X½Õ4(m¯ ÔV/´ÛO!B’F0X+ ŒŒU;Ÿë·Ú/ˆþÓ4ZÖü²øÝäıãbŒ£<ã’zWm”òU@?…ršÞ‹â8üAˆth¬î¤6"ÊXnÙ—` [z0 ƒÏ#úÖcøk\YüMyâ[Û6Òõm,-Ü‘nSkå¡·ªrH9íY'ÅËá­îõ>}8Á v³[£y×¹ F§-·æã;sšíí´[ä×íõvté¢-‘þfðÙôÆ*­ö‰âk V÷UðäÖŸñ0X¾×oxixÆÐèËÈ8À#âáMBÿEÔ,5½MîoogûGœƒ lêAA’p¨@<ž{õ¦G¤|@¿šÒ-_U¶ŠÎÚd•Í€t–ëg@äœ*žásž”étiú•ýÎ{i¦£'<7Q³¥#Ы 猃ùÕ¯øz÷Öº„w¿l–ëQšïÍÛ´áG#'ž9ÇåMñ&…­j7Ú&§¤]Áow¦É6~Ð…‘Òe¸N}9ªÒøwÄú}íüþÔíííµ ŒóAu q¤až2®Ÿ{¸9­hphMl²´óM<—73¸¦–C–bÃÐ ch’7ˆ£×Dà*iobaÛÉ&@Û·g·Lcñ¨ô_>“áõÐÚäJÂ+ˆüà˜ÿZÌ~îOLúÕÍMmJÓôÖ—ÎkKhá2cöŒgãó¬ík–Úί¢êÍ9´ç,È|àeäc 3ÐÑeáKk?ê>#YË5ä ‘·„o”3ž­´v«z&ˆ4yu‰~ÐÓhê2^à¨^åhÇ\c­cKàbþ:jR$Ëzo!º2æo.p@éÖ´-ü9:ß&¥w¨=Å×ö8Ó¥;CÛ‹àt>Ý*K_EmáÏøGE˲}†KS>ïœ[;×/â èRøzÖëS¼Òn¬ôÿ³Úê¨FÉÇ!`ÉÎ3†_¡¦ø"ÒÖçÄ:®­§Þ\êaKy5 Ž·3—ÉÙ®Ô•@®«ÂvºÕ–m¯<³Þ+ÎKÌÀɰ¹(Ž2ÅmG­chþÓ´h%ÞêЬêæ|ë+AÀ¾:V4-ŒQX]kZÖ )O•×ËÚ½˜(vQè_ëšÓ×<)m¬]Úê0ß]i×öÑ4 =£(fŽJ°e`FyqG‡ü!¥øvïP¾¶¸ºžæý!\È\¹8<ާ?O@++â.š5eðÍ“Å,–òë°,þNàÊ…æÜ¼ŒuÎF=kKLðm†Ÿ¨Eª\_^êpDÑ[½ä›¼•n»@dô'­hhº†…ͽ«Héqw=Óù­“ºS’N=+¾è¼+y¨&™$…ßMIØ[œ‘·®Òz€@®RÒ4íWM¸Òn#Ťðù%S«Ûo¦;U6ð¶†Úð×–ãMû8·Ú†Ú9Îî¹Ï9¦k^Ñuϱ¼­=µÍš”·¹µ¤¨¤`ñô9¦èþ ðÖ‡qwwg›‹ÈV+™%vs0œ¶ârNy5F/‡>Šxd+s%¬‰`²’gkx˜t+8ã°ä{W[T5}L×m…ž¡’*K€Ì¿2ŽA“YÑ4Z-NÜMààd‚¬: ‚õUMÂ~Ð%šæÊêd÷ÈòJTvÜåŽ=©Ü|>ðMÕõÅüÖ¤¹K<~cùR¿÷š=Û ú­hAáÛ&•6WJy$³›÷Là†=yÎO\Ö½ck¾ð·‰|“«éñܼ?ê¤9ŸFR?~…០øj)"Ò,c¶œÈÃ%œÿ´Ä’Tµø#V½}BûJŠ[™0dl°cûêñµæÒt›b²ÚÆËa*Íj1ÄL €TvÀø¬ºG*4r(da†V{Õ{-3IÓUÖÂÎ es–¢¨cï€*tŠ·yh©½‹¶ÑŒ“ÔŸzXãŠ%Û*.IÂŒ žOçQÜZY]„0G0à‘AÚøÏzy†w×vÍ™ÀÎßO¥8ªÚTÆ1Ú–Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šÿ×÷ú(¢Š(¢Š(¢Š(¢Š) P@$z{Ь¬R=Å"º>v°;NCQÜÝYÙDÓ]O1/W‘€Qøœ [{«KÈÖkY£š&èñ°*R$œÉ4ÖšˆÌÒ(ˆ.âä zæªÙk:¤Ì–…µË',!‘X® ©&Ô4Ûs(žêÌ*¯ w`c€NOž™« ©"²:†Vzk¶°øI¥_5Å¿ö\ÈÙb~éÇ » G|]eµÕ¥äK=¬ÑÍ }×Sô#"£:†š·‹§›¨…ëGæˆ 0§®Üç…Isskg —S$0Æ»žG *rk/Lñwƒõ™Í¶›¬Z\Î<¸äRÇè3ZoyeÄVì‘0e?B*ÅU‹RÓf½¸Ó£¸F¼¶D’XAù‘_¡#ÐÓVÒŸP“J[”7ñÃç´Ä8ÏëJú¦™ðÓZu†ØÜù\ç˾™¬Ë¯øBÎÚÊò]AMµê»[É;¬6«tªqüIðĬZ™v ´…†^¾Ÿs­nÁ«éw7÷z\Sn¼´Ž9&iùDƒ+Î1ϱ4·º¶™§Ocou6Éo¦òm×ïlgÇK\ñg†¼:ÐÅ©]„¸˜¬Ò?ÑTúS4oøg]¸{;;†[ÄMío%†Ây#¼•"Žß*$Ë1^NJöõ¢_øñ¬~wrípôúԺϋn4Ù¬4ÛM*[ínîÛíbÔ”u/!à ðMC§xÎóûRÓFñ.“yz®mȲE1A’¡×ls‚?ë•Af ($ö®*?kúÃÎþðì—öÊñ ¹¦H’VCƒå‚ #Û³Z3øïñørÂÏqksµ-¢ŒfIec´F÷³~•Aõ¿ŠÑB×çÃVoÞûÜŸ´úìØO°4ºŸÄWÂ_ð“èö¿jo:M¬¤«+»…(Ø w}+ ðæ½gâ=.ßR· ‚“BßzW‡F÷SÇJä¤ñþ²þÑuÛkKay©ê‹b±HÍå®éÈç·¥]Եω¶“RÔtÍ>öÆ/r–2H&DX\£"¯jþ+û,~¸Ó’;‹mnþÚ#6Ç(ÈaÇ_®+/ÅúçÄ XjšÄi¤IajÁ£Vó¼ÂŒáFîq‘žq[Z\ž;§ÖL6¢Ýœ-ªË¿wQËc׊Ȱø‚§Á6>*¿µÿH»ÌpÚÁœË+9DEÎOÍ|R ~5˼h°±Å“y¥€þénÇ Æj+¿ˆSx3U×ôûUƒUÓåÓÚ\DSUelÈçŽEtñx‹N2ÜAömFÖfµ¿¶=a™:¡ê¾Æ¹§ñö¯‡MóAo.§u¯M¤Y.JÅ¿Ì*†C’pç}³Rj7?|9juk‹‹ ZÞ&Fº³‚I Áò›sdŽ¿2×wÉq S `²Æ® g{×w¯x·ÄZ®£¤xUí­-t×^j7_÷ØÉH¯rN=½b›\ñŸƒïôøüG=¾££_\%¨¾†?.Ky_îù‹’»O¨Æ?›ï¯¼e¨øÂ÷BÓuXì--´¸n²`glu$Vx¶ÒçÍÔõå¾·òÊù+l‘üÝŽàÄñZ:®£o¤i÷ºÇú›Ky&RgÜ×!ðïľ'ÕZþÃΉ¨¤V×Ð*¨‚uÈÿdðj¯ˆ|câ ÅÏÛ'‡­,me¿]¿<"feóêB3íÚºj÷Ö áÙ4ù€KÝnÊÚVñIœã9ëê*¬šÎ±¡ø²=?SœÍ¤kKÿé ¨û<è>h‰d0ås“Ú–ÃWÕõÿ]Ça9BÑÃ[Ü«þ“rz¨$µ;àŽ}jˆZž§£ø_S¿Ó§0]EälJî‘Aà‚:J«®ø‡Wºž?xk«Ë5ÕÙÇ`Œ>óv.…ÇS^½Öô<e òý«VŽÒîYU7N¥I9Àtìcê^*ñ‰âÝ^ââ7ÃVBÆ+¨vŒÛ …âP@ɇ͒x=8®‹Äú•õµï„VÊè¤7ºÂÃ0\,f'lgŽ;b²¬cÖ5Ïø²ÚMröÞßOžÉ`‚T<`ž¨O'Þ¬Ø]ø‡ÃÞ ³ÐõMDê6œ=•Ĩ«,rE‚ÈÅ@R9×gYúε§hV¢êñŸ"Åq©i%v訣’MPÒü[¦ê7ÃL–ÚîÂùâ2Å ä{ ¨:”9 ã¿9•ÉêÞ.¸Ñü%&¡£I¨^HÚ»Áö‰Ñ]¢ÿH ÊÀ‘ò‘•Nn•f÷Å·~*ÓÌ–Ú—w¡¹‹MTË´¢n¥AÚÑÔ°w®—DñM–°×ÐKmqaw`®mî†EaÙ ÊWŽ ÖYø‰§ª}¹´Dh¼í3òvžÛö{ìÅZÖ|m§i¶’–Ww×·Vj·KT $Æ2X듎õÒBï,QHñ´lè¬Q±•$t8ÈÈö&ŸEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢Š+ ]Ò'Ôu/ ÝF›“OÔ%šS6«BëŸ~HV~˜§Àþ ÿJ@¯§ÛÎû2æf%FG÷‰ñ®sÀÚ]ïƒu›;;ÂIñš.¦cÚö<³ÅO㊊~Ëkâõ½ñ6•q¡‹$KHŒ°ÛËŸœº ò}H<~–ü9‚/¼E­á-NÞÝE´‘ê|JTÎ?Џ*{ì9éšìõ°IÕŒƒepÿ€ók›;¹¼à¹M—QÒmvIcÞ‘GÝ;xÜöïÅ>â…Úüú|:l©áývÚî'·g·0È<¡È@w1¸þ5ÑxƒÂ7º­Þ¿™6§àÛ­b-KÃWWÉuy5ÈÔl‘di•×!—¥lxþ g×o|?u&Û«˜ÞæÅ×gÙeƒ„*¬ wÎzqÒ»*ä5%o´;áÂj–W|ž›£ýâþ'®rݤU·ñ©cåÝø†m=Žx6¬HO°uñ®‡ICâ/ê„îKt‹LƒŽ›3ÿãÆ¥økÏ„t÷géÿ] øzÛ¿á-öñEøý³ÞûY²ñ·ˆ•¥ BW³²óWÎXö8ûÀç5³¨ø’ó]ðxÕ41aÕký¡_'o¢Z^··¼ÔüY¬Ü(“P:ÌöBB9Ž(@Ú£ÐsÎ:ÒüI··ŠÃNÖÔ4ýFÙ­d{,Ø+ÇfE-‘añWàèvçð:Žù»ðxÿ©‚ÚñãKÓ¦µcÓýêì+’ñ®,fðö¸86¤qÊÝ„W#çô®[ÄV³jsø§Åó&ƒ}d¶gÚÈï˜fÜGá]Œ¶ú禽‰¼Ë}/F#=·Ýùðç\±¬xc]ÞÜ^4z‰• Ò±°YÊÊʤ|ïï]g‹õ˜5ÿ†7Zº` ›;iXuÄ‹¸~ ÅYÖ5ïˆÉ¢ÞË…âG[I7HØO;@\àvȬ=q,ìþèŸÙ.n!Il^6q´ÈKääsŒ¶}qïZ¾,Ö>$Å¢êFMÒ;Slëq,w&GŽ6vT)HýñOñ©§h?íF”òK)|9¢5™c Œzªá³îsïXæ9~%è©mþº é¯ÿžlÀ oø"±| LÔ‘{¦Ãký¯}µn ‘Üü䬈1éÇçZ¿MðÖ££M Ãg/‹õy¯fµK94X–ßíÊíhü³aRqŽõØiÖÑÙxÓK´Û 0xA#_3–%’8Ï­wTQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(®?Æú}Þ¿6‡ ,µÕçŸ*‚b„nÚXt,q¥PñW„"Ó¬mõmÞâ]SJºŠæüÙ¥PÃza˜õÊ®jZ§‹´=dêb»Ô´ ËXÿÑíÑLÖr¯_—†!»òp};Ô‚=GÄþ'Ñu¨´IôÛM5n<Û‹µTš1p($àuæ»=N)gÓwI%´¨«êJœ âà´ñÆ—áÏ \i¹¸Ó×ý7Lb Ïué¹zŽGôªþ!Ÿ]ñå€Ñmü5wf&–?6òü"‹`%e‹Ãz0uÀ¥¯<Ð.¼SáÉ5ëfð½õÊ\kW—pË mdr1ҩ힔˽7Æ“ÿÂGâôÏ#R¿°‹N³³Iº¡nd‘²#9'V­¿Ã¦¤º=£Ü‹QÝykæÛ‚û±œçšÎ·Ò¾"GáÍÂ|­cD¸dkf—÷w°'ÊÆJãJ]q¼wâý>] ü:ºt7[âæâtqƒ’QW’}:VÍö©?Š<7 [쬬îâšBÃ*Y@^:œûVe§ü,O I{gšuÍ=®$šÒcrdW9ØþfsŽØ?à4<7¤kÐ_k~ Õ¢‚ ÝE!Dµ…²±¬Jq¹ð2Ç<àbµ|5«\ëº=ާqn¶òÜ#1rŒ1†ÀÈ#qÞ¨øßFÕ5)•´jV—PÜÚ–lÊpyÁìOjdžσ—Ãi™4ôXž<å Ÿ÷ùéSxOGÔ´­Á©}Fæk‹‹¢§*^V'®AÒà­&ÿCðö§_,ks—zÆÙQ¹É8¥Gá=RÑψ àŒ}·[º¼‡cû·Æ3ÀÁã§4ëQ·ñF±«ÈÑýŽîÒÚ(€'väë‘Ë“Gˆô]KT¿ðåÍ«F#Óõ>}ää¦ßáàóùV}ï‡|S¦kzdž.-¶_íkÛ+°Û×øÑ—Ç¿4°è^+Öõ ;ÏIk¥„¢{{+BÄ<££HÌvöjmÃÚãêÖÞ!ðõÄjQÛI¢¹Rbž"r+È ôÅCg¡x»TÕ¬µO\Z,{;ÚÙÙ†*daîÍÎG`ix³C¼×ìm­meŽ7ŠþÚጀà¬m’;úVõføƒJþÛÒ5 48G¹‘†B¿U'èj§‡¼<4­ t›ÉâIDæê@8•¦$±çëŽkÃ> Õ¼9 êú|z„m©^Ým8V0‘dŸZè|9¢ÁáÝOÒbmëk£>>ûufüNMs2øñ¼=â?èǶ£zÓÚ+þ=•œ1B7 ò8û½k±ž×ϲ–Ï~ß2Ý¡Ý鑌×"Þ»—ÁÚ…åÔS͵–'7>$›±·w§zº½ZÇûSN¿ÓüÏ/íVÒÁ¼ íÞ¤gt®nÛÁWJ|—z‚Íoáër¾RÇ<¡6£Ÿ˜ãhäyïZþ)ÐĺTºäKæG4“‘¶C‘üÅ$z¯ˆF¾÷EŸû$Xvà¿q|ç¿L~µŸâiÞ%Ô4mPÎÖ×ZuÌR@œˆÛ‚7ãÐöæ´üO¡h׺A¸6ÿjThPJí`zzV›Å¾„±£)Ÿ¨ÅrOà%o Ùø]59Q­dYRì"îÜ®_;OO­N|?ãr¸.7<‹XϺǃUm2ùu;›]nÂ)5B†cé¥IçÕŸà«…Ômu]s[ºÕ®m kd*CÁ`·¹'ùW[\[ü>kK‹‰t zÿH†æS$¶ÐìhrÝJ+«m'Øþ³áï éž[—†I®o.Ø5ÕÝËn–b:dúÀ*_hžµ¸µ·šYVkÉ Òœ0µ%‡‡­4ícXÖbžS.ª-ü蘊a] ¯äuÉ5wRÓ´ý^ÊçO¿„MksŽXÏpÏjä—ážä‹)µÍbm0|¦Éî–Sû‡6ßmßt÷‰u¦k8ÛN0ˆ|Œ|¡G@1Ó±\×ü+M)[M¬ë2éã±=ÓyEºpöÝ[Ú†tMKIMH|«Ì#‡åÚ!`Ê·~úÆÏR´¹±¼ˆKmqE*7FV"¹ïøWþ_Ùxn6¹ŽÆÎ>I‘_qlîú“L?|=<°I¨Ü_ê+ Ho.ãÜ:œøƒ[z¦‰¦ë§=Ú±:}äwmb1"qÔsÒ­èÚoˆ4ë+QF{K•Q"«x ŒƒÔUÅŠ5‰aälVv™áíHÒcÐímÇör$‘ˆd%W$wg9ÏzÀÿ…Yà.ZÎ-Aɵy$û¦üWE èšž•&‰sj§MxÖ#eT*@qŒc¶*óà ±42 x 2°È*F5‘iá/ XéhPiÑeÊX½³å”–9?xŸþµeYü/øwc€Óo4½'Q’Ò[ÛHg’Òa5»H ˜œte'¡úT×ö×pËmsËÈÑÉŒ«« Aìi`‚ Xb·‚5Ž‘caUT`=6êÒÎú¶»‚9à“ã‘AVÁÏ ñRŒ¡Œ¨(Wi\qJ­•¤C´Y@Ú¿™*(X›ÕF8<ö©’ÚÖ9¥¸HQf”(’@ç Ó'©ÇjIm,ç’¦‚9%‹Dì ˜ÉêTžŸ…V¸Ðü?y3\\é¶³Là’H±Ç©#5n {kXÖx’(”aQ}ªšv•k¦Ë¨Í-%ýÛ\ÊN:• À¿rjë¢H¬Ž¡‘ ¤pAõ¨­l¬,Sʳ·Šúí‰BÈRy0lhüµòÛ;—=r=èŽ" ±Æ¨v¨P §ar[$c4ß&þh|Ïï`gó§àg=袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¤ AƒMO"4EM«Â(ÀÇaO¢šòGÝìs=IíN¨æ¸¶¶PóÊ‘!ePÎ@c€9îjJ(¨ º´ºÖó$ª’4nQ ËÔwêZ*‰Öt@¡ôMߨÁÞ¸3g__½íÖ¯QEQU/µ=7L6‚öu‡íw)kïã‘ú(÷8©MÝyãóÓÌÊ¡†äSÈ$u¦iú…†«iõŒ¢kYÓ|R á‡ãгEÞØÅs œ—­ÔèïE†÷TÆâRy¥º¹‚ÊÞ{©Ûl0DòÈ@' £'ÍP‡ÄZ4ï£ÇŽ[W·k‹?‘°ÈªäãŽ|V­B-^Â[ëý«qµÇö[H—1¤ºº.â wltÅ]´¸K»k{”GEš$,ƒ ¡†pñõ©¨¢Š(¢Š(¢Š(£Š))$ }« Õd½¶k›u‰K®P¿Ì8Ü9ÕMCÅ:¾±ƒ¦ik¸}9/F”*(,WH@lúU_øÇQ7¶Ö>S}§»%à–ä·‚7K9åWµ-Ƕé©g¦IpÚµÇÙÖÜ8 ’d®3Ðá¸ê8çÚ¬Ùø—_·Õ,ô¿iQZ}¿Ì“ÛÍæ!d(ùT!±Ó‚­rúKÙYøkN)t§Å¡Yʈ§8qÉSÛ½u·šæ¿u©\éº ”ý‹`»¸¹r¨®Ã!($œc'€3Þ«¯]4‹Û«=“U´¼[±W|ìFÀ­ò¶AÇn+Ä—.i|3»agåIâ [iˆœ7Ý`ËÉô ŽzMsž7¸‚×HY¦²†ñVúÏ÷S”0|ÃÜuõJë_ñνªhz=žÛ8­åûUË>Õ ઌ’{`އ=ªj6º>·q«Y!Ôô›ß±46Ìv\Hû|½™²:ça5/ˆ–zYÔôûK›;É„7aÞ^зF;¸(:1ÀÇZÈÓµk½ CÕî¬ã‰¤)š·(Rx#œWQâMbûHm [,l/u‹k9·‚p’¸#Ÿ®EeÿjxÛ\¾ÔÆ…%µ†rmCÜÆî× ùÇÊ˵Aã8cí\Ö‘¨ßÛi),övßh¸ñÊÅ4r!eˆ»Å:aû§ô®–]Oƺˆ5L’ÎÚÒÉmXÜË;1s´(eŸ\Œz¯‹µû]Rûe¼7ݦ¨4¸DYX§•ÈØØ$9ÉçµG«êü>ty..ìnà½ÔlínJÂÊaógÌrAœ}zö¹ÏjÚ®…¦Á©Ùò­ï­àuÎmÙ¶¾9#9ÍfKâÝIÃZ_xªFÕ‰lmdš/%{Ø…»lõžõሼzž ƒWµÖ¢µŽÒÒim­ Èé'÷ŒNì¶;cÑÍâ w_ºÐ´&tÓå½ÒV¼œ¨vŠ6À  ¾}fâ)o4—˜ìŽ/ˆÐ¸CÄ„óœã¶+¼ñÝ¡ë#×Nºøá®_I¿Ô-ÿá[ÙÅ9K{­.O´FÄž\ Wœ0}¬«/øLõm_՛ė½…Åø³HÒ0’IýîTçû qÇ<žid›ÅöZ•ã µÉ廜ÙK5˜U¦)Ê‚pH ½¸œþU¹q&£©ë1ÒMüðÛŦؼ>VÐbg[i ýì ç5ƒáøoôÿ‡–76ºÿØEÒÀïsvÀ¥¬Dá„+Ù¯&’ K‰á_1ã…ÝûÄ ø×á_ øW[𾡬[Cw{©ÛµÝåì€w·$‡ê»: ŒV´ÅPü)Mh•™u/4¹ÿ\±§Ê[¹ Ï®y¯_¶µ´²†;kXR"]©j¨ôqRÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÔ÷ú(¢Š(¢Š(¢Š(¢Š+‰øë‰ö™ímlµ%’æâVkue*$Ã+ )<ü§æ²-—©x‡D·‡Å†¹%¬zLbØÃnðdd~öp99ô¬]^SªkW>;°Ó–çBÒn¡Žp¤æ÷ÉÜuí>V~\ƒÓ¨Åt:‰<=gã Zšà:ïÃìäR5y7cØ™8Á<ÔW÷öž$Ô|C«i/çéö>¼³k¥d²É–Ââ 8Èæ´5->÷Søwiod²4ÃO±™R>Ä{X…÷ qï\ýüžñYXZkzÞ©5ôÑ£Y¤€Ô–—1áBwïéZ> o /ˆu¨Ü_h:ˆ‚.úÚF yH ÊJž#>õZKÓ}á›|[ku}bui-A£š—>Tì¨ ôÈŒ9­^\6»%®“¬ÞjÚÙ3Í%à'É›pÚ«!U'#9â¶Ù§øVãÔ¼^ÒF诫å -yê>•ÆE%ö“áŸÎl'’â fV6»1##ç qÎ9ÑK/Œ5Í ll¯!°Òîòêâæˆ B¢‡ IÉÉÀÆ;ÖDZv©ÿœJž0IŠl9'?1Ýïž•&§¡én»­\ëZEíõ®£"Om=§˜ÛNÜ4l¨Ã<ƒŽ‡¨Å¾Ô‰.¡§èaº‹Y·Ô­¬ÞFigŽÀ»‚p3ÅZ×õM_Ä­áØ¬t-B(aÖì.nd¸o–ý3“ŽrzÆ»5”›Y¼Ñ´¨öÖÑ\ ›$W$|¼ç‚9È™ãËKûÝÅenóÍöË6ƒœ OдºMü>*ñEܰ:ÚÜ[é¢N6¹EmØúw¬ ï ë÷§ÅÍ;&:½þžd#lÍ ©Ç¡Æ9Ç5©½âýjóN¶±Ñ®tÈc¸WÔg½TÆÅ¤xc¸·LYrxwÄ3øs_µŽÛâ ‹ëh¤ Qe 9ãpgôº½çŒ¼EyáÁoáË‹[+]bÖâéî^0ë·©U r g'>˜š¹n|QákÝ^ÚÛD—S²¾¾{ËY`’5òÚ\nY²è@n;VU¿‡¼a&–‰ud«yÿ ”:‹ uÚ! ¥˜ôëÁö®³IÓõ ø–úh¶Û]­‚Û¾GÏå¡ ÇQ‚{â°/ÕÏYøoV†O¼’Cÿ[aºŸ™š ƒg2;â¤Ò¼7©XèÖ•,°›‹Ùu‰—;TNNÜäg¿4Ûß jW>Óôæ…níà°²S0•ÝŽ3ÛŽ*í®‡w½®êr˶Ô-- Têb œöïÅr¶þñwü#ºf“qsaöQ†ëN`®c•bΠã×øzUû¯ü@Ôµ- W¼¾ÓÒ]2åœZDå•‘J±ÞNâØë÷@uéT¯~ëzƘt_ÅW3Ú$h°¬PƘdû¦B3»Ÿ(5¿eáÉ-õ¥×n/ZâìéiÒüUÊ9bø '§J±§èPiú¶·«,Îòj¦Øº66Çä¦Ñ·ëÔæ±À×–÷WÿÙþ ¼³Ó/îd¹žÎ%;äåöHAe yãð"›§|<²Óì,tµÔnÏOÖSS³F ˜ö’ÞY8É\’ry÷­ÍWÃöš¶¡¢j3K"I¤ÜI•©EQPGegÍÅÜq(¸¸TYdþ& ÷GÐdþu=QEQEQÖ4+\±ŸMÔáZÎt'ƒA ƒÈÅdiþ ÑtûÈ/帽½ž×y·7³³ˆwt3Žäï[äÙDÆbcF” ¿¶:sß »&!VxËsH÷–1²\F¬:†`©#–I«¡èÊr 4 ²;H¡cÉrHÂã×Ò•9U^6 Œ2¬§ jd7·Q É!ŠC›;u SŸÄµ¸û%Æ©iÎqå<¨?BsW¥š"yæ‘c…»»@îIã”v9ö5ª|\–×ú-†§§\X¾­y/!B©*ÿË&*Çæ#‘ŒƒëVuÿÚh2iv¦ .ou;¡omo77f9# £©í[tQEs~&ñ=î…y£ØYi†þëTyÒ4ªò€'$ƒØÓm5¯Msw>X-ÞEY%û\må©<¡rqéšUñ=ýåψ,´Ý3ϺÒ'·ˆ+ÊMæ ’6^µœž0ñsë'Cÿ„n5º[!xI»\l-´­;Ä>8Ô<-o£K©é’öiÖâ;y ùÇÉqò Ø^Oµ¿¬kqéÚ ö¹j«s/w …Ü>lÐÖ&­âÝvÞçÃVZ^—ÍÖµk4äM9D‹ËEb2ó×ÐU«[ï‰Oq ÝhÚdVæEº]»2®y y#'9ZçÄÞ#Ôukí+ÃZ|.œÊ——wrdaˆª 'ÔðI¡xºêëT¿Ð5»°Õlí–ï &ø¦„œoFœÁȪV$ñïˆámOBÓ,£ÒÝŸìÆòGÜ*’7aFÓ95³á?/‰­.žKV´½²»’ÎòÝŽ|¹S®ŒƒØâ·è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÖ÷ú(¢Š(¢Š(¢Š(¢Š*µýý†—m5íôé´+ºIà(¬ý#Åž×g{m:ùd¸HĦ&VW؈‘ôª³xóÁ0\Im&§hç;á¼µsؾ6ÿãÜUÍSÅ>ѧŠÛP¾Hg–4hA%× |¸'' çÚ—Fñ.¯ý¤i÷äµ`³ÆêÈñç¦å`¤gé\׈~"øy4ÍMtÛù#ºXdKkŸ%ü¦”vWeòÉüMjŬoíšãR‘¿âŸûd–)âûHÌ¡”žÛG^¹û¶µáûë«‹ÉôÉí¯Õå-d+å´ÛPà‚Há°r½À®·Xñ>¢O¤æY¯'RñÛ[ÆÏ!QÕŠ¨8_sPÇã? ˤ]ëipÿd³b— ÆâH˜6´dnž˜ªÐøûÃSÏg‹¡o{(ŠÚñ¡q®NG~Ü`ö5gUñv—¦]½‚ÛÝÞÝÇI4Vq1+t,x>™ÏµhhÚΗ¯ØÁ©iÓy¶ÓgiÁpAzäUMgÄúfsobÑ\]ßÜ)tµµMòlˆà¹"³/…¬ßið]‹ÛÝ$¶h±5»•ùYБò޹É©¼qqw Û\Ï%ü“M‰ïÀ ÌÊ (ðᬯh×v“­ë6ÚΪ“¨óR5¸aÃ… ükkEÐÂ8oF§¨Ü;Z€ævtËÎzÆð†/‰|1¢Ýjz•ûÜÇö eŽwF“2óí#8c=*…ü8šÄž"Ú¦ªâÓZ¸´„-ä˶4ÆÊÚ۵–ñ|y{ln%6ߨQ:ÄX” $v3Œûã5£ãF™<7¬‡­]Y]‚r-eˆäöVû­éÁ®°ƒÿ O8>?N'½® é¨é›ýלßÙÇ©øÁVs³q§B\™wår î3Åtš6«{y¥ëZ¨AÖt»y œ·IÑì”{8ëïšáµÐWÃÿ ŸY†'Ó‘ñ2H›×iOî€Oèk¦ÑÿáGÏ©ÙÇ¥i¶CPi[²Y²•däÆ0õn>ÅâÏC`÷_[ˆÌj킜ã*zÖ§„Ãòø¿P›Â+zZhŠõ`bk¢ù]«ÀÈ\䊥n‹ý•ñxuÝù#sÞ®ø{¯ I¥èWlN•«YÅu¥LßòÎV@ÒB~§,¿PºÔo4'ÇÂO&ê÷Åmg£8@[êqï[÷~øSám6ÞËU²µò¦Ý<{啱–%À-žùÈÇlU 8hñøÄÖf°u[K[{Ôˆ°; B™òvûãÓªø:-HŽ ]M0ÓíƒÈšyes°d†Û‚ ïš·ã›+WBðͽ£ZZÞkvq˜¼°Ê¯cÏ¥Oeâ{»\ÝÜêšdré²ísò×þú8?sz.•ý… üGÓZC#[YÅæ1ä—6ÙoÌÖÞƒâ‹4]"#á]Zo*ÂØoK@U°ƒwt5/`±Ö´¿ Áqk,×Úí”r[ºíuY‡žy§iW×öšgˆ<'«»K}¦ió›yœŒÝÚ•!ê>ë{ýkwÁKžðó•V?ÙVØ86 ÍøV¼!§6ï:ð뉚»JòØÞOâ¦Ô,·Í#Ãñj0*ÿCq’?È­¿^EâH¼5£Ú1k}a¿´.=í`Mø=~óÇË<öÞø[q«ÜË·c²*ÏÏ€ dû+Ñ ñ7Цš›ÂÑ#ȪÒI5¾É8‘ž•Ïëz”ºOÄ«kˆôû›æo ²íTÏÎNJŒ~5­«ø·ÁÖ—zmÖ“öK©¯!žñB›†TÿWÒÃ'9mÄp:V¿†áKÿx¿R»P÷FÖÆ×wXbÚXíÿxó[ºîá»ë­QÔ¤\é÷Šö“oK·ðg¸oNõÇiw~(¶ñ‡HÓ ¼ s§—3Oåí>HÀÆÇÎ mõߊgñß?¶tÛ{>5A‚s.ïÜóœÇ1Ç®jê~Ö kš(ñ/…ô}N.ÆÕÛV»·ò"R1å²yª…º®'ü$%Œ¦K;Eæ±,¬¿èóüÀÀ+dt¬¿?ŽVÛÄK£E¦µªø‹R×- vmÜä(#;šnŠ×°§Ä‹-v!ˆ®lÞòçÊ9á1ÊïŒÃ9¦ß<%ð«n8Õôn?ÕµzÝpß ¸o®sj?®Ú4e#â7ŠÏ8m/O>ǃ]Š<=kâm*}>fòäÊËm8ûÐLœ£¯¸?¥r¢ÔüE,Þ-×¼·ÔcM¶Hþì+þÓ¶síÇJôZàfÓ ñ‹5Û-a¤“LÑa³K{EvTy&]Í#…#$tàV>«š%‡Ä?ÚO3éöÚ ¼µWvf¶iU²ŠÄ“Ž29â»/øMÑôè.aie¼¾µ¶{«‰¤gyH^2XžN1ŠÆñÔZ„¾"ð:ØL]›à’țՖ3òåsžEnXiþ9Šò oµËk‹EÏ› Zífàã æ69ÇcÒ³|(Tx§Çh;]Ø“øÅMQÿ2SÏüŠ©ßõæ¦ñLk'‰<eMÍø`za#¹i„´¿xZéˆÒîô«ëF<(KÀOªõ_nüUnßR¼Ö¾Gc|ÖW-¦ßâq¾?t™á¸æº› Æ÷Oyâgº·BL}š% qóF=« èvZƳ­ßx[Ä7z^¥ÀƒQ‰P4M 1ŽA‚Hî?Z“JÖ¼M¥øŠ_øí¯ƒir^ÛÞÁW(†Yd}1ŒúzRÐ|.ÓXÇ©xÅWvzeÑy!¶š5’$çªà2ŒöÍnø/ZÖµ¬éÚÂÀ×ÚUà·’{`BM‘pz7¨ÍutQEQEQEQEQEQEQEQEQEQEQEQEÿ×÷ú(¢Š(¢Š(¢Š(¢Š+ñ¨ˆßxKí¸þÌþ×~ï»æì>Vïmß®(ñdš#]Å J_ÄßÙz‹i¦=Ûyg%±Àà ÝúUm6ëÂÉðê)KEý˜º1Yƒc¶aÿh¶}óYž´tÖü·Ñææ ±]ýUQ߸'‰£¿:ÿŠc±¿—”'ÞfÞG玕k^Ô<7ÿ ù¼¹àÒiÑE‚1æ``êZ—L#þÝsáÇýüZç{cà=n*4°ëÒ«¦îTý¨c#¯5Óé·6v>7ñ2j$Wv¶dÒ7ŠC'Ѻõ®cÄw×|IÔ­$VÓÍ¥…¹•q²I£?6ë· ê|wäÃá«@*%.1YÚ ÓˆõvÒüDú®±[ý­.3 Êíù]UÈ΂1é[žÔ®µM*yn#¶ßýÌ"kEÛÎÓþ±G?xç<žEg­ö›¡øÛX“Vš;eÔtûCe<ÌJÅèàg'8Ïzκ¸¶Õ¯õØxOðŽhmÃû.Ï×÷b³¾#´iá m¶¨… '·Î+zÃæÓ­ =mcçþ\ÏÂ×I<¤²¶áºëŸSç57À,†ãÆJ­’¾&¼ÝìpµNóZÑtOÜÉ©ÞGmš J†C€O›ÿÖ«¾ ñ/†µ¯kë¦ê\˜´ù]ü£œ u¬í/VøQ—¦ý©, ÂÎäÛää(Î~CÞº„ñ?†"²Ó.aŸýöé,m FÛL„í ¼ Œr­ºâ<-¥ØëžÔôÛØÉ‚æÿPÁ#÷‡‘žàô÷¬]Û[Ô™©Í‘%å¬S´`ä.ñœgåY­£ê-ã/ís<è&ÉŽFL†]ØÇ¦+Áž ×4;­^MFXåŠ(NŸ¤m<¥®æ`޹ ~Iü!âë x.ÂÚ yµ-Q·»ž9%*‡Ë,p)õÃ[Í©üS' áí4{›Öÿã(ÐuFñ¤"o(ZØÈ¡Žï7ÍÝÀÆ1ŽùJ_h:ž¯¨xZòËÊÆ™ª ‰üÆ ùd`íÀ9?\}j¦·áïÚkOâ? Ïmö›˜#‚úÊï";€Ÿuƒ/!”qÐŒ~±Cáïx‹SÓõý’ M2aqichÌÁ¦‡‘Ø.vöñÓм;}¥øƒÅz´ÒÆðjòÙ¼(¹ÜžL{NìŒrz`š]cÃ÷Ú‡ˆü1¬Ã,k”/¼älîo96¸àõÍ7Áþ¼Ðíµ 5)"›RÔu‹Û—‹;rçåQÅC…¯íu¯^[ÏéúÝ”`Äs¹.JîôÁ{æ´t- l<9a ê;…ŠÁ-'|’ ¸ncXþð]çƒåÖüëïµÃy4f';ãŠ%*ªÄžp0=+Fß÷0ø²ÿÄFáL:d6k>edl“ŸJ4_\iúçˆ5Ë»…ž}IáHB®<˜bUêy=OJ.¼9<ž)Ó¼Gmt"ØÍeu \ùÈÇràä`«sÐÖ•áèÚ1iZÝ‚Û]ê¡fµve2œã"e}*ý‡‚îa‹_¹Ô56¼Ö5›Cm-ÑŒ*DHUD€3“ósëPê^Ôn¼?á½&ÓSHnôIígK‡‡rÈЩ^SpÀ9þñ«¶š_Ä5¹‚KÏÚIHX¢³Û½{Œ™[Zµá¯Ÿhý¨Î5-ZãP®<¿7/SœzñNµð÷Ù|E©ëÿjfûm¥½¿‘·„ò³Îsßé[uÎhž è—ö]Ë3¼·— * Þ†RH ½ ^ÙëWü8šÂhÚbêò4š‡Ù£7 ÀnÞG9ÛÆG|Vv±ákË­Lk:>­&™~öëo9XÖHæE$ÈÝÆx ô⢇ÁÃJ×,®¯¦¹¾Öâd½¾p¡Û+´mP0GAÍt––ëgmol¬Y`‰"õ!F+?SÐmµMGFÔdšD“K–Y#EÆ×ólƒÓ¶1ZÕ“¦èšf§­j‘K#ͪ¼*¶6§”»FÜyï’i°,ÿ·ÿá!ó$ûWöwØ<¼›7ïÎ1œçßÔíCDµÔµ Q–IM.Y¥‰WXÈ›Nî àtÁŠÎ’–<çh>™íUWÞYo'e¯›zê÷-å®ee9¸äƒÏÖ¤Õ4][‰aÕ,`¼‰NUg@ÀlƒR&™¤Çf4ô³…l¶ìû8AåãÓn1úTÓ[Û\ Šx’HÃ+pÊœƒƒèzU{ÝEÔ™úÆ ‡@UZTV à ը¢†Ò(QcT`ìC{§éš”bëXnb ¸$Èë‚ Iµ¬0‹x¡D€.Á¨ ¦:b¤UUT `ÐPÊŽ¥YC)êCKHªˆª…QÐ ¨Î9>ôŒ‘·, ýE ‘®v¨ô¸_J«}§ZêÓÏݶÚå.QTàO»»ÔÏÔ ·EQEQEQEQEQEQEŒªêÊÀ2° ƒÐƒ@ÀKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š+ÅÚõφôyõ;{e¹–9!E‰Ü¨;ØHVéŸJ o¾)çåÑt1ÔÞKÿÆ)úÏŠ¯íoíô-OúÌyò¡}°Û§MÎø'“ÐɪW+ñO‡ÞOi¶ë¦Í ﬤfXºyˆÀ¾àŸ¥[Õµï'ˆmô-"ÞѼÍ4Þ´· üaöàÖ£>"ñ>‘¨é–šõ•©¶Ô®>ÏÅ£·É!*²0Ψ?…uÕÅj¾7»°ñE®‘ª>š%··½¹9Ý·ŠLp3Ÿ^ÕÚ×!s­xÂçÄ—Ú6”,ÞÒÞ™î…ÎñÛiŸc¯xšÓ]µÐõë{Bo –[[‹Bûs%Y['8ç ÕK¯^Áâ´ÒÖÎŽ“Ãc=ÁrÜʤ¨8Ç”ýkSÆzÆ­¢ØYɦù"âçQ·µ 2–UgœSúÖf©?Å ÎãS’óI¼†Õ ²À ’6d^NÍ|ªš»s7Œu;[}[DÔm-l§±Šå!¹¶gpYwrË*NßQð•×µë-7W¹ÕlVÖv-%ºZ°bªÄÌzã®ÓøÕÍ;År“âÙõ!Zè·nˆPÅsÎIÉ=ºUK%ø®Û&¦5 ]%&Q%µŸ‘懑æ±aÉvåÞ(ñJø_^ºº´ZΖæ}Œa”‚>x÷uR©ú×c§Í-Å•œÒàÉ%¼Nøõ* ® oø•ïN„ŠôQÐW1ã=S[µŠÇNÐä ªßÊâ& ©–cÈ#Ðr+KÚ·öÖ‹a¨ËI`hþì‹ÃÀƒ\Ç…añwˆtX5)¼Is“¼¼$0av1^èxã5­á WY¼“[Óµ9Òêm.ô@·H›D ®y 0ïjgou[-:Çû:òKI®5Kkv–0¥‚¾AÀ`Ãô¬ýsMñO‡´Û­ZßÅ—s5¢y†+Èà18•;#¹é÷ªÛk´¾'ðÔ"GŠÒ÷Išy­ð1¿Œñœ¯Ô}*oˆ7ÚŽ Ksctöӥ͸óÁpäÒ©jÚZ—Ž5K»[!¡ ¢–Ì«—óJç%IééQ].µáwÃð[ëWöúÃÁ5¥ÑV!BçÌV mêy#Ú‹»KýoÆžžÚ¾¡ikŸo*%¤»âp{µ¬ºŸ‡|]§h±ë7íÄ×]²¼–Æ>C†§¦ 3I³Ö~ BÚÝæ¯ya¥Ë4‚ÂÒÅü²cFÆéI$tè*H_ðoˆ4­:ãT›RÑ5vxb7gtÖÓ(ÈùøÜ­Ó‘ÇóÄÓnô¿j:Ä~"ñ5ÖŸ¨A¨Ë:tW@†4û¤ ÔœŸ¥tº}§‹ô7Äöº…û^YCo$šUë03•(I@©ÆZæü5gà{íK¹ÕüV¥QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÒ÷ú(¢Š(¢Š(¢Š(¢Š+ø øOPØû̶Ãc;Oš¼â¬&ƒã$lÞ,vŒ`²ý–.þµSðû¥¿|cmpBÜܥŸ=^%M¤`x«_æ†/ ê¨ãsΉ 1޲;0ÀQëXWv:ëx¯F³²ÔEä~ $Æ5|í| O?…;P²ñâ_ M­ê+«YËu$PÇåˆþÏ1^ NïǧZô «˜,íç¹¶Å m#·¢¨É¯#‚×Åúׇµ‡O޹rÚ‚]}¢0ëÈ1áHÏÊפøWYþ…¦jòÒ{uóG÷d^~åþɪ^xë\[-A¬¶iֻʢ¶ÿO½éíZpèQè^øŸZÕ'Ô¯-¬åTyªCä„Ed÷$’k‹‹Iñåÿ„î£þǵfÔ'm[í?i"]ìÁÕ‚yxÜoükkÅ:˜ñ„|9¨C1…îµ+]@ÌO’ÈÊœõqGŒ<+â´Kë“â{ûĶA3ÚܬB)•J¿—m‚?ÚÛZÌ·Z5¼ë‰f°I/D ™Àöðßð‰iùfÿÑ\Çötú–Ÿñ2ÆØ™õuUêÅpØç®çÃÚÞ“«èö—ö³Æaû:>aû¢!½ï\Þ¥«Íãx´YÛeø­'VÝö¯+–*08``¶k ÐõÍ}ÃQ[È…ªÙÆ^F`m^CsÁ­yýÂHÿ õ‹° Ã{©¨3Á1´ëƒøã?Jõqsk€<äÎ=Epèºî¹â½KSÒ¦¶Xt¸³PÜ#0.ß3•Ú˂뚃?´´mW^ðî§$O3·ö¥¹…J¡IŽ*’H qÜòMeøÂF³áÛ+Û‹½@<¯>Ds¤xG Žtì+gáôÙçÄ:*9x4íM–|o*ã?9êN{žM/ÄÕI4k(œ²j¶¨Ä1=ÁÓºŸü Fky®|©ˆ.gš@tá݇éY¾,¸·ÑMǰ& ñ¶»¡ë–¶Z•y íýýõ°T·`ûXvÛœ=išÖ£ëßà²Ô¡ó£O 4ÁC²DØÏÊA¦j‡àïxZóHFµûuÛÙ\!ve•\p>r܃Ó¥ºÐ|?âjêp-Ç‘¤[º©fIoöHë]n—á_ h¢çû6Â+w¹]“H¹.ãбÉÇã\„¼I£ø.Ëþo\&s§Ë2Ã,ß,W3VG˜®†Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÓ÷ú(¢Š(¢Š(¢Š(¢Š+3_Ñ,üE§K¦Ý<‰ Œ€ß#Aôô­:Ä×ü)¢ø‰­æ¹óa¼¶'ì÷vÎRhóԡȪzwô›;صËËÝNê›w¾”¸„úªð÷ÆkY´]9õxõÂí±Ùµ¢ÇnÂÛºtÎhÔôM;W—Nšè?™§Ý-ÌŒ0õÇQê K«i–šÍ…Öt\Ar›$ò؆#Ó#Ö¬[Á¬0ÛÀ¡"†5t £U-DÓ4(® °FH§¹–å”± ±£àänãó§€ Æ)6GýÑùR€À´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢¨Þë:˜éþ¡mk#®åY¤U$z€H¦ÙëÞÔfû=–§kq6ÒÞ\R£6|MhVfµâ ÃÐ%Æ«v–é#쌖vôU“ø «¤xÇšåÓØØß+^"o0:²IP¬?†kFËTÓu o`µ˜I%”þEÀü€qÈô=³W(¢¨jZƤ›¼vO·^GgœÈùÀ8éÓ©«õCKÖtýcíßd.~Å{-”Û”ŒI3ŒõõTwîiªÙèóù‰qyÉ•>[ì꡺nqI­kúv„¶i<——)mQ.]ÝaǹϩEQTï/ÞÒ{¤ó ¹š#$J Ã…'sœŒŒt<ÕÊ̹Öííu;GhœË} ò¤ƒTEŒƒÎyÏVRÕõ[ÂãQ½,-íÀ.QI8$ƒš¸ Þ–Š@AèsKYÚÙ³Öt}+ìû×PŽåŒÛ±åù*LsŸ¨­Tx䑃/LƒÅ!šdC"†º ?JE¸¶i• ª2ÈÜ>¢±o5û½.×\¾Ô,ÕmìýE"—¸]¹èpÏbk^ÒêÛxna ¤ˆ`ƒŒöã<Š‘f…÷í‘O–pø#å>ôÆ»²H~ÒÓÆ ÿž…†Þ¸ëÓ­C{ªèúiŒ_ß[Û3°M"®ìzdŠšK»(cI¥ž4ŠFEGfX·@¿jÁÔ|QwšdÖ×Q^joerÊÛŠBħ‡|ÖçÛ´ÿµýƒí}³Êó¼Ã~ÌãvÞ¸Ï|V?‹µU~$é·"øéº>©}ö ‰ º0Â1ŒàòÌ ú€¤œv£wãÛif±s¨ñÇc )™fw ÆÁÎHÆ:Ѥø¾+ýHh÷Úe晨<q W!•€J²3®Fy©ü2»½½ð­”÷sK4æâð3ÊÄ·0’Iã æ¯k~+K¾ƒH²±ŸRÕ¦„Ü h . q½Ùˆgê{VT¿tKm'PÔá—M½ŠÎöÍÕ|èZC€p‚¤r'#¥]>2’ßKþyk-Åà¶°²m¦{’Ã+… žrŒÍ.™âë©u(4oGŸJ¼ºYÏ{£Ç8A–ðÀs‚Uüm«ÝM©bøvâþÏN¸’Úkƒ*G½ãûâ5n[†{V_ŠryÂÿ- 8Î1Î7gwUñ­Å®±§hú^”ú”š†öØdŽEU Ÿâ$p¸ç<öæ­x{Ä×úž¡©hú®œ,5+ŠR‰ t–9:26õàåEt”QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢³µM/×Jnõ[YżLL“Æ­±G'’ÌøI±º–ãÅ`ŠÑ¯”Åc _*Ø ™ñ“íŠíëŒñFâh5í3ÄZM„Z˜¶µ’ÚKWpŒ›ŽwÆH#=°ü³ß[ðî¹­h]Òµ W¶¹Ýbó  #‘ÌbEÜ>œf£Òô¿ê:÷‹c±ÖL³MI]Œ¡’IRêÀ(‹“žµ$'ñ)Ñ’ÇÏŠMiµÙ4U»dNÓÌ» Û¦jåÊø›ÂwšMÄÚÔú…íüvW1\¤a˲UÆPsÅjxWPÔ¯®-Ôu©¶.¬,4ëç±¶†Ðª³<@oy VÏ'p1Nøn·±Úx‚+Ù¼û¨õû´š\½€\œzÖÇŠ´øH4ï&<›ëyæÊoùç*r§èzã4SPÔíõ?êÖʲiV3[XÚ‚J«¢æGÎ:³qÓ€;Ö‡ö'ˆ¿°?·[Ä7ÃXû'ÛÏÌ>Înï/ËÆ6võïšµ¦ë7úŸ‰4)„®–·¾7mläΧ8îFqWínnÏŒõ+c<†Ýt›y%ŽÅmç=OzÇÞiÖú^±òÇŸ©@÷JŒB¼.v¶à88Ï|Ö-¶µŒµ ùî¤þÆo¶iécå£ÛG–Æq“óvÏ_O¸Ö>ººº¸2꺵Íܪdll•¢‘Ÿº0:U5€Ð^k§ÅQk1.¬u+&‘ ·€ca3ò•þ,©ÏsŠ·whšî©àxW–æ9t˦’òck• ¾œÝðAëÒµ´{8´\hö"é÷:(½0;³*J²íÊî'py©¾'ZAsá=M䵺¤±üÄwÎ:ðzÕôK íjäʚ%ž”ׯn²¿ïäÀÙÜTrq»­[Ò,¡ðßŠŽ§<‹¦]émwöfrË ˆár›‰ 0<Œõ«þ7°Ö5-ìújy¯ö˜^kq'–n"SóF¶áî+œðÛxz×ÄE†¥¡^Ïm2)Çî.ö€rs©e¨#½[ð–ßøW# ‘öDOmÏÞ±F•i«Çð¾Æð±µ“MŸÌEb7……NÒAúÖÃhÚw…üY¤¦‰µµÕ,¯c»¶‹ˆÉ…C+íèxȹko xu~k½¢É©%«OÑÉ’"²|¡9@ìEojÞд!àÍCN¶XoŸZ±†[ {2ÌýíÕ·wÉ5ZþÃO»µø’.-ã”Ãz·—PJȱ ¬=Çc]÷‡,´û O†ÆÞ;xZÞ96D  Î'¹=k‚ñEÁðö¥âëX@ÄT2[(ã3³ys¸§mh›t¯‡û²¶~$w•OñÚ¾xÈôbÀ}k¡ð¦™¤k·Þ*Ôµ[X®ïWY¸²z†ò¢„¨ çœœuÍrº•¼¾×4XÔ.ÛÙÚ¨?r7tܫ줜WIãM=´e𜱶ŠxõŒ[@,[š&m¸àO~*÷áhÖšƒÜ#ÂB·m²òœÈÓ/L?vG(Æñ*dÑm™ãF+ªX\´4 ¾ÕZM+G¸ø Mk½¯‡íÁQ„>qÈ­Pô­+Wø”n£a§2ÂI¢ƒåf.Žn1‚Ý3Åcø–ßÄ0ø:åÓ4Í3J„Ù}𑤏ûëŒ6wc’FîüžµÙΩÿ È•_›ÃÓœž¤‰–´¼hðθ?è3Ò¹y¬ïî5-ëÃú¥¬Z忇¡ gy4r@džpG<g¶Eiø"åÞ÷Ä–·zUµ†« Ô zÖ®Z)ÚDʸÈ8ê1õ¤ñ5½­Ç‹ü ³ÆkjN¡±€V0AçÐÕmx\¯Œ\Ø®Ûçð•ð‰‡Vpã`ü /†§ðÔm^söxÒía±Ëí>`aýâÙük/LZ·Â•¼%[^æpT>Psßéõæßt-.ûÄÞ ’e#íwmv ·G‡UqÜëNií­>"!¿aÏ ìC…,²æE\ÿ0O=*…ÿ•ªø¿\}0‰’ MkvцšFÊ!#ø€Ï¸¬éüGáØ>D¡wÐ’Ñ0ÞeÙ·n:ä¼qZš_þ-ð¾ìOï=‰d†k¼»I¤¶¸HN%h\!ôb8®ÁÞ$ðŽ“àè!¼»‚Ùôøf†òÚfE‘IÜ œ±éÇ9¬MÆæÄü#µÔdãûRQõ@Ñ–QõPGÒ¶üE Å×%µµl]Mà½B8¿Þi­fEã?Úü>k̉¨E£6žúiÏ,[YLxÝ×’qŒsš—GtŸÂ•μ;wÇý±Ž¶~,غ©Œ>»ª“ž§÷§úW¦k·:o‚ü WÑi–—·Q\joamµŸweAsÀ'V¬5-<áé"×®u8ä°¼¶û]à Ìûv¤Lª©¸ŽH\õÕ|(“Íð…‹ç9º¿Î?ë»Õ[WLð—Œõ‹ÝrAme«ØÙý–òAûµh7Œ·@Nw õ¬¿ø‚?è·–v^^žºö—­Ó àYWs*Ðx'5­ñ*ÂW“Ãz³ËyŽ›+^IdO›rÆWxÀ' ~öàšÉÑ×Ã:׉´‘¦j:¾µýždº’æiÙíIRrƒ,ÙÆ¬èu‹MLêiâ]WXmmnn#]ÓÍB‚v*ˆÀ,s¸¾~*;[Ëx>x2êd˜&‹®YAv6è LÛ²¸ÏzÙ»²—Äú¯ã±Y6j¾±²²•WÜh;€ëžAý)÷~4¶½ðÌš­…ÑñúØ?³Ú ŽFM„³mÚuÎìb¯iZ]ΗâíÑÑ™-<¶¦PÍé"‚3Ó>êì 4:ÖïÞSÐmvÈኻªzíœ×C¢kZþ›iªY‡X.P² `à‚9ç"´(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÑ÷ú(¢Š(¢Š(¢Š(¢°î;ÑR%–Xþî[j€ õê¦Ö…¤_iÚˆ®® f+ûäš „“´ 0 `ç=3X§ÂÓX_ˆç†I|A>­`ü”?(~ù†AÇL÷«Kñ~¿}¦Ë¯Cige¦Ý ¤†ÞFvžU)bUQœã“ïM:WŽ4WT}ì2Øjs}¤µÓ8{y €ØU08é¹~µJÇÀúý¾¥Z\_A4öž%¬Ò`áãðf=}=êûè¾0Ñõ-FKdöZœÿiš+½àÁ13!^¡±’9ïVü jÞµÔ¢Ô¯#»¸»Ô¦»2Æ¥r/PIç#±Åt•Íhm?B¼Ñu)á.¥».c “Ç=ñYCÃ>>“O>ŸV´:G“öcr±·Úš›O;ÇçéZZŸ†µ8ï4CÃ÷0ÛM§Ú›#–ŽHxÀà‚#‚)4 k¶Íþµªê‘ÞMykF8âØ±=æo—ëÎrs[zΙ³¦_鲜%ݼ“ŒíÜ8?‡Zå.~‹¯ Ûøqµ“¥ÃÏ%Ú§.Ò߯îáˆåã[Ú‡‡’îãÃòÃ0†"s ˆ.w®Í ‘Œ~5™'†¼]m=òé> Xlo&–cÌ>kÂÒu±uã=RX°ðm®›sáém®[ÊÑín`À˜ÍŒ±nÇ9=;Õó¡ƒâ×þÐr4Ãaämã™7îÎ b¦×´˜õÝ.÷K’CÜÄSzŒ•=AÇÖ±dð–©$Zu×öÜ‹¯YC$Ú bXÜçkÇÐÆ9ê3W´?K¦Ý\êZ…üš†§sDÓºª„z**ðy<œšŸÄ¯ˆm#‚Yd‚h'K‹kˆ±¾S£ ä}r:U?Â÷©¨ÚêšÆ¯.¥ui±Û‚ˆ‘Çæp[jŽXŽ2ONÕ›ÿ öAoy¦G¯^Å¢Îò:ÙFyaÉ%Cí-³'8ü3гuà+ «Â5 ¸_D·1[Ë UrpbvžF:c¸5sIð·Øo'Ô¯õ+KP–³¬ÓíTg’¨¨ žIÆM*xKN_ Ÿ ùó›SnÐy¹_3ç9Æ3ÿ«zŽg©Å¥E,’*é·–÷qm#,Ðô x=ñ­BѵÛÍ"úõ\Í¥ÜyöûNìƒóqÈȵ:? ik³ø‰ÅüÖ¢ÙùùvñÎ1×€:ôª:‚4«íBãR‚òúÂâéUn~Å1A>Ñ€\`ò5bOxuô«]!h¬­®"¸EF;‹ÆÛ²ÌrNO\õ«÷úM†¥6Ÿqr¬d°¸ûDX€iÔ`÷¦G¡éqjÓkq#%ìöËo1V;dU9—¡#±ÆqÅ.µ¢éž °ŸMÔc2[M·pV ‚§ ‚0A Ó¼5£i—PßB²½ÜV `%–Gf1݃¸œœ÷ëOèR\ê—r[—T·ŽÞóy%dD´œt=€¬Døeàa[Ki4ñl)žy_ÈôËs¸ìWÞ´n¼á«Ùtk‹ˆ$yô€¢ÒC+îq÷Žì·Nwgõ­{Û+=FÖâÊî1%µÄM¨Iù•†ã²õ/ø_VŽÊ;Ë%o±GåÛ2³+F¸Æ)zÕ­CÑt sk¥Ú­¼LæG$³ìI$Ÿ©55Æ™¦Ý]Ù_Ͻ՗›öyXüÁ†ÇÔPÚf˜÷ñjn†ú(Ý&þ!Jý2+&Oøkã¨É£Û›¦“ÍfÇÊÍêWî“õ¯ëðÿˆ"†ZÆ+¸á“Ìdu½«J«\éÚmäÖ—6ÑË5¤†KwuÄÄ`•=Ž*-SFÑuÈ®«e Ü·™}F{Ó´Ý+IÑ­ÖÓL³†ÖÝNDp¨UÏ®z¤žðj\\].‹b.. ¤òS.®N;÷õ­%²°IbmãY¢‡ÉÂÊŸÝÓŽ•=gÏ¡x~æåogÓmdºV &xÔ¸#¡ÜFxíWÞÚY"–H‘䄱‰ØP‘ƒƒÛ#Ò’H#viT*Ïå´k.eúgšá'Ò>)^Zͦ] µÄoo6¬›ÄÆ'à‘ÀcþšcÚ»M?L²Óm,,á@RÊÝ-áfpUP:ûãš´¨ˆE 'w4ÓolcòLHbþæßÊ”C¨qÊ —éNUUPô’G«¶DW\ƒ†RápAKH¨ÀÔ¸hàðh¢ŠGPêÊr>õ_O°±Òí-ìl¢[[Æ#'{œŸÌÕš(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š) *ã$ œ ÷¥$M"²¸ ¤2ž„RÑEQEQEW{ëîâ±yÑn夎"~fUê@ôbŠ*Œ΋p—ÒEyŽÂw·ºrØX$18df®‚AUõ­Yõ+eºO7ModC®àI89ëWc’)‘%‰ÃÆêYNCЃéQý®ÈÜ›1<jyÆÃ~Ìãv:ãò¸lía×®+RÿÆ^ ÒîÍö¯m ÈeWFqòÓqè¹í’*Þ¡¯hH€ê…½°â2¸ ±ú «§x¿ÂZ´w²ØêP̶Hd¹Æsœ@8÷ÅbøoâG‡u3PÔ/.à·û Î'Æí©}±±$=jÍç‹4}E-ί[Ä"Ömm.$(]e.y‰Osv œVt4í+_ñFŸ¯jÇ¥ÕªX¨L›ZÌp€±=Hük¤,ð³ik­&¡éÍ"Eç.HÌ)dœ`Ž*棫izH´7Óˆ…ÝÔvd¾Y>êð_~+’±ñýž¥âhBo),¢E¶•a“ppŒd/‘· GÆ{f´ì—-ŒåÎŒ³ÚÌ:Ã2}ÖÛùW/‰uXÚxI­õˉ$¶ÖˆãìÑC1‡ýt õö­Ë=OVÝs£øCMµû‹¶ÌËrì¨Ò ©?(êÇ¿cN_Ï&Ÿcsö&ñµÈt›ËiýC³aˆ`0xätÎ{VƳ­\i—Ú¤P,‹¨Þ4Äãb…'#Þ­ë7²éº^£ $µ´štF8 QIŸJâî|_ãë=/N×¥ÒlšÎèÀ¦Õ%;2ýÒ¼œqŽýkV×\ñm–·¥ézí½——ªGp`kF|ÄÑ.âwPGqŽ{TW·ä}Næ(,4û+I䎽/¾áS«åH øx4Ñã=Eí|#ªý–8ôýZqmx’ÐÈü&ÖÈÜr½=+Të:„Þ)]Ù#6vúÚod îWvÄj9Ç8$ä)¾3×î|9¥-åºEæIs ¿›>|¨D‡ßí‡=ꦇã¼Eº¸ÓõM*kwu¾²|©øYK¾Cv ýjOkú¦©áõ¹Ä_mk[™pŠBnŒ°Ony®f[ÿ꺗‚/lMºjú4,²)1ǹAb0'Ønôæ¶ÓZñ6‘ªÜhº¬°Ý‰´Ùï,nÒ=¤´_yrG¸#V#ëÿáð´>,–òË Nl„'l¨Î%÷ ê003ÞµÚ÷ƺ.§¡6©¨ÛÝ[j·_f–Ú8vˆ‘±òIŽwu¬½jóWÕ|;ã¤71Ķ­Ì;V%>d*Šv7¹'“É®×ÃPjú=‚_^}®c 7›±S‚8WŽÌj·:¾ þ?ÓÅç“ ­³Å¶5'cÂK©$s»õ«{ÁV·–¾Ò’æëí­ xÎÅQ@eõ<ÖÖ×ÑxúI›S‘"Mܰ§ú¥”f2qœwÏÞ2x—OôzëØ<æI,ìãŠ3Œ(²–$’C/Zé|1«K®h¶ŒÑˆæš2%QÐ:­lŽ+ˆñ”Óx†òúÕs{¥i6ºŒæI#èW"´|UwmâWÐôÛvßi5¤ºÍǼQ§îÁöf#òªšEÖ¯}¦ø?Ãú}ÓX¬úJÝÝÜFu‰P@$õ8àt­8[YðÖ¹m¥K©O§êv—O¹ ˰€ÇæeXzç²4}+^Ö<'6¯ªø‚þY®4Ù¶Ç *ªªò8 Ë69'±"¨êÖséÿt™"žk™eºÓçn! c§/çŠÕñTßîô{ØgÑìc´dÿIkk†’a9mŠñÆ»±Ó-øQ¬êZLÿðíÉítY´ß2++!'Ú®N3å‚ûTuÆ9¨|9.§«IãOÛ_êI 6Ö¯c-æå¸…¦V<†Û1žh›_Õ5¯ xcN‚âXµmZî+‰ŠË|ÀŽs…Ïã^8¸ò‹b<ñ‹ôÝŽ3ížµãqÜ¥„P6»¨ëšˆ’áL—÷FG³‘óÊá[ÊØG…Ç­më”:ψõ{ F VæÇLñCo§ 6;È›™äd*Iä¸ëÞ³¯/uø±ámÁsœ_Kª¶‹z¹åbµù˜ø_νZk‹G°š’ÒHL/ «!Á˜¯6“oð¿VžÚÆ(î.oÌrÉ™c»Âä÷Ø:zWSâhš{øgÃV–âßKÕuþÐÚp×>Td…‘ºäs““ŠŸ]Ò4k¾¼Ñmc´»ºÔ¾Ç4p «4 Œ[rŒ³¨$qY~ð¿‡/í|{w}§Ãq<šÎ«éT1UÆ~\ôÉ9ã ¬¤Ð4+O…–ÚªÙÅý¦¶ö×Bí€ó„ž`ÁrÜ=+Ù”’ªOp+Émm!Ôí5«½Âö·–·²É©êÓ.éH$1U»lR>\•àv¨-ìm5áM¶¢Ÿh…·!‚ÆÄíÀÚº}NÇNÓ¼{á³¶Šº°Õ!›ËP»ÑJƒŒdÕÍÜÝM Øx«Á ‹‹J4Åíäê=p= šõm:ÆÛK²´°¶]°ZÁ1dÆü4xì—Äz$ä%ýž·w$‘“ó2JC#ý­CÅ)½iáÛ+ssy5¤÷3²°Å² ùK ¾x+á安sà¨å¼Ž)>Ø.¤ÕP2òo3ÌÏqÓž•ËxvÙo¢øQ£mZHD¼ü‘ŒÂH>ƒü+±»H¢ø¥2(V—Ã×jäYúW#|Û¾x©Y‡ÒœvÿIWOãÛK{]/–ö‘¬PÃâ]$j0Ð <4úRø÷ÇhÅ ßÙÅsÆ1Î=³×ð®K]XñêÓÙ_ÛÚS+'Üó£óÈÇ¿Zê¾#êq“Áv‹q¸ŸÄút± –E',=¹ýiÖ¯oÿ w y<ºfžBgæaå¾H®kAšÚ~^ê ÀX]DŽä[‡A³qé’ ï]F³5µÿŽü#ƒ‰., Ô&¼hùÙ  UW#ûÍÓéIðêÂ7D‰ouVŽÿ½qÏàMðïQÓ,üáT¹ºŽ&¹ˆA‘€2>ãò®O'ØWkEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(®KGµ¹‹Æ~(¸kgHe¶±òæ*vÈBààô$cœU 6úûÁךÝî™}uÞ¥qgqk‘]fÁ(ØèÊx篭PŸCñÑgÕæ±g¿—ÄQkOc ‹uÁp£'ž¼UÛ½GYñ·á™m´;è4ûKÇyæ¹@¤1C—9Àî}x®«ÄÜ\hZÌñ´“K§Ü¤h½Y™{šçµ}3U¸ðžg£½ÔRitC@Œ»óÈû½ëGZ±¿ŸÄžº†{{V¿óäÄ{ãÂç¿'ŽõÉZè÷‹%üz—…dÕ5溜Ç}rTÛ²¹;X3µ@ãj®}ªþ›¡_ß|<“DÔ-$±¼µ‚T_0¯DÛ•Ô‚~\ô“k ä‹2ífÆ'‹ø•Ià7¦r+”Ð4%ñ¶±eáÇðõ´0ηAš0nËŒ(òãf\/\œ:TV6ÿ4½ëÂÖÚ"É4qÝG ûL‚I q÷·sŒmÆ{ÔƒGñ¶š<we§Å<Ú^‘ä^BÒªå¶QO<÷§kJ-;ÄšÞ£w¬j6+d Óg³ÓíÌŠÎÍ/Þw+Àè=ê Ï ë×"ðúŸÚc¶‰£.6†WR~nœ[$ÒuFïÃRÚ¢´v:ª\\8ÚdzóYƒÃÃé>6²e%Õ¯îç´ù² º(]Çd|WAá³­dÙ¦­h–·‘Æ"hã“xÂðp:õöõ¬¯øGõG½ñ¬§ÊXõ‹X!µmÄœ¬ENáŽ'ÔÕïÁ®Úh¶Vz½¬V÷‘¥º¬Ro ‘¨‰ÀÁ>œýj–¥¥kÿð”Yê¶PÛÍc6žl/®U‘ î, )ûqõ¬û-/â&…ht=1l&±C"ÚÞÍ#‰"‰ 4ab¹ÀÃŒ×S¢iPèše–›—[h‚=\õ$ýO5Hh·gÄ·³´mg.”¶f3÷‹ϵsCÐn4ß Ûèw3+Ê–È€ãæÏ#>™®yü%ã¿ E¢\ÝØ­Ý¥Ì k"«”1ÅŒäŸjѽҾ"j°=•Æ©aio2™í¢v©….ØõÁ¨ßž•e}Ứ!i‘é¯ Ò3)Uƒ)vzö4íÃºæ…¬êšæ¥­Cso}i»ßÏ)¡Î Øœç'¾k'ÂZf›âïë–3yúm´ì–¤Çö‰•LÌŸ–2=MzÄÝA5¼…‚KFÅI 1Áƒ\Cx'Å—ZxÐ/üD·ÕóúL‘/Ei ‘ìNÌÖ¦£áUu'Õ¼=©®Ÿq<1Ãu±y‘L#áX®ä!”qÝ:Šç¼]¡ÿÂ?à_=Þ¡%ååãG=ÕÔÜnbêUèª:+Q|¬Ý‹ ]SÄS^hö¯‚ÔÄŠÓy| –AËÆxïVn¼#¬.«¨êZ6½&žº—”n¢òR@Z1€È[¡#¯ TâøuäØêºgöÍÄ–·÷°^þõ¤YUr[¾üûâ?oGdðÞIe{cp.-®#•l`‚§‚ê+ xýõM/[ºñÔú•”¤îdADà ‹]ÝÎI÷é‹–žŠ×S×.ü²éÚÀv¸ÓWËó̹¦j‡ü+Ó4pé×Úåíæ… R–ìà ª»€”zÄšÝFŸ§jz‡ˆ ²n’Æ8dª$99PsøŸ¥rž²Ó5Ïk^0³†E²hÒÞÕäF_:B«æHªÀp8çšô:æáÑá—Ãfkƒe%ÃN[rïËæ`¸ÆxéÒ´õÍ NñŸØï7¨WYb–&Û$R/FFìEgé~ ÓôûøõK›ËÍJúÚ8%½“w’­÷¶ÝÎ3ïWôýNÓaÔà€ÈSQ»¸ºŸ{dî›ïcÛÒª¿„tI<:ž4éË E÷þ|#7®G¥n€v®E~x]fœ‰/EŒò´ÒiÂw¥˜äþìÁ<‘œ{UÝ;Á>Ó Òí¡´Z]Ô—6bIùLàŒö@<šÓ¹Ñt»½KOÕ¦Œµæž“¥»î8Q0¸Î@î+’´°›Äž4‡_¸Ò&³¶Ñì䶆K¥ óÊìFTdüŠ3ƒß5ÞV·àÏ ø†â;Ëû?ôÈÓb\Dì’é¹ ŸÏ5cBðLJ|5ÑéV‚3ïšBK<‡ý¦bIüë:÷áç‚/î§»žÀî¸I`AéÇZÒ‡FÑ-ôÿ올¡M;Ë1}œ(ØTõtç½fØxÀÚ^ϱ趱´r¤ÈÛet9RäñÛž*ôþðõΣ¯>ŸšŒQ˜’á”U ŒøŸÎžúƒ&žºKéöí§*…[b‹å€:aqŽ>”Ý'@ðþƒäéööq¹ËˆP.ï®:þ5bÓOÓ¬!kkKhàÜÇ€¥œåŽ©ëYמÒ®SF†ã¶¶ÒïRê¢E(ã““ÍmQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬­A¶ñ ªÙÜ]]AìÈ-¤)æ©*Ä ü+F ¶†+xP$Q"ÆŠ:*¨À%Rdãµ-QEQEBnìÅȳ3Çö£”C¸o(7c®3ÆjjL€@'“Ò–Š*²ê:sÞɧ-ÂØáYÞüÁà6= «5On’ÇJ‚i2!#sê@ëÇzt‘Å2ò‚2>´åtq”`Ã8È4G$R®øÜ:ò2§#Šåfñ>²ïâû{;[s>ŒöëoçIµ%ó1ÞÇŠèæ½´³¶7ÓÅoU.îà"“þÑÀ§Û]YÞB·³Ç4,2²FÀ©úÅAi¬h—óIogm<Ñç|qH¬Ë޹“M¼×4 `ê¸AÊýî}*†‹}âˆ5oÚhºL3Ÿí‡žY®&)Ü G%¸ç€zÖå¿V] 59,ožðéâÅX×¶í ÀÇ|ãÚžšÿ‰4ûë }zÂÚ+mBA SÛJ[Ê”ŽÃ*õèïØVö¥¨ZiVWW÷M¶ hZY|(íï\Ÿü$¾;‚ÚÓX¹Ñ!m2á¢Ým;ÝD’€»N8$ǯn]wÅ:­õý§‡-­<>_"{›Ö|<¸ÉTTçåîIëÚ©]xëQƒÃ÷šˆÓjvŠXÝZ—%wîØØ WI}âˆzmö™c5†,º¯š–â9$NO˜Hù€_@¹ÅZ´ñ‰-®µ3W†ÐÞZi§P·’ß~ÇNF7 ‚=zV}—ˆ>&_èÑx‚;=5`ùÆÓ2y“"ýâ­œ.@Ê‚­îjŶ¥i¨x¯KÕS)þ{[¨V‘NÒ _xÚúɵÛIô¸,ö<ÐXNË,c¦é€¬Þ ÎÖïµ½{Uð§¤Ü[@—©q%¯9…Ì'xrr1ÀnÎOJظñ¹©j¶©iÚu¦7Ù¤šèny¥,ïL("¹×Z)†‚’$ð®ß6%bÙ*I»Uya5Rê ÝcÆ^¿·Õ¯-¡¿Ñ从4þíFÂP‡†êÙÉô"»/ÜÝYx{Z¹µ•¢¸†ÆwŽEÆQ‚ðFr8úWªXê:¦»à ÛV½…ï,.Œ^^#e€Ë”<¾yÎG »¬Ë±«Ãâ=sSÐÖ9véR[¡û3G´a™‚0fÏPÄc¥z†ç»¹Ñ´é®¯ ¿™áî­¿ÕÍþÒý{û×â­FòÛÄ7‹¯ÞêúvˆCö 87”XœÊʬwg€úÔ‰ªj÷úo†ôK/-Üš½ÍÒVÝ@“ìð ÄÂL`Ž=3WÞßPð–µ ¤:¥í冩q%¥Ä7’*ÛK#¡ ÈÁŒ•À×7—VZÁ¹žYŒzÝühebÅU[€3ÐÂ¸Ë üCªèÞ¶þؼ†{ëýB;›…sæ:+6y9 ãŒt­él%º×lü¡{—a¥›ë†7ŸtÒHB«IûG$àJU‹^ø£xšöÛR–êÄA Ó£¸f’[ií?3d²òž•‡¨5ÆŸ wº Ÿ‰ÎµÊûçI^;ܲ#1P¬3Œ("½x¨b1‘“žÕãWK¿°Õ®£:Ö»©º–-R×ÌŠ™IÀˆ™…Ls€Àûô­…¿ñ$ÿ ¡º¾¹oô›™oL24ÿºF •ÇÞ=qï‚*ב‚¡ðÿF²¹i*KTÛ#3D¢vPúüƒ€}«§Öü3áß ë ¼Ñlb²˜ê¿d‘¡2Ç"6CŸâéÔäÖ{êðŸiP&ÒÁuM-ûÍwòû2v÷®÷º,^дÍ)on¢L‡—?‹d×x”²|^,¹,N>‘ Üv÷VÏW….-ôÝÚâÎÞQ”/+òm<0#ŠÇñž‹áÝ/ÅPxrlKyy¦®¡a„ŠÝf`§'š8nOâ—YÑõ‹xôi-ô Aš×S¶6×)tõÇ—Ä*[ÌgŸzÖÐtMÿÇ:»¼³†âx¥Ó£ŒÊ¡¶†„gÈç‰k£é÷ñ¦Œ/ Ó­¿á.•-|Üy!ƒ#,dd|¬Ü`zô­žóNñ†—Äž´‚íæ–ÖÃQÓe!72•ã¶Ò}ÀVwƒSÅ×Ú5í×öFr··w¦þkÙœJî®À‰Ê`ãnàWiðâ› éÍwotJ±KlìјáY‚“´qÓµQðäv×^3ñœ÷ª¯¨[½œ6ûÆLvÆ<¹ìÍ’qÞ¹}r+hì>*ÃbiÂ[3µ1°NU|ÜvÏMÞõêzM…†™akieAP¢ª µ]¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿ×÷ú(¢Š(¢Š(¢Š(¢Š+“ø³þçgà ë}|åÅP³Öt øÄñk—1Ù}¾hní§œíI£€@cÆS3šæKâ=#âÚL2úµ­Äi+$‹Ö%AX ÃŽr8«z…ï…µø­4»Oêz´×³Biné½rZ\§È9Áô®§Aÿ‘ÇÆœË=+œuýÙ¬;˜ä›Køœ¨¥Ûíràéž*{MJÃY×<{§ÈÓ[?RBê­Œª äõ¡àûh®SÆ–³FÞTÞ!¿Ãó+ªçíX> ƒT½×,ô»õc„-ç€HzK$¬V3øF*B©<1ãÈż¥›ÅUB1,¦Xù¸Ç¥uþ7YZÛDòây ëÚy!œ ýN;õ™gªIá C]µÔ4ûÙ`½Ôd¾³žÚ‘dó@Ê€íe?ÞÀ÷«§¸¹‡Ä“Onmå“ÄNÑ62…‘3ÈïGŒn³5¿ j²ÛÜMkm5êJmâg(e  ŸÒ­øN;ˆï¼YæÁ,JúÓº4Š@u1¯+ž£é\µÆ©_hWµ„òIcâ‰ïþËÊI²Òí¼?q-Ô¶B+[€Éäœ|®Íœ‚PW9­{? ÜZjºm«ÄÒYCágÓ¥¹`¾á‘Œç'¨ãñ®nßÓéÖ-¤ÿÂi{ªÅ¾(µH<‰sÒG$‡é÷† '½t:Ö•®éƒÁך~𗝤4«qoi²1ûض’ˆAÏôúÔè·š>§«N<3±k©N.£`bó!‘Ç̯æcåÏ ‚q“Åt>Óu ;Oskiisq;ÌÐY¢ªDÝR@ˆMRÖ,|C¦k«â ÍoÖ{E´»µ2o•²®¥¸ã¡U- ĺ¾­®Ýë–±ÚÙêZ@³#“sF ƒÀr8癉ã, Ñ ðΖ—Q€jíå˜ö/ü´òÊîÜGcßÚ·õÝ3ÄPj¾Ô´»8ï–Æ9íîc!dP71ÇpÐVUŽ‹âíPÕÖÓD±º–úúk˜µie‘dè$]¥ÎÎÁN¨¨´Ï xµ4_iwÛ‰tÇvò‰ B¬Ì\ pI<ùÖ³øoÄësã;« Èìî5G´{ ׿*aLà©'ŽüU ´ø‡RÑ.5m#M°þνŠî[¸d/,¦>B§È¸V=rÝ;Wg¬évúÞ™}¦\±]Û¼,êîGÒ¸ù4‰šŽ˜<7~Ú|vM Û\j0»™dˆpvÆTì:’äJÚ“Ãs/ˆt-JØÆ–:nqiå’w|ÛBãŒcžkKÄ®ªX[•]ZK eó´3.qž? çµ_x§g„®ty¬þÛ¢ÄÑJ·;¼·F ¨Ïã¥>ãKø‹is¨.Ÿya{§ÞÎÒªjak}Ô]¹=Æ+cÂÚ xkF³Ò–O4ÂÀÀgv,ÄÃ'ØVmö“ã‹]RòûCÔ-¥µ½-u0¬ ƒˆ©à7q޼Õð å¾nÖº‚G¯A¨Í©%ß—û£,¼:ìÏÜ#ŒnÏz½cáÿ^j¶:¿‰/-¤}>7¶ÖhÂ5wgbÄ’qÀïUÂ~.Ó¦Õm´mbÞßKÔ®æº;á-5»K÷ÂÁNO##CK¢øçIµð¥»j"VÐîo%wØGž'ÝÇÞ8#>ÿ…hkþÔo5 ]sD¿[Z w¶f’=ñÍíuÊž ƒUm< “[ëƒ_½mBóZ‰a¹•Wbƈ>Urq´óÔóQ7„|Y|ÖÖº¿‰ úU¼©!Š|¹gr²9»Us]›*º²°Ê° Šá ð³‹èIâIÓAÛ$iq ™cbNÏ7ž?à ã½\Ñüq¦¿†¤¸Õá´+{›xÿvª$IUÎ å@ükVoÛ\kÃ\–Rßñ+“NkrÆW}ÄŸå\쟯ZÎm|Izš«"Y…Mȧ¢ù¤n(oN3Šëô«Ò´ë =diVÒÚ(Î@ÉÇsXW~¹[ûÛýZ¹ÒÍû¼Š5GG|cz‡k‘ÔŽ½Á§Oàm_ Íᤚâ;yÝdšpÙšI7‡,ÌAÉb9ãéŠéël½Ô&°×5 =Fw¸º´·dÚÒ?Þeb¥—w}¤~Ë?‡=–ž4¨ï¯MŒZ¤¼LÊ|–·m W%Ië’O½t¦‹e«M¦MpÒ+i׋wÀ\)nûWªYéÞ2ñ¾Œ`·˜'‡Zw¾™ãuGpG—,o˜nã#ù¯F®zóÁºòx‰&ó¶ëÂ!y‡éå®Ñ³Ž8úÓõèÚËYÎò\ZÞYÆb‚êÖVIQUÈàƒî &àß iÚuþ›ä5Ì:ƒ3^½Ë’á˜`—cÎ}:cµT°ðeyi{5ÅõóÙÖi{;H–ç¦QO¡9"¶¬ô]2ÂÿSÔ­Ñ–ëRhZå‹Ä»Wð8ôªoá Kk«YKf$·Õ®šîí˜ïãæñŒ cªúOü=¤^G¨#]]]B¬°Iy<’ù*ÝBbztϽG©|>ð†©uqw<#]×QÃ4‰Áõ‘‚“ë‘ÍtvööÖÅmmÅ(8ÐaUG@¥cë^ðÆ¿qÝý©7Q§–³Å#Ç&ßî–FRG±&¦_ xe4‰4°Œi’)@3‡ÉÉ$ç$“É9Ͻk"$j¨£  =¥¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š)U†884Émí§ÛçD’lm˸ƒê3O àc=i« Ìé«7Þ Ÿ­;$ã“ÖŒxëÖ€@` ½Ké-gKR¦B"’E,ªÞ¥A\ÄVo†´Э®>Ñqö«ûË—º¼¸Û·Ì‘½8`šÚ¢¹«ÝÅÂþîëJñ‘otPµ½Ì>`„‚b;”ŒúŒö­DƒA²6©+Ï,“Iqq<˜Ý4²³qÏ è+RŠ(¢Š(¢¢º·ŽîÞ{i 4Oê TN›o£éözm»3CiBŒçæ!F9Æ9ü*åQEQHH“ŠZ(¢Š(¢¡žêÎÔÄ.&HŒÒ,Qï`7¹è£=Iô¤‚òÊåî#‚xå{y<¹•c8lt8=êz*­ž¥¦jÑÞYÝE=´ŒU%FXƒ‚úñV¨ªš–§¦èö’ßj¬±mß#tˆó&­ÔPÜ[\y† RO-Ìo°ƒµ‡PqÜT´QEGMÖ4ÍY¯–ÊS!±»’Î|©dLdrzõz«E§ÏuseÄouj#3ĤnŒH2»‡lö«4VrëZ{kh`¿Ûc²[Â6ü¾[1^¾¹­(ªZž«¦hÐ-ÕüÂZh¡ A?<µGõ5vŠ+=õ:=Z™¾Û-£Ý¢í;LjÁOÍÓ95¡EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÑ÷ú(¢Š(¢Š(¢Š(¢Š)“M¼rM4‹Q©gv8 RIíYg‹|'¬N-´ýN¦`J <¸JçLÖE—4ÝCU×´˜¦‡Ì³P- î&R#,ùcå#j â?…ßLÒί«@º„°Gö ìWnÌ@*¿Bº[[Ñ´;u»Ô®’Y‚©9%‰ì d“ô¡±ñ7‡5+KËÛKÔ’ 0æç‚-£'rqíÏjM#Äþ×¥’.ì\˜âIY‘[h ÓæÆ3ê3‘ÜSµŸøÃÂÜê·kl. ˆ‹†(2zøzö¨.|_áË=>×R¸šD†íŠÛ§”þl¤vXÂï?÷ÍK¥øŸÃúÄ7SZÜmû ÍÊL­Â1œº¸V¢³í¼á;«‹h³Ä—rí§š˜ôì öçžÙª¶^2iüSªhÒE7Ù`Š1-å]s¼³cON=‰ øïú֛©¾™uwqi³Ü=ê@ûmöö€Ç]¼ŸZЛÄúF“§hò\O5Ü×ðÇöTŽ2f¹;$ œž€V]ÿ¬¦Ñu«6¨õ+öÉm,Í·gRUÝðwÎH§Xø’-NK<š…œ÷¢ä-»F.b—'hê˜<š¿wãM: ›Ë[[ëö²m·/iä¸Êç#,3’qE÷Ž|7e§éz¦é§´Ô¥@Сc¸ƒÁ^¹ÈÇLçŒSôßÚ_ê铨^Ø]M šuQ*¯P¤Èî:ÖÝÕÌ6vóÝLq<®}ŒšáÚîøE†±«\ߣjwö÷Am…$u¢äà.ÜnõÉõ­‹ÿ¥®©u£ZiW·×ÐG›a ´‡ÉfeøöÍ>ËÆZLú^£ª]Å5ök´wN£Ì€r1‚sUSÆí Ö›«£]éÖÚœ« ­ÄÅóî«…bT·lçðª:gˆ?°ô½vúéf¹Dñ$ö껲T;ªŒn=sŠéõ­j-û3Ì…åûv£’í#ä2g sØb²®¼Yª=åí¶‹¡Í©Ca'•s:ʈ¡ñ’©»ïïÓž3\®}§¾ƒisuk<ñÜxÀU¤*Ñ;É•fäçouÉÍt÷/ÔÛ\Ô´ 7E’îâÉ ‘¥2ªÇ¶EÏ$äƒè0sÏ¥xæ×ûQÔo¬¥¶ºÓîÍ”Ö`†f›ª„`ÙbÀÅsÆ z{ ä­üGã­jï[µÑì4øÓM¿š×í29Y6ôUs»×œz"ñåÝÆ§ÞC§©Öo¯ŸNŠÏÈ'F!‰l}ÁŒôéSE¯x¿HÔ´Ë?[Ù5¶§)·‚æÈ¾"›Uu~ÍØƒ×µgøþŸíϋֲ0 ÿô+ÌÝæìÙ¸ãn:çœÖ—<$OoXã÷«>]é–ž>½³³´†ãN¿MŒ##Î%æ—?ˆã¥â‰ÚPÑo%‡L’=Zâ;E³@ÖòJ¹LÉ’âùÚµ´ÝSŶ^!E×%³ºŠòÆ[«ym£d(ѰX3>F#é\n¡6³¬x+ב}†Ñ¶41Áû± ¸+(0å‡9õÓj~ ×ú-u:ÊêÚÎ9¯ïç@3ž(ÙÀÉ',ØâªÙxúæÆ×Ķú…Ŧ£y£[Å<7„ºYx@@-µƒpØ$sYž;µø‹…î®5JÒæüujmò78Ç–û‰88päúTرjz‡Ùð%g‘¶ˆÕ˜ ’q“Oð冣¦|AÕm.ïå¾TÐa6ÒÏ1b2ýÖ sÎ3ŒV—Ä«½rÓMÒWG¼{K»rÊØJ¸é!#õ­SÕlõoÜhz•¾µ{Î¥oa{ä›ÖEœãrŒ ¬§ž01ÅQÔî,.5ÍZ-K_Õ..#˜%­–Œ&Ūã3ËR7“×y zV&¯.¡â?‡¡©_]‹¤Õ`™[c87!p¼oP8=5¯®_Û[ëpø^æëZ:^›¦C3‹!<“ÜÉ+<Ù# ûTQ’zñP[꺥¾Ÿã[A¬dáÍucsÉ$2`ȲHpW’G­Eªè÷ZW!ñXÖu)5È,m/áî$ØKmù yÙ·®OrkRÿAÓ¯~#è÷5Áiti¯Y¤ó•$±÷ÍU…µ‡×<"ÖÒ[+?…Sì¦ì1 !ÚdÛ‚>m»síOº·»:ψî.µI/cðÍÄW6Ö¸8<£;a»¨ƒjëü 0xoBH":ÝÈ»($ýIëYž)†)¼Eà¯0Qyvv°î#È?â$Õׯú[[_ÛY4ºD±ÛIupÎ$ÌŠƒzaˆÁêx*€·‰õO¯k1_¬–ßPŽÆÕÓlNsË“.p8¨%›XÐô½.ê bËÄKh¶Ö·q/žA`Ëe<ºû¦x®Ž ›x¼k¯C,¨6‘hbF8gÚ[8ÞÕ›¢¬ ð²\°è÷ÌÌ;çvNj-6ê×M×<'{©L‘YÜøR+kY¤ ˜mf<ËÓ֮뿇u›o®›n²Ík¢ÉÆ£R”b#I^§°ÍS·¾Óï¯~Émqª°ÝFLl ¶Ã*qÜw«^×tNÔ4ÝcP·µÔ,u ³v&uV“s9 ‚1Ö±tôhí¼!q4^Lwþ*¸»¶‰º¬r†)Çzþ5ÕëìƒÅþ « Soá­_Ã5LJµ¨¢Ï˜ÖãþS\®¹so'ÃÍ*à0˜´ž{½?:ÖÒO|T¼nznÕÎj°O<~8kxÚv´Õìn¤…ÌëV üsï[ÿðžøV¹Òì´-š­ÅÕÂQs‹XÇ,îvœì 5ÎÞÃvþñcÁ²´&šà¤c,ˈ[éW¶&ŠàêWV…bvûTrüÃaU9lðEdZ­ÕLJì$6“ÆïãX¦120dLœŒg×¥uÚJ<_ã&h]Q£ÒöÈAÚø³ƒßëºÒ5yãñT¶–ÒKqiâk}J(ˆÇž#U$.p=é¿g<ÛHù#\åŽHà{V© ø†};â1Ø»¾£uÙ¨eÌÀ"‚FNNø­¯ézµü^ÖÞcZkV7 ýÜhãÉÇ·>Õ5Kã QŽÜµœmÜRÍ‘…f#Ï>À×2<;âh<§Y.ž_T²ÔðÚoP_mÁlÉ^AÏZŸRÑõVÕ#ñ#øbIoì!ŠòÂfˆËm$} ùNGæ,Õµ­Äv÷¶6z7ö’"Y[["f!¤tqfäŽ@[ÄpüRñ>.Œú³Ÿ+í„+>Æ÷` Œž~l` W¥Ž‚¼çþoÜÇâÍKX ·»ÔeÕ4ûÿ0Þ–RªÈ@㓟ÀÕ½NËǾ-ŽRÓmôÝ;íI{p³ï3¤g;cP ÄucÀí]jú‡ü%¢ùP›%Ò…Ø‘Ióü͸aÐ:zàúSÌ:í`H8õ¬û oˆšŽ§g>¨–z^ŸhK<6Žd{¦Æ,È»S¿Öm÷€õ{­/Äv©-¨š÷Ä?Úöªà˜œ¤$Ã9Æ}i5} âVºt‹¹—Kµm'P‚î+$yedêZM£Àž¼šÔÿ„Ä0ø¯RÔ#6’躽¤0ß$…„ÈbB£f9ç$V|ø¦iëáÝ3QÓÓM ÷î$ûL0öGÊ]Gî:UíCºõ­î›¬hñ¶¥m`¶?oÜËw9Ùy9õ£@ðlj­|I}â=fþÞy.ôô¶ò`F ÖÈ ¸’F=prO_â¤rM¤i0E9·šmNŽ)€ÉÙ°:uëS'‡µkTð§öŸ„O…šì¡6Z}§nyŒ›nG\tÍ3Wð¾«w¬èzΛªýŽk^ÚáZ ââe%y#iã¯5@ø+Ķ«{c¥x‘í´›¹%s+ÉšrÂ9 éÏVÅ]þÉÕt{¿éš4³&‘eñ^¡ UãHð…ØŒîÝŒcçÒºª(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š* Û+-FÚk;ÈR{iФ‘¸Ê°=ˆ¬}/Á~Ñî’òÒÕŒñ©XZYü FMìÛGÓ<Þð寭ý¹% :‡’a2†a¹H#е¤Å¦c%º?ìÆÛÉÉÇ–F ç9éïPßøsÃÚŒmå”rÚ[ª,(s˜ÂŒ ¤Gpi4ß xsH³¸ÓìlcŠÖãwžœŸ3pÁÜNIãŽMh[[[YÁ µ¼b8!c¢ªŒ>•öSÚ\ÏI=£;Û»c,0JýG©¤húÕ¿Ùu;H® Ü$ªw‡éI¦hÚ.llôÛ(m­É$Ç€ =Ï©úÕ;?x;N¼öz=¤c8–8ÔÏ\`qŸj·q¢hwWÖúÅŒ2_[¡H§eÐÀþ54z~› §Ø#¶‰,ü³lÚz½0hŸNÓ.­–ÎâÖm(XQ·¦ãµº~eÙmmb†ßŸÝF /=xÔvºF‹d°¥­¼+»Ä#FÆa‚W‚G\RÜé:5ìÑÜ]XÛÏ«a5¤³YLûJ\@pèTä}G¨î+ x†òîÊëBöÞÆà\Ao +´‹÷ZC–$©äcºXìl⺸½HÿÒ'HÒG$äªghö'¦:ÕŠ(¢Š(¢Š(¢Š(¢Š(ã¥! IÀM.w2@çÖ†d@Y˜*ޤô¥¢Š(¢Š* «+å.àŽeŠT™ŠWC•ažã±©è¢Š(¢Š(¢ŠË›ÄZ,z”“0¸Óì…íÂìo–#žAÆCÀÉö«–¶º•¥­õ³·¹…&ˆA*ã# àÄUŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÔ÷ú(¢Š(¢Š(¢Š(¢Š*ž­©Ùè¶Z•áaom’MŠIÀô­Fë*$‹÷]C úu“âMm|=¤Þj¾A¸û0Œ˜”à¶æ ן_JÔÞ¡CŒóK¹q»#´‚H‹ ’¹äRG4nò¤WÚpvp}éwg‹ “Ʋ·ÝBÀ1ú {Ë duRA Ô¿•ců™ü@šL+–¯¥}¹nòIó6àÆ=óZÂâÙŒ¡eBaâLòqž}?†ÏTÒ5"ØÞÁrcûâ¶ýpM[¨nn¬ì¡{‹¹£‚ûÒHÀ(ú“PiúÆ‹«+>}Ò§Þ0º¶>¸&ª\x³Áö¾OŸ­XÇç#Ý2|Ø$qϨ?•^½Ô´Í:Ù¯/n¢·µP –FyéÉâ¹ë_[êž"Óìt«»[½6ãN¸äˆîa"0p ŒÕïjÚ†‰¢Ü_Ø„3Ç-º %HyOŽÇŽjÅ­å̚Υh÷–¯ 0[¼véŸ:"ÙÉ~q†þ*ãµâéãU·ûKKå*îà¿÷C}ÝÞÙϵK¬x£ÃZE§|I(ÊG‚\Ž™Ú œ{ã$ž"ðìz`ÖZþìÓ³!²Ÿ3sЧgã__ß&k©Å%Ô„ˆ× þãþÔšŸ‹ü-£Ï-­åèYâÍ•YŒkêÛAÇ㊳6¿ A§&¯%ìBÂEVŽ`rwM¸É$úš‡GñG‡õÙ§·±¸cs ðÊŽ’=ö¸Sp+NêæÖÊ ®®dX …IލêMsÖ~>ðõͽªMÁ)ž{±™$VÑ<†%õ}€ã=³Éô¨“Ç^“J¼Öã»-§Ú\-¼²„l$tÎ9âžž3ðëi·Z¼46L"Ye‰×Ï-Œ˜18Òé~.Òu;µÓÚ »+Éž¯"hÌʽJgƒŽã9ö¨5i7w6pÙßßµ¡ÅÓÙÂ] 8θ¨#ÒŸ¨xçÃv›¦êï3Íc¨Ì°Á$[,Àž@ç¶1‚sÆ*ü,}nVÂ}7SƒP•U­íæN§<¦ ç$b´´i­®¥q"MbÚa"ö+µÚð€3“É#‘‚k=> é¹·šëLÔm4Û™!¿ž !;¾é?1e زµcTñ­®ŸªË¢A¦ß^ê+L±Û¢á•³Îæeûˆê1šÉÖ|s=φ5ËÍ2ÊöÛQ±g·¸‰Ö1%›mϘÁ‰R sÆìúUËÜG¥ès¤Ý¶«©â;{OÝï—j‚ÒhNüœûU›-nÿkh¶—Zf£¿ï"f¶?HÝ>„{TÞ Önµ)…áúÂêk ¢;É ÆàCñ©õÿ í--¬ä¿Ô¯ ýšÖ"`ƒ,Ìͨõ?•SÓüYu5î›w£Mi­Ajn¢´y­Âtù$/^@Åbü*ÓÙj唩=åÌ%ܳï3•‘ÆÐ¹;Bt3]<úÿÙüEg ËjBÞYKq Îá†xÏÌ›q×ç5•¥øúÃR‡Å‹chO/%ÇïÕ7ÃŽ u®lkÚäž.³¾°Ñ Ú†£á[y»L! )cæ9^ÞÊN{VÕ߈ÛSÑ|aa®há.t»&7V‹6Rx䌲í 6û ŠžOÜZÚøwKдµŸQ¿Ó£ž+g“lvЪŽd|1Àà”’kÅšþ¯©x_ÆN³¥‹BÊÒÖßèì0ÈåW¡ Ž+Lø»ÆZl:n¥ªè–öÚ5ÌÐ@Øœ›ˆD¤w]¡qê=kº”Ê"Ä¡¤Å Ç®FßÇ!üyâk‹e†æÒ;„šØ¶vÏO“Λ'‰¼Y{u¤XÚÿjÃaou©IpÏä[4£„Fæcϧñ–µo§xš+Û8"×4Ka;"³&F£©á°qÈêz¿â?_ioÛÅ\ {YBI™•”„3Ç5ÓŽ@5Â]kߌ¶¤–úngi4Ëo þÿ2t‹ø‹¡C›ã~K\é|qâÚbŽØ‰9Ü;)äü¼Vï5¿[>›áôžÀëóÚËwurêÂÞ•°MÛ‰9À‡BN*m_Ö¶'ðö·-¥Å×ÙåµÍ !e;X2Ø`Ú ƒRxû_Ö¼9¥ZÝé0Å5Ôºµ°Ž\íq!Æ2Á'ŒóJÏŸSñ߆nô«rêÒûOÔ/"³`ˆ£ZÉ)Â%›rgƒœþÕVçÄÚÆ³ªG§ø‡NÑm4û·´Ap¨òÜIß,×jg“ŒæªKãï]hzTúrY¶¬þ#-È´À7̤…<üqVüK­ø›Ã6úŸ¨kÂÚ…Äéu¬½¸òáÀ&v‚Ýbx¤‹ÄÞ Ð´}wT¿¿´ÖôûX#“O¼·Ú¦gs·ËuBGŽGcÒ›¨‰^Óá!¼Ö¡»û8I¯4ÿ³ªÆ#'ç¸;²£¡$çŠ}Þ£ã cÅÇHÒuD³Òÿ± ½‘ü¥iv l'Œ°õ p*]Uñ|SxÇDžæ=FÿGX^ÊâU‰<øË(“nÊG$\µ÷‹5 ++Äñ¼Zž¨.­c»ÓãHšæ0 ªQw.3Á/Î? ÜÕÀ&ñ¶>ñð|gŒ”ËOXÒm~]¥É=圑1æK16qž£k Óu OUñn²±Ü²éZM¼VfÙ.$ÖÎ3•c5ÔÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢Š+–ø‹gkwámXÎ¥¾Ï ž<12ôÎÏÐä{W?{áÛ¨x+F·žæÞÂK[é&Ž)¤@UX‚wgûôô©|G§øeu]/J/oíí4à°hÖŠÅPnÀ–Fܽ¾Q¸úŸZdzÔõ=KñêÙÛÜØGj¶mgkrášÔλI3ŒgæÆãW|càKð•Äö¦E»·Ž6{–‘‹NY—vü’ãÏNµ.¿;ê~&¸±»Ðîõ‹+  v°4b0ò‚KÈããå{ôÍf][j¶ºmÛK¹Ó´Wµ·šÖÞæDc–ýà@&ðq=*߈üá>Û­mnÑÝÝê¶vw7hì&&S¿{ƒ¸îúÖ­¾¢økÆÚlzE¤v6÷zE×Úµ$1²Hdz×2úf—{¡kiÞ“TŽàÝÜ_QxÑänH‘x/…è¿*֥ƛgâøe¨¿hŽ]:v—q9ˆPœž¤9õ£Åo¯i>"þ²ŒÎ<4ꪘLk)$ªãöQêjôš>…©x}ê(#Ôš„—mÿR³Ë1êYÈÃu=±Ž*½€µ²ñ&ˆu ýŒÐZÝXH† ÉNV@¡N;®åë^“\Æ›qq YK§É©^µÜ“ÚZo ׿iKdmP}=«/I·Õ!ñì_YXÙM6…8hìØ± J¸.J¦}¾Zoƒ4-¼}+XÂÏyöó;2Œ¾Öe‘Ø ­ ¯eø}k¨¨’Þ="imÕùS<`(ú•^ž•±%¦™kñÊKhãŽyôiÍÀ@l8Á8ïW~#|/¨a¶‘%©Ï¦%ZÃÖÚî-SǯjHŸûÙ¯Pl‘ïZW–Þ‡Á6qê!FŠ-mJ´@î,q´®Ï›q>œÖe‡ü%¯â¶–4ï=&·W7¢O0E³äÛ·øzþ9¬]RÓþ)_™®¬çŽmfÔË¢¸Š)w p c9ã8È®¿ÇpÅ ·†J±¬>#ÓÚ»ˆÀªFÃV]sÄ7žÖ-LÍ•CC—PÓÓ[µ¹ñŒZ<öÚ•ÛÜ[Ë %¾vÜ3òÁ{S ‚ÒÀͳO ç‹#¸‰®£Tfß½²'æ_­uwžOü'úH$yŸØWeAÿ®‹È®__²»Õ%ø­ed —ßJ`‰Ë6Ø÷ǩީj—:.©¤ZÛjzªê~T1éÖÉkçHIò”®Þù#ë]Ž’©5äÜKOëט~µ‡©Ò|ZŽ<±V­µzçÈ$þ4ÝSXð6«¡xR{ˉ㳠"W³r¿`™eY‡MÝAsZÕoî5½BÆÓ\}wB†ÍdK¹f)K`F$Pñ’zâ®ü>BïâËÅ$Ásâ;¶ˆö`¸Ç#ð¦xŽößÃ~)ÓuýD:é’é’ØI:«2ÀûÃØºt¦éº·‹hÑFU–Yˆù° Næ­ü4/†më)ûeÿ ?ëß±¨~#-õ•ž›â>ݧ¼ÑïÍ£c€'¸í\~¡á­bÁ<7¤ÚÁ)]Ò­4ýMÕ[´r‰˜Î9Åv‘A:|A‘Ò£Ã)ð§`a7wLãµej¶×¯¨üJÙi1Y´+Ql$LÂ'NHè@üª מÔ<=â[›;™tù|5›t"šKW\8,ƒ-ƒÈ8S|C«x‹ÅžñwÙô™ãÒþÉvHœ\ܾà]‚vŽß.MløþÒúëÂñ[ÛA,³­;)–l <Øëé]y>¡£ÞŸ·†QGöF©ˆ&øD@‡R=š޺“Tð§Šu}U´Û»ý3Z‚Ó/hÞ  pËv°ç<óUÓG×¼Fž1Õ&´{&Õ4å°Ó ¸À")ùœq¹À¬Oê>)ñƒFaá]E.Ö Xî¼äUDÏ–K|Ù#Œœ×® íŽ+È4ýõRòßUð„Ú§Š[€u½lÛÉÚêìÇj•S#Ò´´-+Ämkðé%Ò¦´{‹˜¯|Ý¿»"¡†Ǧ?*ÒñŸ†Vç[Óü@Ú$ZݼvrY]Yº¡p¥·+Æ H9dpx©<¢´:•椞²Ðl¼ ´KbêBNY°>¤Ó~*ý»ûJ6; Ø×ôß Hp¥÷ñ“鞴˵ñ‡‹îô‹+í ô½>ÎúÛÉfš624'*‘„$N2NÞ;VyðÍþ¨k<%i¯[ßßM}opÆ$M/%$ópB3Çj´|)â_ìß $–ö‹woâ85+Èí#ŠÀl… ÛFzšÞñJx´Ka>‘k¡d¾j_éÓS2°YY_C€k”µøw«ÿÂK-Æ›©a ´Vv쬱¾ñ3írnõ¡iñ'ÄÚpðþ¥§ZØÃ)Ž;ÛøçÞ$H-å&ÐA|àõ¹g¡^ZxªçSTŒií£Ágæ ŽN1Ž˜ïšÈÕ<¬êw>h ]´±†ÒE'p0¡ c¡î8ÚöÀ­MS@´ÕSIIf‘?³/­ï#+¢ÙƒžqŠ’çD³ºÕlõiüÛkiíÖ0FÆYqœŒuãÖ¹ØþØ,§>¯¨¾ŠwmÓ¼À#PÇ;wö/ŠÓÓ¼#c§uåÍÃèËp–Í+.JÊ6á°£;GõÍhÈë\Ý'Ú…‰²ÛŸ“a}ÙÇ®}ë=¼ =ž©§°”Új_jh·`C'1cyêy¤Ó|ecyýÆ¡¨On¬-þÙ.到Á*0â8ÉÍXðö•{¦6´×3-æ­=Ô*ÒØŒ“Ð p3Š~½áÍ7Ä mö‰'‚{Y ÛÜ[9Ic$`á‡b:ä¥iàÙ_Zj‘½ÓjÝró9yƒ m“Êúì+ONÑ4½/N:U²0´>wÊÌIýá%¹'=ê”þðÝÆ“e£I ýšËfa# b#º¸;³øÑ¥ø;ÃzEÜz…´25òDñ‰ew‘Ãã;‹1ÏAŒôíZZ¦•§kVrØjy¶²”.™#;X0äzŠ#ÒôØïnu„ «˜c†gÉù•3Œã¿¥d[xÁ–—Q]C§€ÐÊe… 1Ž7Îr¨IPsè*Ö¯á_ ë³Gq¨Z ' k*³+í=A*A#ØÔ§Ã~:Zh¿aŒi©³la~VÜ=úóÖ­ÞéÚ~¢°-ä 2ÁqÄA¿†D9Vâ³5_xG[ººŽ›·ABy Àt TŒïš»6‡¡\iãI–ÂÓÕUVÜ ØéÓŠIðï‡t/4év[´ßëÌÿV9'ñ5~âÞÞê-î#Ya•J:8XÄÅ‹Á>‚ÚâÎ=Émîqç'”¸|ŒñÛµdêÖ¾#Kɼ7§ë6*lNQÇ*þ``FzmÇÒ´|;á×¶Ó®ãÖ¡·šçP½{Û¨•wD¬ÄmQ‘ÎÐ:×A40\FðÍÉŠUÑÀ!ìAªzv‰¡iA¦Ø[Úù‡/䢮ﮢ÷DÐu)cžûO¶¹š/¸òƬËô$·%½´ÞW›?”áãÜØÃ¡†ƒUœÆ¦eRŠø‚ž ¸4«Jï"¢‡|o`9ltÉö¨£°Ó¡žK¨­bK‰8yUfúœf§Ú‹ˆžæ“d7Ê>½Ç_­5mí’?%"E‹¦ÀßÊ¢»·¸k+ˆ,dKyž'X_nV6#ƒ´œ}EC£iVš&i¦Ûª·nOV'’ÇÝ&¯ ŒƒÔP (¢Š(¢Š+ŸÐ¼,ºEõþ©s¨\j:…â¤Fk£Ë3„@ª çŽMtQEQEfëZ¯Ámo{¿e½äqìlð¶åü3ZTQH!X§-QQÇ=´¯,qÊŽñ0YH% Áô5%eêþðî¼örj¶1]5›—ƒÌ N3ÇCÐuÍ^†îÎáçŠ ã’KwÙ2£clg CZšŠ«¥¥Î·m ÔN¶rõ.ãOj×£O±Õ!šéƒA‘æmë°ÀI¥Õû¾•Ój?,ào.™§Ï©z ¥³S”á·޼žØªÐøóÄß]è‘ø^oí«eId„Ï’"`0ÞoLž˜ÛQjÞ&Òu }·RÒæßk­[Ú\Y¬¸hnU}z…È>ôËoÆ1ü@¹°¶ÓüëEÑÒ¹ „y§÷»vŸ˜ýÜcØá:¼„qž“Pé~$ÖWV“A׬¢‚øÚ5Ý´ÖîZ„S†p2÷ñÎkž°ñ·Ä]WÃßð“Úè¶Xà ³IÓ?™2ÅÆ<.N7ŸO^ÿJÔ!Õ´ëF+å´W¨ €kÎô›ŸŸxÞÏA¶²5 yf¹»gÚ ‰@@¨2O¾áŠ×ƒÇ·Qéz“_Ø*ë–ŒzcZFÿ$ÓHG–Q!ò2=i[Ä~1Ðî´Ãâôéloîã´-dϾÞIOÉÿy{0sÚ²´ƒã©ßéz‚êFdu´VIm™p$“*zs¶°u%Ô_Ã?…”±E·X¿ów¡;£òÆà0W {Ÿ¡¯Bð¶¡i¡éÐÞͲ©‚=ˆ·srSž}dI©ø«Ä¾«§è·0éö:[$2Ý<~cË1Šª’ *Ž 99é\ߊ5Oê~ñN™¨MŽq ]"ŸL½ÐþÇâçÖ&»ÔmínàhÐÂË#mbŒˆ6•=>søÖ÷ˆµÝ xîÚâä¼ö‹Æ–Ì«·#j(Àä+ñÈ>õ¦»â+/ú_ÛˆÖe×%²½”ÜRÕØÈq·2дºÅâbú_ÅRÙ•™VÆËL$².82€ŒK1ìxÇJ¯&¹â{ï øzâ A¢Ô.u´³7@,»ÝFõÆ; Ãð«~ ½“Ã+¢èRë—Šº„×3]_¸ß8HÀ%P*œn$…àgÍY[XéÚn«}ªi×°Oç µvky# ªðÝ0OZôJãüs þÜ»×56ÔÒÎââÞU¸p"òó´mRtçpb}kU'Ôþögi’D0äa£;'EÕoKŸMŸQøy&œgû°Ô"‰nd 9õÇZ¡yw/…¬¼_á«0÷1¾–[ó´…ÿu³^“¤éÐiu–Ÿ]¬ Ç}£¯ã\—†tïWñÍͤRÜ6¢öåAýÞÜàg×'5m¢èéð³Rhí!ó%µ»•ŸhÉtv sþÎ9­{˃y¬hk¦iqßëPè‰0¸»”¬6ñJ@'6]½”w¬UP¾(­é³[££[´¢È-[Ê“®yÝëœVŽ¿cgað¸-…º ûŸ6î]’GrzÕÏ}ªÏÄÅ·ˆÖ&ñ%ÄQÜ%ÂR[cüg ¸ uês\äðÚMá)àš5h[Æo«Ø†Ÿó»Çž ‘#Uhõè"hÆÕt`@ö¨|>~*7rÄ·‰­ÞµñŒªçäÝŸáÛÓðÁ"ºˆ59¼Má¨5OZ\^C<·ÁihÁ¶mù·0•ö©dðkºÕ´øµ]:ûO—î][É >›†3øW[Ku­X\ê÷æóÁÚmŒKž¾}¼¥¥üJ¨ëZS“ªxGTñ<°³Ûj †þdÆY¬íå ¹€ ßJè¼w¬hÚ΋™¥]Áy¨^Z-¢@êÌpÛø$€ Oj¹áõ‡þO²…2ô Ç¿ú³Åq_ÙÚ¤Wþ ñL2›»}Ä×2¶›€T®™ ÿ¦H+Ó>µëÖÖZ¥µõœ¢[kˆ–Xz2°â¼âmr;oÄ‘ÞøŽ/Ãcv±!H–{• ‘žEbwÕéÞ±t[¿ÏàÍn OíwVQøŽVžE8¹µ8)<c©8Ï^"·t}VæÓÄZ.›¥xœx†Âé&iã#Ëj2$2¦8'ææ½2°|_¨ëÚF‘-þ‘h·“[Ëͳߟ`|Øé×èkÏ|E«| ×tÛ™má‚]Vh˜Û¥¬,·^q/ÝPsŸ^*ýä÷ž†ºÏ‰^D[;;›kû‡Éò¤š% æ$ŒëVtý{NñÄîtá$¶qørxÖࣄùªNÒ@ÈÝë;Àž<ðþá+ :ù."Ô¡†o&ÐÃ&û]Š˜þ^wtúÕIÔ4mCáµÜl'‡MÕZqŽ#i¶ÒzpN+¡ÒQ—Çž(v€m7MÚÄ7t=+’º·»} Äë¬ÅÇŽ„U,¢hÉ`1È÷é]ýÜ:WÄk9G©hIc©2™DŶ’ ãçœzæÆóXмmᘭ®WU·×nu(У"Ìžpu 'L°aïD¶^ÖdÓôý7D×/.§ž#sü÷©²)Ë4…Ûi*z»'½tVÚ„¾ ×{I"¾:Mä^C >æßS]ƒmî­<1áûk¨Þ;ˆt»XäGee@#ÔW)e{â? x—ÅÓÍáûÛ½.úî `žÕU˜¸‰AùIiéžÄU;¯kZö•­j—šz GPÖ­µ8ôéØa¢¶V)ÈË.sÉ<÷¦Øè:f¡©iCIð bCr³^ÝjF<µNvĉ,OCÐWYá?R³Õü_=͹ŠÍR9mØ‘‰DªHÁ'¨ïŠå/<9â‡Ò5˜—OybO}5šÈ¯m ä9ë‚FqM}#X]WÃz¦àµÓ´ý>ðùÑ)nd!\á[nÄï—$öV´¾ñš'Ä 5µÿHÔïo$²RËûÕtP§9ã'×Úé‘M…Œ3.Ùc¶‰sœ0Q‘šäÚÛÅ^Ö5‹/JþÔÓõi’è¢Ê¨ðMŒ6wpU¸<=*×…—©-®­¦X%‘¢Ýñ€2®›ÆFFŠ“Fð¦¥e¯Mâ GV7·SX}‘Fæ òàœއ<äæµƒζšÄ’’M–ÄÀ@ÚÁØ19ëÛÏêKkýŽŠºMö—q$÷/'uw+:IFÈ ½€J‚?E,ÚmÖ§¬ê÷}ÌsÂÒ²;Už2zñÖ¬ßx>ÚâöæþÇQ½Óf»Áº®Ì@q6Æ NÞðûhrxÊqg %˜1ó “åºïÏ9ª1x JûM…åæ¡¨^ÜØÍ°Iq1;vvÀ`œÆN:Ó®¼ ¥Íwwum¨j6+y!–æ IÊG#ž¬F wÁ­|1¡ÛË¢ËMö<2ÃhªÇj¬‹´äwãÖ¹óhž&ñ}ói³Ãk¢C(3\FTO1l(PzªrÙõÅwFÃHÓôÙoæ¶VW¾¸7å‰Ë‘Ž3ÓðªñøoD‹E¤N4çŠHŠomÛd$Ÿ›9ê}j®§à¿ jÆÉçŠh¦³€A ¶óI‚1ü%‘”‘õ&¢ƒÀ> ¶k†‚ÄÇö›'³¸ #4oœï¹n~ñÉ÷­;­E½Ò—D¸·§,QD!Éû±ãhÈ9ã½Kw¤iW×V·áîlÞÚLc,0zÁ¹ª¿ð‹øoì¦ÏìIös}öò„¶<íÛ·uõü=ªåê-h÷p,­gp·0þ {Œ×¬Û]M©]6¥àhõY|Â-níÚ-²GŸ”M½•øqè+ ðf}£i";ð‹{ss=ÝÂG÷Q¥líÊ0*ö­áïk­hÚ¥ŒWMi'™gc{U«=?O°ûGÙ-Ò´N÷lß#õcîj8ô+94øì [) —€ ØÛÎ[+Œry5_Hð׆t+i:m½›Js XÄúV­VNÓ!K¨â´…éÝîP+7RÜrO|椆ÚÖÚ¶‚$ŽÐ"F€U€bªXè^Ó&’âÃM¶¶šA‡xcUfäWÞÚ9e™"E–m¾c€7>Þ™=N;f’;{h|ß*$O5ËÉ´½R}M,[ÛF°ÁE}Ô@  Ún•s·s§¿n-líR}9a–7 AŒ9ig1ÅÄ^0²Ñ†©mhnµ´‡L²ˆ·Ë$ßóÑÏ_S€1ƒÉ¬¯ÛÞx]5yl®­dñ“ -ãth\…!™Ágž>•Þ®±¢=ÏØÖþÙ®·2y"Eß‘ÔmÎr>•ÇèúÄŸÚÞÝ[Ýiö¢ÞîâBíç”n7|ãtã$žxéV¢ñ'‰5­ÂëM·†Îê[©-¯äœ‚–~Q!Û®ì‘òýy¦xÄ:‹x´9õ‹-^²{•žÝB¼EX ¬™H=º* Ý|@ñ-„·óêVÖqn¹†$Ž Åʱ›-Æq“×B¾ñ‡|¢êñÞ¤štwÑ‹‹$*ݤe`9'$ñ]µÞ©¨Íâm3I±•VÞ;Io/¸²–0ny­M6ßV·[¡¨^-Ñ{©$„„ åÄ~êuÛëÞ²/°½-¿Ä)7”’«ù y8û‡#œ×Q=Ååí×ÃÛ»ØZ©d™æ‰† ;[6àGÖºáí)¥‘&á©hãqÇ›³oåŽÞµ«EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š+ÅñkSè”z;8¾h‡—åŒÁIèÅszóÝGM²šÊÊçDð† %´¾‚ææ{¥ÿH ¬ ÞÅ™›¾?•zÜoæ">Ò»”6`ŒúûטIaâðï‰ô(ô‹¯µ.ªÓÃ! åÎ8`P“Ørxÿ ë¼cc¨ßÛèëe™¡Öìg),hß3rG²u 'Z™~!ìݾÝo Ùá‡ïȇo<`ñÎ*þ¹£j×Ú”- SL’Êò°HG(O¸È¬VçÆ^$ŸÃÂ/Ïgmi«ÚÜ]µÃǸl<íŽT äðz`u®½<=ḯ¡›l·¡ÙÄâ5ß¹³“œg'5ÃxOTñuŽ©%–‡öø_S½6²G2. s‘ lç#w¥>óÂZÍ®ŸáÃ-ŠjæÒîêïQ²d–s»pÝÁòÏLþ•vÇOñ:ø‡KÔ†…og¦¥¼öžLR&øCw°)’+oÁÚV¡¤h‘Ù_ª¥À¸»v Ù’VaÏfxcEÕ×Ãwž×,–Þ(ÒxU”0™d,w#ïÏÒªü.²¿m:ãYÔdóno Vñ¸èa¶]ŠGûÄïÖºý:]fO¶hÛÃÛ©ÛÊrÛâu› aqÏÖ²5á/ðï§öv§üâ©ô-'RÓõ/]\ù~Mýìs[ì$¡;†~µsàýrãJÕ Å©¸oI«[Å!&)0*²qß¿ëÝ3â>©q¤_É›lºuÚÊ,VG`ãXɰ`Ðþ¦º H¼ÓnõùçhŠê‰¹‡frbŒ6G^;f²í|/«Ã੼:óAöç¶¹\gËÜîÄvÎ9犚óÃúݽ͆«£On/ ±[ˆ®ySF0x+È`zpsN³ðþ·­ÿ %êÌÚŒ^@¶·È‚ÝM¡¹,z’kRð¿ÄmSF›@›U°KQ Ä— žlÊØîA?JîàŒÅ Q“’ˆªO®ex{G¹ÑÓTYæIMÞ©sx›VB0{Žõ‚îâÐìl#¿Xµ->òk»K¤O•YÝŽ “Êpy«–‰¥Ôíõ=sUIEª:Ákh­[œ`´™v,qÐÖ­xA:>™6s2Ý,³ÜÈÇnYXœ“ØÖx?Åëmý‹oâ!‰÷l'íI~âË¿ÇìÎ*]bóFƒÄ^Ñ¢¸ŒÞ[Ï3 fEÈp ÉÏ>¦»*¡ci©ÛÝj3]_›ˆ.%F¶„ gP0TÉÉçš¿EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ªN‘a¢ÛÉmfF÷\Ä“ºV, ž*ýU [GÓµËSg|Œð U]—8÷R*ÕµµµœÚÛF±A kh£…U}*ZÎÔt-WšÎâþÑ'šÍ‹[»g(IãAZ4QEQEQES QS  Ž@úÓ袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š)2¼s×§½ƒÐçœRÑEQE™ õéPE§Î×IÄnÖ¯²à+blg èqÏ4Í?SÒõXZãN»Šê‘£2BÁ”2õæ­Õ-SXÑôKµê—qZ[ï æJÀ.ãÐdÕÅeuVR °ЃTtíoEÕ介O»Žáìåò§œìnx?•_¢¢K›Y%š•Xvù¨¤MÃ#pê3Û5ÍÇñÀó +ç‘#,–J§«wLÕt­jÖ;í6å.-¤ÈWCÆGP}î \¢Š(¬í?ZÓõ+½RÊߦÎϸ`ne 0{ŒÑ¢Š(¢Š(¢²¼I­§‡4‹½Yà{…¶òÉî`½øã9­QÈÍ׊)7&⻆à3ŽôŒñ¦7°\œ ž¦”sƒœpi‘Ïo+:Ç";!à •>ôNÒ¤2¼JEF(¤àžÕRÂúáôË{ÝQ"´™¡WD’3ßçàïVm®ì¯cZOñFøØ0È÷§É,1ló$TÞÁq$öõjZT–ò]¥ä-ma$¡×b•ë–Î;óEާ¥jhÒi÷]F­µšVú ¨_^ðìwOdúªÝ'Þ„Ê›Çåsž•:ê:[µ¢-Ü,׈Ïl®fU%9äéšY/lÖàY}¢!xð´É 0ÜUN më€zšÊÒµØF‘¥Ýë:†ž'»ù<Ûy?q+ŒœFXäð?CV?á%ðÇöiÖ?µ-†š—í&EòòÝœg‡?Ã×|{á{]V+M^ÌêvÖ×&(ÙÁXÔ§dç¨ÎkG¹š÷LÓ®æ*ežÒ \§Ý,Ê Ç^?»EQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢°¼Y®Üh60IkIyyy °”‘yÈç…fÛk+ÒõÍ3G×Îî=Q'0MjŒD»ˆef|®;‚9í]}s~4Õ5M&ËN›O”G$š­¤eCnÏÌ9éŸZª|fÅí 4R›o²(V[yK Ëàå±·f1Î1Ÿâ­_^&Ÿ¡ê7M~úzÅ&ê8÷´Y d&}:Rê~$Ò´™m­e󧻸ŒÉñ—rƒ«:sŠŸF×t~ .,%,"•¡•J¼n½U•€ ýE+ëZlz´Z#³-ì¶­u*v²ƒ†éŸlç^oèV×z¤óÛLµK›¹‘«ôËzûU _hóÜZÃ=¥ýœwn±Û\]@ɬßtì[¶à¹­{MbÆóQÔô¸ƒý£Nò>_ß.WiïÇZ¡uã Ò×Z¼‘'1éKmr9,ÛyQžGÌ=;ÕÍZ‹\†[ˆm.`…_lmp›<åÆw(<í>à}+;Zñ•†©&,o/5 -EÌQ[G»z–#$ŒdäïOÔ¼V¶—gN±Ó.õ+øáI§†Û`òUúogePOa’iÆšiš»¬Ñ­œ¾Eų¦&Ž\€®z’F9ÁÏZe§‹&mJÏLÔ´{½>KÕcm$›”d©(͆ǯ†ª[xæëRÇLðýíȰšH®cQ¹DË|ÄŽp=FH5müm£¾™§jËw.¥!†ÒÕ$yw+ÀÙƒ¸ž?Lñ5Ôú‚iZ¾—&›{4M-¸gWI•~ðW_âÁ+*×ÇzΧmuw¥øjyá´šh§gš5ÉŒÿ]Ü}9â¯KãKymt)4Ë7»ºÖ‘žÚeMªƒ/½Ž@ÛÓŒäþuVÿ_–óHñ=®µ¡\@ÖV.òE¿÷w1²Ÿõr¨ñÏqYšŽ¥sgâ O¦éòܽƉ,Vöâ@ݵ¾vnÊ\Ÿ­mAâkÙ§ÔtmsJ·‹§Éu$»ã¹ˆ 0VH ðAâ²lMœ÷Ÿ æ·µ°}†ôÅb a\œê*†±¨^Â)âfÑlÈE®]Åté;‡È"¹ÜÇP~ÕÔÚø\ƒXÒt}f wÔ,§•%†RëæÄÜ Ê&~O›•¥áÝrçU[Û[ûu¶Ôôù„7Q#eFUÐðv°é‘žÕKĺýSEÒô‹[yäÔVç&v`ÆÝ‘ž9ÉìE2ÏÄÝŽ­y¥ëëk²=5µî-·± XžGl£µñûNoYÛX-“Fg‚ÂPþt‘A2´3@ØG#šÍ×ou{Uð©£Ü[Cظ–Ô\FÌQÚ»vsòðÆsRëzµæ•ñÞÕ,ížÑäFDs4f[~|ç =½ ;FÔ¼Gáë/%Ü–rizŠÇk)‚†6’0aþ6êxcŸA]¾³¨^ø¦÷KƒËþÏÓìck“ƒ¼Ï)Ê€z`/^+7âM¬WÚn‘g/1\k¶È=U؃úU-Ä7?‚õ%¹mÚ†‚Ói„­"°ÿß@¯Ö²<9*xÛÆ’̦il ÓÔešHúdÿyÍmêR|FÐ4ÖñÖ©×ÙÕg¼Ó–¨#ãrÆùÝ• Î})'Ô|c­øžóJÒ5XìôȬ,îÚ_%^Eó3€¹ãæïqŽ5†,u´ñ¯‹ZmY¥Ž&²3Gä óƒÄÛ#¦Ïn½ê—€µ¯Ûøz8¬¼;%ÜQÝ_”O«Ÿ1œõã‘G†¯uhô/Kb Ó¼BÚ”·76ן,V&\`“‚Ú78&¢¶ñ+ØêÚ V^0}oí·‘Û]BñFbÃñ¹4P0{nl×K§k—Úv¹â;Xºß¼I©Ù³ Û°;—€8B1ÎO=jçîu›ý ßRÕ%gšþI.ãVyQHrˆ0qמkóÄ:žƒ«øÎ ë–’ô¨õ=5[ £(ãûøõëY¶šç‰§ðí¦u{*ëòë£K–uÀ‘F|ÂÃ#ö©¬t+ígÅ>2A«ÝØÙEuhLvlÞCåŸàÜU9¼Y®i>»µ—P‘î£ñ3è‘êé,ä¹Usªä”äãŠ-5XôWH&¯­jKs}µôÑLèc“1Y£P¥NíW´}'Tñ.«â߷뺂XÚêò[Û[ÛLSË©'pù±ÈÀÎ:ñÍoxïQ¹Ñ^+û‡¹šÊþòÏÏ“ïȱ9 [ßãI´ù5m:ÓPÖ.¢´6Ò9Ótñ/Ú.œcX ü9ïXz>¡¨-ŸÄ]:)5(íl4å–É/Ù¼øL¹8bKã#+’H¦_èZx6ÛÅ+«ê/­Áckz“µÃ•çiØS; ãŽT“Üšé.®n´¯éRÜIýŸ®iÏiå³-."ùÔÐ\ŽÙÅIà9nµV×¼C,Ò<:–¢éfŒÄ¢Áoò)QÐn “޵·j¶Ñõ­9®§¯`“]4®Ï:Êá\I– †Ï ö¥ñ·‡µOߥ垣â íà‚5°¶†È°ÎY‹Æ›Ÿ¯' ~3j ðïÆvl³Y‹=wìöðÉ&÷¶ŒI ¸Ó'£­t&ð¶ƒáx¼?«i±jÏÄÛu;/YÌ3 ¾#±IpJ¶àpG9úb³›‰­à›ÏÑÞö{§PdiŠ.\ó¸7½WÑ0×?œíñ$¼ÇýøN•½s$ñÚ0ÀɆ§,PQŒýk‘‚ÊÇSð§Ã [È–[y5ˆ·ÆÝ !Áöõ­ïA©/‹<%eagfö±YßMo Á+™6à€ª~e^œq’j†®ž%¶×µ ØåÓ Ô—ÃÅ­í ™¦Àù‚¸ù[î’sÎ*íݧ…GÂÆØýˆèbXÛ™ŠpsýâÿŽk±ðÏü€tOûÚÿèµh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÒ÷ú(¢Š(¢Š(¢Š(¢¸¯‰3BÚ~™¦Ý:Cc©êpÚ]Nà)'*[ 1#ƒÚ²ŸI±ð§Š|:t{éîgÔ ÚÜ[ÜÊeo ïVbÌ¡{à€}+Ñaº´¹3,G)†C¡Œ:†ÇCìk“ø‘·û'OÝÓûfÄõÇñSžæÚˆ9fXÞ_*Ƭ@Þ|ãÂç©ãµOñþEsœbÜzp²õøôÙ5˵.‹®e¯—;*˜n"Ý÷”•<ðAç½^ðF¥y}.» ÃZ\›[¸ÐßÙ¦Ô¹bœîä‚Ê0 /Žc–É4Ÿ@¤É£Þ«ÌSo/Ë ü¹ü+—¸³º½ð†¯â y[RÕ#Õ&‡3Zà ڿ‚ Õ±âíÃÞ"Ñ ÒôkØ/o5;›U¶H3&1r ($ã,:Æ x¿ÄÃV¼ŠÌ]ÚX\@Ó0UtJ±àpzó\Äú•¶¥áïˆ7¶ì~Ï&³F‘˜ùÁÇr3Ø×¯.tÅrƒð°å9?öÞ¹ëö²Ñ|I®¶µ­Ýé0_¼²ÆBÅ0TÚÀ±Vù”Œc#Œ`sM³·Ñeð÷‰µY4ýOSÓõ ¨¼Ï´æÏxlj¡Xê;œfù-µ×Ã^ ¾Õ-n7V×Aa‡iù¼ÆPTŽ€äö©|+âýE‡Z³Ô<øeW½hȉØ\ßÀTH<œÕk;Kýµ^ïHÖn¼)ã›E³”Oq¬^M{~iP2TwÎ+OÄwj^²ñ½¬Ö×Z]Â_GÒìÎXv ¹ü1Z~±¹´Ñ£¹»\^êRɨ\G˜äÀ`UOE¨yõ­”׃NÖ­®¦†Ýs!@%FFqš©Þ©á}SSŸûöóNÖ$Žö6µ@ÒA)P$]ÃÈ­O éÚ’\kZÞ£Ù®ukˆÙmÉ¢Š%ÚˆãqêpH§jöZŒÞ&ðÅÜ6åím’ÿíäb=è÷Ï'Яªhwš—‰Ì²D³¦ðíÕŒ“8yqŒç§#Ʋí¯|y§é áÄÐ%’þ±Á|$ìÅ@Ú²1-¸`rFÂsF¥ ëz¯‚[I±mPèrºO2«8’"¥ÆâSžµbM\x>!(·µdad7ÞÞ}9㚟VÑd—Àk§Ý¸‚êËI‚A!#÷S[ `sÓ‚:ÓþÙÝ®ú½øoÖçmB|þ⎼Ç~õoÅú^§ªÁ¤%ŠkmnÂê\¶1o–?€íY:§„µ[¿ZßBÊ4Yä·»¿By3Ú†à{ägýÚ’ûÁ÷z´Þ5Šá’+}f;!k*²¼)Õ‡³c¿5^þÏâ/ˆl?áÔlmm-æDŠ÷PŠrÞb7yi´[ý£ï[Zv‹{gâ][P*‚Æ}>Êpß6bÝF:­VµÓ|IaâýNú+{y4Vs4ÅÈ’&… €9úŠÉðþŸñCÖ'LƒOÒ§…n't•îd9nWÊ=3ëM¹ð½©iúäúݬšÖ§si; Cö`¶Ç)æ*{“ùq˵-â^®4©š-&ÍtËë{¨ì‘äe”¡ï&Á´Ð?Z‹âN˜š­ÿ‡ìì¯'7ÚýŸ+oÎEÁ]…ý1³ZÓÒ4[­;Vñ¡$ÈñjsÛÉ(åq…9úšÈ>ž[-fÝõÅÖ¼ú½•ÄKͳðW œ`ç¦A©m4_ÞjVWZî¯ÙÙ7˜–Úzº ‡Æ3)f'hë´qëZ:ƒ6u¯Ü<âUÔõ&¼E,QƒÉÏOj†´)4 kØàNn5»ÀÁq´LÙ Ôôõý*†¯á­n]dkº§ÛÙ‹9Òâ1‹0èAúãÚ¨ÙøX†ï_¸º×ZéuÍ4ZÝo„²*¬˜ ýÜ÷«^÷à yáoøF~ÔQ~Á§Ú6Œü€ Ûsß3\ßÄÆÓgÒl¼;×üTÏhÚdhz6ß3¢»'¥vÚ>™m¢é¶:e°ýÍ¥¼p¯¾ÑŒýOZË×¼36§yiªéºƒéº­´OÜ"+¬‘1ÉGFàŒò95˜~Ç>›®[ßj“ÜjzÈ„]_•PÀDrŠˆ8 =9ëÖ·|A Aâ lfžH–+«k錓 ÇÑ/´¬íŸíæ…î%‘ÞIÈ'yf9‚¥¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢¡ºµ´½†Kk¨Rh$]¯€aî PÒü5á­G›MÓ ·•Ô#:/Í´tën•vÚÆÂÉ®^ÖÞ8Zæc4Å1ÈÁfÇSN¹´³½EŽê™Ö@²( 2œƒÏpzT7:N‘ysmyug ×6§0Jè FÙ$dU‹‹{k¸d·¸‰%†E*èàaèA¨o4í3PDŽòÖ)ÑUdPBŸlÔ¶öÖ¶‘,6Ñ$Q/ÝD(úX¾*ÓüG«Úfé²[Ãmt¦;¹¥Ý½‘€ FG$b¶­íൂxT,PƱ¢ŽT` Ž ?Mµ’Y­íaŠYNdt@þ¤jI­m.vyð¤›åÞ í>Ù§”Œ†A Ôc­:Œ ç½#*8Ã(aèiiªç õÅdøwE—Cµ¹·’q9šúæè0]¸±8ÆOO_ҵ袊(¢Š+^ðâø€ÛÇqs’ÏkP— €ä©l}VØQEQEVN»áÍÄÅo©¬¯1&4•ÑdÏg FáìsZªªŠª P –Š(¢Š(¨…Õ¡¸6‚hÍÊÆ%1nÂØëŒ÷ÅU‹DСÔ'Õ¢°uÔ,·!˜À0[¯@*ý^ÚúÂñîc¶¸ŽY-¥ò§T`LoŒá½ X¢Š©s©é¶—VVwª\^´‹më!A–ÇÐU—tYÝ‚¢‚ÌÄðîi"–ãIau’92:œ†¡v4ú)¦8ˉ à`69Tu-_MÒZÁo$(o¯#³ƒ NéÀ8éÔàUê(ªI©ÀúŒú`Ša,6ñÎÒ>YHÀn„Œr)úv£§êößXL³ÚÌ ŽEί½S×¼I£xn¦Ô$}óÈ"·†%-,Î…d“ú{Ö=·Ä)®­m5-7QÒMÛùvò_C¶7sÑw` íœW]EKû[NþÔþÇóÛ¾Éö½›N<½Ûsœc¯læ­LíRH¨Ò2#0EêØ¹¬Eñ0VðìW}żúËH¢)6!ùü8ÍoQYú†±c¦\i–×̚ɷ‡jä [æ=†>Þîú[ëûil^+h&’À¬ûÆ[r6ô9ëW7)%r2:ŠÑA,À2sÚ„t‘C#SЃÁ¦,öîíH¬ë÷”‘õ%QEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÔ÷ú(¢Š(¢Š(¢Š(¢Š*¦§¨[iV7W× «¼M!ÜÀGA“Ç'Tô_izΓ¬³Em É82)1*äp ÷Î*厩¤jaÍ…ä!Éum¿\P뺽¶…¦^j3”Ä»"»0('»ZÂoZΞº³žÔÚ_ÌRñ‹†b-åwaß=»VÞ—â/ ëo4z^¥mvðÿ¬XdV+õÓ/ïì7š­¬Cnb’E 7tÎOíšÖErÛú£]xÖÝî-­ãÒ£€ÚÍ"±ï‹q2sÈž1Åj]ø‡EѬlî5mB3Ä»\g÷ÇnIE$wà ÏÔ¼q Å ^kZeä"2ÐÅÉÁ›#2Ô ÕÐ5«-M¶Ômd’ Ý´ã‘ȃMÔ¼G iÇkytâD2,J¬Ï´wÚ œ{šÇñ4ë? Ï­i7QÌe]¬Y>qóÓopÛyâ¶|;q%Ö•i3޽뺶n/,¹Éþ c âªê¾1ðÞtlnf•îQUåH"’Cž…ö+m\U øš½3\Õ¯õ{mVìE9*À0PpxÐ$Á ”rT‘Ù€ÏOjôzåƲ:\ÞXè·—š]¹`÷qùöœ1 `¾¼g¶jMSÆ–v-¢-¥•Æ ÚÌr= ƒo;TÅqœþ9ªiãmfK™ô¥ðÕÉÖaQ)·ócòü³ü^nqíŒg?‰©gñܾº×n4ùc’Îïì—V…—|n+GÈõ¤ÿ„ÏT´¹³þØðüöuäÉ 7m*6Ǹ%EåwtêØ=j¦‘«ØèøëQ¼g0[k’¹UÉbY £Ô“õ«gÅÚý‡Ùn5ݬtû™’/=&Wh œ/š  z[ëSNñÛ5½cDšØÁ5‚Ã,l["xäxp1ƒÁëõ¬ˆ|vÓÙOwœÓ4º¼šn™n3vSøò@ £=páV,üK¯Ûj–Z_ˆ´¸m¡æ 9í¦2#: Å) ŽGŒø“Åzœ—Òx{I·¸²´žH·37ÃÀFà€XŒžÝê Ÿ$¶:šuª‹ÝfêKXãº}‰ÅâB3È#[µjèz§Šf¾¼ÓµÍ1!hbIa»¶fh& Á00ôçŽj׈µ-WK°3iš{_Þ¼ÑC áAsÎpp«ÔœV-·ˆAŽ3ß­9Ñn~'Ä.†VÏÃf[ z’]®Ãß}+¤ñ5¿†.t›•ñ‹û-6<Æc…\ƒœŽþõÎËÞ0ñ§a-õ;‘£Ål‹ ¬­¸’t¹™mª8=y¬{û½cE³ñ÷‡Æ£sqŽŒ—Ö793B%VKðÇeO\w¨µ]ãCðÅ—‰ÓZÔfÖaþÏšIÞáÌrùŽ”Ç›?ÝϹ­)´-:_‰±\3\o:Û0&1f 8 ¸þºzâªx#F7^¥¯ÞßÝÝ^Guª¥ª¼Ï²ÝC2à.q“ïœqŒ`V\–¬èß ­šîâ?´HË$É#,…|³¸nÎ~aÇZègÒ,üâO b4°Zj³ÏgyjdvI1ep¶HäúUï‡o+xP´ÌÅ…Ö¢ bIâWîI®ÇBÑõ} ádºŒ|³Ü›y 3|Ñí‘¶œZØÕõ ½Pø•qbþ\°éú2@sÄ[Ô¦îÿw­\ñ/ƒ|5áß ]ë:z´¾›n.£Ô±šIgæЃ‘ÏJlº•â‰5{s,_ðŒYÌöÌO–ìdo¾¹ÁÛèr(Ó´„±¹ø‹áía§ÛýšÑ­T±ÛÉ;VMµ†‘¡Üè-¬xVmêÚîÝUÓÙ)\ñ‰X|Ûd=w)>ýkØh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š+7Ä0[ÜhÚ¤SÆ’Flæ%\2p}5ÀXXØO§ü:Óg‚5ÓïC\Ý ,óG(žyÎq[šå•†âŸ \éð¤7·3][Ì"|Ø<¼¶üu @"·|W Sø{[IY³®H 22à×}§i÷ÚË[»xÚ¤¶ic*6±çžÜ‘øÖ¶³ ½§Œ|'%¼*’ËiªDJ7*¢§éX~ƒ\ŸÂï+ÙiO غ’úK—`Îå›y— ÁùâºïC5¿†´xd¹Šëe¾ÕšJ2ví$@+šÔ¿Ö|Qÿ—+_ÇýÔ—W7^ŸHÕ-íõëm4v×HZ9¡`¡º`‚u$ûb«}ªg±ñ펡¦ZZj°Ø¤·sÚ11ÜùˆÛXäcœçë]Þ†Á´-È6PütW?á%|Gã´`j-w<›,yxöëø×/ªäÒ~%ÜYm{Þ@"ÇÜi(”ŒzœgÔŠõH¿ÕÇþè®KÂwV_xºÉcŽù5‰e—q¼’£Ë'?ÃŽ•ÆE,>Õ®ì%Hôôñ˜¸y6îD‡(CÈÊŽ äq]´’ÞÞønÚëÄÏ$š½Õ´Vöáü¾r ±Ú¸êÇ#Ó +ªx†ø”i·)vͨY^¢´FP¹Þ`¬:p{b«éz›êw_.žÞ W›û\àŒíB7 þë}áõïÖ®xOÄ~Ñ|=5†©w 7Ö]ÇyläyŒí#òÛò1€sšÉÑZÞMáÎí¸}brª{d<}+ª×¤Dñ‡‚”‘¹×Twâ!\Ŷ´·ö…ÍÿˆÓJÅÍÊ&Å#+n#ke]Ë¿S´/= Ôt¸¼à[×»ŒZÚjúÚ&Ü6Ç·vwzc¾zT÷ƼIª\\xž}ÛT†ÚæÊx¼Ÿ*å<<ˆã+׎yª b·Ú7ˆõ6ãQÕ—í¶R´·+©hr| Š™=HçV§‹|eáMsM°ƒJ¼KÉ$ÔlÙ„Y&¼}ÿîœàprkÑn#i¡š%;KÆÊ¦Exõ”þÒôµ°Õž ô­_x‹Oñ}½§‡ô˜®$¼º»µk•x]~É8f21€2yªwºf­}eão³ÚÉ$Ðx’ Øb ´V6*¹ëœqŽ «~!ñ¯4äðþot÷WòÀ·>d.¢Ò0ÁœÈX’I£â1Õ4;›ihd¸–ÖãHtËÆb<ÿuÇëI¯øHØh>†yîáÑ$Sw«2Ë"2#&Ò¶yÀ žj Ïú–·¦>‘¢j-–ùå¾Ô^åDMŒ*¢ÊIfÏ^0zÈ‹Dð燖÷OÖ¼=ª^Þ%ÕÃÚKj&d¹GbË‚µHÎvóÏzÙŸLþÍðÞ‹g}á(çÓf¸–MFÊÒÉj_%2rX¼AãµXðFœÖÚÝäÚ=¾¥gáÃbª-ï·…3–’BX¹Ýœrk_ÇÖú½Æ›h,ã¹–ÙoámB C‰e·Ü«‚¦@ ‘\ŒZ}½¶¿áWEð…Ý…µÔ±\ÎÑ;™c(¤©bû¹'ð­­6ó]ð¾£â+Яo~ߪÍ}g=¸S U~WbÃnÒ9ȬØt¿Ûø/O7T©ZkßošÎ2»ÙVrÇg8 y2>càF3ž8ê+4ØøÏIO]i6+%õõôrXnuÊ¥ÎHû¾‡Å/…?á&ÑbµÓá–8åœÉwy%ÔLÌî~iI>Ÿ…f¯‡5oÜêvöþ±Ö­î¯&ºµ¹f‰^?4䤛ԟ”ô ž*ìžñ=¾• ÞÀ¶rkúMÔ·^D*"‚A0!â\Ž AäsÖ±xó]ñ†u{í2 :ÃM{¢ð™ÃÊL±•Üv®Üg€÷®ÏTµ{í>þÑ+ÜZÍ “ÐR+ƒ°ÐeúÖt~ñd^Ð4xõ q©iÚÙÔä†*F÷`@À$ò28y­˜ô_ë:¦—uâ&°ŠËK”ÜÅ ™v3O´¨f,rH<÷«º‡o´»ZÏ4nú–§w@p«?ÝÜwª7Ô§ð$>ûLKv––аvf6ã¾+ZßA¸‡Ä÷ºá• e½˜Œ»tnÄ“Û5WÁˆ<7§Ë¥j6ÓÚÁ3ý…¡Vå³ûÌñž{Οâ O­Ë§ê:móiÚÆžÏö{¡W2:žªJÊ“Â~/ñ ¶Ñø¯T¶“M·–9”l¢áÐä‰;AþÁõ­-OÚÚj²ë^Ô!´º¸‚8n¡¸ˆ¼Sû­Ã#ŽNÕU<s&™âH¯5/?W× 1Ü]ùxDv¢¢gî¯ûÙ=Íië~:¿‡N‚·^QòíPM·?êYNq‘×µ©á­RçÄZ^¿§jbÑ­íÍ¥ÜMq<%Ãm#iÏ|µ¡xu4M*ãLa4÷r™ à=ËcíšÂ¸øv×:O…ôßíy —B`és €ÎÁp@ÁÁïž•£¥ø[S‹R‡V×5‡Ôî­b’+Aå,qÿï6ÕÎXŽ3žªƒxý~ßgiâ+»múyf–Î4MËæœ²¤„U'Ð~4ùþÇýƒ¡èöZ¬ö·5ÂÏkxª¥Ã ÀåHÚA {V˜ð–›%ηq{#Ý.±gmks€¬JW#rÙÉý+1<q(‚ÏRñíönñ´v2„„tHꡘ3Éù®4;T×%×D’yòX%‘#`UrÙÆ3ž}j¤ÞÑî®õӴŹkÕµ„]¸¦7=[ýißb±1<Þ/%سG´m$÷#¥,¶–s¢Å4Éãj²‚=©UU@U(v¦¬P¦í‘ªî;ŽäúÓé¦8Ë* ‡ŠwVG‰´1â-*m7Ïò<É!3nqå¸n™qZôQ\ýÿ†îµ=jÏP½ÔZM>ÊEžßO¨Q2®³u8êc]QEQEQEQES°´ȦD²2 ôÈ÷§ÑQÏ=½¬ROq*E jYÝÈ  w$ñŠz²° ¤# Ž„RÖ~©®h"Äú®¡md³1XÍÄŠ»È댑šƒNñW„uy…¾¬Ù]Nsˆá™Ž=$Ö½V¾Ô4ý6!=íÂA‘#!À,ç >¤Õšl’G<’0HÑK31Àu$Ò«#ªºÊÀGB -Essmg×W2¬PCI$Žpªª2I>‚«iÆ•®Ù¥þ›7k!!_k ãÐ0ôªÚ÷‰ü;ᘢ—V¼X<ÒDHgÇð[Bñ·…• „ÉöûÁm¸<¼©9>½+HzÐYA è=k'Sתhzi€¸Õ$¸O38ùI»¦sÓ¨­Hå†PLn®ÁÚsŠk\Ú¤‹Ì‹#}Ô,2~‚³5j[cCÓxõv^RØ1ù*`cœýF*®‡â;½oSÕ`ŠÞÓìe{u—Í̲Ȅdì9àî?Jè$’8‘¤‘‚"Œ³1ÀÜÔºŽ—}Ïiw ð¦wÖ¼Aqw£ëÖ‰ý’Ç ¸· ä\Fý ç8#¸É«KãµçØV·7&O(.î7ÿwwÝÝíœûTº§‰¼3¢;G©j0ÛȰ‰¶;|ÅIÚNOPÞxÇÂ:{ÉÎ¥MŒ´C%ǘ7/ÊnG=*ížµ¢j?Úv·‘=Vf›8U ×vqŒwÎ1Yö5ð†§u ® ¦yóä‡VQ.:ì,?4ëÏxRÆùôÉI¡… Ubû¥¯9ëÐw5¥ão iWrØÜ\H÷3¬É „†BŠÁ*‰|qe¥ézf§¦È.b¾¸‹Ë‘c‘Ñ£ÈßÊŽ9'±éW´ýZ íslZ„Þ\ÚDW)a$6äy…˜“ЩééPKñÂqJÊd­’FŽKÄ‚CnŒ2ÛøçõsUño‡´{›k;¹d7Pù¶énæQœavƒ’}=9éRh¾$ÒõÉ.íàY¡»´ÙçÛÜ!I?Ý8=AõÖÅck~&Ó4)-­åŽ{›Ë­Æ [T/+…êqÀz’*h÷öºÀŽâ´ÈÚK»Yã+4`)#å=wÆ Öø³Oñ>é,-/ÔB²-ÌÑÉêªIÉ+ߌ{šÍñ—‰µm Pðôv·2Åsy¶q hÞr•?"’F<öàu«wþ1ŽÚìéö:Uî£}QËs °Oôpã ;3*î>‰­-_Ó¼Ch÷V‚D1LðO ˶Hd^ªëØÇë\ÿŒm¡#PÑäñÏÍøV4ñ†¥x—|¶Ö6›¿åŒMc·Óqæº oFðýõÖ‘¨ê!¸Ó®ÃÚÊ),Ül'¸oNõh¾"ñ…î±ršÅÆ›¦ØßMci MÎñpÒHÌ­‘žƒŽµ©x›Æ)áËè#¼DÖôïÛéFév̬뵙N@ÜnØ­MJx_RðÕÀ×nï£ÔuHìo!¸ ±¼Åb¨Û´ŽÇ뚯á=.îÓÄ~8•5;™^Úê«pËå»<ƒ&}ÜñŒp;×3¨ëϧè÷¬.Ôµ~Ù|É~ÆŒö;åp"òÂcŒ–ß5ÚßOªø›_‹CŠþãO±µÒá¿»6¤,“<Ä…MØ$(Á'šÈño‡µÛ xª ífæëM‚ubåÏÚîŽVÀ ™éÞ»¿Ù-†•gÜ\\)_̸rÎw òO§jÓ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š+#ÅZ¤ú.…ªê0f·¶v=>Àõ®OSð…¶— \ëVú…âë¶¶mxoÌÎZGQ¸†Rv=1·¦ ñ_ŠbþЖu²“Ã6—2Ù¤Ž¨ììßx)3þqZž³M#YñNk$ŸÙö²YÉm Ž[ÉócË,IÁ=¨ñýšjÖ+ijkP£4lU¶•9†ÏN*®¥£iÞÕ¼5w¢#[}ªøX\ÀŒÅ'Ôœ°$ò¸È=kšÒ¢OØ>§©øGPÔï/^g«,ˈÓ+(AÇ §ŽsW¥°Ôµk‡Ö"YDïs{ÆdÝhfCƒ¹@݃ÎMlC¢èþñ–”š5¬vV×ÚeÒÜÅÚŽb «dg®3\ĺ^¨é:Õ퇆¥ÕàÞNu}AãWb2CGÕö¯EÀ^•¿e+ÝIðÆK†2<ÚuÎòü–ͺç'¾j÷€´Í"Ò=­œ0É·wn¬ˆXÀRcøsÚ§ñ\1j:ß…t›ÅݧO5ÔóF~ä¯ ŠÃ¸ÉÎsŠ«©ézV“⯠2Ö+w¿–×qD¡RhV2ß2ŽÓÓŽôÿ‡¶6ãį ´Qºx‡P…YH‚àzS¼{ig<¾i­¢˜·ˆ-"mêÈÁ²9Žõ•£i>7ñEÄö‘I%­¶¾åF¯ÎáX: —NѾ [X¨ŠíˆA@vª¤¡7ôè| ³¯Xx˜Yé©-†…¥%µå±³¸K‡Ìož’¹ÝÓæ½ö¹´ºkK‘©ô,1\ßÃË»i¼=kf¤-ΞÒZÝEüQÈŒs‘ïÖ ×|Mqt÷MÐôÛ}Jê;§x÷Îò&H亨Ïl«qXÖ“B¿ ô‰Lêɯ É/cíDäúz×A«y·~'Ö"±5ÄÞ@PòXÈ@#ñ§ØëÞ‡ÀªMÄt£o,€a L2븷ÅVðý¤öš×„m¯F.`ð¼Ÿ#uBGè+Z„xûPäþžiÁ5ÒXßéú´w–Ü[K’ÄÀ«`ààzä®o¬t_ÉsªÈ–ð_hé¥Ä¤Ý’é¸àdç=k:öî×]Õ|U©i’¤–6žžÆK”9ŽI›-€G`ë‚qšêü·þíÀJ´¼°Ófð¥ýô« ¬Úy’¹Â¦èØO¥PÑüE xgYñ5®¹{ ›__ FÒâf —È€ ¬x;qŒg5«àÂ÷·>!ÖÒ3–¥|¦Ó 1"]¾fôõ_Ç·öZM;é<«;mQüéH8Mñ°À=MOá“ø—Æ’F>V›O;±÷¿sž+–½Ó5 ý+ÅßeYÕí|`o`âGHÂ1ä}à9E1G†u«í*ËMÕµÍfV¼Ši"’fX­Ö3’òŒ@9'ŠõBÎ-FÊòÆCˆîmä…ˆì`סxÆÛÂzm¶‡âˆ.mo4ôû4r¬.Ñ\¢p­ aÈÆAÅ2æø×JñMʬ֖7–i‘e8Uv)ó~ãyàeºv§êž.Ox~mOÓîÆ·}l-ÒH}œÉò±v**òsž{V–‹¦ÜØx¾í<¹ ¼ÓíÖb×(ì8=3Ç<ÖMŸ‰"м]ãEº±¼’Õå±"{hZ@®"+ à ðq޵VëGñ£ ïŠâÓ¦KŸíë-J Í’ UÙŒvv3éZz®¡qã‡Ò4Ë 2ú hõ{Ëéï hÖ4„îÚ7`–c€6ä{Ö·…ío Öüe,ÐIsêP4Në (%}EqéÒK&¡ˆ¼;ªkóÝÜùM!&УaÞ#TÛŒåsìi!°×#ð'…£m"óíz¹k5Í OÞ:Ã!ÉŒç‚+~çC¾ñ¡â’Ö³ZÁ¬xrΤ™qµÎÿ•†O+‘¸Tsë.¿Ðäðâørö^[O±I<>Ê›—kH$ r1Èg¶+GJÐoô¿Z2DÍ¦ÚøVœãD—¦3œàg§ãVôÍ?P‡Æ$¿’[K›68e8ô{÷ÎxÈì*‹¡¿žþ8¯ü1½¡=·Ê±¬fx&Ï'÷Ž£kîà‚*O‡Ú.¡£Ûê¾eœšuÅç™c§Ë.ö·@ X Çœ Tþ&ÒµKí{Á×v° ±¾¹’åÃ#VŒ€H'''Ó5ÕWäx³ÂÚ¶³.¤ÿjéš­ÒÞ(ŽTI •”+‚€TàƒÇ¥g^x;Ä7š>©q4qgWÖtûù¡6A&Ô À;sÇ'¥t–>¥‹µÍ^EQgw§ØÃÉhËnÈöȬãáb{ˆ{Ö4]†(¬Ûw\[ì%‡nkc ®Å¢XÛk)guk[ìI†XÔÙc>œâ²®¬<[ ë:Ž¥¡XÁ¨Yê­—6ï/–ñJŠr’@ÕGð—ˆïtOËxÐ.¹âJùhÇÊQ6Æ›ˆÉÇsާ¥vš|2ÛYYÁ)H­ãÊô%@Ìë>ñ-®°þ ð¼ÖËus Ã}kw»Ë¸Ù÷2òzt<~µãð÷‹¼C©é·þ*k8lôɅ͵…¡f0<ŽÁ~ï`S¿±|qáûÝUü;ö«Jé®ü›Ætkydûä ¹Içzcøüè‚ÈÞG.£q­Á«^ÎÊB;‰0P2@a~œÖ׉t+­mô‚TŒiÚͽü›Áù–0ÀîsYáMeõ1¹·þÆñ¸Y× çÆâÊ~î;óšÌ›Áþ>Ô4 <3u©éÖúzZ‹d’Öó%UPÀ¶ÕÛsßV”þñlRiº¾ygµ ‚ØÞ$ˆæÞáÈï¼<ƒÏ\Scðf¯y¦xŽ=gSêzÜKI‘ ºª‹N9<ä×CáûmrÏL¶¶Ö. ¸¼‰v4)U p8$ó޽>•§EQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÑ÷ú(¢Š(¢Š(¢Š(¢Š* ËK[ûk‹;”ÄOŠ{« \§ü!:´ö±é7þ žçEBªmŒH$’5Æä‘Ç8ŸZÜ‹BŠr]i&#~ˆ€µB9lƒøãXèqXêúή³3¾¦-CF@Ây*T`õçÞ¢ñ/†­¼M¤ÜÏoök¥¹W€€Û”0pqŒçJƒOðÅÌWðjZ®­>¥=ª:Z¬ŠŠ‘n-…,G=ºUgðAßyŸ­_XXÞJòÏkM»ŸïlfRʾÒ=±W×ÂšÍ xÚÁÓn Ÿ~£š·s¢Ú]j¶»»‰¬à¸…ck qœñž1Ç#­`¯ÃÍ0E-‹jz‹i\8JJ䌀o¶üUý;Ânž41ö›™ÛE­«JÃîÊ»pØ!G´´Ý"ËJ}AíË“}x÷rï9ùÜqíÅ3ZдÝzÞ8/«C*ͱ1Y!‘z2°èGãôªš?…tý&å¯ÞâêúøÅä‹‹¹ ²!9*½õÀçÖ¯éšE†/E¨aöËÙ¯%ÜÄæI:ãÐ{T:î¥øŽÕ-/Ä›c™'âr¯®pÊÊAšvŸ¡išeÕÝí¸ÜÝÃm ÎîÌ\@¤.rO8<žýébдxŽª|€ãU}÷jä•“å ŒŒ`t›§øÂÚmÄ1EÃ¥gÜxSÂWwÃS¸Òmd¾7œÑ©bGBxäŽÙ©G‡|6-ïm›l-¯¤2ÝEå®ÙX÷aŒÅOi¤é6´³†ŠÝmÆ€NBŒº8¨?áðɽþÒ:]§Û³Ÿ´yK¿>»±œÕó¹™n hfT($ÀÜœ‘ž¸¤û=·šÓùIç4b6“qQÈõÅTÑ4›mOƒO·bÑÄdlK±bp“Ð ³wec‚òÞ+ˆI¤ªr=ŽE:hE¼¤p¨Àè8©QQ*¨ÐMš.ÅT—N»w/bU8'Ôõ®ÒÂÒúÕïZæõî–{––Ê£ÉBc¨§š»EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠED@*ŽÀqKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¤$($œ2I¨Mõ€ësí÷‡øÔ¨ñÊ¡ã`Êz9”•PYŽ$ö¤GŽTY#`èÀ2²œ‚piÔQEQM’H¡F’WTFY˜àîiYÑT»0 I'€*¥ž­£êñÙ_Apèe‰Õˆ¹Á5r²¥ñ7…a½]:]ZÑ/Y¶ˆ «¿>˜ÎsVµSJÒ-ÚëQ»ŠÖÝN ’°QŸÆ—OÔ´ÍZÝ.ô먮­ßîÉ SøŠ¥Š|)-ñÓ#ÕmZø?–a.íßÝë×Û­3Sñƒô[ƒi©êö–·C˜åÁèpjM'Äþ×d’-+S·»’4Þë ‚@Î3ÅkQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢¹¯ˆ-"xSZdfV/(H?xwÕ o‡~’ÆÞKXî-.šÞ6K˜g”:1KúsPé0Ôí¼3ö‹ëiu Z×Pm)£€g™[“Ð9bxñÚ´í|K­E«Xi:Ö’¶¨$ÆÖXf!hÆâ­ò¡Ä{Ö7†n"±‡xöã`"Øõ;½ˆÕCÖQ—r¶Ÿr=ÆÃ^sáçø/§}³M²7ki™$¸9>YÏ>æºÙu˜¬SIÑ|)cMwj×P#6ð}€äž“éMMoV‘õ]\¶†á¥Éu¶ìLSÆAVÆáTõ=sXÕ>!ÙøSO½²Ó,Ÿcb¡mÝßÏž8† RÐH( ýkZïÆýõþiáË;i£Õ4¯·,·,ÀE’9m¹È‚9#šØÓ5R}sPÑï#„ K 9¼È÷|Ï&wõí‘ÇZ«‰µgºñ}¼VæM °Äpó™#Ý‚IÇ_NÕ—sâ/è“éRjÓiRÅ}yom-œ!Öh|ÓŒ«`Û{ü«WZñŽ£âmcF°K8l´×²g¸•X¹YSqP“Îz±¥x–ìCâQ¬ÖãEžRþX 4;w#`“Éõ£ákÝ_QÑ4ûíQc[»˜¼æXÁ ªç*0I9ÛŒóÖ¹oŠšV§u¡êWÚÒÇa†±D]²1l|Í÷°r8éÅtÚΈž"Ò­ôù&hmÞKy'P3æÆ„‡Ù«ºm$xÛÃÑÁ¦6Žmæ!q$AðÚ#Œ®A¯${ ×£\$²Á4qIåÈñ²£ãî’8?…yî¹káOxpx`Àš†¯unR(#@ÓO3e#’9ç$ñëSévW7&ÑlµŒ\M¤xj7ùùhbªÏõíš­«J|=­ø´i؉n¼Õ_CÕüY§øfÛA“ÃWçT[6‚ݰ¢—}ß.PyãÞµ´_èúׇ"XÚKk/Ëi,ã|ÍÈqë“ÔqRß>¯¢xžëSM.âúÆûO†ö»KG$Lxe$pAëXɤøâúÛÇSµ›ØÝêMjÖˆ²®æD^T2“†+òžœçÖv£¢ÝMed|?àv³’ÖîÖêv”³Iå7ÝC¸–>¥™F=k´Ð¬5H|GâBâÝ¢µ¾M5­ËËŒ‡òô®{ÇEíÆ½ckdácñ +e| ò#×ûrµè¨‰,h¡QT*ÐX^6Ó/õŸ êº}Œb[©¢Q1§ŽÔºî¯\éɥܘuI-çA¸„˜ÇÖ7#ø[¡¬kËOx¦ëH‡PÒSL°³½†úwiÕÝÚ.UP(鞤‘Åv7fè[\P¦àDþPcÁ|qŸl× á½3žµ‘΃o>§pÍ%ÕÓ]ó9=ÉLàzt§©i~$þÑÓc-ÜAÄT°~„ƒÏ¯¥^RCàZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*;;É›Éâ_-¶½Ž+DÑt¨ ¼I=ÜœÏ,˜f-ÜgŸÒ­ê6º6“Ëyk‚8Ë0dÂóé\ÅŸƒžâÊëK¦Óoå_1M¹;±Ê‚¤ç§^RÛø›YÐfK/Cû³ÄwÑ•ÿÞ >ë°ŠXg%…ÕãpYNAÔú(¢Š(¢Š(¢Š(¢Šd²Åo,¬4RÌÇ ¹¦ûw‹ª3[衹a÷8ôô_óôè­m-,aK{h–(pª+#Å÷†ÏE»Ø7Kp¼kýã'ü³Zzm¯ØllíçŒÆ~ sUµÝ^=ÉçÛ¾f! ˆuw=‡4‡Ómšk£¿P»>mÔ‡®ãÛ¿¶h¢Š(¢Š(®SÅ·sÞKgáË&ÅÅû;ùg럭I}|aøwAéB0ŽëÈ·_V>¦¶ôÍ:ßK´ŠÖ£,Ç«±êO¹«”QEQEs¾'v»“MÑ£'uåÀy@í|œÿžÕÑtâŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¦ª"gj…É$àu&¹y®µ gJÒm¦hÕUî.ÊÏ>€~=?ê*9ííî¢xgd‰ÆXdã®tÝ_ÁÆ[íšãLݾ{7ä îTòÏ9®«MÔ¬ukXï,äßÄàQV袊(¢Š(¢Š(¢‘™QY˜€ª $ôW5äÏâ›,ŒÉ£Bÿ">Òùï´éUU*€F¥®'ÅZ¥”zÖ™ÆöƒOÿJ•S’ÎNcŽAÁçµu:f«§êöÿh³“rgk0Ê}¬ x‡^ŸQuÍž˜LÙèÒ~á]]VßRÓ®¦–Þ ƒË2ºóÁSƒùJµE! IÀ“I‘L‹$NeYNAÆEt¯6ÓåÖ5ïkWšgÉŸ² ³Ò(×ÛþÓu×u¤é6:=¿‘l§$î’Få¤oRjýQEQErÞ «jºž¼ã÷@ýŽÓ?Ü^§ñ?Öºš(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿ×÷ú(¢Š(¢Š(¢Š(¢²üG­Gáí"÷UxÌ¢ÝXÁÆæbF{rkœcñi,ލ·z\ò|ï°$/†ÎÕ“~sèvãÚµ ×no£ðÍÏ™Ÿý¢XËgt­ç9ØNÄû¸e#'+ÈíSê>0ð†“uö+íNn2¡’vg¦ò Ÿöˆ©$ñW…b²ƒR“S,g­ã›Τäg§?•3Kñ…5«¶±°¿In• ùd2–QÝw‘ôÍE¨xÛÂ:eÅÍ­ÍðÚíû@Dvç¦òª@üMTñ',ô‹}æÎD¸‹Q¼„o ì¦÷™J7ÐgŸC[VZ摨Ü=¥´Å®Ú–Œ«±Ë÷IÈ}:Žâ¡ŸÄÚ²êí-ÁHÙöß‘¿w¼dcŽr=3QYø»ÃWÖ—·ðݰÚc̹te³ýÆ ôùsÍG§xËÃú•ÔJn-ç¸Vkuº†Hüð½v9Ç\v­+}ZÂêþûMˆ¹¹²XZ`Q‚0epÄ`ûàœUê) ' “\·„ÃêZÆ·&qspa‡=£NŸÓò®ªŠ8<ã<9ö_‰µÝ&‹VE¹Eì¤ã§çúWA}­ÙYÜGf¡§¼“îÅÉïz åµOÆóÜÚé—Åj··K°ÀÇÍXƒs’ íÔàWc¨êš]¬—w-ˆÐ~,}¹®]uß}·Lºž4‡O¾¹ÇnGϵº1=søþÒêš­–‘rßy¶Æ‹÷½¬3Yñú¬vwöÑCö­:F¹/yÎ9úVΡ«izR+ÞÜ,A¾è=OÐ ŸÒ¬Ã47¤Ð¸xÝC+„¦º¥­ÔwßÙî³ÍjÎÝøàg§äkMñµ„¶qI¨ÆðÎs»b1CƒÕO¡msnóÚØE.óÕWhíþÑ?ˆ®ˆjòMâ¦BÀë¼Þ»É€þu¯4ÐÛÆóLê‘ ÜÌÇ ãµë»ýsN¿–öºLHKžäÀ_E'ó­ÙGa éÑ"…/•±Ü¿5¹\׈¼Lö2Ç¥éqý£UŸ…AÈ=Ûüýk7FÔõyu‹]2ãTµ¤RItp¸‘Ûøíöô5ÛñEQE`ø¾þk--ãƒþ>.Ü[EÎ1¿©ü«KK°‡L±¶³‹•Š03êz“øš¹EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÐ÷ú(¢Š(¢Š(¢Š(¢±|[{¤éú¡sªÙ½å‚ÆâPÄ£ Á#ÔóÅs#Á¶Vö‡†üQ}§Zˆ<èwL$¶UÆGË&á·ñ¨-µkýn?†ú•êªÜ\^ÜÚ08 £GÖ¯ø&}t]iõ‰'•ùÕ¼Ü 6ãùí·ÏjåtØ4Ëßx.-ìßÅjºù²`»o"ø.\Âkô¾ ]+M¼¾¸ƒ[¿Ó¦ÓtM$êfàÊ…æw;¾]I#¦¨[M ~ ðd2ìMzØ—È3ç?Jè¬î¬àñÖ°³Lˆ×=œ8óY²G®+˜½Ô´ýFÏâ•ݬÉ%¾mc§‚Q6ž~£­oøæcðîˆÖÅ!³µÔ4é'b»’(W£ã!NZ§ª™/µ Z\x–+¹Ž¥ÜZÛ«3ù,Hsµ1Á>ý뾎úÂk™ì£¸î­Õh•†øÃýÒèÏj±E`xÇQm?G¸çι"Þ :’ýLÖŽb4Ý6ÎÓ1B¡¿Þ<ŸÖ¯QLšhmâ’iX$q©fcÐ^ii¬\˨êv¨_PÕ[ì¶)Ýz±öà~ ×k¢è–z»Í)tê^æá²I=O'µcø^_ímCWñ,ÿ,?ñím»ø#NIüÆŸk¾+Ô~Ýp¤iVr·ˆÿËWÄ}¿ý^´ÿ\[E¨hvÛ SÉs!ô€E[Ò¬&¿¹þÜÔS2ÿ¢BßòÅ;þѪ6Ú¤)qªë>_™$Î-,£PwJ#ôúŸåZzv…Z÷TU¸Ô'B$'•ŒáQéX:¾‰ueö=*ÇS¹Ûw3,0dz±$`+vòOhr[ÙGŒGåFï3¿ú÷­=>ÐXÙÛÛ ~ê0:g½ßc[iåº(ãg`à€=ë†ðF„×Ê5+ÐM¬rÈÖ°Ÿ»¸ž[œ`W¡W-à<6™rýwßÌÙõàWSUíí¼‡¹}å¼é|Î{p*ÅËø”¶­{aáøòRG„vCþ÷øWNª¨¡Tªvç^.ˆëµÎü5®‘ÓÕ¤aŸÓùWB< áí«*¶Õ‘Àü³Y:ÿ†¼3¥ÛÁ •€7·“¤—glßž•Öé:]¦‘i¤ Ð ¶9vîOÖ³4¯*ÿ\յɲCŽ0N?èk‹°Ô#Žø‚^_Ï6vÊÜd'oÇ‚koÚuÕ¥©¸½s%õ×Ï)?Â2H_Ã?R¿Û> ¶Ósi§Æ.¦Ûî‚=ºÖ®±©fÛù—R|–ñwwíøz×3¤¢éšõóÞɆ·ÓD—ؼŒ ÿœÕø »ñLÉut Z:|ÐCžgÿi‡§ù÷­@ÒèZ”0¨âÙˆ\v^qùTžž)ôm2HÈ*-bSìT`þµ‰â?ÛØîµÓÈš`›(?,~Ùçæ5¥ÙϤ*awøV$Ù&Û¹ô÷ÿëWX<'á÷³·´¹¶Y¼¡þ°ä31êr<ýjðW…‘ÅjÊÁN »çðäÔ~Ö´û}Ú[ûåóÊÌl¾C1×íP'‰’ãYT¸¸6PýRa´ÜèNGONkV_xb"ê;‹XŸûç5ü$77ýH»Ÿ=@#Sø±ÏéYú®½â›„ [Xî.,6û™äsÿÚ0=sYpèº×Š5Ýæa´\€ªçªŒç§sÏJïmàŠÖmâŽ(Ö4FIEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢›$qÊŠJ²°È õW-ÿ Óá瘲dFpâ=ÏåçýÍÛqíŒVôºF“3éîöÈ[N}ö˜»~P=Ž+Ôì¯gÔ.d¿ðDИýšî'ŒG"/ÜówÙî¸ÏJÛðï…­ôýJ°ÔâŠ{›K†½È*NÌÍ”ÿt’nMccs5­Äð$“Z³4Ã&2éí‘ÅgÉá_ Mzu4»f»i†Bƒ%ÇñÙ÷ÆiO…ü*ln4Ïì»acq)šh Žçøˆõâ‹Ï øOP†ÎÞóIµš$T¶GH‰@à/ °º&„±\Àº}¸†åUgAí(À 1ƒÀ«†8š3E1•ÚTŽ1éJ£§h>ÒYtí:ÚÖIÖ41ª–úà ¶–¶qÏ5ÌpÆ·Ènp½7§³SQ\¦¦²jþ&Óì—þ=ôØþÕ7¡fû£ëÒºº*­þ£§é5ÅäËc¹êO IúW{â䯝i¡[’yœ|Ò…ì?É÷ô«¾ Òae“\–0²\–[díC€×•^Ô.'ÖïÛG´%ma¾˜~ˆ¾ç½aéZŠdH4‹m4»i¤y]n¸ÉȾµÞCPF‘D¡#E ª:+[oøIÒ'ŠÚ ûåÄæ ¶èsû´<äÿ´Ç$ÿú멬-nÓQºf«gžm «$ á™\cåÏ-´:Ž£r——ðùEþ¢Ùˆ'w÷ÛgÐVÅaø¢ÇWÔía±±ÀŽy•n\‘•üúVµ¥­½•¼6°.Ø¡EDÂ¥oºßC\÷áò´+bzÉ$®}¾b+¢¢Š¯yŸiqy7ú¸#g wÇoƱü-g9†]^ðfûR"Vÿa?…G¶?ÏÐWl‚k?Èë—7Ó©ÇR#WajÁíàqÆèþb¹ÿ,öóèÚ¨¥·±¹c:¨ÉUqØö¥“ÄÑê›mtÞæIF}¥R{’@æ¶4½:*ÎHŽà€–cÕ˜òM\®KJðiµ¾k‹Ûqo ï-¬8áY¿‰½ë­¬;ýRû{jZUÚ[ÜKŠd•7#Ðõ"¦·²‹MY5 NëϸUËÌã ƒÑWµrZLvþ,ñ­y'š¶Q%¾!'‰8ãpôã5è@*€ª`Ú‚x5ËËàÌ´Ñ[j—6ö1g¶Lcž OÀÖ»¢ê:6—cfÒ$*×+ òÓÊNq>˜ü«¬Ðô«›c-þ£µõ+žd#¢îƒ[TU5ÒtuœÜ­œ"rÛŒ›sëœu©æ¶µ¹g…%_GPGëI­°Å¼Ä=@þTÛû´°´¹»pY`‰ä u;GJäìEÌ6§[»e}oR\YÆÇˆÔýУžÜšèô]-4›5ƒvù™Œ“Iý÷n¦´h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(çµs÷^‚[­juû}ü­#ìÉÝŽŠ¼tžž3ѾS3¤{¾êo 'â«»êj£øÄš¿î´M.HQ¿åæä`êOÔý*[_C,Ëw®^I¨ÜøEöÓòÕ«â 7¹Ñoím×ÛŠ£û¼àùW?§k÷—–vN‰lí"[GÅà , ©ÿ<×U§iöúmºÁ=ÝÏWnäÕº)‘ÃEÌqª{ín>§ÞŸEQEQGŠ(¨®-­®âx.#Yb|nF @`€-yö¯oª­ö¯¢[E"^æ £™AÚ«ÕÉ?λøÑcDEèª~ê@–Š(¤$I8“\±Ï‹¯1ÿ0[I?ð"Aÿ²óìx)UÖ5¡MÖ¡ ©Ð~µÕQE0Åu”¢™€}éôQETW6ð]Á5´Ëº)‘£qêæ²ôÏ éÚd©8’k‰£M‘4í»Ê_Eàb¶h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ªZŽ‘¥jè‘ß۬ʇ+œ‚>„`Õ{_ øñŸ ä¹?™ÍjÑE&éKEQEQEQEQEQEQEW5®Ý\j—káëÁ‘7^Ê?å”~ŸV­¤··Ó, 6ë¶+x[húÿZÆð"mÐ-Ÿ92I3’{üÄJé(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ ½¸–·7$gÉ…äǮњÇð…¸wÛ¤ù®oäyæ\“ôgÄ÷ke¢ê2–ÚL ŸwàSü;hÖZ>Ÿnà °+0÷nOêkNŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÕ÷ú(¢Š(¢Š(¢Š(¢ ½»·°µ¹¼œ‘ ¼/4„ ¨2p*®‰®i>!²MCM›Í·veäÊËÔ08 ýE;OÕì59µ-‹°¹6ÓnRð ñê9«ôQEW=¯ø¡ôKÝ;O‡KºÔ.oÖf‰-ÌcXä» èj¼5/m¬u&÷J’î_&ÚK€†)ô]ñ³€O`qšêh¢ŠLŒã<ÒÒ+#Œ«3Ž+#Å:ÔžÑoµhíÅÃZª7”[h`XΦsÐÖ¬OæF’êó¬o ëÒø‹LþКÜ[0¸ž"·#b3œ¿JÖ·»³» m§ŽP¤«ØØâ¤I"1Õ‚±S´çuÏ´Úù&ãÎO$L›†Ð^zT6Úž“z#k[È&YKÌn¤1^¸Á9ÇzÎðÞ¹6¯auyx"„Á{u*Nб1œ÷ÇZ¿g¬èš‹´v7ö÷*î+ŠÄ\x¨®üEá«ÆïT´€,†#æJƒ1•9=FFjÛÞØGlo^â%µ æyņ;»ºcñ®qüc§ÞêZ %ýå­åÌðܘØ1]±–*Ür;ƒ]UQEQEQEQEÄ]A5¼£1ËFßF5Ì[ØxãF†;==í.m£,͸6#¦?™¥:ˆµ»«i5é [;w-´ðéœöüMutQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÖ÷ú(¢Š(¢Š(¢Š(¢²¼Qÿ"þ¹ÿ`Û¿ý×¥àÁ¡k1üš.¯ge¤ |°NP˜úû­øš;‹Ûkoˆ2ÙêiÓ dbîçý\@ÇO×=ê…¾«Ž©áöÑõÍ^ú+»ø­®â¹‚TºÎŠg‘´ýkV×MÕ|AâCu­ßCcis[Ám&ÍŒñNqž:œgšÉ±°×o¼#}¯ÝxƒQ}BÖ¦µd“j§ÙÉr›vsWu¿Éyu¢i÷²ßÁi6£wý›­,'s³*ŽIÆ3Ç5sÂ7×K®]iöƒT“EkØ2JÊÊ2ݲFjɆâñ<)ã›=÷pÇe|RÚ;‰ –ÛiÛ¼18ëŒ1ÅZ×ü'a¥¯†ç¶¼¼ŽúóQ¶±¼»¿™:L>}Ç8ç¶ÇlqW?³ì<âSýÅk6…ys=¾ö)$U°Äá»~4º?„t]oÃÑjÚœ’ͪ_Ûý±ï„Ž&a¹v`ü¡;Ç™‡GT’GûE¾¡ö‚ŒÊf¨í#‡ÆOÖ·tÝ/MиŸG°Ó¾xcÒn•”Äxl" £§Vü+CÁº.‰q{㹬á–y5븤@I@ãœðI9®oLŠtïéŽÞ#¿ŠT?p˜Ë´H}AnÝñ]Oˆ,´{oø:x¢Ž+É'ºŒìAÆqØ•ÛQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿ×÷ú(¢Š(¢Š(¢Š(¢©krê:f£c*Isi4(ÍÐR>Õ^ÓE„è6Ú&¢©4bÂ;YÂçkaœwúW#eðãQ´Ñµ-1µE–y5X¯­f• cÉ J ùºsÈö«z‡‡<¬6wy©ØEq§ÞGs ¼Q9…Ê÷r[vqÓß¶þ‘¢Ï¦êZýô“,‹©ÝE2*©Fäç§µR±ð½ÕŸ…ï<>n‘¦ž;ÔY‚aWÏf#åÏlóÏ4˯ ê(šEÖ•¨%¶«§X¥‘•ãÝñ€2®»ÆFFй¢hº­Õ楫jMy{r©D!…²&[’z’I5J·Õ­mŒz•輸ódo5P ÚOÊ0=‘â/ jz¶¥¤êš~©ö=gPLAà @‚@éìj¼#¨ÝÞÙ^xƒZ“Q[)DÖöëÇtf ’ÄvÉãÒ}ám_ûZóUѵ¦ÓÚý"q˜REvŒmV]ØÁÇê¤~xí5û¬\Ko«„v2ª—IF7>î3œtÀµoêÚ:¨Ò•¦x†Ÿâíç1…9ì}¨¸Ñ ¸Öm5†•·[ÙÏkäàmq!'¿ýkþ[¸£}>Ï_¼·Ñ$v-dª„ª7TIÜþ'ЊÚoéßkÑ.¢- èñͼI›dM¸‹¬o±ÒWVÔ4÷Ô¯VMŸeÝÎPœùY98zÖ¤·ÖÜ[ÚKq\܇0ÄÌHe¶Ž§ñY­â說ý”ÚŘÔ7ˆüƒ*î܇ëíÖ¦ÔüEá½Ú=KQ·µu€Ü•À>X8݃Û<}jM?ZÑ5Wš+ ȧ’‰åTl”®å$vÜ9%¦§¦ßËy­ÂË-œÞM¯ü³|gÞ­ÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÔ÷ú(¢Š(¢Š(¢Š(¢³¼A»ûWÚÅì8`pAØyWŸèš?Âé´M6óS¼…/ZÎ7žV¼upøäÿ¬àæ´<;â¹ôï XÜÝ}£Q¸»¾–×KN<ë´ÜvO`:±ì2krÏÄÚ’jVš^·¥› ¯–Ci"J$ŽFA’„€¤69éƒÎ gŸk—V÷zž“ Ý*ÖibgY€žAËiϰ, ôæ¬FÊãÄ𵮚[R—Ã-s Ó;'Èd‰—<“‚G¥r¶š¶«/„/®2Ð KW—L¸ÓÞh£¹†ÛrÉlãpfbyùWŠë›WÑR²µýºÜo å~ãÐc9Íp6ºæ‹¢ø¯Åé}kq1šk6O"ÚIqˆùÎÅl~8©´¹ë\ÖüQ¦é³XØÅ¢¼¸ˆÆnfS¸6À2@þu>™â_AáÙ|Y®Ijm͈xlíÔÎÄbìÇïØà§JïÅzæm±qâ-&ùU£k½:-ƒb1ÃyN±eÿhsíVµ¯_˯]é^·Ðb‚$¶y¢V7{×$‚ä.ÑÓŽsš·s«x²ÖÓ¿oû/Úîu¨­®^4rÆCa“= j|W>,ñ-þ®Ún¨švŸ§Ý5”@B®óK7³n<(<1Xzn»¨xÃúýÔò[&§7‰%¶/'Ç4c“÷TeºôiGŒ¡Òo´ž1³Ö£¼¾ŠÒâØyA×Íà<~_8SÔÝzÖ…™ñŸˆ5Úq¬tûÑ DQ™rTnua´ºIÏZÅÖnõ½SÂr›íAÍΙ­›ž4L\m‘B³ ç<`dsé^Ÿeo=­´0Ms%Ôˆ¸i¥ ýÎУòŸr3ãÖ7þUç^×|Eká­> ? ]]¬k8Ža4*’íêû‡õWך„ü+¶ŽyV›ká:+|’l‹#pïƒÒºgQ»±ñ^žßhY¦‡¨O$ŽÑ• ‘êµdiž׿=dß^]Â[ã}KL¤Ò¼.¶ìWœÜºL€+=R¹ðtH|5£¥´ÚrÎÚŒ÷›]]—wœÍää6y??¶k ÓÚñ¼Y ‹É£šå¼ÆY#9IÌL²œ ƒÖ¹ûK)Çà ëvj÷@—ûF=½Ñ%o1~…sùVÃÞɯ_x»Åk‰cÒtW°ÒÝyýëGæHËï’£ŠË‹N×®¼ –çOðü<úRÈ×RÏ&C2ÿ¬cå}ày''žõ§g§Cyã Wʽ¸¶ð—æýäiC(Þ¹ó“‚@«ž"¾±ðOŠàñÁò¬5]6kk£Ñ|ëeß>ì¹Q[l.-<=kuv?Óµ6mFèž»çù°~ƒºš(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢³µýßØÚ¶Ñ–ûÎîvJÀð‡‡<3qáÝ{ͦ{(]ÙàMÄ‘Ôäg'ÞŸâøæÓî¼;®ÇlóZéW2­Äp®Y"™6ï 9;:œ•FmNÏÆºÏ‡¿±L“Xé—O{wrQ••HD€Ëy ®kQ—à &§"Aªè^(yî‚ÃÎ+s(û¬ /–ÊÜHN{šê4˜5ïøJt‹N>Ñÿ’Çu*¯îüï5K Ž7{W9,·má_h‹cvu =ad1ù/†Wº ¥#ñœzWIq}'…;K gB&‘"æ+׿'€yÇÖµ¼ic}uà™- ¶’[“Šù1®[*éž9éÞ©ø¶-&çUò¼Cṯ,Ä1›ë4v‘[?29L2óÈíúÔþ—ZÐü;¨Ý\ÙêWQ%ä²XZJw݈©É뜜$ íQ‹ª±R¤€vž£ë\‡ŽìõøÆŸ­híq©Y4°ˆ“ôÛý?ž2Ó5èï-ÖÊÖqöe¥ÀɈî&\gÏì;VL~²¾šÂÚÇáõŽŸ7œysw &8UOÌ#ÚrÄÿ àþ•Þ¿†ü1-çö„š]«^ù«/žc]û×9Ær0+;AÓu+_x²òâ½äÖfÝÉÌ„9gâ¶µH&¹Óï „,¶³F€ô%”\ô>¹½ð=·‡®ÔAsý™ ,ŽDŒã €EbǤx‚õ-l—ÂZf™8‘EÕñX^0«ÔÄ›rKvÜ;Ö¾µ‰EåÜrh–úæ“2FÖñ9ZÝ”r§x †<ƒÚ²ì|­Zéú +1â±ü!£ÞhŸ¦]´m< &ó%rÎ[Œ€{úRx§G¼Öìí-ídDxuK–2gbpHã<ã¥3Äš&¥¨¾¨iWÁ©é²»ÂfÇ"¸Ã#ã ê:U+?ø‡QÕ­µËhßb†h­-mClQ†w,y8à `V|ñÖŸc7‡´ýRÑ4VYc‚wG7PÆäüƒ‡À'òâ”ø'\¶Ñü*š}ô ¬x|-äV0Êvº‘ÀÐö«6ñ,¾ ‡Äæ¥o1]>[CiDFÈ?+3}ò9öª©àßÚØ?‡lµ¸cЛr$¨¡bs¶í½8 F@íZ^Ô Ö4=KD¼ŠÚ+ %ÓæŠd/æ[† w 7Nko^Ñíµý*ûJ¸b‘ÝDP²õSÔÀ×'¨ø/ƺæ›ýŸªø–0‘0ýšØ(wŒ‚­.]²=B쮃JðýÍ–­¬Üݬ×¶VpJ¨›T4 å‡,pÄð;zš«?‚ìoÄëypòA®4 T  K€TóÈ<Ž+.÷Àž"Ö-­­uÉq¬ÑKXwn²sÉǰy滲A®<­éFh|5âiôÍ>YZO²41ȱ9>Yn@öæ¶4Í/EðN}wuy,¦Y>Ñ}{rrò1Ààp@â°~é^v½â+tu¶Ôï¥[ #mº¹9PzbN0;ЗÀ÷O|Ú.½u¦ZßÎ÷ñ$l<ÇûÌ…*[ñúSï¼a6¡Øi××:{èòù–×dÉ6íÀƒ»9•$ïR6±•6÷LL—ÚTú­Ö­0y%¹Ó³¥ˆòÌ[‰æ°døiáY…¤½þÍyßÙ¾{}—vs÷=3Î3jßm J}N\ÆEÜ6Od„DÄ6ôê=)4½HÑô˜´KHØ#‰â»ʹ$‚O<æ“@ðö‰á=4Í*&ÕßibÄ–9$’I?‰¬øVþ óüÃk)·ùÂÈÍ'Ùƒç9òwlëÏÝǵn¶¥6§²aÿOŠÕ­Lž#fÜF3Ž¾Ù®_ƶ‡Šnl<84™À^ÛÜÝßI·ÊXÓ$ªs¸³}ß»Æk¶UUTa@Àµ-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢€FÈ¥¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢'€+”ˆž|‘-åŬV[¨mähW~`9¹Ñéú†ŸªÚA}a:Ok:îŽD<þzÕš¡£jöõ„•‘so1}›Ôƒò±SÁ÷~Š­¨^çY]ßL¬ÑZÁ$îïƒ'9ühÓïaÔ¬­/¡ "º‚9Ð0ä+ŒŒûÔ·%´3Nà•Š6rRgŠ«£ê–úÖe©ÀŽ‘]B²¢Èå±Á#?‰«ÔW7áÿi"ÔuM6Ö9[ûÏ·l˸©dÁ<;ÔWIEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢«j6«}c{hÒÖâÞXK¯U¤d}+‰Ò¦ø‘á{4ét+mVÒÖ?.)¬¦ì‹Ó(àr}šªÚëxvÒßÂɧϩkŸae¹½œ²ÒeX‘•œWAgáïé:”öºÝÍåƒù‹}ó<•¢!F=GLå’c#ßë[úuÂéþ#ø…x–òO$QiÒ˜â\¼¥a8Uõ' ¤›Å5Ò ³Õ5.Î->æ[xÞåo´Aæì¨V#<­Z¿ñŠßÄ7Z‘§Û7•gÇÚ®‚¦îÅTdäôÁê…—‰~"êÐßýMÓá—Kžkk¦šG+<‘õ`?½ëøÕãã ËÝ/A›K³Oí-i †)؈áØ2ìä ½89*m7\ñ ¾¯¯Åi¾ò$´¸´fÚÍ,Œ­È rpEu4QEQEQEQEQEQEQEQEQEQEQEQEQ\7Œóÿ OÃóÿO÷ƒÿ!йñ"úÚ×Âú³×:„FÎÖ÷¥–^QÜ÷¬SÕ¾¿¦izE…¬Úö™áëhå½½‘ÂGq„s–$Ÿ—Ž3Ú«x}n§ñ8\ÜZÍ;[Z‰šÔ[É`F nG~sŸN•›4—Íៅ~C[5±šÜJ×Y0ù¢"#Ÿ½Óý¬WA©/‹<(º–£§E¨Â×2G ´R™eˆ¦’}Ûô®£Å÷ÖZo‡u«ËËssm”ÆX#ÌR0W# =Ïa^iã u»_ÚÿhjzUŒ†Áml,ã$°¤*ÈÎsÎBk­Ðç´ƒÇ.[×T¼š=¬Ë‘—·s³Ø6wc½qšŒÚuý‡Å)4¢&±þÕ°{#øÑByøÇn>¼×AñCXð´þ²Xn­åk‹ëÓÄl§•pI\v ‘úS$]rxWZ¶ÓZê×O’Óí‡ó Hp„º}ÖÎqž¹Åe_B—ÚOõ }QµX^òÀ_46á"anÃÌØC>ì/Þ8Çë_âG‰ü!wáëH­u [‰®/¬ÚÕcub6¸$àgnGn¸ï^™EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¨ç¡”’c`úW! xy5oiú6±o$,ö¸dq‰"pÄ«FS‚+Ñì¾$}ŸÇ^t°ÐÙÁmp¼ “ •.„ñ–_Èš¡¨iV÷:bdxCRkè î.oÖ,Û ¹,íþÎ8ÏÐ÷z\òx¯QÔžÒX­.t‹/-äù²IR:†Å;Ã6zºx¡n-ž#>µy,±ûÄeaŒð}ë—_ ê'BðuÕÖo%Ò’u»Ó¤+½’në“·rœ23ëZ>Ñí¦×SR²ð¤E¼ ‰î"U¹’WãäªrO'µwÔQEQEQEQEQEQEQEQEQEQEQEQEQYç†<=âO²ÿjÚùÿevxHwR¥ºò¥Oj«¦øÁZMÒ_Yé‘‹¨óåË!gdÿt¹l~©µŸø[ÄÃs©Ø¬×¡D”3+…ôÊ•${il<#á=.ïíÖlV÷Ûì¤Ç<çAÁúO½6ÇÁÞÓ¬.ô»m2°»}óÀÙdcôb cýÂ~ðü³O¥éñÁ4Êää¹QÛsqíšÖ’8¦â•ãu*êÃ!êô¬øÖ+ˆaÑ-;ˆÚ9–Tœ•ç8ì0*Åï„ü%©[YÚ^é6·öh©n’ "5 ö«–ZF¦™ÍŒæp‚_)w„\àƒT­üà»V™ Ðìc3dÛ |Ø9ç^jèºÌK§coyœªÎŠÀlƒSÚÙÙXÁ­¤ÁoÚ‘F *`0*”ðÅ©­ô«8ŒìR‘ ÞAÈ'ן­iÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Ž”€‚ ô4´RN$Ób–)‘e‰Õãq•e9{}QEQEQEQEQEQEQEQEQEQ\ÏŠüKªhSè¶švŸ審töè%”ƨ@ÎIÿÊ›kñ1î![­MŽÜÊ¢WK·,©žHHÉÇNEt3ÞXÚ˜Öââ8Œ‡j`7AšÊñ»>>…p¬‹¨êqÙ¹cŠÊÇp÷­;]CM¾2 K¨g1¯å8m§ÐàœQý£¦Ž3uùwùk½rÛ>öyÇJ]Z4jFmöyžha³o®zb£¹Ô4Ë;qwsu 6Ä%‘ÀCžœ“Ži-5-*þ¹³»†{uÎé"ueë’ Ucâ? )`uk1¶%™¿|œ#z@Þ­^ßéÚtêúæ+{pT%`ª Ož•gÉ®/Nø£k~#´Ðôu7½¼òÏpÊê¦02Œç¹à}jÖ³â|ëiáßÚÛÉx¶böæ{¶aHÌUFd³{Œ{Ô¾ñ&¡­I«iú¢[jzMÂCr"bѾñ•d$Èìy?ŠüA>ƒih,íÖãPÔ/"²³‰Ûj´“–?ÝP 8¬˜üAãWÒ4ÿÁ`öº«¼Ïdd9”dž #½2/ø×Äz«xrÓ´Û¹,÷Þo/s,nÒ¨<sšlŸ$¸ðÖ•ªiö@êš­Úéöö’·Ê—!ƒÎÕÁ=G¦j{m{ÅZ>µ¥i$ûÑêË*ÚÜÚ+®Éc\”uflƒü$ôªÚ­ßÅ]&ÚöþæûAŠÊÝBïù :dëôï[Þ»ñ5þ‰iyâáŠúà<¸U”"ºbÇ8ëÍnÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢¹/Owom ›y剟ÄÞS.¤œ©Æ2qV¯|Vé©Üèú^™>¡yir\ì(©~Tb>b9õ¬?x„k~¿¼²6WßÛÛM²Ã"Ì”•lwìÄk¨ô3êÿÙpµÃÂ¥¯&R6[d|ªÇ»7 è98£Aנ׬f¿Š‰c¸¸€«ã'Êb3Ç­qÚljÚö?ø†ÞÊå¼û«–‘¸ÜìÊT)ä)çžzWE§ø§PmJ×JÖô‡Ón/#w´o5dIJ ²åq†œcñ©|uŸøEµÜgþïâ–ÞµñÓƒ]MpÖíhd?+!mß6Òx OÝ«úþ¼ÎF™k Íæ‹{w4»°cŒ'Ê@Ç;‰ÇQYz>½u¥xgÁÚv™f·Zž¡cÛÄͶ4D@YÝ€8U€’x­[-ÄPê_غռW“ÚÉ=Œð90ÎP|ÊA”Ž¿Å‘YwŸ¯-ü'i¯Ç§«ßK!&½c£L4©ÙÀšì[¬¹‚òijc'¢Œ}«º¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¼ûâD7³ê~ K;¯²Ü6®ËÛCl%zí$[Ú~ã;{¸¦½ñ7Ú­•²ð}–4Þ1Óp$¸+Ï kQ¼ðxÖ¥»Ô/-Þ{‰â7*#E~T(±“ÍC{¥ÜÝøgÁšNºw@|V–À$ÂCä|ûN å<×Oâ EðöµàëÝÒ+¹µAa"[ Q4Œ\0\gn23ÒªøÃú2hÚÆ­ö5:”×Z’ùΠºÌ»Pö¾:’it§~eÈU¸_›|¶õª³ýŠçþ[(ô†Ö5‹m ;¨`–EKh¢©’L†ç<.^(Ñ ¾¶ñ7Œ`¹³²²’_[ÈðX±1†ùÆX•L¶?Ùb­ø/Á¾¿øykd¶qE&­¥þþeQ½šNrO^1ô¬Ý7R›ÆGÁ: Ð&m=å»ÕÐõb|µ þóó^µ\F¬?ââxd箕|1[7º†Ÿ«_ê>[›«;ô³Šäͼ¶lf6;ºƒò÷®oÀ‘I¡ø‡ÅYÚú(>Ï|ײàÌÏ0åeaÔàqÀâºköÞ±Žéížîæ[„·³·Œ òÌùÚ žò{ ÇÒü3âOU³ñŠîc7{ÚÇO¶ÿSl\`–c˾;ðj¯ðæâÚÃN×ìn]a›MÖ¯¾ÒµXîÙ#Mqšbý—Jð‡ˆn?w§·‹îîrÃ"¹,¨çÐtçÞ»_4:‡Š< §@áî"½šþ@¼ìŠ4êÞÔÓ¼P¿âmà sg m«_§i6Äj}‹r~•ÛÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¬ÏÝj¶:F¡u¥Â³^ÃIl GQ€A'0kˆÖ¼I¥x¶/ Ùi’™õÕ¬n§…³ÅË™3÷@÷?LÓõ-e_Ä:ÅŽ¹¬ÝéPAäýŠ UÚnP€KùY˜çŒ1éÞ¹ß> ¼ã >Ý.âº]r)|©ƒý¡Ri#ØÍžr@=Ív:ø7ZyÓéz k‹;‡dœÞ$âûÀŸqYÞñŸá»=OD¼†àêñßÞ¼V© –œ;’¥}r+.Ò[í;DøuxtÛ¹~Ëwte†8غ)Ü +×ÈÏ\`s]!Ôlü_â M.9d´Òž{«‹—ÑC2XÁ`¤¶y#nøÎ9%ðÖ¹hÎíc0 €’N;“QøsDÒ#Ò4g“M.VÆØ¹h”:¶Áœñœç¯½føî]B6Ò=ôz+M(Ô[O æ—ä'Μço=+EŠÂÓÅÚmõ†‘©Cau§Ëj·w +4²¬7‡,ÊîársRÙøsR>0¿Óç¶è+%Þ©„-Ôb2€ôã,ižÑüH4ÿM«ZºÝÁ§És$Vè~aêŸÇû;=kE±ð^¸4ˉ͖˜lï­#\ÍÈ †Tã%HäuÅlZ¶£â_iºŸö}Í–¤Áq±®—cÏ,À•rNÐ;œsYv~ԛź¥Å³ åü/‘å»EFQôùãRxCñ ­®±>³nËt-âÓ-UˆËAl˜südŸJƒKÒüI£YxCW]6Y¦²±–ÊúÌóR9C.N R9É®5¯Ü>§¨ÛèòGa š¥•œÛD÷³ ¹ù¾UQØœšÏðµÞ±¥)7>Õ$Ôu „}BòCâRv à8«Ðh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬­[@±Ö.ô‹Éä‘dÓ.Ì!›Ãpxü«V¹[ïi÷3ßMg©jjß¹’ê+9v¤Žz¶8'¹\fŸ}à _i:VˆÐIŸ¦Î“A.TîPG,9ç$žAÏ9©4¯išmüzœ×·Ú…Ü1¼vï{1%_®Á€=Î ÷­-DÓô+Y-,÷˜¤¸švÞrwJÙ?‡¥sMð·Âoöo5ûi’<Ž4ÿ´8·Œ·9UèyjÑÔ|  jiНui6™l-mn-fd•b ¥‡Pqß4Û/xWN¾ª\%Ë[Io;yÎ~Ò©—$–aØ“Çà1©okcá;ki¤µ°·ÛåäeQÐd䟩®wÀÚ±ÞøƒÄ×zq°ºÖnƒGo&<ÈáAÆü†s–aŸJíj„Ú6“q©ZkÀþÒ!†\Ÿ•dûÃÇ>â«ë>ðþ¾ðK¨[nžËÑ»$ˆ¨…[ëRè¾м=ÛéV‰n’>ùÉiÕ˜’Iú“L×<7áÿE :½ ¸Ž <ÈÁf[È*EgÙü?ð>Ÿs定#¸‚A$oæHv°èpXŠŸWðWƒµë‘y©é‘Oq´!s\°F@íœÖ¬Úv›sfÚ|ÖÑ=“Eå ›=1ÓŸ¢xSÂÞiŸHÓâ¶y‚«ºä± Ðd’p=3мšf™ôºšÛ ¾–çÇÌQNBçÓ5nŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢*HP êh*¤‚@$t4¼QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¤Èõ¤ó"þøüé¦{qÖEˆ¤7Vk÷¦Œ}XSMí‚õ¸ˆcÕ‡øÓN£¦ æîö×üj®h ¥Ž¥jw2¦?5õÿG&©h¹ŒÊƒ9üi£Ä~líÕ¬ÎÑ“‰“Öÿ †°ö­žOß'?­/ö÷‡A êv™\dy©Æzw¨eñG„ dIµ›gû¡§Œôæ ŸÆÞ¶sþ!ÓcqÕZâ0Gþ=QÿÂ{ð÷ƒÿ ›ÏóÿT‹ã?¸ÊkvN3Œ¬ª‘§/Œ<ĪjÖÌG]®ò§/Šü*ÊYu(HH4É#ƒk0ÓõÓìï“úS_İ"†þÍÔ8À¶|ÿ*†_Gm6¬üVÙ±üé‡Åä ÿ`kén?øª‘ø˜þ™«+«k¬ÿ`\.éaçé‡?Òj¾!ãþ$r}øõBubLxnBT ™¸‹æ?Ÿ¨¶üoÿB±[¸¿Â¤M_Æ­÷¼6¨3ŽnÓ§¯ iÑêž3fü= ž~Ô§ÿd©ÒÿÅl}9<}¤ý’ßx» ßpè>ÔyÿÈU]ïþ!qåèzyùŽw^¸ãð·4Ó}ñ~DÓBg©½“?—Ùÿ­ ½ø“‘J#8½—ÿ‘ªcqãòW~˜¾neÈÿÈ·¹0Ænb£ÌIP{à?RQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¨®RæH]måJ@Ú컀ü2?fµ‰È;uxÇèã¯ý÷Lm;ÅD ºÜjxÏú2óÿÔ_Ù^/9ÿŠGxÿÔð‡èû·Hž?åöç{y˜§Eá-"åd¾;ú?ÎJ’? h‘ nÎüç7Sž¿öÒÿ·œìœýg—ÿ‹¤ÿ„[ÃøÇ“.?ë´¿ü]Bþ ð»±f¶±ê|éøºgü þ±¾’/ÿÀéËàŸ*•rFYÉ#êMMÿŸ…°Ãû><7^¿ãR øl„X8¦ xM¾ö—nyÏ*)?áð~6ÿcÚmôò×Ê¡ðÎ21ýÚ›þ_ç?ض9çþX§~½ªa xmF—h1þ©:~TÄt»B_Ý'?¥3þ¿ Ð"Ëþü§øSLJü6¸Û¥Ú q…œcÄzaÏL\GÿÅS“Æþ1^°p§lÈyü =|eàÇÆÍ^Õ·c\þU#x«ÂéÚ„C¼~•XøçÁJR,+m<7_Ê‘¼uà´fC©&åë…sü–‘|wàÖm‹|űœ¥ÿâ*OøLü-»h¸”œþ¢nÿð x³Ã§v&›åëû‰¿øŠÅ~T2o¸*?»o1þIP7¼:¨mùã etOååP¾5М9X5"dŸ°]ñªjxßD”¦¨ÙÏ?`ºõŒTƒÆY8ZŸP?ãÊã¿Õ*DñE›ô°Ô°sŒÚÊ3ù­H|Cÿgê?ôîÿáZV—"î®rD$\ì•J¸úƒÈ©¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¨®dš(d’LÒ*åcÇÓ'²F­âRÄÂ? ]¹Ï\ôëPÿlx·ÿÂ6ýNÚbÉÿ?Z’OÅÒgÍÐR1Û7*Oè¿Ö¤‡Š]'þ^ÿ‰¥[ÿ“£ÄOhüE)½ñGm&ÝnûY¨^÷ÆøÌZ=‘9è÷l8ü!4Ñyãã·:>œ8çý2NþЗ^=#çÒôÕ;z ¹?÷àT©?‰!ìtõà‹‰?÷èS–O7Ûéàäp%ÿí1JÆæœ|òñÍÞ7ù³Ðíùäý~Z†Cñ¢ùCJÆwH>¸àR"üF8ó$ÒWžp³ý˜U¾4Àýîœyù$ÿâ©Êž1þ)´ñôŽOþ.šñxÐÿ«»ÓבÖ×þZŠŠK±>^£¦ çÛHqéÿ-Å0Z|BÉÝ«i˜í‹I?ù"“ì_ˆ_øœé¡»âÎLéEX~1ØjÖ{òrVÕ±ÆcO^(ØjÐïÏ%møÇÐÈj6ÓüVzkQGü»Ÿ÷ÝG&—ãl§ˆÐZ¯õzjé0Ý–ñ&W=¬âj_ìŸdŸøH$ÁèqúR+Ä|g_àsûˆ¹ý)çK׉ÿìÀ{E¯û´ +\ã:õÆ;â(øƒP]+´øžürNDvÙÿÑ?Ò£×6€Þ,Õ ÏP–£?ù¤ÿ„wVÚ£þmO#98·çŸúãOO^¨ùµýIŽ:“ôˆS‡îÛzˆàttÿâ*'ðÌÏ×]Õ$ñ"ý’£“Âo.Üëú¸Âãåœ ûœ'Z„#!Öõv'øÉÈú` ’? Ãl:¶¨üõk—Ïô§§† Wi?´õ3»—ÀÁì3N ZÉ×ú9à]J:ýSºsóRåvçí“çƒÔÀú$›­TäçþB_üv•< &G©6F>kë£üå©WÁþ]ßñöwuÝu9þrTßðŒhXÆÉºcý|¿ü]DþðÌ€†‚R í?¿›§ý÷Lÿ„+„06²à ™¥çÿ¦'<²®Ÿ€Ýy'?øõ=<àÔvuÓSsu%œÿ6§ÿÂàü(:dGnqœñŸÆœ¾ð’#L‡æ7)àŸÉ·ÌÑ,ßoÝÝœ~•x áóãw‡´öÆq˜ŒþŸð€|;àÂ7¦ñÓý?þ&¦‹Á^€b/éÈ7nâÞ>¾¿v¶`‚ÞÚ$‚Þ4Š$D@¨öŠ’ª]éZ=û¬—–6÷«´4±«=2Aâ« øXòt‹#ÿlSü)G‡|0:i6c·ú”ÿ ‘t?¯ ¦Ú޽"Nÿ…=t­[rØÛ†õ®•Iö ;öX¸ÿ`…(³±_»oú(§ {QÒ$€§¡GáNÚŸÝ`RÑEQEQEQEQEQEP3ŽzÑEQEQEQEQEQEQEQEQEQEQEQ_ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¤ÉÈã×Ò–Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÙ endstream endobj 6 0 obj << /Length 48 >> stream q 595.28 0 0 841.89 0.00 0.00 cm 1 g /Obj5 Do Q endstream endobj 7 0 obj << /Type /XObject /Subtype /Image /Name /Obj7 /Width 1280 /Height 1736 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 43397 /Filter [ /DCTDecode ] >> stream ÿØÿàJFIF––ÿþ@(#) Generated by TJ++ÿÛC  $ #," '.0,)7(44418=9'.<2432ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ ÈÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÝ ÿÚ?÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š*+›ˆí šâEvH‘„jYˆŠ ’}€5‚FÕ¯ÿGü$sgØšŸýûOþ.Ÿý½q€±u‘8ÿÇé·n;hÚÿ€ÇÿÅÓ_½wAÔ[ŸH¿øí#ëÚ’¡eðö¢ÍÏÊ ýeõ¨‰5ÝãÂú™Ü2y¶ù}ï¿–i¯â]mzxOTnOFµÿãôk¤‘ÿ¦¤0ñÚóÿ‘èOëÎN|)©.3ÚÿñóR®¹®»ÿÝêд–üñí) kšñRá¼>Ü éëþ³¥Jº¶¸Øÿ‰ ÀÉÇ2ÃÇþ?Jº¦ºÇþ@s(õ2ÅÿÅCªx‡ R=|è¿øªoö¯ˆùÿ‰™íûø¿Æ£ÇŠ÷IŸ ¸PÓöˆ²ß¯õ¦mx¿ÿÂ3&yÀûL<þ´­xÈ.WÂìO§Ú¢¦oÆøÈð¶}¾×øQýµãœgþa۵ǟý¥þÖñ®õ_øGcÚFK}­x?÷Å,z§þ‰:}­N?ñÊrê^1#æÐaS»ñô:zÿ«©~ßâ­¨Fâ>aö‘Áÿ¾*6¿ñ'n‹lW#­×?ú*‰/üj1è¶…½ìý¢jÔ> üû4+ƒòî½a‘ïûƒMþÐø‘–ÿ‰š§??ù/Mkï‰âi};ÞÉÿÈÔ­{ñ/º6”}?ÓdÿäzW»ø“°Òt¢üäÉp?ò^wñ(Žt­(ÿÏܽ1ÿ\)VçâIûÚf”8íu)çþü ”ÍãíË‹-3o;¿&GþB©Dž6#-o§Ž‚IþÈ)»üw¹¿s¦mãoï%ÏãòR3øóË™³ä—9ÿ¾*ß¹ÄzGCüSuíü4Ò~&ñ„ч¯Í7øSOü-ÃEÿÈÔÅÑõÑò=<‰˜l¾Ž>\,Ý}ù¿mö±_k1›£Ì1‚>À’qøÔµ™¨¯Š ÑÿeÉd°ygx¸W-»=¶°ǵW1øÜ·r¯ýrŸý Qäøçx?lÓD{zyg?_6£0|@ßÅþ—³ÓìÒçÿGJcÚüE$ìÕ4µÁæÒSòúÇÀæ£ûÄÌÈgIÎ?çÊ_þI ØüJ?óÒ‡óã'ÿ$Ò­‡ÄŽ7kšf1Î,dÿäš’+ˆýv·§·ÃdãŸÆàÒ­‡ŽÁõË#ò€qfÜŸûÿR›óÿ›üÿí´‰aã þóZ€Œ ®9ÿ¿†•´ÿvëpŽxÿFü]@tŸ–$xŽ 2p¢ÿñt¤xݘ‘âHÕJãh´^¯/M:7ŽOüÍ 9íiÿGö/Ž9ÿŠ {bÒ>?Zoö'Ž8ÿЍÿà$_ãNMÆa²þ)v\t°ƒùÿõ©ÇDñ†Ò?á)”6zýšð§Å^QSâY|ÂÏöxx?Mµ2i^!\î׿lÜÃÇþ;Þ¥xƒ~bp|˜øšoö.¿¼·ü$—{N>_*ßéû¯ñ­kXf‚âšáî$UÃJáC9õ!BÈ šŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(£"ŒŠBÈ:°›ãþðüé<èç¢þb“Ï·ÿž‹ùŠO´[²§æ)>×gÓÏþúŸl±çý">?Ú}¶Ãþ~"ÿ¾‡øÒ}»OÿŸ˜¿ï¡þ4Ó©iKÖòõuÿaÖ4EÆëûaŸYüi§\Ðs©ZŒdÞ§üi?·¼=´·ö¦ÐpOš˜­4ø‡Ã*BVÌ1è ÉŸçMÿ„—¿ô²ÿ¿Éþ4ïøH¼3’¿ÚÖyyÉÆ?Q¯xtàNÓ“õ©×ó£ûßô´ÿ¿©þ4 Ç8Õ-ïSüj&ñO„Peµ›0N|ôíøÓ‹¼Wp×, ú‰Óüj3ã_¨f:þœœ1ûD|sïTmãχÉÞ#ÓFFGúD|ûêš|ðìuñ&›ÿÿñTáã¿g ÓʨÉ"tÀýiÏãŸF}vÄÍ\søÒÂsà3Ó]±<Ä«ÐuïÚ¥“Åþˆú­º‚qËS‡‹<*T0Ô¡*Wp œëLoøEUØêQa3»¯¥G'üKêqà(nÐR?޼ÚÚœ`í-÷[ ü*3ñÀî¨Há·üš~!xiôŽOþ&øX^àhžFGî¥ÿâ)Gı!o˜3Ä3tÿ¾*OøN¼!œ}®Lóÿ,&íÿ©Œ|0s‰æ8ÿ¦ñäñw†Üº¬Ò’‡ û‰¸ã?ܧŸèófÀÿ¨—·ü xmÞsÜZ\ùùt×ñ·‡#PÅoˆ ‹+œóíåVÝ¥Ô7¶ñ\ÂG*î_1[êÀøSÖN¯â-;D’(ȥ¶¶šPõ1£øâ©'´Y iªä†<Ø]ŸX©¿ð›è¥•žªKt?`¹Çæc©¢ñn›)p¶:žPdæÎqùe?•=icñˆ]öŸ ê(?¼ÒÚã§´ÆŸý½âêƒÃ¸oâ2Ûà}{ŸÒ¶­ežx#–hÞFhœ©+õ*Hü‰©¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š*+›x®à–Þ]Þ\¨Q¶±Ђü d h¨¹ÿÀ™¿øºV🇘`Å7ýÿ—ÿ‹¥o xyÀ §#÷ÒÿñtÓàÿ £ìÒaFï¥ÿâéƒü0Ç&ÙÏý¶—ÿ‹¦ŸxL¸Ù±`æY{ûo¨Ãÿ ÓÎ@~ö^1ÿ©Àž M›táòŒ »ŸæÔ¿ðƒø,0oìÈ÷œå³üêSàï çONzòßãJøzÜ·‡tãÎy‚?ð¥_|=O»áÍ4}-ãÿâjDð_£ÆÍO\g‚?ð©Ç…ü&a£ÙdcÉOð§ øX3¸ÒlÃ8’œãð§/‡¼2€Ò¬À^ŸºN?Jwö‡ºfZߤÿ Cáÿ œƒ¥ÚõýÒ…!ðï†[éVg3 qúSáð©9:=–sŸõ)þááï ¨ÀÒ¬À'8§_Ê•t «o].Ð7¨‰3ü©F…ááœi¶£=tŸáOþÇÐ÷þ϶ÜzŸ-rJrézJ}Û8œð‹þïìý4ˬ?÷Àÿ ?³ôßùõ‡þøáNûŽ1öx±þ襖C¤ø¥û5¨ÿ–)ÿ|Š_³ÛÏ$ü…/“O-!KåÅÓ`ü©v§÷ESû¢‚ëÍ-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¤ÊúÒoOïÎ2!Éuüé¾}¿_11Iö‹^OšœuäR}ªÏþ{Çÿ} >Ùe‚ßh©Ü)ŸÚhëuýö?Æí3Ÿô¸xÿmÆ™ý­£cwÛ­öôϘ¿ãL}oAp}FÕvõÌ«ÇëMm{É÷µ;AÎ9•?ÆøH<6:ê–}qþµ?Æ™ÿ '…€ÉÕì±ÿ]“üh>$ð° ^ÈÓ÷ÉÏëH|Má1×X±YÓüiÃÄ~a¹uk"¹ÆDÉþ4¿ðødgþ&¶|Ódÿ»ŵÔK5¼©,M®„888#ÐÔ´QEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÐ÷ú(¢Š(¢Š(¢Š(¢Š*9þÐb”[•lo,¸%CcŒƒÄVFÏùci¢M¼ü’ã?÷Ý8'xÝ6ß8ŽOþ.†Oçå›OǼrñtüfpEΞ8äyRñÊkÃãr>KÝ8x$ÿã´ÁmãÒ²gQÓCìÅ´˜_ßsúTbÓâ&Ü[Lßëö91ù}£úÓ—ÄœŒë:^;âÊOþH©—Ä3¬iÝ9Å›õÿÀŠq²ñÖübÇËÏO²6??úSþÅãMŒ?¶-7çƒöVÆ?ïõ*!?âo<îÅ¿_§Ïþ4}ƒÅ;qý±lõû8ÿâèm?Å$kQƒÛýñuöo‹ùÿ‰ô|ƒÿ.«Ç§ñÔgIñžÜÂF¹çì©ü·RÆEqÿ .ÔZÇýI§&âÐ;0¶ˆb¥Jñ"…¯ÈÄu>DC?¥)Ò¼Fzkò¿òÂ/ð¥:_ˆ \k²€:þæ.ñÚéÚÑ$fPo*/þ&›ý—­üÙ×'çÄPñÿŽTØúé$ŸÝ1ÿÑuÚ¿+n(¿ŒcŽ;l~°µ'ü#ÚîÖÅ:ŽHPË^1ÿl;ÔgÃZù?ò6ê˜öKOþG¥ÖñÏ‹5SÓøm{Û ™ИäÝj¿ø0»ÿã´Ÿðƒx$ý£Téù]ÿñÚ?áðîóµ>?éþïÿŽÔ‰à¿§G¿(c:‘B0A‰p~¼T_ð€|<ç>ÓŽ}`Oð£þ‡g9ðÞšsÿNñÿ…(ðñÀðÞ™ÓñïÿOOø.cðîš¼ż}üŸƒ< zœ¸é‹xÿøš°|5áR6È®s%?”xoÂëÈÒl‡Ë·ýJtü©ßØÉ?Ùv™=tœþ”ÏøF¼+¿Øö[xãÉL*†¼*Ic£Ùz“ súQÿ×…xÿ‰=—ôÅ?”xsÂàäi6Yü”ÿ Sáï ±ËiVdûŸáOþÄÐÜi¶¿/ÝýÒqôâœ4m AO¶œ#^JzéšJŒ-œg8¿áKý¦sþ‰=~Eÿ 8Ô$jG@§QEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¤(t´QEQEQEQEQEQEQEQEQEQEQEQEÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š)’È!ŽIJ³RÄ %Ž=äšË:ü ö þFxÿ˜Þ#…HÙÚ‰ÉínÿáCxŽ58þÍÔOâ¦?‰âŒt­Lä‘òÛ±èiÅÕ™t}SŽÆ üȦÂTùh:±È'ýJöú½J»x­…Ñ5' Eýd’뺂W@ÔöÉçó–˜úþ¨¿wÚ‹ý ¿õ˜S?á"Ö'þKƒÐµ¶OþG¦ÂI®üØð¦§Æq—µçÿ#Ô£]×Ïü#W㞆K|õÿ®Õ(Õõ£·þ$`g2AÇþD jÚéÆ4 ‘ŸYaÿâÍ?ûK[ù¿âK/ ûع¿zêzö49OóÖ/þ*›ý©âø‘H3×3EÇëQ6¯â ¯‡]qöˆ¸ýi‡Xñ~Ö#ÃM¸€nbçùÔ©ø°&äÐU›#å7(>¼í4£RñnÜ 0Û€ÇÚW¦zýÊÛüQƒÿhø$ôÈÿ¾)EÿŠ Ñâÿ¤?ñÊ ÷ŠsÆ=~ÓÿØR}·Å¤œiàq‚nOÿ4ƽñ¦@MÏ9&íº{~äÔK}ñ‚N‹§ƒ»}µúà=5¯~#¦vë{'ÿ#SßÄ<.4,“×7’qÿ’ô¦ëâ˜@Òô¿/Œ7ÚåÏ¿gþ´‘ÜüC'÷šn–£ž—RŸý *T—Ç';í4ÕôÄòý¤)ìþ4þ4þ䓯ýñI¿Æù?¹Ó±Ž?y'ÿP#|FÜ7Ǥì=?Ý¢Cñxò“IÙßsMŸåQ¹ø˜OÈ4p0:™ô |K%rÚ8\üÄ åȧ²üFÏË.“·ž©6ô*‘Ç™dÚfݼâ9zÿßu!OüØ›Oÿg÷r~¿=2tÿÀšwØ>"×4àsÉOÓÛý Ôßañ¾ä3gúôoþ=O[¥õ‹r3ómŒoÞëN6>(;±¬D9ãýp?ﺉ´ß ëÑœ‘öQÏþ?Z¶1^AmwwiAß(P»¹þèÎ*ÅeêÖ:õÛÂtÝXXª‚|•}çþF1Y¿Øž7É?ð”ñØ}’/ñ©Eñ~ï9;²qmON‡üö§.â±&æñ,†<çoÙáéõÇô«K×ÎßøžÊ0yýÌ\ÿã´ŸÙZþä=7L©‡ÿ‰¨ŸDñ +âKµ$ðDVüä:C¡x€©_øIï¾î7­³Ÿ_õ8ý*6ðïˆXqâÍEzôŽ×ÿŒiðμTøKµ\ç¨KOþG§ kƒ¯‹5Cÿµÿäz?áÖ2Oü%Z¯=±mÇþ@©›ÃÚ‰ÛjCÎ<›ÿ ÿ,TŸØ789ÖõHëº>?ò)Ц í@c¸tçÿ¦O¼¿öÞ¤r czcøF<38ßÿíP–Ç&Dãéòb‘¼/+ÿnê£ØJ¿üECÿq'?ðk=çãÿ±¥>þcÚÈÿ·“ÿÄÓ£ð„hÛ›[Õ߀0×-Ž>€Tßð‹Á·oö¦§ÐŒý¥óüéÂÖêåÿµ5Cœðn¤ÀÎ;f¤>·*WûGQy2gùÖ¥¥²ZB,’H?4¬YŽNy'&¦¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢ŠLZ7§M“̋ûëùÒyÐÏEüÅ'Ÿoÿ=ó†æÐpfAÿŸl²ÿžñÿßB“í¶­Ì_÷ÐÿiÔ4Õëuú¸ÿC©é#9¼€`ãï¯øÓWÑSïßÛ¯æEÿ`×¼:sNÐã¯ïSÖ˜|Gá×V³öÙ?Æ•|Cá§ .«fIçdÿ_íÿm-ý©i´æ¦3ùÒwÃÇ8Ô­N:þõ?ÆøƒÃ`àê–€ÿ×Tÿ`ñ/…›8ÕìŽ:þù?Æ¢ox1ymrÀqþ¾>¿F¾4ð3^ÓÉ+¸bxúzõ£þ_îTþÞÓ÷·Aç¦OëOoø51»Y³8½^~œÒ¯‹<$Ä*ê¶ÄžÁÅ*x¯Â²?–š»>q€ÜæœÞ'ðʸµƒŸáÏ4Ó⯠íóøÿ…E/Œ¼# Äš‚@èÝÿ ¼uàµÎu$ãºÿüM(ñ·„!o·`Är½?†ƒão ¬nÜ+t>L¸?øå8øËÂàÆ¿i“2gn!—œÀ*eñF€á Ë)Œ~æ^ÿð ?á'ÐxdÜãþXKßþMÿ„«Aë¾àóŽ-çÿâ)¿ð–è[Šbó!ÿÇ¥Æ0}üº¯ÿ LJ‰ !ÔŽsŒX]ñªAãô¶Õ?ð_wÿƨ>9Ð#캯9þϺÿãU#øÇIE/ö=PŽ–7çÛË©‡Š, Z‰gd›?ú 9|GlØÅ†£ÈÏ6Ò…ð‘Á’?³õÿnïþ ñT#8ÒuC…cÿÏÛ·Ôö¨á1q_ì=cëöVÇó£þ£AÖÌWþ=ç×¥/ü%ÇX9$¨¿àU"x¦Gßÿ-Tmõ…F~Ÿ=xžiÙ—ûUåâ@8ÿӓij¹oø‘jƒo¬iÏÓ÷•)×®ÀÑuôXÿ¬”Æñð /‡õ&õ?9E0ø‹TÚŒ¾Ôس`ŒÛ‚¾ç3*/øIµ£Ÿø¤õ^3üV¼ÿäÅ7þПªÿßvŸü‘[¶7vÑÏqi%¤»0ÊT²àã’ŒËÏ^ «5Ÿ©ßêVfi¥Í|vóÆ¢+Šž‘ãsˆF? ÿ…0ë^0ùñá‡È'oúL8?­!Ö¼iÛÂíøÝEKý±ãOú‡Aÿ/Qÿñ4 _ÆädøiÝŒ}­:zýÊ‘u?rtíj7þ9OþÑñ~ØÉÐâÜOÌ>Ô>_ürœoü[Œ 㡺ïÿ~ÍBuolhv^Xû¤Þ6OáäZ ÷{ÃŒyy½›ëþÇëLûwÄm¤ÿbi›±ÀûlŸüLûwľŸØºW×íÒò5I×ÄS3JÒצqw)ïÿ^â¥Yüx_a¦ªc¨¸œý<‘üêhäñƒæ[X ÁÈsÿÅ5ŸÆ›ŽØ4ý½‰’Lÿèoñ¦OîtücÞI×þø¨Q¾ |þdzXùͯ/ÞÇ9ùzf¢Ïļrš8<ÿÇéØRÅÌÿ¨8ÿ¿Ôª>%|›ÛGüØqôæ·,´~ΟÚ#s–ß䃳¯ÎOJ±EQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÕ÷ú(¢Š(¢Š(¢Š(¢Š)’GѼR(hÝJ²ž„¢²O„ü,NN_ñ øSÂÄýŸ×üh>ð“ ­¥[èPb“þç'H´Ïýsx'À®Im ʼnÆs ãð¦ÿ ðÿpoøG´íÀä">?JQào…Ú<=§9ãÈ¿^Õ)ð‚Ø‚t;@À>Jp?*•|3áTP«¤Y„)åOðÊŒ *Ì “þ©;þã¡xxõÓmOõIþŸðøo“ý—iÏ_Ý'øR7‡|2ä³iVeRaLÿ*AáÏ šM˜úBŸáNÿ„Ã`çû.Ó8Çú¤éùT‹¤h©÷l-Çâ5éùSÆ™¤…*,à NHظþTáa§ âÖ!ž¿ ÿ wÙ,¸ýÄ|tùE(µ´\âë…¢ p §—É€t!J#ˆtAùRíN»ETtQKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Èi»ÓûÃó ÉàºÆ“΃§˜¿˜¦››QŒÌƒ?í OµÙ“Çÿ} O·iànbÀëóñ¦CM&êÎ?Æ™ý­£Ïõ¿ùh½¿±ŵÔb[yRXÉ :AÇ‘RU[ÍOJÓ¶ëÈ-¼ÌìóWv:ã$UOøI¼)?¶,ré²;þ? sÿk.:þù8ýiá!ðÎ7jÙíõó“üiˆü.3ZËúlŸãU_ƾŒ€þ Ó”HÍÄ|ãþQŸü<ω4Î:ÿ¤GÇþ=H|}ððg>#Ó{ËÄ}ÿ?á>ø{ÿCŸëþ¹?Æ¥_x)ÁdÖ-YF2UÁÆ~”ÿøK¼'ŒJ9èOjiñ‡„@ÉÔ¢ÇãþƒÆ~fU]J"ÌÛ@õÆ}*ñ÷‚²HeN#“ÿ‰ xûÁM»;zâ)øŠ_øO<¹í¹þèòfçÿ¥ÿ„ãÂ_óó)äŽ-æíÿ«Åžm¸šS¸?q/n¿ÁIÿ g‡²àI9( 8·›·ü¡oxyYT­ñ-ÓW'·|EQÿÂwáÎq¤qùpºïÿl©£Çž Ÿ³ê˜õ»ÿãU!ñ®ˆp¶ÔÈö°ºÏþŠ©ÅúSr¶z™ã?ñåp?œu«§ßé[­ÌQÍ1`hÙƒºÀÒ­QEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š)¯ælo/ö»ºg¶koŽð¹—LÎï’^¾ß55Çû|Ú_™ž1¸Çý÷Rlñ¹ÏïôáÁçËÿìôׇÇpKÍ8t˜dãÿ"S>ÍãìÿÈKM Çü»IøÿËaQ›?ˆÛxÕô°Ùëö91ü Y|EÇ:Ƙ'¥œ˜ÇþS…Ä 6ígOÝ¿#o€¾ŸëÏ?áRý‹Æ{yÖ-wdôµ=?ïí8Xø·:½¾rr~ÍÿÛ)OñY9ÔJ1Óìïý÷HtßœÄò1ƒÎ-—Ÿü~£}+ÆL/ˆQrÙZ¯ÓïR6‘ã9ÿ„hÝœ-´}=9&†Ñ¼\eܾ%u9Ùöh¿ž*_ìŸmþÜÉò"çô¥:Wˆðöü¹î|˜¹ÿÇiN“â‘ý½0äˆbÿâi¯£kî1ÿ ÒñÕbƒ?¬f¡Okêr|S¨0ÇC·ÿ¤ÿ„s_ÚAñ^£žÄGkÿÆiÿðŽë;XÂO©dŽÛn:Óóš’-SM›üC¨IŒîÈ€nü¢¦)ÿØ7ôÔ:ç¬_ünœÚíøœ_£'?øåG'‡¦“þcZŠðË"ñž–EÛý¹ª/ºÊ ÿèÃá7b3¯êüc0>ˆ)„P€?¶õ~$‹“Î? xV Tÿkê¼.1ö–çœÓ×Ã0®ïøšjm¹æåøúSLJ`þBàŒ}¡ÿÆ›/†,åû×úP~[©GòaMÓƒ;}·R;ºƒw6Óçªÿðƒh˜#íš·$øÿºÿã”ïøBt-Œ†ãS!±œßÝg6œ¾ Ð0j'pÁÍíÉü³%9|áå9ÿL<ó]Nœ”õð—‡×ø.æâoþ.øD|9‡ˆ|nÌósøG/‚|)1KiIëæÿâé%ð7„'KfïY¥ÿâê6ð‚ntìíéûÉ?øªsxÁ.Am5I »ï¿_ûê†ð‚÷.=ßï7®}iãÁ oö\X÷-þ5;xOŒśM„’0rJkø?Áòó&“lüƒó <­F|àFÛ»B±;[ræ%àúô¦¿€þHÁßús61“…'ü ?9ÿŠsMç¯ú<|þ”áà_++顗ǑλS/ƒü¥JèZxÚr¸‚>?J|~ð|_êô[äž Nÿ…J|=á’»•fWÓÉL*Aá¿ )Êé@óÒïøUÛ[K+– H#‚$ˆâPª3Éà`TÕZïOÓ/ö}²Ö™Ùæ m¹ôÈ5 h^Œ«&›j¥z ~•/öf”œÿq”iÚ`鱞,ì—îÁú(¥Ö£8…zü¢—ìößóÉ?!KåCýÅü©|¸¿¸?*]ª:KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š) 5Î/|ÿwQä äÏ>ÛiO<©¼Þ¾ÝÛsäË×þø©—Æ>eÜ·2‚ÜC/Aÿ¥ÿ„¿ÃYÏ—”.?q/Aÿ§Ÿè!w â øŠþíil]õÆ>Ë>-•xÓA]ÿºÔÞ¸²¹ý?wIÿ ®‡ÚßR<ÅÏûgR'‹t¹:ÚjX>¶sƒù§éìH[=@àãþ=eÍE?þKb @Ÿùv“·áJÞ"…A?ÙúƒsŒ w¨¤ñ •“vŸ¦ìÅ̤ïûšž7ñ¡̃O^9IþÈ)Œþ:ù¶Ã¦ôã//ÿP;|Iù6G¤ïeæý>Za?Ë«£ì ›?ÈPágàcûç÷Õ2/ÄMÃ|šP]¼áeÎsþ÷¥<§8ÄÚg|æ9ã©$O|¹ôàpqº9þÎ*ƒâL%ö–¯êmå#òó‡ó¨¾Ëñ'ËQý©¤ùÉ-öIpGÓíÖš,þ&nµ'o|YKÏþLÒ‹‰lëZXëŒYIÇþLÓ͇ijþ'væÅ›òïù©ÃÆäŒkV€n燧ýþ§­‡‹ö®ýjØä­·öýá£û?ŸÿÜA½~Ì?øº€i>6Ü ñew²/ öûý©¿Øþ8,Oü$Êbp-é÷©§DñÁÏüU8>Ö‘ÿmi–Ú­°Šú÷퓆bf(©z /UÊ¥¨Úê7J‚ÎýìÙwdª#nÏLî§¶*öGˆÝÞ ¸àœí†45šˆd ?á(¾Bq‚±[qùÄj6ðçˆX(ÿ„·R\«¯?_Ügü"úùÿ„¿UéýËOþG©†õsOøJ5MÃøñm“ÿ1úQ†µ$Ç™â]R\þ@Ïå«B¹XëZRÑàcéõ¦NQ뚟*F|ÄÈú~î˜þ™Ð¡×µQŸâ ?žÊ‰¼##Oˆ5Ž}'Qü’›ÿhã:þ²qÿO?ý=|#Îu­\ò7-S/†-Ô“ý§©œŒsrÿãNÿ„fÔïݨêD7oµH1ôÁ Y?Óµ.3Òînÿð*‚Oi2(V¾ÕxÝÈ¿¹Ÿ¤”ÏøA´>÷š±ãò»ÿã´£Àú?ññªwÿ˜…ßûkRGàÝ àI¨ùÎëÛ’F}3-;þý F7¬y7w鎾fiãÂ~ X%Ç#‰° ôÙ|á©Â‰ ˜í¿›ÓߥðØÇî%ávßËÓþû­;M°Ò­Å­”f8C3`³7'¯,IýjÝQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š)2¾´ß2/ï¯çAšÉ‘1M7£¬È?M7–+Öâ1õaHo´ñÖæ!ÿãM:––2Mä#?}ÆšÚ¾Šƒ/}n£ŽL‹ßñ¦>»áè¿ÖjV«þô¨?­0x‡Ã'ÕlùÎ?|œãñ¤ÿ„Ã1þÖ²ùN÷ÉÇךwü$ÆïíK=¾¾j5¼Gá„›V³ŽLÉþ5]üeàˆÔ;ëÚz¡ä‘K&½`Êq+2^´õñŸ‚Ù¶®±hÍŒàHïøK¼%ÇüL¡9ô'Þ6ðe»—Tˆ1Ç'ÀS[Ç^ VÚu4ÎÒÜ+žÑj3ñÀÁΦ»Wï|’qÿŽÒ/Ä>vj°7C/Oûâ¥OøMÄen¤"@Jþânqÿ©Åþ‘w$ò•çþXMÛþNÿ„·Ã¤&˜àãˆ&ÿâ*)|gáÈJ©7n[¦Ë[†þQšCã_ŒþïPáI?èW]Ž?ç•D|wáàÛ|S>Ú}ßÿ§èd¨û.©’@°ºïÿl©ßð™iE¤U±Õ Cƒþ…qúe*EñU›£8Óõ0¶àÚK“øm¥>)¶ÜTiº›88¶ðþU¥§_®£ ™mç€ 6Ü!F8ïƒØö«uCUÕ•rýŠêï{Ûj›™xÎHÈâ²G‹ä`Hðö±€;À£ù½>Í7OêëÎ>x7«Ä†+ý‹¨œw˜?øýFþ"¾9Œ¾BÌNWíi•ÿÇqO¯öƒÿì ã§Ú×ÿÔ¿Ú>2=48#­×oûöhkÿÿ‹hyþ+²8ü!5ßü@ù|½ÀñÎëÇû@Ôoø—ÿ@=/ÿ¤ÿäj>Ûñ0Ÿùi@mÏ7²uÇý{ÓÅÏÄcŒéºPäçý*^ýø©#ŸÇí2ÇL^¹Äòä!ý*Mþ9ÿžhãþzIÿÄVÕL'ûE`Y÷œ ÛÛïsV¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¬UÐo@Ãkºƒç$Ä?”b—ûçkP9Ï;£ïôŽ“þù¸ÿ‰Î£Àï§ÿQËá™dIý¹ª.?…eP?ô ˆxIƒ:ö®IæqÈ.?Jpð¢å kZ³Ïü¼žsΩ†",ûSSá³pø©ð°ûCP9ȸ~ZSáÛvÆoõ:¤H?‘¤ÿ„jËôÍCúz—ÿЍO„4¦Înõ.sÒòàwÏg¨ÁZ €8ºÕÁ7×Côó8x#A »í™8Ç7×_üv§Â}$½nIùîî_¬†žžУÎàäó\L,½;þ}©C¥N3™¥íÿ¦ øp©So&Çúésù屮I&ÍÉ8Îf—·ü›ÿ‚rIÓ$`æI÷Õ9< à” Kæ³vüjÏü"~çþ%ñœ¼ç§çJ<)áaÇö|]1ß§çIÿŸ„þbt»r[®W4Â#àüîþÇ´Îæ5íøT+à u]Oùaä§?¥9<àH×bhz¯ ‚<*wü!Þ cþ°ØHm¾Bc#¡éS øYH#I³ ä§øTŸØ>''L´ÏýrOð¤:‡ÁÒíÆ?Õ'øR7‡¼4ÿJ³naNß…)Ð<8@K´ týÒ…H4m q·O¶ÉxÏáNVŽ enëˆ×ŸÒý¦`¯Ù!Ú{l\*p²°o§Ê?”ZYÿß"ö{aÒ$ãØRˆ`#_ÈR„ŒtP? ]ª:KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(â“rúŠO2/ïΛçÛŽ²/æ) Í¢òfAõaMûm‡?éqþФû~›ÿ?Pÿßcüiªèñç}õºàdæEDÚ÷‡Sõ;EÏLÊŸãL>#ðºã:µÏ¬Éþ4ÂIáoú ÙßäÿQâ žš­™çë“ühÿ„‹Ã8cý«g…àþù8úóQ?м!õ» dæxø÷ÕB|màE;Oˆ4ÐÙÆ>ÑÿQÂ}ðìdÂI¦q×ý&?þ*œž:𬩿§»7,Èsù”øÃÁ íþØ´-¸Í?þ¿ ÿÐNÁ©§Å¾P¤êPáŽ'ŸÒ˜ßÄzXLã—9Ïû¾”Áÿ ¸Ò»w–•WâôÝ.•åçæÂKœ{|Õ6ß|¸—NëÏÉ'ÿK³Æ{×éá¿ëœ˜ÿÐèòüdzÝiãþØÈsÿ‘B-ü{N£¦ãsqöi:gŽ|îßJY-|vTùz¦œ­ŒÚÈ@ÿÈ⛟v°“XÓËev•´qÇ~³šÇÇ;@“Y³-Ü­£ç1©Í—Š~_ø›Âô~¿ùƒa⌠kßýñuº_ŒŸîx‚4ä˪Ÿæõö7Ž2Oü$냜²GÇþ=OþÆñ~F|Lþø¶‹ü J4ÿ#„㯑øT‹¥xƒi¯LNzˆbû)¤m#]m¿ñP\®1±AÏç¨æÐµùc´læûQäc‹©GòjŽO i’‚÷SåÃq{p9üqPÿ¡““uªœÿÔBëÿŽÑÿ7‡òOŸ©œ®ÞoîºßÚ—þí$î½çƒþ™qÿÇ)áðé“Ì"ì¥pn§Æ·™Ò¤ÿ„SÃØ#ʘç=g—¿ü “Á>˜(’ÚVÚr3<ÜãôÃà/1rlœ—ûÄÍ/?_žxÁ+ø—‚Ì’ýšµô­JÑ km: -!¨$åSÉ&¯UKý3MÕ#H¯­ÒxÑ÷¨qÐã¬ïøC<´'ö=¦ÐAËxÀœ¯‡ìà ù)ѺöïH<ðñ@QáÍ7çþ=ãÿ €~ ãÃzg=ÑãÿâjÒxOÁ¨w&‰`h\ˆ#ÎNÔôðÏ…#“ÍMÉdÙ³p…3·Ó8éR/‡ü6€*év@À$ãô¤oxiÉ-¥Y’@0§ ~ßøF¼+ÿ@‹/ûòŸáO_øm~î—h>‘'øS—DÐåtÛPpG/¦v–¼-¤#è‹þ ?M-açîð§ý’ϧ‘ýò)ÆÞØõ‰à)D0j?J#ˆtAùRí_AKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(ªí¦¦à÷P®Óƒ—΢mgCO¿¨[/ÖEÿµÿ!*Ú¥¢‘ÉTÿoü$~ÉÚÖY|ŸãOþÝð÷Íÿ;O—¯ïSÖ‘µï¦wjvƒs*'ü$^ƵlñÇü¶NÿEÿ W„CþÙ²ÜF@ó“?Ρ“Æž‡f½§®sÖtìqëëH¾7ð#ýÍOn3Äéþ4/|ìu»&b %^@êG50ñW…I jväFÓâß “¨ÅÇü)?á.ð©‚ìü*¼Þ<ðL MICpÉýÔÃÆ>iBé÷ày2ô=?‚›<++2%Ô…”€ÃÉ—ŒÿÀ*Èñ.„r|ÙxŸÜËßþMÿ„ŸBç1ǤŸý’¢—Åú &0ËzÛúm´¸#ñÄgž4ÐcÀ1j'>–7GÿiSÇ‹´vÝ‹}G…ÿ¡\÷ÿ¶t±ø¯L—;muëg8ëõAR/‰lØ€¶Z$à£H;{¨§@7 ß£$ wý8¨Ï‰" û3R9ÏÙÛž)DU›nÝ¿>Hâ£ÿ„´‘ƃ«Ÿ˜<ßêÕ8ñ¥‚ÿbê\÷1¦þ?N_LÄìmDcÖ4çÿ§nãøt{ö8îÆ?›ŠŠ_j’Ãú‹œgåòy>œÊ*ñ&´3 êÏfµõ÷œRÂI¯f0<'©áº’ö¿/×÷õ*ëºãá¾R4–ÿ—úÓN]gÄ ÿÂ;r¥‡!¥ƒ®$4ïí_ÿÐ^ƒ¬ÑñTÅÕüNXƒáÙBñÏŸøjƒûoÆ\ÿÅ.ÿ{ñõOZ?¶|lHÿŠdqÖî>?CJ5ÿдƒùûO_÷jdÔ¼bÙݠ¾ŸéCÿÔŸoñ^ÜÿcCŸO´þ"£’ÿÆ›I‹Eµ-{²8ü"5ßüAÚLz&ž[w¯\ à9æ˜×ß26èšfÜ÷½“ÿ‘ªEºø†CÒ´µ8à}®Sÿ¶âž³øøƒºÃLSÛý¢*D“Ʀ<½¾œ%ÏÝHF>»ò¥/ãO—éÞÿ¼“ÿˆ¨w|Aç÷ZW·Ï/¯û¾Ÿ­DçâYû‹£©˜ÿAI‰›OÍ£‡íÄØþbœâFá™4€»¹ÂMœßUcgŽ1þ¿MÏýs“ÿ‹§lñ§?¿Ó‡\~îOþ.®iÉ­$oý§5¼²ù>Ï èw;äþ_J»Tµ8µ‰­öéw0[\ï|ñÆÐñœÿÀ¿ ÈûÄm˜:æ›»×ì2òMI ‡ŽÃ>·dË“ÂY°ãêg5;Xø¬ž5ˆÿ¯oþÙI.ŸâÆ?»Ö¡AŽöÀóÿ}Љ´¿’˜ñ`¹ÅªüØëÕÏZ‹ûƤ¿üTøÉ8Ö?—õ¤'psâ–'$—Íó!ïÓ§¥L4­ zb9ãɇÿ‰¦¾‘âlÜ ôXaþ¨j'Ð<@Îx¦ý@Ú"¶Áüᨇ†|AÆ|]ªsþ®Óÿ‘è×8ÿŠ·U>¿-¯?ù/R/†µQÞ'ÕÛ¸þPŠxró¿ˆ53ógïEÓÓˆ©ÒøzyWoöÞ¤œç*éŸý o ÌÀâ [ŽâTý’£`>!ÖOý¼þ"øCF1ý¿¬ý~ÓÿØÔƒÂQQý³«½þÒÙ?ZX<' îu}VMÄœ=Ó3éÒ¬ŸÀN´5§Ú΢o iîr×Ú™ç<^N?“н¥éšBLMs/šûØÜÍ$„v.ÍôÅ_¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¬÷м=!búm«bÌLIÉ=Iã½1ü9á‰_I³cŒs …94Frš]¢ŸQ…=t] SO¶S’xzž½»Ô£MÒÆqiÝ×ä^J_°éääÛEŸ÷GøRýŠÇþ}âÿ¾E;ìָǒ˜Æ>è§aÄkÇNT_Ü_Ê—Ëû£ò¥À-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š8h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š)7'¨¤ó#X~tß>žbþbÜÚŽ³ ÿ i½±›ˆ‡üS[QÓ®á8uÿ‰µ ×Ô-•±œ?ΣoxeNU³Ž Éßñ¤ÿ„ÂüÄÚËŸúlŸã@ñ'…Ž1«Ùï“¿ãKÿ †sí[<ôÿ\ŸãMøV<ïÖ,—'3'øÕiñêbøëÀ p¾"ÓIÆp.#éÿ}Qÿ Ï€Š4ƒ_ÓÊ+-ç&=ºÔ¿ð˜ø;^ØŒáÁ¥ÿ„»Âg¦¥ úþø×ÁÑÇæ¶¥žpÝ¿ ¾ xQd:¢mc„å¶›ÿ À¿ôÿÈRÿñ(ñׄ Ü… mA7_ûâ¤OxbS(K‰I‰¶¿î&àçܧŸxvÍ÷ïÙżǟûâ¢oxuFì_»oËgrqõÄTÉíÑÏå"øßCd.-uB£þœ.¿øÕ<øËHÏT'âÆãÿÔãÄÖew}‡QíÁµ—<ÿÀi$ñ,ŒÿfêMþí³ŸéWtÝM5!)[[˜<²²ŸLõ«ÕSR¾:m³\ý–{¥G•n»œäö;óYx®IX¨Ð5e óB sÿ«ðOÇüIu™û‰ÿÅÑý¿sœbj8Î3¶?þ9Uäñ6¨­µ饧ÿ©¢×µùÕ¼1}¥¶Áü¦5(Õ¼@ÄøGçnAi¡äúpæšuo|Øðü§‘ûøy?÷Õ@Úß‹ñòx^Bwc湄q޽M5µ¿díð±#'“wÿoöߎˆã£>÷qÿñ&¥þÕñ¶ÿÂ; p ÚóÇû•:j-$oÑ!QŽÒAÇþC¤Kïw趪rq‹²F?ïÍDo¼“·D°ÆxÍãóÇý{žõ¾ø‘…Û¢éy9Îodãÿ%©ßkøÇüJt±ëþ™/ÿ#Ô‰?Ø®û1\œ\Jp}?ÔŠ˜?0ÙƒNøy'ëò añˆtÎùýä¿üEDÍñqÙ’Œe¦Ï¿ðÓ?âå“×G×÷ßýoçZšPñI?¶ÐÉ‘³ì¡À¹ÜOô­ (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¬K½+ÄÓM+ÛëïM!)‚3±}2EÙ>$ÀÿŠ‚\óÏ‘ÿNþËñ9×eÿ¿1ñ46“®GöõÀ÷CÿÄSdѵ·e#Ä7i†É ûs¨dðöºû±âE2ARÛÎL_ k€äø³TaèR×úAV°µ ëÚ†Gýqçÿ!T‡D¹ í‹ñ‚ !£çÿ èsö½øç³§ÿP ÊTíÍPg‰W<À)­ábÛó®j¿7¤àcé…±øV(È?ÚÚ£`†¹j›þØ·n:–¢}¼öÅ'ü#pg?Ú:‰ç?ñðÿãCxfÉÉ-{¨œÿÓԿѪ?øD´½» 楌ÿÏåÆô:cø7EuUkKåÎÛ®sÏýµ¤ÿ„+Aç÷Ú‘Èæúë·ýµ©¿áжíÍÙ›©ûÛJü"Ú1²r=ç›ÿ‹¦Ÿ xlŒy>è_õÒôð:oü!Þ.d6¯¸®ÌùÒôÿ¾é‡Á>góÀÆ9y?–êœxOÂÁB>=£ ÉÿEð—… tXC•ëÁüéçÂÞ#iÓ`Æs¼f > ð9]­¢Y2ñÃD¤qõ×ð'€$Æÿéí€Ýcð§ø ÇÃúq!·äG××îÔ©áFC&‡`¬ˆ¿áRÿÂ7ám»F“fÇ’ŸáOmÃÚ]¡Æ1˜“·áMoxaÛsi6E½L)ŸåGü#žãþ%6\týÊ…94FC&—h¬A&GéR+G\±·ÇH×·NÔñ§i€äZB®Åÿ p²°-âðþ¿d³ÿžúýÑOD9£ð¥òãé´c¯J\JZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÐ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÑ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÒ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÓ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÔ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÕ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÖ÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿ×÷ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿ÿÙ endstream endobj 8 0 obj << /Length 48 >> stream q 595.28 0 0 841.89 0.00 0.00 cm 1 g /Obj7 Do Q endstream endobj 9 0 obj << /Type /Pages /Kids [ 10 0 R 11 0 R 12 0 R 13 0 R ] /Count 4 >> endobj 10 0 obj << /Type /Page /MediaBox [ 0 0 595 841 ] /Parent 9 0 R /Rotate 0 /Resources << /ProcSet [/PDF /ImageC /ImageB /ImageI] /XObject << /Obj1 1 0 R >> >> /Contents [2 0 R ] >> endobj 11 0 obj << /Type /Page /MediaBox [ 0 0 595 841 ] /Parent 9 0 R /Rotate 0 /Resources << /ProcSet [/PDF /ImageC /ImageB /ImageI] /XObject << /Obj3 3 0 R >> >> /Contents [4 0 R ] >> endobj 12 0 obj << /Type /Page /MediaBox [ 0 0 595 841 ] /Parent 9 0 R /Rotate 0 /Resources << /ProcSet [/PDF /ImageC /ImageB /ImageI] /XObject << /Obj5 5 0 R >> >> /Contents [6 0 R ] >> endobj 13 0 obj << /Type /Page /MediaBox [ 0 0 595 841 ] /Parent 9 0 R /Rotate 0 /Resources << /ProcSet [/PDF /ImageC /ImageB /ImageI] /XObject << /Obj7 7 0 R >> >> /Contents [8 0 R ] >> endobj 14 0 obj << /Type /Catalog /Pages 9 0 R >> endobj 15 0 obj << /Creator (HP Digital Sending Device) /CreationDate () /Author () /Producer (HP Digital Sending Device) /Title () /Subject() >> endobj xref 0 16 0000000000 65535 f 0000000009 00000 n 0000218136 00000 n 0000218238 00000 n 0000476332 00000 n 0000476434 00000 n 0000679987 00000 n 0000680089 00000 n 0000723676 00000 n 0000723778 00000 n 0000723859 00000 n 0000724047 00000 n 0000724235 00000 n 0000724423 00000 n 0000724611 00000 n 0000724661 00000 n trailer << /Size 16 /Root 14 0 R /Info 15 0 R >> startxref 724807 %%EOF jetty-6.1.26/LICENSES/ccla-exist.pdf0000644000175000017500000006611111166563041015413 0ustar moonmoon%PDF-1.3 %âãÏÓ 1 0 obj<> endobj 2 0 obj<> endobj 3 0 obj<> endobj 4 0 obj<> endobj 5 0 obj<> endobj 6 0 obj<> endobj 7 0 obj<> endobj 8 0 obj<> endobj 9 0 obj<> endobj 11 0 obj<> endobj 10 0 obj[40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R] endobj 12 0 obj<> endobj 13 0 obj<> endobj 15 0 obj<> endobj 14 0 obj[51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R] endobj 16 0 obj<> endobj 17 0 obj<> endobj 19 0 obj<> endobj 18 0 obj[62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R] endobj 20 0 obj<> endobj 21 0 obj<> endobj 23 0 obj<> endobj 22 0 obj[73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R] endobj 24 0 obj<> endobj 25 0 obj<> endobj 27 0 obj<> endobj 26 0 obj[84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R] endobj 28 0 obj<> endobj 29 0 obj<> endobj 31 0 obj<> endobj 30 0 obj[95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R] endobj 32 0 obj<> endobj 33 0 obj<> endobj 35 0 obj<> endobj 34 0 obj[106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R] endobj 36 0 obj<> endobj 37 0 obj<> endobj 39 0 obj<> endobj 38 0 obj<> endobj 40 0 obj <>stream q endstream endobj 41 0 obj <>stream q 1 0 0 1 18.0 18.0 cm 0.9411765 0 0 0.95454544 0 0 cm endstream endobj 42 0 obj <>stream xÚ…UMsÚH½ó+º|µx@Økì䲄b«œrWLíÅÙà 5h¼’F53‚(¿~ߌćmm-DwÏë÷^7ŸVƒñŸñïÓj3ˆc1½¯h‚÷áÇ1»¡Y|%n®iU ¢Ïì\CF¿pâèøÒêe0¡Ë©˜ÄD¦ƒh¡M¥tL ]:£ÖµÓ†TÂ¥ešo sÁ¥£¿bÒcqwwwÒ×ÒrJº¤Ì¹êÃx¼ßï…¬d’±Ðf;ÎÛ:v|H½ö7O}ês´Êdù5º¦ ®Ä§!U:6lä2¦¶ªëcÝ §Óˆ¾hãè“lÇÒš¹ì©mÕ¶ÄuC ­ÎËŽÐuªé@(Éci0ã9ô• ûÞÏÑšs½´Ê”=ãxl9H 6HZ/Ü$zÝ0ïAzÐÔ‡¼×4ò@Îêè ¨’eJÊYª-øýˆ#¥š-•ÚQ³m¹aÔ6s=ð#t‰Ô6HïË·êyxO:©18–Å{gG¡û tð<à“J2E•:í!›¸8L"’‚„ºO·z] «×¸€ú0#ÿEÖ.ÓFýâ7qm² º÷ÔöÄ¥ì!} U®æ7õ=ÅxLN‰®š@fx\!¯t=´¶€'°ӢoÜoÂ*F÷‚ÉܰL(X2Y=¢jˆ1Ì ÷cgÁ&W`tŸ¬ê¡ôÙIž;u4s»\ CFëÁ>}àí®üÍÚ » 'ñâsD¢SÎdmÃŽËtÁãnEÙqÛ¤hOg5Ï·ÒÃýbùõiù4N°o.ß¾?~û>_-/¿Î¿,…ûé:‹gWž¸Ž<5þG©‡iäIjÎÚ„®I|¹a5©Êy~¼¹õö>Û`ñlç©Ç'bÀ}Ë;Rå» êz c-›?ºO0Sj¤ZµÎyD}["U[å0 y»…‚-po<_zÔÙ^áRËT†HïDœf©o!wv…[ûfsé÷]Ê;ì),a\‹9m7áÙL×yÚúX”¡RØÁU<Èè“Õ7ò„ÿ¾´;óvVBoUC‰šä0A­ÂËû kp¹ü ÿÞÉ endstream endobj 43 0 obj <>stream Q endstream endobj 44 0 obj <>stream xœ3P0Ð3573170µ°0rÌML ,- Œ-ŠÒ¹ M€ÈXÁÜ ÈMåJã2µ4AòÌÍMLº!"Î  endstream endobj 45 0 obj <>stream Q endstream endobj 46 0 obj <>stream xœ‘OK1ÅïùsÔK:ÉdòÇcÙ Ä x¬ÛìºÂîbÜüöfm+E2ÞðÂÌï%;k²÷ºgƒG r+C)B ÈI4âE(…ÒxD$bËQZ2Þßu/`±î5T£€›ùîMÆÊ¯&:˜PêãÐy…ŸDÙgq©,xˆXFÁ”¸gÕXïú4L°¦Ôænzƒ»”»¦KÛsˆÏbþʲ(T¥gi†Ö†%ª|@Eî$g%QÁ¹“JK~ŸÁ?ñ ª#ߪ~o»v€˜7Ã릞ºq€ë]ÿ˜ò\Ååƒ1÷6ZªþHËË^ã­rÒÚò©F¹ð ûýwÞ endstream endobj 47 0 obj<> endobj 48 0 obj<> endobj 50 0 obj<> endobj 49 0 obj<> endobj 51 0 obj <>stream q endstream endobj 52 0 obj <>stream q 1 0 0 1 18.0 18.0 cm 0.9411765 0 0 0.95454544 0 0 cm endstream endobj 53 0 obj <>stream xÚmUÁrÓ@ ½ç+4=%ƒ1Ù´¤mNh2 C9llÙØ»žÝ5©ùz¤uܦ­ÓC6¶ôôôž´}»™¼ºQ¯AÁ¦˜(•..Ô)Ìùo8+5OÏ—p®NÓålêÉ´õdJ;$ºåo(ÓsÈlŽ;Ýzð~•-ɤ h¬÷´­0œJ ºª:ðTšl~Oæðr‘ÎÕœÁóɔ᦮)`A’dù¡Û“GðhrÐ1—ß^•±æò,|±.¼Õ]:`ž æ"b®+ÔœìPçL›<ä6kc^¦­ÐÙbaFdéNs?ˆ ËlÓ¿€Uzyyy;Û:†Í¬ËýXa€wÖ5Öé@Ö€Ñ5®àúŽ|€ï¶{.ŸõÖ'ðÑdés1~2ÀM•ºÊs‡Þ¯`ýA%°æs ac÷è¸Iá«ãÚÃ7«óäþ×;4³ÅÙ48–q­¹;è?³_°ùôDzfK¡ã¸—l2ÈÌÔrþz¤s€µ%ÐÜ¢ : «3nXÜCãŸÐ¹¾éý(àõKéuÅä~; zƒ¢TÊÃ0ެïVðbyºH—çéÙüRÁZ¨~Øt–a¢­Z¦F&FF­°Ue÷qžÑÕ>dÖä$Žy±8ÝyÓ°2C’R´¡e3E GÛ¶Oöíö0ÆGãÉVƒ›-Ô9Ã$÷>Iq¿Ó"ž Ðòô 'Èðxî92ìtžëL^k×íU߯殢 Ã2fÜGˆj[å|\.1íú.ª**Iø€Y:m¤mÞZdü‡î£V¼/Ô+ç¹ÌÓ{Š9Û«3Ô¶0QD{÷ArTîBÂă\\b„)Ï*ÊÎDÍLtä¹ Ç+¼˜÷‰*…÷X¡Ç§½<Œ"œ0Ö ÜNY9º“ÛÙÁ½µþNkºHìÞ ­°ÔÈíºÑˆ·«uô¯` fp¾ÖúK™Ï×âžÂntyÆñæ1’—B=­W?ª_£ª'oë{´žaL[±;‡Uì*%äikrN“«ßšq·¼ØU{ yõÄý¶m1þ—0eu4ÄÖÅv#øõfòÆG+Z endstream endobj 54 0 obj <>stream Q endstream endobj 55 0 obj <>stream xœ3P0Ð3573170µ°0rÌML ,- Œ-ŠÒ¹ M€ÈXÁÜ ÈMåJã2µ4AòÌÍMLº!"Î  endstream endobj 56 0 obj <>stream Q endstream endobj 57 0 obj <>stream xœ‘OK1ÅïùsÔK:ÉdòÇcÙ Ä x¬ÛìºÂîbÜüöfm+E2ÞðÂÌï%;k²÷ºgƒG r+C)B ÈI4âE(…ÒxD$bËQZ2Þßu/`±î5T£€›ùîMÆÊ¯&:˜PêãÐy…ŸDÙgq©,xˆXFÁ”¸gÕXïú4L°¦Ôænzƒ»”»¦KÛsˆÏbþʲ(T¥gi†Ö†%ª|@Eî$g%QÁ¹“JK~ŸÁ?ñ ª#ߪ~o»v€˜7Ã릞ºq€ë]ÿ˜ò\Ååƒ1÷6ZªþHËË^ã­rÒÚò©F¹ð ûýwÞ endstream endobj 58 0 obj<> endobj 59 0 obj<> endobj 61 0 obj<> endobj 60 0 obj<> endobj 62 0 obj <>stream q endstream endobj 63 0 obj <>stream q 1 0 0 1 18.0 18.0 cm 0.9411765 0 0 0.95454544 0 0 cm endstream endobj 64 0 obj <>stream xÚ­U]‹ãF|÷¯h dŲoïnsG.’8Ãâ<Œ¤‘=·ÒŒ˜ûôïS=c¯mbav¥©®®ªn}ØÎ¾ÿT>QIÛvV–Åú}¹¡~.—åªx÷–Þ•›âíÚö³?3"òIC°ƒqÒ‘iñ¬5²UZyetNóÚhoM7§^ íh—©Ý‚¯-–ëÕS6˜“´95ÊÊÚ/þ¢íϳ-×Ū\¡H3ãÆ’ÒéDNÞP-‚“±rz‰:|¦Zìe/µg".ÔÂßÊù‚¶_¶,žŸŸß_`O KÕH‘£¨=Ã~yRNæüºÌל´´î †nUëG¤­Á¾RŽºì²§Õw|¼Œ•Iü ÞyfôžÜAXé¸Êb]f±’‚(e†k•ÔаV¢»–~Uç¾û^‹ Ÿ7Ìg}94ÿȪ*°Xs.ÝuÑzµWµNƾ0 þ`bÑüŸý1žÒub|¿7[ÁàŽ[M£ÒìBùM9ϧ¹<<?ëí¹>݈֪^y/¶éðWcý1Rƒ"Ž t”ò¡Õ©C¤¬´yj;y2XÓ„Ú»¨tsMR,y©µË8²½žAWóÝ¢ O¸üïñÚÓœëM¢íP ¬&\F¯=£É·F«:§£´•èbLO–5‚Ü÷AŸ­ dzpì±ä,"š·r@“FGŽåÕb¤†´ñÔ)І,<‚·ukŽúW²TuŒÕ!w&`zÓH:/r£ó²wìMƒ ¸ æI}‰”.Ä8f鯷( TIo£ã7©™ðñÆ9–ºQ®Î¥ƒQ?ÄA5G~Ãg¿,–›MÍÿ`™ä·³h6Þû‰#PÀ ª&8D¾ö%åðu!?Níµ€úSó#ÝJs"̓i‚nG¿˜?Øë‚~²"­Íf± ž~QXoNô9T_á#ÛÎ]{i{íó˜O$àþöVƽœGfèI‚ä>–¼g†Ä#6ºNóô<îÖ™ÖŸØpX”Z»VÁËy>ðt`åtÍI5ØçÚèetÈ!âùD ´YÖØÌ{œ·f—-øc ¬•GS‹ªãÌ^dê’L‰yZ%‹õ:üã`ʆH]ZuŒ³—¢‹BWaXr{—d^üf\IL|"™Ù£OÊæ&2¿ ^Øÿ)/“Îþ/yùq;û0KÊœ endstream endobj 65 0 obj <>stream Q endstream endobj 66 0 obj <>stream xœ3P0Ð3573170µ°0rÌML ,- Œ-ŠÒ¹ M€ÈXÁÜ ÈMåJã2µ4AòÌÍMLº!"Î  endstream endobj 67 0 obj <>stream Q endstream endobj 68 0 obj <>stream xœ‘OK1ÅïùsÔK:ÉdòÇcÙ Ä x¬ÛìºÂîbÜüöfm+E2ÞðÂÌï%;k²÷ºgƒG r+C)B ÈI4âE(…ÒxD$bËQZ2Þßu/`±î5T£€›ùîMÆÊ¯&:˜PêãÐy…ŸDÙgq©,xˆXFÁ”¸gÕXïú4L°¦Ôænzƒ»”»¦KÛsˆÏbþʲ(T¥gi†Ö†%ª|@Eî$g%QÁ¹“JK~ŸÁ?ñ ª#ߪ~o»v€˜7Ã릞ºq€ë]ÿ˜ò\Ååƒ1÷6ZªþHËË^ã­rÒÚò©F¹ð ûýwÞ endstream endobj 69 0 obj<> endobj 70 0 obj<> endobj 72 0 obj<> endobj 71 0 obj<> endobj 73 0 obj <>stream q endstream endobj 74 0 obj <>stream q 1 0 0 1 18.0 18.0 cm 0.9411765 0 0 0.95454544 0 0 cm endstream endobj 75 0 obj <>stream xÚ}VÑnã6|÷Wì£ Øªåä’ËãÝ¡Z O5P—{ ¥•ÅF"U’²ÎýúÎ’–/¶å"€cYÔrfvf©ÏÛÙO¿ä(§m5Ëóló1 5þÆïy¾ÎžŸè9ÈžiÛÎæDämå˜JíƒÓ»>pI»#ýn]ø¬Ž¤¨c×qèU³¤Áº¦tÉK2Ö¬ø{Ñô^x¹ íß³5­6Ù:_£vk»*jåöXîìQ5ḪãJ;Ç[¨]Ãô:Gî)O>(Ù^ µÆ%A[óºËçÙËËËG)ÿUêwXm5º`㙂¥V½¡|­Œ¯³÷ø°UÅNn{nÀB>«Íf mžËÅ7Úþv‹_™’l¨Ù ZÊ;e|,T3ýiÝôÀ=&ßõ„êºF³'kš#¶¼E.…Cm±ô¿h”ný©@”òÿe{¬RP.Ø{å4JjS9mö±IÓªãQG_¬IÝýæþuAª±†É:©^Øv§’›çÎÓÐê³¢éPkÐÜn:$}v­hlF¿Võnh¡ƒôøúý zŸÀª½’ûQPA­Ô ÓÃÓ…_çÚÀ¨%dƒ g½_EÑ¥Da{Ø¥kOQ£ßë%kx§î5í9^K·”¢·ú`]²e1®år"5ÑÖXr– Ô!H@OZw•ÍÐâb¹€£eg%}‰ù21žöð´$8#SzSFŸ#ƒŸöH¬Ô§*SaZä÷ÜHß× o+nc‰8ì&ê”ry ÎØÝé”#©ùËH*ÝÀBgbÙz³NijhÇc/P#ùIÒƒÅ1qkÙÈ;Q;{àéŸTº.^õ.Z. ¦@Û®±Gæ‘Üë0V.8]µ¸d¯÷&;ÈõGQsÙ#øŸhÇ2šò¹`[ëbO£+"Ïÿô`p’&C­-u¥‹´Ït¿Ç¾Ž;ÀÔPRõ@Nÿ›´Hñ¼h Œ/@A÷*pšnøÑl\õ(«6qՇɾDɦ¦ŽlñW€CîTƒ°òS°=D?ôÙxC"Í Ì¤Œ.AýO¸o^TOCEö3ì\rPº‰7ä®ëjW®:å²ñÈê4Ä[%6ï†Ö’°;SÉ-:ÅåÒÇ,7ÑT)ç>ž`8·Jn•{“ l?’¤§»·&DÉ{À´ÒR'='Ï(ïm¡ãFñ81,”¦»:ጯó§ìœO!Æß;tÌp,?ÌaÊÎÙÞ3 x''tlímé%¥w‡äþŸ·³ÿyuæf endstream endobj 76 0 obj <>stream Q endstream endobj 77 0 obj <>stream xœ3P0Ð3573170µ°0rÌML ,- Œ-ŠÒ¹ M€ÈXÁÜ ÈMåJã2µ4AòÌÍMLº!"Î  endstream endobj 78 0 obj <>stream Q endstream endobj 79 0 obj <>stream xœ‘OK1ÅïùsÔK:ÉdòÇcÙ Ä x¬ÛìºÂîbÜüöfm+E2ÞðÂÌï%;k²÷ºgƒG r+C)B ÈI4âE(…ÒxD$bËQZ2Þßu/`±î5T£€›ùîMÆÊ¯&:˜PêãÐy…ŸDÙgq©,xˆXFÁ”¸gÕXïú4L°¦Ôænzƒ»”»¦KÛsˆÏbþʲ(T¥gi†Ö†%ª|@Eî$g%QÁ¹“JK~ŸÁ?ñ ª#ߪ~o»v€˜7Ã릞ºq€ë]ÿ˜ò\Ååƒ1÷6ZªþHËË^ã­rÒÚò©F¹ð ûýwÞ endstream endobj 80 0 obj<> endobj 81 0 obj<> endobj 83 0 obj<> endobj 82 0 obj<> endobj 84 0 obj <>stream q endstream endobj 85 0 obj <>stream q 1 0 0 1 18.0 18.0 cm 0.9411765 0 0 0.95454544 0 0 cm endstream endobj 86 0 obj <>stream xÚuTÁr›H½ë+º|‰U…1ÈY[Ö Ë’CÖF*À•r%>Œ %ÍͰ3Còõ鉔¼‹KF Ýýú½×}—.çá_B¾„¡?‡WЯ;‡aàß\ÃMxå_„|78#Álð§AaàE6P¢æ íE­ä^"覮¥2¾»Þ±ö¿CÈÿp1òƒ0 Ì¥Ë¼– Ö Ñs'k{¤“=Uåó¨PkPøoC5KXµÀêºâ[UØ¥ ýÛÛÛq—¶b{›…m(uiQr{Å ÏìÀÑYÁT £øª1\ RýhÏ¢ âì î¢,Î<øçŸÏ9|‰Ò4Jòx–Á"…é"¹óx‘п9DÉ ü'÷ 'Õÿñ~µ™ñg­l“šï¨7,=Â\TMé ï)V6*¾ã†Yœ Gá9-ì™RLŽ6zø ùç·À]þBŠ’û[Cç3’Er'ó4NfO³$÷ài–N?Q+Ñð‚²ßÅqþb+Î Ø<ΓY–ý)ñ–ò9µÁ2Jóxúü¥°|N—‹læwôƒQpøüƇŒú©J§Åžë­ÕH7+êöR}'»‘ú\;8¤â.X…ÂýÊwî;&£‡2?‘ÿîìK¬™b«–L'w`é;ßë—ŒBü®[’ÂÍA!I"4HS`¯¥Ühд@ÊZÚ769™…F+L/Zi-AÎÖ¡°àÛù‰ì„Ê1àdwFöèãŠÙsÍì0êw ÅJÜ1õ]{OÄMÄÎ~Zû-/¶ÐiŒÆ¹F¥%‘\µýpy  ÉPºæE#MlÚJ;N?¦á,sX¬Ô× ·¬ZSÉ~¼ŒB¹*/HÓNà«`;Š#rðõìÔAa0r!cbgÖšƒ¬ _ñŠ›Ö*N¬‘`„ßoQ8AŠ-´Ý:y‡¿ÃÆ«¸6–&»î6Âñޤ½l‘¦54”Šÿ:l˜£áÞì’wD?aÃU™JEò8Ö4hÇâ'¯?hXJ.[ïìS»(º®ûx»§&p}9_ãžû̵Ù(œt—Wûµ»LH” |F¥ZHYº'ÁRêÞ™À T4±OL°ÍqóÍòÁoóµûÝ endstream endobj 87 0 obj <>stream Q endstream endobj 88 0 obj <>stream xœ3P0Ð3573170µ°0rÌML ,- Œ-ŠÒ¹ M€ÈXÁÜ ÈMåJã2µ4AòÌÍMLº!"Î  endstream endobj 89 0 obj <>stream Q endstream endobj 90 0 obj <>stream xœ‘OK1ÅïùsÔK:ÉdòÇcÙ Ä x¬ÛìºÂîbÜüöfm+E2ÞðÂÌï%;k²÷ºgƒG r+C)B ÈI4âE(…ÒxD$bËQZ2Þßu/`±î5T£€›ùîMÆÊ¯&:˜PêãÐy…ŸDÙgq©,xˆXFÁ”¸gÕXïú4L°¦Ôænzƒ»”»¦KÛsˆÏbþʲ(T¥gi†Ö†%ª|@Eî$g%QÁ¹“JK~ŸÁ?ñ ª#ߪ~o»v€˜7Ã릞ºq€ë]ÿ˜ò\Ååƒ1÷6ZªþHËË^ã­rÒÚò©F¹ð ûýwÞ endstream endobj 91 0 obj<> endobj 92 0 obj<> endobj 94 0 obj<> endobj 93 0 obj<> endobj 95 0 obj <>stream q endstream endobj 96 0 obj <>stream q 1 0 0 1 18.0 18.0 cm 0.9411765 0 0 0.95454544 0 0 cm endstream endobj 97 0 obj <>stream xÚí’? Â0Å÷|Š“¡iîZc:*êààb)ÁDªøgiýü¤Åbuß-7¼{÷#—±eñ €`w Q’ÁT]M¨äPƒÖF¦`OlÍ—Û"øêDD ò‘Ø€3Q**ë‡Z w ð¡&® à¼^€=tÃ×üî¸î=¬ªüj›4à1™˜”2yþÈJÊ´¬£²g+wy—¦› WP}c‚RÞö!ïð½tô¼êÇ/îxŠïŸÿã÷È™e™þ_ çSËn¯aŸ endstream endobj 98 0 obj <>stream Q endstream endobj 99 0 obj <>stream xœ3P0Ð3573170µ°0rÌML ,- Œ-ŠÒ¹ M€ÈXÁÜ ÈMåJã2µ4AòÌÍMLº!"Î  endstream endobj 100 0 obj <>stream Q endstream endobj 101 0 obj <>stream xœ‘OK1ÅïùsÔK:ÉdòÇcÙ Ä x¬ÛìºÂîbÜüöfm+E2ÞðÂÌï%;k²÷ºgƒG r+C)B ÈI4âE(…ÒxD$bËQZ2Þßu/`±î5T£€›ùîMÆÊ¯&:˜PêãÐy…ŸDÙgq©,xˆXFÁ”¸gÕXïú4L°¦Ôænzƒ»”»¦KÛsˆÏbþʲ(T¥gi†Ö†%ª|@Eî$g%QÁ¹“JK~ŸÁ?ñ ª#ߪ~o»v€˜7Ã릞ºq€ë]ÿ˜ò\Ååƒ1÷6ZªþHËË^ã­rÒÚò©F¹ð ûýwÞ endstream endobj 102 0 obj<> endobj 103 0 obj<> endobj 105 0 obj<> endobj 104 0 obj<> endobj 106 0 obj <>stream q endstream endobj 107 0 obj <>stream q 1 0 0 1 18.0 90.0 cm 0.9411765 0 0 0.8636364 0 0 cm endstream endobj 108 0 obj <>stream xÚs áÒw34U0TIã24Ô3²04V0BÛÐÐ@ÏÜLÁÌÒ@ÏÒL!$—+ZCâ±M# 8[×ÈP!ÕU…f¬Bˆ—kE/$O endstream endobj 109 0 obj <>stream Q endstream endobj 110 0 obj <>stream xœ3P0Ð3573170µ°0rÌML ,- Œ-ŠÒ¹ M€ÈXÁÜ ÈMåJã2µ4AòÌÍMLº!"Î  endstream endobj 111 0 obj <>stream Q endstream endobj 112 0 obj <>stream xœ“Ýn1…ïýs™¨ÂÿÛ¹J#(JT*5Ý&ª”†nÄÍÛÇ^MR¨h½+Y¶Æ3óc/ s‚rç8:å¤LŸæÀp“ŠÀÙUš߸Lr…΢pœÃáEœ“%I9r*a€)õ"—Øæ:ûÀ48j1æÐ@1#—Œ¥Ì¥¡´Š)9¹1>ÂÿVprýõæþôŠ2(róGžãÝTÔŠÊî¼âÊuCïK9¯Ãš8¢í¡î‰äξÁpT¼³] =Æ_•O§bnõ"ü*W-4ÕáÈAá¢ûÅá¨a¨Cô ùÚÏCü+û’0dT!×È4jç(S{-Ué¤Fc¥€Ã‹Rœãsî|Ù–õfM„,šo×1fñS_]ü ã¶œ†6 sE£¥Aem6ÊÈg§rùÔ}ú“©™@:L†TæäB(í:ÌTMT›ù iÖe„ 5}$ÿù†wÚÛí¥U˜ìèúÍd]…º…«º óX¶pb9+ÃôhPEÓ YÚÓ"Cs©hÒÏY‡,½§ßM…È^a^¶è~ þO"{æL¾7Ùd(¢¯W~Ò–é|ZWãÏácqùMÊ;]hÑ?’Vm´²;Zf¨ÖÉTÉŒÛÁ>|ô ´ endstream endobj 113 0 obj<> endobj 114 0 obj<> endobj 115 0 obj<> endobj 116 0 obj<> endobj 117 0 obj <>stream ÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ:È"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙ endstream endobj 118 0 obj <>stream ÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ€€"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¨®.a´·{‹‰R(cws€£ÜѰ7mÉi’Ë1™%‘cEêÎpã^eâŠÁ]­´D‡§ÚfSƒþêÿSùVñ‡‹å[JIcˆœ‡¼b ºƒ§äqO›å¤¹ŸàyóÌ"åÉF.oËo¼ô‹ßxfÄ•“UŠG Lþ*ýk&_‹Œáa¿z¬KýXU+/„zl)¿QÔ®& dùAcQùçúUŸøD¾Z|·Úg§ïµ§ôaRç‹z¾X™¹ãž¯–>¿Ó$‹âLJ¤8hoã­ÿF5­eãÏ ß±ê±Fç´àÇÅ€­bÿÂ%ðúïå·žÓ=?s¨?«­{ðM™7éÚ•Ä$Œ4,Š,ZJXµªå)ã–«–^ŸÒ=)cš1$R,ˆÝAüiõâsøSÆ•®tÙ%’ r^Í‹þò¿‘¹áïŠÁmµøDg§ÚaSþòÿQùUÓ媹_ài Â*\•¢àüöûÏP¢¢·¹†îÝ.-åIaeCcR×mîz ßTQEQQ\ÜCim-ÅÄ‹1)wvè u4=»jʺƱg¡éÒ__K²$èÞsÙ@îkÇnïõÿ‰:×Ù­Çh‡",þî!ýæ=Ïù_Ýê_|V–ÖÀ¥ªå†é}ݽÏ ®óTÕ4†ÞŠÎÎ!%Ë‚cˆŸšFîî}?ýCÛËœþ±vÝ©¯ÄñªTx«¶ùiGña xkÀ+¨LwÚyFX·¤kÛùúšåµÏ‹7÷,ÑhÐ-¤]²€ò|t­pº®±}­_=åýÃM+tÏE€vG5ÉSíÉErÇñ8jã¥nJ –?‰~ÿWÔuG/}{=ÁÎy! }AT³MÍ®7vîÎÜØìÕÛ _QÒÜ=ìöç9ýÜ„õ PÍ¡]; MÅÝ‘¡üY¿¶e‹Ynâèeˆ{ã¡ý+©¿Ð<5ãû¿ÓæD»ï@£‘qÜ0±Ÿæ+º‚9%zð=,2)¥OÞ§-¼C¢Š+Ñ=P¯/ø­âU‹@¶c—[œwùWúþUé²ÊÂòÈÛQ³@95âÞü_ñMJåI‰$7N`·ðÅ›iRŽòü?0œœcFÍÛåÔí4_‡þ —Q¿Aö·A$ã£?v1ôÎ>¤šñ_VºÖõIõ ÇÝ,­œvQØa]ÏÅÍy®uhtX›÷V I(¬Œ8ü”ÿãÆ¼Û5çâæ®©Chþg•ލ®¨Cáæ;4f›š3\v8,;4f›š3E‚óFi¹£4X,;4f›šôxõ·MST—MS˜ã<ÈÿÙ}ûÖ”éJ¤¹bkF„êÏ’¿†>¾šþ-~i$¶µ>Pûøóí^ÅMDXÑcB¢€ªª0ôê÷èQTaʧÃaãBˆ(¤f ¥˜€ d’x‘ȒƲFÁ‘Àe`r=ëc ç|yzl|©H§ $bï¼…?¡5Î|#²X4]CQ|,Â<žÊƒ?ÍåW~,JcðŒJ?å¥Ú)ÿ¾XÿJ‹Â§ìn.W¯Ù®¥ãÔoû-pIßåG™7|ußÙÿ¯¼ñ½cP}WY¼¿rI¸™¤ç°'ø ¥šfhÍyWvxNíÝÍ[·Ó/®ì®o-íe–ÚØ4й­jxGÂWž,Ô|¨O•k ÷p£Ðz±ì+è-/G±Ñ´¸ôë(-Ð`©.ORÞ¤×VêêôGn*˙藳FkÑ>!|>m!¤Õôˆ‹XºhW¬Ô³ü¾<ã5…JR§.YÕ¨J”¹d?4f™šô?‡¾}jXõmR2ºj6c‡7ì¿Ï¥éJ¤¹b*TeV\±à‡Òk2GªjѲi£æŽ3ÁŸüùöõ¯lDXÑR5 Šª¨ÀÐPª¨¡TP0S«Ý¡B4cd}. åŽáH̨¥˜€ d’p¡™QK1@É$ðx§Ä/ˆGVi4"R,ÄÓ/YÏ ÿgùý:•«F”nLjÄF„y¤v_înâð¬FÖrK8Ž`¿Æ¥Iúd~5­à;Ó}à­6F9hã0Ÿm„¨ý¬O¶|!·¹n¿fµ—ŸS°ìÕ/ÂyLž•Oü³»u÷ÊŸë\ñ“ú߬NHÉýwÉÄ>,DdðŒL?åÚ1ÿ¾XZ‹Â£íŸn-—–û5Ô\zçÿf­¿YïjQ¨ËG˜{l!è sŸïVmÿN|ÂLêãÍOçJJØ¿ñ!M[gö£oëî{€x?ˆÁª9¯.Özž5¹]™õF‹¦iúF•¦˜ˆ¶ª «)Îüÿ=Éõ­ 𿇿ÛC‘4­VF}1Ž#òmÉÿÙ}»W¹#¤±¬‘ºº0 ¬§ ƒÐƒ^å ±©wî>“ ^aîén‚²«©V© ޝø‡ðõ´†“WÒ"'O'tЯX¨ÿgù}:{m5•]J°HÁdNµÕ˜ñx×,ø}ðùõÇMWU—MS˜ã<‚?ö_~õî‰kj¨Šª¨Àv„DŠ5Ž5TEUT`:)ÔQ£Q²²Ü) dô¡˜"–f@É$à^%ñ â+jÏ&‘£LË`2³N§P?ØþN®µhÒØë×óHwÄ_ˆGT’]H›ýNÙ§Cþ¼÷ÿwùý:ù®i¹«Ú5ƒêÚÕ–ž€“q2ÇÇ`O'ð5âNr«;³çªTyÞ[³ÚüT>Çð†ÞÙ¸o³ZÅϨØöZ—á˜ÇÈy6äÿì¾Ýº×œfŒÖ4ç*ræ‰ÏJ¤©Kš'×qȒƲFêèÀ2²œ‚B :¼7á×ÄfÑÞ=X”¶žÇl3±É€úö—Ò½ÄÊ ƒÈ#½{TjƬn ¡^5£t-#2¢–f@É$àKÒ¼Kâ?Äí#.‰¢M‹!•¸¹Cþ¿ÕTÿsÔÿÓ©V¬iFìuëÆŒy¤Gñâ)ÕÚMG”<³N§sè?ÙþN¾mšfhÍxÕ'*’æ‘óõjJ¬¹¤?5éßtºÕç×%OÜÚD޲0çE?øð¯>Ñt‹½{VƒN²MóLØÏeØû^ç®^Z|<ðD:nžãíL†8OFf?zCôÎ~¤ ׯV{#|,[­?†?™Æø®wñÄHôÛf&$Z¡.ßÝø ö˜¢H!H£]¨ŠG +̾øy•e×îTåÁŠß=Æ~fþŸz…v` Úue¼¿#¿/„œeZ{ÍßåÐ*+‹xní¥·¸d†U(èÝ¢¥¢»^§ Õôg‡_Új_ ¼V—6Ľ£“å–é,}Ñ½Çøî5­Gøáد,åÝÆ•)4mÞ7Ÿþ±ïÕk=ž¹§Ic}øŸ¡þ$=™Ob+Çnì5ÿ†Ú×ÚmœÉjç]¿»”u‡cþA¯2pxfÓW¦ÿÇ7„m5zOð8cFÔ4Aìuv†e鞌=T÷ŸšúÓ[ð¿ÄM=týNÒë´¶[Ö7ïøsê+‰ñÁFÕÚ] áo!ê!˜„”{gî·éYËuÍIÝË Ì¹è¾hžašô¿‡?ÛGxô}bRÚ{°ÎÇ&èØþ_Jà5TÒ$)¨é÷6ÄfXʃô=áT3YBR§+£*sÝnzŸÄ‰Úf]D›#+qr‡ýª©þç©þ/§_/Í35NѵM^@švŸsrIÆbŒ°SÐ~4ç)U•ØTœëNì§šÐÑômC^ÔÇN·i¦n¸è£Õa]ÿ‡¾ ê7N²ë· gS $<§Û?uZí®õ¿ ü;ÓÛOÓ î»Áe™½d~ß>‚´ŽËš«²6Ž•sÖ|±EÑt†>–òòQ%Ü€y²óHÝ£Aéÿë>Ü=…¦¥ñ'ÅosrJZ!a^‘GÙÜÿ‰¢ÒÃ_ø“­}¦åÌv¨peÛû¸‡÷Tw?äšö-G³ÐôèìlbÙu?Äç»1îMiª$ß5WÌÿá—ÅËž´œßžßq½´6–éooE cˆ¸ =…KEÛ±è%mQEÿÙ endstream endobj 119 0 obj<> endobj 120 0 obj <>stream ÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ–ú"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¦³_š€šÒªÕy'-÷zT4a®OðÔ-35 5H¶ÍüT˜ÔyS-²Ñöe ÖwZ™nWøª6¶z…•–€4ƒt¥¬åfZ±Ïf  4Rnn´Rn›×ûÔê)7 7 Z)( ¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠŠYV?­,’ª}j¤’3SY™›sS£…¤ÿv€ªÍ÷jÔpûÔï’:k\¯ðÐÛEU®^£i¨ãH«M3¥Sù¨  sýÚŽIÙª5š¤ò€#¢¦û3Ó¾Í@÷5š"Ûæ¦Ð¹¨ÝSGR½R}™(®æ£sU¯³%fZ¯æ59gu©ÚšÖÆ€¹5"ܯñT-­FÊË@VTj}gÓ–fZ¿EAÊ·Z˜ÐÑEQE²ˆ×Þ©³nmÔ33}ê(§yBÆÍ÷jE¶oâ hÚÕq`E©6Ц°;T‹mýê±K@,´åVŸE&ÑE-QEÖPªKýÚ»H˺€3Õ™~í\Š]ß+}ê¯,^_Ì¿v£û´¡KPE.õO@Q@ FÑKEDÐ#T2@WîÕºJÏû´èähêÜ‘,j¤´îиåY:T•œ¬Ë÷jäRù‹ï@ÑEÙ–œ°"Ô´Pm¥¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠF]ÕNX¶üË÷jí#.êÏVÛW"—wÊßz«Ë–ßìÔjÛ[rÐRù‹ïRÐEPEPMe ¸4ê(”±ymþÍF­µ·U÷]ËŠ Ëµ¶ÐômËšuT¶“øjÝQEQEQEQEQEQEQEQEQE5”2àÕIcòÛýš»Me »h‚³+nZ»‚E÷ª’FѵÈÊÔ~Šdr u>€ (¢€ (¢€ ­r¿ÅVj9WttJ6ÚËW·Õ“Ì  ´QEQEQEQEQEQEQEQEQEQE1ÐHµE••¶ÖE,^bûÐX¤òÛýšº¬r*ƒ++mj’)¶¶Öû´vŠJZ(¢Š)’«j}6O¸~”BŠ(  (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ –-ß2ýê«Z^x¿‰h°K·åjµYõf sòµX¢’–€ ŽSû¶©* –Ú´V¶š¿z­yt=Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%-Rx¶üËPÖ…U–-¿2ýÚ’)w|­÷ªzÎVÛW"—rãø¨Z©rÛ›o¥ZfÚ¹¬ùsn D»¤«Õ^ÙЬÐEPEPEPEPEPEPEPEPEPEPEPEPH˺–Š¥,[~eûµ¶ÚÐeܸªrÄcÿv€$i÷GНEIîj³펤¤¥ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( €G4Q@äˆàšžÝT ÍPÔQEÿÙ endstream endobj 121 0 obj<> endobj 122 0 obj<> endobj xref 0 123 0000000000 65535 f 0000000015 00000 n 0000000059 00000 n 0000000145 00000 n 0000000264 00000 n 0000000383 00000 n 0000000502 00000 n 0000000621 00000 n 0000000740 00000 n 0000000859 00000 n 0000001058 00000 n 0000000978 00000 n 0000001124 00000 n 0000001225 00000 n 0000001407 00000 n 0000001327 00000 n 0000001473 00000 n 0000001574 00000 n 0000001756 00000 n 0000001676 00000 n 0000001822 00000 n 0000001923 00000 n 0000002105 00000 n 0000002025 00000 n 0000002171 00000 n 0000002272 00000 n 0000002454 00000 n 0000002374 00000 n 0000002520 00000 n 0000002621 00000 n 0000002803 00000 n 0000002723 00000 n 0000002871 00000 n 0000002973 00000 n 0000003158 00000 n 0000003076 00000 n 0000003231 00000 n 0000003333 00000 n 0000003480 00000 n 0000003436 00000 n 0000003524 00000 n 0000003573 00000 n 0000003678 00000 n 0000004692 00000 n 0000004741 00000 n 0000004878 00000 n 0000004927 00000 n 0000005263 00000 n 0000005344 00000 n 0000005469 00000 n 0000005425 00000 n 0000005513 00000 n 0000005562 00000 n 0000005667 00000 n 0000006560 00000 n 0000006609 00000 n 0000006746 00000 n 0000006795 00000 n 0000007131 00000 n 0000007212 00000 n 0000007337 00000 n 0000007293 00000 n 0000007381 00000 n 0000007430 00000 n 0000007535 00000 n 0000008546 00000 n 0000008595 00000 n 0000008732 00000 n 0000008781 00000 n 0000009117 00000 n 0000009198 00000 n 0000009323 00000 n 0000009279 00000 n 0000009367 00000 n 0000009416 00000 n 0000009521 00000 n 0000010558 00000 n 0000010607 00000 n 0000010744 00000 n 0000010793 00000 n 0000011129 00000 n 0000011210 00000 n 0000011335 00000 n 0000011291 00000 n 0000011379 00000 n 0000011428 00000 n 0000011533 00000 n 0000012446 00000 n 0000012495 00000 n 0000012632 00000 n 0000012681 00000 n 0000013017 00000 n 0000013098 00000 n 0000013223 00000 n 0000013179 00000 n 0000013267 00000 n 0000013316 00000 n 0000013421 00000 n 0000013696 00000 n 0000013745 00000 n 0000013882 00000 n 0000013932 00000 n 0000014269 00000 n 0000014351 00000 n 0000014490 00000 n 0000014433 00000 n 0000014547 00000 n 0000014597 00000 n 0000014702 00000 n 0000014852 00000 n 0000014902 00000 n 0000015040 00000 n 0000015090 00000 n 0000015656 00000 n 0000015738 00000 n 0000015820 00000 n 0000016990 00000 n 0000017054 00000 n 0000018043 00000 n 0000022759 00000 n 0000022828 00000 n 0000024864 00000 n 0000025017 00000 n trailer <> startxref 25182 %%EOF jetty-6.1.26/LICENSES/cla-dexter.txt0000644000175000017500000001564011240377440015455 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Dexter Ang E-Mail: dexter@webtide.com Mailing Address: 101 Veterans Drive Nivel Hills, Lahug, Cebu City, Philippines You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: January 14, 2008 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFHizvZQ/RzK/TdfMYRAnl1AJ9WzML8xDM9HFUqyrFNNylHc8swZACfU3MD 5m1IYSdEU+ue5uwdK2wFixw= =mtu1 -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/ccla-simulalabs.txt0000644000175000017500000001676411166563041016472 0ustar moonmoonJetty Project Corporate Contributor License Agreement V1.1 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. This version of the Agreement allows an entity (the "Corporation") to submit Contributions to Mort Bay, to authorize Contributions submitted by its designated employees to Mort Bay, and to grant copyright and patent licenses thereto. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at LICENSES/ccla-CORPORATE-NAME.txt. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise send a signed Agreement to MortBay. Each developer covered by this agreement should have their name appended the Schedule A and the copy commited to LICENSES/ccla-CORPORATE-NAME.txt using their authenticated codehaus ssh login. If possible, digitally sign the committed file, otherwise send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Corporation name: Simula Labs, Inc. Mailing Address: 4676 Admiralty Way, Suite 520 Marina Del Rey, CA 90292 Point of Contact: Full name: Gordon King E-Mail: gordon.king@simulalabs.com Fax: +1 800 822 0471 You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) were submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that You are legally entitled to grant the above license. You represent further that each employee of the Corporation designated on Schedule A below (or in a subsequent written modification to that Schedule) is authorized to submit Contributions on behalf of the Corporation. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. It is your responsibility to notify MortBay when any change is required to the list of designated employees authorized to submit Contributions on behalf of the Corporation, or to the Corporation's Point of Contact with MortBay. Date: Signature: Name: Gordon King Positions: Chief Operational Officer Schedule A Name Date added Simone Bordet 12 September 2006 ______________________________________ ________________ ______________________________________ ________________ jetty-6.1.26/LICENSES/cla-tvernum.txt0000644000175000017500000001561611166563041015666 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Timothy Philip Vernum E-Mail: tim@adjective.org Mailing Address: 7/9-11 Cook St, Sutherland, NSW 2232, Australia You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (Darwin) iD8DBQFEnjfA9nwdoZUd8/ERArwdAJ4lzyXEi4zSlIiJwEAxknGPhzMRswCfRsdI RUIoI0BYmYpaETSqxt2oLFU= =Tr57 -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/cla-dyu.txt0000644000175000017500000001564211240377440014765 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: David Michael Yu E-Mail: dyu@webtide.com Mailing Address: 15 Freedom St. Peace Valley Lahug, Cebu City Philippines You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 14 January 2008 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.8 (MingW32) iEYEARECAAYFAkeLFIsACgkQjWHNMjoXfXTjSACeKOgzKTiwDkGfYOaUhGmchtIX 2hgAnRoq7k8cHqO4o1oRwybUho6x/TAW =rRcC -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/LICENSE-APACHE-2.0.txt0000644000175000017500000002613611240400460015712 0ustar moonmoon Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. jetty-6.1.26/LICENSES/cla-sbordet.txt0000644000175000017500000001553411166563041015627 0ustar moonmoon-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jetty Project Contributor License Agreement V1.0 based on http://www.apache.org/licenses/ Thank you for your interest in the Jetty project by Mort Bay Consulting Pty. Ltd. Australia ("MortBay"). In order to clarify the intellectual property license granted with Contributions from any person or entity, MortBay must have a Contributor License Agreement ("CLA") that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of MortBay and its users; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete this agreement and commit it to the Jetty repository at svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty at legal/cla-USERNAME.txt using your authenticated codehaus ssh login. If you do not have commit privilege to the repository, please email the file to mortbay@mortbay.com. If possible, digitally sign the committed file, otherwise also send a signed Agreement to MortBay. Please read this document carefully before signing and keep a copy for your records. Full name: Simone Bordet E-Mail: simone.bordet@gmail.com Mailing Address: You accept and agree to the following terms and conditions for Your present and future Contributions submitted to MortBay. In return, MortBay shall not use Your Contributions in a way that is contrary to the software license in effect at the time of the Contribution. Except for the license granted herein to MortBay and recipients of software distributed by MortBay, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with MortBay. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to MortBay for inclusion in, or documentation of, any of the products owned or managed by MortBay (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to MortBay or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, MortBay for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to MortBay and to recipients of software distributed by MortBay a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to MortBay, or that your employer has executed a separate Corporate CLA with MortBay. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to MortBay separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify MortBay of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Date: 8 January 2007 Please sign: -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.3 (GNU/Linux) iD8DBQFFoniQJVhlFus9dGQRAmJmAJwL5y1loonhVQIICsparvjHMQuwqwCgiZFy LBDVaad1bJ1v1EHY901kPcg= =6rqm -----END PGP SIGNATURE----- jetty-6.1.26/LICENSES/LICENSE-ECLIPSE-1.0.txt0000644000175000017500000002601511240400460016050 0ustar moonmoon Eclipse Public License - v 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.