From sanselan-commits-return-113paul24@example.com Mon Jul 07 19:38:46 2008 Return-Path: <sanselan-commits-return-113paul24@example.com> Delivered-To: paul24@example.com Received: (qmail 18508 invoked from network); 7 Jul 2008 19:38:45 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 7 Jul 2008 19:38:45 -0000 Received: (qmail 33831 invoked by uid 500); 7 Jul 2008 19:38:46 -0000 Delivered-To: paul24@example.com Received: (qmail 33816 invoked by uid 500); 7 Jul 2008 19:38:46 -0000 Mailing-List: contact paul24@example.com; run by ezmlm Precedence: bulk List-Help: <mailto:paul24@example.com> List-Unsubscribe: <mailto:paul24@example.com> List-Post: <mailto:paul24@example.com> List-Id: <sanselan-commits.incubator.apache.org> Reply-To: paul24@example.com Delivered-To: mailing list paul24@example.com Received: (qmail 33807 invoked by uid 99); 7 Jul 2008 19:38:46 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 07 Jul 2008 12:38:46 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 07 Jul 2008 19:38:03 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 3202723889F3; Mon, 7 Jul 2008 12:38:25 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r674608 - /incubator/sanselan/board/2008-07.txt Date: Mon, 07 Jul 2008 19:38:25 -0000 To: paul24@example.com From: paul24@example.com X-Mailer: svnmailer-1.0.8 Message-Id: <paul24@example.com> X-Virus-Checked: Checked by ClamAV on apache.org Author: clr Date: Mon Jul 7 12:38:24 2008 New Revision: 674608 URL: http://svn.apache.org/viewvc?rev=674608&view=rev Log: Draft incubator report for July 2008 Added: incubator/sanselan/board/2008-07.txt (with props) Added: incubator/sanselan/board/2008-07.txt URL: http://svn.apache.org/viewvc/incubator/sanselan/board/2008-07.txt?rev=674608&view=auto ============================================================================== --- incubator/sanselan/board/2008-07.txt (added) +++ incubator/sanselan/board/2008-07.txt Mon Jul 7 12:38:24 2008 @@ -0,0 +1,19 @@ +2008-July Sanselan Incubator status report + +Sanselan has been in incubation since September 2007. + +Sanselan is a pure-java image library for reading and writing +a variety of image formats. + +The community hasn't grown much in the past three months. There +continues to be only one active committer. + +There was work on EXIF metadata read/write support and a bug +in the implementation was discussed on the dev aliaas. + +Builds outside Apache have been made but no official Apache release +has been created yet. + +Barriers to graduation continue to be diversity, size of the community, +overall activity, and lack of a release from Apache. + Propchange: incubator/sanselan/board/2008-07.txt ------------------------------------------------------------------------------ svn:eol-style = LF From sanselan-commits-return-114paul24@example.com Sat Jul 12 12:16:55 2008 Return-Path: <sanselan-commits-return-114paul24@example.com> Delivered-To: paul24@example.com Received: (qmail 86015 invoked from network); 12 Jul 2008 12:16:55 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 12 Jul 2008 12:16:55 -0000 Received: (qmail 86867 invoked by uid 500); 12 Jul 2008 12:16:56 -0000 Delivered-To: paul24@example.com Received: (qmail 86850 invoked by uid 500); 12 Jul 2008 12:16:55 -0000 Mailing-List: contact paul24@example.com; run by ezmlm Precedence: bulk List-Help: <mailto:paul24@example.com> List-Unsubscribe: <mailto:paul24@example.com> List-Post: <mailto:paul24@example.com> List-Id: <sanselan-commits.incubator.apache.org> Reply-To: paul24@example.com Delivered-To: mailing list paul24@example.com Received: (qmail 86841 invoked by uid 99); 12 Jul 2008 12:16:55 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 12 Jul 2008 05:16:55 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 12 Jul 2008 12:16:11 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E566623889FB; Sat, 12 Jul 2008 05:16:04 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r676159 - /incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java Date: Sat, 12 Jul 2008 12:16:04 -0000 To: paul24@example.com From: paul24@example.com X-Mailer: svnmailer-1.0.8 Message-Id: <paul24@example.com> X-Virus-Checked: Checked by ClamAV on apache.org Author: cziegeler Date: Sat Jul 12 05:16:04 2008 New Revision: 676159 URL: http://svn.apache.org/viewvc?rev=676159&view=rev Log: SANSELAN-4 : Comment out jbig2 stuff which is not in the repo. Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java?rev=676159&r1=676158&r2=676159&view=diff ============================================================================== --- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java (original) +++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java Sat Jul 12 05:16:04 2008 @@ -36,7 +36,6 @@ import org.apache.sanselan.formats.bmp.BmpImageParser; import org.apache.sanselan.formats.gif.GifImageParser; import org.apache.sanselan.formats.ico.IcoImageParser; -import org.apache.sanselan.formats.jbig2.JBig2ImageParser; import org.apache.sanselan.formats.jpeg.JpegImageParser; import org.apache.sanselan.formats.png.PngImageParser; import org.apache.sanselan.formats.pnm.PNMImageParser; @@ -52,7 +51,7 @@ new PngImageParser(), new BmpImageParser(), new GifImageParser(), new PsdImageParser(), new PNMImageParser(), new IcoImageParser(), - new JBig2ImageParser(), + //new JBig2ImageParser(), // new TgaImageParser(), }; From sanselan-commits-return-115paul24@example.com Sun Jul 13 19:16:12 2008 Return-Path: <sanselan-commits-return-115paul24@example.com> Delivered-To: paul24@example.com Received: (qmail 69727 invoked from network); 13 Jul 2008 19:16:12 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 13 Jul 2008 19:16:12 -0000 Received: (qmail 51139 invoked by uid 500); 13 Jul 2008 19:16:12 -0000 Delivered-To: paul24@example.com Received: (qmail 51121 invoked by uid 500); 13 Jul 2008 19:16:12 -0000 Mailing-List: contact paul24@example.com; run by ezmlm Precedence: bulk List-Help: <mailto:paul24@example.com> List-Unsubscribe: <mailto:paul24@example.com> List-Post: <mailto:paul24@example.com> List-Id: <sanselan-commits.incubator.apache.org> Reply-To: paul24@example.com Delivered-To: mailing list paul24@example.com Received: (qmail 51112 invoked by uid 99); 13 Jul 2008 19:16:12 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 12:16:12 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 19:15:28 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 5EDD72388A04; Sun, 13 Jul 2008 12:15:51 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r676408 - in /incubator/sanselan/trunk/src/test/data/images: bmp/ gif/ ico/ png/ pxm/ tga/ Date: Sun, 13 Jul 2008 19:15:51 -0000 To: paul24@example.com From: paul24@example.com X-Mailer: svnmailer-1.0.8 Message-Id: <paul24@example.com> X-Virus-Checked: Checked by ClamAV on apache.org Author: cmchen Date: Sun Jul 13 12:15:50 2008 New Revision: 676408 URL: http://svn.apache.org/viewvc?rev=676408&view=rev Log: adding some simple images to the test image suite. Added: incubator/sanselan/trunk/src/test/data/images/bmp/ incubator/sanselan/trunk/src/test/data/images/gif/ incubator/sanselan/trunk/src/test/data/images/ico/ incubator/sanselan/trunk/src/test/data/images/png/ incubator/sanselan/trunk/src/test/data/images/pxm/ incubator/sanselan/trunk/src/test/data/images/tga/ From sanselan-commits-return-116paul24@example.com Sun Jul 13 19:19:16 2008 Return-Path: <sanselan-commits-return-116paul24@example.com> Delivered-To: paul24@example.com Received: (qmail 71078 invoked from network); 13 Jul 2008 19:19:16 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 13 Jul 2008 19:19:16 -0000 Received: (qmail 52931 invoked by uid 500); 13 Jul 2008 19:19:16 -0000 Delivered-To: paul24@example.com Received: (qmail 52913 invoked by uid 500); 13 Jul 2008 19:19:16 -0000 Mailing-List: contact paul24@example.com; run by ezmlm Precedence: bulk List-Help: <mailto:paul24@example.com> List-Unsubscribe: <mailto:paul24@example.com> List-Post: <mailto:paul24@example.com> List-Id: <sanselan-commits.incubator.apache.org> Reply-To: paul24@example.com Delivered-To: mailing list paul24@example.com Received: (qmail 52904 invoked by uid 99); 13 Jul 2008 19:19:16 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 12:19:16 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED,OBSCURED_EMAIL X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 19:18:31 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id CC39E2388A3D; Sun, 13 Jul 2008 12:18:54 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: svn commit: r676410 - in /incubator/sanselan/trunk/src/test/data/images: bmp/1/ gif/1/ ico/1/ jpg/1/ png/1/ pxm/1/ tga/1/ tiff/1/ Date: Sun, 13 Jul 2008 19:18:54 -0000 To: paul24@example.com From: paul24@example.com X-Mailer: svnmailer-1.0.8 Message-Id: <paul24@example.com> X-Virus-Checked: Checked by ClamAV on apache.org Author: cmchen Date: Sun Jul 13 12:18:53 2008 New Revision: 676410 URL: http://svn.apache.org/viewvc?rev=676410&view=rev Log: adding some simple images to the test image suite. Added: incubator/sanselan/trunk/src/test/data/images/bmp/1/ incubator/sanselan/trunk/src/test/data/images/bmp/1/Oregon Scientific DS6639 - DSC_0307 - small.bmp (with props) incubator/sanselan/trunk/src/test/data/images/bmp/1/info.txt (with props) incubator/sanselan/trunk/src/test/data/images/gif/1/ incubator/sanselan/trunk/src/test/data/images/gif/1/Oregon Scientific DS6639 - DSC_0307 - small.gif (with props) incubator/sanselan/trunk/src/test/data/images/gif/1/info.txt (with props) incubator/sanselan/trunk/src/test/data/images/ico/1/ incubator/sanselan/trunk/src/test/data/images/ico/1/Oregon Scientific DS6639 - DSC_0307 - small.ico (with props) incubator/sanselan/trunk/src/test/data/images/ico/1/info.txt (with props) incubator/sanselan/trunk/src/test/data/images/jpg/1/Oregon Scientific DS6639 - DSC_0307 - small.jpg (with props) incubator/sanselan/trunk/src/test/data/images/png/1/ incubator/sanselan/trunk/src/test/data/images/png/1/Oregon Scientific DS6639 - DSC_0307 - small.png (with props) incubator/sanselan/trunk/src/test/data/images/png/1/info.txt (with props) incubator/sanselan/trunk/src/test/data/images/pxm/1/ incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.pbm (with props) incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.pgm incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.ppm (with props) incubator/sanselan/trunk/src/test/data/images/pxm/1/info.txt (with props) incubator/sanselan/trunk/src/test/data/images/tga/1/ incubator/sanselan/trunk/src/test/data/images/tga/1/Oregon Scientific DS6639 - DSC_0307 - small.tga (with props) incubator/sanselan/trunk/src/test/data/images/tga/1/info.txt (with props) incubator/sanselan/trunk/src/test/data/images/tiff/1/Oregon Scientific DS6639 - DSC_0307 - small.tif (with props) Added: incubator/sanselan/trunk/src/test/data/images/bmp/1/Oregon Scientific DS6639 - DSC_0307 - small.bmp URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/bmp/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.bmp?rev=676410&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/bmp/1/Oregon Scientific DS6639 - DSC_0307 - small.bmp ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/bmp/1/info.txt URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/bmp/1/info.txt?rev=676410&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/data/images/bmp/1/info.txt (added) +++ incubator/sanselan/trunk/src/test/data/images/bmp/1/info.txt Sun Jul 13 12:18:53 2008 @@ -0,0 +1,3 @@ +these photos are from my cameras - a Canon SD 750, a Nikon D50. +I hereby put them in the public domain. +Charles Matthew Chen Propchange: incubator/sanselan/trunk/src/test/data/images/bmp/1/info.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/sanselan/trunk/src/test/data/images/gif/1/Oregon Scientific DS6639 - DSC_0307 - small.gif URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/gif/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.gif?rev=676410&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/gif/1/Oregon Scientific DS6639 - DSC_0307 - small.gif ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/gif/1/info.txt URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/gif/1/info.txt?rev=676410&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/data/images/gif/1/info.txt (added) +++ incubator/sanselan/trunk/src/test/data/images/gif/1/info.txt Sun Jul 13 12:18:53 2008 @@ -0,0 +1,3 @@ +these photos are from my cameras - a Canon SD 750, a Nikon D50. +I hereby put them in the public domain. +Charles Matthew Chen Propchange: incubator/sanselan/trunk/src/test/data/images/gif/1/info.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/sanselan/trunk/src/test/data/images/ico/1/Oregon Scientific DS6639 - DSC_0307 - small.ico URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/ico/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.ico?rev=676410&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/ico/1/Oregon Scientific DS6639 - DSC_0307 - small.ico ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/ico/1/info.txt URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/ico/1/info.txt?rev=676410&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/data/images/ico/1/info.txt (added) +++ incubator/sanselan/trunk/src/test/data/images/ico/1/info.txt Sun Jul 13 12:18:53 2008 @@ -0,0 +1,3 @@ +these photos are from my cameras - a Canon SD 750, a Nikon D50. +I hereby put them in the public domain. +Charles Matthew Chen Propchange: incubator/sanselan/trunk/src/test/data/images/ico/1/info.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/sanselan/trunk/src/test/data/images/jpg/1/Oregon Scientific DS6639 - DSC_0307 - small.jpg URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/jpg/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.jpg?rev=676410&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/jpg/1/Oregon Scientific DS6639 - DSC_0307 - small.jpg ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/png/1/Oregon Scientific DS6639 - DSC_0307 - small.png URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/png/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.png?rev=676410&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/png/1/Oregon Scientific DS6639 - DSC_0307 - small.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/png/1/info.txt URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/png/1/info.txt?rev=676410&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/data/images/png/1/info.txt (added) +++ incubator/sanselan/trunk/src/test/data/images/png/1/info.txt Sun Jul 13 12:18:53 2008 @@ -0,0 +1,3 @@ +these photos are from my cameras - a Canon SD 750, a Nikon D50. +I hereby put them in the public domain. +Charles Matthew Chen Propchange: incubator/sanselan/trunk/src/test/data/images/png/1/info.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.pbm URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.pbm?rev=676410&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.pbm ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.pgm URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.pgm?rev=676410&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.pgm (added) +++ incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.pgm Sun Jul 13 12:18:53 2008 @@ -0,0 +1,295 @@ +P5 +# Created by IrfanView +300 225 +255 +IEH`S4NRYj_@4,,3."#033&<$ #,1#$.&%(.0&&Pa]G2^cTH&>FWIP_jmkR]^OH*04IC1Ji7kF*2:%**K<*(&&'.1/.",'#%5=>2-+&<6+:.5}l;OL8,(>@2 '[]7%42*@66[VH-./7-++2*2.# (#2%8@/?BA&-)68/JkH)"+X^(2H3';P DZC_vbH*7*(,25U(JC 2C +!$%6L "K?(N]9 Ub.$ ATOIHCVPRRLPM910/!(A^I,*&!%%6)2(**!,1,6C6X[TRRfbNI0Aclimh`joe]\AF377GMP>D78!79@.41J3(@Z^UM7G8'Bux/$'+3-'5N9#-(Ch`5""$<==39- (@BP%!Se9)/8]6=ATPieB&%)*,!&4H_K&$&(/"):4;oK%(/(')F;! j^C**!CB [M8]T"?CL+$-! $B? (!$%$E!<?S`T;!;3OYD5PdgRNecYF>>,-0/;KS1.%89%# 5*'(&56<6@.ELIZebaS__`qoqnq_VaddZ53#,@CIK)"-)&2AFS;65? 64=H<9@@52V[9 '>D+3&-DFF,;@@I)$/*&(%%)$KlB9*+($?WgeYWE^\~ŸMGS%%;;&$=3LG-.<*$'02/="A &"3) $#1cEa)'!/O6.) E3 1V2-) $<.-* 6Y*@X[\:.*CT) (++!UNFF]bV?D\ZU;,?M36#6W?)( -(+B40+211.'+)<?IJV_galinvqlmoiyyegG?DhtE:4;Y<!:<'0F>5I<1).7+18<LHIMAdP,:E+-69.*;8W+,8^.9j< 9<GX9#+0P2/337/`x¡SHuyUXVRiF8-0*.2Z9.=69/+(.,@f‹j /+#!"*###S"$"""Eb6)64& 2P0 "># 1- =5"0W2 8_\J31) MW&B$'<3 PJWVH=?7GQ;5$2R1&2+*D@) %#!"(<,!=I<2:0=U\ZPTKT`mqljqqpvuhqhH2PL<D?=A5L=5:.1%=.#2+%*+2 0<060Nj\xxO4)BEGe"03/,<T03#/M*95HjP,7?3.'"07#/8'JV…+:S9:m©ŒL6BN$!4K03*13IR:6%0+/?GT:"B+X\#"2$ 5-$92!.9> '+% $4:$3#=h^\C$!" 77 2+*F;JDI>04F?HQ9,'+YT/(*49&#)/.0>4UdD"8;GUYJQYN[gehkkmsmve;ID8DQJ67+0*/-.2%!-"#+%-'6O<-8:(csWLA(.KO'Kk1$#.8]6B7-&1$'5KQI.(CE5;%$"<J6023B8),/7i[Ypxy_*3?=*APV8<4@?766.KJC7_Of`#Tj2,"%$$HT"/%!D1.(,OU @0'PD9GfhiK@J( .!#! PG3(26=5@FENF=&/:@,#!.<9& ()'*'+)$.PM]eSPEIGFE27BMWSd`afm\OTJ@D-EY`QC@5E@I:2$&#,(&(2()*!=G;42B;PF)%$'+<<+-1I:.9/-3'8G)205L6.%1n{q^#6A1*(EZvdI8NY<v{bM<15?&1Vd5$`4"+)?R;H_[H55BG##KsR-0" ),$H8*"9K1<e.$=CJkni'NUT]hgkC 5.(/$"!si>*4##0PddVT{o^*#,@2#*%#,&+$'6;;?Og><C@CQL2PM?veF<GHP<$@MNrZL-97#54ID91+ /,-260;4:J04677(/,!%!$!!%/$/6 :."/.4/$/$&$'%$%:47LG8`N1)&8"O'!,.Ruxi?@_J[>QB,0",17/C6 ~9 1J:0b"šk ,#:4<V %"!!5" "C$$)$.' O<\qo7JS?Uh`Y- '$& &/YdMH>8+8[e\YPcXG,#$(888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4-$$'&@$&%(%1ZbZJC6>CJQ]h`8G€e]O15I\WT@8D;VhC*0+-4-.#03,9C109,/0A<5,,3?56/#-,#-I8'0')+/4=ED# $%.K@2FF#62&)a‹fWP7-*)k‡p[]@+0?CS?'+2.#9:$)9A2%)%>HvjM(,%-#0^hF + &7#/4*A$3.VD"/D_]/S^M,F[Z\' ##(!/)!APC1/[_IQ:=^hgVX=1'+1CHU@(!-+*6*"G:'SQ`UD:>]EVUPPEJp@=2HF[dd^'5;qx8+&3$14\G@3&(1,L7'SE/+7NJ78;()'#*64.,0>J2-/=-,(4K<$*4B9)4-#H-P_UaD1#%†7I?.*1HD15:20(2:&/,R`A6- 1CaY"%:R NŽ_" &(!)'&#'C]3%:$"cpG,P%++;891LJ-&TIY[c%##,!/) R5)*);WGILVbqrd85'*89+57#')6+5<*4LA2C6D3TmRSEH;paul24@example.com>+3+MH(F#5B9"!QO<9+&1?+$*>qRQ0>BM76 .5".4('.,1478(CY>-I@8 +cru1C@0B2c'C=pt{<'!8RJU:(20;)1hn?102-7+( %15*B:1M\-)9G.#'*!$-+!0L9#/!JLc?7A/D"83.A:DM&,";9*1 %:,!A4* &?879<6KVMP4&3+3PG(*1# '$8E09C+6;92+;?0<h[8MpYi}…m]@BYG=563"&E.+T4=R*36! (J02=B20")5,E6J3,&<8 "'/*3C4$(26(239NH+$#,.!&;^">XKBB>t}]`xbJuE+<bH5.-%,)-AW:(N_>0(/)+E5I'$-1J*,"?##" 5.!&%3*, 56$!55=QHBG]VE*" JB#)")(A\OF6'? !2?& A2>B9>2.6=;WaRR1#0,/B:% )'"!/F5I8AB03K16$#..PUNehg=XRSc^tx^TTQ-#/J-7G9N@&A7',=.9KjT&$60#)28++5FI+'.(.'54!!?^k:&&*3<ab.5+5@>C5%/31<FhL‡FJ>wcjI:L*(4:4JD9S[?G;4-/!!3ed').(66(@M+"":5( $ -A*"+9JJ>ITTLA&+!76.2ED7boUI.: #M;OUCV]E9PJ9;^g@"$)('$'#$(3$8S]GXeB(Q5>/*#;121?IiJRZkrr`rl<>_^S3,-NA9,)D+ %%?H,.%DT"(;:,"+%12;<1>).2e813' .FeJ/,4<B]o67Y"<*#F8)%"+(9]:ˆŽKD=T™a/N‰L*2[W/D<ZL+,7+'*)-($*RMIl4"$.*" #<6J>+*)&(' #M1$/m[%'SC,079#'"/5"! +1XjV=3;K!)* #1*LBR^X_hXJ[]ZO^Q/!&)$"0;O99CK>ETE8<84:'6)$<AlrnikpsxkkIHa`jS45NX(/VB41.26[H&'#,E".8+.!#/+)",:Y42]WD@FA6$ _@!*8F,-25c'Fc312:/nI 5U=kfu\>OL_N(Lb(@WT/1#=G.063(&12.)5M=AO1- E/# %3D9wW6!! 9(,%$*!k"+"(F1$%) (/)&%,&)* %?8/BH7;,'93 +X^Z_cNEQARUcA3/#!(1(1;fk[:M3KS:$'PU8.?8@9vde^JGXqwhbaEfou|PB;IE%]_5M=(-(3(#!&&;&/$-C\9!#*?U>T6C‰eO_dXN8;,@0%3N<œj&7-Zt}s-33^PD0I`o™Rcb:7(1oA.,9.=M5;35)+/7=H/N7&(:B5/$&5/"&KM7''!" !-A/$+ 9€C,-"%,()&";T@LO#$M-A95$ ,($ "<C, ]V]_dA:EOQ'@/+1$*134(B;,(^'h`Nh]KYO20Q:@54:9jaAD6H4vnpX\]eaGhmco)+tJ-DT6)0)*-1-!:034GSD#5+GW"2€th…"~"hJD.!!48BA+M81j•J>o€]y'i+,0E@),<`[LE4$ Bg^-)AL2437//(4?03=07,$8GB1Rf137RžR-4(')$!C:''.u4 )(()4+!#.712bfF$ 3.VZbdoPHU]Q1M3"(8@'4.;ObA$>OP:>S^XJ..>[7;XI?K\MSC4(K78lu^O`hdYPhM@Xtz/036-EM2%2H8.('+25VK<D?5P¢‹Ž†'|q`E.,!EL9B*60,…—l|>klVKdr}0$')Dblb9@8.-& " BK. &'#088>8*5Oj?!+!!'9?<;~<+69E;*('+& ") $%*-9: '):-$!2R/ )#,')"-?VB<B/3* (+[``\n_[j]c`hC$9RL7((226='#)46GR27RhV<3A:03@?rnDC?>8:AZO9GUX?Ndqu6@_r 'n\+299&<C*$(PB" %*/(7!,7,/'E8gƒ®žƒJ;V8?Y;1.1!<?7X]+E7H^BLEyV5S]dN/&g™"{C3*(0'& "+6($&50%)457;;JSG++!=(xhUOK0@4+8>'%!-,*"&./VfT2 +H**D)4:/",G'/G')fXT`/#@4 +"')?E- +YWMFYYY_aglkd^ba<".JHP-""&D?8NC-YHYgdZY6P3CIraC;^R22405?#)?48HQZQTO;Yb<$3BE/$90 ,KI10'6<=*6'&*>7,B…'›RE_0E†`<$1/%.N|_<RD1;;46MA9C<U}Ke8)W'…w0(--6$(" $)&")//-;1#-7A/A?>5#=*10&wybXUbO}=La+!$2<2*Ak}‰gE+!03OL$&6%#+-'*-36LQQ<(:VG8N< 5B( [XUR\^^VO\khkjjkF&'=Zk)!(&-/C>%;[Khysoe[?=G4.99HK.9D6**$+31/<=OEOU-7M:)*FF-%. # TH-7 *80,%/&O]nguJ?&&2Tj@.'&%.2FYVE73?A>;?53<;0EYZn''I}]o5#.42!1.'''&#$43.29<L645T9-%.@Y3-:<@hAAV7VJo;AL%!#',"02&&)@aqŒZ3$&/,9!$&&*'6*.,..:c~OI +$$JMSoDD]!$>0 + ZY_`_a`WLYfbhkilY3:5EM-.8-eBKWAFE^|€9*[KS:A238E:KJ(#.3ORD5JVYE&>;3*1)Ag^6 .%,O0?''A&(1#;5C;lT\S)UnGG_hQ:3$$"**/<-=J<888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4:4>?B>0.C_O"*']060/((%52,2'%%$$ !'=M^@:GeRC4*$6DT[I'9>dfY>D;3A5=G;0)$-1#!!A;$6F@.GxQ,3*$-/0+%$+IC0!.WZ3F PqI^i/@F. //0! [^``_`a_VcgcfjgiV4@;2*))C_;3`W=JSBH83<gb/9<bJ;%*I@4G\53:J[MMW\T1053)-#+31L?'''*%N0*&;>/?CK`[><JvLOYG5ByWA,'&$(+>I1CB,&+(.?CJOGF37D;,#'F0+&PP:4)&1NWI$&%"! '9:E>?>B7 $"4<MZ5/HR0CpF8U?D9F@)5//60-BF64.,-3HbP6"0WU<^8**%& /8*+B?=21!0?P>- ,#+%,"o‡:(%(3*$ ^`[\`b^abe_decYad`TH7 .Ob`d5BJ5A1>AMS{€I/<G820(MB/0dK?*7SEP]49EB=)8)#&0=21,("!+,+5%#"$3*%/##$6Vj^!05C8JPB'$(4\WeA-C>/538<@E?J9H0-1 "6@&-EY<%=J[{WF)(! !% !-7..GmJ)!!-.)$:,#YrO4:?"*C@]W7F>HTMM@/1.-*$-[wm=3.<#I.B8&)#%%!%>S?&RT84N/X_ &,4]l; +## ___`baaaadedhbdX_i`J-(XfdksXO[?19QI[c\4600)/*72@*,8:?=";ug6b;T]65*;L!1/)N5!" " ,(# ?95JN5 !4AE)9>PV+=0$$bP?:;/=f'€E)A50+--=5.@N21.7=:/;=;:8=%%E.`P&5[g?0)"! &!)+,/+x•:&"/.")RD5ZUL&-308FHKE6'"<3&#1*" 1D•ƒE+1F+#/A8H2,+Kns((0!+I^ '& +:9.463( ___`aaaaf_dbk`ZjcWIM[KAFƒqk`2I49>B:/:GV20.%.VB,!;?)&(4\k?HC:%C5*>G>77&>")6/&# """'/-6>9HjYEc~xu"GQH3:C;I"879;-*+,DE:8),&*-2-/CO1)/CF0D^QA:P.C™iN=3EOYPD#$#!&!'(+6&<N+1%-.#.XM`D+zG7),EV>BQjG'5&Y[%80\Z:E&&?p?3L/3 ,+ 7U.,:/ 1()+4, F]fmv]D!$U8 % aa`bbccd`dff`C>Q[O>Dl\<HMr\SC8(029?<686%+.02:=40KH7FC6_Q:=@8%.=8AB74J.<GD!"<= '&!ZŽQ9uT?uro–"E-7>B+;u\J),(%%,9B50*.&,**,/59)'(61!'eq2(.;Q}‹H0,.7$!1@))(+2)##)) .4E4273)Tk"\:_A)%1I5@V]ŽF;E?tX$!=2&&5b3.H7)Ra:.,2?%#*1+=R+0=4$ +'UE-7BF4B$# ccccdedffkgV>2FZ[Q6<d\TdNhG=N2/,691F5'2,#'4'.7F?A?CI?%'7E8.*.=5+7-%'(7C1-!"$XtL/!\i"-J:.M=Tˆa26&((/TwF".0*6@;1.'2514$$1=B6.*2125`sN2(0GXZE8' )$ (:32;:+ '14,-,4/?E?:@Aidml4:-6**1.*@g;>D4 "3YB#-L2%@?!&:D6HD3"'*.-;R"4483#. ' JƒM7i\# + bbccddddfaaA&3G`g`HML2HX@71PW1Ym_F+I<&++''+;?+#%888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4,,*#2PC57>Q4&.*>5"'('%/%/*$&(+5;!<8-)#-G]N+(&8q4/*Z`*-123<KQ=$2:*6&*8A@;716BS<5Vu98s]4=68,$)*),50+(KžÒÛÖáq93KKAC;H<P[@HCL44.%1@d1'#%#)..3/&NA!&7*39(&#.-)lo\H$1+Q4 0%"-H8 # abcddedcgggP8:7>LJ==.;<0I\v^BgzqD%42,$!(:2%7 '*5B)%'5;79M53WF4,""!! ';;"#"&"*&$$5C:%4+BI.*<$(!,6QE,>gUus?=I74*.2%1:4***%5'&,51370&'6,%8_XX‰xM8-$()(&1@?/!V«ñþþþýýýúඏbOWQ>+[AaB;<5;4,#"*," "% A^"##+"!%,!)/</Tl=7" 72,*: "B]';1"'6E% defhhhgffheV=AD;]XT:#.3(\z|}tR@>;-0()1<J6<N.).=')2</,-.+;K?>@A'%-#799KJ&$!)0+47.&H0&-$%-i"u>4Š"'?C>,/:-(*#"+0$$#'*(,#0D,%&('* '…T8YF3%**$$*,*-[³þþûúÿö÷÷ûùùçâßÈ©"r->7=0<GD?6/' $"!$(%7b8$."8D[qK%) ,+#R^( 36&36 + ghjkmlkjlep[=_mfoNG*(.$41QON_I;1,NdC!(0# ,#(B0,73*?KQ7."%>FGH:8""AD01<2JL.E/iƒ))2 Oqvg$K<)>B*98\B*4FkY"-@<D+-"),&$"$% $$%6,+6-'.*%2')9D<4X=&-%&'.(-mÈþþþùþùüþýúü÷ùÞÔØôúóÛ¼xC;1(=:'68"&-!+ #?i3%76'%$#.NSZ"&' %83FK8'@B7# lkmpsstspsqk]ix_OT?:`F6(13=hQK1.DC1%" )(1<0/@0')10(!+ iJ97A:) (8E,ND7',6,E.>E29(5IX9'£šMD6-bN=241%/-W;e|I1_fH7,'(%+.(&./02-&+G.+NI/%/1697=5%$;uËþûýüüûûüüýýúúü÷ëàÜìõöùýú潕oUi'©ŒN&$''8"%1@6:!+6/A9<3N) 0727\ja%#J8/8 &* ) llnprsttz{|~w}yQ13)N~Š{4;O\^8;1;5/'! %'6%(8C363/KG!%%" +I"5:M4(-'0DE* !-%8Wy'®dSml‰ZQ—œd;tiza4+$/%#=1'aš'sb%(@O#+*()$$/""(#'036/$$5+,Y\P:/*$,5=*1oÏþýøþýüüûûüüýüûúù÷òêâïøöñøþüøóôçëüýýøÀ|@)##%-HL/"J]Q?I)SD" 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4$>k n'uG:*&+0F %!+!$ llnpqsttsttxvwg9-&Utƒnge"…j`@43)!!'$",3*8+"%=lT8$-+".:IB;)$'%%';4P:+@3™¢¦_tš^rdRZguŽKwˆ•'1%$ &/8).aQUr-$^1"*$%&';. !)!&(+)!+(&18F,#8*+0*%>Îþþøûýúüüüüüüüüûûùö÷ùõîõã÷ýúýöùòýþýûö÷ýýùéÂG@+ +++!1P2!'IzTNI ( )!"! +#%'>OFANh]/'G37R *!( +llnopsttttvxw|uU=&'R^gx€zn|dG;#20" ;N3 &;3*82GO(9F2+*1'0!%$#(\P/Ob€•]Qw¢Ÿ"G<iejdQ_ePZ\oX !&'+"$%13GA&&",(("&6*-("$ &&"&/,44%&&FH-+:†Óýþûùÿþùþüüüüüüüüúúøö÷úûùÔ{|©Õýÿü÷úûúùûûöõúúýûß´zI####$ *0'7)6Wl4eK% B\'!JA%37[¨–9$# " + +kmnnpqssrsutrwzi05Rg^G`yh9YS-)%&((5("(/0)B@0)'/1M[1/(-B6.,$-$'!&'8<:P•¡\c6brl‹VF`}UK{–C53j{ghY:)%10(@Z@-0%%-&*(' %7% $()$%&#$-')'+#ms,-Øöÿüýüüþüûüüüüüüüüüúø÷÷÷÷ûþÕ£rK@e¤×õýþþûüû÷öõùöø÷üýä²n2%+"-*.;:#! "Ud!ds@ /9 +<Z& ,H5!Pj?#8J+%"!$ + +lmmopqrsutvursrg7-C@5?4<]B',*&#+;E+,.*#/0$;:* .1/<a0(ZMV+;0$@6" *%9BFpp}W?xyG8[?MF"aFO?K,:H["'Žb#%5WK<6-&0'8&29#+-$">S+#$+V:-%)I…Úýÿûýýùùüüüüûüüüüüüüüù÷÷øöôøþáÚÄÁªrP@QƒÍöþþýûýóùö÷øú÷þþõá¼m."'04&=&%ŒSA1#. 5&,-!@h^Q"BH(H=62"-'3Q( + lnopqrsttqsuuvtqqiY4 1JDR?!& #)+ *7.!://!DK0C8).;*14.04i[G7RY2;.+"!")-+C"ƒ\gF/>UobVi_)8~f[HeQ^U:_—‰•I#0M47?+(=6'-825 -/(7,lh?7 $=0*$5{Òýýûþþýþüýþþüúùûüüýýüüûùø÷ööö÷ùÏÂÆÑÑ˺±"S@VƒºçþûýþöüüïÓÝîýþýùâȉH*! "DB66%=8+%7>@ ,2ED/ Edd€œd/=4 mopsssstxssvuuw|~f@?XR^=>2LA"- "*$@,9-4Aa@$)#3bN*-6Y8$-BRA4\=$+/+`; €'d[\?KBdLAƒhI1)?FRT8>Yn'™™tdV4$*96+*V-C@.!!384[6}^am%+&#1pÙúúûüýúüûúþýõ÷ýýýûüüýýüüûùùöôöùøó¸­ÔÑÍÙÊÖäË¥xH%:z¹ìýûþûñß±x°æûþýþüì§.%2f;;1 +Ih -/ +,paul24@example.com‡/<CE ! +pqqrttturxuruwwys\2TL;F;0;I5!&%%5S495#5?F36+/&)93&70gRc8H@V-m\E<Jr›qA;1mT8%&4>CL;38X­ŒH@8,6)%$!;2T(_ws\4- -=M?TxuC/7H*&- u×ÿüþúúýûüþýÿèœWÁøøýüüüüüüüüùôõô÷ùøï¡ ÓÎËÍÍÏèåǽ¬j')/>f¨âüëõµJ\l|´ýýýþü" 5¢h-*I@% # '?B6F'}*<+,#25_RB9 + + qrrsuuuuxuw}zvyujLa5"/+<HH97.*6+4+): *585*)+%&I9/.'CZ]K:$:~o&+n…4*DLP5BCK;3)$235]`&+IOul:.1/1/)/)=TT=zjCE6*#-7HhŸ—™…K‹b"aZqÉýþöþûþù÷ÿþþádKUÄóýýüüüüüüüüùøøöôöýꂐÍÈÁÃÄÉä×»¸¿—6'Gg@2Ko‹¨Ä'p`RQ´üûøüÙB5§ŸH$ 6+/5* %) #*,Cp2@;2F6IZZW; + srsuvvvu|uvvwzsb|c5A(,22>uf-48"*"39*('%3&#%I&&-*<jK#!(8A!.:'44)iJI¨3)84G;X2@+0I79@HZ^iG/).#39%:7?+4>-{;1#<3E$*n‡H?"Ÿ¡ƒX‰GA­Öûþùýýúûýøþþà¥NAGM\Ëõüýüüüüüüüüúú÷øóõþÓqÌɾ½½ÀÒÎÀ³¶£51‡m_SHE:[˜¬¨‹f©ýþýüþýî®a@{¡e('!(JlA +/4"b-_SJcP0+"&!3+#@f( &# + + sttvwwvvwy{v{mTWJ-4-118E[d=*!$'&%3=%$$'7.$LA(.#R‰^"/?$$6M`"ž},%o•am762<'5+7,>OC4-12.0")`e40!$;zƒ_9:xBm[@™šg|"¢™MAK}Ùúüþûøþýüûúÿæ†MLRPUM`Øýýúüüüüüüüüûúôøô÷þ¯s™ÐÑÅû¿ÊÎŵ±¨46Œ'gp_U[]M>;O|­ÖüýþøýþúüýåÁA=,"(=coI #B>$*( 315aT,AE€‰.!!1=?& + + stvvwvvvzz~|v];50,:=+&:@AOP1:'$! ! ,'**0+'I?_75^Q6&$"Nwz{—b8<clL...9H"3>6.,$=4&63'^s=>†b2#&mJICg]ŒdR+'JolŠlŒŽZžÅúýýýüúþþúûùÿö{5J\RXLBræùúþüüüüüüüüúúóøõøþ"m™ÏÞÖÏ¿ÅÎÓÈ¿¸¯73uvbe]YWdbST;.Pƒ¾ïþûýþüöäëÙ¹—M+A$3#$! -&.0$0Bb‹šL +(<G#*2 9 +rtuvwvwx{wz~|]1+D*>:$J:.F?$7BA$'+"""+7H44./'73EI8Xa'&13'>?%*McN]dg$RWM->*)/11637%%/*"#+.G0NP|…\0If0wqv‡PH;)<n|lUl¦âþûýööûüúþýýýýúÚMEXZPLLAxðüøùüüüüüüüüúû÷ùõøün˜ÊìðæÑÜåéÛË»¬81r~`[\_XZ`YOVO2 %+H‡ÁëüüûïÖÜùûè²f7 (q] *3 )32$ƒp1ubD9% + rstuvvxxzxywtC''!./-<YDB',N0&0) &%'/1CDV4&%>1'2Z479"#'&04QDN\;t-"HW"/3#TMYB0%.@-$e[A;@,##'IeK*6'%GN©|tuI:?7KRYPNrÅùýüýùüÿûýþüèðñûÿÅ=ISQNJICèöÿþüüüüüüüüüûùøöùõml‡¬æûößíýþô×Á±>/o|faYWST^[M\Z->{iE57Lr»ðõôãðñøüýæ¨6ZP3! *,*#"i*Q& ) + qrsuuvxxzz~v{yL$!<3)790!??O]S&,#FA53#5:5I/:,,$7Wc1#8C3*! /+O:GpA GLDF748/,%0+#ZC61NTxxƒU$:;9SK$I`a'' 7I9a"Z5:0:4/b³úþþúüùþùúüûë̽àç÷þ¤ESSJIDIHŒôúýúüüüüüüüüþù÷÷ùûìYV_u¿êí×éøúüß³>/nxe]VVLUYSPMJ/O¥os]KQ86HnŸÀøø÷ÿûýýÅB&<10$0$)$ ,>+ +" ruurtutyx}y'z|v.IB/320>@UGH9H4.(!TN0p72VU:.9/5";(0(""-2*+ )"!<QH%.!*C?+4Y>ZG<=:\mM5 $?<@*5VVu<6-+>N:F$!J¬üÿýýýþûùþýóúáÇÍÈìâ÷ù†CWRIFHI?£óöûýúüüûþþûüýüùùõúëBBK@O|¡ÀÒåííÛʵA/oxcdVURSU[MRK/?‰`ZSTOU[@-'+^©ÛôþûîüŸ + (% ( "# :73 ,!rttsvuswxx||vXTC75582 8ORUB0$ )45;C7G_4*'7J9(?,,%$$.#(/!*&"!2En9#&*,')/5A`=[?=6,8U5*+%%+ .!)3•~$%_A"/)9Zƒm©óýþûüúøýüþ÷ãÐêà×ÏÌëâûö{I^WFOOXUŸéûÿþþúûýýþþþúþýþÿúÉ888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4,$%+GgŠ±Ò×Õ±?.gnaqh[RYYYSSI4;zWVQQJQ_PHE4!"4\'ßïýóE-4"# '(- "Q( +'ssrtusvx~wvqoL8394=AO5FoSI7*#$( +AS! $0;$& "5?0$7>'" !#.: 55#.C>"2"05,-#S;4E3,&/9(261,+"6++Y>"%\{NH1Oo¾óþüü÷ûþýúýûþäÇÛëÓÏÅÑïäþìmUhcLPGFP–ÝûüøýøüøÙÃÅÊÏÒÉÇØõބU2*.'$#$:]'£<'sriƒ…qalxyZUM7Dw_[QMHN[TBTR(5tsKKjàÁY*2!.6& /,+'+Zj}1)&) *# 8:rrqssry{riXFMK+4$0>2A\i566B"&I7BI&%&;HE0"#5CBB617#''!'%!8L30ZPD9"#;$!;&.+$)B8-$.*,20%-> ZžnªŒji¨óýÿüûþþýúüýûüýÕÊççÈÇÄÙóâüã_SRMAA@:T­øýÿý÷Ú±Š ÐèæèÔ½±¸²»Ì©€N/+(*)!,0)/U`d€…n]iÇςTP39s\YQNIJQLAE?'`º¼«§‰_Qy•k^*=B)JC@Idœ°',5$8! -0prptqs}{^YS`jQ.*)";bL%)/*0,B+9?Fss\=!$R]B<!&$*;1BW- !. 2?,3?4H0;=G"(#*+,"67FOh;%%4WU/$n"Em·çþýýõûþùüüûûþúþöÃÓâÝÉÆÄ×íãü×I<>8<D@e¶üþòÛ¥csšÏñðâÚÖÑÜíóýÚ»‹x²¶œg=+#%"$&//?E@LYZZfm€fQO< 9pa]VNEENNF@?/Y˜¦¿ÂÀÄȐypk+ *$!&/C +*$8 + =N)pqotqs|qBDXZbO-JB8E\//4""$38>\bg2>_;/9GA07-)2:!.-QTK" 9#3J&$(&1" ).5#370<..,('&'',-UHZX?66<…Îþýüýùÿùøýýùþüþûýá´ÏÞÓÉÆÆÙæìýÔQ8DCWq—Ìøò½zc\ ËÜÀ¥£®¶º¿¾ª'ž²Óñཔ"ˆŽ—›"]8($%$./% )4<ETTYjY14rb\ZVNQVRLEE(I—­¹¹Á½áØ®ª."-#""*:)'&& L D2G'qpntruv_E?C24A:KbGgO0w\7UgY6#7EAS]WWcu\;9:-(.K7*R?YaX6K7DLP%! *,&%53!#*3%#*.)!###)B;d'j$eÔúþûóþýùúýþ÷ùþüúúýýɶÏ×ÉÄËÇàÜòÿÐwIZ{«ËØÓªZJƒÆàͧ¦Ññþþÿþÿýëݽ'‡ÆëîÖ©vk‹¨­•rK5"%& #&3Bjo>2rcdnkZ[b^QGD/MŽ¤¹²´µÏÕ©´¾>"4%6<)'#!& JA9!9HC!rqnuvvqOFP6/8+%,5W}ngg<*b{u?;-0A_V5DE}[%&I7><'$%9-SJT/,XS,#9K&$&;#(&?5*@<=00'&37(")%/:Lm9iÈüþùúüüùùÿþ÷ýûÿøýþûþø´¸ÌÛÌÃɸÕÌôøϵ"¯ÖݽyBc§Ýܲ'³åÿýüÿûûýüüÃ µÃ²Ã¾Ã½Ã¬Ã–·£"¤ÔëíÌ¢~f~™ª"i>$ "" #(.44dak|oUg"°|PD2Cˆ®¸¯¬²¾Ç·¢®G"%.!!&) + )OOPO06- ANossrsscQ2YYcY5@"?]LKd€Z6$5L9+'.1Kx\$,<22('121"+,D1#/[N58@41)y"!:+ ! (; 6!$'#3;`rm{5*2656*!q¦ûüüüüüüüüüüüüüüüüþüùþô¸ÁÍØÃÁ³¬Êû÷ÆÂÛاiRyºÚÅ¥' Éîõûüüýýüûü÷øöòø÷ûýýõðȯª²ÂÚñⳏ}{ˆ—•zV5# " )/2FDR^[T]|˜ƒLC/D…§Ã·®­¶Å¶¦³g2(&3B5++) '3 *,\‡b&83 ++E pstrtxri_xgfm`Y6TZTnYFA5GiB#"+!1enz[^I-**&"3'-JG€™.>N%g:*A3(-),<;1B*!*%+.)J8$ !.w"\(D:0*&U—÷ÿüüüüüüüüüüüüüüüüüöÿþþì¶Ãѹ§ˆiâüûç×£[PŒÓß»ˆ®Ùóþõúüüûüûúûûöøöñ÷ùöÕìúüúþûïÏ©¥ºÕìñ䩀y'˜‡dC+"#(.71)(4??GWTKR2>£Ïȹ³¿É¿¬²œ=A 8A,$! + $- UJ&))$ + +qsssrvxw{zhrycLE€ugSLTD]†9Mtf3K:Ik…‡U*/+IJ9+5RBY'9o.coK;?7 FD:..3$I5*"!#5*0<,'%9SsG31-C1F^Œíþüøÿüüüüüüüüüüüüüüüüþ÷ûþ檰¼ŠzYMˆâýù·`u±âÏ¡€›Éïýþþùüýýûûûûúûùõøöðõü¸DFl˜ÊñûûþþöåÔ¯¯Ü÷îÔª}cs'«—`>1$(//@Xd9=¡ÝéÚÑàåÛµ©¯H+M9&' # + + #.)?!"% qstsrstvvtpxz}q~…K+&'Jm~ƒŽq"z4V[9/L`\>&h[R3?r86PG0S}oH"!"6LR#*+E@E‰l1"!!/E254L33808-#*Œìÿÿúþÿùüüüüüüüüüüüüüüüüþþùû䲎nUe²ñó«u^…ÃÝ™ªÝíýþöùþþýýûûûüüûû÷ô÷öðóý~")$)Im›¾æýýýýùàƼÃËÜê趕"œ•ŽzO'".9.;s‹ØõåÔïûûÒ¯šA+8 # +.D )A5 ( + sruuwuwwyxywt…}~r:bV=x"ƒvr'™N3M9AY@/,5.8HbmKDŽjKuMJTbi9RU%6'"',F:!&/(EZ@-,"/(!"7.<T?C'%.TÅÿþ÷ýûùüýüüüüüüüüüüüüüüüüøÿþþߞhR¿ÌÆ¢]Z™Ô×»ŒŒ½ëýùþýúûþþúýûúûüüûúúõóööïñþt('' CvªÓîûýþý÷áÀ±ºÚéðæ³yoy˜‹mF("05KZ¦Ú×ÕëôúÙ¸‹s!=;). + + 5UU + uuuvwwxxyt|y|xyƒ\~s]kƒ˜~'™Š‡mgF2?>787UiML_OZ|w)PH~,gKhR(44&R/ 55*O!)\+>GO3:C#0NxM"P5)$+-@O$A²ùþûü÷ûþþùûüüüüüüüüüüüüüüüüþùüþÒ²®»Õ³wPnºÝʖŒ£Õøþûúùüúúýúùýýûûüüûùøøõôõõïïþ%+$#!!&Fj¡ÒùþþýøóÚÒ»¾ßóåʚƒm|—J*"),6+@h†¦ÌÚäÔÀ€­$(.6$ 4: + '#Sj uvuttwwux||zyy~D=QMP\~‹z€i[dU€xQZDTB1:jbjRG^ZHY41~LB!=xL%0 :}TN?,;*)<3LDs^?)@\6$&%04Hìþÿûÿ÷ýþüøûþüüüüüüüüüüüüüüüüùûþøÎÎÁ§ta…ÂÚ¼——»ßýþûûþþÿýûýÿýúýýûûýýúøø÷õöôõðîý¥ 1* .Oz°Þ÷þýþûåÔÈÃÍçêϟ'z}ƒoJ)%0%&4Sw›·Ãˆ»‡ /%,1%!!%5VjB + #6;-V; + ruwvvyyzz'{|‰}s)Hs{bpep'ZPcNXWYkXX`1'9ND<-Ls;>"QG,s27[%&$&hƒFN.3$#!##HngŠ2$-9,&/1!7‡Þÿþþøþúþÿ÷üýûüüüüüüüüüüüüüüüüüýÿÿýÑ¡iYÒÚ¯˜ËöýþùöþýùüúüýûúýþûüûûýýûúûöõöôôðíüÀ2I4!&(V"Åãýþþþñæ¾½Ïåìà°un¤…[:$+OlOªâ*!&#+"([|\L# + $%4D' % +quwuxz}z~''…~'ƒHRyoJIfdm`O\TXhY^M.LEA2#442I^29GNEDcY72.$ $6&&4,"-7'7(*.JB\C6}qTLNB@/]ÒùþúûýþýüüüüüüüüûýüúüüüþýýûûüüüýþýݎZ{¸ÜÁ›‹­àûýýüüüüüüüüüüüüüüüüüüüüüûùøúöõôóôêú×2.1#"$! "<a¨öýúþÿúñÚË»Ííàͧ|lŒ¨—Z3.3ûn+J0,E=JG=*)! + +$,(<*) + uxzyvvz|"ƒ…{ˆ…†]<.HP>M^F4<Ifr\0A4+-)#*RG(=>L8VE6Xc<0#.*)<5) "%:.†\LW*$`y~špGE/NHW¬öûþûúþýûûüüüüüüüüüüþÿþýüúýöüÿûþýùÃ~_…ÀÔ·˜—»çýþùõ÷üüüüüüüüüüüüüüüüüüüüüûùøöóôõõöìúå@)+ PÅþúüùûþþ÷ÜÌÍÓÞå˞ŠˆˆoE,&+*dþÐ '5!%50'6)"'K -* + % + vuwxz~|}'€…xqovg{tG.#*o6'2"9Uf•{^20# !>R8/!566miben†H.E>)61,6.9*>[6%&4p‹PStg_6D¦ÿüþþþùýþüýþüüüüüüüüþ÷úþúþÿûþýþýýîµtQÑÕ¨Œ£Îûþþùøýþýüüüüüüüüüüüüüüüüüüüüüûùøöõõ÷ööêõõV #*//,ÄþúþöÜìûûýúïξÌàç⻃l…Ÿœƒo9Qóýk%./)R*1 ;4 1<( + + 8tvyzz""…ƒ•"|rw|kF2P^R<+(TSK3%7;BP$25'#&! !)">C/!O¢tW|…B!-4!!;2+ #'+GM&<).Y)1LWFNeˆ{8E‡âÿþúýöûÿþúúýýüüüüüüüüþþüûûøùÿýüýç™Zo«×¹•'¹çûþ÷ùûýûùùûüüüüüüüüüüüüüüüüüüüüüûùø÷ööøöõëñüp 'XüýþÎAFj¡ãúýýùìâÓ¼ÈäèÊ£"Š®¼©öüÀ+',A A=- + J043 % sx~'ƒŽwrxswvztdNRbwM+-%!P[-!()-K83'"#/QB+ &%$" :]7?w'P=BN71-#&(?077-'O!#)O[.Te'o}áøþþõÿúýýýúøþÿúüüüüüüüüúûÿþùÿþúûЏ^r¼×´‰¤Çêþÿøøÿûúýþûûÿüüüüüüüüüüüüüüüüüüüüüûùøõõô÷õ÷îðü‹"¹ýùÐ/_‰¿îýýýøÝÉÄÍÕàÛÁ¥'‹«Þ{!& $ , +$# 4669"5 + )- tz}{qzpsl^_]\maUdjj_;%=B#59!-7*ML2& 3)3;&#-#,VUX;)VZuŠ~•VSc!"!:G'(8 )+&1*?7Cdw{"µýüþü÷üúþýùûûüþüþüüüüüüüüûýþúúýñÍ}`"ÒיœÝ÷þþ÷öüýýüûûýýüúüüüüüüüüüüüüüüüüüüüüüûùøö÷ô÷ôöïíû§% cþÿíF*%&A~´áûúþûæɱºÑççɤ4'*Ju/ *.X] + " LJv{~qOQ]}_ZdWVVWcWmU,2,-/-*'-6 0-%500be+.)% !BQI+%AiŒKJmT $((2(<7*(3<?Oz{gq¤ðýøÿúøÿÿøúúùþþüùõýüüüüüüüüþþûýð¨jf¬ÏĔ»çüûÿüúþÿÿ÷øüýüûüýýüüüüüüüüüüüüüüüüüüüüüûùø÷ùõ÷ôöîéû½"$Féþõ†!(#""& 4S˜ÓúýýúíÙ¶›©ÝäÓb!p–6 ;/ + ,yvzwYPLjmd_t_Vkd`NC:* +-6D83 #+#7$,35 k€1X=$.9[&#(.'+' $5D.6; 59#"OFEA?>lf˜Üÿÿùþúþþúøþüûûüøüÿúÿüüüüüüüüýþّg|­Ð¯›ŸËöþüþúúøþüøýüýüüþýûûþüüüüüüüüüüüüüüüüüüüüüûùøô÷ôøõ÷ðéûÈ"#%¸üþÊ$#-N·çþýþòÏ­¡°¸/$! nŠN $ + &).. - + |~ytaZOMhnŽ‰"q|†mcC!"" &C><,,.>$"'->K1$mgWr74%3D!#/5&=pxkb66>\S+@4?{JX^nÇþþüüùûûûûûûûûüüüûûüýüþýùúþþúý΃\‹ÊϨ‡ªÛþþùýýùüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüüüûù÷õõóóö÷òíùÞ4&!lþ÷ùZ'# 3t±èøýýûÑ|^!8]‰€- 7 +LUSC%0T z|yscVVgv}"''wi}|m.%!??D!$"2Pd7I %M4=A#888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4NM'( &'"32<B^W3aleF"cY >()IÄðÿü÷ÿþûûûûûûûûûüøýþùüÿøûøÿÿý÷»cg¦Ð¸‹Œ¾íøþþúúûûýüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüüüûù÷öõôôööòëùä8$#,Ýûý*,dÇûþý헄aHsDv%"Z' Dq L%"L? + #zwrmsoifrzga'€gnOY_II,,3+,=42D;*&.1<?N0 ,;6\3,5e^@*'(3#<8)6:;Y_|dci1*V@ŠÞúþùøýüúûûûûûûûûûûþúúÿý÷þûÿýé©my±É§œËóÿüþú÷ûþûúþüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüüüûù÷öõõõööñêùë@ $±ÿþÍ& ›üÿýÀ[9 M|LNNo": + 3G"$<W ,;*}}€zƒ|tfsmcsv]_E\q9/A)5=<:9[i7E-4-'?4+5>IA8G`L,*' .ZeH>DB #;J;s'†U%*Üýüþùøÿý÷ùùûûûûûüüüøýþüûûüþþä¥fpºÍ˜€¤Ùýþ÷öþûüüüúùùûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüüüûù÷öôõöööòêöòL$yþúóN!£ûÿêPD# /R16%B…O X!1<* +#R( ,1 "thrjnyUjogVhbJFSQ6# 3AB2'0WwOG.7!3-10ltgE1,3iv`(6YdwkomRaO.G-WMbv†w9N¼þøý÷üþþüóûùûûûûûüüüüÿ÷ýÿúýýá‰e…ȼ†Œ¹íùþúùÿþøüüüûýÿÿýüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüüüûù÷õóôöö÷óêôö\#Eô÷þ' &ØüþÈ.%$Rji%! + + 3) )< % jlWLeiiy`^e{urmhG0N5#1II7ocQ8S?)TS5%&FOuH$#+F(Sk8U]0mW_Œk"d3jRLM†Unàþùþ÷þ÷ñïùúýöûûûûüüüýýüþûýü̋o™º±Ž˜Éñþüüüûúùûüþûüÿýúù÷üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüüüûù÷õòôöõ÷ôëóøo" %$ !ÌþþÊ Pþûþx1' 4pwU+$0.'%%.@& Qb^\hpim][Vfzwh7/2%#!JKfA?>+4NIY\?#$<+;%"hƒ~K,T'^†w·t¨enf‡iÃúþøþüíÎÖáû÷üúúûûûüüýýý÷ýýԅbÎ¦ˆžÞþþúúûúüÿþûûþþûüýø÷üÿüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüüüûù÷÷òôöôöôêôø$!!"%'&!ˆýùëB Æÿûï; " EYC3#i_ +: + ojefYbhmv{qq{pQ/,<9*7KRC_@*&D56Q?N8&.7"" /5O7ƒ¨—ˆ:G…sfq=QWLdˆ…|¥œxðþûþìÜÍÆâêýøøüýûûûüüýýýýÈtj«¾—'ºçýøúýüþüüüûüýýüüûýýüÿÿøüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüüüûù÷øóõöóõôêõúŒ!&% &(`ýøýeVøûý $ +<[N +* + + +wcYRTVi{j`fhkVk714+"-4ABMDD)-L8aDKRK72;5F,%@AI(DbIƒy‹t'›"sMI9.'Edt}q€w5¸ýýüëÎËÉÒåìûüüùÿüûüýûüø»p€£³ž–¾íýûúüýüüýüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûùø÷ôøòôõõíñù #)&!'*)$3îÿú¤!¶üûÎM#9C4( + , ika\ZM^kbVIIU\qO;B##.;':?3B6Sh]7/=&6G$3/-#;,=%A=WCUpd†‡›'92NwugV'¦m<}þ÷óúÕÈÏÀÑèîýýùüöúýüüûºtk»²'"Ìùýüýûûýýûûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûùøòæøùøú÷òðû¦ 0*"!" ÓúþÏ9)$ fþéᆠ))DF ' #vhYLZNC[e`QBMU[ABG3)&B+57Z;,bcIB=8,#$7:/I4,&3t†Z*aymHYv{p/Dr[E94'"p_×Ïr"éÐÃÄÄÚáóÿúöÿúÿûøÃuo¬¼‹šÓýýøþûýüüýüûúûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûùøæÓïõóøöõêüº*;,²ÿþôV##ÄôîÎ4#+ %WF+*' + + -ms\Ibeai[Sgq…psumC/;"+<5DP3]KRH46,Z;++#&$B-;›"‹‡zw…tfkk\'@2>[MCQd'T@¬ôÂÆÃÄâçøøÿùùýï¦{…¬¤•±àüýöúýûþûüüüüûûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûùøûíûúöôóòëûÆ%,'ÿûþn!## Iúüý¯ .(H8%*-6* 4Amv{orqqojgvgi\`cergb)7(OQ(6:XCIR?A@8.+7-_U[§ªw—'£¦š™u;ID*1(Tˆv€€pxEIFNÃí¸Â¶ÀÝãøûþüòµm'·¦Š³ïýúøúýûùûýùúüüüüüýüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûùøõôõóõòøõðøÏ(!I÷ùþ•%Õýýþ^./%+&/& #nVs€}rh_a`ROUV[WwqjKYHD>;/TJ;/5)9:H #@=8,,d‹yƒ'¨~{ŸŒS2#.'z‡¡¤g_O_YG=\Õçµ¼±¾·Ðøýó¯o'±"–Çõøü þþüÿþúþþñ÷úüüûüýýüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûùøóúõñ÷ôúôóôÛ7$'('áýú¿"~þûúÅ"3!1!&9" C4 A'ycgrzzs[PHCS]J<R`Yb`,;U43MqJFP7-9XbJ'LT8#4dn"¢ ™––ŒsF_N=Pzƒ[ˆ‡h5W'AB;màằ‹w'íò­~‹§ šÄõùûþüæ÷ûùùüóìõ÷ûýüûûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûùøõö÷òöôøðóôã=%('¿ÿøÝ/ )éþûþQ5I<YQ!:*^C! "#3ˆ}{jlcWcObS:UZTSYZSs`87'IZaCw5>%!;d}h9CINRHFS]I\ƒ§¦ƒ˜v}cy~\Ž"šv‹©].§ˆ<@9{ìחlTbëg'´œ'ÆûøûýûøöÇûüúñíöùò÷ûþüúûûûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûùÃ ¸ÃºÃ°Ã¸Ã´Ã³ÃµÃ·Ã¯ÃªÃ·Ã²L!#!&žýùñQ'& £þýüá–#!$%(*"#I-aP0 + 6{peVe{jksRxŠvwirqkƒˆ^0/@/kg3Q/<E#*GcmPilNOQqjTCBK{˜™iovž‹–¨™'iyëiKC>÷ÊTf†n•£‹•ÕïüùúüøûûÎÑøìïúõìîöüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüûûüýüüûýýüûúûýýüýûúüýýüûúýýúúúñôø÷ôõõñäû÷q&! ! 'üôýpWýùÿû~( !"')Z-G5( Thq\au"YFKc…rjn€ŠŠ†"c][XKhaQ@)UVN1AoV:RPSH/xueG$Ino|rxš¢Ÿ———yŽÄóäVW:?èÎ¥'zŽ™˜ÍùýöúýüûþýÚÄëòøùðìõúöüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüûýýþþüûüýùýøüþýþýþþþùõóóñûõîïøüøóîôù¯!"/#!púòý– )Öþûø£ & &2/"*0" +3( RtlWnlY:<Bvorwlco‹nikZb't`_ij>XPLIOs`AOL]d|Ž'lS Pbj«"n«zi…'—'z}éýúÄ>6+5·â›yŠ¬'•×ûûùýûýúýûüÓºëþõèèùûêåñüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûüýýýüüûüûüþüúúúþþõýýûøðãÝÕÎÊËÕâûòãÞåèéîîñüú‰+)))&!"""Qöõþº!ŠýúþóV 73'((!/$ #& (#" ŒyI7TL>61^~`i|ufugeXEI`n9K_I=2.Z0W^OfCXˆŽŒw"}Vl¦{™Ì̓¬¡Š"q–Ìþøóø·(7Z˜™vœžˆ¨ÖôýöýþúþýûùóÆ£Ãóã÷üòæêöûýüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûüüüüüüüýúúüûûýýúþýûçÊÁ½©™''''£ÁãÔ¹¨¨¨²ÆÍØÖç÷¯m>*!!!$9ïùûÏ"#(Dõþ÷ÿ§4% $( !ioc0 +.… 9kVOUJ9C@Sv†pofih^[^fZONaK1=5<?G1<J<W_Œv‹…t…''š²Âž¶·'¯›¯–~'ˆŠ˜ÎüøüùøÇz''…"–Ú÷ýýýüîÐÈ×Öèùҝ¬ÕðúííòúøêêüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüüûûüüýþúûüûþþüõÞÔÀŸ‰~{ukp{†›Àá˪–~qty™£®ÊÚÙÈ©ŠiU@''" $*Úúôá1"ÙýöÿÛ!!* 3{|4 ( +\ž * + < +QVOF84RhUKggjRTISEK`kocgWP8;[VXL4d<yfm‡žŽap‰s{ž"¯švx›–ŒƒŸªØúøöýò÷ƍxª…£ÝüîïðëËÄ­¬¾½Ú¹eçùòçîúöçç÷þùüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüýüûûüýüüûüýüúøîඛ'{a_drst|"ž¿àƦ–†{|osvtq–®ÆÌÔ×Ê«"hA4&"²ý÷ð?¥üûý÷R .(ES^6/! +2ˆ‡*EB& 33(M/ ]]A9CGWjYM[UA?@L^9;NNo€m=AEYHH``0XBWIV^e{eYlfŠ`"}Š£›ªš‹{¥œ"™±ïüùúýî¼z"œ‡¡àõø÷¼§Ÿ¢ ¡§¨ªµ'ZHB²íëñúðæé÷ùóöÿüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûüþþüùýý÷æϼ¦Œtgc`cffnqs{y~Šœ¼×¨š'xtix…susqut~…Ž¤ÁÕÙÛÁ«'f?)þù÷Q nýþöý'!,$!')9–dBŸ&>…d ;W<1bLH[UZu{~rkNSURdAA.)4TkoDljPSLJXU6]F5_LgtqfVirO}¤£žˆ™‰o'™"Ýü÷ûû»†"'"˜Ò÷ùþú¼ ›¥¢££ 'xoIRRQÎûòòèîöúíáëúýüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüúûýÿÿû÷ÙϽ¡†zkUcga`hcalpnwy~†—½Ôº¡"Œ"|xdi~tqszyˆ}snkmy‡Ÿ¥¿ÔØÖ¿™{]=)}þóûc41õùýþË(JN +!-FC*$!D05¦•4:I>)M.7%iLQUb~‡p…wXLfoz|aaGIeFMQmXY\b^KfGL9Xm|nT?4Tks~©ŒsdT}"p_Ša»÷üøن~žŠÖñ÷÷üüÞ Ÿž§«œ¥mK[XZ"Eyôòäóùõçáñùÿýúüüüüüüüüûüýüûûüýþùþüùþýúúüý÷üüÿûþüýúòæƟqbachiccdecbejopsy'‰˜¹Ï¸ 'ˆ|vfYyryqr|𒙤‰ˆyuqmmu† ºÏ×Øß¿™oN0$ °ûôüŽ5 Ìþûýî<#CH"$'.H-%@<)",)gp2D™H+ ;%FkhjipeUJQ|fkrkro‡Š}gM=HC^\q\Ds{YoN;Draqž©iU9v'ŠŠ{"taQ[dbx`äû嘀šŸÏîúóüþüõ¸—§©›|o~LH^bpma¸îõúòãëøûòâìúþüüüüüüüüüüýüûûüýûûûþþøùýû÷üþûûüûùú⽯–y"aekgldddbbb`aejpsqr†–¸Ïµž‰'xxgp"utut{ü§©ê㷳܉–mpnao}~™µÏâáÓ¿šnU‹óý÷úÍ'!$£ýþþùj"' "-)3f?.!'" + @rryxsfcWesk"›qrƒ}vyb<WSGYƒ€uxOIT?oQ'^r¥¦vKHuz…œ'†~sRKhy‹Ûø°ˆ"Ž‡ÅõøõüþùÃ »Ã¼Ã•ÂÂ Â›Â…iE^iFSiNXL}ûõææéù÷ìàæñþýõüüüüüüüüüüüüûûüýýþúúýýúûþýüúûýîÝÔ¬‹~'ªÐú dgj^ebgdcdeedeigprr~†—¼Å°Ÿ'"xrweg'vpvt{ü³¥ûöÅÉ̉Ýފ¯t£voygnnƒ–¤±ÙßãüüõðþþŠsüûúþ¹! 03$!!),=?I07%2 '@, ++q{jcr`Zh^jxoxŽ'|ˆ†xW:5EW54s{cwLKaL"Bn[ht"Qi}‹…|r€okŽ‹e¢Ù—'˜Íòûúúûøüüõ鬔‡sqGFjSE]lDLGwìâóýñéÜðûøíöüÿüüüüüüüüýüüûûüüýüúýüüÿûûýýôöëȬž'­s"õ˚q^bhdfgbeddffegimnnp}‰˜³Å° ''xrumIuzutr}é½ üûÿ¨lÑӟԣc¾Š|piskqu—ªÄÑÐæöù Q0" +OýüùÿõA! "'*%"*$,25>+/-V9 %SN xen|ukyzj'Œd\wtmbpkLLkE;@!Kpo~Mƒ}kx8{R]9:emT"'bHVsq†"ŠƒT^¥›v"Ïôüúú÷øýý÷éò½—ˆ\uµ]F]GIeOV^C—ú÷îáçøýõáßéüþûüüüüüüüüýüüûüüüüýúûþüúýýòåȸ–u•qšîõ›§ºaWfmhfefkcdbabcdhlkgkqx‡›²½«œŽ€yssj:`qrnnƒøٝñûÁ¾êœÆå Ï¨Õ͔û—¼È™pz"u|lnuz}Ž¥Êðëߺ nG#4óÿûûþ "#>eM$/0$!!%>Q +'mp{wumr~yikh`q]M\NA@U?QCwUPcwX]bcƒ@"nj1dr``q‡n`P Œv™'YBrŠ‹¼ÅÙý÷úøüüóììïꨈdj²îxCKNPoE‡uF·êåíùöëßåíýþýùÿüüüüüüüüüüûüüýüûúþüÿüîåϨ'~ž}gǀՏ§™°¶€•dffdbdd]aacefefipilqv~‹ –•Œ}trsvauotrr‹ÜʞÙì̳ׄÊùžÍ£Ê'þšÆñ©hxæÌNJ¸‡owumy¤»ÔìáÍ®‡a<! Öþýþüº "&%%$"!#%.,C[M,&,1" ++@ ++xl‹"hgw|itmecm}SL^\ZPSOsYc@F46]TyuDRŠŠpŒ…b¡ž\•'nŸ'W|‹ŸÒr#Êýùûúóìêíññ¼•wm½éÕSCMQ\eLŠZRÇúýòéâåøÿÿýùÿüüüüüüüüüüüûüüýýüúûûóáί"– fÛÀjʆßg^h±ôó¾d`cbbdbcabdda]\^TNKSfnr‡"qnpg`bkihtmtvy»¼¸ÌÊܬ±`Ãâ±Â¯Ój"ö¢´ú¹n{çòå©ï©Ò'—{wgffkq"¸ÏÛçæٚsN3Âüüþûä*#! ,<##%+&*FdKsp(8./* + aPt|gSXxnmpsr^\<\oSK]GH6Oc;0?ANrhJipc˜¢¨­®ŒSg©f\gxjg'Ë‹!Tõùøõøíìïëîð³ŒhˆæíµFC^NeJP'‡åüæßãõøþûÿûüûþùüüüüüüüüüüûüýþýüú๘mvÕôÑpÚÒsÇ}ëˑXÀؘvaffdfcaefc^WQMPVAOPP\`u¨Ãv}‡‹‰Œjcjlqoo||"«±±Õ°í­¹êµ¿œà­šó°ýÄsxÝû꟬lÌޘɘ鈉•qqhdfo'›©Ýçîàáo=! Åýúüÿý_/($(" '2 !"69IO:(&_M$ +_mXiUEckGJPvy[BibUlZF>ILD=u¢g<7?S‹TŒ€''Œ•¡"€}Šlw|†~˜œ­K,E¤öûøùòìïëðìؖrq'Þó˜GJrIdb'—ÓçåêöþýûüþùþüýùýûûúüûüúþúüüûýíàÖ­…ÀÎ{£Ã˜çtÙ߄¾nÜôò~ǏP`ff_bge`YSLTR]a‰p70'$15LcqaMB*4]±–|}lpqpolptw…†¹­¬Ð·ÄŸÖæ­çÏ«üÔr{ÒýìÜž»Ñ£Ëªé©¯×˜­dl‡Škd`l{¦¼Ýïäϧ‡bI}ýüûüþû"(1' +#%% )/Y4G1"$! + MWLXN@A>9;JS[dmc96[]M9GTe' wO'b[N?¢Ÿœ˜™}ev~u`Fc~E˜!EJbìûðûøïçìíïïӍaU¶ëœaJ]zeŸ¢­Ûö÷úþþúúüþûùýþüýûüÿúýþóüýûöí죀©§kÙ×ä'È'lބǧ¸_f¤à˜¿}hl_fd_ZRRRRp}‡'°d++,,>Jaw…mYP5+@·Í¼Ã­¢•Šƒ}tsmmrlnooƒ'›Ž½Þ£ÇÍ·òÖtyÎïèé¤±Û§Á±ÉŒªô—±pkÁí‹Î—†umaf`q'¼Ôèíöúýýüûûü¶)9,'1%68"$? +O +GLONIK?131EIQPl_UMBCEA^—¨˜£™ikD`ŠnLŒ¤¡œ—™˜ˆ`Z9IŠrg€o:KZAøøûùøìæíïæé¾uV['ÌWgQ™˜Ÿ›¢ßÿüýþþûùúüýÿøüüúüúüúùüûúúáÌřŠ¨€­îî}¿iôÇilׇ²¦×±uyLĒŰÕÉ_VIO^frzŽ›"š¸Ñër(/92?Ocz}mVG57AÑñ×âÜÕÅÅÑʹ­"zpqkejqgmy|ƒ §ÑÍvm¾Ø̗¶_ºÜ¦º®¼c¡ïÀdg¬Ù Ú•ÖɓÂ}Šghaetƒ¸ÒîîðøýÚ#$ + A^ + MCLH@A<0*FA7JV\HJcA>P=!Ce{ œ?@P5+™‰=iˆ–Š}" "…^xk…+DOQDCÍô÷ùõìêêåæîô£Zzpbna"˜›œœ™" ÷þúúúùúýýûúÿýýýÿúûûûûôæÕ¬—pªñã"Ì}­~½eȱ¶\xϕ¶'롳ž‰ÚuÝß'UYe‹"¢¸ÆÏéþþûe-;I:ASg~ŒƒcM;@@ÒýîýýüîäáÞßßÕÌ¿¯±¤—ƒ{lrpmrcln{tx¨²¼œÏ£´òµÊ¯Ñ‰¨õ›¹|f¥ç"²oÖÀŸô¹éœš"yb[]qz¤Áàã. + + I\ [?97;6;:9L:QSF17QhM29)3dA0Qd]XekJZxSPc…—˜"n†Ÿšw@‰F>FHE>tíïúóùøåçìëéä‰_'vr‡œ™–—"'˜¥ùúùûûùúýýúþüýùûþüýùîÕ¶¢ƒ"ÈށۚkÄ]`'½ Ä§­Z‰Â£§nò˜"ôå¡J†a\s™¨®³Ïì÷üþýúùö]0>J=FUfy¬˜jY=2<ÕþìýûþþþüüûóìíßÐ××ÕÏÀ¨Ÿ"‹€zllcqsrqh€v·Í¥ñ¤Â­ÜÞ¯öŸµkf¥ù'Ù³¶¾'ÙÂήÉιãŽÇ~ffd^Zm£M , 3V O?88TY_PB<8p_NEdPQaC<"9B/-3,'d["bFs"E8Rz•šŠ[l'nQ|l9DVWXL¸öõùùïáêïãä÷äun–•'"–ž¡ÁÁ¡òþ÷ûüûùúûûú÷þýþùæÑĝ~uhnÂÇÒ§Ã_[óڂ–òå|ŸÃF³£µ¬[ݏLƒ|cox"¤š¸Óçôùýþú÷ûøøþõU-6:9HQ^hmiT\H2C×ÿëýüýùúúùùùøúú÷ôïííæåÕÆÅÈȬ¢'}nsm`jbrp‡w˜ºÔ¬Ð¬¸‰i–塹||̍î·Í¿½ßºìŸÖ…ghhhvfe9 + +5?(!? + E<KH^lwX6A>B<^gdSI[,?;ChJ-Ke_s}lLYtgaTUˆoYvlbj†~5LEniatåôøòøôçååìíéب•–›Ž˜"–¨æûášìú÷ùûúúúûûúüúëÞº©~yadofrºX¼šÑʤaÁïÄ¡ÂxSšà"ÓwŸ"Hym_t'‹"£¿ÆÔëûüûúúûøû÷ûûúûðN,21:LN_hhl^]O9KØûíþûûýýùøùûû÷ùüüý÷øôþ÷ìëßçàÛ붨¡ƒ}nplifodt{…ŸÃåqâµ¯}¡à·Äo×Å¿ý—͹hhfaNijcK ,3!:X + +mDUE;Hm^=FH=@EL[Q75 5NOuf†7JEŒƒ"GU–"R\{'}\]k'sŸV=Ehn_W—óôùøðäáïèàâðôí¾˜±Žš"›¢Éúúæ™ìýüûùûýýüúïßÀžsrelkcij¸u¸"çҋWW™¶¹›Ohtßå›;ddx~ ¬¬«Ùçúúûûüøúýùùùùúú÷øûðB172=KF^kqo^TM9I×þéûüüúúùýúøúøöøúýúýúøûýùùöùóõïÜÚÞÛÜγ¤¢…sg\bbdehox®¡ºæ£î¾´pÏ¿·ý‹Á¡êªalkEWafY $\ +`XceN:P\\K3MYO\l>B[nM=([RIN'…K-8Bij[3}Wec‹€ŠUd''i8ATgn`_Ñì÷øôïîãÞæóíÜßòøë󜕌çöø÷ùìªìúùûûûûîÞÀ¢"j'ŠnÈjgedgcyßæ|£²U\§f'²À"JNLa€ru¢ž ¹Ðèñûýýúùúúúúúúúúúúùùø÷úðB,979GIcmuoQVM9JÔÿéÿþúþúýûúýöùðù÷õúýúýøÿùûôûúóûüøñðïîëäÛÔȸ½¦Žzvmg^^b^dx‰q«·cÎã¯õ¡¾ËÄxdlnFukl]' + + F +P_`[dgW:BMHRVCATSFWp^RLJ128KLB'2AKTLKYPnakr€q|…‹8BEa\WL{èòóõðìããæåáäîõ÷ùúí»œ'Æûö÷ùôûâôüüúéäÉ­'‰Éƒ_ٌnÅb`cddYÉ̙™[f¼Ìoˆ{SdzˆŠ'¦½ÈÐçýýùúúù÷÷ùûùùùùùùùùúøù÷öúî?)7EBCJdoqmLKG9JÛþéþýûþúüùûûöøûö÷ûôô÷üüýýûýúù÷÷ø÷÷÷øùù÷óðê×ëåàÒÄ´ªœˆsgeb[abYof‰¤"˦ÆÖÍhglOfph]) gJYPEEG?5JPMKbfPMaZRhU?GO0?8/.5?,U^:r—hlw'RRvXeo†O6FPfiYT õóöøóòéãáæñø÷öøôúóð³ªó÷üõõö÷øúðéΪ—eŠy´×´m㍂°\fb_bU§›'ª»Ï‡w¼Xm~…"§¯«Úëøøúûûòûûøøøùúúøøøøøøøøúøø÷öùì<+4HB>NforjHML;IÙüêþýûþúüúüúöøýìûøüýüö÷õûþûüüûúûù÷÷÷øøøøøöïýïøðíñîìß˸¦"‰xhbZ^[_^on˜•ÅÓkilQBbhl5 + s EBDRJEOX<?R^'¡‰t‰…ŠyE:H2Y[EVLkb_ªÏ"…`fXxQKme+EF^a\XaÌóîõòäßÝéíó÷ø÷ö÷øôöú¯ºûôôôöüôê̵Šz¹Õ¥¯n—ÂŒ¬Y_bacX»‰'—ɤlku|– ÀÒéôüüûøøû÷öüøøøùûûúøøøøøøøøøù÷÷ööùê9&6FC>H_myqIUN2JÚûëýýûþûûùúûø÷¿Œ˜¶Øáóöú÷úûùþûùùûýùúúùø÷÷÷ôçùûö€RqžÉëõ÷öæ×Öɲ{yii]U]Xju_loeVhjj> !pLJMVTY^RG:BL^|tvEVpR`Uw‡hX}X.@;Cp›¹ÄŒUFGbRpdPz=AAZd]RVqëìòùóíêïðøúõòõ÷õôñ÷öÁØ÷ùö÷éÕ° '¢×žÆϕ¥©›V] ™œ›U_d`a^§€cuezŠ¤ÁÉ×çüúúöøõù÷öúú÷úùùùø÷ö÷øøøøøøøøøøö÷öõùé8'BCA@Ir›œ"NQT:TÛûîýüüýûûûøú÷ô€SfVtdÒßÁØòüøþþþ÷ùûýþýüûüôïúýñL %9Tu•´ÌãõøóÚÖ¿ª£'yl^\jbdcddiiM, $F! +`g[K[kqcW@.81=<Squ`;fƒz¡d]sz†[RQ‰Ÿ˜‹f=1!GG\[bL3>J^c[_R¥öéõòéïíñôñôùùóñõöùõ÷óøõðáÁ™œq—»•–†±°¸{][®µ€›~dc\ONKmoz†ƒ£©±Ññðúüùú÷û÷÷÷ûûøùù÷ø÷øùøõõö÷øøøøøøøø÷ö÷öõùê9#F@CHE]"ÚÒqQO9RÛüñþüüýûúúüûõÒ]n£Ï¡PCªœDS‡¤°ÑâöøöøûýýüûûôïúüôR'*"&""9g"µÑèõøôìàɯ¤~mabYVWLL; + "!1 + +fg[Rqfba7??]<8.1¢µt9-BcŠYŒ½¢‹}i's"~i_"UrFR~;=G`MRE=5ÇñéôìæîëðòñññòóôõñøóõöåɧgZ²"›M"ššÑ¸¸mj~Ô⇧ÈÉOPUn}ƒ£§¾Ûïûøóûôùùù÷õõüø÷÷ùùöõøôöøøø÷÷÷÷÷÷÷÷÷÷÷öõ÷öõùë;'D<?KMSr•gXM8Räþôþûüüüûøþýú¯]ËÕýê™KŽGLsmCNUïùûüýüüüüöîýýõQ,1"'###<e"¬áûêðèéæͱœ"`OB 7e$ + & "Ezy€…˜cVd1JU€XgcJ8W?dh6.P……¨žx~ŒŒntV1&$\‹Y~\1DJJ7)-NæëëòîíìéðìñóðïòóñõòçѬ‹ŠfZ\eėɗԨ˜wŸ´©¶q©«›v~ƒ 's†œ­ºÕèñùöõöùøô÷õôóõ÷÷ôöõö÷÷÷øöùøöõö÷÷÷ööööööööõõ÷öõùì=%BCAJQQn[\OWI:Rßÿõþûüüüûùý÷ù'Zè÷ýÉQgYNOunU–oE·üüüüüýþþöéüûýR".%!"7âÿþú÷úöñäÙ\('4)}' B6\ +aNvZccym?Xo€|mmw> U…1a"‰[9O'††_[@$1*Y^K†GF@.820xõìíðìíêîíòíóñôòõîÕµ£m˜‰Ÿf\bcʤ¶¤ÔŸi²¤£¬Ç­"lP{s{ª¬¼Ùñø÷öööööööööööööööööøøøø÷÷÷÷öööööõõõô÷ôøñ÷ôøúôûùúøï>'?FABUPie[BNM2XäýüúûüþúöüúüâpdkeêûúÍVMRVOunN°ˆB¤ýýüüüüýýöêüûøW%-:996'"#Äþýüÿùýþþö[&" (]F(*; 4!3@GPb[='m˜D;VbNY{n:8'|Sp«˜|AS'‹œ‰T7 2'lnK,C7/?@=(-§õìíôëëîíïðïôððáʛž[¤ƒ¬¨«^]]ḩ®¢|J¥"±šŠcµwkŽ ¼Ñéîöøøôõø÷÷÷÷÷÷÷÷øøøøøøøøøøøø÷÷÷÷öööõõôôô÷ñï÷øúùøùööìñüîH7`xmlt£Áµ…wuP\èþüüþüùúþü÷öÐ\|Þªxâå¬{II…[psMKMiåýýüüüüýýôçþþú[',6AL^WROE>1' ))Äþýûÿûúúýûh53 JD4?_W + C#`m]K-Pyˆ{`W~†m{}‡m(Bn™¼‡MDJ'yjùÂSV# 6`v‰&@4#,67)5Ù÷éëòéçïéíðëßȪ‡w"Ôq¼"·µ—X_[q󥰕{¶ºn^hkŽ–³È×ãõ÷ðóööõô÷úùùùùùùùùúúúúúúúúùùøø÷÷÷ööõõôóóòòôòöööëßѺ®™Ž¬íðeR•¹…'‰¹ÄÀš"§"qëþýüûýýýýúýüîÃÇøÎp¬|LšHK±QsoQvfcäýüüüüüüýôäþþù\&(«ß³¡‰{lcdD317)0*Àþýúþüýúúýn:F 0*DI17yš2 + + l/ + +vW51ly†m{kŒmD…u,K¢‰FVpj~g>Æ"_,!,J0^#B &&(^òÝÑâîëìòíêÒ±¡ŒÂ¨'"ƒÄuªÄ"S_T‹È½¥¹Õ‡j…p"–±µÀâóòðõö÷ùùø÷úüúöúúúúúúúúûûûûûûûûúúúùøø÷÷ööõóòòññíö屜"€~|{wx˜îìfeŽÛ³¤'"ÎÐȨ™¨yêûúûúþüû÷ýöûúþûóôó鿤ÚqmÇSrbCȎ9±ýüüüüüüýöãþü÷_'*‡ðøþûëèƱžq/6 0.&¸þþúüûüýúþx9Q2)5*Ufg6$~‡` + f% 93/9B&H)s'kuPbte@IvM*`SPehO Wb)>$9R{¡%+2/1@K) Šê‡³âöòì×À—ˆ Â®¸¨œˆP"¶{–ŠT\N›¸'{nws¤½Ùßïóôïñðõôõõùúúùûüûüüüüüüüüýýýýýýýýüûûúùø÷÷öõôóòññððôÆ{~~'††‰"Žêòtj¤ó½§¢µðûôÑ­¨ïõöýüÿùýýùøüùüûùúï÷ùùúóëïÂì͐Jœüüüûûüüüõáþýúc)/~ØàÝ»äèüþûùÕÍe40-$²þÿûûûúÿùû$7 #53AWCP7=ŒŸ + !17EQX@S\?xv=LNS{Ofjf(c`_€Šƒ=;&(1*$!!!YP¿h&#;AXj?B«í~´å辧‰o´u–…˜µzN£¸…¹pQQIjkf{'š±ÌÔÝõñðñóîîõ÷öõú÷ûüúùûýýüüüüüüüüýýýýýýýýüüûúù÷÷öõôóñððððì÷́…††‰‰'"€"ãñr|Ä⪦¯¾âðñÙ¿½¤ˆåöøþõýýþ÷ìê¹ÉÕáûöüùô÷îû÷ø÷ø÷ôóâÇÜüüüûûüüüôàþüúa!.ÆÌɸ×ÖÌÑÛÚÞö712'°þýûýýûý÷û'3$%FT;98#%N§H +(HƒrK5M_X8‡'OlGJD\h¥T V‹Ÿ_0$)%#%' "%" Cs³)$0E@:=GeÓä™Ä­"\vw›'›ˆq°¡‡°ssÂ̕}œ[DRdzŠ¨ºÁÛìèíòîéòíòöõñ÷öøýýüúúûýüûüüüüüüüüüüüüüüüüûûúø÷öõôóòñïîîîîî‡‰†‡ˆ€''‰áòr|ˆ"ƒ‰Š¢ªª££¯¬¢ðôôÿüþúýýþߓ–¥Æùýùúöòõòî÷óóð÷òüüýüüûûûûüüôàþúû`2Æõ³ŸÅÒèÇàøÅ»â®=/4)¯þýûýýþüùû"'2%*+ <)4ƒÂ + "f•…e>)2D7Ce•}''†_«!O]*A'$''%''$&,%Ÿž/!!?Q+2W¤ûËk‰ZFN‡›—"Ϧµ£Š²¼Š'ƒU^e~¡»Òàæðíêðìíçóëôôõø÷üûýúûýþþüûüýüüüüüüüüüüüüüüüüúùø÷öôóóòñïîííííðÞ«}~€€"ƒ'{×úX˜®´ÃÂÍ;¶¯Ÿ ¬ô÷ëûýç²¹ØîðêÜÚùþýüùûúôòøòòôúðõ÷üýüüûûûûüüõáþúþg%A˜¬Á'ÓÊçÙßüÂÐéÁ?00'®þüüýüûùþý˜+6( #!%A8)bmu8 + +D"¦«EFHHV?oc^p…ƒ¥²m (N[!&(,$)/(/#DzM<Ma"³·'€ˆGMT¥y«œ‹oŠ†"¨Ë~^Rn"¬ÇÓÝêðîêèèëëëëíñôö÷øúüüüüûüüüûûûûûüüüüüüûûûûûûûúúùø÷öôóòòñïîîîíííììÄ¥ƒ~€''…½øô÷ûÿÿÿÿÿÿÿÿþþûø÷÷ûïîÿÒ§vmU‡•¥¿¹¼Ûãýûýú÷úøûûûúùùúûùúúúùøøùðÞüûûe:o"¶õÒÖÉÓóäÐÌãÄV01%©ÿþûýüûýûý¥%2' %',%$ + + +!#Mq–ĝ@XlJZn˜eQwo[Jp™s/u‹YC3"#-'#:*K'9{§²«qUYi;ZHN^«h²²—€}ƒ‡ŒUz`ž·ÁØåëçéêêèèéêêêëíïòõ÷úûüýýýýüüüüüûûûûúúúúúúùùùúúúúùøø÷öôóòñððîîîíííììì¼£ˆŠƒ{yrbe\Üúûýþýüûûûüüûûúù÷öô÷÷þÔ©jO€Ÿ‰{lŽ†"ïýÿûùþûûûûúùøùúøùúùø÷øøòÞùüøf@'I®æèììíßÍÍÀÖÊÜd40(¨þûøùüþüûý¦)7'! $%() $ +=N?y½šzt_\W%9ddˆNc?#c"xcRXD6ujT7N8K',o¥¸}tn]cel>NNHq´}µ«¦Ì'SOb‹›°Îâåâéèæìêéèéêêéêëíïòõ÷øûûûûûûûûùùùùùùùø÷÷÷÷÷÷öö÷÷øøø÷÷öõôóñðïïïîíííììììëÅ­‹ZMSbitƒŽ›Åòøüüüûúúûüýûùúûûùöùýòû߉tsO‰˜p'2kñþûúüþùûûûúùøøù÷øøø÷÷÷øòÞ÷ýøjL77Qiw½Þèððûõúj6/'¥üÿþýýúøùþª-C>*2,# &-)**#/•… +$+ WsiTKL\dc:_I:$dQgpulwoƒpkKKX/U~'"}k(-E†«Ÿ{qMflTTcaHRIF‰¯¤{p{f€£¸Ë×áæääççãåååæèêêéèìíïñóõ÷÷÷öõôôôõõóóôõõõõõõõõõôôôôõõöööööõôóòñïïîîíííìììëëèѶ§…ƒ"¦®¤¯ªÁîòôýüûûüüýþýüúúúùøöúõþ÷þéçÜWJ=Q_J]tqïýþþøùúúúúùøøøøö÷÷÷ööö÷êàýýõ‡%)3*38:EXb¦³x5-"¦ÿýøùûüýúü¬4ID19$",72#€¢ (- + +hM_Z_TL50)*B=65F>Pj9%1|kq\Za#˜|qh‡eg½µkKJXFihA=vbHILT~jvbX{"¾ÀØååãàäâßäããæåååååæèéíîðñóóóóñðîííîîïîïðñòóóóóóóóòòòòóóôõõõõõóóòñðïïïííìììëëëôà³±°´»ºÇÊ×Üåîíõýýýýüüûûúûûúø÷÷øë§éú÷ûÿ÷ôíÆ¢ŠŠv\màþüöþýûøøøø÷÷ööõöööõõööìÜ÷öüߑyaI4.!!)0,/6KlK7 ¡ÿýûýúûûûý°);B!$!0:?7cK9|º7 && ]+/8\ocS_/51#4[U-.5&'0aUfŒT;3 P¢ŒŽ›…vhvbYRPNBICHIDAzYMENIWPz•°ÄÞÚæäßãÞâãäßáßâåâäåæåæèêìíîîïîííìëêééêëììíïðòòòòñññññðððññòóôôôôóòñðïïïïíííììëëëììÍÏÛßéééîîíìêïøøùûüýüûúûüýüúúûýæŸìýù÷óúúøýþþüóîêý÷óöúõôöööö÷ööõôõöõõõõöïÞüïóüøýúðë»Âž[44#/-3 ¡ýûûþúûùùþ±4@3&591 rÙ¸žµv + +* '+:htxLZ†ceU)*2!5.8@;`NM…W0,`yˆ¢¦ZD7<29P]UKGHFGIEmKLtz"±Ë×ØâààÝâÞÝäáÜààäÝàÞßáäæççèèééêêéèçæèçæææçéêëìîïðððïïïïïîîîîîïðñòòòòòñðïïîîîíííìììëëéìêêñëêéíäßÝÝÙ×ãõøüýýüüüüüüûûûüüøà÷ùüÿõýúúùöúöøùúù÷ô÷ó÷øôôôõööõôôõõõõõõöç×þùö÷øøöþ‡êµÈûâ©Å¥ŽtX@ $«þÿþûûüþüûƒ™W"34)6¡«|ž§ + BSLRikeXv_YS'*:LKYUšu>[;:@" LTx"¬S.)59<7PaJGKJG@EGhs®¤¸¼ÐÝÜßÜß×ÜàÚâ×ÞÜÙÝ×ÙÚãÝâááâãåææææææåäãâääããäæçèêëìíííììîîííííííííîïðñññññðïîîííîíííìììëïäìãäßÚÚÐÒÐÐÓØæôúýþÿþüûûûùöö÷÷öôñööýùøúøúýøýùöûôöôøõúñ÷ôóóóôõöõóôôõõõõõöëØû÷öóööúý¤Î ¶Àùµ'éžãÖÐóç¿òþúþüþú÷ýý¼¾~(14*';\J !,jv~†jyŠz]CW=&2Bc}|cA#(/+''E-NspJ;.7888<EZPHIG7IVm"¦¼ÏÖÝßÜÙÚÝÜÛÛÜÜÜÛÙÙÚÙØÙÝÞÜÞßàâââââááàßàÞÛâßâããæçäáÛÝÛéòîíçëïîêðçìëììíîððñññðïîîîïðìííìêæãàÜØÒÎÍÏÒÕääðõýöýýüùöîíø÷þúúýùôøøðõõôôôõöõñúúóöø÷ùøøøøøøøøõõõõõõõõõöööõõõöêÝýö÷ùô÷õý®Ù"ÑÒë¿òÞÌৰïþöýãÇÎíýýôÿüßh# &! + +_]PwV@[J^`tqToh6GFk~\EB0)$*}'iVNH@6,5:7<CJYK??Gh'ƒœÖÎÛØÚÜÜÚÙÚÛÚÛÛÚÙÙÙØ×ÚØÚàÚ×ßÞÞßßßÞÞÝáÜÝÚÝÜÜÞáäâÕ¿£cXQUf†ÂîéêçìàêìçììëëêëìíííîðñðíêèèåßÚÖÓÓÓÖØÝãëóùûûûýýýþûÅ¥•‡xÒîåæòÒÉéûøøúúùøööõóóøõñ÷óùó÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷õö÷÷ööö÷ïÛüùôõõöûþÊs‰¸Ö¡"ƉÍÖ§ïûÿÝ]--Iêþâðéw"€ ?;,., + + c[znwJXP0rv\pmA15DSODE@-6nzc^OKJ=(-7<:DF>@D\y ½Áž•éÙÛÛÚÙÙÚÚÚÙ×ÛÛ×ÕÖÖ×ÓÖÖÕØÙÙÛÜÜÜÜÛÙ×ÖÙ×Ú×ÝØÝÝá˨s: 1ŽííâíçæèãêåçéëíîííëéçåâàÞÞÕÕÖÙßæíñûüþÿÿþüûþûû÷÷ùéˆrsjwÕÌf@Pg˜àþûÿûûúøø÷öõóöòôûðøó÷õõõõõõõõööööööööõö÷÷÷÷÷øïÖûüôõø÷øùíÊ·½zù÷ԓ²ÂŸõýþÈD/O5š÷µ¾òŠmOA)_: +A1 )0 sHYƒœbP)!9Wn}V+!2;;EH9';kQ<?IDRE'!<75C@>Nw›´ÅÛâñĂÜÚÙ×××ÙÚÚØÖÖÚØÓÔÕÕÕÔÌÓÚ×ÙÜÔÙÙÙØÖÔÒÑÐÕÖÓÙÓÝЧ`#{èèÛãàåçâããââàßÝÜÝÜÛÛÝàåçòô÷ùüýþþûûûúù÷öõôóñôöóæ‡|ud|Ö¦=1\¤Æýü÷ýýüûûûú÷õóõùòñöøôõõõõõõõõôôôôôôôôôõöööö÷øêÖüûöùúùúøÇ¡»ä½æäؘ꽩Ðäýûý±[902½þ¥'òÙ·]™D4<+*& + + +>SSPvl-jrE*@?"Bk_?,7€'E,F@OQ8"*=.3Bb‡ªÃÏÒØÙ×ûِÝÚ××ÙÙÙØÖÖÕÖØÔÐÓÕÔÔ½¬¸ÕÚÕ××ÖÖÕÔÓÑÏÎÏÒÑÎÐÔД0 + œîßàÝÚÛÔÖÕÕÕØÛßâêíñõùüþÿýýþýüú÷õòñððïðññðóóõóóì‹}qlqۉ`ƒ¦®¤Ðüúþýûûúùùøöõöøôàøöþú÷÷÷ööõõõóóóóóóóóóôõõõõö÷ëÝûõöú÷øöþç§ô²«ú·ŠÖ®§¹¹ÙþõþýèÁ»Ôúþ ÷ýû¢<+"&; +CBZcNE;P~ƒF,Xe"$CH3!b{ˆuH;DR= '8HgµÉÔÐÎÍ×ÚÙößÝÒÒ×ØÙØ×Ö×ØÔÕÐÎÒÓÒÖÉ¿¾ÎÚÔÏÕÒÒÒÑÐÎÌËËÊÎÏÏÖ¢; #»ßÒÓÎÐÖÜßäêðöúûûüþþþüúùûù÷ôòñññîïïðñòòóðñòïî÷äjliee¡eFLaºÊ×þþúýýýýüûúùùøúàÉÕÆÓÎúúùø÷ööõôôôôôôôôòóôôóóôõòâúðóöòõöö÷þ÷úöûò×û¡Î·}ïýÿûøÿÿþþýù©›ýøú£ #4 ,/@_edQRdpnQ26"?EBJJ=NI-4_yž¿ÍÎÈÍÍÑËÎÒÜü´¨ÓÓÙÓÔÖ×ÖÖÕÖÐÑÎÍÐÎÐÚÑÑÉÆÐÒÎÐÏÏÏÎÌÊÉÇÆÅËÌÐÆ\ aÓÚåíòøúüþþþýüúúù÷õôóóóðïíëëìîïíîïïððïïóðñïóùé'B>4/#%!#+:L•áó÷ûýþþÿþþþþþçŠns¤âûüüûùø÷öõôôôôôôôôòóôôóóóôòÙôòòóñôòöïöôöööóþùøüþõþûøüþøøùöùõ¶"ùÿþ• G5$)Hd5="<b\7 JQ=8DBF0+?}¼½ÆÑÊÌÈÎÌÑÐØÔÕú­ªÊÔÏÑÒÔÖÖÓÏËÌÏÍÌÎÊÎÜ×ÔÑÑÑÑÎÍÍÍÍÌÊÈÆÅÇÇÇÂÍ®(ÒüýþþúûùöóñððñïîîííííííîîïððïïîîïððñññðñõôöõùÒ[5.17?7,4FRcgftyp{Œ¡·Ìßêýèvw{ÏüþýýûúøöõõòòòòòòòòóôôôóóóôíÌîöôóóõñõóöñõõòòöõõòóùõõöúøùþùþúþâ­þþýŽ + ? &9JS##!248tg;7=JE]†ÈÝÊÏÑÒÑÓÓ×߉ÈÙû"°ËÎÊÏÑÒÑÐÎÍÍËËÏÈÊÍËÜÑÏÎÏÎÌÌÌÉÉÉÉÈÆÄÃÃÁÆÃύÊúõòïéèêéçæéëìííííîîîîðððððððððïïñôõôóøöùüýüûۑ¨ºÇ×ÝÖÒÖÜÛÛÓù­µŸz_MLMbl_…™¤àíûýþþþþüüùüøöóôôññóòòóôôòö»êõ÷ðúóõõööõôôôôóóóóóôõòõñõôöùô÷þæ×þüýy <™Â7 + $;XGD344("98!-LW.@ytw¨×ÝÕÔ×ßÜÏ­…s‡¡ÑÖúÂÃÁÇËËÍÎÍÌËËÌÉÇÌÉÉÉÈÝÖÊÀÁÇÉÉÈÉÆÃÀÀÁÃÅÅľ¼Æf öçêçæçèêëìíëèìîïíëêíñíïñòòñññóõ÷÷÷øüýûüúýöüþ°¡©°½Ôçõüüþû÷ìØÁª› ­¸½Áºª"zX`U=Udu""¤¶È×äëõûýþýûþúúøõõõöõ÷¿ñòõòóôõóññòôõõòôööõôóóôôóøöðñóñõðîûøñORÅËÉe -#$'%))3#&EDVª»wrÉäÞßáè¯|\‰±ŸŒÉËêÑÕ¾ÃÄÆÇÈÈÈÈÈÉÊÆÊÈÇÃÄÛÏÈÅÊÍËÈÇÄÄÃÃÂÁÀÀ¿µ¨¬°= Gêäæäçåãâäçééééêëíîïððòóõõö÷úüûþþþþýþÿùþùüþúûŒafo'š®Çà÷þþþýòÚ½ž'€sr'wzƒ†ˆ"¦±«¦£ž•‰uaTZ^fr…–ª»Øâñûÿÿþþÿ½öûöøõöõõöøùøõóóöù÷óóô÷ôööîðøûùøöôöõûðS tħ 0 + ! $+&#"##%'!Sw²´‹j{ÀæêäÝááv_Ty‡Œ§¸ÂÂÞĸ¿ÂÂÃÃÃÄÅÅÇÄÆÆÅÃÄÔÔËÆÇÇÄÂÄÁ¿¼¸´²°°²¹ÊàÈQÆðååèçæçèéèèèéêëîñóõöùùúûþÿÿþþþýþþüóìàÓ¾£ŽŠ‹|…ˆ‹'–¯Æßíõõðã⢙•–"Š'qjksyuf]bmƒ›®¼ÆÉ¿©€o]J:>Toƒ'¤¼Ñ›Ûøþÿúþþýúøöö÷øöôñòõø÷óøøøßØíõãïúùûûÿñ…,& `¤n|O + ("!# ('$!$xë®X]žÜáÜâÜßÕoYY™¥xiÂµŽ¾»»½¿¿¿ÀÁÂÃÃÂÂÄÄÆÆÃÇÚ˾½ÀÀ½»µ²¯±ºÊÚäïøúû·U #3;AB8)†ôáääääääåçêíñô÷ùùûþþÿÿÿÿþýùôêÓ²•'sf\RHLDJF/N'†Œ'š¤µÅÊØáÜÕÏ»¦˜ˆ‰"zutvpy‹odlma[^fu€'|v‹Š…¤£µ½¾©›—"qdEU]p~Š§ÐÜìùþþÿþüþþýúùø÷ú÷̘Ÿ©Çåúúüûûì¶Ûèҗ¨«E( *"; 'B;%3. -wñ"RjÂÚÓÐÒÍÎÃW@=pˆ–™—½»º°ÊÀ³¼»»¼¾ÀÂÂÂÂÃÃÂÃÿ¼Å½´³¶¸¹¹ÇÏÝêôøùøîïçó",,:<2551-( Eßãæãáåéëïöúûþþþþþýöí×ʸ¥"odOICACGIILINJPK(8hggiqy‡œ¦¢ £Ÿš—‹‰‰ˆ"x…Œ"†gXQSNNLNc|†uanaTWga`\aduŠŽ'œŸ¤˜€tucba`er"'¨¼Õçòûýþÿþ¶HKžðþÿþüùûþç¹õæ™oauQ- + +'34) "' "1*$1.˜ær_‡ÊÌÈËÆÁƽD/;|ƒh^·²³µÅ¹±¹·¸¹¼ÀÂÃÂÑËý¸´³³®³¼ÅÓäôúýýûöîäÛÖÕÓÜèl/>;1*(%&-1* ´ìíêòøûûýü÷ñçد›dOLHDBDFHINMMMNNNMKLIJHE/)./6FXk}ˆ'ž°´¶·°¬¨£™'"'Œ'ˆŒxgb\UW[auƒ|vbnbZT^ab]_WVZQQfmw{{ŠšŸ©¬®ªŸ'zneXTby‰Žž±ŽTm¸þüþüÿüþÿؔµB(c´J"# + + * + ".40")7¨ÄxŽ»Êǽ½ºÂ²=Hf"Ÿ¤‰z³²±«Æ¹·®´µ·»ÀÃÃ÷°«°µ½ÍÚéïõùüûóêäàÙÓÎÍÍÎÍÍåÓU*96.+&))&'-10ŽôññïáÅ£Œ}k[OMID@AFKJKLLLKKKKJIIIIHGHIDKC=2/s{‹œ££¨¯º½ÈÊÊÊÂÀ½¾¾¿¿¼·µ¬¬§œ—'†'€usu{Ž"…{hqgbKCIBDNGGU[ikmornlfj[WSSZeqxƒ—¬µµ®£š'pKEOEhp}'¹ÀÑê͌£3Fr‰J 5 + !)+4'-2(<a›yl~¡Ò»¼¹µ¹¶œ—Ž€rmyŠ¯µ²´¼»´»¯¯®¬««®°¼ÆÔâïøùøöìèäàÚÖÕÔÐÍÎÌÈÇÉÉÈäÛ@ +#51+(!#""()02D†udSKA;=AEGIJJJIHIJHIIIIHHGFGGGGGFFEHFCC<45uumqx|‡Šœ «¯¬±­›«°³±¯°°°µ¶´²±²°¬§¦ —'"‹'~z{leb]RPHMm|vhdadTM^^URLHMSOGDABCN`n{}l~š'•'zukbU:*4``Gvƒ…:?$ $0) + +2,'$(+*4 U}d-)¿½²«´²t{ŠœŸ'€t¤¯¯«®­§«¤§¬µÂÒáëóõõñíçàÙÔÍÏÓÒÏ×ÑÍÍÌÉÆÅÆÇÈÉìÏ0 +-2'!!'$'!$)7/# 6@>FECEGIHFGHHHGGGHGGGGGFFEDDDDDCCBADCA?91.KY]ckr‡'—£¬®²¯¥®®®­¬¬«ª¥¥¤£¤¤£¡Ÿ¢§­­¬¯±«­¥›Œ'ƒzsƒ|}{yxe[ji]RC?HTYVTOMGCB>@9487K`\cy‡œ¢™‡l\LkŠ'²–w5 06&,# + #'% 5!,&jx& Dµ¹©±°­¢‡i_i{™˜¥¢˜Ÿªµ¿ÓÛèñóîæáÚØÔÐÍÎÏÏÌÔÍÉ×ÐÐÌÊÌÊÇÈÌÌÉËÑóÌ4 !2($/)""&'<1*GEDDEFHHGFEFFFEDEEEEEDCCCCCCCCBBA@@AB@<92)>T]`fku~‹'¨®­©¦®«¨¨©¨§¥¦¤££¢¡ Ÿ–"—š—••"–"žœ——¢ ¢¡ª¨ž›•Œ‡ƒ|xwyqgccaYQD>?>>>;=B<M]kpcdpu|yrj]VKPs|G:7), 6A*'$ + + &2 1 3M1./tP 'Á¨¯«§z€ˆ‹ƒujg™²ÆÑáäèèæãÝÖÑÌÊÊÇÈÈÇÈËÍÏÌÍÍÉÌÇÎÎÉÈÆÆÈ´¥†–4 ..#)#&#"..8#>AEDCBBBCDDDEDCCCDDCBAAAAAAAAAA@???>A?888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4*5LVWajqzŠ•Ÿ¨§£¤©¥¢££¢¢¤¦¤¢¢¡œžœ—™›•–™–‹‰ŽŒ‰'Ž‰Ž—˜™š™£–˜˜™›''Š…}toe\XSPNILG?M\hpmmŠ‰†{ywun_lw`#%JM @:"-'&(" + 5 +'1EJ<*l + +fDZ ¢¥"q^^vÃÛåêçàßÏÎÌÄÂÀ¿¿ÀÂÃÅÈËÍÌÉÆÅÑÈÇÉËÎÌƽ®šŠxbK=?8Ef@.'++$M{V$%,/431E>?@AAAAABCCCBABBAA@?????===>>====<=;797--BNOW`fow…'œ¡¡¢¥¢¡¡ ž¡¦¢ ŸŸžš™›™'••"Ž…ˆŽ'‰Œ"'‰†ŒŽŠŠŠ‡ˆ‡ˆ‡‰Ž'"—šš™—–"Š…€|ttojkkmvyrƒŠŽŒ…|z'zu}c'2J84,%!# " "164 m #¢¡§½µÄÛìñëáÛÑ˽³»¾»ºº¼¿ÃÆÇÍÎÐÑÐÎÎÐÏϾ¯‡qZNF><;:>C9;HpS + (++2jmk†'"'&5>' ;<<>????@@@A@???@>=======<<====<<;;;87871$5GLPW\gju{~Š"šššš™——œ¢ŸŸž›˜–—'Ž'"Žˆ{‡ŠŽƒ"‹ˆ…ŠŒ‡‰ŒŠ…ƒ'€xy|€ƒ"y~|€…‹ŠŒŒ'Œˆ‰‡zwzxwvssomsnyjI(Qo=)&%''" + + + . (% !(%0vÛâàëëæÞÕÌÅÀ½¼»»¼Æ³º·¸·¶·»¿ÃÅÉËÍȺ¥"‹yup9)>888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4<>?>=>@G@>_[--1$+gŠqnxTg"%*2>9!/<;99:;<=<<=<;;;<888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4:;;;;;888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4565231//)-<A?@AGKPV]govz'ƒƒƒ‡Ž'"–˜—––•"'""''"~‹'‹‹……‡ƒƒ""‰‹"~†"}|}|zwy{xststopwvwu||"‡Œ''‰‰Šˆ‡yqb^WjO//Y($% + + + + G# +3,=v'/82¸éÐÓÅŽ»»»¸µ··´²¼­¸µ´·»¾½¶¬¥šŒwe[\gr…}‰Þ"B:=;=<888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4?@>888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4:]m ,-+(\kpVwK*26?* 5567999889:988897889999944321/.-+.+)*'#&&)23535649?@>>@DGJKOW^ahnrtwz|{yz|'ƒ€xz"Œƒ"†‡{|~vw|{†~{y{ztxpuwtqrokrtvomrnlprouwr{zƒ…‰‹Œ"'š"‹pPqX4$V.32"( + + + + %/, +5,)A7.0402)Ó¹½¿½ÁÁ»¶µ´±±´¸µ¾¶±©ŸŽvm`T_`fknnquutqqlįK/<=<?@<<=;:99P~A&.0)9Žˆn/‡µV 'ƒ&&1?9;%-1321356123344443310.,+*('&%$#""!"####!!'11*))**+,-./0.,.0-''&+5:?EPm{‰'š ‰ŽŽ'"{|~vlpyz}€…z€x{zt|pkqflo`hnpmiicmlpmlnmnv€€†ƒƒ‡…‡‹†"xczE$YV +;2 + 4.'*1-('*'oÒ¼¶¸ÀÁ¾¸µµ²®¦ž'~xg[PX_V[einsthblhJJoqla¶·e0;;;=<88<<;:5CyX''2*užˆ-D¥Í‡a]‰J0=<B9( &+,,,,+((('&%##$##"!! !(&2?BJT\cgjhx¸¹µ¹°pKqÎÝÓÍŶ±¢£™'…€wrnyprrpfjkgidfkjj^dpmhfgiins…ƒ"…ƒˆŠ'†€hQ]A<?X; *# + + 16%,1''"!#&\¸º¶¹¶­¡"†seKF?6;:61UhkeV`gjdhhi]CA\rp[ ¿†07=:89;>>:<=76kp"'4,B¢±Ú| ­®˜x‰888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4AFF!!! 7_]digb^_]Zq­±±§¯t8iÇßééôçàêãâr\bhsz'}w}tr{rvodkmfeijslhjjfejnoopy"|ƒ‡~"'{zk@('HD0 + + @M+&&#)$!)9«§"r_WJ?;;96>=;7=?97B]gY>P_ddjlfa`[Qnt]ŒÄ§@5<;;888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4:95:;:/V{4(2)n© ý杶¢³œ‹€o&*;;;:E 0O\Z]^\^[cdat³¶±±°ƒJgÉÙéäâÚÛØÜâmAKIMMSWRSPYZb^ µ¨£›"‹~xvownddfkooli|'y{€"'€{p\9776E# + +(% #IN*!%%D9+00357:<:834758<57=[_UMZ^aia`cZMJMinbƒÅÀh.6=A>:9;=627-DwA+03©‹ÛǕºÊƱ±ih.*848:P7 &Ic_`]^adTOF@@b^aOI?FL‡"¥­ËÁÈÈÔÔvDRMLLHQFFHIID<¨ÚÖÐÎÒÍÅƘ_nmprtuutrpvt{tosoqqthR,,;K+ + + + 6*J>&&-A>A)+45.034554477733914@X`\US^^fddhaF5;mlj~Äɓ%7;;899639.1-6`>)6>¨­†º²¯¦ÖϸӔn7-96:=WT !2DGC>977=5HO'dO!^4K%&=,8.HHNbbHCEHDJINKGTEMIE¤ÜÕÒÙÐÏÔì¦9>DGKLJKOSUWX"–‡‰vmqtX?F0') + '=-5%%$!L`\KXg<&(22211124432336?35:N__K6Yc`cabh\=%gokrÇĵ418<@ILGA:2...=0+1VÄ´|¯ÈÜòûæÊλƒG(>I@3AW4 19M<dI,":<y3Tp'vB-e&=OC+$>30-:579c ž®»ÅÅ¿Ô¤GFINNIA=>?>65ÆÅȺ»¶¼¡XXRQNC6( + *$%%VuB$5yiH/-,,.14431547;>G311N[ZK#Kdecfgc`R=TodaËÂÌV&8EFD?:954.0)#%33|Ë»x§»Ûþ៻¶ÃªW';MC:AY> 0/7!E@,r)Mt&uU:{-^U$Z&:A'C(9B:KHYV3?=CEC?@FHEL6ŒËÈÈÀÃÁDzDBCUJ95# $( + "$PuÇ© w­‰3+)0./11148;99;=;3-4DbaUFJ_^b`_bXMNdmghºÍµŠ$..3/.)+((&" &13–Ôρ˜µËþöÆÀ©¶ÀZ$9564HWC C";Mb3De1~5Tf/p,]L(d"]*888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4'F.@2-Ms{‰—œ£¦I@@F,,?' /+ + !$5ƒo¹ô'"ÆÇ?+%)2,,.888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4:431/.+)'/<[]WKM\acbcfb^a[d^U™È»¨#'19œãâ}ƒ¢¼ñýê°¥¶X 4252DTD" ./7Gq'}#>'6>.]-Z@B`.k,c,!#$%&3025D8$ " ) + + !$kŒS"·˜µª»—U: >10/2672-&((&""%(,6U]]VU\\\\^_^_bcd_VŒÓ¶®C *3A¥ä³çïؽ¯›¦L 1284DUJ3 IHM`]˜ƒ @I#$*2EW985?1%)9 $1(!*(!31 + ! "%.›~F…‹£©´·¥fL))()-20,),-*&$&)(/P\_\[^`^`b^\]]Y[[OrÍ®³h/99¬éø•…­·¿´°¤'š4&0072>K@> >F<FHon & =U²jc]‰X()%2?RK_06*9=KnH +%"!2R-1/ + !)#$%M³m7—­ÈÏñß°f4!##"!CRVUUVWW[^]\]^_d^KbÉ®¬ƒ 1=>²ÞК…˜•"¡ž¡«~}/(,.:9GSHA *x…LPTxd:GL +6qòÅ~]^@++"=8A:/' )8?V@6-9@!'Fj3 % ""bÒ°Y‰­ÄûúÔÖ°#@RVUWXUTTUUSRTU\PE]¼´©œ7 1<9¬Ê}€Šrs~t‹¿"W,-,-74AH<@ 7°õóÞ¯Ÿ}X"œ% .!SƞhD-! %*1156-),C4<W^>4, 3L\l9 # + "!ÎÞ§yŒ±ÜіÈèk7 3JONOONPOPVTQVVXKNQ}‹›O 0<5ªÕvdjRUl'˜žÅ"?++*-73AI=>% I¶ÊÐêâȽÌØÄçË) S/n:8 )#626(2<4$4O4 +'?wwuR* + + (&"'%™ºƒo"§£Ä¦îÎ5 + .HOMMKLNIGJB9<6*6*$# 0=4"ɍil8q˜q"ŽÊŒH&%%+4.=E;>* UŸ«"š´ÏÐÕ²ÁÕôñ¬# +I1@8"!#)2.#%+)$(%:L ,9K~ikj?" !%$%$"î"rnˆ"q"¯ŸÑé7 + + + 00*'$!# *98h¶¡WAyu{'Õ™;+".25B?:?4 + -VAk²ÚÏŚŒ¡¨ÉöêòüûùÎ;<9@*!Y@#)/")/&$,/")BG;fpsyG,# + + + (%"ý¥T^rUL|ˆ¯¤-" + + + + + + + + + + + '9<E¥˜zH~|Ž†"ãy1'!!/02=9362 + %<"J²¸È·bgv€ÙæÔ¼½¾Ñ˜5 .)/#" !JE4(.*#?5;?/OUPd`00! + + & &(yþ×<QS-TgŒnlb" + + + + + $98;œƒ*#z"xl¨ÔM*&#005@:843! +7L#x1 Xq'ÊÙªªÈÛ¯7 ;W&!".' '6?5).)"%!%'<<<20RsGKC X +'.KñúF;YRkQ@<" ! # + + + + + + 7G3j¨KJuhO§Œ4-(&/,28101/ .>" V + IguªëŒÜ³©Ë- 1Š"&) 0'4SA")/%&!"4&2q+ '/EM=HoVXS + ™3 + #05¿ø€Z_hs‰š]H& +5@0 + +# 3<EE¯ŽvŠ'‰0I>(-#(//6;770/ 4!(* Crke±Ù–Ÿ ®ìK #Š% 7<+7:&/54- %(IG8.4XJ ".Uonk\WU! 2 %(#(&bا"|77šÀm;"$ ( +%H3 + -C9:mÏ«©È—!j\"0$#+.-01-,/1#)-+" S_," + + +J‡ycs¨Ú`~Æ·òg g .+"$)1(($&8,)3P\aDFrxc=7<&$$ +&+- 4+ÑÀH²´I$!( +M>+$/'9& %6H>0—Û¸¿¯"j*:'-&*,.000/,.!!3'!C>,!!-[Y3 + ZW(0=,>…usXn»°zŒ—¼]S.:6!%!#+!4&9=( <YY>+!# + #&$"0&)'Š¿ª''ˆ>&# + + +&(580R' + 2;DA,~·±šZ3/ '()--,.,10 !1)%H.#0,08.#2 h®Y1;Y0}ƒtb<NqXJhŒ…YE MYO*E1&:,$$!+I (3,?JA2$ Z))'% $"3"*(!P~e$%&! +/# 5$iŸO + -8EKA+*?%.74' ''())('&") .8"A!+&,E)"1B2 +P–£: ,2:m'RO;Oœ–meecfl…wW9F<!5$We"G* !RVD-=6 .2'";7$&) ¼D.>*+'(,2<NZ8"@9>+,?(!.')%##,'! $;C "1=FPMB=B<4* '''''&&&($@0&"^HFLXeHT9 . *h)"" + 7w"‰y{heq€ƒ"x~‹…™¦iSg)r{. %BHDG6]h`7 2;#!& #($* (%9 XTUD?PSG?FV\MZ_hjK8B7%',.0/*!!"# $, + + -59FPKC?4(!$&%$#""#$#%›X R?1?^b]zJUa,* :h%.3 +e"|"}xniefr|slu{"_ ( BRnlU EYR\`YHB1(- #" + +c1X`e[SG81)481$,)1/)*1>F " +-!%(1-49'&+$$$%&#&%%$$'%!"$*&/"!')45% !,28965-(! $! +œ[ "8,%JXHAO'!:"D.&& + + Najr.&/(&2T‰‰‰‹‰"…‡‡†‹"†‡‡]1.-'C?*+'4S'¦e&%-"(L'ªzvŸWfs:,6GB_vEMRSQPORXeZ]^Z^``gZ[`XY_YGDOIBYTXTG!$'%4,"&;I% +.*!-0??Xa;9<40+('!#'&'"'('(#1210AGBJ9?JPjv_ + +%*(###!!% 3?aeHNXp"ˆ‰…Š‰‹"Œ'"‹Žžš…Š}Ž†"––'†Œ…€ŒŠ"'€†~‡–……‹ˆ…|{ƒ}p…ƒ~{yz€‡ƒƒ~|wzyrxzsssknlto:_W]T?4!&1H5#. ?L; + + +*,##%"ErpfR+0.)'! #(&##*%194-2E<171BRS_\=8! &$$2, &7RZC5EXjkimtopuowppvrqyrkngjns€~}tttvwpzsmkplpumfinmmvlvjjkkikde`Ugcb][^`_aX^bac_W]_Zaeb`__\[\W"‡€†wyjqt‹‡ot¡wae_]nzb^WG*"!%-/2,"!b©¤g2(+'#!!!!"(& ';@@9EXEB;AR`a]RAgS$ *@CO_^6 + + + 1N]D+>V`lomcfjibcmkqipogdjjacgmliomspqqkjjpkhmjebbegdjhhgeglp^\^``VT][WW_bbbWY_`a_VUZUVW_c`ccd^]''"•‹•œ–š—¥¶ž¦ ¡¤¢¡¤¦ ¥š•™"Œ‰Œ‰…‡ˆŒŠ†{sy‡‰l]bSWRNIMUNFGMBGC82"%3>21:(888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4>DBCNO_F + .Xc`qw'y* '&NaR+2H`kqimlea]aklijkjijnjgqmoiushliimnooinlimkhieagcfhegenmekc\bd^]]\XVZZY[[X``[\XTWZYT^hbc`d\]ˆŒŒŠ‹"—'˜•"›"˜•›¨ œ™œ¡¬£¦¡Ÿ¢£ ¥¯±¯¯®°¸®ª²¸Àº½Â¼ÄÁĹ½º¿¾ÈÈËÄÂźº±›‡z††|qpf`TYa\XSH7++( + + [s{syƒ}€p. + &77cS2,Edjjssokc_cmlolnomrt}ym|uz"yrrlsxpnmsonjjlmlkjjiefgaempzpmb]cdab`\USWSaXWRSVTTVUVXXX^deb`a][ˆ—Ž‰‰—'—""–¡š›˜¡©›" Ÿ¡ ¤"ž¤¤¤§ª¬®±¥¦¯©¤°²¬¬¨±´»¹¼µª°µÁ¾»¾¸·¸¶»À½¸ÀÄÄÉÈÁ½ÀÈÆÆÉľ³¹¹¸´¯ªª­¡¢£•''"Šˆ''uttiebcb`aeUUOE?;<A57/$! + + + + [... 3 lines stripped ...] Added: incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.ppm URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.ppm?rev=676410&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.ppm ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/pxm/1/info.txt URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/pxm/1/info.txt?rev=676410&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/data/images/pxm/1/info.txt (added) +++ incubator/sanselan/trunk/src/test/data/images/pxm/1/info.txt Sun Jul 13 12:18:53 2008 @@ -0,0 +1,3 @@ +these photos are from my cameras - a Canon SD 750, a Nikon D50. +I hereby put them in the public domain. +Charles Matthew Chen Propchange: incubator/sanselan/trunk/src/test/data/images/pxm/1/info.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/sanselan/trunk/src/test/data/images/tga/1/Oregon Scientific DS6639 - DSC_0307 - small.tga URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/tga/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.tga?rev=676410&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/tga/1/Oregon Scientific DS6639 - DSC_0307 - small.tga ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/tga/1/info.txt URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/tga/1/info.txt?rev=676410&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/data/images/tga/1/info.txt (added) +++ incubator/sanselan/trunk/src/test/data/images/tga/1/info.txt Sun Jul 13 12:18:53 2008 @@ -0,0 +1,3 @@ +these photos are from my cameras - a Canon SD 750, a Nikon D50. +I hereby put them in the public domain. +Charles Matthew Chen Propchange: incubator/sanselan/trunk/src/test/data/images/tga/1/info.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/sanselan/trunk/src/test/data/images/tiff/1/Oregon Scientific DS6639 - DSC_0307 - small.tif URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/tiff/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.tif?rev=676410&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/tiff/1/Oregon Scientific DS6639 - DSC_0307 - small.tif ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream From sanselan-commits-return-117paul24@example.com Sun Jul 13 19:53:01 2008 Return-Path: <sanselan-commits-return-117paul24@example.com> Delivered-To: paul24@example.com Received: (qmail 82999 invoked from network); 13 Jul 2008 19:53:01 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 13 Jul 2008 19:53:01 -0000 Received: (qmail 62749 invoked by uid 500); 13 Jul 2008 19:53:01 -0000 Delivered-To: paul24@example.com Received: (qmail 62731 invoked by uid 500); 13 Jul 2008 19:53:01 -0000 Mailing-List: contact paul24@example.com; run by ezmlm Precedence: bulk List-Help: <mailto:paul24@example.com> List-Unsubscribe: <mailto:paul24@example.com> List-Post: <mailto:paul24@example.com> List-Id: <sanselan-commits.incubator.apache.org> Reply-To: paul24@example.com Delivered-To: mailing list paul24@example.com Received: (qmail 62720 invoked by uid 99); 13 Jul 2008 19:53:01 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 12:53:01 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 19:52:17 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 7D3192388A04; Sun, 13 Jul 2008 12:52:40 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r676420 - /incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java Date: Sun, 13 Jul 2008 19:52:40 -0000 To: paul24@example.com From: paul24@example.com X-Mailer: svnmailer-1.0.8 Message-Id: <paul24@example.com> X-Virus-Checked: Checked by ClamAV on apache.org Author: cmchen Date: Sun Jul 13 12:52:39 2008 New Revision: 676420 URL: http://svn.apache.org/viewvc?rev=676420&view=rev Log: Fixed a bug introduced in recent patch around TIFF-structured data (ie. EXIF data) with invalid field tags. Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java?rev=676420&r1=676419&r2=676420&view=diff ============================================================================== --- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java (original) +++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java Sun Jul 13 12:52:39 2008 @@ -108,9 +108,13 @@ Number key = new Integer(offset); // Debug.debug(); -// Debug.debug("offset", offset); -// Debug.debug("key", key); - // Debug.debug("visited", visited); +// Debug.debug("dir offset", offset + " (0x" + Integer.toHexString(offset) +// + ")"); +// Debug.debug("dir key", key); +// Debug.debug("dir visited", visited); +// Debug.debug("dirType", dirType); +// Debug.debug(); + if (visited.contains(key)) return false; visited.add(key); @@ -123,16 +127,12 @@ ArrayList fields = new ArrayList(); - // Debug.debug(); - // Debug.debug("dirType", dirType); - // Debug.debug("offset", offset); - // - // if(offset>=byteSource.getLength()) - // { - // Debug.debug("skipping invalid directory!"); - // return true; - // } - + + if (offset >= byteSource.getLength()) { + Debug.debug("skipping invalid directory!"); + return true; + } + int entryCount; try { entryCount = read2Bytes("DirectoryEntryCount", is, @@ -144,21 +144,13 @@ return true; } - // Debug.debug("entryCount", entryCount); +// Debug.debug("entryCount", entryCount); for (int i = 0; i < entryCount; i++) { int tag = read2Bytes("Tag", is, "Not a Valid TIFF File"); int type = read2Bytes("Type", is, "Not a Valid TIFF File"); int length = read4Bytes("Length", is, "Not a Valid TIFF File"); - if (tag == 0) { - // skip invalid fields. - // These are seen very rarely, but can have invalid value - // lengths, - // which can cause OOM problems. - continue; - } - // Debug.debug("tag*", tag + " (0x" + Integer.toHexString(tag) // + ")"); @@ -167,6 +159,14 @@ int valueOffset = convertByteArrayToInt("ValueOffset", valueOffsetBytes); + if (tag == 0) { + // skip invalid fields. + // These are seen very rarely, but can have invalid value + // lengths, + // which can cause OOM problems. + continue; + } + // if (keepField(tag, tags)) // { TiffField field = new TiffField(tag, dirType, type, length, @@ -177,6 +177,8 @@ field.fillInValue(byteSource); +// Debug.debug("\t" + "value", field.getValueDescription()); + fields.add(field); if (!listener.addField(field)) From sanselan-commits-return-118paul24@example.com Sun Jul 13 20:53:30 2008 Return-Path: <sanselan-commits-return-118paul24@example.com> Delivered-To: paul24@example.com Received: (qmail 95603 invoked from network); 13 Jul 2008 20:53:30 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 13 Jul 2008 20:53:30 -0000 Received: (qmail 96584 invoked by uid 500); 13 Jul 2008 20:53:30 -0000 Delivered-To: paul24@example.com Received: (qmail 96565 invoked by uid 500); 13 Jul 2008 20:53:29 -0000 Mailing-List: contact paul24@example.com; run by ezmlm Precedence: bulk List-Help: <mailto:paul24@example.com> List-Unsubscribe: <mailto:paul24@example.com> List-Post: <mailto:paul24@example.com> List-Id: <sanselan-commits.incubator.apache.org> Reply-To: paul24@example.com Delivered-To: mailing list paul24@example.com Received: (qmail 96556 invoked by uid 99); 13 Jul 2008 20:53:29 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 13:53:29 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 20:52:45 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 371322388A04; Sun, 13 Jul 2008 13:53:09 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r676441 - in /incubator/sanselan/trunk/src/test/data/images/psd: ./ 1/ 1/Oregon Scientific DS6639 - DSC_0307 - small.psd 1/info.txt Date: Sun, 13 Jul 2008 20:53:09 -0000 To: paul24@example.com From: paul24@example.com X-Mailer: svnmailer-1.0.8 Message-Id: <paul24@example.com> X-Virus-Checked: Checked by ClamAV on apache.org Author: cmchen Date: Sun Jul 13 13:53:08 2008 New Revision: 676441 URL: http://svn.apache.org/viewvc?rev=676441&view=rev Log: adding some simple images to the test image suite. Added: incubator/sanselan/trunk/src/test/data/images/psd/ incubator/sanselan/trunk/src/test/data/images/psd/1/ incubator/sanselan/trunk/src/test/data/images/psd/1/Oregon Scientific DS6639 - DSC_0307 - small.psd (with props) incubator/sanselan/trunk/src/test/data/images/psd/1/info.txt (with props) Added: incubator/sanselan/trunk/src/test/data/images/psd/1/Oregon Scientific DS6639 - DSC_0307 - small.psd URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/psd/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.psd?rev=676441&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/psd/1/Oregon Scientific DS6639 - DSC_0307 - small.psd ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/psd/1/info.txt URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/psd/1/info.txt?rev=676441&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/data/images/psd/1/info.txt (added) +++ incubator/sanselan/trunk/src/test/data/images/psd/1/info.txt Sun Jul 13 13:53:08 2008 @@ -0,0 +1,3 @@ +these photos are from my cameras - a Canon SD 750, a Nikon D50. +I hereby put them in the public domain. +Charles Matthew Chen Propchange: incubator/sanselan/trunk/src/test/data/images/psd/1/info.txt ------------------------------------------------------------------------------ svn:eol-style = native From sanselan-commits-return-119paul24@example.com Sun Jul 13 21:02:15 2008 Return-Path: <sanselan-commits-return-119paul24@example.com> Delivered-To: paul24@example.com Received: (qmail 97139 invoked from network); 13 Jul 2008 21:02:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 13 Jul 2008 21:02:15 -0000 Received: (qmail 601 invoked by uid 500); 13 Jul 2008 21:02:15 -0000 Delivered-To: paul24@example.com Received: (qmail 583 invoked by uid 500); 13 Jul 2008 21:02:15 -0000 Mailing-List: contact paul24@example.com; run by ezmlm Precedence: bulk List-Help: <mailto:paul24@example.com> List-Unsubscribe: <mailto:paul24@example.com> List-Post: <mailto:paul24@example.com> List-Id: <sanselan-commits.incubator.apache.org> Reply-To: paul24@example.com Delivered-To: mailing list paul24@example.com Received: (qmail 574 invoked by uid 99); 13 Jul 2008 21:02:15 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 14:02:15 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 21:01:31 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id B005523889FD; Sun, 13 Jul 2008 14:01:24 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r676444 - /incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java Date: Sun, 13 Jul 2008 21:01:24 -0000 To: paul24@example.com From: paul24@example.com X-Mailer: svnmailer-1.0.8 Message-Id: <paul24@example.com> X-Virus-Checked: Checked by ClamAV on apache.org Author: cmchen Date: Sun Jul 13 14:01:24 2008 New Revision: 676444 URL: http://svn.apache.org/viewvc?rev=676444&view=rev Log: altered "byte source" unit test to ignore file formats which cannot be guessed by magic numbers. Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java?rev=676444&r1=676443&r2=676444&view=diff ============================================================================== --- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java (original) +++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java Sun Jul 13 14:01:24 2008 @@ -38,30 +38,26 @@ import org.apache.sanselan.util.Debug; import org.apache.sanselan.util.IOUtils; -public class ByteSourceImageTest extends ByteSourceTest -{ - // public ByteSourceImageTest() - // { - // super(ByteSourceImageTest.class.getName()); - // } +public class ByteSourceImageTest extends ByteSourceTest { + // public ByteSourceImageTest() + // { + // super(ByteSourceImageTest.class.getName()); + // } /** * @return the suite of tests being tested */ - public static Test suite() - { + public static Test suite() { return new TestSuite(ByteSourceImageTest.class); } public void test() throws IOException, ImageReadException, IllegalAccessException, IllegalArgumentException, - InvocationTargetException - { + InvocationTargetException { List imageFiles = getTestImages(); - for (int i = 0; i < imageFiles.size(); i++) - { - if(i%10==0) - Debug.purgeMemory(); + for (int i = 0; i < imageFiles.size(); i++) { + if (i % 10 == 0) + Debug.purgeMemory(); File imageFile = (File) imageFiles.get(i); Debug.debug("imageFile", imageFile); @@ -71,6 +67,16 @@ assertTrue(imageFileBytes != null); assertTrue(imageFileBytes.length == imageFile.length()); + if (imageFile.getName().toLowerCase().endsWith(".ico") + || imageFile.getName().toLowerCase().endsWith(".tga") + || imageFile.getName().toLowerCase().endsWith(".jb2") + || imageFile.getName().toLowerCase().endsWith(".psd")) + { + // these formats can't be parsed without a filename hint. + // they have ambiguous "magic number" signatures. + continue; + } + checkGuessFormat(imageFile, imageFileBytes); if (imageFile.getName().toLowerCase().endsWith(".png") @@ -97,8 +103,7 @@ } public void checkGetBufferedImage(File file, byte[] bytes) - throws IOException, ImageReadException - { + throws IOException, ImageReadException { BufferedImage imageFile = Sanselan.getBufferedImage(file); assertTrue(imageFile != null); assertTrue(imageFile.getWidth() > 0); @@ -111,8 +116,7 @@ } public void checkGetImageSize(File imageFile, byte[] imageFileBytes) - throws IOException, ImageReadException - { + throws IOException, ImageReadException { Dimension imageSizeFile = Sanselan.getImageSize(imageFile); assertTrue(imageSizeFile != null); assertTrue(imageSizeFile.width > 0); @@ -125,25 +129,23 @@ } public void checkGuessFormat(File imageFile, byte[] imageFileBytes) - throws IOException, ImageReadException - { + throws IOException, ImageReadException { // check guessFormat() ImageFormat imageFormatFile = Sanselan.guessFormat(imageFile); assertTrue(imageFormatFile != null); assertTrue(imageFormatFile != ImageFormat.IMAGE_FORMAT_UNKNOWN); - // Debug.debug("imageFormatFile", imageFormatFile); + // Debug.debug("imageFormatFile", imageFormatFile); ImageFormat imageFormatBytes = Sanselan.guessFormat(imageFileBytes); assertTrue(imageFormatBytes != null); assertTrue(imageFormatBytes != ImageFormat.IMAGE_FORMAT_UNKNOWN); - // Debug.debug("imageFormatBytes", imageFormatBytes); + // Debug.debug("imageFormatBytes", imageFormatBytes); assertTrue(imageFormatBytes == imageFormatFile); } public void checkGetICCProfileBytes(File imageFile, byte[] imageFileBytes) - throws IOException, ImageReadException - { + throws IOException, ImageReadException { // check guessFormat() byte iccBytesFile[] = Sanselan.getICCProfileBytes(imageFile); @@ -159,8 +161,7 @@ public void checkGetImageInfo(File imageFile, byte[] imageFileBytes) throws IOException, ImageReadException, IllegalAccessException, - IllegalArgumentException, InvocationTargetException - { + IllegalArgumentException, InvocationTargetException { // check guessFormat() Map params = new HashMap(); @@ -176,8 +177,7 @@ assertTrue(imageInfoBytes != null); Method methods[] = ImageInfo.class.getMethods(); - for (int i = 0; i < methods.length; i++) - { + for (int i = 0; i < methods.length; i++) { Method method = methods[i]; method.getModifiers(); if (!Modifier.isPublic(method.getModifiers())) @@ -186,8 +186,8 @@ continue; if (method.getName().equals("getClass")) continue; - //if (method.getGenericParameterTypes().length > 0) - // continue; + // if (method.getGenericParameterTypes().length > 0) + // continue; Object valueFile = method.invoke(imageInfoFile, null); Object valueBytes = method.invoke(imageInfoBytes, null); @@ -195,7 +195,8 @@ assertTrue(valueFile.equals(valueBytes)); } - // only have to test values from imageInfoFile; we already know values match. + // only have to test values from imageInfoFile; we already know values + // match. assertTrue(imageInfoFile.getBitsPerPixel() > 0); assertTrue(imageInfoFile.getFormat() != null); @@ -208,7 +209,8 @@ assertTrue(imageInfoFile.getMimeType() != null); - assertTrue(imageInfoFile.getNumberOfImages() > 0); + // TODO: not all adapters count images yet. + // assertTrue(imageInfoFile.getNumberOfImages() > 0); } } From sanselan-commits-return-120paul24@example.com Sun Jul 13 21:47:27 2008 Return-Path: <sanselan-commits-return-120paul24@example.com> Delivered-To: paul24@example.com Received: (qmail 7528 invoked from network); 13 Jul 2008 21:47:27 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 13 Jul 2008 21:47:27 -0000 Received: (qmail 21448 invoked by uid 500); 13 Jul 2008 21:47:27 -0000 Delivered-To: paul24@example.com Received: (qmail 21429 invoked by uid 500); 13 Jul 2008 21:47:27 -0000 Mailing-List: contact paul24@example.com; run by ezmlm Precedence: bulk List-Help: <mailto:paul24@example.com> List-Unsubscribe: <mailto:paul24@example.com> List-Post: <mailto:paul24@example.com> List-Id: <sanselan-commits.incubator.apache.org> Reply-To: paul24@example.com Delivered-To: mailing list paul24@example.com Received: (qmail 21420 invoked by uid 99); 13 Jul 2008 21:47:27 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 14:47:27 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 13 Jul 2008 21:46:42 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 5603C2388A04; Sun, 13 Jul 2008 14:46:36 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r676447 - /incubator/sanselan/trunk/pom.xml Date: Sun, 13 Jul 2008 21:46:36 -0000 To: paul24@example.com From: paul24@example.com X-Mailer: svnmailer-1.0.8 Message-Id: <paul24@example.com> X-Virus-Checked: Checked by ClamAV on apache.org Author: cmchen Date: Sun Jul 13 14:46:35 2008 New Revision: 676447 URL: http://svn.apache.org/viewvc?rev=676447&view=rev Log: updated the pom.xml file's project version to 0.92. Modified: incubator/sanselan/trunk/pom.xml Modified: incubator/sanselan/trunk/pom.xml URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/pom.xml?rev=676447&r1=676446&r2=676447&view=diff ============================================================================== --- incubator/sanselan/trunk/pom.xml (original) +++ incubator/sanselan/trunk/pom.xml Sun Jul 13 14:46:35 2008 @@ -36,7 +36,7 @@ <artifactId>sanselan</artifactId> <name>Apache Sanselan</name> - <version>0.87-incubator-SNAPSHOT</version> + <version>0.92-incubator-SNAPSHOT</version> <packaging>bundle</packaging> <!-- From sanselan-commits-return-121paul24@example.com Tue Jul 15 22:31:48 2008 Return-Path: <sanselan-commits-return-121paul24@example.com> Delivered-To: paul24@example.com Received: (qmail 92407 invoked from network); 15 Jul 2008 22:31:48 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 15 Jul 2008 22:31:48 -0000 Received: (qmail 72856 invoked by uid 500); 15 Jul 2008 22:31:48 -0000 Delivered-To: paul24@example.com Received: (qmail 72837 invoked by uid 500); 15 Jul 2008 22:31:48 -0000 Mailing-List: contact paul24@example.com; run by ezmlm Precedence: bulk List-Help: <mailto:paul24@example.com> List-Unsubscribe: <mailto:paul24@example.com> List-Post: <mailto:paul24@example.com> List-Id: <sanselan-commits.incubator.apache.org> Reply-To: paul24@example.com Delivered-To: mailing list paul24@example.com Received: (qmail 72828 invoked by uid 99); 15 Jul 2008 22:31:48 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 15 Jul 2008 15:31:48 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 15 Jul 2008 22:31:02 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E28B12388A41; Tue, 15 Jul 2008 15:31:26 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r677073 [2/2] - in /incubator/sanselan/trunk/src: main/java/org/apache/sanselan/common/ main/java/org/apache/sanselan/formats/gif/ main/java/org/apache/sanselan/formats/png/ main/java/org/apache/sanselan/formats/png/chunks/ test/data/images... Date: Tue, 15 Jul 2008 22:31:25 -0000 To: paul24@example.com From: paul24@example.com X-Mailer: svnmailer-1.0.8 Message-Id: <paul24@example.com> X-Virus-Checked: Checked by ClamAV on apache.org Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediter.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediter.java?rev=677073&r1=677072&r2=677073&view=diff ============================================================================== --- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediter.java (original) +++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediter.java Tue Jul 15 15:31:25 2008 @@ -30,6 +30,7 @@ import org.apache.sanselan.formats.png.scanlinefilters.ScanlineFilterSub; import org.apache.sanselan.formats.png.scanlinefilters.ScanlineFilterUp; import org.apache.sanselan.formats.transparencyfilters.TransparencyFilter; +import org.apache.sanselan.util.Debug; public abstract class ScanExpediter extends BinaryFileParser { @@ -41,7 +42,7 @@ protected final int bitDepth; protected final int bytesPerPixel; protected final int bitsPerPixel; - protected final PNGChunkPLTE fPNGChunkPLTE; + protected final PNGChunkPLTE pngChunkPLTE; protected final GammaCorrection gammaCorrection; protected final TransparencyFilter transparencyFilter; @@ -59,16 +60,9 @@ this.bitDepth = bitDepth; this.bytesPerPixel = this.getBitsToBytesRoundingUp(bitsPerPixel); this.bitsPerPixel = bitsPerPixel; - this.fPNGChunkPLTE = pngChunkPLTE; + this.pngChunkPLTE = pngChunkPLTE; this.gammaCorrection = gammaCorrection; this.transparencyFilter = transparencyFilter; - - // Debug.debug("BitDepth", bitDepth); - // Debug.debug("bitsPerPixel", bitsPerPixel); - // Debug.debug("colorType", colorType); - - // buffer = bi.getRaster().getDataBuffer(); - } protected int getBitsToBytesRoundingUp(int bits) @@ -94,127 +88,98 @@ public abstract void drive() throws ImageReadException, IOException; - // private long count = 0; - - protected int getRGB(BitParser bitParser, int pixel_index_in_scanline) + protected int getRGB(BitParser bitParser, int pixelIndexInScanline) throws ImageReadException, IOException { + switch (colorType) { - case 0 : // 1,2,4,8,16 Each pixel is a grayscale sample. + case 0: // 1,2,4,8,16 Each pixel is a grayscale sample. + { + int sample = bitParser.getSampleAsByte(pixelIndexInScanline, 0); + + if (gammaCorrection != null) { - int sample = bitParser.getSampleAsByte(pixel_index_in_scanline, - 0); + sample = gammaCorrection.correctSample(sample); + } - // if (verbose) - // Debug.debug("sample", Integer.toHexString(sample)); + int rgb = getPixelRGB(sample, sample, sample); - if (gammaCorrection != null) - { - sample = gammaCorrection.correctSample(sample); - // if (verbose) - // Debug.debug("gammaCorrection", Integer - // .toHexString(sample)); - } - - int rgb = getPixelRGB(sample, sample, sample); - // if (verbose) - // Debug.debug("rgb", Integer.toHexString(rgb)); + if (transparencyFilter != null) + rgb = transparencyFilter.filter(rgb, sample); - if (transparencyFilter != null) - rgb = transparencyFilter.filter(rgb, sample); + return rgb; - return rgb; + } + case 2: // 8,16 Each pixel is an R,G,B triple. + { + int red = bitParser.getSampleAsByte(pixelIndexInScanline, 0); + int green = bitParser.getSampleAsByte(pixelIndexInScanline, 1); + int blue = bitParser.getSampleAsByte(pixelIndexInScanline, 2); - } - case 2 : // 8,16 Each pixel is an R,G,B triple. - { - int red = bitParser.getSampleAsByte(pixel_index_in_scanline, 0); - int green = bitParser.getSampleAsByte(pixel_index_in_scanline, - 1); - int blue = bitParser - .getSampleAsByte(pixel_index_in_scanline, 2); - - int rgb = getPixelRGB(red, green, blue); - - // count++; - // - // if ((count% 256) == 0) - // { - // this.debugNumber("before: " + count , rgb, 4); - // } - - if (transparencyFilter != null) - rgb = transparencyFilter.filter(rgb, -1); - - if (gammaCorrection != null) - { - int alpha = (0xff000000 & rgb) >> 24; // make sure to preserve transparency - red = gammaCorrection.correctSample(red); - green = gammaCorrection.correctSample(green); - blue = gammaCorrection.correctSample(blue); - rgb = getPixelARGB(alpha, red, green, blue); - } - - // if ((count% 256) == 0) - // { - // this.debugNumber("after: " + count , rgb, 4); - // } + int rgb = getPixelRGB(red, green, blue); - return rgb; - } - // - case 3 : // 1,2,4,8 Each pixel is a palette index; - // a PLTE chunk must appear. + if (transparencyFilter != null) + rgb = transparencyFilter.filter(rgb, -1); + + if (gammaCorrection != null) { - int index = bitParser.getSample(pixel_index_in_scanline, 0); + int alpha = (0xff000000 & rgb) >> 24; // make sure to preserve + // transparency + red = gammaCorrection.correctSample(red); + green = gammaCorrection.correctSample(green); + blue = gammaCorrection.correctSample(blue); + rgb = getPixelARGB(alpha, red, green, blue); + } - int rgb = fPNGChunkPLTE.getRGB(index); + return rgb; + } + // + case 3: // 1,2,4,8 Each pixel is a palette index; + // a PLTE chunk must appear. + { + int index = bitParser.getSample(pixelIndexInScanline, 0); - if (transparencyFilter != null) - rgb = transparencyFilter.filter(rgb, index); + int rgb = pngChunkPLTE.getRGB(index); - return rgb; - // return 0xffff0000; - } - case 4 : // 8,16 Each pixel is a grayscale sample, - // followed by an alpha sample. - { - int sample = bitParser.getSampleAsByte(pixel_index_in_scanline, - 0); - int alpha = bitParser.getSampleAsByte(pixel_index_in_scanline, - 1); + if (transparencyFilter != null) + rgb = transparencyFilter.filter(rgb, index); - if (gammaCorrection != null) - sample = gammaCorrection.correctSample(sample); + return rgb; + } + case 4: // 8,16 Each pixel is a grayscale sample, + // followed by an alpha sample. + { + int sample = bitParser.getSampleAsByte(pixelIndexInScanline, 0); + int alpha = bitParser.getSampleAsByte(pixelIndexInScanline, 1); - int rgb = getPixelARGB(alpha, sample, sample, sample); - return rgb; + if (gammaCorrection != null) + sample = gammaCorrection.correctSample(sample); - } - case 6 : // 8,16 Each pixel is an R,G,B triple, - { - int red = bitParser.getSampleAsByte(pixel_index_in_scanline, 0); - int green = bitParser.getSampleAsByte(pixel_index_in_scanline, - 1); - int blue = bitParser - .getSampleAsByte(pixel_index_in_scanline, 2); - int alpha = bitParser.getSampleAsByte(pixel_index_in_scanline, - 3); - - if (gammaCorrection != null) - { - red = gammaCorrection.correctSample(red); - green = gammaCorrection.correctSample(green); - blue = gammaCorrection.correctSample(blue); - } + int rgb = getPixelARGB(alpha, sample, sample, sample); + return rgb; - int rgb = getPixelARGB(alpha, red, green, blue); - return rgb; + } + case 6: // 8,16 Each pixel is an R,G,B triple, + { + int red = bitParser.getSampleAsByte(pixelIndexInScanline, 0); + int green = bitParser.getSampleAsByte(pixelIndexInScanline, 1); + int blue = bitParser.getSampleAsByte(pixelIndexInScanline, 2); + int alpha = bitParser.getSampleAsByte(pixelIndexInScanline, 3); + + if (gammaCorrection != null) + { + red = gammaCorrection.correctSample(red); + green = gammaCorrection.correctSample(green); + blue = gammaCorrection.correctSample(blue); } - default : - throw new ImageReadException("PNG: unknown color type: " - + colorType); + + int rgb = getPixelARGB(alpha, red, green, blue); + return rgb; + } + default: + throw new ImageReadException("PNG: unknown color type: " + + colorType); } } @@ -225,39 +190,37 @@ switch (filter_type) { - case 0 : //None - filter = new ScanlineFilterNone(); - break; - - case 1 : // Sub - filter = new ScanlineFilterSub(BytesPerPixel); - break; - - case 2 : //Up - filter = new ScanlineFilterUp(BytesPerPixel); - break; - - case 3 : // Average - filter = new ScanlineFilterAverage(BytesPerPixel); - break; - - case 4 : // Paeth - filter = new ScanlineFilterPaeth(BytesPerPixel); - break; - - default : - throw new ImageReadException("PNG: unknown filter_type: " - + filter_type); + case 0: // None + filter = new ScanlineFilterNone(); + break; + + case 1: // Sub + filter = new ScanlineFilterSub(BytesPerPixel); + break; + + case 2: // Up + filter = new ScanlineFilterUp(BytesPerPixel); + break; + + case 3: // Average + filter = new ScanlineFilterAverage(BytesPerPixel); + break; + + case 4: // Paeth + filter = new ScanlineFilterPaeth(BytesPerPixel); + break; + + default: + throw new ImageReadException("PNG: unknown filter_type: " + + filter_type); } return filter; } - protected byte[] unfilterScanline( - // int filter_method, - int filter_type, byte src[], byte prev[], int BytesPerPixel) - throws ImageReadException, IOException + protected byte[] unfilterScanline(int filter_type, byte src[], byte prev[], + int BytesPerPixel) throws ImageReadException, IOException { ScanlineFilter filter = getScanlineFilter(filter_type, BytesPerPixel); @@ -272,9 +235,7 @@ int filter_type = is.read(); if (filter_type < 0) throw new ImageReadException("PNG: missing filter type"); - // System.out.println("\t" + "filter: " + filter_type); - // byte unfiltered[] = new byte[length]; byte scanline[] = this.readByteArray("scanline", length, is, "PNG: missing image data"); Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterInterlaced.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterInterlaced.java?rev=677073&r1=677072&r2=677073&view=diff ============================================================================== --- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterInterlaced.java (original) +++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterInterlaced.java Tue Jul 15 15:31:25 2008 @@ -107,7 +107,7 @@ while (x < width) { visit(x, y, bi, fBitParser, colorType, - pixel_index_in_scanline, fPNGChunkPLTE, + pixel_index_in_scanline, pngChunkPLTE, gammaCorrection); x = x + Col_Increment[pass - 1]; Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterSimple.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterSimple.java?rev=677073&r1=677072&r2=677073&view=diff ============================================================================== --- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterSimple.java (original) +++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterSimple.java Tue Jul 15 15:31:25 2008 @@ -23,6 +23,7 @@ import org.apache.sanselan.ImageReadException; import org.apache.sanselan.formats.png.chunks.PNGChunkPLTE; import org.apache.sanselan.formats.transparencyfilters.TransparencyFilter; +import org.apache.sanselan.util.Debug; public class ScanExpediterSimple extends ScanExpediter { @@ -38,17 +39,12 @@ public void drive() throws ImageReadException, IOException { - // Debug.debug("width", width); int bitsPerScanLine = bitsPerPixel * width; - // Debug.debug("bitsPerPixel", bitsPerPixel); - // Debug.debug("bitsPerScanLine", bitsPerScanLine); int pixelBytesPerScanLine = getBitsToBytesRoundingUp(bitsPerScanLine); - // Debug.debug("pixelBytesPerScanLine", pixelBytesPerScanLine); byte prev[] = null; for (int y = 0; y < height; y++) { - // Debug.debug("getNextScanline", y + "/" + height + ", " + pixelBytesPerScanLine); byte unfiltered[] = getNextScanline(is, pixelBytesPerScanLine, prev, bytesPerPixel); @@ -62,26 +58,9 @@ { int rgb = getRGB(bitParser, x); - // if (((x + y) % 256) == 0) - // { - // this.debugNumber(x + ", " + y, rgb, 4); - // } - // this.debugNumber(x + ", " + y, rgb, 4); - // if (y == 0) - // Debug.debug("read " + x + ", " + y, Integer - // .toHexString(rgb)); - - // Debug.debug("pngChunkIHDR.interlaceMethod", pngChunkIHDR.interlaceMethod); bi.setRGB(x, y, rgb); - // buffer.setElem(y * width +x , rgb); - - // bi.setRGB(x, y, 0xff000000 | rgb); - // bi.setRGB(x, y, 0xff000000); - // bi.setRGB(x, y, 0xffffffff); } } - // Debug.debug("bi", bi.getWidth()); - // Debug.debug("bi", bi.getHeight()); } } \ No newline at end of file Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkPLTE.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkPLTE.java?rev=677073&r1=677072&r2=677073&view=diff ============================================================================== --- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkPLTE.java (original) +++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkPLTE.java Tue Jul 15 15:31:25 2008 @@ -21,40 +21,28 @@ import org.apache.sanselan.ImageReadException; import org.apache.sanselan.formats.png.GammaCorrection; +import org.apache.sanselan.util.Debug; public class PNGChunkPLTE extends PNGChunk { public final int rgb[]; - // public final int red[]; - // public final int green[]; - // public final int blue[]; - - public PNGChunkPLTE(int Length, int ChunkType, int CRC, byte bytes[]) + public PNGChunkPLTE(int length, int ChunkType, int CRC, byte bytes[]) throws ImageReadException, IOException { - super(Length, ChunkType, CRC, bytes); + super(length, ChunkType, CRC, bytes); ByteArrayInputStream is = new ByteArrayInputStream(bytes); - if ((Length % 3) != 0) - throw new ImageReadException("PLTE: wrong length: " + Length); + if ((length % 3) != 0) + throw new ImageReadException("PLTE: wrong length: " + length); - int count = Length / 3; + int count = length / 3; rgb = new int[count]; - // red = new int[count]; - // green = new int[count]; - // blue = new int[count]; for (int i = 0; i < count; i++) { - // red[i] = read_byte("red[" + i + "]", is, - // "Not a Valid Png File: PLTE Corrupt"); - // green[i] = read_byte("green[" + i + "]", is, - // "Not a Valid Png File: PLTE Corrupt"); - // blue[i] = read_byte("blue[" + i + "]", is, - // "Not a Valid Png File: PLTE Corrupt"); int red = readByte("red[" + i + "]", is, "Not a Valid Png File: PLTE Corrupt"); int green = readByte("green[" + i + "]", is, @@ -74,11 +62,21 @@ return rgb[index]; } - public void correct(GammaCorrection fGammaCorrection) + // public void printPalette() { + // Debug.debug(); + // Debug.debug("palette"); + // for (int i = 0; i < rgb.length; i++) { + // Debug.debug("\t" + "palette[" + i + "];", rgb[i] + " (0x" + // + Integer.toHexString(rgb[i]) + ")"); + // + // } + // Debug.debug(); + // } + + public void correct(GammaCorrection gammaCorrection) { for (int i = 0; i < rgb.length; i++) - // {int pixel = - rgb[i] = fGammaCorrection.correctARGB(rgb[i]); + rgb[i] = gammaCorrection.correctARGB(rgb[i]); } } \ No newline at end of file Added: incubator/sanselan/trunk/src/test/data/images/png/2/12118.png URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/png/2/12118.png?rev=677073&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/png/2/12118.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/png/2/28569-4.png URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/png/2/28569-4.png?rev=677073&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/png/2/28569-4.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/png/2/28569-8.png URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/png/2/28569-8.png?rev=677073&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/png/2/28569-8.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/png/2/28569.png URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/png/2/28569.png?rev=677073&view=auto ============================================================================== Binary file - no diff available. Propchange: incubator/sanselan/trunk/src/test/data/images/png/2/28569.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: incubator/sanselan/trunk/src/test/data/images/png/2/info.txt URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/data/images/png/2/info.txt?rev=677073&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/data/images/png/2/info.txt (added) +++ incubator/sanselan/trunk/src/test/data/images/png/2/info.txt Tue Jul 15 15:31:25 2008 @@ -0,0 +1,2 @@ +These files contributed by Dirk Daems. + Propchange: incubator/sanselan/trunk/src/test/data/images/png/2/info.txt ------------------------------------------------------------------------------ svn:eol-style = native Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java?rev=677073&r1=677072&r2=677073&view=diff ============================================================================== --- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java (original) +++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java Tue Jul 15 15:31:25 2008 @@ -27,14 +27,22 @@ import org.apache.sanselan.test.util.FSTraversal; import org.apache.sanselan.util.Debug; -public abstract class SanselanTest extends TestCase - implements - SanselanConstants +public abstract class SanselanTest extends TestCase implements + SanselanConstants { - // public SanselanTest(String name) - // { - // super(name); - // } + + protected File createTempFile(String prefix, String suffix) + throws IOException + { + File tempFolder = new File("temp"); + if (!tempFolder.exists()) + tempFolder.mkdirs(); + assertTrue(tempFolder.isDirectory()); + + File result = File.createTempFile(prefix, suffix, tempFolder); +// result.deleteOnExit(); + return result; + } public void compareByteArrays(byte a[], byte b[]) { @@ -51,8 +59,7 @@ Thread.sleep(50); System.runFinalization(); Thread.sleep(50); - } - catch (Exception e) + } catch (Exception e) { Debug.debug(e); } @@ -63,38 +70,13 @@ protected boolean isPhilHarveyTestImage(File file) { - // Debug.debug("isPhilHarveyTestImage file", file.getAbsolutePath()); - // Debug.debug("isPhilHarveyTestImage folder", PHIL_HARVEY_TEST_IMAGE_FOLDER.getAbsolutePath()); + // Debug.debug("isPhilHarveyTestImage file", file.getAbsolutePath()); + // Debug.debug("isPhilHarveyTestImage folder", + // PHIL_HARVEY_TEST_IMAGE_FOLDER.getAbsolutePath()); return file.getAbsolutePath().startsWith( PHIL_HARVEY_TEST_IMAGE_FOLDER.getAbsolutePath()); } - // protected List getAllTestImages() - // { - // File srcFolder = new File("src"); - // File testFolder = new File(srcFolder, "test"); - // File dataFolder = new File(testFolder, "data"); - // File imagesFolder = new File(dataFolder, "images"); - // - // - // assertTrue(imagesFolder.exists()); - // - // final List result = new ArrayList(); - // - // FSTraversal.Visitor visitor = new FSTraversal.Visitor() - // { - // public boolean visit(File file, double progressEstimate) - // { - // if (Sanselan.hasImageFileExtension(file)) - // result.add(file); - // return true; - // } - // }; - // new FSTraversal().traverseFiles(imagesFolder, visitor); - // - // return result; - // } - public static interface ImageFilter { public boolean accept(File file) throws IOException, ImageReadException; @@ -129,24 +111,39 @@ protected List getTestImages(final ImageFilter filter, final int max) throws IOException, ImageReadException { - + File srcFolder = new File("src"); File testFolder = new File(srcFolder, "test"); File dataFolder = new File(testFolder, "data"); File imagesFolder = new File(dataFolder, "images"); + imagesFolder = new File(imagesFolder, "ignore\\PngSuite\\BGYN6A16.PNG"); + // imagesFolder = new File(imagesFolder, "jpg\\3"); + // imagesFolder = new File(imagesFolder, ""); + // imagesFolder = new File(imagesFolder, + // "exif\\philHarvey\\Nokia\\Nokia5500.jpg"); +// imagesFolder = new File(imagesFolder, "png\\2\\"); + // imagesFolder = new File(imagesFolder, + // "exif\\drewNoakes\\007_FujiFilm FinePixS1Pro (5).jpg"); + // src\\test\\data\\images\\exif\\drewNoakes\\007_Nikon D1X.jpg + // src\\test\\data\\images\\exif\\drewNoakes\\007_FujiFilm FinePixS1Pro + // (5).jpg + assertTrue(imagesFolder.exists()); + Debug.debug("imagesFolder", imagesFolder); + final List images = new ArrayList(); - FSTraversal.Visitor visitor = new FSTraversal.Visitor() - { + FSTraversal.Visitor visitor = new FSTraversal.Visitor() { long counter = 0; public boolean visit(File file, double progressEstimate) { + if (!Sanselan.hasImageFileExtension(file)) return true; + if (counter++ % 10 == 0) Debug.purgeMemory(); @@ -154,8 +151,7 @@ { if (filter != null && !filter.accept(file)) return true; - } - catch (Exception e) + } catch (Exception e) { Debug.debug(e); return false; @@ -171,14 +167,14 @@ new FSTraversal().traverseFiles(imagesFolder, visitor); List filtered = new ArrayList(); - // long last = System.currentTimeMillis(); + // long last = System.currentTimeMillis(); for (int i = 0; i < images.size(); i++) { -// if (i % 10 == 0) -// Debug.purgeMemory(); + // if (i % 10 == 0) + // Debug.purgeMemory(); File file = (File) images.get(i); - // Debug.debug("considering file", file.getAbsoluteFile()); + // Debug.debug("considering file", file.getAbsoluteFile()); if (file.getParentFile().getName().toLowerCase().equals("@broken")) continue; Added: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/ConvertPngToGifTest.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/ConvertPngToGifTest.java?rev=677073&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/ConvertPngToGifTest.java (added) +++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/ConvertPngToGifTest.java Tue Jul 15 15:31:25 2008 @@ -0,0 +1,69 @@ +/* + * 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.apache.sanselan.formats.png; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Hashtable; +import java.util.List; +import java.util.Random; + +import org.apache.sanselan.ImageFormat; +import org.apache.sanselan.ImageReadException; +import org.apache.sanselan.ImageWriteException; +import org.apache.sanselan.Sanselan; +import org.apache.sanselan.SanselanConstants; +import org.apache.sanselan.util.Debug; + +public class ConvertPngToGifTest extends PngBaseTest { + + + + public void test() throws IOException, ImageReadException, + ImageWriteException { + + List images = getPngImages(); + for (int i = 0; i < images.size(); i++) { + if (i % 10 == 0) + Debug.purgeMemory(); + + File imageFile = (File) images.get(i); + + if (isInvalidPNGTestFile(imageFile)) + continue; + + // Debug.debug("imageFile", imageFile); + // Debug.debug(); + + Hashtable params = new Hashtable(); +// params.put(SanselanConstants.PARAM_KEY_VERBOSE, Boolean.TRUE); + + BufferedImage image = Sanselan.getBufferedImage(imageFile, params); + assertNotNull(image); + + File outFile = createTempFile(imageFile.getName()+".", ".gif"); +// Debug.debug("outFile", outFile); + + Sanselan.writeImage(image, outFile, ImageFormat.IMAGE_FORMAT_GIF, + params); + } + Debug.debug("complete."); + } + +} Propchange: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/ConvertPngToGifTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngBaseTest.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngBaseTest.java?rev=677073&view=auto ============================================================================== --- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngBaseTest.java (added) +++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngBaseTest.java Tue Jul 15 15:31:25 2008 @@ -0,0 +1,62 @@ +/* + * 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.apache.sanselan.formats.png; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.List; + +import org.apache.sanselan.ImageFormat; +import org.apache.sanselan.ImageInfo; +import org.apache.sanselan.ImageReadException; +import org.apache.sanselan.ImageWriteException; +import org.apache.sanselan.Sanselan; +import org.apache.sanselan.SanselanTest; +import org.apache.sanselan.common.IImageMetadata; +import org.apache.sanselan.util.Debug; + +public abstract class PngBaseTest extends SanselanTest +{ + + private static boolean isPng(File file) throws IOException, + ImageReadException + { + ImageFormat format = Sanselan.guessFormat(file); + return format == ImageFormat.IMAGE_FORMAT_PNG; + } + + private static final ImageFilter imageFilter = new ImageFilter() { + public boolean accept(File file) throws IOException, ImageReadException + { + return isPng(file); + } + }; + + protected List getPngImages() throws IOException, ImageReadException + { + return getTestImages(imageFilter); + } + + protected boolean isInvalidPNGTestFile(File file) + { + return (file.getParentFile().getName().equalsIgnoreCase("pngsuite") && file + .getName().toLowerCase().startsWith("x")); + } + +} Propchange: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngBaseTest.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngReadTest.java URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngReadTest.java?rev=677073&r1=677072&r2=677073&view=diff ============================================================================== --- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngReadTest.java (original) +++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngReadTest.java Tue Jul 15 15:31:25 2008 @@ -31,37 +31,10 @@ import org.apache.sanselan.common.IImageMetadata; import org.apache.sanselan.util.Debug; -public class PngReadTest extends SanselanTest +public class PngReadTest extends PngBaseTest { - // public PngReadTest(String name) - // { - // super(name); - // } - private static boolean isPng(File file) throws IOException, - ImageReadException - { - ImageFormat format = Sanselan.guessFormat(file); - return format == ImageFormat.IMAGE_FORMAT_PNG; - } - private static final ImageFilter imageFilter = new ImageFilter() - { - public boolean accept(File file) throws IOException, ImageReadException - { - return isPng(file); - } - }; - - // private File getPngImage() throws IOException, ImageReadException - // { - // return getTestImage(imageFilter); - // } - - private List getPngImages() throws IOException, ImageReadException - { - return getTestImages(imageFilter); - } public void test() throws IOException, ImageReadException, ImageWriteException @@ -71,49 +44,43 @@ List images = getPngImages(); for (int i = 0; i < images.size(); i++) {
{'source': 'Apache Software Foundation Public Mail Archives'}